l4d.tools/lib/l4d_server/health_checker.rb
2026-01-18 17:42:32 +01:00

47 lines
1.1 KiB
Ruby

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