/*
NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2023 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
"time"
"github.com/gorhill/cronexpr"
- "github.com/hjson/hjson-go"
+ "github.com/hjson/hjson-go/v4"
"golang.org/x/crypto/ed25519"
"golang.org/x/term"
)
CfgPathEnv = "NNCPCFG"
CfgSpoolEnv = "NNCPSPOOL"
CfgLogEnv = "NNCPLOG"
+ CfgNoSync = "NNCPNOSYNC"
)
var (
Incoming *string `json:"incoming,omitempty"`
Exec map[string][]string `json:"exec,omitempty"`
Freq *NodeFreqJSON `json:"freq,omitempty"`
+ ACK *NodeACKJSON `json:"ack,omitempty"`
Via []string `json:"via,omitempty"`
Calls []CallJSON `json:"calls,omitempty"`
MaxSize *uint64 `json:"maxsize,omitempty"`
}
+type NodeACKJSON struct {
+ MinSize *uint64 `json:"minsize,omitempty"`
+ Nice *string `json:"nice,omitempty"`
+}
+
type CallJSON struct {
Cron string `json:"cron"`
Nice *string `json:"nice,omitempty"`
AutoTossNoExec bool `json:"autotoss-noexec,omitempty"`
AutoTossNoTrns bool `json:"autotoss-notrns,omitempty"`
AutoTossNoArea bool `json:"autotoss-noarea,omitempty"`
+ AutoTossNoACK bool `json:"autotoss-noack,omitempty"`
+ AutoTossGenACK bool `json:"autotoss-gen-ack,omitempty"`
}
type NodeOurJSON struct {
Neigh map[string]NodeJSON `json:"neigh"`
Areas map[string]AreaJSON `json:"areas,omitempty"`
+
+ YggdrasilAliases map[string]string `json:"yggdrasil-aliases,omitempty"`
}
func NewNode(name string, cfg NodeJSON) (*Node, error) {
}
}
+ ackNice := uint8(255)
+ var ackMinSize int64
+ if cfg.ACK != nil {
+ if cfg.ACK.Nice != nil {
+ ackNice, err = NicenessParse(*cfg.ACK.Nice)
+ if err != nil {
+ return nil, err
+ }
+ }
+ if cfg.ACK.MinSize != nil {
+ ackMinSize = int64(*cfg.ACK.MinSize) * 1024
+ }
+ }
+
defRxRate := 0
if cfg.RxRate != nil && *cfg.RxRate > 0 {
defRxRate = *cfg.RxRate
call.AutoTossNoExec = callCfg.AutoTossNoExec
call.AutoTossNoTrns = callCfg.AutoTossNoTrns
call.AutoTossNoArea = callCfg.AutoTossNoArea
+ call.AutoTossNoACK = callCfg.AutoTossNoACK
+ call.AutoTossGenACK = callCfg.AutoTossGenACK
calls = append(calls, &call)
}
FreqChunked: freqChunked,
FreqMinSize: freqMinSize,
FreqMaxSize: freqMaxSize,
+ ACKNice: ackNice,
+ ACKMinSize: ackMinSize,
Calls: calls,
Addrs: cfg.Addrs,
RxRate: defRxRate,
func CfgParse(data []byte) (*CfgJSON, error) {
var err error
- if bytes.Compare(data[:8], MagicNNCPBv3.B[:]) == 0 {
+ if bytes.Equal(data[:8], MagicNNCPBv3.B[:]) {
os.Stderr.WriteString("Passphrase:")
password, err := term.ReadPassword(0)
if err != nil {
if err != nil {
return nil, err
}
- } else if bytes.Compare(data[:8], MagicNNCPBv2.B[:]) == 0 {
+ } else if bytes.Equal(data[:8], MagicNNCPBv2.B[:]) {
log.Fatalln(MagicNNCPBv2.TooOld())
- } else if bytes.Compare(data[:8], MagicNNCPBv1.B[:]) == 0 {
+ } else if bytes.Equal(data[:8], MagicNNCPBv1.B[:]) {
log.Fatalln(MagicNNCPBv1.TooOld())
}
var cfgGeneral map[string]interface{}
Alias: make(map[string]*NodeId),
MCDRxIfis: cfgJSON.MCDRxIfis,
MCDTxIfis: cfgJSON.MCDTxIfis,
+
+ YggdrasilAliases: cfgJSON.YggdrasilAliases,
}
if cfgJSON.Notify != nil {
if cfgJSON.Notify.File != nil {