Files
skipper/scripts/register-node.js
2026-04-05 15:28:04 +02:00

87 lines
2.0 KiB
JavaScript

const path = require('path');
const { randomBytes } = require('crypto');
const { writeJson } = require('../shared/fs');
const { dataDir } = require('../shared/paths');
function getArg(flag, fallback) {
const index = process.argv.indexOf(flag);
if (index === -1 || index + 1 >= process.argv.length) {
return fallback;
}
return process.argv[index + 1];
}
function nowIso() {
return new Date().toISOString();
}
function randomTokenHex(bytes) {
return randomBytes(bytes).toString('hex');
}
async function registerNode({ nodeId, role, region, token }) {
const createdAt = nowIso();
const nodeFile = path.join(dataDir, 'resources', 'nodes', `${nodeId}.json`);
const tokenFile = path.join(dataDir, 'auth', 'nodes', `${nodeId}.json`);
await writeJson(nodeFile, {
id: nodeId,
resource_type: 'node',
schema_version: 'v1',
desired_state: {
enabled: true,
labels: {
role,
region,
},
},
current_state: {},
last_applied_state: {},
metadata: {},
created_at: createdAt,
updated_at: createdAt,
});
await writeJson(tokenFile, {
node_id: nodeId,
token,
schema_version: 'v1',
updated_at: createdAt,
});
return {
node_id: nodeId,
token,
node_file: nodeFile,
token_file: tokenFile,
};
}
async function main() {
const nodeId = getArg('--node-id', process.env.NODE_ID);
const role = getArg('--role', process.env.NODE_ROLE || 'worker');
const region = getArg('--region', process.env.NODE_REGION || 'default');
const token = getArg('--token', process.env.NODE_TOKEN || randomTokenHex(32));
if (!nodeId) {
throw new Error('Missing node id. Use --node-id <id> or NODE_ID=<id>.');
}
const result = await registerNode({ nodeId, role, region, token });
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
}
if (require.main === module) {
main().catch((error) => {
process.stderr.write(`${error.message}\n`);
process.exit(1);
});
}
module.exports = {
registerNode,
randomTokenHex,
};