X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fctx.go;h=63d1fc27353dac5682fee2ce24b0d0adde87fdf9;hb=ab7c7eca0e53661f0ba904c2a6ba752990bea367;hp=0030c706d71fdb35c7edddeda60a63f0a42b627a;hpb=0139e8deda4112d2c3dcd52e0ad72162e54caa03;p=nncp.git diff --git a/src/ctx.go b/src/ctx.go index 0030c70..63d1fc2 100644 --- a/src/ctx.go +++ b/src/ctx.go @@ -1,6 +1,6 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2019 Sergey Matveev +Copyright (C) 2016-2021 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,11 +19,14 @@ package nncp import ( "errors" + "fmt" "io/ioutil" "log" "os" "path/filepath" + "syscall" + "golang.org/x/sys/unix" ) @@ -33,12 +36,22 @@ type Ctx struct { Neigh map[NodeId]*Node Alias map[string]*NodeId + AreaId2Area map[AreaId]*Area + AreaName2Id map[string]*AreaId + Spool string LogPath string + UmaskForce *int Quiet bool + ShowPrgrs bool + HdrUsage bool Debug bool NotifyFile *FromToJSON NotifyFreq *FromToJSON + NotifyExec map[string]*FromToJSON + + MCDRxIfis []string + MCDTxIfis map[string]int } func (ctx *Ctx) FindNode(id string) (*Node, error) { @@ -59,24 +72,34 @@ func (ctx *Ctx) FindNode(id string) (*Node, error) { func (ctx *Ctx) ensureRxDir(nodeId *NodeId) error { dirPath := filepath.Join(ctx.Spool, nodeId.String(), string(TRx)) + logMsg := func(les LEs) string { + return fmt.Sprintf("Ensuring directory %s existence", dirPath) + } if err := os.MkdirAll(dirPath, os.FileMode(0777)); err != nil { - ctx.LogE("dir-ensure", SDS{"dir": dirPath, "err": err}, "") + ctx.LogE("dir-ensure-mkdir", LEs{{"Dir", dirPath}}, err, logMsg) return err } fd, err := os.Open(dirPath) if err != nil { - ctx.LogE("dir-ensure", SDS{"dir": dirPath, "err": err}, "") + ctx.LogE("dir-ensure-open", LEs{{"Dir", dirPath}}, err, logMsg) return err } - fd.Close() - return nil + return fd.Close() } -func CtxFromCmdline(cfgPath, spoolPath, logPath string, quiet, debug bool) (*Ctx, error) { +func CtxFromCmdline( + cfgPath, + spoolPath, + logPath string, + quiet, showPrgrs, omitPrgrs, debug bool, +) (*Ctx, error) { env := os.Getenv(CfgPathEnv) if env != "" { cfgPath = env } + if showPrgrs && omitPrgrs { + return nil, errors.New("simultaneous -progress and -noprogress") + } cfgRaw, err := ioutil.ReadFile(cfgPath) if err != nil { return nil, err @@ -101,6 +124,12 @@ func CtxFromCmdline(cfgPath, spoolPath, logPath string, quiet, debug bool) (*Ctx } else { ctx.LogPath = logPath } + if showPrgrs { + ctx.ShowPrgrs = true + } + if quiet || omitPrgrs { + ctx.ShowPrgrs = false + } ctx.Quiet = quiet ctx.Debug = debug return ctx, nil @@ -113,3 +142,9 @@ func (ctx *Ctx) IsEnoughSpace(want int64) bool { } return int64(s.Bavail)*int64(s.Bsize) > want } + +func (ctx *Ctx) Umask() { + if ctx.UmaskForce != nil { + syscall.Umask(*ctx.UmaskForce) + } +}