module L4dServer class HealthChecker def self.check(server) new(server).check end def initialize(server) @server = server end def check # First check if systemd thinks the service is active status = SystemdManager.status(@server) case status when "active" check_rcon when "inactive", "failed" :stopped else :unknown end end private def check_rcon # Try to connect via RCON to verify server is actually responding socket = UDPSocket.new socket.connect("127.0.0.1", @server.port) # Build a simple RCON auth packet for L4D2 # Format: 0xFFFFFFFF + "challenge rcon_password" packet = "\xFF\xFF\xFF\xFFchallenge #{@server.rcon_password}\n" socket.send(packet, 0) socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, 1) # 1 second timeout response = socket.recv(4096) socket.close response.length > 0 ? :running : :failed rescue Timeout::Error, Errno::ECONNREFUSED, StandardError => e Rails.logger.debug("RCON health check failed: #{e.message}") :failed end end end