mirror of
https://github.com/fosrl/pangolin.git
synced 2026-03-17 16:16:40 +00:00
Compare commits
6 Commits
1.16.2-s.9
...
1.16.2-s.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ca5acf158 | ||
|
|
ea41fcc566 | ||
|
|
5736c1d8ce | ||
|
|
d142366dd9 | ||
|
|
bab09dff95 | ||
|
|
23d3345ab9 |
@@ -515,6 +515,6 @@ authenticated.post(
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyLimits,
|
verifyLimits,
|
||||||
verifyUserHasAction(ActionsEnum.signSshKey),
|
verifyUserHasAction(ActionsEnum.signSshKey),
|
||||||
logActionAudit(ActionsEnum.signSshKey),
|
// logActionAudit(ActionsEnum.signSshKey), // it is handled inside of the function below so we can include more metadata
|
||||||
ssh.signSshKey
|
ssh.signSshKey
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -14,7 +14,9 @@
|
|||||||
import { Request, Response, NextFunction } from "express";
|
import { Request, Response, NextFunction } from "express";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import {
|
import {
|
||||||
|
actionAuditLog,
|
||||||
db,
|
db,
|
||||||
|
logsDb,
|
||||||
newts,
|
newts,
|
||||||
roles,
|
roles,
|
||||||
roundTripMessageTracker,
|
roundTripMessageTracker,
|
||||||
@@ -34,6 +36,7 @@ import { canUserAccessSiteResource } from "@server/auth/canUserAccessSiteResourc
|
|||||||
import { signPublicKey, getOrgCAKeys } from "@server/lib/sshCA";
|
import { signPublicKey, getOrgCAKeys } from "@server/lib/sshCA";
|
||||||
import config from "@server/lib/config";
|
import config from "@server/lib/config";
|
||||||
import { sendToClient } from "#private/routers/ws";
|
import { sendToClient } from "#private/routers/ws";
|
||||||
|
import { ActionsEnum } from "@server/auth/actions";
|
||||||
|
|
||||||
const paramsSchema = z.strictObject({
|
const paramsSchema = z.strictObject({
|
||||||
orgId: z.string().nonempty()
|
orgId: z.string().nonempty()
|
||||||
@@ -446,6 +449,20 @@ export async function signSshKey(
|
|||||||
sshHost = resource.destination;
|
sshHost = resource.destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await logsDb.insert(actionAuditLog).values({
|
||||||
|
timestamp: Math.floor(Date.now() / 1000),
|
||||||
|
orgId: orgId,
|
||||||
|
actorType: "user",
|
||||||
|
actor: req.user?.username ?? "",
|
||||||
|
actorId: req.user?.userId ?? "",
|
||||||
|
action: ActionsEnum.signSshKey,
|
||||||
|
metadata: JSON.stringify({
|
||||||
|
resourceId: resource.siteResourceId,
|
||||||
|
resource: resource.name,
|
||||||
|
siteId: resource.siteId,
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
return response<SignSshKeyResponse>(res, {
|
return response<SignSshKeyResponse>(res, {
|
||||||
data: {
|
data: {
|
||||||
certificate: cert.certificate,
|
certificate: cert.certificate,
|
||||||
|
|||||||
@@ -197,6 +197,12 @@ const connectedClients: Map<string, AuthenticatedWebSocket[]> = new Map();
|
|||||||
// Config version tracking map (local to this node, resets on server restart)
|
// Config version tracking map (local to this node, resets on server restart)
|
||||||
const clientConfigVersions: Map<string, number> = new Map();
|
const clientConfigVersions: Map<string, number> = new Map();
|
||||||
|
|
||||||
|
// Tracks the last Unix timestamp (seconds) at which a ping was flushed to the
|
||||||
|
// DB for a given siteId. Resets on server restart which is fine – the first
|
||||||
|
// ping after startup will always write, re-establishing the online state.
|
||||||
|
const lastPingDbWrite: Map<number, number> = new Map();
|
||||||
|
const PING_DB_WRITE_INTERVAL = 45; // seconds
|
||||||
|
|
||||||
// Recovery tracking
|
// Recovery tracking
|
||||||
let isRedisRecoveryInProgress = false;
|
let isRedisRecoveryInProgress = false;
|
||||||
|
|
||||||
@@ -855,12 +861,16 @@ const setupConnection = async (
|
|||||||
const newtClient = client as Newt;
|
const newtClient = client as Newt;
|
||||||
ws.on("ping", async () => {
|
ws.on("ping", async () => {
|
||||||
if (!newtClient.siteId) return;
|
if (!newtClient.siteId) return;
|
||||||
|
const now = Math.floor(Date.now() / 1000);
|
||||||
|
const lastWrite = lastPingDbWrite.get(newtClient.siteId) ?? 0;
|
||||||
|
if (now - lastWrite < PING_DB_WRITE_INTERVAL) return;
|
||||||
|
lastPingDbWrite.set(newtClient.siteId, now);
|
||||||
try {
|
try {
|
||||||
await db
|
await db
|
||||||
.update(sites)
|
.update(sites)
|
||||||
.set({
|
.set({
|
||||||
online: true,
|
online: true,
|
||||||
lastPing: Math.floor(Date.now() / 1000)
|
lastPing: now
|
||||||
})
|
})
|
||||||
.where(eq(sites.siteId, newtClient.siteId));
|
.where(eq(sites.siteId, newtClient.siteId));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ export async function flushSiteBandwidthToDb(): Promise<void> {
|
|||||||
accumulator = new Map<string, AccumulatorEntry>();
|
accumulator = new Map<string, AccumulatorEntry>();
|
||||||
|
|
||||||
const currentTime = new Date().toISOString();
|
const currentTime = new Date().toISOString();
|
||||||
|
const currentTimeEpochSeconds = Math.floor(new Date().getTime() / 1000);
|
||||||
|
|
||||||
// Sort by publicKey for consistent lock ordering across concurrent
|
// Sort by publicKey for consistent lock ordering across concurrent
|
||||||
// writers — deadlock-prevention strategy.
|
// writers — deadlock-prevention strategy.
|
||||||
@@ -119,7 +120,8 @@ export async function flushSiteBandwidthToDb(): Promise<void> {
|
|||||||
.set({
|
.set({
|
||||||
megabytesOut: sql`COALESCE(${sites.megabytesOut}, 0) + ${bytesIn}`,
|
megabytesOut: sql`COALESCE(${sites.megabytesOut}, 0) + ${bytesIn}`,
|
||||||
megabytesIn: sql`COALESCE(${sites.megabytesIn}, 0) + ${bytesOut}`,
|
megabytesIn: sql`COALESCE(${sites.megabytesIn}, 0) + ${bytesOut}`,
|
||||||
lastBandwidthUpdate: currentTime
|
lastBandwidthUpdate: currentTime,
|
||||||
|
lastPing: currentTimeEpochSeconds
|
||||||
})
|
})
|
||||||
.where(eq(sites.pubKey, publicKey))
|
.where(eq(sites.pubKey, publicKey))
|
||||||
.returning({
|
.returning({
|
||||||
@@ -321,4 +323,4 @@ export const receiveBandwidth = async (
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user