Search code examples
phpsql-server-2008-r2windows-server-2008whmcs

Get Windows Uptime/Load with PHP?


Our billing system supports network monitoring and shows uptime and load percentage, however, the PHP status script they provide says it is Linux only. Configuring PHP to work with Server 2008 is not an issue, but I don't know PHP. Would it be possible to manipulate this code to work on Windows?

<?php
/*
*************************************************************************
*                                                                       *
* WHMCompleteSolution - Client Management, Billing & Support System     *
* Copyright (c) 2007-2008 WHMCS. All Rights Reserved,                   *
* Release Date: 12th December 2008                                      *
* Version 3.8.1 Stable                                                  *
*                                                                       *
*************************************************************************
*                                                                       *
* Email: [email protected]                                                 *
* Website: htttp://www.whmcs.com                                        *
*                                                                       *
*************************************************************************

This file can be uploaded to each of your linux web servers in order to
display current load and uptime statistics for the server in the Server
Status page of the WHMCS Client Area and Admin Area Homepage

*/

error_reporting(0);

if (ini_get('disable_functions')) {
    $disabled_funcs=array_map('trim',explode(',',ini_get('disable_functions')));
}

$action=$_GET["action"];

if ($action=="phpinfo") {
} else {
    $users[0]="Unavailable";
    $users[1]="--";
    $loadnow="Unavailable";
    $load15="--";
    $load30="--";
    if (in_array('exec',$disabled_funcs)) {
        $load=file_get_contents("/proc/loadavg");
        $load=explode(' ',$load);
        $loadnow=$load[0];
        $load15=$load[1];
        $load30=$load[2];
    } else {
        $reguptime=trim(exec("uptime"));
        if ($reguptime) {
            if (preg_match("/, *(\d) (users?), .*: (.*), (.*), (.*)/",$reguptime,$uptime)) {
                $users[0]=$uptime[1];
                $users[1]=$uptime[2];
                $loadnow=$uptime[3];
                $load15=$uptime[4];
                $load30=$uptime[5];
            }
        }
    }
    if (in_array('shell_exec',$disabled_funcs)) {
        $uptime_text=file_get_contents("/proc/uptime");
        $uptime=substr($uptime_text,0,strpos($uptime_text," "));
    } else {
        $uptime=shell_exec("cut -d. -f1 /proc/uptime");
    }
    $days=floor($uptime/60/60/24);
    $hours=str_pad($uptime/60/60%24,2,"0",STR_PAD_LEFT);
    $mins=str_pad($uptime/60%60,2,"0",STR_PAD_LEFT);
    $secs=str_pad($uptime%60,2,"0",STR_PAD_LEFT);
    $phpver=phpversion();
    if(function_exists("mysql_get_client_info()")) $mysqlver=mysql_get_client_info();
    if(function_exists("zend_version()")) $zendver=zend_version();
    echo "<load>$loadnow</load>\n";
    echo "<uptime>$days Days $hours:$mins:$secs</uptime>\n";
    echo "<phpver>$phpver</phpver>\n";
    echo "<mysqlver>$mysqlver</mysqlver>\n";
    echo "<zendver>$zendver</zendver>\n";
}

?>

Solution

  • This version combines some of the ideas suggested here and some of my own into a file that should work roughly the same on both *nix and Windows. Also corrected a few glaring errors/lazy codes in the original.

    Will not work on Windows if exec() is disabled. There is no way around this that I can see.

    Let me know how you get on.

    <?php
    
    /*
    *************************************************************************
    *                                                                       *
    * WHMCompleteSolution - Client Management, Billing & Support System     *
    * Copyright (c) 2007-2008 WHMCS. All Rights Reserved,                   *
    * Release Date: 12th December 2008                                      *
    * Version 3.8.1 Stable                                                  *
    *                                                                       *
    *************************************************************************
    *                                                                       *
    * Email: [email protected]                                                 *
    * Website: htttp://www.whmcs.com                                        *
    *                                                                       *
    *************************************************************************
    
      Modified by DaveRandom, Sept 2011
    
    This file can be uploaded to each of your linux/Windows web servers in
    order to display current load and uptime statistics for the server in the
    Server Status page of the WHMCS Client Area and Admin Area Homepage
    
    */
    
    error_reporting(0);
    
    if (ini_get('disable_functions')) {
      $disabled_funcs = array_map('trim',explode(',',ini_get('disable_functions')));
    }
    
    $action = (isset($_GET["action"])) ? $_GET["action"] : NULL;
    
    if ($action == "phpinfo") {
    
      // Seems as though something is missing here - maybe phpinfo() ?
    
    } else {
    
      // Stuff that works everywhere
      $phpver = phpversion();
      $mysqlver = (function_exists("mysql_get_client_info")) ? mysql_get_client_info() : '';
      $zendver = (function_exists("zend_version")) ? zend_version() : '';
    
      // Default values
      $users[0] = $loadnow = "Unavailable";
      $users[1] = $load15 = $load30 = "--";
      $uptime_str = '';
    
      if (strpos(strtolower(PHP_OS),'win') !== FALSE) {
    
        // For Windaz
        if (!in_array('exec',$disabled_funcs)) {
    
          set_time_limit(150); // 'systeminfo' command can take a while...
    
          $uptime = exec('systeminfo | find "System Up"');
          $parts = explode(':',$uptime);
          $parts = array_pop($parts);
          $parts = explode(',',trim($parts));
          foreach (array('days','hours','mins','secs') as $k => $v) {
            $parts[$k] = explode(' ',trim($parts[$k]));
            $$v = ($k) ? str_pad(array_shift($parts[$k]),2,'0',STR_PAD_LEFT) : array_shift($parts[$k]);
          }
          $uptime_str = "$days Days $hours:$mins:$secs";
    
          exec('typeperf -sc 1 "\Processor(*)\% Processor Time"',$result);
          for ($i = 0; trim($result[$i]) == ''; $i++) continue;
          $parts = explode(',',$result[++$i]);
          $loadnow = (is_numeric($loadnow = trim(trim(array_pop($parts)),'"\''))) ? $loadnow : 'Unavailable';
    
        }
    
      } else {
    
        // For *nix
    
        if (in_array('exec',$disabled_funcs)) {
          $load = file_get_contents("/proc/loadavg");
          $load = explode(' ',$load);
          $loadnow = $load[0];
          $load15 = $load[1];
          $load30 = $load[2];
        } else if (($reguptime = trim(exec("uptime"))) && preg_match("/, *(\\d) (users?), .*: (.*), (.*), (.*)/",$reguptime,$uptime)) {
          $users[0] = $uptime[1];
          $users[1] = $uptime[2];
          $loadnow = $uptime[3];
          $load15 = $uptime[4];
          $load30 = $uptime[5];
        }
        if (in_array('shell_exec',$disabled_funcs)) {
          $uptime_text = file_get_contents("/proc/uptime");
          $uptime = substr($uptime_text,0,strpos($uptime_text," "));
        } else {
          $uptime = shell_exec("cut -d. -f1 /proc/uptime");
        }
        $days = floor($uptime/60/60/24);
        $hours = str_pad($uptime/60/60%24,2,"0",STR_PAD_LEFT);
        $mins = str_pad($uptime/60%60,2,"0",STR_PAD_LEFT);
        $secs = str_pad($uptime%60,2,"0",STR_PAD_LEFT);
        $uptime_str = "$days Days $hours:$mins:$secs";
    
      }
    
      echo "<load>$loadnow</load>\n";
      echo "<uptime>$uptime_str</uptime>\n";
      echo "<phpver>$phpver</phpver>\n";
      echo "<mysqlver>$mysqlver</mysqlver>\n";
      echo "<zendver>$zendver</zendver>\n";
    
    }