#!/usr/bin/env ruby require_relative '../lib/wzombi/config' require_relative '../lib/wzombi/server' require_relative '../lib/wzombi/command_store' base = File.expand_path("..", __dir__) config = WZombi::Config.new(base_path: base) def help puts <<~HELP Uso: w-zombi start Inicia servidor WEBrick w-zombi cmd "" EnvΓ­a comando al zombi w-zombi relay start [port] Inicia relay socat en host remoto w-zombi relay stop Detiene relay en host remoto w-zombi relay status Estado del relay en host remoto w-zombi relay ps1 Genera PS1 para conectar vΓ­a relay w-zombi ayuda | -h | -help Ejemplo relay: w-zombi relay start srv-dasu 8001 # Relay en srv-dasu:8001 β†’ NS8:8000 w-zombi relay ps1 192.168.1.13 # PS1 que apunta al relay w-zombi relay stop srv-dasu # Detener relay HELP end cmd = ARGV[0] case cmd when "start" WZombi::Server.new(config).start when "cmd" command = ARGV[1] if command.nil? puts "Falta comando" exit end store = WZombi::CommandStore.new(config.cmd_path) store.update(command) puts "Comando actualizado: #{command}" when "relay" subcmd = ARGV[1] case subcmd when "start" host = ARGV[2] port = ARGV[3] || "8001" unless host puts "Falta host. Uso: w-zombi relay start [port]" exit 1 end ns8_ip = ENV.fetch("WZ_NS8_IP", "100.111.195.4") ns8_port = config.puerto puts "🧟 Relay W-Zombi β†’ #{host}:#{port} β†’ NS8(#{ns8_ip}:#{ns8_port})" # Matar relay anterior si existe system("ssh #{host} 'pkill -f \"socat.*TCP-LISTEN:#{port}\"' 2>/dev/null") sleep 0.5 # Lanzar socat relay socat_cmd = "socat TCP-LISTEN:#{port},fork,reuseaddr,bind=0.0.0.0 TCP:#{ns8_ip}:#{ns8_port}" result = system("ssh #{host} 'nohup #{socat_cmd} > /tmp/wzombi-relay.log 2>&1 & echo PID:$!'") if result # Verificar sleep 1 test = `ssh #{host} "curl -s --connect-timeout 3 http://localhost:#{port}/cmd.json" 2>/dev/null`.strip if test.include?('"cmd"') puts "βœ… Relay activo β€” #{host}:#{port} β†’ NS8:#{ns8_port}" puts " Test: #{test}" puts "\n Para generar PS1: w-zombi relay ps1 " else puts "⚠️ Relay lanzado pero no responde. Revisar logs en #{host}:/tmp/wzombi-relay.log" end else puts "❌ Error lanzando relay en #{host}" exit 1 end when "stop" host = ARGV[2] port = ARGV[3] || "8001" unless host puts "Falta host. Uso: w-zombi relay stop [port]" exit 1 end system("ssh #{host} 'pkill -f \"socat.*TCP-LISTEN:#{port}\"' 2>/dev/null") puts "πŸ›‘ Relay detenido en #{host}:#{port}" when "status" host = ARGV[2] port = ARGV[3] || "8001" unless host puts "Falta host. Uso: w-zombi relay status [port]" exit 1 end output = `ssh #{host} "ss -tlnp 2>/dev/null | grep :#{port}; echo '---'; curl -s --connect-timeout 3 http://localhost:#{port}/cmd.json 2>/dev/null || echo 'NO_RESPONSE'" 2>&1`.strip lines = output.split("---") listening = lines[0]&.include?(port.to_s) response = lines[1]&.strip if listening && response&.include?('"cmd"') puts "βœ… Relay ACTIVO en #{host}:#{port}" puts " Respuesta: #{response}" elsif listening puts "⚠️ Relay escuchando en #{host}:#{port} pero sin respuesta del backend" else puts "❌ Relay NO activo en #{host}:#{port}" end when "ps1" relay_ip = ARGV[2] relay_port = ARGV[3] || "8001" unless relay_ip puts "Falta IP del relay. Uso: w-zombi relay ps1 [port]" exit 1 end # Generar PS1 que apunta al relay en vez de NS8 directo require_relative '../lib/wzombi/engine/ps1_builder' host = "#{relay_ip}:#{relay_port}" ps1 = WZombi::Engine::PS1Builder.build(host: host) puts ps1 else puts "Subcomando relay desconocido: #{subcmd}" puts "Uso: w-zombi relay start|stop|status|ps1 " exit 1 end when "ayuda", "-h", "-help", nil help else puts "Comando desconocido" help end