/*
NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2019 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2021 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
package main
import (
+ "crypto/rand"
+ "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/v7"
)
func usage() {
func main() {
var (
+ areaName = flag.String("area", "", "Generate area's keypairs")
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 {
fmt.Println(nncp.VersionGet())
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 {
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 {
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 interfaces where to listen for MCD announcements
+ # mcd-listen: ["em0", "igb1"]
+ # Interfaces and intervals (in seconds) where to send MCD announcements
+ # mcd-send: {em0: 60, igb1: 5}
# Enable notification email sending
# notify: {
# 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: {
# 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,
)
}