smegmesh/pkg/robin/requester.go

277 lines
5.3 KiB
Go
Raw Normal View History

2023-09-29 16:00:20 +02:00
package robin
2023-09-18 18:00:43 +02:00
import (
"context"
"encoding/json"
2023-09-18 18:00:43 +02:00
"errors"
"fmt"
2023-09-20 00:50:44 +02:00
"strconv"
"time"
2023-09-18 18:00:43 +02:00
2023-09-19 14:45:49 +02:00
"github.com/tim-beatham/wgmesh/pkg/ctrlserver"
2023-09-20 00:50:44 +02:00
"github.com/tim-beatham/wgmesh/pkg/ipc"
"github.com/tim-beatham/wgmesh/pkg/mesh"
"github.com/tim-beatham/wgmesh/pkg/query"
2023-09-29 16:00:20 +02:00
"github.com/tim-beatham/wgmesh/pkg/rpc"
2023-09-18 18:00:43 +02:00
)
type IpcHandler struct {
2023-11-05 19:03:58 +01:00
Server ctrlserver.CtrlServer
2023-09-18 18:00:43 +02:00
}
func (n *IpcHandler) CreateMesh(args *ipc.NewMeshArgs, reply *string) error {
2023-11-05 19:03:58 +01:00
meshId, err := n.Server.GetMeshManager().CreateMesh(args.IfName, args.WgPort)
if err != nil {
return err
}
2023-10-05 18:48:54 +02:00
2023-11-05 19:03:58 +01:00
err = n.Server.GetMeshManager().AddSelf(&mesh.AddSelfParams{
MeshId: meshId,
WgPort: args.WgPort,
Endpoint: args.Endpoint,
})
if err != nil {
return err
}
2023-10-06 11:12:46 +02:00
*reply = meshId
return err
2023-09-18 18:00:43 +02:00
}
func (n *IpcHandler) ListMeshes(_ string, reply *ipc.ListMeshReply) error {
2023-11-05 19:03:58 +01:00
meshNames := make([]string, len(n.Server.GetMeshManager().GetMeshes()))
2023-10-06 19:25:38 +02:00
i := 0
2023-11-05 19:03:58 +01:00
for meshId, _ := range n.Server.GetMeshManager().GetMeshes() {
meshNames[i] = meshId
2023-10-06 19:25:38 +02:00
i++
}
2023-09-20 15:34:34 +02:00
2023-10-06 19:25:38 +02:00
*reply = ipc.ListMeshReply{Meshes: meshNames}
2023-09-20 15:34:34 +02:00
return nil
}
func (n *IpcHandler) JoinMesh(args ipc.JoinMeshArgs, reply *string) error {
2023-11-05 19:03:58 +01:00
peerConnection, err := n.Server.GetConnectionManager().GetConnection(args.IpAdress)
2023-10-01 21:14:09 +02:00
if err != nil {
return err
}
client, err := peerConnection.GetClient()
if err != nil {
return err
}
c := rpc.NewMeshCtrlServerClient(client)
2023-10-01 21:14:09 +02:00
if err != nil {
return err
}
2023-10-24 01:12:38 +02:00
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
2023-10-06 12:52:51 +02:00
meshReply, err := c.GetMesh(ctx, &rpc.GetMeshRequest{MeshId: args.MeshId})
if err != nil {
return err
}
2023-11-05 19:03:58 +01:00
err = n.Server.GetMeshManager().AddMesh(&mesh.AddMeshParams{
MeshId: args.MeshId,
DevName: args.IfName,
WgPort: args.Port,
MeshBytes: meshReply.Mesh,
})
2023-10-06 12:52:51 +02:00
if err != nil {
return err
}
2023-11-05 19:03:58 +01:00
err = n.Server.GetMeshManager().AddSelf(&mesh.AddSelfParams{
MeshId: args.MeshId,
WgPort: args.Port,
Endpoint: args.Endpoint,
})
2023-09-20 00:50:44 +02:00
2023-10-06 12:52:51 +02:00
if err != nil {
return err
}
*reply = strconv.FormatBool(true)
return nil
}
// LeaveMesh leaves a mesh network
func (n *IpcHandler) LeaveMesh(meshId string, reply *string) error {
2023-11-05 19:03:58 +01:00
err := n.Server.GetMeshManager().LeaveMesh(meshId)
2023-10-06 12:52:51 +02:00
if err == nil {
*reply = fmt.Sprintf("Left Mesh %s", meshId)
2023-10-27 18:49:18 +02:00
}
return err
2023-09-20 00:50:44 +02:00
}
func (n *IpcHandler) GetMesh(meshId string, reply *ipc.GetMeshReply) error {
2023-11-05 19:03:58 +01:00
mesh := n.Server.GetMeshManager().GetMesh(meshId)
if mesh == nil {
return fmt.Errorf("mesh %s does not exist", meshId)
}
meshSnapshot, err := mesh.GetMesh()
2023-10-06 12:52:51 +02:00
if err != nil {
return err
}
2023-09-20 00:50:44 +02:00
if mesh == nil {
return errors.New("mesh does not exist")
}
nodes := make([]ctrlserver.MeshNode, len(meshSnapshot.GetNodes()))
2023-09-20 00:50:44 +02:00
i := 0
for _, node := range meshSnapshot.GetNodes() {
pubKey, _ := node.GetPublicKey()
if err != nil {
return err
2023-09-20 00:50:44 +02:00
}
node := ctrlserver.MeshNode{
HostEndpoint: node.GetHostEndpoint(),
WgEndpoint: node.GetWgEndpoint(),
PublicKey: pubKey.String(),
WgHost: node.GetWgHost().String(),
Timestamp: node.GetTimeStamp(),
Routes: node.GetRoutes(),
2023-11-13 11:44:14 +01:00
Description: node.GetDescription(),
Alias: node.GetAlias(),
Services: node.GetServices(),
}
nodes[i] = node
i += 1
2023-09-20 00:50:44 +02:00
}
*reply = ipc.GetMeshReply{Nodes: nodes}
return nil
2023-09-19 14:45:49 +02:00
}
func (n *IpcHandler) EnableInterface(meshId string, reply *string) error {
2023-11-05 19:03:58 +01:00
err := n.Server.GetMeshManager().EnableInterface(meshId)
2023-09-21 19:43:29 +02:00
if err != nil {
2023-10-06 12:52:51 +02:00
*reply = err.Error()
2023-09-21 19:43:29 +02:00
return err
}
*reply = "up"
return nil
}
func (n *IpcHandler) GetDOT(meshId string, reply *string) error {
2023-11-05 19:03:58 +01:00
g := mesh.NewMeshDotConverter(n.Server.GetMeshManager())
result, err := g.Generate(meshId)
if err != nil {
return err
}
*reply = result
return nil
}
func (n *IpcHandler) Query(params ipc.QueryMesh, reply *string) error {
2023-11-05 19:03:58 +01:00
queryResponse, err := n.Server.GetQuerier().Query(params.MeshId, params.Query)
if err != nil {
return err
}
*reply = string(queryResponse)
return nil
}
func (n *IpcHandler) PutDescription(description string, reply *string) error {
2023-11-05 19:03:58 +01:00
err := n.Server.GetMeshManager().SetDescription(description)
if err != nil {
return err
}
*reply = fmt.Sprintf("Set description to %s", description)
return nil
}
func (n *IpcHandler) PutAlias(alias string, reply *string) error {
err := n.Server.GetMeshManager().SetAlias(alias)
if err != nil {
return err
}
*reply = fmt.Sprintf("Set alias to %s", alias)
return nil
}
func (n *IpcHandler) PutService(service ipc.PutServiceArgs, reply *string) error {
err := n.Server.GetMeshManager().SetService(service.Service, service.Value)
if err != nil {
return err
}
*reply = "success"
return nil
}
func (n *IpcHandler) DeleteService(service string, reply *string) error {
err := n.Server.GetMeshManager().RemoveService(service)
if err != nil {
return err
}
*reply = "success"
return nil
}
func (n *IpcHandler) GetNode(args ipc.GetNodeArgs, reply *string) error {
node := n.Server.GetMeshManager().GetNode(args.MeshId, args.NodeId)
if node == nil {
*reply = "nil"
return nil
}
queryNode := query.MeshNodeToQueryNode(node)
bytes, err := json.Marshal(queryNode)
if err != nil {
*reply = err.Error()
return nil
}
*reply = string(bytes)
return nil
}
2023-10-05 18:48:54 +02:00
type RobinIpcParams struct {
2023-11-05 19:03:58 +01:00
CtrlServer ctrlserver.CtrlServer
2023-10-05 18:48:54 +02:00
}
func NewRobinIpc(ipcParams RobinIpcParams) IpcHandler {
return IpcHandler{
Server: ipcParams.CtrlServer,
2023-10-05 18:48:54 +02:00
}
2023-09-18 18:00:43 +02:00
}