alks
Version:
CLI for working with ALKS
117 lines • 6.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleAlksServerStart = void 0;
const tslib_1 = require("tslib");
const cli_color_1 = tslib_1.__importDefault(require("cli-color"));
const child_process_1 = require("child_process");
const path_1 = tslib_1.__importDefault(require("path"));
const errorAndExit_1 = require("../errorAndExit");
const isOsx_1 = require("../isOsx");
const log_1 = require("../log");
const fs_1 = tslib_1.__importDefault(require("fs"));
const os_1 = tslib_1.__importDefault(require("os"));
const PID_FILE = path_1.default.join(os_1.default.tmpdir(), 'alks-metadata-server.pid');
const LOG_FILE = path_1.default.join(os_1.default.homedir(), '.alks', 'metadata-server.log');
function runServerDaemon() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
console.error(cli_color_1.default.white('Starting metadata server..'));
// Ensure .alks directory exists
const alksDir = path_1.default.join(os_1.default.homedir(), '.alks');
if (!fs_1.default.existsSync(alksDir)) {
fs_1.default.mkdirSync(alksDir, { recursive: true });
}
const serverPath = path_1.default.join(__dirname, '../metadata-server.js');
// Spawn the server as a detached process
const logStream = fs_1.default.openSync(LOG_FILE, 'a');
const server = (0, child_process_1.spawn)('node', [serverPath], {
detached: true,
stdio: ['ignore', logStream, logStream],
});
// Write PID file
fs_1.default.writeFileSync(PID_FILE, server.pid.toString(), 'utf8');
// Unref so parent can exit
server.unref();
// Give it a moment to start
yield new Promise((resolve) => setTimeout(resolve, 1000));
console.error(cli_color_1.default.white('Metadata server now listening on: 169.254.169.254'));
console.error(cli_color_1.default.white(`Server logs: ${LOG_FILE}`));
});
}
function handleAlksServerStart(_options) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
try {
if (!(0, isOsx_1.isOsx)()) {
(0, errorAndExit_1.errorAndExit)('The metadata server is only supported on OSX.');
}
(0, log_1.log)('Checking if forwarding daemon is installed..');
const anchorExists = fs_1.default.existsSync('/etc/pf.anchors/com.coxautodev.alks');
const plistExists = fs_1.default.existsSync('/Library/LaunchDaemons/com.coxautodev.alks.Ec2MetaDataFirewall.plist');
// Install files if they don't exist
if (!anchorExists || !plistExists) {
console.error(cli_color_1.default.white('Installing metadata daemon rules. You may be prompted for your system password since this requires escalated privileges.'));
const servicePath = path_1.default.join(__dirname, '../../../../service');
try {
if (!anchorExists) {
(0, log_1.log)('Adding pf.anchor');
(0, child_process_1.execSync)('sudo cp ' + servicePath + '/com.coxautodev.alks /etc/pf.anchors/');
}
if (!plistExists) {
(0, log_1.log)('Adding launch daemon');
(0, child_process_1.execSync)('sudo cp ' +
servicePath +
'/com.coxautodev.alks.Ec2MetaDataFirewall.plist /Library/LaunchDaemons/');
}
}
catch (err) {
console.log(cli_color_1.default.red('Error installing metadata daemon.'), err);
}
console.log(cli_color_1.default.white('Successfully installed metadata daemon files.'));
}
// Ensure daemon is loaded
if (plistExists || !anchorExists) {
console.error(cli_color_1.default.white('Ensuring metadata daemon is loaded. You may be prompted for your system password.'));
try {
(0, log_1.log)('Loading launch daemon..');
// Try modern bootstrap command first (macOS 10.11+)
try {
(0, child_process_1.execSync)('sudo launchctl bootstrap system /Library/LaunchDaemons/com.coxautodev.alks.Ec2MetaDataFirewall.plist 2>&1', { encoding: 'utf-8' });
(0, log_1.log)('Launch daemon loaded successfully.');
}
catch (bootstrapErr) {
const errMsg = bootstrapErr.stderr || bootstrapErr.stdout || '';
// If already loaded or service is running, that's fine
if (errMsg.includes('Already loaded') ||
errMsg.includes('service is running')) {
(0, log_1.log)('Launch daemon is already running.');
}
else {
// Fall back to legacy load command
(0, child_process_1.execSync)('sudo launchctl load -w /Library/LaunchDaemons/com.coxautodev.alks.Ec2MetaDataFirewall.plist 2>&1', { encoding: 'utf-8' });
(0, log_1.log)('Launch daemon loaded successfully.');
}
}
}
catch (err) {
const errMsg = err.stderr ||
err.stdout ||
err.message ||
'';
if (errMsg.includes('Already loaded') ||
errMsg.includes('service is running')) {
(0, log_1.log)('Launch daemon is already running.');
}
else {
console.log(cli_color_1.default.red('Error loading metadata daemon:'), errMsg);
}
}
}
yield runServerDaemon();
}
catch (er) {
const e = er;
(0, errorAndExit_1.errorAndExit)(e.message, e);
}
});
}
exports.handleAlksServerStart = handleAlksServerStart;
//# sourceMappingURL=alks-server-start.js.map