mirror of
https://github.com/tim-beatham/smegmesh.git
synced 2025-06-21 12:32:18 +02:00
55-cli-optionifor-peer-type
- Ability to specify WireGuard keepalive in the CLI formatter - Ability to specify publicly routeable endpoint - Ability to specify whether to advetise routes into the mesh, and whether to advertise default routes.
This commit is contained in:
parent
13bea10638
commit
2dc89d171b
@ -13,21 +13,21 @@ import (
|
|||||||
const SockAddr = "/tmp/wgmesh_ipc.sock"
|
const SockAddr = "/tmp/wgmesh_ipc.sock"
|
||||||
|
|
||||||
type CreateMeshParams struct {
|
type CreateMeshParams struct {
|
||||||
Client *ipcRpc.Client
|
Client *ipcRpc.Client
|
||||||
WgPort int
|
Endpoint string
|
||||||
Endpoint string
|
Role string
|
||||||
Role string
|
WgArgs ipc.WireGuardArgs
|
||||||
|
AdvertiseRoutes bool
|
||||||
|
AdvertiseDefault bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func createMesh(args *CreateMeshParams) string {
|
func createMesh(params *CreateMeshParams) string {
|
||||||
var reply string
|
var reply string
|
||||||
newMeshParams := ipc.NewMeshArgs{
|
newMeshParams := ipc.NewMeshArgs{
|
||||||
WgPort: args.WgPort,
|
WgArgs: params.WgArgs,
|
||||||
Endpoint: args.Endpoint,
|
|
||||||
Role: args.Role,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := args.Client.Call("IpcHandler.CreateMesh", &newMeshParams, &reply)
|
err := params.Client.Call("IpcHandler.CreateMesh", &newMeshParams, &reply)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err.Error()
|
return err.Error()
|
||||||
@ -52,13 +52,14 @@ func listMeshes(client *ipcRpc.Client) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type JoinMeshParams struct {
|
type JoinMeshParams struct {
|
||||||
Client *ipcRpc.Client
|
Client *ipcRpc.Client
|
||||||
MeshId string
|
MeshId string
|
||||||
IpAddress string
|
IpAddress string
|
||||||
IfName string
|
Endpoint string
|
||||||
WgPort int
|
Role string
|
||||||
Endpoint string
|
WgArgs ipc.WireGuardArgs
|
||||||
Role string
|
AdvertiseRoutes bool
|
||||||
|
AdvertiseDefault bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func joinMesh(params *JoinMeshParams) string {
|
func joinMesh(params *JoinMeshParams) string {
|
||||||
@ -67,8 +68,7 @@ func joinMesh(params *JoinMeshParams) string {
|
|||||||
args := ipc.JoinMeshArgs{
|
args := ipc.JoinMeshArgs{
|
||||||
MeshId: params.MeshId,
|
MeshId: params.MeshId,
|
||||||
IpAdress: params.IpAddress,
|
IpAdress: params.IpAddress,
|
||||||
Port: params.WgPort,
|
WgArgs: params.WgArgs,
|
||||||
Role: params.Role,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := params.Client.Call("IpcHandler.JoinMesh", &args, &reply)
|
err := params.Client.Call("IpcHandler.JoinMesh", &args, &reply)
|
||||||
@ -93,19 +93,6 @@ func leaveMesh(client *ipcRpc.Client, meshId string) {
|
|||||||
fmt.Println(reply)
|
fmt.Println(reply)
|
||||||
}
|
}
|
||||||
|
|
||||||
func enableInterface(client *ipcRpc.Client, meshId string) {
|
|
||||||
var reply string
|
|
||||||
|
|
||||||
err := client.Call("IpcHandler.EnableInterface", &meshId, &reply)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(reply)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getGraph(client *ipcRpc.Client, meshId string) {
|
func getGraph(client *ipcRpc.Client, meshId string) {
|
||||||
var reply string
|
var reply string
|
||||||
|
|
||||||
@ -191,31 +178,13 @@ func deleteService(client *ipcRpc.Client, service string) {
|
|||||||
fmt.Println(reply)
|
fmt.Println(reply)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNode(client *ipcRpc.Client, nodeId, meshId string) {
|
|
||||||
var reply string
|
|
||||||
args := &ipc.GetNodeArgs{
|
|
||||||
NodeId: nodeId,
|
|
||||||
MeshId: meshId,
|
|
||||||
}
|
|
||||||
|
|
||||||
err := client.Call("IpcHandler.GetNode", &args, &reply)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(reply)
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
parser := argparse.NewParser("wg-mesh",
|
parser := argparse.NewParser("wg-mesh",
|
||||||
"wg-mesh Manipulate WireGuard meshes")
|
"wg-mesh Manipulate WireGuard mesh networks")
|
||||||
|
|
||||||
newMeshCmd := parser.NewCommand("new-mesh", "Create a new mesh")
|
newMeshCmd := parser.NewCommand("new-mesh", "Create a new mesh")
|
||||||
listMeshCmd := parser.NewCommand("list-meshes", "List meshes the node is connected to")
|
listMeshCmd := parser.NewCommand("list-meshes", "List meshes the node is connected to")
|
||||||
joinMeshCmd := parser.NewCommand("join-mesh", "Join a mesh network")
|
joinMeshCmd := parser.NewCommand("join-mesh", "Join a mesh network")
|
||||||
enableInterfaceCmd := parser.NewCommand("enable-interface", "Enable A Specific Mesh Interface")
|
|
||||||
getGraphCmd := parser.NewCommand("get-graph", "Convert a mesh into DOT format")
|
getGraphCmd := parser.NewCommand("get-graph", "Convert a mesh into DOT format")
|
||||||
leaveMeshCmd := parser.NewCommand("leave-mesh", "Leave a mesh network")
|
leaveMeshCmd := parser.NewCommand("leave-mesh", "Leave a mesh network")
|
||||||
queryMeshCmd := parser.NewCommand("query-mesh", "Query a mesh network using JMESPath")
|
queryMeshCmd := parser.NewCommand("query-mesh", "Query a mesh network using JMESPath")
|
||||||
@ -223,38 +192,115 @@ func main() {
|
|||||||
putAliasCmd := parser.NewCommand("put-alias", "Place an alias for the node")
|
putAliasCmd := parser.NewCommand("put-alias", "Place an alias for the node")
|
||||||
setServiceCmd := parser.NewCommand("set-service", "Place a service into your advertisements")
|
setServiceCmd := parser.NewCommand("set-service", "Place a service into your advertisements")
|
||||||
deleteServiceCmd := parser.NewCommand("delete-service", "Remove a service from your advertisements")
|
deleteServiceCmd := parser.NewCommand("delete-service", "Remove a service from your advertisements")
|
||||||
getNodeCmd := parser.NewCommand("get-node", "Get a specific node from the mesh")
|
|
||||||
|
|
||||||
var newMeshPort *int = newMeshCmd.Int("p", "wgport", &argparse.Options{})
|
var newMeshPort *int = newMeshCmd.Int("p", "wgport", &argparse.Options{
|
||||||
var newMeshEndpoint *string = newMeshCmd.String("e", "endpoint", &argparse.Options{})
|
Default: 0,
|
||||||
var newMeshRole *string = newMeshCmd.Selector("r", "role", []string{"peer", "client"}, &argparse.Options{})
|
Help: "WireGuard port to use to the interface. A default of 0 uses an unused ephmeral port.",
|
||||||
|
})
|
||||||
|
|
||||||
var joinMeshId *string = joinMeshCmd.String("m", "mesh", &argparse.Options{Required: true})
|
var newMeshEndpoint *string = newMeshCmd.String("e", "endpoint", &argparse.Options{
|
||||||
var joinMeshIpAddress *string = joinMeshCmd.String("i", "ip", &argparse.Options{Required: true})
|
Help: "Publicly routeable endpoint to advertise within the mesh",
|
||||||
var joinMeshPort *int = joinMeshCmd.Int("p", "wgport", &argparse.Options{})
|
})
|
||||||
var joinMeshEndpoint *string = joinMeshCmd.String("e", "endpoint", &argparse.Options{})
|
|
||||||
var joinMeshRole *string = joinMeshCmd.Selector("r", "role", []string{"peer", "client"}, &argparse.Options{})
|
|
||||||
|
|
||||||
var enableInterfaceMeshId *string = enableInterfaceCmd.String("m", "mesh", &argparse.Options{Required: true})
|
var newMeshRole *string = newMeshCmd.Selector("r", "role", []string{"peer", "client"}, &argparse.Options{
|
||||||
|
Help: "Role in the mesh network. A value of peer means that the node is publicly routeable and thus considered" +
|
||||||
|
" in the gossip protocol. Client means that the node is not publicly routeable and is not a candidate in the gossip" +
|
||||||
|
" protocol",
|
||||||
|
})
|
||||||
|
var newMeshKeepAliveWg *int = newMeshCmd.Int("k", "KeepAliveWg", &argparse.Options{
|
||||||
|
Default: 0,
|
||||||
|
Help: "WireGuard KeepAlive value for NAT traversal and firewall holepunching",
|
||||||
|
})
|
||||||
|
|
||||||
var getGraphMeshId *string = getGraphCmd.String("m", "mesh", &argparse.Options{Required: true})
|
var newMeshAdvertiseRoutes *bool = newMeshCmd.Flag("a", "advertise", &argparse.Options{
|
||||||
|
Help: "Advertise routes to other mesh network into the mesh",
|
||||||
|
})
|
||||||
|
|
||||||
var leaveMeshMeshId *string = leaveMeshCmd.String("m", "mesh", &argparse.Options{Required: true})
|
var newMeshAdvertiseDefaults *bool = newMeshCmd.Flag("d", "defaults", &argparse.Options{
|
||||||
|
Help: "Advertise ::/0 into the mesh network",
|
||||||
|
})
|
||||||
|
|
||||||
var queryMeshMeshId *string = queryMeshCmd.String("m", "mesh", &argparse.Options{Required: true})
|
var joinMeshId *string = joinMeshCmd.String("m", "meshid", &argparse.Options{
|
||||||
var queryMeshQuery *string = queryMeshCmd.String("q", "query", &argparse.Options{Required: true})
|
Required: true,
|
||||||
|
Help: "MeshID of the mesh network to join",
|
||||||
|
})
|
||||||
|
|
||||||
var description *string = putDescriptionCmd.String("d", "description", &argparse.Options{Required: true})
|
var joinMeshIpAddress *string = joinMeshCmd.String("i", "ip", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "IP address of the bootstrapping node to join through",
|
||||||
|
})
|
||||||
|
|
||||||
var alias *string = putAliasCmd.String("a", "alias", &argparse.Options{Required: true})
|
var joinMeshEndpoint *string = joinMeshCmd.String("e", "endpoint", &argparse.Options{
|
||||||
|
Help: "Publicly routeable endpoint to advertise within the mesh",
|
||||||
|
})
|
||||||
|
|
||||||
var serviceKey *string = setServiceCmd.String("s", "service", &argparse.Options{Required: true})
|
var joinMeshRole *string = joinMeshCmd.Selector("r", "role", []string{"peer", "client"}, &argparse.Options{
|
||||||
var serviceValue *string = setServiceCmd.String("v", "value", &argparse.Options{Required: true})
|
Default: "Peer",
|
||||||
|
Help: "Role in the mesh network. A value of peer means that the node is publicly routeable and thus considered" +
|
||||||
|
" in the gossip protocol. Client means that the node is not publicly routeable and is not a candidate in the gossip" +
|
||||||
|
" protocol",
|
||||||
|
})
|
||||||
|
|
||||||
var deleteServiceKey *string = deleteServiceCmd.String("s", "service", &argparse.Options{Required: true})
|
var joinMeshPort *int = joinMeshCmd.Int("p", "wgport", &argparse.Options{
|
||||||
|
Default: 0,
|
||||||
|
Help: "WireGuard port to use to the interface. A default of 0 uses an unused ephmeral port.",
|
||||||
|
})
|
||||||
|
|
||||||
var getNodeNodeId *string = getNodeCmd.String("n", "nodeid", &argparse.Options{Required: true})
|
var joinMeshKeepAliveWg *int = joinMeshCmd.Int("k", "KeepAliveWg", &argparse.Options{
|
||||||
var getNodeMeshId *string = getNodeCmd.String("m", "meshid", &argparse.Options{Required: true})
|
Default: 0,
|
||||||
|
Help: "WireGuard KeepAlive value for NAT traversal and firewall ho;lepunching",
|
||||||
|
})
|
||||||
|
|
||||||
|
var joinMeshAdvertiseRoutes *bool = joinMeshCmd.Flag("a", "advertise", &argparse.Options{
|
||||||
|
Help: "Advertise routes to other mesh network into the mesh",
|
||||||
|
})
|
||||||
|
|
||||||
|
var joinMeshAdvertiseDefaults *bool = joinMeshCmd.Flag("d", "defaults", &argparse.Options{
|
||||||
|
Help: "Advertise ::/0 into the mesh network",
|
||||||
|
})
|
||||||
|
|
||||||
|
var getGraphMeshId *string = getGraphCmd.String("m", "mesh", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "MeshID of the graph to get",
|
||||||
|
})
|
||||||
|
|
||||||
|
var leaveMeshMeshId *string = leaveMeshCmd.String("m", "mesh", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "MeshID of the mesh to leave",
|
||||||
|
})
|
||||||
|
|
||||||
|
var queryMeshMeshId *string = queryMeshCmd.String("m", "mesh", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "MeshID of the mesh to query",
|
||||||
|
})
|
||||||
|
var queryMeshQuery *string = queryMeshCmd.String("q", "query", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "JMESPath Query Of The Mesh Network To Query",
|
||||||
|
})
|
||||||
|
|
||||||
|
var description *string = putDescriptionCmd.String("d", "description", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "Description of the node in the mesh",
|
||||||
|
})
|
||||||
|
|
||||||
|
var alias *string = putAliasCmd.String("a", "alias", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "Alias of the node to set can be used in DNS to lookup an IP address",
|
||||||
|
})
|
||||||
|
|
||||||
|
var serviceKey *string = setServiceCmd.String("s", "service", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "Key of the service to advertise in the mesh network",
|
||||||
|
})
|
||||||
|
var serviceValue *string = setServiceCmd.String("v", "value", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "Value of the service to advertise in the mesh network",
|
||||||
|
})
|
||||||
|
|
||||||
|
var deleteServiceKey *string = deleteServiceCmd.String("s", "service", &argparse.Options{
|
||||||
|
Required: true,
|
||||||
|
Help: "Key of the service to remove",
|
||||||
|
})
|
||||||
|
|
||||||
err := parser.Parse(os.Args)
|
err := parser.Parse(os.Args)
|
||||||
|
|
||||||
@ -272,9 +318,16 @@ func main() {
|
|||||||
if newMeshCmd.Happened() {
|
if newMeshCmd.Happened() {
|
||||||
fmt.Println(createMesh(&CreateMeshParams{
|
fmt.Println(createMesh(&CreateMeshParams{
|
||||||
Client: client,
|
Client: client,
|
||||||
WgPort: *newMeshPort,
|
|
||||||
Endpoint: *newMeshEndpoint,
|
Endpoint: *newMeshEndpoint,
|
||||||
Role: *newMeshRole,
|
Role: *newMeshRole,
|
||||||
|
WgArgs: ipc.WireGuardArgs{
|
||||||
|
Endpoint: *newMeshEndpoint,
|
||||||
|
Role: *newMeshRole,
|
||||||
|
WgPort: *newMeshPort,
|
||||||
|
KeepAliveWg: *newMeshKeepAliveWg,
|
||||||
|
AdvertiseDefaultRoute: *newMeshAdvertiseDefaults,
|
||||||
|
AdvertiseRoutes: *newMeshAdvertiseRoutes,
|
||||||
|
},
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,11 +338,18 @@ func main() {
|
|||||||
if joinMeshCmd.Happened() {
|
if joinMeshCmd.Happened() {
|
||||||
fmt.Println(joinMesh(&JoinMeshParams{
|
fmt.Println(joinMesh(&JoinMeshParams{
|
||||||
Client: client,
|
Client: client,
|
||||||
WgPort: *joinMeshPort,
|
|
||||||
IpAddress: *joinMeshIpAddress,
|
IpAddress: *joinMeshIpAddress,
|
||||||
MeshId: *joinMeshId,
|
MeshId: *joinMeshId,
|
||||||
Endpoint: *joinMeshEndpoint,
|
Endpoint: *joinMeshEndpoint,
|
||||||
Role: *joinMeshRole,
|
Role: *joinMeshRole,
|
||||||
|
WgArgs: ipc.WireGuardArgs{
|
||||||
|
Endpoint: *joinMeshEndpoint,
|
||||||
|
Role: *joinMeshRole,
|
||||||
|
WgPort: *joinMeshPort,
|
||||||
|
KeepAliveWg: *joinMeshKeepAliveWg,
|
||||||
|
AdvertiseDefaultRoute: *joinMeshAdvertiseDefaults,
|
||||||
|
AdvertiseRoutes: *joinMeshAdvertiseRoutes,
|
||||||
|
},
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,10 +357,6 @@ func main() {
|
|||||||
getGraph(client, *getGraphMeshId)
|
getGraph(client, *getGraphMeshId)
|
||||||
}
|
}
|
||||||
|
|
||||||
if enableInterfaceCmd.Happened() {
|
|
||||||
enableInterface(client, *enableInterfaceMeshId)
|
|
||||||
}
|
|
||||||
|
|
||||||
if leaveMeshCmd.Happened() {
|
if leaveMeshCmd.Happened() {
|
||||||
leaveMesh(client, *leaveMeshMeshId)
|
leaveMesh(client, *leaveMeshMeshId)
|
||||||
}
|
}
|
||||||
@ -324,8 +380,4 @@ func main() {
|
|||||||
if deleteServiceCmd.Happened() {
|
if deleteServiceCmd.Happened() {
|
||||||
deleteService(client, *deleteServiceKey)
|
deleteService(client, *deleteServiceKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
if getNodeCmd.Happened() {
|
|
||||||
getNode(client, *getNodeNodeId, *getNodeMeshId)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,9 @@ func (s *SmegServer) CreateMesh(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ipcRequest := ipc.NewMeshArgs{
|
ipcRequest := ipc.NewMeshArgs{
|
||||||
WgPort: createMesh.WgPort,
|
WgArgs: ipc.WireGuardArgs{
|
||||||
|
WgPort: createMesh.WgPort,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var reply string
|
var reply string
|
||||||
@ -132,7 +134,9 @@ func (s *SmegServer) JoinMesh(c *gin.Context) {
|
|||||||
ipcRequest := ipc.JoinMeshArgs{
|
ipcRequest := ipc.JoinMeshArgs{
|
||||||
MeshId: joinMesh.MeshId,
|
MeshId: joinMesh.MeshId,
|
||||||
IpAdress: joinMesh.Bootstrap,
|
IpAdress: joinMesh.Bootstrap,
|
||||||
Port: joinMesh.WgPort,
|
WgArgs: ipc.WireGuardArgs{
|
||||||
|
WgPort: joinMesh.WgPort,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var reply string
|
var reply string
|
||||||
|
@ -37,10 +37,10 @@ type WgConfiguration struct {
|
|||||||
// service for IPDiscoverability
|
// service for IPDiscoverability
|
||||||
IPDiscovery *IPDiscovery `yaml:"ipDiscovery" validate:"required,eq=public|eq=dns"`
|
IPDiscovery *IPDiscovery `yaml:"ipDiscovery" validate:"required,eq=public|eq=dns"`
|
||||||
// AdvertiseRoutes: specifies whether the node can act as a router routing packets between meshes
|
// AdvertiseRoutes: specifies whether the node can act as a router routing packets between meshes
|
||||||
AdvertiseRoutes *bool `yaml:"advertiseRoute"`
|
AdvertiseRoutes *bool `yaml:"advertiseRoute" validate:"required"`
|
||||||
// AdvertiseDefaultRoute: specifies whether or not this route should advertise a default route
|
// AdvertiseDefaultRoute: specifies whether or not this route should advertise a default route
|
||||||
// for all nodes to route their packets to
|
// for all nodes to route their packets to
|
||||||
AdvertiseDefaultRoute *bool `yaml:"advertiseDefaults"`
|
AdvertiseDefaultRoute *bool `yaml:"advertiseDefaults" validate:"required"`
|
||||||
// Endpoint contains what value should be set as the public endpoint of this node
|
// Endpoint contains what value should be set as the public endpoint of this node
|
||||||
Endpoint *string `yaml:"publicEndpoint"`
|
Endpoint *string `yaml:"publicEndpoint"`
|
||||||
// Role specifies whether or not the user is globally accessible.
|
// Role specifies whether or not the user is globally accessible.
|
||||||
|
@ -10,13 +10,29 @@ import (
|
|||||||
"github.com/tim-beatham/wgmesh/pkg/ctrlserver"
|
"github.com/tim-beatham/wgmesh/pkg/ctrlserver"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NewMeshArgs struct {
|
// WireGuardArgs are provided args specific to WireGuard
|
||||||
|
type WireGuardArgs struct {
|
||||||
// WgPort is the WireGuard port to expose
|
// WgPort is the WireGuard port to expose
|
||||||
WgPort int
|
WgPort int
|
||||||
|
// KeepAliveWg is the number of seconds to keep alive
|
||||||
|
// for WireGuard NAT/firewall traversal
|
||||||
|
KeepAliveWg int
|
||||||
|
// AdvertiseRoutes whether or not to advertise routes to and from the
|
||||||
|
// mesh network
|
||||||
|
AdvertiseRoutes bool
|
||||||
|
// AdvertiseDefaultRoute whether or not to advertise the default route
|
||||||
|
// into the mesh network
|
||||||
|
AdvertiseDefaultRoute bool
|
||||||
// Endpoint is the routable alias of the machine. Can be an IP
|
// Endpoint is the routable alias of the machine. Can be an IP
|
||||||
// or DNS entry
|
// or DNS entry
|
||||||
Endpoint string
|
Endpoint string
|
||||||
Role string
|
// Role is the role of the individual in the mesh
|
||||||
|
Role string
|
||||||
|
}
|
||||||
|
|
||||||
|
type NewMeshArgs struct {
|
||||||
|
// WgArgs are specific WireGuard args to use
|
||||||
|
WgArgs WireGuardArgs
|
||||||
}
|
}
|
||||||
|
|
||||||
type JoinMeshArgs struct {
|
type JoinMeshArgs struct {
|
||||||
@ -24,14 +40,8 @@ type JoinMeshArgs struct {
|
|||||||
MeshId string
|
MeshId string
|
||||||
// IpAddress is a routable IP in another mesh
|
// IpAddress is a routable IP in another mesh
|
||||||
IpAdress string
|
IpAdress string
|
||||||
// Port is the WireGuard port to expose
|
// WgArgs is the WireGuard parameters to use.
|
||||||
Port int
|
WgArgs WireGuardArgs
|
||||||
// Endpoint to use to override the default
|
|
||||||
Endpoint string
|
|
||||||
// Client specifies whether we should join as a client of the peer
|
|
||||||
// we are connecting to
|
|
||||||
Client bool
|
|
||||||
Role string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type PutServiceArgs struct {
|
type PutServiceArgs struct {
|
||||||
@ -52,11 +62,6 @@ type QueryMesh struct {
|
|||||||
Query string
|
Query string
|
||||||
}
|
}
|
||||||
|
|
||||||
type GetNodeArgs struct {
|
|
||||||
NodeId string
|
|
||||||
MeshId string
|
|
||||||
}
|
|
||||||
|
|
||||||
type MeshIpc interface {
|
type MeshIpc interface {
|
||||||
CreateMesh(args *NewMeshArgs, reply *string) error
|
CreateMesh(args *NewMeshArgs, reply *string) error
|
||||||
ListMeshes(name string, reply *ListMeshReply) error
|
ListMeshes(name string, reply *ListMeshReply) error
|
||||||
@ -68,7 +73,6 @@ type MeshIpc interface {
|
|||||||
PutDescription(description string, reply *string) error
|
PutDescription(description string, reply *string) error
|
||||||
PutAlias(alias string, reply *string) error
|
PutAlias(alias string, reply *string) error
|
||||||
PutService(args PutServiceArgs, reply *string) error
|
PutService(args PutServiceArgs, reply *string) error
|
||||||
GetNode(args GetNodeArgs, reply *string) error
|
|
||||||
DeleteService(service string, reply *string) error
|
DeleteService(service string, reply *string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,10 @@ func (r *RouteManagerImpl) UpdateRoutes() error {
|
|||||||
routes := make(map[string][]Route)
|
routes := make(map[string][]Route)
|
||||||
|
|
||||||
for _, mesh1 := range meshes {
|
for _, mesh1 := range meshes {
|
||||||
|
if !*mesh1.GetConfiguration().AdvertiseRoutes {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
self, err := r.meshManager.GetSelf(mesh1.GetMeshId())
|
self, err := r.meshManager.GetSelf(mesh1.GetMeshId())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -2,7 +2,6 @@ package robin
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
@ -12,7 +11,6 @@ import (
|
|||||||
"github.com/tim-beatham/wgmesh/pkg/ctrlserver"
|
"github.com/tim-beatham/wgmesh/pkg/ctrlserver"
|
||||||
"github.com/tim-beatham/wgmesh/pkg/ipc"
|
"github.com/tim-beatham/wgmesh/pkg/ipc"
|
||||||
"github.com/tim-beatham/wgmesh/pkg/mesh"
|
"github.com/tim-beatham/wgmesh/pkg/mesh"
|
||||||
"github.com/tim-beatham/wgmesh/pkg/query"
|
|
||||||
"github.com/tim-beatham/wgmesh/pkg/rpc"
|
"github.com/tim-beatham/wgmesh/pkg/rpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -20,8 +18,8 @@ type IpcHandler struct {
|
|||||||
Server ctrlserver.CtrlServer
|
Server ctrlserver.CtrlServer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *IpcHandler) CreateMesh(args *ipc.NewMeshArgs, reply *string) error {
|
func getOverrideConfiguration(args *ipc.WireGuardArgs) conf.WgConfiguration {
|
||||||
overrideConf := &conf.WgConfiguration{}
|
overrideConf := conf.WgConfiguration{}
|
||||||
|
|
||||||
if args.Role != "" {
|
if args.Role != "" {
|
||||||
role := conf.NodeType(args.Role)
|
role := conf.NodeType(args.Role)
|
||||||
@ -32,13 +30,26 @@ func (n *IpcHandler) CreateMesh(args *ipc.NewMeshArgs, reply *string) error {
|
|||||||
overrideConf.Endpoint = &args.Endpoint
|
overrideConf.Endpoint = &args.Endpoint
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if args.KeepAliveWg != 0 {
|
||||||
|
keepAliveWg := args.KeepAliveWg
|
||||||
|
overrideConf.KeepAliveWg = &keepAliveWg
|
||||||
|
}
|
||||||
|
|
||||||
|
overrideConf.AdvertiseRoutes = &args.AdvertiseRoutes
|
||||||
|
overrideConf.AdvertiseDefaultRoute = &args.AdvertiseDefaultRoute
|
||||||
|
return overrideConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *IpcHandler) CreateMesh(args *ipc.NewMeshArgs, reply *string) error {
|
||||||
|
overrideConf := getOverrideConfiguration(&args.WgArgs)
|
||||||
|
|
||||||
if overrideConf.Role != nil && *overrideConf.Role == conf.CLIENT_ROLE {
|
if overrideConf.Role != nil && *overrideConf.Role == conf.CLIENT_ROLE {
|
||||||
return fmt.Errorf("cannot create a mesh with no public endpoint")
|
return fmt.Errorf("cannot create a mesh with no public endpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
meshId, err := n.Server.GetMeshManager().CreateMesh(&mesh.CreateMeshParams{
|
meshId, err := n.Server.GetMeshManager().CreateMesh(&mesh.CreateMeshParams{
|
||||||
Port: args.WgPort,
|
Port: args.WgArgs.WgPort,
|
||||||
Conf: overrideConf,
|
Conf: &overrideConf,
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -47,8 +58,8 @@ func (n *IpcHandler) CreateMesh(args *ipc.NewMeshArgs, reply *string) error {
|
|||||||
|
|
||||||
err = n.Server.GetMeshManager().AddSelf(&mesh.AddSelfParams{
|
err = n.Server.GetMeshManager().AddSelf(&mesh.AddSelfParams{
|
||||||
MeshId: meshId,
|
MeshId: meshId,
|
||||||
WgPort: args.WgPort,
|
WgPort: args.WgArgs.WgPort,
|
||||||
Endpoint: args.Endpoint,
|
Endpoint: args.WgArgs.Endpoint,
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -73,16 +84,7 @@ func (n *IpcHandler) ListMeshes(_ string, reply *ipc.ListMeshReply) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (n *IpcHandler) JoinMesh(args ipc.JoinMeshArgs, reply *string) error {
|
func (n *IpcHandler) JoinMesh(args ipc.JoinMeshArgs, reply *string) error {
|
||||||
overrideConf := &conf.WgConfiguration{}
|
overrideConf := getOverrideConfiguration(&args.WgArgs)
|
||||||
|
|
||||||
if args.Role != "" {
|
|
||||||
role := conf.NodeType(args.Role)
|
|
||||||
overrideConf.Role = &role
|
|
||||||
}
|
|
||||||
|
|
||||||
if args.Endpoint != "" {
|
|
||||||
overrideConf.Endpoint = &args.Endpoint
|
|
||||||
}
|
|
||||||
|
|
||||||
peerConnection, err := n.Server.GetConnectionManager().GetConnection(args.IpAdress)
|
peerConnection, err := n.Server.GetConnectionManager().GetConnection(args.IpAdress)
|
||||||
|
|
||||||
@ -115,9 +117,9 @@ func (n *IpcHandler) JoinMesh(args ipc.JoinMeshArgs, reply *string) error {
|
|||||||
|
|
||||||
err = n.Server.GetMeshManager().AddMesh(&mesh.AddMeshParams{
|
err = n.Server.GetMeshManager().AddMesh(&mesh.AddMeshParams{
|
||||||
MeshId: args.MeshId,
|
MeshId: args.MeshId,
|
||||||
WgPort: args.Port,
|
WgPort: args.WgArgs.WgPort,
|
||||||
MeshBytes: meshReply.Mesh,
|
MeshBytes: meshReply.Mesh,
|
||||||
Conf: overrideConf,
|
Conf: &overrideConf,
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -126,8 +128,8 @@ func (n *IpcHandler) JoinMesh(args ipc.JoinMeshArgs, reply *string) error {
|
|||||||
|
|
||||||
err = n.Server.GetMeshManager().AddSelf(&mesh.AddSelfParams{
|
err = n.Server.GetMeshManager().AddSelf(&mesh.AddSelfParams{
|
||||||
MeshId: args.MeshId,
|
MeshId: args.MeshId,
|
||||||
WgPort: args.Port,
|
WgPort: args.WgArgs.WgPort,
|
||||||
Endpoint: args.Endpoint,
|
Endpoint: args.WgArgs.Endpoint,
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -248,27 +250,6 @@ func (n *IpcHandler) DeleteService(service string, reply *string) error {
|
|||||||
return nil
|
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
|
|
||||||
}
|
|
||||||
|
|
||||||
type RobinIpcParams struct {
|
type RobinIpcParams struct {
|
||||||
CtrlServer ctrlserver.CtrlServer
|
CtrlServer ctrlserver.CtrlServer
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user