HEX
Server: LiteSpeed
System: Linux CentOS-79-64-minimal 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: vishn3436 (5293)
PHP: 8.0.15
Disabled: NONE
Upload Files
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();