]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/cypherpunks.ru/nncp/ctx.go
Forbid any later GNU GPL versions autousage
[nncp.git] / src / cypherpunks.ru / nncp / ctx.go
index 0d00803a8aa3b432252e1524bb03819e9c25b75b..28c9b38de1bfcaa5083a9b1ad82c28ac91c0f136 100644 (file)
@@ -1,11 +1,10 @@
 /*
 NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2017 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2019 Sergey Matveev <stargrave@stargrave.org>
 
 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
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, version 3 of the License.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,19 +19,23 @@ package nncp
 
 import (
        "errors"
+       "io/ioutil"
+       "log"
        "os"
        "path/filepath"
+
+       "golang.org/x/sys/unix"
 )
 
 type Ctx struct {
-       Self  *NodeOur
-       Neigh map[NodeId]*Node
-       Alias map[string]*NodeId
-
-       Spool    string
-       Sendmail []string
+       Self   *NodeOur
+       SelfId *NodeId
+       Neigh  map[NodeId]*Node
+       Alias  map[string]*NodeId
 
+       Spool      string
        LogPath    string
+       Quiet      bool
        Debug      bool
        NotifyFile *FromToYAML
        NotifyFreq *FromToYAML
@@ -57,14 +60,56 @@ func (ctx *Ctx) FindNode(id string) (*Node, error) {
 func (ctx *Ctx) ensureRxDir(nodeId *NodeId) error {
        dirPath := filepath.Join(ctx.Spool, nodeId.String(), string(TRx))
        if err := os.MkdirAll(dirPath, os.FileMode(0700)); err != nil {
-               ctx.LogE("llp-ensure", SDS{"dir": dirPath, "err": err}, "")
+               ctx.LogE("dir-ensure", SDS{"dir": dirPath, "err": err}, "")
                return err
        }
        fd, err := os.Open(dirPath)
        if err != nil {
-               ctx.LogE("llp-ensure", SDS{"dir": dirPath, "err": err}, "")
+               ctx.LogE("dir-ensure", SDS{"dir": dirPath, "err": err}, "")
                return err
        }
        fd.Close()
        return nil
 }
+
+func CtxFromCmdline(cfgPath, spoolPath, logPath string, quiet, debug bool) (*Ctx, error) {
+       env := os.Getenv(CfgPathEnv)
+       if env != "" {
+               cfgPath = env
+       }
+       cfgRaw, err := ioutil.ReadFile(cfgPath)
+       if err != nil {
+               return nil, err
+       }
+       ctx, err := CfgParse(cfgRaw)
+       if err != nil {
+               return nil, err
+       }
+       if spoolPath == "" {
+               env = os.Getenv(CfgSpoolEnv)
+               if env != "" {
+                       ctx.Spool = env
+               }
+       } else {
+               ctx.Spool = spoolPath
+       }
+       if logPath == "" {
+               env = os.Getenv(CfgLogEnv)
+               if env != "" {
+                       ctx.LogPath = env
+               }
+       } else {
+               ctx.LogPath = logPath
+       }
+       ctx.Quiet = quiet
+       ctx.Debug = debug
+       return ctx, nil
+}
+
+func (ctx *Ctx) IsEnoughSpace(want int64) bool {
+       var s unix.Statfs_t
+       if err := unix.Statfs(ctx.Spool, &s); err != nil {
+               log.Fatalln(err)
+       }
+       return int64(s.Bavail)*int64(s.Bsize) > want
+}