root / plugins / games / game @ 17f78427
Historique | Voir | Annoter | Télécharger (7,64 ko)
| 1 |
#!/usr/bin/php |
|---|---|
| 2 |
<?php |
| 3 |
|
| 4 |
/* |
| 5 |
* README |
| 6 |
* This plugin makes use of the GameQ library to be able to query many different |
| 7 |
* types of game servers and display the results in munin. You can see a list of |
| 8 |
* supported games at http://gameq.sourceforge.net/#games |
| 9 |
* |
| 10 |
* This plugin has 2 environment variables: |
| 11 |
* game_config_file - Defaults to /etc/munin/munin-game.ini. The location of the config file |
| 12 |
* game_state_file - Defaults to /var/lib/munin/plugin-state/game. The location of the munin state directory |
| 13 |
* |
| 14 |
* (Probably) FAQ |
| 15 |
* Q: Why PHP? |
| 16 |
* A: The GameQ library is written in PHP, so it was either that or rewrite the entire library. |
| 17 |
* |
| 18 |
* Q: Why have you used a config file instead of environment variables? |
| 19 |
* A: Way too much to fit data inside an environment variable unfortunately. Imagine |
| 20 |
* trying to fit information about 50 servers all inside one variable. |
| 21 |
* |
| 22 |
* Q: I want to ask you a question! |
| 23 |
* A: I'm on most IRC networks under the nick Azelphur, or email me. support@azelphur.com |
| 24 |
* |
| 25 |
* Q: It's not working! |
| 26 |
* A: Try running ./game autoconf, it'll probably tell you what's up. |
| 27 |
*/ |
| 28 |
|
| 29 |
// Check environment variables |
| 30 |
$var = getenv('game_config_file');
|
| 31 |
$config = ($var) ? $var : "/etc/munin/munin-game.ini"; |
| 32 |
$var = getenv('game_state_file');
|
| 33 |
$state = ($var) ? $var : (getenv('MUNIN_PLUGSTATE') . "/game");
|
| 34 |
|
| 35 |
function p($str) {
|
| 36 |
// Quick function to print a string with an EOL on the end |
| 37 |
echo $str . PHP_EOL; |
| 38 |
} |
| 39 |
|
| 40 |
function printMultigraph($ini_array, $machine_name, $title, $info, $max) {
|
| 41 |
// Print out a standard graph config. |
| 42 |
p("multigraph $machine_name");
|
| 43 |
p("graph_title $title");
|
| 44 |
p("graph_vlabel players");
|
| 45 |
p("graph_category games");
|
| 46 |
p("graph_info $info");
|
| 47 |
p("graph_printf %6.0lf");
|
| 48 |
|
| 49 |
if (isset($ini_array['settings'][$machine_name . '_colour'])) |
| 50 |
p("players.colour " . $ini_array['settings'][$machine_name . '_colour']);
|
| 51 |
|
| 52 |
if (isset($ini_array['settings'][$machine_name . '_draw'])) |
| 53 |
p("players.draw " . $ini_array['settings'][$machine_name . '_draw']);
|
| 54 |
|
| 55 |
p("players.label players");
|
| 56 |
p("players.info Number of players");
|
| 57 |
p("players.min 0");
|
| 58 |
p("players.max $max");
|
| 59 |
} |
| 60 |
|
| 61 |
function printValue($machine_name, $value) {
|
| 62 |
// Print a value |
| 63 |
p("multigraph $machine_name");
|
| 64 |
p("players.value " . $value);
|
| 65 |
} |
| 66 |
|
| 67 |
function queryServers($ini_array) {
|
| 68 |
// Query all game servers and return the results |
| 69 |
|
| 70 |
require "gameq/GameQ.php"; |
| 71 |
|
| 72 |
// Populate the $servers array from the ini file, ready to pass to GameQ |
| 73 |
$servers = array(); |
| 74 |
foreach ($ini_array as $section => $value) {
|
| 75 |
if ($section != 'settings') |
| 76 |
$servers[$section] = array($value['game'], $value['address'], $value['port']); |
| 77 |
} |
| 78 |
|
| 79 |
// Create a new GameQ object and pass it a list of servers |
| 80 |
$gq = new GameQ(); |
| 81 |
$gq->addServers($servers); |
| 82 |
|
| 83 |
// Set timeout from the config file |
| 84 |
$gq->setOption('timeout', $ini_array['settings']['timeout']);
|
| 85 |
$gq->setOption('sock_count', $ini_array['settings']['sock_count']);
|
| 86 |
$gq->setOption('sock_start', $ini_array['settings']['sock_start']);
|
| 87 |
|
| 88 |
// This filter makes sure a subset of data is always available, next to the normal data |
| 89 |
$gq->setFilter('normalise');
|
| 90 |
|
| 91 |
// Send request(s) |
| 92 |
$results = $gq->requestData(); |
| 93 |
|
| 94 |
return $results; |
| 95 |
} |
| 96 |
|
| 97 |
// Parse command line arguments if required. |
| 98 |
if (isset($_SERVER['argv'][1])) {
|
| 99 |
if ($_SERVER['argv'][1] == 'config') {
|
| 100 |
// Load our config.ini |
| 101 |
$ini_array = parse_ini_file($config, true); |
| 102 |
|
| 103 |
// Load games.ini so we can show pretty game names |
| 104 |
$games = parse_ini_file('gameq/GameQ/games.ini', true);
|
| 105 |
|
| 106 |
// Query the game servers |
| 107 |
$results = queryServers($ini_array); |
| 108 |
// Cache the query in the state file |
| 109 |
$fp = fopen($state, 'w+') or die("I could not open state file.");
|
| 110 |
fwrite($fp, serialize($results)); |
| 111 |
fclose($fp); |
| 112 |
|
| 113 |
|
| 114 |
// Loop through each server, printing graphs. |
| 115 |
foreach ($results as $name => $server) {
|
| 116 |
// If sub graphs and the game total graphs are enabled, make this be a sub-graph. |
| 117 |
if ($ini_array['settings']['show_game_total'] && $ini_array['settings']['enable_sub_graphs']) |
| 118 |
$machine_name = "gameserver_" . $ini_array[$name]['game'] . ".$name"; |
| 119 |
else |
| 120 |
$machine_name = "gameserver_" . $ini_array[$name]['game'] . "_$name"; |
| 121 |
$title = $ini_array[$name]['name'] . " players"; |
| 122 |
$info = "The number of players connected to the " . $games[$ini_array[$name]['game']]['name'] . " server"; |
| 123 |
printMultigraph($ini_array, $machine_name, $title, $info, $server['gq_maxplayers']); |
| 124 |
} |
| 125 |
|
| 126 |
// Game total graphs. |
| 127 |
if ($ini_array['settings']['show_game_total']) {
|
| 128 |
$game_total_max = array(); |
| 129 |
|
| 130 |
// Count players connected to each game |
| 131 |
foreach ($results as $name => $server) {
|
| 132 |
if (!isset($game_total_max[$ini_array[$name]['game']])) |
| 133 |
$game_total_max[$ini_array[$name]['game']] = $server['gq_maxplayers']; |
| 134 |
else |
| 135 |
$game_total_max[$ini_array[$name]['game']] += $server['gq_maxplayers']; |
| 136 |
} |
| 137 |
|
| 138 |
// Print all the game total graphs. |
| 139 |
foreach ($game_total_max as $game => $total) |
| 140 |
{
|
| 141 |
$machine_name = "gameserver_" . $game; |
| 142 |
$title = "Total " . $games[$game]['name'] . " players"; |
| 143 |
$info = "Total players connected to all " . $games[$game]['name'] . " servers"; |
| 144 |
printMultigraph($ini_array, $machine_name, $title, $info, $total); |
| 145 |
} |
| 146 |
} |
| 147 |
|
| 148 |
// Global total graph |
| 149 |
if ($ini_array['settings']['show_global_total']) {
|
| 150 |
$total_max = 0; |
| 151 |
// Add up all the players connected to all the servers |
| 152 |
foreach ($results as $name => $server) {
|
| 153 |
$total_max += $server['gq_maxplayers']; |
| 154 |
} |
| 155 |
|
| 156 |
printMultigraph($ini_array, "gameserver", "Total Players", "Total players connected to all servers", $total_max); |
| 157 |
} |
| 158 |
} |
| 159 |
if ($_SERVER['argv'][1] == 'autoconf') {
|
| 160 |
if (!@include("gameq/GameQ.php"))
|
| 161 |
p("no (GameQ Library not found)");
|
| 162 |
elseif (!file_exists($config)) |
| 163 |
p("no ($config not found)");
|
| 164 |
else |
| 165 |
p("yes");
|
| 166 |
} |
| 167 |
die(); |
| 168 |
} |
| 169 |
|
| 170 |
// No command line arguments, print values. |
| 171 |
|
| 172 |
// Load our config.ini |
| 173 |
$ini_array = parse_ini_file($config, true); |
| 174 |
|
| 175 |
// Load games.ini so we can show pretty game names |
| 176 |
$games = parse_ini_file('gameq/GameQ/games.ini', true);
|
| 177 |
|
| 178 |
$results = unserialize(file_get_contents($state)); |
| 179 |
|
| 180 |
// Print individual game values |
| 181 |
foreach ($results as $name => $server){
|
| 182 |
if ($ini_array['settings']['show_game_total'] && $ini_array['settings']['enable_sub_graphs']) |
| 183 |
$machine_name = "gameserver_" . $ini_array[$name]['game'] . ".$name"; |
| 184 |
else |
| 185 |
$machine_name = "gameserver_" . $ini_array[$name]['game'] . "_$name"; |
| 186 |
printValue($machine_name, $server['gq_numplayers']); |
| 187 |
} |
| 188 |
|
| 189 |
// Print game total values |
| 190 |
if ($ini_array['settings']['show_game_total']) {
|
| 191 |
$game_total = array(); |
| 192 |
foreach ($results as $name => $server) {
|
| 193 |
// Add up counts for the total graph |
| 194 |
if (!isset($game_total_max[$ini_array[$name]['game']])) |
| 195 |
$game_total[$ini_array[$name]['game']] = $server['gq_numplayers']; |
| 196 |
else |
| 197 |
$game_total[$ini_array[$name]['game']] += $server['gq_numplayers']; |
| 198 |
} |
| 199 |
foreach ($game_total as $game => $total) |
| 200 |
{
|
| 201 |
$machine_name = "gameserver_" . $game; |
| 202 |
printValue($machine_name, $total); |
| 203 |
} |
| 204 |
} |
| 205 |
|
| 206 |
// Are global totals enabled? |
| 207 |
if ($ini_array['settings']['show_global_total']) {
|
| 208 |
$total = 0; |
| 209 |
foreach ($results as $name => $server) {
|
| 210 |
$total += $server['gq_numplayers']; |
| 211 |
} |
| 212 |
printValue("gameserver", $total);
|
| 213 |
} |
| 214 |
|
| 215 |
|
| 216 |
?> |
