clawdie-ai/setup/environment.ts
2026-03-07 21:55:25 +01:00

94 lines
2.5 KiB
TypeScript

/**
* Step: environment — Detect FreeBSD/jail prerequisites and existing config.
*/
import fs from 'fs';
import path from 'path';
import { execSync } from 'child_process';
import Database from 'better-sqlite3';
import { STORE_DIR } from '../src/config.js';
import { logger } from '../src/logger.js';
import { commandExists, getPlatform, isHeadless } from './platform.js';
import { emitStatus } from './status.js';
export async function run(_args: string[]): Promise<void> {
const projectRoot = process.cwd();
logger.info('Starting environment check');
const platform = getPlatform();
const headless = isHeadless();
const jexec = commandExists('jexec');
const jls = commandExists('jls');
const service = commandExists('service');
const jailConf = fs.existsSync('/etc/jail.conf');
let jailed = false;
try {
jailed =
execSync('sysctl -n security.jail.jailed', {
encoding: 'utf-8',
stdio: ['ignore', 'pipe', 'ignore'],
}).trim() === '1';
} catch {
jailed = false;
}
// Check existing config
const hasEnv = fs.existsSync(path.join(projectRoot, '.env'));
const authDir = path.join(projectRoot, 'store', 'auth');
const hasAuth = fs.existsSync(authDir) && fs.readdirSync(authDir).length > 0;
let hasRegisteredGroups = false;
// Check JSON file first (pre-migration)
if (fs.existsSync(path.join(projectRoot, 'data', 'registered_groups.json'))) {
hasRegisteredGroups = true;
} else {
// Check SQLite directly using better-sqlite3 (no sqlite3 CLI needed)
const dbPath = path.join(STORE_DIR, 'messages.db');
if (fs.existsSync(dbPath)) {
try {
const db = new Database(dbPath, { readonly: true });
const row = db
.prepare('SELECT COUNT(*) as count FROM registered_groups')
.get() as { count: number };
if (row.count > 0) hasRegisteredGroups = true;
db.close();
} catch {
// Table might not exist yet
}
}
}
logger.info(
{
platform,
jailed,
jexec,
jls,
service,
jailConf,
hasEnv,
hasAuth,
hasRegisteredGroups,
},
'Environment check complete',
);
emitStatus('CHECK_ENVIRONMENT', {
PLATFORM: platform,
IS_HEADLESS: headless,
IS_JAILED: jailed,
JEXEC: jexec,
JLS: jls,
SERVICE: service,
JAIL_CONF: jailConf,
HAS_ENV: hasEnv,
HAS_AUTH: hasAuth,
HAS_REGISTERED_GROUPS: hasRegisteredGroups,
STATUS: 'success',
LOG: 'logs/setup.log',
});
}