Add per-server settings editor (step 5)

New servers previously got a bare ConfigFilePath default with no way
to set/edit EndpointAddress, FirewallMark, or Table afterward. Adds
GET/POST /servers/:id/settings (view/save ServerSetting, admin-only
for writes) and a "Settings" button + modal on each server card in
servers.html. CreateServer now seeds FirewallMark/Table with the same
defaults the legacy single-server bootstrap uses, instead of leaving
them blank.
This commit is contained in:
sysops
2026-07-11 23:50:47 +02:00
parent 74389a9d49
commit 3fe3dc8eeb
3 changed files with 153 additions and 0 deletions
+39
View File
@@ -592,6 +592,43 @@ func GetServerClients(db store.IStore) echo.HandlerFunc {
}
}
// GetServerSettings handler returns a single server's per-server settings
// (endpoint address, table, firewall mark, config file path) as JSON.
func GetServerSettings(db store.IStore) echo.HandlerFunc {
return func(c echo.Context) error {
serverID := c.Param("id")
settings, err := db.GetServerSettings(serverID)
if err != nil {
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Server settings not found"})
}
return c.JSON(http.StatusOK, settings)
}
}
// SaveServerSettingsHandler updates a single server's per-server settings.
// Admin-only (registered with handler.NeedsAdmin).
func SaveServerSettingsHandler(db store.IStore) echo.HandlerFunc {
return func(c echo.Context) error {
serverID := c.Param("id")
if _, err := db.GetServerByID(serverID); err != nil {
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Server not found"})
}
var settings model.ServerSetting
if err := c.Bind(&settings); err != nil {
return c.JSON(http.StatusBadRequest, jsonHTTPResponse{false, "Bad post data"})
}
settings.UpdatedAt = time.Now().UTC()
if err := db.SaveServerSettings(serverID, settings); err != nil {
return c.JSON(http.StatusInternalServerError, jsonHTTPResponse{false, fmt.Sprintf("Cannot save server settings: %v", err)})
}
log.Infof("Updated settings for server %s", serverID)
return c.JSON(http.StatusOK, jsonHTTPResponse{true, "Updated server settings successfully"})
}
}
// CreateServer handler creates a new WireGuard server (step 3 of the
// multi-server extension). Admin-only. Generates a fresh key pair,
// validates the ID/interface name/subnet, and stores the server plus its
@@ -658,6 +695,8 @@ func CreateServer(db store.IStore) echo.HandlerFunc {
settings := model.ServerSetting{
ConfigFilePath: fmt.Sprintf("/etc/wireguard/%s.conf", req.Interface),
FirewallMark: util.DefaultFirewallMark,
Table: util.DefaultTable,
UpdatedAt: time.Now().UTC(),
}
if err := db.SaveServerSettings(req.ID, settings); err != nil {