mirror of https://github.com/wg-easy/wg-easy
17 changed files with 188 additions and 127 deletions
@ -1,9 +1,9 @@ |
|||
export default definePermissionEventHandler( |
|||
actions.ADMIN, |
|||
async ({ event }) => { |
|||
const config = await WireGuard.backupConfiguration(); |
|||
async (/*{ event }*/) => { |
|||
/*const config = await WireGuard.backupConfiguration(); |
|||
setHeader(event, 'Content-Disposition', 'attachment; filename="wg0.json"'); |
|||
setHeader(event, 'Content-Type', 'text/json'); |
|||
return config; |
|||
return config;*/ |
|||
} |
|||
); |
|||
|
@ -1,8 +1,8 @@ |
|||
export default definePermissionEventHandler( |
|||
actions.ADMIN, |
|||
async ({ event }) => { |
|||
const { file } = await readValidatedBody(event, validateZod(fileType)); |
|||
async (/*{ event }*/) => { |
|||
/*const { file } = await readValidatedBody(event, validateZod(fileType)); |
|||
await WireGuard.restoreConfiguration(file); |
|||
return { success: true }; |
|||
return { success: true };*/ |
|||
} |
|||
); |
|||
|
@ -0,0 +1,31 @@ |
|||
import type { DBType } from '#db/sqlite'; |
|||
import { eq, sql } from 'drizzle-orm'; |
|||
import { prometheus } from './schema'; |
|||
|
|||
function createPreparedStatement(db: DBType) { |
|||
return { |
|||
get: db.query.prometheus |
|||
.findFirst({ where: eq(prometheus.id, sql.placeholder('interface')) }) |
|||
.prepare(), |
|||
}; |
|||
} |
|||
|
|||
export class PrometheusService { |
|||
#statements: ReturnType<typeof createPreparedStatement>; |
|||
|
|||
constructor(db: DBType) { |
|||
this.#statements = createPreparedStatement(db); |
|||
} |
|||
|
|||
get(infName: string) { |
|||
return this.#statements.get.execute({ interface: infName }); |
|||
} |
|||
} |
|||
|
|||
export class MetricsService { |
|||
prometheus: PrometheusService; |
|||
|
|||
constructor(db: DBType) { |
|||
this.prometheus = new PrometheusService(db); |
|||
} |
|||
} |
@ -1,4 +1,17 @@ |
|||
import type { InferSelectModel } from 'drizzle-orm'; |
|||
import type { oneTimeLink } from './schema'; |
|||
import { z } from 'zod'; |
|||
|
|||
export type OneTimeLinkType = InferSelectModel<typeof oneTimeLink>; |
|||
|
|||
const oneTimeLinkType = z |
|||
.string({ message: 'zod.otl' }) |
|||
.min(1, 'zod.otlMin') |
|||
.pipe(safeStringRefine); |
|||
|
|||
export const OneTimeLinkGetSchema = z.object( |
|||
{ |
|||
oneTimeLink: oneTimeLinkType, |
|||
}, |
|||
{ message: objectMessage } |
|||
); |
|||
|
@ -1,19 +1,20 @@ |
|||
import type { InferSelectModel } from 'drizzle-orm'; |
|||
import type { userConfig } from './schema'; |
|||
import z from 'zod'; |
|||
|
|||
export type UserConfigType = InferSelectModel<typeof userConfig>; |
|||
|
|||
const host = zod |
|||
const host = z |
|||
.string({ message: 'zod.userConfig.host' }) |
|||
.min(1, 'zod.userConfig.hostMin') |
|||
.pipe(safeStringRefine); |
|||
|
|||
const port = zod |
|||
const port = z |
|||
.number({ message: 'zod.userConfig.port' }) |
|||
.min(1, 'zod.userConfig.portMin') |
|||
.max(65535, 'zod.userConfig.portMax'); |
|||
|
|||
export const UserConfigSetupType = zod.object({ |
|||
export const UserConfigSetupType = z.object({ |
|||
host: host, |
|||
port: port, |
|||
}); |
|||
|
@ -1,13 +1,13 @@ |
|||
export default defineEventHandler(async () => { |
|||
// TODO: check password
|
|||
|
|||
const system = await Database.system.get(); |
|||
if (!system.metrics.prometheus.enabled) { |
|||
const prometheus = await Database.metrics.prometheus.get('wg0'); |
|||
if (!prometheus) { |
|||
throw createError({ |
|||
statusCode: 400, |
|||
message: 'Prometheus metrics are not enabled', |
|||
}); |
|||
} |
|||
|
|||
return WireGuard.getMetricsJSON(); |
|||
return getMetricsJSON(); |
|||
}); |
|||
|
@ -0,0 +1,74 @@ |
|||
// TODO: rewrite
|
|||
|
|||
export async function getPrometheusResponse() { |
|||
const clients = await WireGuard.getClients(); |
|||
let wireguardPeerCount = 0; |
|||
let wireguardEnabledPeersCount = 0; |
|||
let wireguardConnectedPeersCount = 0; |
|||
let wireguardSentBytes = ''; |
|||
let wireguardReceivedBytes = ''; |
|||
let wireguardLatestHandshakeSeconds = ''; |
|||
for (const client of clients) { |
|||
wireguardPeerCount++; |
|||
if (client.enabled === true) { |
|||
wireguardEnabledPeersCount++; |
|||
} |
|||
if (client.endpoint !== null) { |
|||
wireguardConnectedPeersCount++; |
|||
} |
|||
wireguardSentBytes += `wireguard_sent_bytes{interface="wg0",enabled="${client.enabled}",ipv4Address="${client.ipv4Address}",ipv6Address="${client.ipv6Address}",name="${client.name}"} ${Number(client.transferTx)}\n`; |
|||
wireguardReceivedBytes += `wireguard_received_bytes{interface="wg0",enabled="${client.enabled}",ipv4Address="${client.ipv4Address}",ipv6Address="${client.ipv6Address}",name="${client.name}"} ${Number(client.transferRx)}\n`; |
|||
wireguardLatestHandshakeSeconds += `wireguard_latest_handshake_seconds{interface="wg0",enabled="${client.enabled}",ipv4Address="${client.ipv4Address}",ipv6Address="${client.ipv6Address}",name="${client.name}"} ${client.latestHandshakeAt ? (new Date().getTime() - new Date(client.latestHandshakeAt).getTime()) / 1000 : 0}\n`; |
|||
} |
|||
|
|||
let returnText = '# HELP wg-easy and wireguard metrics\n'; |
|||
|
|||
returnText += '\n# HELP wireguard_configured_peers\n'; |
|||
returnText += '# TYPE wireguard_configured_peers gauge\n'; |
|||
returnText += `wireguard_configured_peers{interface="wg0"} ${wireguardPeerCount}\n`; |
|||
|
|||
returnText += '\n# HELP wireguard_enabled_peers\n'; |
|||
returnText += '# TYPE wireguard_enabled_peers gauge\n'; |
|||
returnText += `wireguard_enabled_peers{interface="wg0"} ${wireguardEnabledPeersCount}\n`; |
|||
|
|||
returnText += '\n# HELP wireguard_connected_peers\n'; |
|||
returnText += '# TYPE wireguard_connected_peers gauge\n'; |
|||
returnText += `wireguard_connected_peers{interface="wg0"} ${wireguardConnectedPeersCount}\n`; |
|||
|
|||
returnText += '\n# HELP wireguard_sent_bytes Bytes sent to the peer\n'; |
|||
returnText += '# TYPE wireguard_sent_bytes counter\n'; |
|||
returnText += `${wireguardSentBytes}`; |
|||
|
|||
returnText += |
|||
'\n# HELP wireguard_received_bytes Bytes received from the peer\n'; |
|||
returnText += '# TYPE wireguard_received_bytes counter\n'; |
|||
returnText += `${wireguardReceivedBytes}`; |
|||
|
|||
returnText += |
|||
'\n# HELP wireguard_latest_handshake_seconds UNIX timestamp seconds of the last handshake\n'; |
|||
returnText += '# TYPE wireguard_latest_handshake_seconds gauge\n'; |
|||
returnText += `${wireguardLatestHandshakeSeconds}`; |
|||
|
|||
return returnText; |
|||
} |
|||
|
|||
export async function getMetricsJSON() { |
|||
const clients = await WireGuard.getClients(); |
|||
let wireguardPeerCount = 0; |
|||
let wireguardEnabledPeersCount = 0; |
|||
let wireguardConnectedPeersCount = 0; |
|||
for (const client of clients) { |
|||
wireguardPeerCount++; |
|||
if (client.enabled === true) { |
|||
wireguardEnabledPeersCount++; |
|||
} |
|||
if (client.endpoint !== null) { |
|||
wireguardConnectedPeersCount++; |
|||
} |
|||
} |
|||
return { |
|||
wireguard_configured_peers: wireguardPeerCount, |
|||
wireguard_enabled_peers: wireguardEnabledPeersCount, |
|||
wireguard_connected_peers: wireguardConnectedPeersCount, |
|||
}; |
|||
} |
Loading…
Reference in new issue