1
0
forked from extern/smegmesh
smegmesh/cmd/wg-mesh/main.go

178 lines
4.3 KiB
Go
Raw Normal View History

2023-09-18 13:59:28 +02:00
package main
import (
"fmt"
2023-09-28 17:55:37 +02:00
"log"
ipcRpc "net/rpc"
"os"
"strings"
"time"
"github.com/akamensky/argparse"
"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"
func createMesh(client *ipcRpc.Client, ifName string, wgPort int) string {
2023-09-18 18:00:43 +02:00
var reply string
newMeshParams := ipc.NewMeshArgs{
IfName: ifName,
WgPort: wgPort,
}
err := client.Call("IpcHandler.CreateMesh", &newMeshParams, &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
}
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
err := client.Call("IpcHandler.ListMeshes", "", &reply)
2023-09-19 14:45:49 +02:00
if err != nil {
2023-10-24 01:12:38 +02:00
logging.Log.WriteErrorf(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
}
}
func joinMesh(client *ipcRpc.Client, meshId string, ipAddress string, ifName string, wgPort int) string {
var reply string
args := ipc.JoinMeshArgs{
MeshId: meshId,
IpAdress: ipAddress,
IfName: ifName,
Port: wgPort,
}
err := client.Call("IpcHandler.JoinMesh", &args, &reply)
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)
err := client.Call("IpcHandler.GetMesh", &meshId, &reply)
2023-09-20 00:50:44 +02:00
if err != nil {
2023-09-28 17:55:37 +02:00
log.Panic(err.Error())
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(fmt.Sprintf("Timestamp: %s", time.Unix(node.Timestamp, 0).String()))
advertiseRoutes := strings.Join(node.Routes, ",")
fmt.Printf("Routes: %s\n", advertiseRoutes)
2023-09-20 00:50:44 +02:00
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
err := client.Call("IpcHandler.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)
}
func getGraph(client *ipcRpc.Client, meshId string) {
var reply string
err := client.Call("IpcHandler.GetDOT", &meshId, &reply)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(reply)
}
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")
getGraphCmd := parser.NewCommand("get-graph", "Convert a mesh into DOT format")
2023-09-19 14:45:49 +02:00
var newMeshIfName *string = newMeshCmd.String("f", "ifname", &argparse.Options{Required: true})
var newMeshPort *int = newMeshCmd.Int("p", "wgport", &argparse.Options{Required: true})
var meshId *string = joinMeshCmd.String("m", "mesh", &argparse.Options{Required: true})
var ipAddress *string = joinMeshCmd.String("i", "ip", &argparse.Options{Required: true})
var joinMeshIfName *string = joinMeshCmd.String("f", "ifname", &argparse.Options{Required: true})
var joinMeshPort *int = joinMeshCmd.Int("p", "wgport", &argparse.Options{Required: true})
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})
var getGraphMeshId *string = getGraphCmd.String("m", "mesh", &argparse.Options{Required: true})
2023-09-20 00:50:44 +02:00
err := parser.Parse(os.Args)
2023-09-18 13:59:28 +02:00
if err != nil {
fmt.Print(parser.Usage(err))
return
}
2023-09-18 13:59:28 +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() {
fmt.Println(createMesh(client, *newMeshIfName, *newMeshPort))
}
2023-09-19 14:45:49 +02:00
if listMeshCmd.Happened() {
listMeshes(client)
}
if joinMeshCmd.Happened() {
fmt.Println(joinMesh(client, *meshId, *ipAddress, *joinMeshIfName, *joinMeshPort))
2023-09-20 00:50:44 +02:00
}
if getMeshCmd.Happened() {
getMesh(client, *getMeshId)
2023-09-19 14:45:49 +02:00
}
2023-09-21 19:43:29 +02:00
if getGraphCmd.Happened() {
getGraph(client, *getGraphMeshId)
}
2023-09-21 19:43:29 +02:00
if enableInterfaceCmd.Happened() {
enableInterface(client, *enableInterfaceMeshId)
}
}