#!/usr/bin/perl # # 2007-06-26 # Written by Ghost # # 2008-04-16 # Update: Wildcard version # # Requirements: "rcon" command written by [ASY]Zyrain # [ http://trog.qgl.org/browse/docs/code/hl2rcon.c ] # # Configuration variables # # srcdspass - RCON password # srcdsrcon - Path to rcon command (optional) # srcdssamples - Number of samples to take (optional, default: 5) # srcdsfpsmax - Maximum FPS on the game server (optional, default: 500) # # Magic markers - optional - used by installation scripts and # munin-config: # #%# family=contrib #%# capabilities=autoconf use strict; my ($HOST, $PORT) = $0 =~ m/.*_([^:]+)_(\d+)$/; exit 1 if (!defined($HOST) || !defined($PORT)); my $PASS = $ENV{srcdspass} || ""; my $RCON = $ENV{srcdsrcon} || "/usr/local/bin/rcon"; my $SAMPLES = $ENV{srcdssamples} || 5; my $MAX = $ENV{srcdsfpsmax} || 1000; my $COMMAND = "$RCON -a$HOST -p$PORT -P$PASS stats"; my $arg = shift(); if ($arg eq 'config') { print_config(); } elsif ($arg eq 'autoconf') { test_service(); } my $fps_avg = 0; my @fps_samples; for (my $i = 0; $i < $SAMPLES; $i++) { my $statline; open (SERVICE, "$COMMAND |") or die ("Could not execute '$COMMAND': $!"); while() { $statline = $_; next if ($statline !~ m/\s*[\w+\.]+\s+[\w+\.]+\s+[\w+\.]+\s+\d+\s+\d+\s+[\w+\.]+\s+\d+/); my ($cpu, $in, $out, $uptime, $users, $fps, $players) = ($statline =~ m/^\s*([\w+\.]+)\s+([\w+\.]+)\s+([\w+\.]+)\s+(\d+)\s+(\d+)\s+([\w+\.]+)\s+(\d+)/); if (defined($fps)) { push(@fps_samples, $fps); } } select(undef, undef, undef, 0.2); # Wait moment before next sample } # MEAN if (@fps_samples) { foreach (@fps_samples) { $fps_avg += int($_); } $fps_avg /= ($#fps_samples+1); $fps_avg = int($fps_avg); print "fps.value $fps_avg\n"; } # MEDIAN #if (@fps_samples) { # @fps_samples = sort {$a <=> $b} @fps_samples; # my $median = int($#fps_samples / 2 + 0.5); # $fps_avg = $fps_samples[$median]; #} sub print_config { my $num = 0; print("graph_title Server FPS at $HOST:$PORT\n", "graph_args --base 1000\n", "graph_vlabel FPS\n", "graph_category SourceDS\n", "graph_info The number of frames per second generated by Source game server, such as HL2, CS:S and DoD:S.\n"); print ("fps.label FPS\n", "fps.min 0\n", "fps.max $MAX\n", "fps.type GAUGE\n"); exit 0; } sub test_service { my $return = 1; system ("$RCON >/dev/null 2>/dev/null"); if ($? == 0) { system ("$COMMAND >/dev/null 2>/dev/null"); if ($? == 0) { print "yes\n"; $return = 0; } else { print "no (could not connect to server $HOST:$PORT, verify address and srcdspass)\n"; } } else { print "no (rcon command not found, see install instructions)\n"; } exit $return; }