87 lines
2.7 KiB
JavaScript
87 lines
2.7 KiB
JavaScript
#!/usr/bin/env node
|
|
import { spawn } from 'node:child_process';
|
|
import { chmod, copyFile, mkdir, writeFile } from 'node:fs/promises';
|
|
import { existsSync } from 'node:fs';
|
|
|
|
const root = process.cwd();
|
|
const dryRun = process.argv.includes('--dry-run');
|
|
|
|
function run(command, args) {
|
|
return new Promise((resolve, reject) => {
|
|
const child = spawn(command, args, { stdio: 'inherit' });
|
|
child.on('close', (code) =>
|
|
code === 0 ? resolve() : reject(new Error(`${command} exited ${code}`)),
|
|
);
|
|
child.on('error', reject);
|
|
});
|
|
}
|
|
|
|
async function installFile(source, target, mode = 0o644) {
|
|
console.log(`${dryRun ? 'would install' : 'install'} ${source} -> ${target}`);
|
|
if (dryRun) return;
|
|
await copyFile(source, target);
|
|
await chmod(target, mode);
|
|
}
|
|
|
|
async function installGitHook() {
|
|
const hookDir = `${root}/.git/hooks`;
|
|
if (!existsSync(hookDir)) return;
|
|
const hook = `#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
cd "${root}"
|
|
echo "[hermes] running pre-push verification"
|
|
pnpm -r typecheck
|
|
pnpm lint
|
|
pnpm hermes:watchdog -- --no-remediate --json >/tmp/podman-hermes-pre-push.json
|
|
echo "[hermes] pre-push verification passed"
|
|
`;
|
|
console.log(`${dryRun ? 'would write' : 'write'} ${hookDir}/pre-push`);
|
|
if (dryRun) return;
|
|
await writeFile(`${hookDir}/pre-push`, hook);
|
|
await chmod(`${hookDir}/pre-push`, 0o755);
|
|
}
|
|
|
|
await installFile(
|
|
'infra/systemd/podman-hermes-watchdog.service',
|
|
'/etc/systemd/system/podman-hermes-watchdog.service',
|
|
);
|
|
await installFile(
|
|
'infra/systemd/podman-hermes-watchdog.timer',
|
|
'/etc/systemd/system/podman-hermes-watchdog.timer',
|
|
);
|
|
await installFile(
|
|
'infra/systemd/podman-hermes-sync-deploy.service',
|
|
'/etc/systemd/system/podman-hermes-sync-deploy.service',
|
|
);
|
|
await installFile(
|
|
'infra/systemd/podman-hermes-sync-deploy.timer',
|
|
'/etc/systemd/system/podman-hermes-sync-deploy.timer',
|
|
);
|
|
await installFile(
|
|
'infra/systemd/podman-public-healthcheck.service',
|
|
'/etc/systemd/system/podman-public-healthcheck.service',
|
|
);
|
|
await installFile(
|
|
'infra/systemd/podman-public-healthcheck.timer',
|
|
'/etc/systemd/system/podman-public-healthcheck.timer',
|
|
);
|
|
|
|
await mkdir('/var/log/podman', { recursive: true });
|
|
await installGitHook();
|
|
|
|
if (!dryRun) {
|
|
await run('systemctl', ['daemon-reload']);
|
|
await run('systemctl', ['enable', '--now', 'podman-hermes-watchdog.timer']);
|
|
await run('systemctl', ['enable', '--now', 'podman-hermes-sync-deploy.timer']);
|
|
await run('systemctl', ['enable', '--now', 'podman-public-healthcheck.timer']);
|
|
await run('systemctl', [
|
|
'status',
|
|
'--no-pager',
|
|
'podman-hermes-watchdog.timer',
|
|
'podman-hermes-sync-deploy.timer',
|
|
'podman-public-healthcheck.timer',
|
|
]);
|
|
}
|
|
|
|
console.log(JSON.stringify({ ok: true, installed: !dryRun }, null, 2));
|