Add support for more than one -peer (fixes #4)

This commit is contained in:
Neil Alexander
2021-07-10 13:13:21 +01:00
parent 90b02ba0d6
commit 2f8a2e4163
2 changed files with 23 additions and 13 deletions

View File

@@ -24,20 +24,32 @@ import (
"github.com/neilalexander/yggmail/internal/utils" "github.com/neilalexander/yggmail/internal/utils"
) )
var database = flag.String("database", "yggmail.db", "SQLite database file") type peerAddrList []string
var smtpaddr = flag.String("smtp", "localhost:1025", "SMTP listen address")
var imapaddr = flag.String("imap", "localhost:1143", "IMAP listen address") func (i *peerAddrList) String() string {
var peeraddr = flag.String("peer", "", "Connect to a specific Yggdrasil static peer") return strings.Join(*i, ", ")
var multicast = flag.Bool("multicast", false, "Connect to Yggdrasil peers on your LAN") }
var password = flag.Bool("password", false, "Set a new IMAP/SMTP password")
func (i *peerAddrList) Set(value string) error {
*i = append(*i, value)
return nil
}
func main() { func main() {
rawlog := log.New(os.Stdout, "", 0) rawlog := log.New(os.Stdout, "", 0)
log := log.New(rawlog.Writer(), "[ \033[32mYggmail\033[0m ] ", 0) log := log.New(rawlog.Writer(), "[ \033[32mYggmail\033[0m ] ", 0)
var peerAddrs peerAddrList
database := flag.String("database", "yggmail.db", "SQLite database file")
smtpaddr := flag.String("smtp", "localhost:1025", "SMTP listen address")
imapaddr := flag.String("imap", "localhost:1143", "IMAP listen address")
multicast := flag.Bool("multicast", false, "Connect to Yggdrasil peers on your LAN")
password := flag.Bool("password", false, "Set a new IMAP/SMTP password")
flag.Var(&peerAddrs, "peer", "Connect to a specific Yggdrasil static peer (this option can be given more than once)")
flag.Parse() flag.Parse()
if flag.NFlag() == 0 { if flag.NFlag() == 0 {
fmt.Println("Yggmail must be started with either an Yggdrasil peer") fmt.Println("Yggmail must be started with either one or more Yggdrasil peers")
fmt.Println("specified, multicast enabled, or both.") fmt.Println("specified, multicast enabled, or both.")
fmt.Println() fmt.Println()
fmt.Println("Available options:") fmt.Println("Available options:")
@@ -108,7 +120,7 @@ func main() {
log.Println("Password for IMAP and SMTP has been updated!") log.Println("Password for IMAP and SMTP has been updated!")
os.Exit(0) os.Exit(0)
case (multicast == nil || !*multicast) && (peeraddr == nil || *peeraddr == ""): case (multicast == nil || !*multicast) && len(peerAddrs) == 0:
log.Printf("You must specify either -peer, -multicast or both!") log.Printf("You must specify either -peer, -multicast or both!")
os.Exit(0) os.Exit(0)
} }
@@ -120,7 +132,7 @@ func main() {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(2) wg.Add(2)
transport, err := transport.NewYggdrasilTransport(rawlog, sk, pk, *peeraddr, *multicast) transport, err := transport.NewYggdrasilTransport(rawlog, sk, pk, peerAddrs, *multicast)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@@ -19,10 +19,11 @@ type YggdrasilTransport struct {
Sessions *utp.Socket Sessions *utp.Socket
} }
func NewYggdrasilTransport(log *log.Logger, sk ed25519.PrivateKey, pk ed25519.PublicKey, peer string, mcast bool) (*YggdrasilTransport, error) { func NewYggdrasilTransport(log *log.Logger, sk ed25519.PrivateKey, pk ed25519.PublicKey, peers []string, mcast bool) (*YggdrasilTransport, error) {
config := &config.NodeConfig{ config := &config.NodeConfig{
PublicKey: hex.EncodeToString(pk), PublicKey: hex.EncodeToString(pk),
PrivateKey: hex.EncodeToString(sk), PrivateKey: hex.EncodeToString(sk),
Peers: peers,
MulticastInterfaces: []config.MulticastInterfaceConfig{ MulticastInterfaces: []config.MulticastInterfaceConfig{
{ {
Regex: ".*", Regex: ".*",
@@ -35,9 +36,6 @@ func NewYggdrasilTransport(log *log.Logger, sk ed25519.PrivateKey, pk ed25519.Pu
}, },
NodeInfoPrivacy: true, NodeInfoPrivacy: true,
} }
if peer != "" {
config.Peers = append(config.Peers, peer)
}
glog := gologme.New(log.Writer(), "[ \033[33mYggdrasil\033[0m ] ", 0) glog := gologme.New(log.Writer(), "[ \033[33mYggdrasil\033[0m ] ", 0)
glog.EnableLevel("warn") glog.EnableLevel("warn")
glog.EnableLevel("error") glog.EnableLevel("error")