#!/usr/bin/env node process.env.NODE_ENV = process.env.NODE_ENV || "production"; require("yargs/yargs")(process.argv.slice(2)) .help() .demandCommand() .strict(true) .command( "__authenticate", // Internal only function - this function will be removed when API keys are implemented false, // hide this function cli help () => {}, async () => { const { getAuthCookie } = require("../src/utils"); console.log(await getAuthCookie(true)); } ) .command( "enable", "Mark portal as enabled", () => {}, () => { const db = require("../src/db"); db.set("disabled", false).write(); } ) .command( "disable ", "Mark portal as disabled (provide meaningful reason)", () => {}, ({ reason }) => { const db = require("../src/db"); db.set("disabled", reason).write(); } ) .command( "run ", "Skynet portal health checks", (yargs) => { yargs .positional("type", { describe: "Type of checks to run", type: "string", choices: ["critical", "extended"], }) .option("portal-url", { describe: "Skynet portal url", default: process.env.PORTAL_DOMAIN ? `https://${process.env.PORTAL_DOMAIN}` : "https://siasky.net", type: "string", }) .option("state-dir", { describe: "State directory", default: process.env.STATE_DIR || "state", type: "string", }); }, async ({ type, portalUrl, stateDir }) => { const { hostname: portalDomain } = new URL(portalUrl); // extract domain from portal url process.env.PORTAL_DOMAIN = portalDomain; process.env.STATE_DIR = stateDir; const util = require("util"); const { getYesterdayISOString } = require("../src/utils"); const createMiddleware = require("../src/checks/middleware"); const db = require("../src/db"); const checks = require(`../src/checks/${type}`); const middleware = await createMiddleware(); const entry = { date: new Date().toISOString(), checks: (await Promise.all(checks.map((check) => new Promise(check)))).filter(Boolean).map(middleware), }; db.read() // read before writing to make sure no external changes are overwritten .get(type) // get the list of records of given type .push(entry) // insert new record .remove(({ date }) => date < getYesterdayISOString()) // drop old records .write(); // exit with code 1 if any of the checks report failure if (entry.checks.some(({ up }) => !up)) { console.log( util.inspect( entry.checks.filter(({ up }) => !up), { colors: true, depth: 7 } // increase depth to ensure errors are printed ) ); process.exit(1); } } ).argv;