Compare commits
No commits in common. "853784e36100977c0f4b1b02f815990d39ed0062" and "3ca730ecee0be3125d71810f4f2c37f09e49cb3a" have entirely different histories.
853784e361
...
3ca730ecee
@ -1,259 +1,98 @@
|
||||
import {
|
||||
authenticateWithOtp,
|
||||
checkRunning,
|
||||
getFlagValue,
|
||||
hasFlag,
|
||||
isInfo,
|
||||
otpCode,
|
||||
printAuthCommand,
|
||||
printerHostInfo,
|
||||
setLogLevel,
|
||||
startWaiting,
|
||||
stopWaiting,
|
||||
} from "./commandlineutils.js";
|
||||
import { VALID_LOG_LEVELS } from "./logging.js";
|
||||
import chalk from "chalk";
|
||||
|
||||
async function getRunningServer(cli, logger) {
|
||||
export async function handleCommandLine(cli, logger) {
|
||||
const isCommandLines = otpCode != undefined || isInfo == true;
|
||||
let runningServer;
|
||||
try {
|
||||
startWaiting("Checking if Farm Control Server is running...", logger);
|
||||
const runningServer = await checkRunning();
|
||||
runningServer = await checkRunning();
|
||||
await stopWaiting();
|
||||
return runningServer;
|
||||
if (runningServer == false && isCommandLines == true) {
|
||||
cli.failure("Farm Control Server is not running.");
|
||||
cli.blank();
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
} catch (err) {
|
||||
await stopWaiting();
|
||||
cli.failure("Failed to check if Farm Control Server is running:", err);
|
||||
cli.blank();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function checkServerRunning(cli, logger) {
|
||||
const runningServer = await getRunningServer(cli, logger);
|
||||
if (runningServer == false) {
|
||||
cli.failure("Farm Control Server is not running.");
|
||||
cli.blank();
|
||||
return false;
|
||||
}
|
||||
if (runningServer == null) {
|
||||
return false;
|
||||
}
|
||||
cli.success("Farm Control Server is running.");
|
||||
return runningServer;
|
||||
}
|
||||
|
||||
function printServerInfo(cli, runningServer) {
|
||||
const buildNumber = runningServer.buildNumber ?? runningServer.build ?? "n/a";
|
||||
cli.blank();
|
||||
cli.sectionHeader("FarmControl Server");
|
||||
cli.label(
|
||||
"Version:",
|
||||
runningServer.version ? `v${runningServer.version}` : "n/a",
|
||||
);
|
||||
cli.label("Build:", buildNumber === "dev" ? "dev" : `b${buildNumber}`);
|
||||
cli.label("Config:", runningServer.configPath || "n/a");
|
||||
cli.label("Data Dir:", runningServer.dataDir || "n/a");
|
||||
cli.label("Connected:", cli.yesNo(runningServer.connected == true));
|
||||
cli.label("Authenticated:", cli.yesNo(runningServer.authenticated == true));
|
||||
cli.sectionFooter();
|
||||
cli.blank();
|
||||
|
||||
if (runningServer.authenticated == false && runningServer.connected == true) {
|
||||
cli.sectionHeader("Authenticate");
|
||||
printAuthCommand(cli);
|
||||
cli.sectionFooter();
|
||||
} else if (
|
||||
runningServer.connected == true &&
|
||||
runningServer.authenticated == true
|
||||
) {
|
||||
cli.sectionHeader("Host");
|
||||
printerHostInfo(runningServer.host, cli);
|
||||
cli.sectionFooter();
|
||||
}
|
||||
|
||||
cli.blank();
|
||||
}
|
||||
|
||||
function printHelp(cli) {
|
||||
cli.sectionHeader("Help");
|
||||
cli.label(
|
||||
chalk.bold.white("Usage: ") +
|
||||
chalk.bold.cyanBright("farmcontrol-server ") +
|
||||
chalk.white.dim("[options]"),
|
||||
);
|
||||
cli.sectionFooter();
|
||||
const optionsPadding = " ".repeat(9);
|
||||
cli.label(
|
||||
chalk.bold.white("Options: ") +
|
||||
chalk.bold.magentaBright("--info") +
|
||||
" Outputs server information",
|
||||
);
|
||||
cli.label(
|
||||
optionsPadding +
|
||||
chalk.bold.magentaBright("--logLevel") +
|
||||
" " +
|
||||
chalk.dim("<level>") +
|
||||
" Sets log level (" +
|
||||
chalk.bold.cyan("trace") +
|
||||
", " +
|
||||
chalk.bold.blue("debug") +
|
||||
", " +
|
||||
chalk.bold.green("info") +
|
||||
", " +
|
||||
chalk.bold.yellow("warn") +
|
||||
", " +
|
||||
chalk.bold.red("error") +
|
||||
")",
|
||||
);
|
||||
cli.label(
|
||||
optionsPadding +
|
||||
chalk.bold.magentaBright("--otp") +
|
||||
" " +
|
||||
chalk.dim("<otp>") +
|
||||
" Authenticates with OTP",
|
||||
);
|
||||
cli.sectionFooter();
|
||||
cli.blank();
|
||||
}
|
||||
|
||||
async function runOtpCommand(cli, logger, otpCode) {
|
||||
cli.blank();
|
||||
|
||||
if (otpCode == undefined) {
|
||||
cli.failure("OTP code is required.");
|
||||
cli.blank();
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
|
||||
if (!/^\d{6}$/.test(String(otpCode))) {
|
||||
cli.failure("OTP code must be a 6-digit number.");
|
||||
if (isCommandLines == true) {
|
||||
cli.success("Farm Control Server is running.");
|
||||
}
|
||||
|
||||
if (isInfo) {
|
||||
const buildNumber =
|
||||
runningServer.buildNumber ?? runningServer.build ?? "n/a";
|
||||
cli.blank();
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
|
||||
startWaiting("Authenticating with OTP...", logger);
|
||||
let authenticatedServer;
|
||||
try {
|
||||
authenticatedServer = await authenticateWithOtp(otpCode);
|
||||
await stopWaiting();
|
||||
} catch (err) {
|
||||
await stopWaiting();
|
||||
throw err;
|
||||
}
|
||||
|
||||
if (authenticatedServer.valid == false) {
|
||||
cli.failure("Failed to authenticate!");
|
||||
cli.failure(authenticatedServer.error);
|
||||
cli.blank();
|
||||
return authenticatedServer;
|
||||
}
|
||||
|
||||
cli.success("Authenticated with OTP.");
|
||||
cli.blank();
|
||||
cli.sectionHeader("Host");
|
||||
printerHostInfo(authenticatedServer.host, cli);
|
||||
cli.sectionFooter();
|
||||
cli.blank();
|
||||
return authenticatedServer;
|
||||
}
|
||||
|
||||
async function runLogLevelCommand(cli, logger, level) {
|
||||
cli.blank();
|
||||
|
||||
if (level == undefined) {
|
||||
cli.failure("Log level is required.");
|
||||
cli.blank();
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
|
||||
const normalized = String(level).toLowerCase();
|
||||
if (!VALID_LOG_LEVELS.includes(normalized)) {
|
||||
cli.failure(
|
||||
`Invalid log level. Must be one of: ${VALID_LOG_LEVELS.join(", ")}`,
|
||||
cli.sectionHeader("FarmControl Server");
|
||||
cli.label(
|
||||
"Version:",
|
||||
runningServer.version ? `v${runningServer.version}` : "n/a",
|
||||
);
|
||||
cli.label("Build:", buildNumber === "dev" ? "dev" : `b${buildNumber}`);
|
||||
cli.label("Config:", runningServer.configPath || "n/a");
|
||||
cli.label("Data Dir:", runningServer.dataDir || "n/a");
|
||||
cli.label("Connected:", cli.yesNo(runningServer.connected == true));
|
||||
cli.label("Authenticated:", cli.yesNo(runningServer.authenticated == true));
|
||||
cli.sectionFooter();
|
||||
cli.blank();
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
|
||||
startWaiting("Setting log level...", logger);
|
||||
let result;
|
||||
try {
|
||||
result = await setLogLevel(normalized);
|
||||
await stopWaiting();
|
||||
} catch (err) {
|
||||
await stopWaiting();
|
||||
throw err;
|
||||
}
|
||||
|
||||
if (result.valid == false) {
|
||||
cli.failure("Failed to set log level!");
|
||||
cli.failure(result.error);
|
||||
cli.blank();
|
||||
return result;
|
||||
}
|
||||
|
||||
cli.success(`Log level set to ${result.logLevel}.`);
|
||||
cli.blank();
|
||||
return result;
|
||||
}
|
||||
|
||||
const commands = [
|
||||
{
|
||||
matches: () => hasFlag("info"),
|
||||
run: async ({ cli, logger }) => {
|
||||
const runningServer = await checkServerRunning(cli, logger);
|
||||
if (runningServer == false) {
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
printServerInfo(cli, runningServer);
|
||||
return { handled: true, result: true };
|
||||
},
|
||||
},
|
||||
{
|
||||
matches: () => hasFlag("help") || hasFlag("h"),
|
||||
run: async ({ cli }) => {
|
||||
printHelp(cli);
|
||||
return true;
|
||||
},
|
||||
},
|
||||
{
|
||||
matches: () =>
|
||||
getFlagValue("logLevel") != undefined || hasFlag("logLevel"),
|
||||
run: async ({ cli, logger }) => {
|
||||
const runningServer = await checkServerRunning(cli, logger);
|
||||
if (runningServer == false) {
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
const result = await runLogLevelCommand(
|
||||
cli,
|
||||
logger,
|
||||
getFlagValue("logLevel"),
|
||||
);
|
||||
return { handled: true, result };
|
||||
},
|
||||
},
|
||||
{
|
||||
matches: () => getFlagValue("otp") != undefined || hasFlag("otp"),
|
||||
run: async ({ cli, logger }) => {
|
||||
const runningServer = await checkServerRunning(cli, logger);
|
||||
if (runningServer == false) {
|
||||
return { handled: true, result: false };
|
||||
}
|
||||
const result = await runOtpCommand(cli, logger, getFlagValue("otp"));
|
||||
return { handled: true, result };
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
export async function handleCommandLine(cli, logger) {
|
||||
const command = commands.find((entry) => entry.matches());
|
||||
|
||||
if (!command) {
|
||||
const runningServer = await getRunningServer(cli, logger);
|
||||
if (runningServer == null) {
|
||||
return { handled: true, result: false };
|
||||
if (
|
||||
runningServer.authenticated == false &&
|
||||
runningServer.connected == true
|
||||
) {
|
||||
cli.sectionHeader("Authenticate");
|
||||
printAuthCommand(cli);
|
||||
cli.sectionFooter();
|
||||
} else if (
|
||||
runningServer.connected == true &&
|
||||
runningServer.authenticated == true
|
||||
) {
|
||||
cli.sectionHeader("Host");
|
||||
printerHostInfo(runningServer.host, cli);
|
||||
cli.sectionFooter();
|
||||
}
|
||||
return { handled: false, runningServer };
|
||||
cli.blank();
|
||||
return { handled: true, result: runningServer };
|
||||
}
|
||||
|
||||
const result = await command.run({ cli, logger });
|
||||
return { handled: true, result };
|
||||
if (otpCode != undefined) {
|
||||
cli.blank();
|
||||
startWaiting("Authenticating with OTP...", logger);
|
||||
let authenticatedServer;
|
||||
try {
|
||||
authenticatedServer = await authenticateWithOtp(otpCode);
|
||||
await stopWaiting();
|
||||
} catch (err) {
|
||||
await stopWaiting();
|
||||
throw err;
|
||||
}
|
||||
if (authenticatedServer.valid == false) {
|
||||
cli.failure("Failed to authenticate!");
|
||||
cli.failure(authenticatedServer.error);
|
||||
} else {
|
||||
cli.success("Authenticated with OTP.");
|
||||
cli.blank();
|
||||
cli.sectionHeader("Host");
|
||||
printerHostInfo(authenticatedServer.host, cli);
|
||||
cli.sectionFooter();
|
||||
cli.blank();
|
||||
return { handled: true, result: authenticatedServer };
|
||||
}
|
||||
cli.blank();
|
||||
return { handled: true, result: authenticatedServer };
|
||||
}
|
||||
|
||||
return { handled: false, runningServer };
|
||||
}
|
||||
|
||||
@ -102,11 +102,7 @@ export function createCliLogger(logger) {
|
||||
}),
|
||||
|
||||
label: withSpinnerStopped((key, value) => {
|
||||
if (value == undefined) {
|
||||
logger.info(key);
|
||||
} else {
|
||||
logger.info(chalk.bold(key), value);
|
||||
}
|
||||
logger.info(chalk.bold(key), value);
|
||||
}),
|
||||
|
||||
yesNo(value) {
|
||||
@ -123,32 +119,23 @@ export function createCliLogger(logger) {
|
||||
return cli;
|
||||
}
|
||||
|
||||
export function hasFlag(name) {
|
||||
return (
|
||||
process.argv.includes(`--${name}`) || process.argv.includes(`-${name}`)
|
||||
);
|
||||
}
|
||||
export function getArgValue(flag) {
|
||||
const withEquals = process.argv.find((arg) => arg.startsWith(`${flag}=`));
|
||||
if (withEquals) {
|
||||
return withEquals.slice(flag.length + 1);
|
||||
}
|
||||
|
||||
export function getFlagValue(name) {
|
||||
for (const prefix of [`--${name}`, `-${name}`]) {
|
||||
const withEquals = process.argv.find((arg) => arg.startsWith(`${prefix}=`));
|
||||
if (withEquals) {
|
||||
return withEquals.slice(prefix.length + 1);
|
||||
}
|
||||
|
||||
const index = process.argv.indexOf(prefix);
|
||||
if (index !== -1 && index + 1 < process.argv.length) {
|
||||
const next = process.argv[index + 1];
|
||||
if (!next.startsWith("-")) {
|
||||
return next;
|
||||
}
|
||||
}
|
||||
const index = process.argv.indexOf(flag);
|
||||
if (index !== -1 && index + 1 < process.argv.length) {
|
||||
return process.argv[index + 1];
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
export const isHeadless = process.argv.includes("--headless");
|
||||
export const isInfo = process.argv.includes("--info");
|
||||
export const otpCode = getArgValue("--otp") || undefined;
|
||||
|
||||
export function printerHostInfo(host, cli) {
|
||||
let ref = host?._reference || "Unknown";
|
||||
@ -176,7 +163,7 @@ export function printerHostInfo(host, cli) {
|
||||
export function printAuthCommand(cli) {
|
||||
cli.info(
|
||||
"Run '" +
|
||||
chalk.bold.magentaBright("farmcontrol-server") +
|
||||
chalk.bold.white("farmcontrol-server") +
|
||||
" " +
|
||||
chalk.bold.magentaBright("--otp") +
|
||||
" " +
|
||||
@ -214,19 +201,3 @@ export async function authenticateWithOtp(code) {
|
||||
throw new Error("Failed to authenticate with OTP");
|
||||
}
|
||||
}
|
||||
|
||||
export async function setLogLevel(level) {
|
||||
try {
|
||||
const response = await axios.post(
|
||||
`http://127.0.0.1:${LOCAL_SERVER_PORT}/logLevel`,
|
||||
{ logLevel: level },
|
||||
{ timeout: 5000 },
|
||||
);
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
if (err.response?.data) {
|
||||
return err.response.data;
|
||||
}
|
||||
throw new Error("Failed to set log level");
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,7 +2,6 @@ import express from "express";
|
||||
import log4js from "log4js";
|
||||
import { notPrompting } from "../utils.js";
|
||||
import { getConfigPath, loadConfig } from "../config.js";
|
||||
import { applyLogLevel } from "../logging.js";
|
||||
import { getServerVersionInfo } from "../serverVersion.js";
|
||||
import { startWaiting, stopWaiting } from "../spinner.js";
|
||||
|
||||
@ -72,31 +71,6 @@ export class LocalServer {
|
||||
res.status(500).json({ error: err.message });
|
||||
}
|
||||
});
|
||||
|
||||
this.app.post("/logLevel", async (req, res) => {
|
||||
logger.debug("Received request to set log level");
|
||||
const { logLevel } = req.body;
|
||||
|
||||
if (!logLevel) {
|
||||
res.status(400).json({ valid: false, error: "logLevel is required" });
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await applyLogLevel(logLevel);
|
||||
|
||||
if (!result.valid) {
|
||||
res.status(400).json(result);
|
||||
return;
|
||||
}
|
||||
|
||||
logger.level = result.logLevel;
|
||||
res.json(result);
|
||||
} catch (err) {
|
||||
logger.error("Failed to set log level:", err);
|
||||
res.status(500).json({ valid: false, error: err.message });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
start() {
|
||||
|
||||
@ -1,26 +0,0 @@
|
||||
import log4js from "log4js";
|
||||
import { loadConfig, saveConfig } from "./config.js";
|
||||
|
||||
export const VALID_LOG_LEVELS = ["trace", "debug", "info", "warn", "error"];
|
||||
|
||||
export async function applyLogLevel(level) {
|
||||
const normalized = String(level || "").toLowerCase();
|
||||
|
||||
if (!VALID_LOG_LEVELS.includes(normalized)) {
|
||||
return {
|
||||
valid: false,
|
||||
error: `Invalid log level. Must be one of: ${VALID_LOG_LEVELS.join(", ")}`,
|
||||
};
|
||||
}
|
||||
|
||||
const config = loadConfig();
|
||||
config.logLevel = normalized;
|
||||
await saveConfig(config);
|
||||
|
||||
log4js.configure({
|
||||
appenders: { out: { type: "stdout" } },
|
||||
categories: { default: { appenders: ["out"], level: normalized } },
|
||||
});
|
||||
|
||||
return { valid: true, logLevel: normalized };
|
||||
}
|
||||
@ -147,7 +147,7 @@ export class PrinterDatabase {
|
||||
});
|
||||
|
||||
logger.info(
|
||||
`Updated printer: ${chalk.bold.white(this.printer.name)}, State: ${chalk.bold.white(formatState(state.type))}${state?.progress ? ` (${state.progress})` : ""} (${online ? chalk.green("Online") : chalk.dim.white("Offline")})`,
|
||||
`Updated printer: ${chalk.bold.white(this.printer.name)}, State: ${chalk.bold.white(formatState(this.printer.state.type))}${state?.progress ? ` (${state.progress})` : ""} (${online ? chalk.green("Online") : chalk.dim.white("Offline")})`,
|
||||
);
|
||||
|
||||
return updatedPrinter;
|
||||
|
||||
@ -63,10 +63,9 @@ export class PrinterManager {
|
||||
}
|
||||
}
|
||||
|
||||
await stopWaiting();
|
||||
|
||||
logger.debug("Printers added:", addedPrintersCount);
|
||||
logger.debug("Printers removed:", removedPrintersCount);
|
||||
await stopWaiting();
|
||||
} catch (error) {
|
||||
await stopWaiting();
|
||||
logger.error("Failed to update printers:", error);
|
||||
|
||||
@ -221,9 +221,9 @@ export class SocketClient {
|
||||
this.id = this.host._id;
|
||||
|
||||
config.host = { id: this.id, authCode: this.host.authCode };
|
||||
|
||||
await saveConfig(config);
|
||||
|
||||
if (logs) {
|
||||
await saveConfig(config);
|
||||
}
|
||||
this.sendDeviceInfo();
|
||||
this.subscribeToObjectEvents();
|
||||
this.subscribeToObjectUpdates({ objectType: "host", _id: this.id });
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user