2020-04-18 16:17:49 +07:00
package main
import (
2024-01-06 13:11:20 +05:00
"crypto/sha512"
2023-03-16 08:40:04 +01:00
"embed"
2020-10-09 23:33:29 +02:00
"flag"
2020-04-23 18:01:40 +07:00
"fmt"
2023-03-16 08:40:04 +01:00
"io/fs"
2023-12-29 10:13:30 +01:00
"net"
2020-10-09 23:33:29 +02:00
"net/http"
2022-07-14 08:40:16 +02:00
"os"
2023-12-25 23:01:11 +03:30
"strings"
"syscall"
2020-10-09 23:33:29 +02:00
"time"
2025-02-11 13:01:01 +01:00
"github.com/labstack/echo-contrib/session"
2023-12-25 10:58:31 -08:00
"github.com/labstack/echo/v4"
"github.com/labstack/gommon/log"
2025-02-02 22:20:28 +01:00
"github.com/swissmakers/wireguard-manager/emailer"
"github.com/swissmakers/wireguard-manager/handler"
"github.com/swissmakers/wireguard-manager/router"
2025-02-11 13:01:01 +01:00
"github.com/swissmakers/wireguard-manager/store"
2025-02-02 22:20:28 +01:00
"github.com/swissmakers/wireguard-manager/store/jsondb"
"github.com/swissmakers/wireguard-manager/util"
2020-04-18 16:17:49 +07:00
)
2020-10-09 23:33:29 +02:00
var (
2025-02-11 13:01:01 +01:00
// App version information.
2025-02-04 12:57:06 +01:00
appVersion = "stable"
2020-10-09 23:33:29 +02:00
gitCommit = "N/A"
gitRef = "N/A"
2025-02-04 10:21:13 +01:00
buildTime = time . Now ( ) . UTC ( ) . Format ( "01-02-2006 15:04:05" )
2025-02-11 13:01:01 +01:00
// Configuration variables with defaults.
flagDisableLogin = false
flagProxy = false
flagBindAddress = "0.0.0.0:5000"
flagSmtpHostname = "127.0.0.1"
flagSmtpPort = 25
flagSmtpUsername string
flagSmtpPassword string
flagSmtpAuthType = "NONE"
flagSmtpNoTLSCheck = false
flagSmtpEncryption = "STARTTLS"
flagSmtpHelo = "localhost"
flagSendgridApiKey string
flagEmailFrom string
flagEmailFromName = "WireGuard Manager"
2025-02-11 15:36:00 +01:00
// IMPORTANT: Instead of generating a new random secret on each run,
// we now persist the secret in our JSON DB if no SESSION_SECRET is provided.
flagSessionSecret = util . GetPersistedSessionSecret ( )
2025-02-04 14:06:58 +01:00
flagSessionMaxDuration = 90
flagWgConfTemplate string
flagBasePath string
flagSubnetRanges string
2020-10-09 23:33:29 +02:00
)
2021-08-08 20:55:59 +03:00
const (
defaultEmailSubject = "Your wireguard configuration"
defaultEmailContent = ` Hi , < / br >
2021-11-09 17:01:42 +07:00
< p > In this email you can find your personal configuration for our wireguard server . < / p >
2021-08-08 20:55:59 +03:00
< p > Best < / p >
`
)
2023-03-16 08:40:04 +01:00
//go:embed templates/*
var embeddedTemplates embed . FS
//go:embed assets/*
var embeddedAssets embed . FS
2020-10-09 23:33:29 +02:00
func init ( ) {
2025-02-11 13:01:01 +01:00
// Bind command-line flags and environment variables.
2021-11-12 14:17:18 -06:00
flag . BoolVar ( & flagDisableLogin , "disable-login" , util . LookupEnvOrBool ( "DISABLE_LOGIN" , flagDisableLogin ) , "Disable authentication on the app. This is potentially dangerous." )
2025-02-04 10:21:13 +01:00
flag . BoolVar ( & flagProxy , "proxy" , util . LookupEnvOrBool ( "PROXY" , flagProxy ) , "Behind a proxy. Use X-FORWARDED-FOR for failed login logging" )
2021-08-29 12:26:12 -06:00
flag . StringVar ( & flagBindAddress , "bind-address" , util . LookupEnvOrString ( "BIND_ADDRESS" , flagBindAddress ) , "Address:Port to which the app will be bound." )
2022-01-29 09:01:37 +01:00
flag . StringVar ( & flagSmtpHostname , "smtp-hostname" , util . LookupEnvOrString ( "SMTP_HOSTNAME" , flagSmtpHostname ) , "SMTP Hostname" )
flag . IntVar ( & flagSmtpPort , "smtp-port" , util . LookupEnvOrInt ( "SMTP_PORT" , flagSmtpPort ) , "SMTP Port" )
2023-12-27 14:42:31 -07:00
flag . StringVar ( & flagSmtpHelo , "smtp-helo" , util . LookupEnvOrString ( "SMTP_HELO" , flagSmtpHelo ) , "SMTP HELO Hostname" )
2022-09-30 05:21:20 -03:00
flag . StringVar ( & flagSmtpUsername , "smtp-username" , util . LookupEnvOrString ( "SMTP_USERNAME" , flagSmtpUsername ) , "SMTP Username" )
2022-01-29 09:01:37 +01:00
flag . BoolVar ( & flagSmtpNoTLSCheck , "smtp-no-tls-check" , util . LookupEnvOrBool ( "SMTP_NO_TLS_CHECK" , flagSmtpNoTLSCheck ) , "Disable TLS verification for SMTP. This is potentially dangerous." )
2025-02-11 13:01:01 +01:00
flag . StringVar ( & flagSmtpEncryption , "smtp-encryption" , util . LookupEnvOrString ( "SMTP_ENCRYPTION" , flagSmtpEncryption ) , "SMTP Encryption: NONE, SSL, SSLTLS, TLS or STARTTLS (by default)" )
flag . StringVar ( & flagSmtpAuthType , "smtp-auth-type" , util . LookupEnvOrString ( "SMTP_AUTH_TYPE" , flagSmtpAuthType ) , "SMTP Auth Type: PLAIN, LOGIN or NONE." )
2021-08-29 12:26:12 -06:00
flag . StringVar ( & flagEmailFrom , "email-from" , util . LookupEnvOrString ( "EMAIL_FROM_ADDRESS" , flagEmailFrom ) , "'From' email address." )
flag . StringVar ( & flagEmailFromName , "email-from-name" , util . LookupEnvOrString ( "EMAIL_FROM_NAME" , flagEmailFromName ) , "'From' email name." )
2022-04-24 11:42:08 +04:00
flag . StringVar ( & flagWgConfTemplate , "wg-conf-template" , util . LookupEnvOrString ( "WG_CONF_TEMPLATE" , flagWgConfTemplate ) , "Path to custom wg.conf template." )
2022-04-25 00:17:13 -07:00
flag . StringVar ( & flagBasePath , "base-path" , util . LookupEnvOrString ( "BASE_PATH" , flagBasePath ) , "The base path of the URL" )
2023-12-27 13:08:55 +05:00
flag . StringVar ( & flagSubnetRanges , "subnet-ranges" , util . LookupEnvOrString ( "SUBNET_RANGES" , flagSubnetRanges ) , "IP ranges to choose from when assigning an IP for a client." )
2024-01-06 13:11:20 +05:00
flag . IntVar ( & flagSessionMaxDuration , "session-max-duration" , util . LookupEnvOrInt ( "SESSION_MAX_DURATION" , flagSessionMaxDuration ) , "Max time in days a remembered session is refreshed and valid." )
2023-12-25 10:58:31 -08:00
2025-02-11 13:01:01 +01:00
// Handle SMTP password, Sendgrid API key and session secret.
2023-12-25 10:58:31 -08:00
var (
2023-12-29 10:56:37 +01:00
smtpPasswordLookup = util . LookupEnvOrString ( "SMTP_PASSWORD" , flagSmtpPassword )
sendgridApiKeyLookup = util . LookupEnvOrString ( "SENDGRID_API_KEY" , flagSendgridApiKey )
sessionSecretLookup = util . LookupEnvOrString ( "SESSION_SECRET" , flagSessionSecret )
2023-12-25 10:58:31 -08:00
)
if smtpPasswordLookup != "" {
flag . StringVar ( & flagSmtpPassword , "smtp-password" , smtpPasswordLookup , "SMTP Password" )
} else {
flag . StringVar ( & flagSmtpPassword , "smtp-password" , util . LookupEnvOrFile ( "SMTP_PASSWORD_FILE" , flagSmtpPassword ) , "SMTP Password File" )
}
2023-12-29 10:56:37 +01:00
if sendgridApiKeyLookup != "" {
flag . StringVar ( & flagSendgridApiKey , "sendgrid-api-key" , sendgridApiKeyLookup , "Your sendgrid api key." )
2023-12-25 10:58:31 -08:00
} else {
flag . StringVar ( & flagSendgridApiKey , "sendgrid-api-key" , util . LookupEnvOrFile ( "SENDGRID_API_KEY_FILE" , flagSendgridApiKey ) , "File containing your sendgrid api key." )
}
2025-02-11 15:36:00 +01:00
// Use the persisted session secret as default.
2023-12-25 10:58:31 -08:00
if sessionSecretLookup != "" {
flag . StringVar ( & flagSessionSecret , "session-secret" , sessionSecretLookup , "The key used to encrypt session cookies." )
} else {
flag . StringVar ( & flagSessionSecret , "session-secret" , util . LookupEnvOrFile ( "SESSION_SECRET_FILE" , flagSessionSecret ) , "File containing the key used to encrypt session cookies." )
}
2020-10-09 23:33:29 +02:00
flag . Parse ( )
2025-02-11 13:01:01 +01:00
// Update runtime config in util package.
2021-08-29 12:26:12 -06:00
util . DisableLogin = flagDisableLogin
2025-02-04 10:21:13 +01:00
util . Proxy = flagProxy
2021-08-29 12:26:12 -06:00
util . BindAddress = flagBindAddress
2022-01-29 09:01:37 +01:00
util . SmtpHostname = flagSmtpHostname
util . SmtpPort = flagSmtpPort
2023-12-27 14:42:31 -07:00
util . SmtpHelo = flagSmtpHelo
2022-01-29 09:01:37 +01:00
util . SmtpUsername = flagSmtpUsername
util . SmtpPassword = flagSmtpPassword
util . SmtpAuthType = flagSmtpAuthType
util . SmtpNoTLSCheck = flagSmtpNoTLSCheck
2022-09-30 11:26:17 +03:00
util . SmtpEncryption = flagSmtpEncryption
2021-08-29 12:26:12 -06:00
util . SendgridApiKey = flagSendgridApiKey
util . EmailFrom = flagEmailFrom
util . EmailFromName = flagEmailFromName
2025-02-11 15:36:00 +01:00
// Use a stable session secret.
2024-01-06 13:11:20 +05:00
util . SessionSecret = sha512 . Sum512 ( [ ] byte ( flagSessionSecret ) )
2025-02-11 13:01:01 +01:00
// DEBUG: Log the session secret hash for verification (remove in production)
log . Debugf ( "Using session secret (SHA512 hash): %x" , util . SessionSecret )
util . SessionMaxDuration = int64 ( flagSessionMaxDuration ) * 86_400 // store in seconds
2022-04-24 11:42:08 +04:00
util . WgConfTemplate = flagWgConfTemplate
2022-04-25 00:17:13 -07:00
util . BasePath = util . ParseBasePath ( flagBasePath )
2023-12-27 13:08:55 +05:00
util . SubnetRanges = util . ParseSubnetRanges ( flagSubnetRanges )
2020-06-01 13:03:10 +07:00
2025-02-11 13:01:01 +01:00
// Set log level.
2023-12-29 13:22:12 +05:00
lvl , _ := util . ParseLogLevel ( util . LookupEnvOrString ( util . LogLevel , "INFO" ) )
2025-02-11 13:01:01 +01:00
log . SetLevel ( lvl )
2023-12-29 13:22:12 +05:00
2025-02-11 13:01:01 +01:00
// Print app information if log level is INFO or lower.
2023-12-29 13:22:12 +05:00
if lvl <= log . INFO {
2025-02-04 12:57:06 +01:00
fmt . Println ( "WireGuard Manager" )
2023-03-15 21:29:08 +01:00
fmt . Println ( "App Version\t:" , appVersion )
fmt . Println ( "Git Commit\t:" , gitCommit )
fmt . Println ( "Git Ref\t\t:" , gitRef )
fmt . Println ( "Build Time\t:" , buildTime )
2025-02-02 22:20:28 +01:00
fmt . Println ( "Git Repo\t:" , "https://github.com/swissmakers/wireguard-manager" )
2023-03-15 21:29:08 +01:00
fmt . Println ( "Authentication\t:" , ! util . DisableLogin )
fmt . Println ( "Bind address\t:" , util . BindAddress )
fmt . Println ( "Email from\t:" , util . EmailFrom )
fmt . Println ( "Email from name\t:" , util . EmailFromName )
fmt . Println ( "Custom wg.conf\t:" , util . WgConfTemplate )
fmt . Println ( "Base path\t:" , util . BasePath + "/" )
2023-12-27 13:08:55 +05:00
fmt . Println ( "Subnet ranges\t:" , util . GetSubnetRangesString ( ) )
2023-03-15 21:29:08 +01:00
}
2020-10-09 23:33:29 +02:00
}
func main ( ) {
2025-02-11 13:01:01 +01:00
// Initialize the JSON DB store.
2021-08-28 15:10:30 +02:00
db , err := jsondb . New ( "./db" )
if err != nil {
2025-02-11 13:01:01 +01:00
log . Fatalf ( "Error initializing database: %v" , err )
2021-08-28 15:10:30 +02:00
}
if err := db . Init ( ) ; err != nil {
2025-02-11 13:01:01 +01:00
log . Fatalf ( "Error initializing database: %v" , err )
}
// Extra app data for templates.
extraData := map [ string ] interface { } {
"appVersion" : appVersion ,
"gitCommit" : gitCommit ,
"basePath" : util . BasePath ,
"loginDisabled" : flagDisableLogin ,
2021-08-28 15:10:30 +02:00
}
2025-02-11 13:01:01 +01:00
// Strip the "templates/" prefix from the embedded templates directory.
tmplDir , err := fs . Sub ( embeddedTemplates , "templates" )
if err != nil {
log . Fatalf ( "Error processing templates: %v" , err )
}
// Create the WireGuard server configuration if it doesn't exist.
2023-03-16 08:40:04 +01:00
initServerConfig ( db , tmplDir )
2022-07-14 08:40:16 +02:00
2025-02-11 13:01:01 +01:00
// Validate and fix subnet ranges.
2023-12-27 13:08:55 +05:00
if err := util . ValidateAndFixSubnetRanges ( db ) ; err != nil {
2025-02-11 13:01:01 +01:00
log . Fatalf ( "Invalid subnet ranges: %v" , err )
2023-12-27 13:08:55 +05:00
}
if lvl , _ := util . ParseLogLevel ( util . LookupEnvOrString ( util . LogLevel , "INFO" ) ) ; lvl <= log . INFO {
fmt . Println ( "Valid subnet ranges:" , util . GetSubnetRangesString ( ) )
}
2025-02-11 13:01:01 +01:00
// Initialize the Echo router using our optimized router.New.
2023-03-16 08:40:04 +01:00
app := router . New ( tmplDir , extraData , util . SessionSecret )
2020-04-18 16:17:49 +07:00
2025-02-11 13:01:01 +01:00
// Additional middleware: Clear invalid session cookies from both response and request.
app . Use ( func ( next echo . HandlerFunc ) echo . HandlerFunc {
return func ( c echo . Context ) error {
if _ , err := session . Get ( "session" , c ) ; err != nil {
log . Debugf ( "session.Get failed: %v" , err )
// Clear invalid cookie in response.
cookie := & http . Cookie {
Name : "session_token" ,
Value : "" ,
Path : util . GetCookiePath ( ) ,
MaxAge : - 1 ,
HttpOnly : true ,
SameSite : http . SameSiteLaxMode ,
}
c . SetCookie ( cookie )
// Also remove the invalid cookie from the request header.
c . Request ( ) . Header . Del ( "Cookie" )
}
return next ( c )
}
} )
2023-12-25 20:03:29 +01:00
2025-02-11 13:01:01 +01:00
// Register routes. (Note: The order of middleware matters.)
app . GET ( util . BasePath , handler . WireGuardClients ( db ) , handler . ValidSession , handler . RefreshSession )
2020-10-09 23:33:29 +02:00
if ! util . DisableLogin {
2022-07-14 08:36:47 +02:00
app . GET ( util . BasePath + "/login" , handler . LoginPage ( ) )
2023-12-25 20:03:29 +01:00
app . POST ( util . BasePath + "/login" , handler . Login ( db ) , handler . ContentTypeJson )
2022-12-21 21:52:00 +01:00
app . GET ( util . BasePath + "/logout" , handler . Logout ( ) , handler . ValidSession )
2024-01-06 13:11:20 +05:00
app . GET ( util . BasePath + "/profile" , handler . LoadProfile ( ) , handler . ValidSession , handler . RefreshSession )
app . GET ( util . BasePath + "/users-settings" , handler . UsersSettings ( ) , handler . ValidSession , handler . RefreshSession , handler . NeedsAdmin )
2023-12-25 20:03:29 +01:00
app . POST ( util . BasePath + "/update-user" , handler . UpdateUser ( db ) , handler . ValidSession , handler . ContentTypeJson )
app . POST ( util . BasePath + "/create-user" , handler . CreateUser ( db ) , handler . ValidSession , handler . ContentTypeJson , handler . NeedsAdmin )
app . POST ( util . BasePath + "/remove-user" , handler . RemoveUser ( db ) , handler . ValidSession , handler . ContentTypeJson , handler . NeedsAdmin )
2023-12-29 10:56:37 +01:00
app . GET ( util . BasePath + "/get-users" , handler . GetUsers ( db ) , handler . ValidSession , handler . NeedsAdmin )
2023-03-15 22:13:53 +02:00
app . GET ( util . BasePath + "/api/user/:username" , handler . GetUser ( db ) , handler . ValidSession )
2020-10-09 23:33:29 +02:00
}
2025-02-11 13:01:01 +01:00
// Initialize the email sender.
2022-01-29 09:01:37 +01:00
var sendmail emailer . Emailer
if util . SendgridApiKey != "" {
sendmail = emailer . NewSendgridApiMail ( util . SendgridApiKey , util . EmailFromName , util . EmailFrom )
} else {
2025-02-11 13:01:01 +01:00
sendmail = emailer . NewSmtpMail ( util . SmtpHostname , util . SmtpPort , util . SmtpUsername , util . SmtpPassword ,
util . SmtpHelo , util . SmtpNoTLSCheck , util . SmtpAuthType , util . EmailFromName , util . EmailFrom , util . SmtpEncryption )
2022-01-29 09:01:37 +01:00
}
2021-08-08 20:55:59 +03:00
2025-02-11 13:01:01 +01:00
// Additional API and page routes.
2023-03-15 22:15:41 +02:00
app . GET ( util . BasePath + "/test-hash" , handler . GetHashesChanges ( db ) , handler . ValidSession )
2022-07-14 08:36:47 +02:00
app . GET ( util . BasePath + "/_health" , handler . Health ( ) )
2023-02-16 17:09:24 +01:00
app . GET ( util . BasePath + "/favicon" , handler . Favicon ( ) )
2022-07-14 08:36:47 +02:00
app . POST ( util . BasePath + "/new-client" , handler . NewClient ( db ) , handler . ValidSession , handler . ContentTypeJson )
app . POST ( util . BasePath + "/update-client" , handler . UpdateClient ( db ) , handler . ValidSession , handler . ContentTypeJson )
2025-02-11 13:01:01 +01:00
app . POST ( util . BasePath + "/email-client" , handler . EmailClient ( db , sendmail , defaultEmailSubject , defaultEmailContent ) ,
handler . ValidSession , handler . ContentTypeJson )
2022-07-14 08:36:47 +02:00
app . POST ( util . BasePath + "/client/set-status" , handler . SetClientStatus ( db ) , handler . ValidSession , handler . ContentTypeJson )
app . POST ( util . BasePath + "/remove-client" , handler . RemoveClient ( db ) , handler . ValidSession , handler . ContentTypeJson )
app . GET ( util . BasePath + "/download" , handler . DownloadClient ( db ) , handler . ValidSession )
2024-01-06 13:11:20 +05:00
app . GET ( util . BasePath + "/wg-server" , handler . WireGuardServer ( db ) , handler . ValidSession , handler . RefreshSession , handler . NeedsAdmin )
2025-02-11 13:01:01 +01:00
app . POST ( util . BasePath + "/wg-server/interfaces" , handler . WireGuardServerInterfaces ( db ) ,
handler . ValidSession , handler . ContentTypeJson , handler . NeedsAdmin )
app . POST ( util . BasePath + "/wg-server/keypair" , handler . WireGuardServerKeyPair ( db ) ,
handler . ValidSession , handler . ContentTypeJson , handler . NeedsAdmin )
app . GET ( util . BasePath + "/global-settings" , handler . GlobalSettings ( db ) ,
handler . ValidSession , handler . RefreshSession , handler . NeedsAdmin )
app . POST ( util . BasePath + "/global-settings" , handler . GlobalSettingSubmit ( db ) ,
handler . ValidSession , handler . ContentTypeJson , handler . NeedsAdmin )
2024-01-06 13:11:20 +05:00
app . GET ( util . BasePath + "/status" , handler . Status ( db ) , handler . ValidSession , handler . RefreshSession )
2022-07-14 08:36:47 +02:00
app . GET ( util . BasePath + "/api/clients" , handler . GetClients ( db ) , handler . ValidSession )
app . GET ( util . BasePath + "/api/client/:id" , handler . GetClient ( db ) , handler . ValidSession )
app . GET ( util . BasePath + "/api/machine-ips" , handler . MachineIPAddresses ( ) , handler . ValidSession )
2025-03-04 11:11:57 +01:00
app . GET ( util . BasePath + "/api/connection-status" , handler . APIStatus ( db ) , handler . ValidSession )
2023-12-27 13:08:55 +05:00
app . GET ( util . BasePath + "/api/subnet-ranges" , handler . GetOrderedSubnetRanges ( ) , handler . ValidSession )
2022-07-14 08:36:47 +02:00
app . GET ( util . BasePath + "/api/suggest-client-ips" , handler . SuggestIPAllocation ( db ) , handler . ValidSession )
2025-02-11 13:01:01 +01:00
app . POST ( util . BasePath + "/api/apply-wg-config" , handler . ApplyServerConfig ( db , tmplDir ) ,
handler . ValidSession , handler . ContentTypeJson )
2020-05-21 15:51:24 +07:00
2025-02-11 13:01:01 +01:00
// Serve static files from the embedded assets.
assetsDir , err := fs . Sub ( embeddedAssets , "assets" )
if err != nil {
log . Fatalf ( "Error processing assets: %v" , err )
}
2023-03-16 08:40:04 +01:00
assetHandler := http . FileServer ( http . FS ( assetsDir ) )
2022-07-14 08:36:47 +02:00
app . GET ( util . BasePath + "/static/*" , echo . WrapHandler ( http . StripPrefix ( util . BasePath + "/static/" , assetHandler ) ) )
2020-05-21 15:51:24 +07:00
2025-02-11 13:01:01 +01:00
// Listen on the appropriate socket.
2023-12-25 23:01:11 +03:30
if strings . HasPrefix ( util . BindAddress , "unix://" ) {
2025-02-11 13:01:01 +01:00
// For Unix domain sockets.
if err := syscall . Unlink ( util . BindAddress [ 6 : ] ) ; err != nil {
app . Logger . Fatalf ( "Cannot unlink unix socket: %v" , err )
2023-12-29 10:56:37 +01:00
}
2023-12-25 23:01:11 +03:30
l , err := net . Listen ( "unix" , util . BindAddress [ 6 : ] )
if err != nil {
2025-02-11 13:01:01 +01:00
app . Logger . Fatalf ( "Cannot create unix socket: %v" , err )
2023-12-25 23:01:11 +03:30
}
app . Listener = l
app . Logger . Fatal ( app . Start ( "" ) )
} else {
2025-02-11 13:01:01 +01:00
// For TCP sockets.
2023-12-25 23:01:11 +03:30
app . Logger . Fatal ( app . Start ( util . BindAddress ) )
}
2020-04-18 16:17:49 +07:00
}
2022-07-14 08:40:16 +02:00
2025-02-11 13:01:01 +01:00
// initServerConfig creates the WireGuard config file if it doesn't exist.
2023-03-16 08:40:04 +01:00
func initServerConfig ( db store . IStore , tmplDir fs . FS ) {
2022-07-14 08:40:16 +02:00
settings , err := db . GetGlobalSettings ( )
if err != nil {
2023-12-29 10:56:37 +01:00
log . Fatalf ( "Cannot get global settings: %v" , err )
2022-07-14 08:40:16 +02:00
}
if _ , err := os . Stat ( settings . ConfigFilePath ) ; err == nil {
2025-02-11 13:01:01 +01:00
// Config file exists; do not overwrite.
2022-07-14 08:40:16 +02:00
return
}
server , err := db . GetServer ( )
if err != nil {
2023-12-29 10:56:37 +01:00
log . Fatalf ( "Cannot get server config: %v" , err )
2022-07-14 08:40:16 +02:00
}
clients , err := db . GetClients ( false )
if err != nil {
2023-12-29 10:56:37 +01:00
log . Fatalf ( "Cannot get client config: %v" , err )
2022-07-14 08:40:16 +02:00
}
2023-03-15 22:13:53 +02:00
users , err := db . GetUsers ( )
if err != nil {
2023-12-29 10:56:37 +01:00
log . Fatalf ( "Cannot get user config: %v" , err )
2023-03-15 22:13:53 +02:00
}
2025-02-11 13:01:01 +01:00
if err := util . WriteWireGuardServerConfig ( tmplDir , server , clients , users , settings ) ; err != nil {
2023-12-29 10:56:37 +01:00
log . Fatalf ( "Cannot create server config: %v" , err )
2022-07-14 08:40:16 +02:00
}
}