X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcmd%2Fnncp-cfgnew%2Fmain.go;h=8e0fa9f819c48e2e4ad1801e6a106229c73a1f4a;hb=857b50285a0b75f03c2f2bfa5daa39901cfdf320;hp=a9bea4f4b63c737efc9fc0414423c286eb3d8345;hpb=0139e8deda4112d2c3dcd52e0ad72162e54caa03;p=nncp.git diff --git a/src/cmd/nncp-cfgnew/main.go b/src/cmd/nncp-cfgnew/main.go index a9bea4f..8e0fa9f 100644 --- a/src/cmd/nncp-cfgnew/main.go +++ b/src/cmd/nncp-cfgnew/main.go @@ -1,6 +1,6 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2019 Sergey Matveev +Copyright (C) 2016-2022 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 @@ -19,11 +19,20 @@ along with this program. If not, see . package main import ( + "crypto/ed25519" + "crypto/rand" + "encoding/hex" + "encoding/json" "flag" "fmt" + "log" "os" - "go.cypherpunks.ru/nncp/v5" + "github.com/hjson/hjson-go" + "golang.org/x/crypto/blake2b" + "golang.org/x/crypto/nacl/box" + + "go.cypherpunks.ru/nncp/v8" ) func usage() { @@ -34,10 +43,13 @@ func usage() { func main() { var ( + areaName = flag.String("area", "", "Generate area's keypairs") + yggdrasil = flag.Bool("yggdrasil", false, "Generate Yggdrasil keypair") noComments = flag.Bool("nocomments", false, "Do not include descriptive comments") version = flag.Bool("version", false, "Print version information") warranty = flag.Bool("warranty", false, "Print warranty information") ) + log.SetFlags(log.Lshortfile) flag.Usage = usage flag.Parse() if *warranty { @@ -48,9 +60,87 @@ func main() { fmt.Println(nncp.VersionGet()) return } + + if *yggdrasil { + pub, prv, err := ed25519.GenerateKey(rand.Reader) + if err != nil { + log.Fatalln(err) + } + fmt.Println("Public:", hex.EncodeToString(pub)) + fmt.Println("Private:", hex.EncodeToString(prv)) + return + } + + if *areaName != "" { + pub, prv, err := box.GenerateKey(rand.Reader) + if err != nil { + log.Fatalln(err) + } + areaId := nncp.AreaId(blake2b.Sum256(pub[:])) + var cfgRaw string + if *noComments { + cfgRaw = fmt.Sprintf(`areas: { + %s: { + id: %s + # KEEP AWAY keypair from the nodes you want only participate in multicast + pub: %s + prv: %s + } +}`, + *areaName, + areaId.String(), + nncp.Base32Codec.EncodeToString(pub[:]), + nncp.Base32Codec.EncodeToString(prv[:]), + ) + } else { + cfgRaw = fmt.Sprintf(`areas: { + %s: { + id: %s + + # KEEP AWAY keypair from the nodes you want only participate in multicast + pub: %s + prv: %s + + # List of subscribers you should multicast area messages to + # subs: ["alice"] + + # Allow incoming files (from the area) saving in that directory + # incoming: /home/areas/%s/incoming + + # Allow incoming area commands execution + # exec: {sendmail: ["%s"]} + + # Allow unknown sender's message tossing (relaying will be made anyway) + # allow-unknown: true + } +}`, + *areaName, + areaId.String(), + nncp.Base32Codec.EncodeToString(pub[:]), + nncp.Base32Codec.EncodeToString(prv[:]), + *areaName, + nncp.DefaultSendmailPath, + ) + } + var cfgGeneral map[string]interface{} + if err = hjson.Unmarshal([]byte(cfgRaw), &cfgGeneral); err != nil { + panic(err) + } + marshaled, err := json.Marshal(cfgGeneral) + if err != nil { + panic(err) + } + var areas map[string]nncp.AreaJSON + if err = json.Unmarshal(marshaled, &areas); err != nil { + panic(err) + } + fmt.Println(cfgRaw) + return + } + nodeOur, err := nncp.NewNodeGenerate() if err != nil { - panic(err) + log.Fatalln(err) } var cfgRaw string if *noComments { @@ -68,6 +158,7 @@ func main() { noiseprv: %s noisepub: %s } + neigh: { self: { id: %s @@ -81,16 +172,16 @@ func main() { nncp.DefaultSpoolPath, nncp.DefaultLogPath, nodeOur.Id.String(), - nncp.ToBase32(nodeOur.ExchPub[:]), - nncp.ToBase32(nodeOur.ExchPrv[:]), - nncp.ToBase32(nodeOur.SignPub[:]), - nncp.ToBase32(nodeOur.SignPrv[:]), - nncp.ToBase32(nodeOur.NoisePub[:]), - nncp.ToBase32(nodeOur.NoisePrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.ExchPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.ExchPrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.SignPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.SignPrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.NoisePrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.NoisePub[:]), nodeOur.Id.String(), - nncp.ToBase32(nodeOur.ExchPub[:]), - nncp.ToBase32(nodeOur.SignPub[:]), - nncp.ToBase32(nodeOur.NoisePub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.ExchPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.SignPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.NoisePub[:]), nncp.DefaultSendmailPath, ) } else { @@ -99,6 +190,27 @@ func main() { spool: %s # Path to log file log: %s + # Enforce specified umask usage + # umask: "022" + # Omit progress showing by default + # noprogress: true + # Do not use hdr/ files + # nohdr: true + + # MultiCast Discovery: + # List of interface regular expressions where to listen for MCD announcements + mcd-listen: [".*"] + # Interfaces regular expressions and intervals (in seconds) where to send + # MCD announcements + mcd-send: {.*: 10} + + # Yggdrasil related aliases: + # yggdrasil-aliases: { + # myprv: 60bb...27aa + # bob-pub: 98de...ac19d + # alice-endpoint: tcp://example.com:1234?key=689c...13fb + # default-endpoints: tcp://[::1]:2345,alice-endpoint + # } # Enable notification email sending # notify: { @@ -110,6 +222,19 @@ func main() { # from: nncp@localhost # to: user+freq@example.com # } + # # Send some exec commands execution notifications + # exec: { + # # bob neighbour's "somehandle" notification + # bob.somehandle: { + # from: nncp+bob@localhost + # to: user+somehandle@example.com + # } + # # Any neighboor's "anotherhandle" + # *.anotherhandle: { + # from: nncp@localhost + # to: user+anotherhandle@example.com + # } + # } # } self: { @@ -122,6 +247,7 @@ func main() { noiseprv: %s noisepub: %s } + neigh: { self: { # You should give public keys below to your neighbours @@ -144,66 +270,82 @@ func main() { # noisepub: UBM5K...VI42A # # # He is allowed to send email - # exec: {sendmail: ["/usr/sbin/sendmail"]} + # # exec: {sendmail: ["%s"]} # # # Allow incoming files saving in that directory - # incoming: "/home/alice/incoming" + # # incoming: "/home/alice/incoming" # # # Transitional nodes path - # via: ["bob", "eve"] + # # via: ["bob", "eve"] # # # Inactivity timeout when session with remote peer should be terminated - # onlinedeadline: 1800 + # # onlinedeadline: 1800 # # # Maximal online session lifetime - # maxonlinetime: 3600 + # # maxonlinetime: 3600 # - # # Allow freqing from that directory - # freq: "/home/bob/pub" - # # Send freqed files with chunks - # freqchunked: 1024 - # # Send freqed files with minumal chunk size - # freqminsize: 2048 + # # If neither freq section, nor freq.path exist, then no freqing allowed + # # freq: { + # # # Allow freqing from that directory + # # path: "/home/bob/pub" + # # # Send freqed files with chunks + # # # chunked: 1024 + # # # Send freqed files with minumal chunk size + # # # minsize: 2048 + # # # Maximal allowable freqing file size + # # # maxsize: 4096 + # # } # # # Set maximal packets per second receive and transmit rates - # rxrate: 10 - # txrate: 20 + # # rxrate: 10 + # # txrate: 20 # # # Address aliases - # addrs: { - # lan: "[fe80::1234%%igb0]:5400" - # internet: alice.com:3389 - # } + # # addrs: { + # # lan: "[fe80::1234%%igb0]:5400" + # # internet: alice.com:3389 + # # } # # # Calls configuration - # calls: [ - # { - # cron: "*/2 * * * *" - # onlinedeadline: 1800 - # maxonlinetime: 1750 - # nice: PRIORITY+10 - # rxrate: 10 - # txrate: 20 - # xx: rx - # addr: lan - # }, - # ] + # # calls: [ + # # { + # # cron: "*/2 * * * *" + # # onlinedeadline: 1800 + # # maxonlinetime: 1750 + # # nice: PRIORITY+10 + # # rxrate: 10 + # # txrate: 20 + # # xx: rx + # # addr: lan + # # when-tx-exists: true + # # nock: true + # # mcd-ignore: true + # # + # # autotoss: false + # # autotoss-doseen: true + # # autotoss-nofile: true + # # autotoss-nofreq: true + # # autotoss-noexec: true + # # autotoss-notrns: true + # # } + # # ] # } } }`, nncp.DefaultSpoolPath, nncp.DefaultLogPath, nodeOur.Id.String(), - nncp.ToBase32(nodeOur.ExchPub[:]), - nncp.ToBase32(nodeOur.ExchPrv[:]), - nncp.ToBase32(nodeOur.SignPub[:]), - nncp.ToBase32(nodeOur.SignPrv[:]), - nncp.ToBase32(nodeOur.NoisePub[:]), - nncp.ToBase32(nodeOur.NoisePrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.ExchPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.ExchPrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.SignPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.SignPrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.NoisePrv[:]), + nncp.Base32Codec.EncodeToString(nodeOur.NoisePub[:]), nodeOur.Id.String(), - nncp.ToBase32(nodeOur.ExchPub[:]), - nncp.ToBase32(nodeOur.SignPub[:]), - nncp.ToBase32(nodeOur.NoisePub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.ExchPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.SignPub[:]), + nncp.Base32Codec.EncodeToString(nodeOur.NoisePub[:]), + nncp.DefaultSendmailPath, nncp.DefaultSendmailPath, ) }