70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"net"
|
|
"time"
|
|
|
|
pb "git.h3cx.dev/NulTNL/control-plane-proto-go"
|
|
"golang.zx2c4.com/wireguard/wgctrl"
|
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
type server struct {
|
|
pb.UnimplementedControlServiceServer
|
|
wgClient *wgctrl.Client
|
|
}
|
|
|
|
func (s *server) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error) {
|
|
return &pb.PingResponse{Reply: "Pong: " + req.Message}, nil
|
|
}
|
|
|
|
func main() {
|
|
client, _ := wgctrl.New()
|
|
defer client.Close()
|
|
|
|
lis, err := net.Listen("tcp", ":50051")
|
|
if err != nil {
|
|
log.Fatalf("failed to listen: %v", err)
|
|
}
|
|
|
|
grpcServer := grpc.NewServer()
|
|
srv := &server{wgClient: client}
|
|
pb.RegisterControlServiceServer(grpcServer, srv)
|
|
|
|
log.Println("gRPC server running on :50051")
|
|
if err := grpcServer.Serve(lis); err != nil {
|
|
log.Fatalf("failed to server: %v", err)
|
|
}
|
|
|
|
}
|
|
|
|
func newcfg(client *wgctrl.Client, pubkey string) {
|
|
peerPubKey, err := wgtypes.ParseKey(pubkey)
|
|
if err != nil {
|
|
log.Fatalf("invalid peer public key: %v", err)
|
|
}
|
|
|
|
allowedIP1 := net.IPNet{IP: net.ParseIP("10.0.0.3"), Mask: net.CIDRMask(32, 32)}
|
|
persistentKeepalive := 25 * time.Second
|
|
|
|
peerCfg := wgtypes.PeerConfig{
|
|
PublicKey: peerPubKey,
|
|
AllowedIPs: []net.IPNet{allowedIP1},
|
|
PersistentKeepaliveInterval: &persistentKeepalive,
|
|
}
|
|
|
|
cfg := wgtypes.Config{
|
|
Peers: []wgtypes.PeerConfig{peerCfg},
|
|
}
|
|
|
|
if err := client.ConfigureDevice("wg0", cfg); err != nil {
|
|
log.Fatalf("failed to add peer: %v", err)
|
|
}
|
|
|
|
log.Println("Peer added")
|
|
|
|
}
|