Files
Wireguard-tools.js/wg_addon/wgctrl.go
Matheus Sampaio Queiroga 61dcda8662
Some checks failed
Test / Test Linux (latest) (pull_request) Failing after 1m55s
Test / Test Linux (20.x) (pull_request) Failing after 1m58s
Test / Test Linux (21.x) (pull_request) Failing after 1m55s
Test / Test Linux (18.x) (pull_request) Failing after 1m57s
Refactor: Simplify wgctrl funcs & update napi-go
Change SetInterface and GetInterface to standard Go functions,
removing direct NAPI handling and async logic from wgctrl.go.

Use napi.GoFuncOf for function registration in addon.go.
Update napi-go dependency to v0.1.2 pre-release.
2025-04-28 19:28:10 -03:00

159 lines
3.7 KiB
Go

//go:build linux || windows
package wg_addon
import (
"fmt"
"net"
"strings"
"time"
"sirherobrine23.com.br/Sirherobrine23/napi-go"
"golang.zx2c4.com/wireguard/wgctrl"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
func SetInterface(wgDevConfig Config) error {
if wgDevConfig.Name == "" {
return fmt.Errorf("set wireguard config")
}
devInfo, err := wgDevConfig.WgConfig()
if err != nil {
return err
}
// Get client to wireguard
client, err := wgctrl.New()
if err != nil {
return err
}
defer client.Close()
// Set Config
if err := client.ConfigureDevice(wgDevConfig.Name, devInfo); err != nil {
return err
}
return nil
}
func GetInterface(interfaceName string) (config *Config, err error) {
if interfaceName = strings.TrimSpace(interfaceName); interfaceName == "" {
return nil, fmt.Errorf("set interface name")
}
// Get client to wireguard
var client *wgctrl.Client
if client, err = wgctrl.New(); err != nil {
return nil, err
}
defer client.Close()
// Get config
var dev *wgtypes.Device
if dev, err = client.Device(interfaceName); err != nil {
return nil, err
}
config = &Config{}
config.FromWg(dev)
return
}
var DeleteInterface = napi.Callback(func(env napi.EnvType, this napi.ValueType, args []napi.ValueType) (napi.ValueType, error) {
if len(args) == 0 {
return nil, fmt.Errorf("set interface name")
}
interfaceName := napi.ToString(args[0])
typeof, err := interfaceName.Type()
if !(err == nil || typeof == napi.TypeString) {
return nil, fmt.Errorf("set interface name")
}
{
// interfaceName, _ := interfaceName.Utf8Value()
// // Get client to wireguard
// var client *wgctrl.Client
// if client, err = wgctrl.New(); err != nil {
// return nil, err
// }
// defer client.Close()
}
return nil, nil
})
func pointValue[T any](v T) *T { return &v }
func (cfg Config) WgConfig() (wgtypes.Config, error) {
config := wgtypes.Config{
ListenPort: pointValue(cfg.PortListen),
FirewallMark: pointValue(cfg.Fwmark),
ReplacePeers: cfg.ReplacePeers,
Peers: []wgtypes.PeerConfig{},
}
pk, err := wgtypes.ParseKey(cfg.PrivateKey)
if err != nil {
return config, err
}
config.PrivateKey = pointValue(pk)
for peerKey, peerInfo := range cfg.Peers {
pb, err := wgtypes.ParseKey(peerKey)
if err != nil {
return config, err
}
if peerInfo.RemoveMe {
config.Peers = append(config.Peers, wgtypes.PeerConfig{
PublicKey: pb,
Remove: true,
})
} else {
peer := wgtypes.PeerConfig{PublicKey: pb, AllowedIPs: peerInfo.AllowedIPs}
if peerInfo.PresharedKey != "" {
pr, err := wgtypes.ParseKey(peerInfo.PresharedKey)
if err != nil {
return config, err
}
peer.PresharedKey = pointValue(pr)
}
if peerInfo.Endpoint != "" {
if peer.Endpoint, err = net.ResolveUDPAddr("udp", peerInfo.Endpoint); err != nil {
return config, err
}
}
peer.PersistentKeepaliveInterval = pointValue(time.Duration(peerInfo.KeepInterval))
// Append to config
config.Peers = append(config.Peers, peer)
}
}
return config, nil
}
func (cfg *Config) FromWg(dev *wgtypes.Device) {
cfg.PublicKey = dev.PublicKey.String()
cfg.PrivateKey = dev.PrivateKey.String()
cfg.PortListen = dev.ListenPort
cfg.Fwmark = dev.FirewallMark
cfg.Peers = map[string]*Peer{}
for _, peer := range dev.Peers {
cfg.Peers[peer.PublicKey.String()] = &Peer{
PresharedKey: peer.PresharedKey.String(),
LastHandshake: peer.LastHandshakeTime,
KeepInterval: int(peer.PersistentKeepaliveInterval.Seconds()),
TxByte: int(peer.TransmitBytes),
RxByte: int(peer.ReceiveBytes),
AllowedIPs: peer.AllowedIPs,
}
if peer.Endpoint != nil {
cfg.Peers[peer.PublicKey.String()].Endpoint = peer.Endpoint.String()
}
}
}