/*
NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2022 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/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() {
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 {
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 {
# 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}
+
+ # 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: {
# # 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
+ # # }
# # ]
# }
}