]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/cfgdir.go
ioutil is deprecated since 1.16/1.17
[nncp.git] / src / cfgdir.go
index ec1e58c1ef5e9e3576964517c119db5b6442a3c9..c1346e27a4d67f1e10b97be6167ea0002f5f24ee 100644 (file)
@@ -1,6 +1,6 @@
 /*
 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
@@ -19,7 +19,6 @@ package nncp
 
 import (
        "fmt"
-       "io/ioutil"
        "os"
        "path/filepath"
        "sort"
@@ -65,7 +64,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 +167,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 {
@@ -416,11 +417,22 @@ 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) {
                        return "", false, nil
@@ -518,7 +530,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                cfg.MCDRxIfis = strings.Split(*sp, "\n")
        }
 
-       fis, err := ioutil.ReadDir(filepath.Join(src, "mcd-send"))
+       fis, err := os.ReadDir(filepath.Join(src, "mcd-send"))
        if err != nil && !os.IsNotExist(err) {
                return nil, err
        }
@@ -530,7 +542,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,7 +564,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        return nil, err
                }
        }
-       fis, err = ioutil.ReadDir(filepath.Join(src, "notify", "exec"))
+       fis, err = os.ReadDir(filepath.Join(src, "notify", "exec"))
        if err != nil && !os.IsNotExist(err) {
                return nil, err
        }
@@ -569,32 +581,36 @@ func DirToCfg(src string) (*CfgJSON, error) {
                cfg.Notify = &notify
        }
 
-       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 !os.IsNotExist(err) {
                return nil, err
        }
-       cfg.Self = &self
 
        cfg.Neigh = make(map[string]NodeJSON)
-       fis, err = ioutil.ReadDir(filepath.Join(src, "neigh"))
+       fis, err = os.ReadDir(filepath.Join(src, "neigh"))
        if err != nil && !os.IsNotExist(err) {
                return nil, err
        }
@@ -621,7 +637,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                }
 
                node.Exec = make(map[string][]string)
-               fis2, err := ioutil.ReadDir(filepath.Join(src, "neigh", n, "exec"))
+               fis2, err := os.ReadDir(filepath.Join(src, "neigh", n, "exec"))
                if err != nil && !os.IsNotExist(err) {
                        return nil, err
                }
@@ -680,7 +696,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                }
 
                node.Addrs = make(map[string]string)
-               fis2, err = ioutil.ReadDir(filepath.Join(src, "neigh", n, "addrs"))
+               fis2, err = os.ReadDir(filepath.Join(src, "neigh", n, "addrs"))
                if err != nil && !os.IsNotExist(err) {
                        return nil, err
                }
@@ -730,7 +746,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        node.MaxOnlineTime = &i
                }
 
-               fis2, err = ioutil.ReadDir(filepath.Join(src, "neigh", n, "calls"))
+               fis2, err = os.ReadDir(filepath.Join(src, "neigh", n, "calls"))
                if err != nil && !os.IsNotExist(err) {
                        return nil, err
                }
@@ -844,7 +860,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
        }
 
        cfg.Areas = make(map[string]AreaJSON)
-       fis, err = ioutil.ReadDir(filepath.Join(src, "areas"))
+       fis, err = os.ReadDir(filepath.Join(src, "areas"))
        if err != nil && !os.IsNotExist(err) {
                return nil, err
        }
@@ -873,7 +889,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                }
 
                area.Exec = make(map[string][]string)
-               fis2, err := ioutil.ReadDir(filepath.Join(src, "areas", n, "exec"))
+               fis2, err := os.ReadDir(filepath.Join(src, "areas", n, "exec"))
                if err != nil && !os.IsNotExist(err) {
                        return nil, err
                }
@@ -899,5 +915,24 @@ func DirToCfg(src string) (*CfgJSON, error) {
                cfg.Areas[n] = area
        }
 
+       fis, err = os.ReadDir(filepath.Join(src, "yggdrasil-aliases"))
+       if err != nil && !os.IsNotExist(err) {
+               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
 }