File: //data/silvera-firewall-app/test_autosync.js
const { Pool } = require('pg');
const fs = require('fs').promises;
const path = require('path');
const pool = new Pool({
host: 'database',
port: 5432,
database: 'silvera_firewall',
user: 'admin',
password: 'silvera_firewall_2024',
});
const BRIDGE_DIR = '/app/bitninja_bridge';
const COMMAND_FILE = path.join(BRIDGE_DIR, 'command.txt');
const RESULT_FILE = path.join(BRIDGE_DIR, 'result.txt');
async function executeBitNinjaCommand(action, ip, comment = '') {
try {
const command = `${action} ${ip} ${comment}\n`;
await fs.writeFile(COMMAND_FILE, command);
let attempts = 0;
while (attempts < 30) {
try {
await fs.access(RESULT_FILE);
const result = await fs.readFile(RESULT_FILE, 'utf8');
await fs.unlink(RESULT_FILE);
return { success: true, message: result.trim() };
} catch {
await new Promise(resolve => setTimeout(resolve, 100));
attempts++;
}
}
throw new Error('BitNinja command timeout');
} catch (error) {
console.error('BitNinja bridge error:', error);
return { success: false, message: error.message };
}
}
async function getBitNinjaWhitelist() {
try {
const result = await executeBitNinjaCommand('list', '');
if (!result.success) {
return [];
}
const lines = result.message.split('\n').filter(line => line.trim());
const ips = [];
for (const line of lines) {
const trimmedLine = line.trim();
if (/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/.test(trimmedLine)) {
ips.push(trimmedLine);
}
}
return ips;
} catch (error) {
console.error('BitNinja list error:', error);
return [];
}
}
async function testAutoSync() {
try {
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] Testing auto-sync functionality...`);
// Test BitNinja connection
const bitninjaIPs = await getBitNinjaWhitelist();
console.log(`[${timestamp}] Found ${bitninjaIPs.length} IPs from BitNinja:`, bitninjaIPs);
// Check database current state
const dbResult = await pool.query("SELECT COUNT(*), array_agg(ip_address) FROM ip_whitelist");
console.log(`[${timestamp}] Database currently has ${dbResult.rows[0].count} IPs:`, dbResult.rows[0].array_agg);
console.log(`[${timestamp}] Auto-sync test completed successfully!`);
console.log(`[${timestamp}] ✅ BitNinja bridge working: ${bitninjaIPs.length > 0}`);
console.log(`[${timestamp}] ✅ Database accessible: ${dbResult.rows[0].count >= 0}`);
// Test if auto-sync will work by simulating it
let syncNeeded = false;
for (const ip of bitninjaIPs) {
const existing = await pool.query("SELECT id FROM ip_whitelist WHERE ip_address = $1", [ip]);
if (existing.rows.length === 0) {
syncNeeded = true;
console.log(`[${timestamp}] Would sync new IP: ${ip}`);
}
}
if (!syncNeeded) {
console.log(`[${timestamp}] ✅ All BitNinja IPs already in database - auto-sync maintenance mode working`);
}
process.exit(0);
} catch (error) {
console.error('Test failed:', error);
process.exit(1);
}
}
testAutoSync();