File: //data/silvera-firewall-app/test_force_sync.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 < 60) { // Longer timeout for force sync
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, 1000)); // Wait 1 second
attempts++;
}
}
throw new Error('BitNinja command timeout');
} catch (error) {
console.error('BitNinja bridge error:', error);
return { success: false, message: error.message };
}
}
async function testForceSync() {
try {
console.log('š Testing FORCE SYNC functionality...');
console.log('ā ļø This will restart BitNinja service and take ~15-20 seconds');
const startTime = Date.now();
// Test force sync
const result = await executeBitNinjaCommand('force_sync', '');
const endTime = Date.now();
const duration = Math.round((endTime - startTime) / 1000);
console.log(`š FORCE SYNC completed in ${duration} seconds`);
console.log('Success:', result.success);
console.log('Raw result:');
console.log(result.message);
if (result.success) {
// Parse IPs
const lines = result.message.split('\n').filter(line => line.trim());
const ips = [];
for (const line of lines) {
const trimmedLine = line.trim();
if (trimmedLine.startsWith('Starting force sync')) continue;
if (/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/.test(trimmedLine)) {
ips.push(trimmedLine);
}
}
console.log(`\nā
FORCE SYNC Results:`);
console.log(`š Found ${ips.length} verified IPs:`);
ips.forEach(ip => console.log(` š ${ip}`));
// Compare with database
const dbResult = await pool.query("SELECT ip_address FROM ip_whitelist ORDER BY ip_address");
const dbIPs = dbResult.rows.map(row => row.ip_address);
console.log(`\nš Database has ${dbIPs.length} IPs:`);
dbIPs.forEach(ip => console.log(` š¾ ${ip}`));
console.log(`\nš Comparison:`);
const matches = ips.every(ip => dbIPs.includes(ip)) && dbIPs.every(ip => ips.includes(ip));
console.log(`${matches ? 'ā
PERFECT MATCH' : 'ā MISMATCH'}`);
if (!matches) {
const missing = ips.filter(ip => !dbIPs.includes(ip));
const extra = dbIPs.filter(ip => !ips.includes(ip));
if (missing.length) console.log(`Missing in DB: ${missing.join(', ')}`);
if (extra.length) console.log(`Extra in DB: ${extra.join(', ')}`);
}
}
process.exit(0);
} catch (error) {
console.error('Force sync test failed:', error);
process.exit(1);
}
}
testForceSync();