108 lines
3.7 KiB
JavaScript
108 lines
3.7 KiB
JavaScript
import { networkSettingsSchema } from "../schemas/network-schema.js";
|
|
import { log } from "../lib/logger.js";
|
|
import path from "path";
|
|
import fs from "fs/promises";
|
|
export const command = "setup-network";
|
|
export const describe = "Sets up network settings for a target host.";
|
|
const networkOptions = Object.keys(networkSettingsSchema.shape).reduce((acc, key) => {
|
|
acc[key] = {
|
|
describe: `Overrides ${key} from the settings file`,
|
|
type: 'string',
|
|
demandOption: false,
|
|
};
|
|
return acc;
|
|
}, {});
|
|
export const builder = {
|
|
targethost: {
|
|
describe: "The target host (e.g., http://192.168.1.250)",
|
|
demandOption: true,
|
|
type: "string",
|
|
default: "http://192.168.1.250",
|
|
},
|
|
file: {
|
|
describe: "Path to the network settings file",
|
|
default: "network.json",
|
|
type: "string",
|
|
},
|
|
...networkOptions,
|
|
};
|
|
async function setNetworkSettings(baseUrl, settings) {
|
|
const url = `${baseUrl}/v1/network/settings`;
|
|
log.info(`Setting network settings to ${url}`);
|
|
const response = await fetch(url, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(settings),
|
|
});
|
|
if (!response.ok) {
|
|
let errorBody = '';
|
|
try {
|
|
errorBody = await response.text();
|
|
}
|
|
catch (e) {
|
|
// Ignore
|
|
}
|
|
throw new Error(`Failed to set network settings: ${response.statusText} ${errorBody ? `- ${errorBody}` : ''}`);
|
|
}
|
|
try {
|
|
return await response.json();
|
|
}
|
|
catch (e) {
|
|
return { success: true, message: 'Network settings updated.' };
|
|
}
|
|
}
|
|
async function testConnection(baseUrl) {
|
|
try {
|
|
const response = await fetch(`${baseUrl}/v1/system/info`);
|
|
return response.ok;
|
|
}
|
|
catch (error) {
|
|
return false;
|
|
}
|
|
}
|
|
export async function handler(argv) {
|
|
log.info(`Setting up network for host: ${argv.targethost}`);
|
|
let baseUrl = argv.targethost;
|
|
baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
if (!baseUrl.endsWith('/api')) {
|
|
baseUrl = `${baseUrl}/api`;
|
|
}
|
|
try {
|
|
const isConnected = await testConnection(baseUrl);
|
|
if (!isConnected) {
|
|
log.error(`Failed to connect to ${argv.targethost}. Please check the host address and network connection.`);
|
|
return;
|
|
}
|
|
log.info(`Successfully connected to ${argv.targethost}.`);
|
|
const filePath = path.resolve(process.cwd(), argv.file);
|
|
const fileContent = await fs.readFile(filePath, "utf-8");
|
|
const settingsFromFile = JSON.parse(fileContent);
|
|
const cliOverrides = Object.keys(networkSettingsSchema.shape).reduce((acc, key) => {
|
|
if (argv[key] !== undefined && argv[key] !== null) {
|
|
acc[key] = argv[key];
|
|
}
|
|
return acc;
|
|
}, {});
|
|
const settings = { ...settingsFromFile, ...cliOverrides };
|
|
log.info("Validating network settings...", cliOverrides);
|
|
const validationResult = networkSettingsSchema.safeParse(settings);
|
|
if (!validationResult.success) {
|
|
log.error("Invalid network settings:", validationResult.error.flatten());
|
|
return;
|
|
}
|
|
log.info(`Validation successful. Applying settings to ${baseUrl}`);
|
|
const res = await setNetworkSettings(baseUrl, validationResult.data);
|
|
log.info(`Network settings applied successfully: \n\n`, { message: res.message });
|
|
}
|
|
catch (error) {
|
|
if (error instanceof Error) {
|
|
log.error(`An error occurred: ${error.message}`);
|
|
}
|
|
else {
|
|
log.error("An unknown error occurred.", error);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=setup-network.js.map
|