]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/cypherpunks.ru/nncp/cfg.go
Remote command execution
[nncp.git] / src / cypherpunks.ru / nncp / cfg.go
index 2b459b316e091ac69709d82a4a3aaded4e6a1e11..b75196175e429b89f7408789fd932077bafd8cfd 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-2018 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
@@ -19,17 +19,22 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 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 (
@@ -43,14 +48,14 @@ 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`
+       NoisePub    *string             `noisepub,omitempty`
+       Exec        map[string][]string `exec,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`
 
@@ -61,7 +66,7 @@ type NodeYAML struct {
 type CallYAML struct {
        Cron           string
        Nice           *int    `nice,omitempty`
-       Xx             *string `xx,omitempty`
+       Xx             string  `xx,omitempty`
        Addr           *string `addr,omitempty`
        OnlineDeadline *uint   `onlinedeadline,omitempty`
        MaxOnlineTime  *uint   `maxonlinetime,omitempty`
@@ -155,7 +160,7 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
        }
        var freqMinSize int64
        if yml.FreqMinSize != nil {
-               freqMinSize = int64(*yml.FreqMinSize)
+               freqMinSize = int64(*yml.FreqMinSize) * 1024
        }
 
        defOnlineDeadline := uint(DefaultDeadline)
@@ -184,15 +189,14 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                        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\"")
                }
                var addr *string
                if callYml.Addr != nil {
@@ -216,7 +220,7 @@ func NewNode(name string, yml NodeYAML) (*Node, error) {
                calls = append(calls, &Call{
                        Cron:           expr,
                        Nice:           nice,
-                       Xx:             &xx,
+                       Xx:             xx,
                        Addr:           addr,
                        OnlineDeadline: onlineDeadline,
                        MaxOnlineTime:  maxOnlineTime,
@@ -228,7 +232,7 @@ 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,
@@ -334,9 +338,21 @@ func (nodeOur *NodeOur) ToYAML() string {
 }
 
 func CfgParse(data []byte) (*Ctx, error) {
+       var err error
+       if bytes.Compare(data[:8], MagicNNCPBv2[:]) == 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 {
@@ -400,11 +416,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
-}