]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/cypherpunks.ru/nncp/cfg.go
Merge branch 'develop'
[nncp.git] / src / cypherpunks.ru / nncp / cfg.go
index 3a642f68567ff4487630dab5e3b96b676d5cba34..bcd547ec91c5e13cbc6052d69c6164e35e9c3f6f 100644 (file)
@@ -1,6 +1,6 @@
 /*
 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
@@ -32,7 +32,9 @@ import (
 )
 
 const (
-       CfgPathEnv = "NNCPCFG"
+       CfgPathEnv  = "NNCPCFG"
+       CfgSpoolEnv = "NNCPSPOOL"
+       CfgLogEnv   = "NNCPLOG"
 )
 
 var (
@@ -46,28 +48,32 @@ type NodeYAML struct {
        Id          string
        ExchPub     string
        SignPub     string
-       NoisePub    *string    `noisepub,omitempty`
-       Sendmail    []string   `sendmail,omitempty`
-       Incoming    *string    `incoming,omitempty`
-       Freq        *string    `freq,omitempty`
-       FreqChunked *uint64    `freqchunked,omitempty`
-       FreqMinSize *uint64    `freqminsize,omitempty`
-       Via         []string   `via,omitempty`
-       Calls       []CallYAML `calls,omitempty`
-
-       Addrs map[string]string `addrs,omitempty`
-
-       OnlineDeadline *uint `onlinedeadline,omitempty`
-       MaxOnlineTime  *uint `maxonlinetime,omitempty`
+       NoisePub    *string             `yaml:"noisepub,omitempty"`
+       Exec        map[string][]string `yaml:"exec,omitempty"`
+       Incoming    *string             `yaml:"incoming,omitempty"`
+       Freq        *string             `yaml:"freq,omitempty"`
+       FreqChunked *uint64             `yaml:"freqchunked,omitempty"`
+       FreqMinSize *uint64             `yaml:"freqminsize,omitempty"`
+       Via         []string            `yaml:"via,omitempty"`
+       Calls       []CallYAML          `yaml:"calls,omitempty"`
+
+       Addrs map[string]string `yaml:"addrs,omitempty"`
+
+       RxRate         *int  `yaml:"rxrate,omitempty"`
+       TxRate         *int  `yaml:"txrate,omitempty"`
+       OnlineDeadline *uint `yaml:"onlinedeadline,omitempty"`
+       MaxOnlineTime  *uint `yaml:"maxonlinetime,omitempty"`
 }
 
 type CallYAML struct {
        Cron           string
-       Nice           *int    `nice,omitempty`
-       Xx             string  `xx,omitempty`
-       Addr           *string `addr,omitempty`
-       OnlineDeadline *uint   `onlinedeadline,omitempty`
-       MaxOnlineTime  *uint   `maxonlinetime,omitempty`
+       Nice           *string `yaml:"nice,omitempty"`
+       Xx             string  `yaml:"xx,omitempty"`
+       RxRate         *int    `yaml:"rxrate,omitempty"`
+       TxRate         *int    `yaml:"txrate,omitempty"`
+       Addr           *string `yaml:"addr,omitempty"`
+       OnlineDeadline *uint   `yaml:"onlinedeadline,omitempty"`
+       MaxOnlineTime  *uint   `yaml:"maxonlinetime,omitempty"`
 }
 
 type NodeOurYAML struct {
@@ -86,17 +92,17 @@ type FromToYAML struct {
 }
 
 type NotifyYAML struct {
-       File *FromToYAML `file,omitempty`
-       Freq *FromToYAML `freq,omitempty`
+       File *FromToYAML `yaml:"file,omitempty"`
+       Freq *FromToYAML `yaml:"freq,omitempty"`
 }
 
 type CfgYAML struct {
-       Self  *NodeOurYAML `self,omitempty`
+       Self  *NodeOurYAML `yaml:"self,omitempty"`
        Neigh map[string]NodeYAML
 
        Spool  string
        Log    string
-       Notify *NotifyYAML `notify,omitempty`
+       Notify *NotifyYAML `yaml:"notify,omitempty"`
 }
 
 func NewNode(name string, yml NodeYAML) (*Node, error) {
@@ -161,6 +167,15 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                freqMinSize = int64(*yml.FreqMinSize) * 1024
        }
 
+       defRxRate := 0
+       if yml.RxRate != nil && *yml.RxRate > 0 {
+               defRxRate = *yml.RxRate
+       }
+       defTxRate := 0
+       if yml.TxRate != nil && *yml.TxRate > 0 {
+               defTxRate = *yml.TxRate
+       }
+
        defOnlineDeadline := uint(DefaultDeadline)
        if yml.OnlineDeadline != nil {
                if *yml.OnlineDeadline <= 0 {
@@ -179,13 +194,15 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                if err != nil {
                        return nil, err
                }
+
                nice := uint8(255)
                if callYml.Nice != nil {
-                       if *callYml.Nice < 1 || *callYml.Nice > 255 {
-                               return nil, errors.New("Nice must be between 1 and 255")
+                       nice, err = NicenessParse(*callYml.Nice)
+                       if err != nil {
+                               return nil, err
                        }
-                       nice = uint8(*callYml.Nice)
                }
+
                var xx TRxTx
                switch callYml.Xx {
                case "rx":
@@ -196,6 +213,16 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                default:
                        return nil, errors.New("xx field must be either \"rx\" or \"tx\"")
                }
+
+               rxRate := defRxRate
+               if callYml.RxRate != nil {
+                       rxRate = *callYml.RxRate
+               }
+               txRate := defTxRate
+               if callYml.TxRate != nil {
+                       txRate = *callYml.TxRate
+               }
+
                var addr *string
                if callYml.Addr != nil {
                        if a, exists := yml.Addrs[*callYml.Addr]; exists {
@@ -204,6 +231,7 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                                addr = callYml.Addr
                        }
                }
+
                onlineDeadline := defOnlineDeadline
                if callYml.OnlineDeadline != nil {
                        if *callYml.OnlineDeadline == 0 {
@@ -211,14 +239,18 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                        }
                        onlineDeadline = *callYml.OnlineDeadline
                }
+
                var maxOnlineTime uint
                if callYml.MaxOnlineTime != nil {
                        maxOnlineTime = *callYml.MaxOnlineTime
                }
+
                calls = append(calls, &Call{
                        Cron:           expr,
                        Nice:           nice,
                        Xx:             xx,
+                       RxRate:         rxRate,
+                       TxRate:         txRate,
                        Addr:           addr,
                        OnlineDeadline: onlineDeadline,
                        MaxOnlineTime:  maxOnlineTime,
@@ -230,13 +262,15 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                Id:             nodeId,
                ExchPub:        new([32]byte),
                SignPub:        ed25519.PublicKey(signPub),
-               Sendmail:       yml.Sendmail,
+               Exec:           yml.Exec,
                Incoming:       incoming,
                Freq:           freq,
                FreqChunked:    freqChunked,
                FreqMinSize:    freqMinSize,
                Calls:          calls,
                Addrs:          yml.Addrs,
+               RxRate:         defRxRate,
+               TxRate:         defTxRate,
                OnlineDeadline: defOnlineDeadline,
                MaxOnlineTime:  defMaxOnlineTime,
        }
@@ -337,7 +371,7 @@ func (nodeOur *NodeOur) ToYAML() string {
 
 func CfgParse(data []byte) (*Ctx, error) {
        var err error
-       if bytes.Compare(data[:8], MagicNNCPBv1[:]) == 0 {
+       if bytes.Compare(data[:8], MagicNNCPBv3[:]) == 0 {
                os.Stderr.WriteString("Passphrase:")
                password, err := terminal.ReadPassword(0)
                if err != nil {
@@ -414,11 +448,3 @@ func CfgParse(data []byte) (*Ctx, error) {
        }
        return &ctx, nil
 }
-
-func CfgPathFromEnv(cmdlineFlag *string) (p string) {
-       p = os.Getenv(CfgPathEnv)
-       if p == "" {
-               p = *cmdlineFlag
-       }
-       return
-}