UNPKG

alks

Version:
117 lines 6.26 kB
"use strict"; 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