2023-09-18 13:59:28 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2023-09-18 16:52:28 +02:00
|
|
|
"fmt"
|
2023-09-28 17:55:37 +02:00
|
|
|
"log"
|
2023-09-19 19:29:35 +02:00
|
|
|
ipcRpc "net/rpc"
|
2023-09-18 16:52:28 +02:00
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/akamensky/argparse"
|
2023-09-19 19:29:35 +02:00
|
|
|
"github.com/tim-beatham/wgmesh/pkg/ipc"
|
2023-10-06 19:25:38 +02:00
|
|
|
logging "github.com/tim-beatham/wgmesh/pkg/log"
|
2023-09-18 13:59:28 +02:00
|
|
|
)
|
|
|
|
|
2023-09-18 18:00:43 +02:00
|
|
|
const SockAddr = "/tmp/wgmesh_ipc.sock"
|
|
|
|
|
2023-09-29 16:00:20 +02:00
|
|
|
func createMesh(client *ipcRpc.Client) string {
|
2023-09-18 18:00:43 +02:00
|
|
|
var reply string
|
2023-09-29 16:00:20 +02:00
|
|
|
err := client.Call("RobinIpc.CreateMesh", "", &reply)
|
2023-09-18 18:00:43 +02:00
|
|
|
|
|
|
|
if err != nil {
|
2023-09-20 00:50:44 +02:00
|
|
|
return err.Error()
|
2023-09-18 18:00:43 +02:00
|
|
|
}
|
|
|
|
|
2023-09-20 00:50:44 +02:00
|
|
|
return reply
|
2023-09-18 18:00:43 +02:00
|
|
|
}
|
|
|
|
|
2023-09-19 19:29:35 +02:00
|
|
|
func listMeshes(client *ipcRpc.Client) {
|
2023-10-06 19:25:38 +02:00
|
|
|
reply := new(ipc.ListMeshReply)
|
2023-09-19 14:45:49 +02:00
|
|
|
|
2023-09-29 16:00:20 +02:00
|
|
|
err := client.Call("RobinIpc.ListMeshes", "", &reply)
|
2023-09-19 14:45:49 +02:00
|
|
|
|
|
|
|
if err != nil {
|
2023-10-06 19:25:38 +02:00
|
|
|
logging.ErrorLog.Println(err.Error())
|
2023-09-19 14:45:49 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-10-06 19:25:38 +02:00
|
|
|
for _, meshId := range reply.Meshes {
|
|
|
|
fmt.Println(meshId)
|
2023-09-19 14:45:49 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-09-20 00:50:44 +02:00
|
|
|
func joinMesh(client *ipcRpc.Client, meshId string, ipAddress string) string {
|
2023-09-19 19:29:35 +02:00
|
|
|
var reply string
|
|
|
|
|
|
|
|
args := ipc.JoinMeshArgs{MeshId: meshId, IpAdress: ipAddress}
|
|
|
|
|
2023-09-29 16:00:20 +02:00
|
|
|
err := client.Call("RobinIpc.JoinMesh", &args, &reply)
|
2023-09-19 19:29:35 +02:00
|
|
|
|
2023-09-20 00:50:44 +02:00
|
|
|
if err != nil {
|
|
|
|
return err.Error()
|
|
|
|
}
|
|
|
|
|
|
|
|
return reply
|
|
|
|
}
|
|
|
|
|
|
|
|
func getMesh(client *ipcRpc.Client, meshId string) {
|
|
|
|
reply := new(ipc.GetMeshReply)
|
|
|
|
|
2023-09-29 16:00:20 +02:00
|
|
|
err := client.Call("RobinIpc.GetMesh", &meshId, &reply)
|
2023-09-20 00:50:44 +02:00
|
|
|
|
2023-09-19 19:29:35 +02:00
|
|
|
if err != nil {
|
2023-09-28 17:55:37 +02:00
|
|
|
log.Panic(err.Error())
|
2023-09-19 19:29:35 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-09-20 00:50:44 +02:00
|
|
|
for _, node := range reply.Nodes {
|
|
|
|
fmt.Println("Public Key: " + node.PublicKey)
|
2023-10-06 12:52:51 +02:00
|
|
|
fmt.Println("Control Endpoint: " + node.HostEndpoint)
|
2023-10-06 19:25:38 +02:00
|
|
|
fmt.Println("WireGuard Endpoint: " + node.WgEndpoint)
|
2023-09-20 00:50:44 +02:00
|
|
|
fmt.Println("Wg IP: " + node.WgHost)
|
|
|
|
fmt.Println("---")
|
|
|
|
}
|
2023-09-19 14:45:49 +02:00
|
|
|
}
|
|
|
|
|
2023-09-21 19:43:29 +02:00
|
|
|
func enableInterface(client *ipcRpc.Client, meshId string) {
|
|
|
|
var reply string
|
|
|
|
|
2023-09-29 16:00:20 +02:00
|
|
|
err := client.Call("RobinIpc.EnableInterface", &meshId, &reply)
|
2023-09-21 19:43:29 +02:00
|
|
|
|
|
|
|
if err != nil {
|
2023-10-06 12:52:51 +02:00
|
|
|
fmt.Println(err.Error())
|
2023-09-21 19:43:29 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(reply)
|
|
|
|
}
|
|
|
|
|
2023-09-18 16:52:28 +02:00
|
|
|
func main() {
|
|
|
|
parser := argparse.NewParser("wg-mesh",
|
|
|
|
"wg-mesh Manipulate WireGuard meshes")
|
|
|
|
|
|
|
|
newMeshCmd := parser.NewCommand("new-mesh", "Create a new mesh")
|
2023-09-19 14:45:49 +02:00
|
|
|
listMeshCmd := parser.NewCommand("list-meshes", "List meshes the node is connected to")
|
|
|
|
joinMeshCmd := parser.NewCommand("join-mesh", "Join a mesh network")
|
2023-09-20 00:50:44 +02:00
|
|
|
getMeshCmd := parser.NewCommand("get-mesh", "Get a mesh network")
|
2023-09-21 19:43:29 +02:00
|
|
|
enableInterfaceCmd := parser.NewCommand("enable-interface", "Enable A Specific Mesh Interface")
|
2023-09-19 14:45:49 +02:00
|
|
|
|
2023-09-19 19:29:35 +02:00
|
|
|
var meshId *string = joinMeshCmd.String("m", "mesh", &argparse.Options{Required: true})
|
|
|
|
var ipAddress *string = joinMeshCmd.String("i", "ip", &argparse.Options{Required: true})
|
2023-09-19 14:45:49 +02:00
|
|
|
|
2023-09-20 00:50:44 +02:00
|
|
|
var getMeshId *string = getMeshCmd.String("m", "mesh", &argparse.Options{Required: true})
|
2023-09-21 19:43:29 +02:00
|
|
|
var enableInterfaceMeshId *string = enableInterfaceCmd.String("m", "mesh", &argparse.Options{Required: true})
|
2023-09-20 00:50:44 +02:00
|
|
|
|
2023-09-18 16:52:28 +02:00
|
|
|
err := parser.Parse(os.Args)
|
2023-09-18 13:59:28 +02:00
|
|
|
|
2023-09-18 16:52:28 +02:00
|
|
|
if err != nil {
|
|
|
|
fmt.Print(parser.Usage(err))
|
|
|
|
return
|
|
|
|
}
|
2023-09-18 13:59:28 +02:00
|
|
|
|
2023-09-19 19:29:35 +02:00
|
|
|
client, err := ipcRpc.DialHTTP("unix", SockAddr)
|
2023-09-18 18:00:43 +02:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
return
|
|
|
|
}
|
2023-09-18 13:59:28 +02:00
|
|
|
|
2023-09-18 18:00:43 +02:00
|
|
|
if newMeshCmd.Happened() {
|
2023-09-29 16:00:20 +02:00
|
|
|
fmt.Println(createMesh(client))
|
2023-09-18 16:52:28 +02:00
|
|
|
}
|
2023-09-19 14:45:49 +02:00
|
|
|
|
|
|
|
if listMeshCmd.Happened() {
|
|
|
|
listMeshes(client)
|
|
|
|
}
|
|
|
|
|
|
|
|
if joinMeshCmd.Happened() {
|
2023-09-20 00:50:44 +02:00
|
|
|
fmt.Println(joinMesh(client, *meshId, *ipAddress))
|
|
|
|
}
|
|
|
|
|
|
|
|
if getMeshCmd.Happened() {
|
|
|
|
getMesh(client, *getMeshId)
|
2023-09-19 14:45:49 +02:00
|
|
|
}
|
2023-09-21 19:43:29 +02:00
|
|
|
|
|
|
|
if enableInterfaceCmd.Happened() {
|
|
|
|
enableInterface(client, *enableInterfaceMeshId)
|
|
|
|
}
|
2023-09-18 16:52:28 +02:00
|
|
|
}
|