47 lines
1.1 KiB
Ruby
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
|