mirror of
https://github.com/Threnklyn/wg-ui.git
synced 2026-05-22 22:58:29 +02:00
99 lines
1.8 KiB
Go
99 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"net"
|
|
"os"
|
|
|
|
"github.com/mdlayher/wireguardctrl/wgtypes"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type ServerConfig struct {
|
|
configPath string `json:"-"`
|
|
PrivateKey string
|
|
PublicKey string
|
|
Users map[string]*UserConfig
|
|
}
|
|
|
|
type UserConfig struct {
|
|
Name string
|
|
Clients map[string]*ClientConfig
|
|
}
|
|
|
|
type ClientConfig struct {
|
|
Name string
|
|
PrivateKey string
|
|
PublicKey string
|
|
IP net.IP
|
|
}
|
|
|
|
func NewServerConfig(cfgPath string) *ServerConfig {
|
|
key, err := wgtypes.GeneratePrivateKey()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
cfg := &ServerConfig{
|
|
configPath: cfgPath,
|
|
PrivateKey: key.String(),
|
|
PublicKey: key.PublicKey().String(),
|
|
Users: make(map[string]*UserConfig),
|
|
}
|
|
|
|
f, err := os.Open(cfgPath)
|
|
if err == nil {
|
|
if err = json.NewDecoder(f).Decode(cfg); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Debug("Read server config from file: ", cfgPath)
|
|
} else if os.IsNotExist(err) {
|
|
log.Debug("No config found. Creating new: ", cfgPath)
|
|
err = cfg.Write()
|
|
}
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
return cfg
|
|
}
|
|
|
|
func (cfg *ServerConfig) Write() error {
|
|
data, err := json.MarshalIndent(cfg, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return ioutil.WriteFile(cfg.configPath, data, 0600)
|
|
}
|
|
|
|
func (cfg *ServerConfig) GetUserConfig(user string) *UserConfig {
|
|
c, ok := cfg.Users[user]
|
|
if !ok {
|
|
log.WithField("user", user).Info("No such user. Creating one.")
|
|
c = &UserConfig{
|
|
Name: user,
|
|
Clients: make(map[string]*ClientConfig),
|
|
}
|
|
cfg.Users[user] = c
|
|
}
|
|
return c
|
|
}
|
|
|
|
func NewClientConfig(ip net.IP) *ClientConfig {
|
|
key, err := wgtypes.GeneratePrivateKey()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
cfg := ClientConfig{
|
|
Name: "Unnamed Client",
|
|
PrivateKey: key.String(),
|
|
PublicKey: key.PublicKey().String(),
|
|
IP: ip,
|
|
}
|
|
|
|
return &cfg
|
|
}
|