fixed duplicate interface issue

This commit is contained in:
afeiszli
2021-03-26 00:04:04 -04:00
parent 1b437c38d1
commit 9aa7970605
2 changed files with 65 additions and 12 deletions

Binary file not shown.

View File

@@ -433,18 +433,35 @@ func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
err = cmdIPDevLinkAdd.Run()
currentiface, err := net.InterfaceByName(ifacename)
if err != nil {
err = cmdIPDevLinkAdd.Run()
if err != nil && !strings.Contains(err.Error(), "exists") { if err != nil && !strings.Contains(err.Error(), "exists") {
fmt.Println("Error creating interface") fmt.Println("Error creating interface")
//fmt.Println(err.Error()) //fmt.Println(err.Error())
//return err //return err
} }
}
match := false
addrs, _ := currentiface.Addrs()
for _, a := range addrs {
fmt.Println("Current address: " + a.String())
fmt.Println("node.Address: " + node.Address)
if strings.Contains(a.String(), node.Address){
match = true
}
}
if !match {
err = cmdIPAddrAdd.Run() err = cmdIPAddrAdd.Run()
if err != nil { if err != nil {
fmt.Println("Error adding address") fmt.Println("Error adding address")
//return err //return err
} }
}
var nodeport int var nodeport int
nodeport = int(node.Listenport) nodeport = int(node.Listenport)
@@ -476,7 +493,7 @@ func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
fmt.Println("Device does not exist: ") fmt.Println("Device does not exist: ")
fmt.Println(err) fmt.Println(err)
} else { } else {
log.Fatalf("Unknown config error: %v", err) fmt.Printf("This is inconvenient: %v", err)
} }
} }
cmdIPLinkUp := &exec.Cmd { cmdIPLinkUp := &exec.Cmd {
@@ -601,6 +618,32 @@ func CheckIn() error {
fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.") fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
return err return err
} }
newinterface := getNode().Interface
readreq := &nodepb.ReadNodeReq{
Macaddress: node.Macaddress,
Group: node.Nodegroup,
}
readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
if err != nil {
fmt.Printf("Error: %v", err)
} else {
currentiface := readres.Node.Interface
ifaceupdate := newinterface != currentiface
fmt.Println("Is it time to update the interface? ")
fmt.Println(ifaceupdate)
if err != nil {
log.Printf("Error retrieving interface: %v", err)
}
if ifaceupdate {
err := DeleteInterface(currentiface)
if err != nil {
fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
}
}
err = setWGConfig()
}
if checkinres.Checkinresponse.Needconfigupdate { if checkinres.Checkinresponse.Needconfigupdate {
fmt.Println("Server has requested that node update config.") fmt.Println("Server has requested that node update config.")
fmt.Println("Updating config from remote server.") fmt.Println("Updating config from remote server.")
@@ -628,28 +671,21 @@ func CheckIn() error {
fmt.Println("Node has requested to update remote config.") fmt.Println("Node has requested to update remote config.")
fmt.Println("Posting local config to remote server.") fmt.Println("Posting local config to remote server.")
postnode := getNode() postnode := getNode()
currentinterface := postnode.Interface
req := &nodepb.UpdateNodeReq{ req := &nodepb.UpdateNodeReq{
Node: &postnode, Node: &postnode,
} }
res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header)) res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
if err != nil { if err != nil {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
} }
res.Node.Postchanges = "false" res.Node.Postchanges = "false"
newinterface := res.Node.Interface
err = modConfig(res.Node) err = modConfig(res.Node)
if err != nil { if err != nil {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
} }
if currentinterface != newinterface {
err := DeleteInterface(currentinterface)
if err != nil {
fmt.Println("ERROR DELETING INTERFACE: " + currentinterface)
}
}
err = setWGConfig() err = setWGConfig()
if err != nil { if err != nil {
return err return err
@@ -681,6 +717,23 @@ func CheckIn() error {
} }
return nil return nil
} }
func needInterfaceUpdate(ctx context.Context, mac string, group string, iface string) (bool, string, error) {
var header metadata.MD
req := &nodepb.ReadNodeReq{
Macaddress: mac,
Group: group,
}
readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
if err != nil {
return false, "", err
log.Fatalf("Error: %v", err)
}
oldiface := readres.Node.Interface
return iface != oldiface, oldiface, err
}
func getNode() nodepb.Node { func getNode() nodepb.Node {
modcfg := config.Config modcfg := config.Config
modcfg.ReadConfig() modcfg.ReadConfig()