This commit is contained in:
Bernd Storath
2025-11-17 09:37:06 +01:00
parent 993c130f65
commit e42f7313ab
8 changed files with 73 additions and 56 deletions
+7 -7
View File
@@ -9,14 +9,14 @@
:label="$t('general.host')" :label="$t('general.host')"
:description="$t('admin.config.hostDesc')" :description="$t('admin.config.hostDesc')"
url="/api/admin/ip-info" url="/api/admin/ip-info"
:overridden="overrides.host" :overridden="overrides?.host"
/> />
<FormNumberField <FormNumberField
id="port" id="port"
v-model="data.port" v-model="data.port"
:label="$t('general.port')" :label="$t('general.port')"
:description="$t('admin.config.portDesc')" :description="$t('admin.config.portDesc')"
:overridden="overrides.port" :overridden="overrides?.port"
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
@@ -26,7 +26,7 @@
<FormArrayField <FormArrayField
v-model="data.defaultAllowedIps" v-model="data.defaultAllowedIps"
name="defaultAllowedIps" name="defaultAllowedIps"
:overridden="overrides.defaultAllowedIps" :overridden="overrides?.defaultAllowedIps"
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
@@ -36,7 +36,7 @@
<FormArrayField <FormArrayField
v-model="data.defaultDns" v-model="data.defaultDns"
name="defaultDns" name="defaultDns"
:overridden="overrides.defaultDns" :overridden="overrides?.defaultDns"
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
@@ -46,14 +46,14 @@
v-model="data.defaultMtu" v-model="data.defaultMtu"
:label="$t('general.mtu')" :label="$t('general.mtu')"
:description="$t('admin.config.mtuDesc')" :description="$t('admin.config.mtuDesc')"
:overridden="overrides.defaultMtu" :overridden="overrides?.defaultMtu"
/> />
<FormNumberField <FormNumberField
id="defaultPersistentKeepalive" id="defaultPersistentKeepalive"
v-model="data.defaultPersistentKeepalive" v-model="data.defaultPersistentKeepalive"
:label="$t('general.persistentKeepalive')" :label="$t('general.persistentKeepalive')"
:description="$t('admin.config.persistentKeepaliveDesc')" :description="$t('admin.config.persistentKeepaliveDesc')"
:overridden="overrides.defaultPersistentKeepalive" :overridden="overrides?.defaultPersistentKeepalive"
/> />
</FormGroup> </FormGroup>
<FormGroup v-if="globalStore.information?.isAwg"> <FormGroup v-if="globalStore.information?.isAwg">
@@ -131,7 +131,7 @@ const { data: overridesData } = await useFetch(`/api/admin/overrides`, {
method: 'get', method: 'get',
}); });
const overrides = computed(() => overridesData.value?.userConfig || {}); const overrides = computed(() => overridesData.value?.userConfig);
const data = toRef(_data.value); const data = toRef(_data.value);
+5 -5
View File
@@ -7,7 +7,7 @@
v-model="data.sessionTimeout" v-model="data.sessionTimeout"
:label="$t('admin.general.sessionTimeout')" :label="$t('admin.general.sessionTimeout')"
:description="$t('admin.general.sessionTimeoutDesc')" :description="$t('admin.general.sessionTimeoutDesc')"
:overridden="overrides.sessionTimeout" :overridden="overrides?.sessionTimeout"
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
@@ -17,21 +17,21 @@
v-model="data.metricsPassword" v-model="data.metricsPassword"
:label="$t('admin.general.metricsPassword')" :label="$t('admin.general.metricsPassword')"
:description="$t('admin.general.metricsPasswordDesc')" :description="$t('admin.general.metricsPasswordDesc')"
:overridden="overrides.metricsPassword" :overridden="overrides?.metricsPassword"
/> />
<FormSwitchField <FormSwitchField
id="prometheus" id="prometheus"
v-model="data.metricsPrometheus" v-model="data.metricsPrometheus"
:label="$t('admin.general.prometheus')" :label="$t('admin.general.prometheus')"
:description="$t('admin.general.prometheusDesc')" :description="$t('admin.general.prometheusDesc')"
:overridden="overrides.metricsPrometheus" :overridden="overrides?.metricsPrometheus"
/> />
<FormSwitchField <FormSwitchField
id="json" id="json"
v-model="data.metricsJson" v-model="data.metricsJson"
:label="$t('admin.general.json')" :label="$t('admin.general.json')"
:description="$t('admin.general.jsonDesc')" :description="$t('admin.general.jsonDesc')"
:overridden="overrides.metricsJson" :overridden="overrides?.metricsJson"
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
@@ -52,7 +52,7 @@ const { data: overridesData } = await useFetch(`/api/admin/overrides`, {
method: 'get', method: 'get',
}); });
const overrides = computed(() => overridesData.value?.general || {}); const overrides = computed(() => overridesData.value?.general);
const data = toRef(_data.value); const data = toRef(_data.value);
+5 -5
View File
@@ -6,25 +6,25 @@
id="PreUp" id="PreUp"
v-model="data.preUp" v-model="data.preUp"
:label="$t('hooks.preUp')" :label="$t('hooks.preUp')"
:overridden="overrides.preUp" :overridden="overrides?.preUp"
/> />
<FormTextField <FormTextField
id="PostUp" id="PostUp"
v-model="data.postUp" v-model="data.postUp"
:label="$t('hooks.postUp')" :label="$t('hooks.postUp')"
:overridden="overrides.postUp" :overridden="overrides?.postUp"
/> />
<FormTextField <FormTextField
id="PreDown" id="PreDown"
v-model="data.preDown" v-model="data.preDown"
:label="$t('hooks.preDown')" :label="$t('hooks.preDown')"
:overridden="overrides.preDown" :overridden="overrides?.preDown"
/> />
<FormTextField <FormTextField
id="PostDown" id="PostDown"
v-model="data.postDown" v-model="data.postDown"
:label="$t('hooks.postDown')" :label="$t('hooks.postDown')"
:overridden="overrides.postDown" :overridden="overrides?.postDown"
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
@@ -45,7 +45,7 @@ const { data: overridesData } = await useFetch(`/api/admin/overrides`, {
method: 'get', method: 'get',
}); });
const overrides = computed(() => overridesData.value?.hooks || {}); const overrides = computed(() => overridesData.value?.hooks);
const data = toRef(_data.value); const data = toRef(_data.value);
+4 -4
View File
@@ -7,21 +7,21 @@
v-model="data.mtu" v-model="data.mtu"
:label="$t('general.mtu')" :label="$t('general.mtu')"
:description="$t('admin.interface.mtuDesc')" :description="$t('admin.interface.mtuDesc')"
:overridden="overrides.mtu" :overridden="overrides?.mtu"
/> />
<FormNumberField <FormNumberField
id="port" id="port"
v-model="data.port" v-model="data.port"
:label="$t('general.port')" :label="$t('general.port')"
:description="$t('admin.interface.portDesc')" :description="$t('admin.interface.portDesc')"
:overridden="overrides.port" :overridden="overrides?.port"
/> />
<FormTextField <FormTextField
id="device" id="device"
v-model="data.device" v-model="data.device"
:label="$t('admin.interface.device')" :label="$t('admin.interface.device')"
:description="$t('admin.interface.deviceDesc')" :description="$t('admin.interface.deviceDesc')"
:overridden="overrides.device" :overridden="overrides?.device"
/> />
</FormGroup> </FormGroup>
<FormGroup v-if="globalStore.information?.isAwg"> <FormGroup v-if="globalStore.information?.isAwg">
@@ -171,7 +171,7 @@ const { data: overridesData } = await useFetch(`/api/admin/overrides`, {
method: 'get', method: 'get',
}); });
const overrides = computed(() => overridesData.value?.interface || {}); const overrides = computed(() => overridesData.value?.interface);
const data = toRef(_data.value); const data = toRef(_data.value);
+23 -21
View File
@@ -13,10 +13,12 @@ class WireGuard {
* Save and sync config * Save and sync config
*/ */
async saveConfig() { async saveConfig() {
const wgInterface = await Database.interfaces.get(); const wgInterface = applyInterfaceOverrides(
const wgInterfaceWithOverrides = applyInterfaceOverrides(wgInterface); await Database.interfaces.get()
await this.#saveWireguardConfig(wgInterfaceWithOverrides); );
await this.#syncWireguardConfig(wgInterfaceWithOverrides);
await this.#saveWireguardConfig(wgInterface);
await this.#syncWireguardConfig(wgInterface);
} }
/** /**
@@ -26,12 +28,11 @@ class WireGuard {
*/ */
async #saveWireguardConfig(wgInterface: InterfaceType) { async #saveWireguardConfig(wgInterface: InterfaceType) {
const clients = await Database.clients.getAll(); const clients = await Database.clients.getAll();
const hooks = await Database.hooks.get(); const hooks = applyHooksOverrides(await Database.hooks.get());
const hooksWithOverrides = applyHooksOverrides(hooks);
const result = []; const result = [];
result.push( result.push(
wg.generateServerInterface(wgInterface, hooksWithOverrides, { wg.generateServerInterface(wgInterface, hooks, {
enableIpv6: !WG_ENV.DISABLE_IPV6, enableIpv6: !WG_ENV.DISABLE_IPV6,
}) })
); );
@@ -152,10 +153,12 @@ class WireGuard {
} }
async getClientConfiguration({ clientId }: { clientId: ID }) { async getClientConfiguration({ clientId }: { clientId: ID }) {
const wgInterface = await Database.interfaces.get(); const wgInterface = applyInterfaceOverrides(
const wgInterfaceWithOverrides = applyInterfaceOverrides(wgInterface); await Database.interfaces.get()
const userConfig = await Database.userConfigs.get(); );
const userConfigWithOverrides = applyUserConfigOverrides(userConfig); const userConfig = applyUserConfigOverrides(
await Database.userConfigs.get()
);
const client = await Database.clients.get(clientId); const client = await Database.clients.get(clientId);
@@ -163,14 +166,9 @@ class WireGuard {
throw new Error('Client not found'); throw new Error('Client not found');
} }
return wg.generateClientConfig( return wg.generateClientConfig(wgInterface, userConfig, client, {
wgInterfaceWithOverrides, enableIpv6: !WG_ENV.DISABLE_IPV6,
userConfigWithOverrides, });
client,
{
enableIpv6: !WG_ENV.DISABLE_IPV6,
}
);
} }
async getClientQRCodeSVG({ clientId }: { clientId: ID }) { async getClientQRCodeSVG({ clientId }: { clientId: ID }) {
@@ -271,12 +269,16 @@ class WireGuard {
// Shutdown wireguard // Shutdown wireguard
async Shutdown() { async Shutdown() {
const wgInterface = await Database.interfaces.get(); const wgInterface = applyInterfaceOverrides(
await Database.interfaces.get()
);
await wg.down(wgInterface.name).catch(() => {}); await wg.down(wgInterface.name).catch(() => {});
} }
async Restart() { async Restart() {
const wgInterface = await Database.interfaces.get(); const wgInterface = applyInterfaceOverrides(
await Database.interfaces.get()
);
await wg.restart(wgInterface.name); await wg.restart(wgInterface.name);
} }
+18 -11
View File
@@ -189,25 +189,32 @@ export function applyUserConfigOverrides<
/** /**
* Apply environment variable overrides to a general config object * Apply environment variable overrides to a general config object
*/ */
export function applyGeneralOverrides< export function applySessionOverrides<
T extends { T extends {
sessionTimeout: number; sessionTimeout: number;
metricsPassword: string | null;
metricsPrometheus: boolean;
metricsJson: boolean;
}, },
>(generalConfig: T): T { >(generalConfig: T): T {
return { return {
...generalConfig, ...generalConfig,
sessionTimeout: sessionTimeout:
WG_GENERAL_OVERRIDE_ENV.SESSION_TIMEOUT ?? generalConfig.sessionTimeout, WG_GENERAL_OVERRIDE_ENV.SESSION_TIMEOUT ?? generalConfig.sessionTimeout,
metricsPassword: };
WG_GENERAL_OVERRIDE_ENV.METRICS_PASSWORD ?? generalConfig.metricsPassword, }
metricsPrometheus:
WG_GENERAL_OVERRIDE_ENV.METRICS_PROMETHEUS ?? export function applyMetricsOverrides<
generalConfig.metricsPrometheus, T extends {
metricsJson: password: string | null;
WG_GENERAL_OVERRIDE_ENV.METRICS_JSON ?? generalConfig.metricsJson, prometheus: boolean;
json: boolean;
},
>(metricsConfig: T): T {
return {
...metricsConfig,
password:
WG_GENERAL_OVERRIDE_ENV.METRICS_PASSWORD ?? metricsConfig.password,
prometheus:
WG_GENERAL_OVERRIDE_ENV.METRICS_PROMETHEUS ?? metricsConfig.prometheus,
json: WG_GENERAL_OVERRIDE_ENV.METRICS_JSON ?? metricsConfig.json,
}; };
} }
+3 -1
View File
@@ -138,7 +138,9 @@ export const defineMetricsHandler = <
handler: MetricsHandler<TReq, TRes> handler: MetricsHandler<TReq, TRes>
) => { ) => {
return defineEventHandler(async (event) => { return defineEventHandler(async (event) => {
const metricsConfig = await Database.general.getMetricsConfig(); const metricsConfig = applyMetricsOverrides(
await Database.general.getMetricsConfig()
);
if (metricsConfig.password) { if (metricsConfig.password) {
const auth = getHeader(event, 'Authorization'); const auth = getHeader(event, 'Authorization');
+8 -2
View File
@@ -8,7 +8,10 @@ export type WGSession = Partial<{
const name = 'wg-easy'; const name = 'wg-easy';
export async function useWGSession(event: H3Event, rememberMe = false) { export async function useWGSession(event: H3Event, rememberMe = false) {
const sessionConfig = await Database.general.getSessionConfig(); const sessionConfig = applySessionOverrides(
await Database.general.getSessionConfig()
);
return useSession<WGSession>(event, { return useSession<WGSession>(event, {
password: sessionConfig.sessionPassword, password: sessionConfig.sessionPassword,
name, name,
@@ -22,7 +25,10 @@ export async function useWGSession(event: H3Event, rememberMe = false) {
} }
export async function getWGSession(event: H3Event) { export async function getWGSession(event: H3Event) {
const sessionConfig = await Database.general.getSessionConfig(); const sessionConfig = applySessionOverrides(
await Database.general.getSessionConfig()
);
return getSession<WGSession>(event, { return getSession<WGSession>(event, {
password: sessionConfig.sessionPassword, password: sessionConfig.sessionPassword,
name, name,