@solongate/proxy 0.81.49 → 0.81.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +521 -409
- package/dist/logs-server-daemon.d.ts +19 -0
- package/dist/logs-server.js +121 -9
- package/dist/tui/index.js +366 -276
- package/dist/tui/panels/Settings.d.ts +4 -1
- package/package.json +1 -1
- package/dist/tui/panels/Accounts.d.ts +0 -7
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const LOGS_SERVER_PORT = 8788;
|
|
2
|
+
export interface LogsServerStatus {
|
|
3
|
+
desired: 'on' | 'off';
|
|
4
|
+
running: boolean;
|
|
5
|
+
pid?: number;
|
|
6
|
+
port: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function logsServerStatus(): LogsServerStatus;
|
|
9
|
+
/** Called from runLogsServer when a (foreground or daemon) server starts. */
|
|
10
|
+
export declare function recordLogsServerStarted(port: number): void;
|
|
11
|
+
/** Spawn the detached daemon (idempotent — no-op when already running). */
|
|
12
|
+
export declare function startLogsServerDaemon(): LogsServerStatus;
|
|
13
|
+
/** Explicit disable — the ONLY thing that flips desired to 'off'. */
|
|
14
|
+
export declare function stopLogsServerDaemon(): LogsServerStatus;
|
|
15
|
+
/**
|
|
16
|
+
* Resurrect the daemon when it SHOULD be running but isn't (machine reboot,
|
|
17
|
+
* Ctrl+C on a foreground run, crash). Called from every human CLI startup.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureLogsServerDaemon(): void;
|
package/dist/logs-server.js
CHANGED
|
@@ -1,8 +1,118 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __esm = (fn, res) => function __init() {
|
|
4
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
5
|
+
};
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// src/logs-server-daemon.ts
|
|
12
|
+
var logs_server_daemon_exports = {};
|
|
13
|
+
__export(logs_server_daemon_exports, {
|
|
14
|
+
LOGS_SERVER_PORT: () => LOGS_SERVER_PORT,
|
|
15
|
+
ensureLogsServerDaemon: () => ensureLogsServerDaemon,
|
|
16
|
+
logsServerStatus: () => logsServerStatus,
|
|
17
|
+
recordLogsServerStarted: () => recordLogsServerStarted,
|
|
18
|
+
startLogsServerDaemon: () => startLogsServerDaemon,
|
|
19
|
+
stopLogsServerDaemon: () => stopLogsServerDaemon
|
|
20
|
+
});
|
|
21
|
+
import { spawn } from "child_process";
|
|
22
|
+
import { mkdirSync, openSync, readFileSync, writeFileSync } from "fs";
|
|
23
|
+
import { homedir } from "os";
|
|
24
|
+
import { dirname, join } from "path";
|
|
25
|
+
import { fileURLToPath } from "url";
|
|
26
|
+
function readState() {
|
|
27
|
+
try {
|
|
28
|
+
const s = JSON.parse(readFileSync(STATE_FILE, "utf-8"));
|
|
29
|
+
return s && typeof s === "object" ? s : {};
|
|
30
|
+
} catch {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function writeState(s) {
|
|
35
|
+
try {
|
|
36
|
+
mkdirSync(DIR, { recursive: true });
|
|
37
|
+
writeFileSync(STATE_FILE, JSON.stringify(s));
|
|
38
|
+
} catch {
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function pidAlive(pid) {
|
|
42
|
+
if (!pid || pid <= 0) return false;
|
|
43
|
+
try {
|
|
44
|
+
process.kill(pid, 0);
|
|
45
|
+
return true;
|
|
46
|
+
} catch (e) {
|
|
47
|
+
return e.code === "EPERM";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function logsServerStatus() {
|
|
51
|
+
const s = readState();
|
|
52
|
+
const running = pidAlive(s.pid);
|
|
53
|
+
return { desired: s.desired === "on" ? "on" : "off", running, pid: running ? s.pid : void 0, port: s.port || LOGS_SERVER_PORT };
|
|
54
|
+
}
|
|
55
|
+
function recordLogsServerStarted(port) {
|
|
56
|
+
writeState({ desired: "on", pid: process.pid, port, startedAt: Date.now() });
|
|
57
|
+
}
|
|
58
|
+
function startLogsServerDaemon() {
|
|
59
|
+
const cur = logsServerStatus();
|
|
60
|
+
if (cur.running) {
|
|
61
|
+
writeState({ ...readState(), desired: "on" });
|
|
62
|
+
return { ...cur, desired: "on" };
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
mkdirSync(DIR, { recursive: true });
|
|
66
|
+
const log = openSync(LOG_FILE, "a");
|
|
67
|
+
const cli = join(dirname(fileURLToPath(import.meta.url)), "index.js");
|
|
68
|
+
const p = spawn(process.execPath, [cli, "logs-server"], {
|
|
69
|
+
detached: true,
|
|
70
|
+
stdio: ["ignore", log, log],
|
|
71
|
+
windowsHide: true
|
|
72
|
+
});
|
|
73
|
+
p.on("error", () => {
|
|
74
|
+
});
|
|
75
|
+
p.unref();
|
|
76
|
+
writeState({ desired: "on", pid: p.pid, port: LOGS_SERVER_PORT, startedAt: Date.now() });
|
|
77
|
+
return { desired: "on", running: true, pid: p.pid, port: LOGS_SERVER_PORT };
|
|
78
|
+
} catch {
|
|
79
|
+
return { ...cur, desired: "on", running: false };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function stopLogsServerDaemon() {
|
|
83
|
+
const s = readState();
|
|
84
|
+
if (pidAlive(s.pid)) {
|
|
85
|
+
try {
|
|
86
|
+
process.kill(s.pid);
|
|
87
|
+
} catch {
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
writeState({ desired: "off", port: s.port });
|
|
91
|
+
return { desired: "off", running: false, port: s.port || LOGS_SERVER_PORT };
|
|
92
|
+
}
|
|
93
|
+
function ensureLogsServerDaemon() {
|
|
94
|
+
try {
|
|
95
|
+
const s = logsServerStatus();
|
|
96
|
+
if (s.desired === "on" && !s.running) startLogsServerDaemon();
|
|
97
|
+
} catch {
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
var DIR, STATE_FILE, LOG_FILE, LOGS_SERVER_PORT;
|
|
101
|
+
var init_logs_server_daemon = __esm({
|
|
102
|
+
"src/logs-server-daemon.ts"() {
|
|
103
|
+
"use strict";
|
|
104
|
+
DIR = join(homedir(), ".solongate");
|
|
105
|
+
STATE_FILE = join(DIR, ".logs-server.json");
|
|
106
|
+
LOG_FILE = join(DIR, "logs-server.log");
|
|
107
|
+
LOGS_SERVER_PORT = 8788;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
1
111
|
// src/logs-server.ts
|
|
2
112
|
import { createServer } from "http";
|
|
3
|
-
import { readFileSync, statSync } from "fs";
|
|
4
|
-
import { resolve, join, isAbsolute } from "path";
|
|
5
|
-
import { homedir } from "os";
|
|
113
|
+
import { readFileSync as readFileSync2, statSync } from "fs";
|
|
114
|
+
import { resolve, join as join2, isAbsolute } from "path";
|
|
115
|
+
import { homedir as homedir2 } from "os";
|
|
6
116
|
import { readdirSync } from "fs";
|
|
7
117
|
var LOG_FILENAME = "solongate-audit.jsonl";
|
|
8
118
|
var DEFAULT_PORT = 8788;
|
|
@@ -21,15 +131,15 @@ function resolveLocalLogDir(rawPath) {
|
|
|
21
131
|
const dir = String(rawPath || "").trim().replace(/[\\/]+$/, "");
|
|
22
132
|
if (!dir) return null;
|
|
23
133
|
if (isAbsolute(dir)) return dir;
|
|
24
|
-
return resolve(
|
|
134
|
+
return resolve(homedir2(), ".solongate", "local-logs");
|
|
25
135
|
}
|
|
26
136
|
async function findLogDir() {
|
|
27
|
-
const base = resolve(
|
|
137
|
+
const base = resolve(homedir2(), ".solongate");
|
|
28
138
|
try {
|
|
29
139
|
const files = readdirSync(base).filter((f) => f.startsWith(".policy-cache-") && f.endsWith(".json"));
|
|
30
140
|
for (const f of files) {
|
|
31
141
|
try {
|
|
32
|
-
const c = JSON.parse(
|
|
142
|
+
const c = JSON.parse(readFileSync2(join2(base, f), "utf-8"));
|
|
33
143
|
const p = c?.security?.localLogs?.path;
|
|
34
144
|
if (typeof p === "string" && p.trim()) return { dir: resolveLocalLogDir(p), configured: p };
|
|
35
145
|
} catch {
|
|
@@ -38,7 +148,7 @@ async function findLogDir() {
|
|
|
38
148
|
} catch {
|
|
39
149
|
}
|
|
40
150
|
try {
|
|
41
|
-
const cfgRaw =
|
|
151
|
+
const cfgRaw = readFileSync2(join2(base, "cloud-guard.json"), "utf-8");
|
|
42
152
|
const { apiKey, apiUrl } = JSON.parse(cfgRaw);
|
|
43
153
|
if (apiKey) {
|
|
44
154
|
const url = `${apiUrl || "https://api.solongate.com"}/api/v1/policies/active`;
|
|
@@ -67,7 +177,7 @@ function setCors(req, res) {
|
|
|
67
177
|
}
|
|
68
178
|
function fileInfo(dir) {
|
|
69
179
|
if (!dir) return { file: null, exists: false, size: 0, mtimeMs: 0 };
|
|
70
|
-
const file =
|
|
180
|
+
const file = join2(dir, LOG_FILENAME);
|
|
71
181
|
try {
|
|
72
182
|
const st = statSync(file);
|
|
73
183
|
return { file, exists: true, size: st.size, mtimeMs: st.mtimeMs };
|
|
@@ -128,7 +238,7 @@ async function runLogsServer() {
|
|
|
128
238
|
return;
|
|
129
239
|
}
|
|
130
240
|
try {
|
|
131
|
-
const text =
|
|
241
|
+
const text = readFileSync2(info.file, "utf-8");
|
|
132
242
|
res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8", "Last-Modified": lastMod, "X-Solongate-Exists": "1" });
|
|
133
243
|
res.end(text);
|
|
134
244
|
} catch {
|
|
@@ -141,6 +251,8 @@ async function runLogsServer() {
|
|
|
141
251
|
res.end("not found");
|
|
142
252
|
});
|
|
143
253
|
server.listen(port, "127.0.0.1", async () => {
|
|
254
|
+
const { recordLogsServerStarted: recordLogsServerStarted2 } = await Promise.resolve().then(() => (init_logs_server_daemon(), logs_server_daemon_exports));
|
|
255
|
+
recordLogsServerStarted2(port);
|
|
144
256
|
const { dir, configured } = await findLogDir();
|
|
145
257
|
process.stdout.write(`[SolonGate] Local logs agent listening on http://127.0.0.1:${port}
|
|
146
258
|
`);
|