From e5e4641264a7ddbd33596b6441cc164ee3f3bca8 Mon Sep 17 00:00:00 2001 From: HeshamTB Date: Mon, 18 Mar 2024 01:35:37 +0300 Subject: [PATCH] feat: Do not quit when keyfile can not be opened, create key - Refactor AddTestPeer Signed-off-by: HeshamTB --- cmd/hvpn-node/hvpn-node.go | 99 +++++++++++++++----------------------- link.go | 13 ++++- 2 files changed, 50 insertions(+), 62 deletions(-) diff --git a/cmd/hvpn-node/hvpn-node.go b/cmd/hvpn-node/hvpn-node.go index 7d69ee5..be98b67 100644 --- a/cmd/hvpn-node/hvpn-node.go +++ b/cmd/hvpn-node/hvpn-node.go @@ -4,10 +4,8 @@ import ( "bufio" "fmt" "log/slog" - "net" "net/http" "net/netip" - "net/url" "os" "os/signal" "strings" @@ -210,7 +208,7 @@ func setup(ctx *cli.Context) error { if err != nil { return cli.Exit(err, 1) } - slog.Debug(fmt.Sprintf("Private key: %s", privateKey.String())) + slog.Debug(fmt.Sprintf("new public key: %s", privateKey.PublicKey().String())) return nil } @@ -223,24 +221,30 @@ func setup(ctx *cli.Context) error { privKeyFile, err := os.Open(PrivateKeyPath) defer privKeyFile.Close() if err != nil { - return cli.Exit(err, 1) - } - privateKeyStr := make([]byte, 45) - n, err := privKeyFile.Read(privateKeyStr) - if err != nil { - return cli.Exit(err, 1) - } - if n != 45 { - slog.Warn("Private key length did not math the expected 45!") - } - slog.Debug(fmt.Sprintf("Read %d bytes from keyfile", n)) + slog.Error(err.Error()) + slog.Info("Could not open private key file") + err := createPrivKey() + if err != nil { + return err + } + } else { + privateKeyStr := make([]byte, 45) + n, err := privKeyFile.Read(privateKeyStr) + if err != nil { + return cli.Exit(err, 1) + } + if n != 45 { + slog.Warn("Private key length did not math the expected 45!") + } + slog.Debug(fmt.Sprintf("Read %d bytes from keyfile", n)) - privateKey, err = wgtypes.ParseKey(string(privateKeyStr)) - slog.Debug("Keyfile opened for reading") - if err != nil { - return cli.Exit(err, 1) + privateKey, err = wgtypes.ParseKey(string(privateKeyStr)) + slog.Debug("Keyfile opened for reading") + if err != nil { + return cli.Exit(err, 1) + } + slog.Debug("Private key parsed and is correct") } - slog.Debug("Private key parsed and is correct") } wg, err := hvpnnode3.InitWGLink( @@ -275,7 +279,7 @@ func setup(ctx *cli.Context) error { ipPool, err := hvpnnode3.NewPool(VPNIPCIDR) if err != nil { - slog.Error(fmt.Sprintf("main.IPPool: %s", err)) + slog.Error(fmt.Sprintf("IPPool: %s", err)) os.Exit(1) } slog.Debug(fmt.Sprintf("Init ip pool %s", VPNIPCIDR)) @@ -286,13 +290,13 @@ func setup(ctx *cli.Context) error { os.Exit(1) } - slog.Debug(fmt.Sprintf("main.testVip: IP Pool Test IP: %s", testVip.String())) + slog.Debug(fmt.Sprintf("IP Pool Test IP: %s", testVip.String())) err = ipPool.Free(testVip) if err != nil { - slog.Error("main.testVip: Could not free test Vip from IPPool!", err) - os.Exit(1) + slog.Error("Could not free test Vip from IPPool!", err) + return cli.Exit(err.Error(), 1) } - slog.Debug("main.testVip: Test IP Freed") + slog.Debug("Test IP Freed") IPPool = ipPool wgLink.IPPool = ipPool @@ -328,48 +332,23 @@ func testWgPeerAdd(wgLink *hvpnnode3.WGLink) error { return err } publicKey := privateKey.PublicKey() - - urlsafe := url.QueryEscape(publicKey.String()) - slog.Debug(urlsafe) - - ip, err := wgLink.Allocate() + _, err = wgLink.AddPeer(publicKey.String()) + if err != nil { + slog.Error(err.Error()) + return err + } + slog.Debug(fmt.Sprintf("Added test peer %v", publicKey.String())) + + err = wgLink.DeletePeer(publicKey.String()) if err != nil { return err } - - peerConfig := wgtypes.PeerConfig{ - PublicKey: publicKey, - AllowedIPs: []net.IPNet{ - { - IP: ip, - Mask: net.IPv4Mask(255, 255, 255, 255), - }, - }, - } - - wgConfig := wgtypes.Config{ - Peers: []wgtypes.PeerConfig{peerConfig}, - } - - err = wgLink.ConfigureDevice(wgLink.Name, wgConfig) - - if err != nil { - return err - } - slog.Debug(fmt.Sprintf("Added test peer %v", peerConfig.PublicKey)) - - wgConfig.ReplacePeers = true - wgConfig.Peers = []wgtypes.PeerConfig{} - - err = wgLink.ConfigureDevice(wgLink.Name, wgConfig) - if err != nil { - return err + peers, err := wgLink.GetAllPeers() + if len(peers) != 0 { + slog.Warn(fmt.Sprintf("Expected 0 peers, got %d", len(peers))) } slog.Debug("Removed test peer") - wgLink.Free(ip) - slog.Debug("Freed test peer ip") - return nil } diff --git a/link.go b/link.go index bfcc3c9..fa9b105 100644 --- a/link.go +++ b/link.go @@ -185,12 +185,13 @@ func (wg *WGLink) GetPeer(publickey string) (*wgtypes.Peer, error) { } func (wg *WGLink) getPeer(pubkey wgtypes.Key) (*wgtypes.Peer, error) { - dev, err := wg.Device(wg.Name) + + peers, err := wg.GetAllPeers() if err != nil { return nil, err } - for _, peer := range dev.Peers { + for _, peer := range peers { if peer.PublicKey == pubkey { return &peer, nil } @@ -198,6 +199,14 @@ func (wg *WGLink) getPeer(pubkey wgtypes.Key) (*wgtypes.Peer, error) { return nil, proto.PeerDoesNotExist } +func (wg *WGLink) GetAllPeers() ([]wgtypes.Peer, error) { + dev, err := wg.Device(wg.Name) + if err != nil { + return nil, err + } + return dev.Peers, nil +} + func createARemovePeerCfg(publickey wgtypes.Key) wgtypes.Config { rmPeerCfg := wgtypes.PeerConfig{ Remove: true,