Monitor SolusVM Bandwith usage with Nagios

Overview

I run a mumble server with Exigent (now owned by Fluccs ). Exigent use SolusVM for their VM Management interface which is a great easy to use product with a relatively nice interface.

It also has an API  that clients can use to get information about their server, such as bandwidth, remote reboots and more. I wanted to make a script that monitors my VM’s bandwidth and alerts me when its nearing its max, so I did.

The Script

The script in question is below. Its just a quick PHP on I put together. I’ll hopefully port it over to bash one day, but today is not that day . Currently it takes very little configuration, you just need to set your key/hash and the URL of the SolusVM interface.

Check out the script, or download it below.

<?php
 
// Url to the client API
// Do NOT include the trailing slash
$url = "https://example.com:5353";
 
// Specify the key and hash to access the API
$postfields["key"] = "";
$postfields["hash"] = "";
$postfields["action"] = "status";

    // Send the query to the solusvm master
    // Note we have to use GET, POST seems to be broken.
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url . "/api/client/command.php?key=".$postfields['key']."&hash=".$postfields['hash']."&action=".$postfields['action']."&bw=true");
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
    // Uncomment the two lines below if your host is using a self-signed certificate
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);

    // Parse the returned data and build an array
    preg_match_all('/<(.*?)>([^<]+)<\/\\1>/i', $data, $match);
    $result = array();
    foreach ($match[1] as $x => $y)
    {
      $result[$y] = $match[2][$x];
    }

    // Explode our bandwidth results so we can use them in a array
    $bandwidth_result = explode(',',$result['bw']);
    $bandwidth = $bandwidth_result['3'];

    // Do our checking to see if we've used to much bandwidth
    // At the moment we Warn if usage is above 80% and go Critical if it is above 90%
    // Change the values below if you want a warning earlier
    if ($bandwidth > 90) {
        echo "CRITICAL: ".$bandwidth."% used\n";
        exit(2);
    }
    elseif ($bandwidth > 80) {
        echo "WARNING: ".$bandwidth."% used\n";
        exit(1);
    }
    elseif ($bandwidth < 80) {
        echo "OK: ".$bandwidth."% used\n";
        exit(0);
    }

?>

View on View on GitHub /Download