Cleanup
This commit is contained in:
@@ -56,7 +56,7 @@ func storeJson(x any, outPath string) error {
|
||||
return os.Rename(tmpPath, outPath)
|
||||
}
|
||||
|
||||
func storePeerConfig(netName string, pc m.PeerConfig) error {
|
||||
func storePeerConfig(netName string, pc localConfig) error {
|
||||
return storeJson(pc, peerConfigPath(netName))
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ func loadJson(dataPath string, ptr any) error {
|
||||
return json.Unmarshal(data, ptr)
|
||||
}
|
||||
|
||||
func loadPeerConfig(netName string) (pc m.PeerConfig, err error) {
|
||||
func loadPeerConfig(netName string) (pc localConfig, err error) {
|
||||
return pc, loadJson(peerConfigPath(netName), &pc)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package node
|
||||
import (
|
||||
"net"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
@@ -33,6 +34,9 @@ type peerRoute struct {
|
||||
}
|
||||
|
||||
var (
|
||||
hubURL *url.URL
|
||||
apiKey string
|
||||
|
||||
// Configuration for this peer.
|
||||
netName string
|
||||
localIP byte
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"time"
|
||||
"vppn/m"
|
||||
)
|
||||
@@ -16,21 +15,18 @@ type hubPoller struct {
|
||||
versions [256]int64
|
||||
}
|
||||
|
||||
func newHubPoller(conf m.PeerConfig) *hubPoller {
|
||||
u, err := url.Parse(conf.HubAddress)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to parse hub address %s: %v", conf.HubAddress, err)
|
||||
}
|
||||
func newHubPoller() *hubPoller {
|
||||
u := *hubURL
|
||||
u.Path = "/peer/fetch-state/"
|
||||
|
||||
client := &http.Client{Timeout: 8 * time.Second}
|
||||
|
||||
req := &http.Request{
|
||||
Method: http.MethodGet,
|
||||
URL: u,
|
||||
URL: &u,
|
||||
Header: http.Header{},
|
||||
}
|
||||
req.SetBasicAuth("", conf.APIKey)
|
||||
req.SetBasicAuth("", apiKey)
|
||||
|
||||
return &hubPoller{
|
||||
client: client,
|
||||
@@ -71,7 +67,7 @@ func (hp *hubPoller) pollHub() {
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(body, &state); err != nil {
|
||||
log.Printf("Failed to unmarshal response from hub: %v", err)
|
||||
log.Printf("Failed to unmarshal response from hub: %v\n%s", err, body)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
90
node/main.go
90
node/main.go
@@ -1,6 +1,8 @@
|
||||
package node
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
@@ -9,10 +11,14 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"os"
|
||||
"runtime/debug"
|
||||
"time"
|
||||
"vppn/m"
|
||||
|
||||
"golang.org/x/crypto/nacl/box"
|
||||
"golang.org/x/crypto/nacl/sign"
|
||||
)
|
||||
|
||||
func panicHandler() {
|
||||
@@ -24,33 +30,61 @@ func panicHandler() {
|
||||
func Main() {
|
||||
defer panicHandler()
|
||||
|
||||
var (
|
||||
initURL string
|
||||
listenIP string
|
||||
)
|
||||
var hubAddress string
|
||||
|
||||
flag.StringVar(&netName, "name", "", "[REQUIRED] The network name.")
|
||||
flag.StringVar(&initURL, "init-url", "", "Initializes peer from the hub URL.")
|
||||
flag.StringVar(&listenIP, "listen-ip", "", "IP address to listen on.")
|
||||
flag.StringVar(&hubAddress, "hub-address", "", "[REQUIRED] The hub address.")
|
||||
flag.StringVar(&apiKey, "api-key", "", "[REQUIRED] The node's API key.")
|
||||
flag.Parse()
|
||||
|
||||
if netName == "" {
|
||||
if netName == "" || hubAddress == "" || apiKey == "" {
|
||||
flag.Usage()
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if initURL != "" {
|
||||
mainInit(initURL)
|
||||
return
|
||||
var err error
|
||||
|
||||
hubURL, err = url.Parse(hubAddress)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to parse hub address: %v", err)
|
||||
}
|
||||
|
||||
main(listenIP)
|
||||
main()
|
||||
}
|
||||
|
||||
func mainInit(initURL string) {
|
||||
resp, err := http.Get(initURL)
|
||||
func initPeerWithHub() {
|
||||
encPubKey, encPrivKey, err := box.GenerateKey(rand.Reader)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to fetch data from hub: %v", err)
|
||||
log.Fatalf("Failed to generate encryption keys: %v", err)
|
||||
}
|
||||
|
||||
signPubKey, signPrivKey, err := sign.GenerateKey(rand.Reader)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to generate signing keys: %v", err)
|
||||
}
|
||||
|
||||
initURL := *hubURL
|
||||
initURL.Path = "/peer/init/"
|
||||
|
||||
args := m.PeerInitArgs{
|
||||
EncPubKey: encPubKey[:],
|
||||
PubSignKey: signPubKey[:],
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
if err := json.NewEncoder(buf).Encode(args); err != nil {
|
||||
log.Fatalf("Failed to encode init args: %v", err)
|
||||
}
|
||||
|
||||
req, err := http.NewRequest(http.MethodPost, initURL.String(), buf)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to construct request: %v", err)
|
||||
}
|
||||
req.SetBasicAuth("", apiKey)
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to init with hub: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
@@ -59,11 +93,16 @@ func mainInit(initURL string) {
|
||||
log.Fatalf("Failed to read response body: %v", err)
|
||||
}
|
||||
|
||||
peerConfig := m.PeerConfig{}
|
||||
if err := json.Unmarshal(data, &peerConfig); err != nil {
|
||||
log.Fatalf("Failed to parse configuration: %v", err)
|
||||
peerConfig := localConfig{}
|
||||
if err := json.Unmarshal(data, &peerConfig.PeerConfig); err != nil {
|
||||
log.Fatalf("Failed to parse configuration: %v\n%s", err, data)
|
||||
}
|
||||
|
||||
peerConfig.PubKey = encPubKey[:]
|
||||
peerConfig.PrivKey = encPrivKey[:]
|
||||
peerConfig.PubSignKey = signPubKey[:]
|
||||
peerConfig.PrivSignKey = signPrivKey[:]
|
||||
|
||||
if err := storePeerConfig(netName, peerConfig); err != nil {
|
||||
log.Fatalf("Failed to store configuration: %v", err)
|
||||
}
|
||||
@@ -73,10 +112,17 @@ func mainInit(initURL string) {
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
func main(listenIP string) {
|
||||
func main() {
|
||||
config, err := loadPeerConfig(netName)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to load configuration: %v", err)
|
||||
log.Printf("Failed to load configuration: %v", err)
|
||||
log.Printf("Initializing...")
|
||||
initPeerWithHub()
|
||||
|
||||
config, err = loadPeerConfig(netName)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to load configuration: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
iface, err := openInterface(config.Network, config.PeerIP, netName)
|
||||
@@ -84,7 +130,7 @@ func main(listenIP string) {
|
||||
log.Fatalf("Failed to open interface: %v", err)
|
||||
}
|
||||
|
||||
myAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", listenIP, config.Port))
|
||||
myAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", config.Port))
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to resolve UDP address: %v", err)
|
||||
}
|
||||
@@ -137,7 +183,7 @@ func main(listenIP string) {
|
||||
}
|
||||
}()
|
||||
|
||||
go newHubPoller(config).Run()
|
||||
go newHubPoller().Run()
|
||||
go readFromConn(conn)
|
||||
readFromIFace(iface)
|
||||
}
|
||||
@@ -258,7 +304,7 @@ func handleDataPacket(h header, data []byte, decBuf []byte) {
|
||||
|
||||
destRoute := routingTable[h.DestIP].Load()
|
||||
if !destRoute.Up {
|
||||
log.Printf("Not connected (relay): %v", destRoute)
|
||||
log.Printf("Not connected (relay): %d", destRoute.IP)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -214,7 +214,7 @@ func (s *peerSupervisor) server() stateFunc {
|
||||
s.sendControlPacketTo(probePacket{TraceID: msg.Packet.TraceID}, msg.SrcAddr)
|
||||
|
||||
case pingTimerMsg:
|
||||
if time.Since(lastSeen) > timeoutInterval {
|
||||
if time.Since(lastSeen) > timeoutInterval && s.staged.Up {
|
||||
logf("Connection timeout")
|
||||
s.staged.Up = false
|
||||
s.publish()
|
||||
|
||||
Reference in New Issue
Block a user