X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcypherpunks.ru%2Fnncp%2Fcfg.go;h=203752bf8d8d0e2111e94a474500e8c8c530ab09;hb=dd92823db3d72fb21a4c712a7fb052dce16443dd;hp=f89c106f3c3178dadaa3a736b8277f16ad205b7c;hpb=12536e329b4fb8d27e1e2a336e783ae0fc046e2f;p=nncp.git diff --git a/src/cypherpunks.ru/nncp/cfg.go b/src/cypherpunks.ru/nncp/cfg.go index f89c106..203752b 100644 --- a/src/cypherpunks.ru/nncp/cfg.go +++ b/src/cypherpunks.ru/nncp/cfg.go @@ -1,11 +1,10 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2017 Sergey Matveev +Copyright (C) 2016-2019 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 -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 @@ -19,17 +18,22 @@ along with this program. If not, see . package nncp import ( + "bytes" "errors" + "log" "os" "path" "github.com/gorhill/cronexpr" "golang.org/x/crypto/ed25519" + "golang.org/x/crypto/ssh/terminal" "gopkg.in/yaml.v2" ) const ( - CfgPathEnv = "NNCPCFG" + CfgPathEnv = "NNCPCFG" + CfgSpoolEnv = "NNCPSPOOL" + CfgLogEnv = "NNCPLOG" ) var ( @@ -40,29 +44,35 @@ var ( ) 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` - Via []string `via,omitempty` - Calls []CallYAML `calls,omitempty` - - Addrs map[string]string `addrs,omitempty` - - OnlineDeadline *uint `onlinedeadline,omitempty` - MaxOnlineTime *uint `maxonlinetime,omitempty` + Id string + ExchPub string + SignPub string + 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 { @@ -81,17 +91,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) { @@ -144,6 +154,26 @@ func NewNode(name string, yml NodeYAML) (*Node, error) { } freq = &fr } + var freqChunked int64 + if yml.FreqChunked != nil { + if *yml.FreqChunked == 0 { + return nil, errors.New("freqchunked value must be greater than zero") + } + freqChunked = int64(*yml.FreqChunked) * 1024 + } + var freqMinSize int64 + if yml.FreqMinSize != nil { + 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 { @@ -163,24 +193,35 @@ 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 - if callYml.Xx != nil { - switch *callYml.Xx { - case "rx": - xx = TRx - case "tx": - xx = TTx - default: - return nil, errors.New("xx field must be either \"rx\" or \"tx\"") - } + switch callYml.Xx { + case "rx": + xx = TRx + case "tx": + xx = TTx + case "": + 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 { @@ -189,6 +230,7 @@ func NewNode(name string, yml NodeYAML) (*Node, error) { addr = callYml.Addr } } + onlineDeadline := defOnlineDeadline if callYml.OnlineDeadline != nil { if *callYml.OnlineDeadline == 0 { @@ -196,14 +238,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, + Xx: xx, + RxRate: rxRate, + TxRate: txRate, Addr: addr, OnlineDeadline: onlineDeadline, MaxOnlineTime: maxOnlineTime, @@ -215,11 +261,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, } @@ -319,9 +369,21 @@ func (nodeOur *NodeOur) ToYAML() string { } func CfgParse(data []byte) (*Ctx, error) { + var err error + if bytes.Compare(data[:8], MagicNNCPBv3[:]) == 0 { + os.Stderr.WriteString("Passphrase:") + password, err := terminal.ReadPassword(0) + if err != nil { + log.Fatalln(err) + } + os.Stderr.WriteString("\n") + data, err = DeEBlob(data, password) + if err != nil { + return nil, err + } + } var cfgYAML CfgYAML - err := yaml.Unmarshal(data, &cfgYAML) - if err != nil { + if err = yaml.Unmarshal(data, &cfgYAML); err != nil { return nil, err } if _, exists := cfgYAML.Neigh["self"]; !exists { @@ -385,11 +447,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 -}