clawdie-iso/firstboot/patch-pi-footer-hostname.js

69 lines
2.8 KiB
JavaScript
Executable file

#!/usr/bin/env node
// Patch the bundled Pi footer so operator sessions show the runtime hostname.
// This is intentionally a post-install patch because the live image ships Pi as
// an offline npm-global tarball rather than as source built in this repo.
const fs = require("node:fs");
const file = process.argv[2];
if (!file) {
console.error("usage: patch-pi-footer-hostname.js FOOTER_JS");
process.exit(64);
}
let src = fs.readFileSync(file, "utf8");
if (!src.includes('import { hostname } from "node:os";')) {
if (src.includes('import { isAbsolute, relative, resolve, sep } from "node:path";\n')) {
src = src.replace(
'import { isAbsolute, relative, resolve, sep } from "node:path";\n',
'import { isAbsolute, relative, resolve, sep } from "node:path";\nimport { hostname } from "node:os";\n',
);
} else {
src = src.replace(/^(import .*?;\n)/, 'import { hostname } from "node:os";\n$1');
}
}
const oldPwdBlock = ` const pwdLine = truncateToWidth(theme.fg("dim", pwd), width, theme.fg("dim", "..."));
const lines = [pwdLine, dimStatsLeft + dimRemainder];`;
const newPwdBlock = ` // Show runtime hostname on the right of the cwd line. Use the kernel
// hostname instead of parsing FreeBSD rc.conf so Pi stays portable and
// reflects changes made after boot.
const host = hostname();
const minPwdHostPadding = 2;
let hostForLine = host;
let hostWidth = visibleWidth(hostForLine);
if (hostWidth > width) {
hostForLine = truncateToWidth(hostForLine, width, "...");
hostWidth = visibleWidth(hostForLine);
}
const availableForPwd = width - hostWidth - minPwdHostPadding;
let pwdLine;
if (hostForLine && availableForPwd > 0) {
const pwdForLine = visibleWidth(pwd) > availableForPwd ? truncateToWidth(pwd, availableForPwd, "...") : pwd;
const pwdWidth = visibleWidth(pwdForLine);
const padding = " ".repeat(Math.max(minPwdHostPadding, width - pwdWidth - hostWidth));
pwdLine = theme.fg("dim", pwdForLine) + padding + theme.fg("dim", hostForLine);
}
else if (hostForLine) {
pwdLine = theme.fg("dim", hostForLine);
}
else {
pwdLine = truncateToWidth(theme.fg("dim", pwd), width, theme.fg("dim", "..."));
}
const lines = [pwdLine, dimStatsLeft + dimRemainder];`;
if (!src.includes("const minPwdHostPadding = 2;")) {
if (!src.includes(oldPwdBlock)) {
throw new Error(`Pi footer cwd block not found in ${file}`);
}
src = src.replace(oldPwdBlock, newPwdBlock);
}
if (!src.includes('lines.push("");\n return lines;')) {
src = src.replace(' return lines;\n', ' lines.push("");\n return lines;\n');
}
fs.writeFileSync(file, src);
console.log(`patched ${file}`);