X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcfgdir.go;h=de45a7d10a546428a6e4a614c0da165b6352a9e5;hb=HEAD;hp=ec1e58c1ef5e9e3576964517c119db5b6442a3c9;hpb=65ac1674ff0f9bd99bb29b5b8b1dc596b06216ce;p=nncp.git diff --git a/src/cfgdir.go b/src/cfgdir.go index ec1e58c..fc36636 100644 --- a/src/cfgdir.go +++ b/src/cfgdir.go @@ -1,6 +1,6 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2021 Sergey Matveev +Copyright (C) 2016-2023 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 @@ -18,8 +18,9 @@ along with this program. If not, see . package nncp import ( + "errors" "fmt" - "io/ioutil" + "io/fs" "os" "path/filepath" "sort" @@ -65,7 +66,7 @@ func cfgDirSave(v interface{}, dst ...string) error { if strings.HasSuffix(dst[len(dst)-1], "prv") { mode = os.FileMode(0600) } - return ioutil.WriteFile(filepath.Join(dst...), []byte(r+"\n"), mode) + return os.WriteFile(filepath.Join(dst...), []byte(r+"\n"), mode) } func cfgDirTouch(dst ...string) error { @@ -168,29 +169,31 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) { } } - if err = cfgDirMkdir(dst, "self"); err != nil { - return - } - if err = cfgDirSave(cfg.Self.Id, dst, "self", "id"); err != nil { - return - } - if err = cfgDirSave(cfg.Self.ExchPub, dst, "self", "exchpub"); err != nil { - return - } - if err = cfgDirSave(cfg.Self.ExchPrv, dst, "self", "exchprv"); err != nil { - return - } - if err = cfgDirSave(cfg.Self.SignPub, dst, "self", "signpub"); err != nil { - return - } - if err = cfgDirSave(cfg.Self.SignPrv, dst, "self", "signprv"); err != nil { - return - } - if err = cfgDirSave(cfg.Self.NoisePub, dst, "self", "noisepub"); err != nil { - return - } - if err = cfgDirSave(cfg.Self.NoisePrv, dst, "self", "noiseprv"); err != nil { - return + if cfg.Self != nil { + if err = cfgDirMkdir(dst, "self"); err != nil { + return + } + if err = cfgDirSave(cfg.Self.Id, dst, "self", "id"); err != nil { + return + } + if err = cfgDirSave(cfg.Self.ExchPub, dst, "self", "exchpub"); err != nil { + return + } + if err = cfgDirSave(cfg.Self.ExchPrv, dst, "self", "exchprv"); err != nil { + return + } + if err = cfgDirSave(cfg.Self.SignPub, dst, "self", "signpub"); err != nil { + return + } + if err = cfgDirSave(cfg.Self.SignPrv, dst, "self", "signprv"); err != nil { + return + } + if err = cfgDirSave(cfg.Self.NoisePub, dst, "self", "noisepub"); err != nil { + return + } + if err = cfgDirSave(cfg.Self.NoisePrv, dst, "self", "noiseprv"); err != nil { + return + } } for name, n := range cfg.Neigh { @@ -257,6 +260,24 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) { } } + if n.ACK != nil { + if err = cfgDirMkdir(dst, "neigh", name, "ack"); err != nil { + return + } + if err = cfgDirSave( + n.ACK.MinSize, + dst, "neigh", name, "ack", "minsize", + ); err != nil { + return + } + if err = cfgDirSave( + n.ACK.Nice, + dst, "neigh", name, "ack", "nice", + ); err != nil { + return + } + } + if len(n.Via) > 0 { if err = cfgDirSave( strings.Join(n.Via, "\n"), @@ -369,6 +390,16 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) { return } } + if call.AutoTossNoACK { + if err = cfgDirTouch(dst, "neigh", name, "calls", is, "autotoss-noack"); err != nil { + return + } + } + if call.AutoTossGenACK { + if err = cfgDirTouch(dst, "neigh", name, "calls", is, "autotoss-gen-ack"); err != nil { + return + } + } } } @@ -416,13 +447,24 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) { } } + if len(cfg.YggdrasilAliases) > 0 { + if err = cfgDirMkdir(dst, "yggdrasil-aliases"); err != nil { + return + } + for alias, v := range cfg.YggdrasilAliases { + if err = cfgDirSave(v, dst, "yggdrasil-aliases", alias); err != nil { + return + } + } + } + return } func cfgDirLoad(src ...string) (v string, exists bool, err error) { - b, err := ioutil.ReadFile(filepath.Join(src...)) + b, err := os.ReadFile(filepath.Join(src...)) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, fs.ErrNotExist) { return "", false, nil } return "", false, err @@ -518,8 +560,8 @@ func DirToCfg(src string) (*CfgJSON, error) { cfg.MCDRxIfis = strings.Split(*sp, "\n") } - fis, err := ioutil.ReadDir(filepath.Join(src, "mcd-send")) - if err != nil && !os.IsNotExist(err) { + fis, err := os.ReadDir(filepath.Join(src, "mcd-send")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } if len(fis) > 0 { @@ -530,7 +572,7 @@ func DirToCfg(src string) (*CfgJSON, error) { if n[0] == '.' { continue } - b, err := ioutil.ReadFile(filepath.Join(src, "mcd-send", fi.Name())) + b, err := os.ReadFile(filepath.Join(src, "mcd-send", fi.Name())) if err != nil { return nil, err } @@ -552,8 +594,8 @@ func DirToCfg(src string) (*CfgJSON, error) { return nil, err } } - fis, err = ioutil.ReadDir(filepath.Join(src, "notify", "exec")) - if err != nil && !os.IsNotExist(err) { + fis, err = os.ReadDir(filepath.Join(src, "notify", "exec")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } for _, fi := range fis { @@ -569,33 +611,37 @@ func DirToCfg(src string) (*CfgJSON, error) { cfg.Notify = ¬ify } - self := NodeOurJSON{} - if self.Id, err = cfgDirLoadMust(src, "self", "id"); err != nil { - return nil, err - } - if self.ExchPub, err = cfgDirLoadMust(src, "self", "exchpub"); err != nil { - return nil, err - } - if self.ExchPrv, err = cfgDirLoadMust(src, "self", "exchprv"); err != nil { - return nil, err - } - if self.SignPub, err = cfgDirLoadMust(src, "self", "signpub"); err != nil { - return nil, err - } - if self.SignPrv, err = cfgDirLoadMust(src, "self", "signprv"); err != nil { - return nil, err - } - if self.NoisePub, err = cfgDirLoadMust(src, "self", "noisepub"); err != nil { - return nil, err - } - if self.NoisePrv, err = cfgDirLoadMust(src, "self", "noiseprv"); err != nil { + if _, err = os.ReadDir(filepath.Join(src, "self")); err == nil { + self := NodeOurJSON{} + if self.Id, err = cfgDirLoadMust(src, "self", "id"); err != nil { + return nil, err + } + if self.ExchPub, err = cfgDirLoadMust(src, "self", "exchpub"); err != nil { + return nil, err + } + if self.ExchPrv, err = cfgDirLoadMust(src, "self", "exchprv"); err != nil { + return nil, err + } + if self.SignPub, err = cfgDirLoadMust(src, "self", "signpub"); err != nil { + return nil, err + } + if self.SignPrv, err = cfgDirLoadMust(src, "self", "signprv"); err != nil { + return nil, err + } + if self.NoisePub, err = cfgDirLoadMust(src, "self", "noisepub"); err != nil { + return nil, err + } + if self.NoisePrv, err = cfgDirLoadMust(src, "self", "noiseprv"); err != nil { + return nil, err + } + cfg.Self = &self + } else if !errors.Is(err, fs.ErrNotExist) { return nil, err } - cfg.Self = &self cfg.Neigh = make(map[string]NodeJSON) - fis, err = ioutil.ReadDir(filepath.Join(src, "neigh")) - if err != nil && !os.IsNotExist(err) { + fis, err = os.ReadDir(filepath.Join(src, "neigh")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } for _, fi := range fis { @@ -621,8 +667,8 @@ func DirToCfg(src string) (*CfgJSON, error) { } node.Exec = make(map[string][]string) - fis2, err := ioutil.ReadDir(filepath.Join(src, "neigh", n, "exec")) - if err != nil && !os.IsNotExist(err) { + fis2, err := os.ReadDir(filepath.Join(src, "neigh", n, "exec")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } for _, fi2 := range fis2 { @@ -671,6 +717,23 @@ func DirToCfg(src string) (*CfgJSON, error) { } } + if cfgDirExists(src, "neigh", n, "ack") { + node.ACK = &NodeACKJSON{} + i64, err := cfgDirLoadIntOpt(src, "neigh", n, "ack", "minsize") + if err != nil { + return nil, err + } + if i64 != nil { + i := uint64(*i64) + node.ACK.MinSize = &i + } + if node.ACK.Nice, err = cfgDirLoadOpt( + src, "neigh", n, "ack", "nice", + ); err != nil { + return nil, err + } + } + via, err := cfgDirLoadOpt(src, "neigh", n, "via") if err != nil { return nil, err @@ -680,8 +743,8 @@ func DirToCfg(src string) (*CfgJSON, error) { } node.Addrs = make(map[string]string) - fis2, err = ioutil.ReadDir(filepath.Join(src, "neigh", n, "addrs")) - if err != nil && !os.IsNotExist(err) { + fis2, err = os.ReadDir(filepath.Join(src, "neigh", n, "addrs")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } for _, fi2 := range fis2 { @@ -730,8 +793,8 @@ func DirToCfg(src string) (*CfgJSON, error) { node.MaxOnlineTime = &i } - fis2, err = ioutil.ReadDir(filepath.Join(src, "neigh", n, "calls")) - if err != nil && !os.IsNotExist(err) { + fis2, err = os.ReadDir(filepath.Join(src, "neigh", n, "calls")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } callsIdx := make([]int, 0, len(fis2)) @@ -838,14 +901,20 @@ func DirToCfg(src string) (*CfgJSON, error) { if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-noarea") { call.AutoTossNoArea = true } + if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-noack") { + call.AutoTossNoACK = true + } + if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-gen-ack") { + call.AutoTossGenACK = true + } node.Calls = append(node.Calls, call) } cfg.Neigh[n] = node } cfg.Areas = make(map[string]AreaJSON) - fis, err = ioutil.ReadDir(filepath.Join(src, "areas")) - if err != nil && !os.IsNotExist(err) { + fis, err = os.ReadDir(filepath.Join(src, "areas")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } for _, fi := range fis { @@ -873,8 +942,8 @@ func DirToCfg(src string) (*CfgJSON, error) { } area.Exec = make(map[string][]string) - fis2, err := ioutil.ReadDir(filepath.Join(src, "areas", n, "exec")) - if err != nil && !os.IsNotExist(err) { + fis2, err := os.ReadDir(filepath.Join(src, "areas", n, "exec")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } for _, fi2 := range fis2 { @@ -899,5 +968,24 @@ func DirToCfg(src string) (*CfgJSON, error) { cfg.Areas[n] = area } + fis, err = os.ReadDir(filepath.Join(src, "yggdrasil-aliases")) + if err != nil && !errors.Is(err, fs.ErrNotExist) { + return nil, err + } + if len(fis) > 0 { + cfg.YggdrasilAliases = make(map[string]string, len(fis)) + } + for _, fi := range fis { + n := fi.Name() + if n[0] == '.' { + continue + } + b, err := os.ReadFile(filepath.Join(src, "yggdrasil-aliases", fi.Name())) + if err != nil { + return nil, err + } + cfg.YggdrasilAliases[n] = strings.TrimSuffix(string(b), "\n") + } + return &cfg, nil }