47 lines
1.6 KiB
JavaScript
47 lines
1.6 KiB
JavaScript
"use strict";
|
|
|
|
const path = require("node:path");
|
|
const { execFile } = require("node:child_process");
|
|
|
|
// This registry is intentionally small. Write or service actions require a
|
|
// separate reviewed entry and a matching deployment-receiver rule.
|
|
const REPO_ROOT = path.resolve(__dirname, "../../..");
|
|
const INSPECT_SCRIPT = path.join(REPO_ROOT, "server-tools/deployment-receiver/scripts/inspect-gatekeeper.js");
|
|
|
|
const ACTIONS = Object.freeze({
|
|
"inspect-gatekeeper": Object.freeze({
|
|
label: "只读检查 Gatekeeper",
|
|
scope: "system-arch",
|
|
mode: "read-only",
|
|
run: (timeout) => runFile(process.execPath, [INSPECT_SCRIPT], timeout)
|
|
}),
|
|
"sync-status": Object.freeze({
|
|
label: "只读检查第五域同步状态",
|
|
scope: "code-repo",
|
|
mode: "read-only",
|
|
run: (timeout) => runFile("/usr/bin/git", ["-C", REPO_ROOT, "status", "--short", "--branch"], timeout)
|
|
})
|
|
});
|
|
|
|
function runFile(file, args, timeout) {
|
|
return new Promise((resolve) => {
|
|
execFile(file, args, { timeout: timeout || 30000, maxBuffer: 100000 }, (err, stdout, stderr) => {
|
|
resolve({
|
|
code: err ? (typeof err.code === "number" ? err.code : 1) : 0,
|
|
stdout: (stdout || "").slice(0, 100000),
|
|
stderr: (stderr || "").slice(0, 100000)
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
function getAction(action) {
|
|
return typeof action === "string" ? ACTIONS[action] || null : null;
|
|
}
|
|
|
|
function listActions() {
|
|
return Object.entries(ACTIONS).map(([id, action]) => ({ id, label: action.label, scope: action.scope, mode: action.mode }));
|
|
}
|
|
|
|
module.exports = { getAction, listActions, INSPECT_SCRIPT };
|