PR

さくらインターネット リソース情報自動報告プログラム(PHP 版)(Ver.0.20)

XWSS016482_s

以前書いた「さくらインターネット リソース情報自動報告プログラム(PHP 版)」(Ver.0.16)を見直し、Ver.0.20 をリリースします。

スポンサードリンク

FIX された不具合

XWSS016482_s

きっかけとしては、サーバー移転のためにアクセスが殆どなくなった時に、転送量がKB となり、正しく処理されていなかった問題が発覚したことと、CPU 時間が「0」の時に正しく処理されない問題が発覚したから。

XWSS016483_s

情報を解析して送信されたレポート(1つ前の画像)と実際に表示されるさくらインターネットのコントロールパネル(上の画像)。

CPU使用時間

CPU 使用時間が「0」の時は、「00:00:00」などと表示して欲しかったが、処理できないようだった。ソースを読むと、解析の時に、「(時間|分|秒)」となっているので、1秒以上の使用時間であれば処理できるが、0 の時は、「0秒」と表示されず「0」となるので、処理対象がCPU 時間であることに気がつけないということのようだった。

ウェブ転送量

ウェブ転送量は、プログラム作成時に遭遇したのが「GB」と「MB」だったので、ソースを読むと「GB とそれ以外(=MB)」と処理しているようだった。確かに移転でもしなければKB に遭遇する事もないと思うが、メールに書かれているCSV をそのままコピペしたいから、正しく処理させたい。ちなみに、GB はMB にしているので、KB の時もMB にしないと、既存のCSV データと整合性が保持できなくなってしまう。

動作確認

XWSS016507_s

上の画像では、CPU 使用時間が0 でも正しく表示できるように修正されている事が確認できる。また、KB として得られる情報もMB に変換されて正しく表示されていることが確認できる。

XWSS016508_s

別のサーバーのもの。こちらも正しくCPU 使用時間が処理されているため、今回の改修によって新たな不具合を出していないだろうと思う。また、MB で得られる情報も正しく条件分岐し、単位変換を行わないようになっている。残念ながらGB の転送量を持っているサイトはCDN 導入によって転送量が減っているので、動作確認できなかったが、KB とMB が正しく処理されているから何とかなるだろうと思う。

ソースコード

<?php
/* ==============================================
 *
 *  SAKURA Internet Resources Reporter
 *
 *             for CONTROL PANEL VERSION 1.2
 *
 * ==============================================
 *  License: GNU GPL
 *  Code   : PHP, UTF-8
 *  Auther : pc.casey.jp, 2011-2013
 *  Version: 
 *     Ver.0.01 2011.09.22 1st.
 *     Ver.0.02 2011.09.22 fix \s in data.
 *     Ver.0.03 2011.09.23 fix time format.
 *     Ver.0.04 2011.09.23 fix csv delimiter.
 *     Ver.0.05 2011.09.27 add csv delimiter.
 *     Ver.0.06 2011.09.27 add text report.
 *     Ver.0.07 2011.09.27 change time format.
 *     Ver.0.08 2011.09.27 change algorithm.
 *     Ver.0.09 2011.09.27 bugfix.
 *     Ver.0.10 2011.09.27 add work time.
 *     Ver.0.11 2011.09.29 use conf file.
 *     Ver.0.12 2011.09.29 fix get conf file path.
 *     Ver.0.13 2011.09.29 change get conf file path.
 *     Ver.0.14 2011.09.29 fix get host name.
 *     Ver.0.15 2011.09.29 fix get host name.
 *     Ver.0.16 2011.09.29 fix get host name.
 *     Ver.0.17 2013.03.15 fix Transfer KB.
 *     Ver.0.18 2013.03.15 fix CPU time is 0.
 *     Ver.0.19 2013.03.16 fix time format.
 *     Ver.0.20 2013.03.16 change algorithm.
 *  Usage  :
 *     - shell
 *        php /virtual/path/to/sakuracp.php
 *     - cron
 *        see sakuracp.sh file
 *   - http (no recomend)
 *        http://example.com/sakuracp.php
 */

/* -- <Format:CASEYFMT01> DO NOT CHANGE !! --
 * [0] Format Name        : FMTCASEYJP01
 * [1] Report Date        : YYYY/MM/DD hh:mm:ss
 * [2] AccountName        : XXXXX
 * [3] DISK USE (%)        : XX.X
 * [4] CPU Time (-0)    : hh:mm:ss
 * [5] CPU Time (-1)    : hh:mm:ss
 * [6] Traffic  (-1)(MB): XXX.X
 * [7] CPU Time (-2)    : hh:mm:ss
 * [8] Traffic  (-2)(MB): XXX.X
 */

// settings
$conf = dirname(__FILE__) . '/sakuracp.conf';

/* ----------------------------------
 *    define [do not change!]
 * ----------------------------------
 */
// program version
$version = "0.20";

// get start time
$sTime = time();

// loggin page url
$url = 'https://secure.sakura.ad.jp/rscontrol/?domain=';

// Resources page url
$url2="https://secure.sakura.ad.jp/rscontrol/rs/resource";

// read config file
require_once($conf);

// program name
$host_name = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : php_uname("n");
$program_name  = "SAKURA Internet Resources Reporter ";
$program_name .= "for CONTROL PANEL VERSION 1.2 Ver.";
$program_name .= $version . " on " . $host_name;
$program_name .= " (C) https://pc.casey.jp , 2011-2013";

// dev
//$data = "resource.htm";
$debug = false;

/* ------------------------------------
 *    MAIN section
 * ------------------------------------
 */

// start output
header("HTTP/1.0 200 OK");
header("Content-type:text/html;charset=utf-8");

// get date time
$date = date('Y/m/d H:i:s');

// get data from sakura internet
$data = getData();

// get detail
$fmt = getDetail($data);

// get text report
if($text_report){
    $mail_body .= getTextReport();
}

// get mail body
$mail_body .= implode($delimiter, $fmt);

// add mail footer
$mail_body .= "\n\n" . $program_name;
$eTime = time() - $sTime;
$mail_body .= " (" . $eTime . "sec+)";

// debug mode
if($debug){
    print $mail_body;
    $mail=false;
}

// mail send
if($mail){
    mailSend();
}

// end of script
print "OK!\n";
exit;

/* ------------------------------------
 *    make text report
 * ------------------------------------
*/
// 2011.09.27 ver.0.03
// 2013.03.16 ver.0.20
function getTextReport(){
    global $fmt;
    $text = "";
    $text[] = "\n";
    $text[] = sprintf("Report at %s",    $fmt[1]);
    $text[] = sprintf("Account: %s",    $fmt[2]);
    $text[] = sprintf("Disk Use: %s%%", $fmt[3]);
    $text[] = "Load Infomation:";
    $text[] = sprintf("-0: %s",            $fmt[4]);
    $text[] = sprintf("-1: %s (%s MB)", $fmt[5], $fmt[6]);
    $text[] = sprintf("-2: %s (%s MB)", $fmt[7], $fmt[8]);
    $text[] = "\n";
    return implode("\n", $text);
}

/* ------------------------------------
 *    mail send
 * ------------------------------------
*/
// 2011.09.19 ver.0.03
function mailSend(){
    // init
    global    $mail_addr_to,
            $mail_subject,
            $mail_body,
            $mail_addr_from;

    // set japanese
    mb_language("japanese");
    mb_internal_encoding("UTF-8");

    // mail send
    mb_send_mail(
        $mail_addr_to,
        $mail_subject,
        $mail_body,
        "From:" . $mail_addr_from
    );
}

/* ------------------------------------
 *    secure connection
 * ------------------------------------
 */
function getData(){
    // init
    global $url;
    global $url2;
    global $domain;
    global $password;

    require_once "HTTP/Client.php"; 

    $client =& new HTTP_Client();
    $classCookieManager = $client->getCookieManager();

    // 1st access, get token
    $client->get($url);
    $response = $client->currentResponse(); 

    // get token
    preg_match(
        "/name\=\"Token\" value\=\"(.*)\"/",
        $response['body'],
        $tokens
    ); 
    $token = $tokens[1];

    // 2nd access, send id, password, token, submit
    $login_params = array(
        "domain"    => $domain,
        "password"    => $password,
        "Token"        => $token,
        "Submit"    => "index"
    );
    $client->post($url, $login_params);
    //$response = $client->currentResponse();

    // 3rd access, save resources page data
    $client->get($url2);
    $response = $client->currentResponse();

    return $response['body'];
}

/* ------------------------------------
 *   data analyz
 * ------------------------------------
 */
function getDetail($body){
    global $path_dom;

    // for html Analyz
    include($path_dom . 'simple_html_dom.php');

    //$html = file_get_html($body);
    $html = str_get_html($body);

    // main info
    $main = $html->find('table.menubox td', 0)->plaintext;
    $ret[]= str_replace(array("(", ")", "%"), "", $main);

    // cpu time, transfer rate
    $p = $html->find('table.viewbox td');
    foreach($p as $k){
        // get strings
        $tmp = $k->innertext;

        // 2011.09.23 add
        $tmp = str_replace("&nbsp;", "", $tmp);
        if(preg_match('/(時間|分|秒)/', $tmp)){
            $tmp = strFormatChange($tmp);
        }

        // unit
        // change 2013.03.15
        $u = "";
        preg_match('/([0-9\.]+)\s+?(GB|MB|KB)/', $tmp, $u);
        if($u){
            if($u[2] == 'GB'){
                $tmp = $u[1] * 1024;
            }elseif($u[2] == 'MB'){
                $tmp = $u[1];
            }elseif($u[2] == 'KB'){
                $tmp = round($u[1] / 1024, 3);
            }
        }

        $ret[] = $tmp;
    }

    // delete space from data
    $ret[0] = @preg_split("/\s+/", $ret[0]);

    // make fmt
    global $fmt;
    global $date;
    $fmt = "";
    $fmt[0] = 'FMTCASEYJP01';
    $fmt[1] = $date;
    $fmt[2] = $ret[0][2];
    $fmt[3] = $ret[0][9];
    $fmt[4] = $ret[1] ? $ret[1] : '00:00:00';
    $fmt[5] = $ret[3] ? $ret[3] : '00:00:00';
    $fmt[6] = $ret[4];
    $fmt[7] = $ret[5] ? $ret[5] : '00:00:00';
    $fmt[8] = $ret[6];

    return $fmt;
}

/* ------------------------------------
 *    time strings changer
 * ------------------------------------
 *  2011.09.23 1st.
 *  h時間mm分ss秒 => hh:mm:ss
 *       mm分ss秒 => 00:mm:ss
 *           ss秒 => 00:00:ss
 *              0 => 
 */
function strFormatChange($tmp){
    $time = "";

    // h
    $time .= preg_match("/([0-9]+)時間/u", $tmp, $times) ? $times[1] : "00";
    $time .= ":";

    // m
    $time .= preg_match("/([0-9]+)分/u", $tmp, $times) ? $times[1] : "00";
    $time .= ":";

    // s
    $time .= preg_match("/([0-9]+)秒/u", $tmp, $times) ? $times[1] : "00";

    // set format
    $time_new = vsprintf("%02d:%02d:%02d", explode(":", $time));

    return $time_new;
}
?>

※上記以外の以前Ver のファイル郡(Conf など)は、そのまま利用できる

アップデート

さくらインターネット リソース情報自動報告プログラム(PHP 版)(Ver.0.26)」をリリースしました。

コメント