PR

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

XWSS016521-s

先日「さくらインターネット リソース情報自動報告プログラム(PHP 版)(Ver.0.20)」としてアップデートをリリースしましたが、機能追加と新たなバグが見つかったため、改修したVer.0.26 をリリースします。

スポンサードリンク

アップデート内容

Ver.0.21-0.22

XWSS016521-s

このバージョンでは、機能追加がなされ、CSV データをファイルに保存できるようになりました。

これまでのバージョンでは、解析内容を一般的なレポートとして報告するほか、CSV データ用の文字列をメールに記載して送信していましたが、CSV データとして保存することはしませんでした。理由は、パーミッション関連が面倒だったからですが、今回のバージョンでは追加しました。

Ver.0.21

このバージョンでは、CSV データをファイルとして保存する機能が追加されました。

※メール本文に記載されるCSV フォーマットのものと僅かな差が生じます。これまでのデータと合わせて使う場合には、「CSV内の日時をダブルクォートで囲う(正規表現の例)」もご参照ください。

Ver.0.22

CSV ファイルをメールに添付して送信するようにしたため、メール送信の処理が書き換えられ、メーラーが変更されました。「phpmailer – PHPMailer is a Full Featured Email Transfer Class for PHP – Google Project Hosting」が必要になりました。

Ver.0.23

1日に複数回処理すると、処理した分だけCSV ファイルに書き込まれるため、このバージョンから、CSV ファイル処理が有効になっている場合でも、指定した時間以外では一時的にCSV ファイルの処理をスキップするようにしました。

デフォルトでは、「$save_csv_exeh = false;」となっていますが、例えば、「$save_csv_exeh = “00”;」と指定すると、CSV ファイル処理が有効になっていても、「零時」以外に処理した場合は、スルーされます(零時に本プログラムを呼び出している場合の例)。

これにより、同じ時間でのデータをファイルに書き込むことができ、グラフ化する際などに便利になります。

Ver.0.24

XWSS016518-s

Ver.0.23 をリリースしようと思った時に、新たな不具合が発見されました。

XWSS016519-s

不具合の内容は、転送量が「B」(バイト)の場合、正しく処理できないというものです。

XWSS016520-s

通常遭遇することはないと思いますが、見ないふりするのもアレなので、改修しました。

Ver.0.25

Ver.0.24 をリリースしようと思ったところ、何の気の迷いか「さくらインターネットVPSリソース情報自動報告プログラム(Ver.0.0.3)」に保存用ディレクトリのチェックと動的作成機能を搭載したので、同じ処理をこちらにも追加しました。

Ver.0.26

Ver.0.25 をリリースしようと思ったところ、何の気の迷いかCSV ファイルを保存する際にバックアップ作成する機能を追加しました。

ソースコード

sakuracp.php

<?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.
 *     Ver.0.21 2013.03.18 add save csv file.
 *     Ver.0.22 2013.03.18 add mail attach csv file.
 *     Ver.0.23 2013.03.18 add csv exec hour check.
 *     Ver.0.24 2013.03.18 fix Transfer Byte(s).
 *     Ver.0.25 2013.03.19 add check and make dir.
 *     Ver.0.26 2013.03.19 add backup.
 *  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.26";

// 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();
}

// save csv file
if($save_csv){
    // exec hour ?
    if($save_csv_exeh){
        if($save_csv_exeh != date("H")){
            $save_csv = false;
        }
    }

    // exec
    if($save_csv){
        $csv_filename = saveCsv();
        $mail_body .= "Saved CSV file: $csv_filename\n\n";
    }
}

// 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;

/* ------------------------------------
 *    Check and Make DIR
 * ------------------------------------*/
// add 2013.03.19 Ver.0.25
function checkAndMkdir($path){

    // check dir
    if(!is_dir($path)){

        // mkdir
        mkdir($path, 0755, true);
    }

    return;
}

/* ------------------------------------
 *    save csv file
 * ------------------------------------*/
// 2013.03.18 Ver.0.21
function saveCsv(){

    // init
    global $fmt, $domain, $save_csv_path;

    // check and make dir, add Ver.0.25
    checkAndMkdir($save_csv_path);

    // filename
    // ./save_path/domain.csv
    // ./path/user.sakura.ne.jp.csv
    $filename = $save_csv_path . $domain . ".csv";

    // backup, Ver.0.26
    copy($filename, $filename . ".bak");

    // save
    $fp = fopen($filename, 'a');
    fputcsv($fp, $fmt);
    fclose($fp);

    // return
    return $filename;
}

/* ------------------------------------
 *    mail send with PHPMailer
 * ------------------------------------*/
// 2013.03.18 ver.0.22
function mailSend(){

    // init
    global    $mail_addr_to,
            $mail_subject,
            $mail_body,
            $mail_addr_from;
    global $save_csv, $csv_filename;

    require("PHPMailer/class.phpmailer.php");

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

    $mail = new PHPMailer();
    $mail->CharSet    = "iso-2022-jp";
    $mail->Encoding    = "7bit";

    $mail->AddAddress($mail_addr_to);
    $mail->From        = $mail_addr_from;
    $mail->FromName = $mail_addr_from;
    $mail->Subject    = $mail_subject;
    $mail->Body        = $mail_body;
    if($save_csv){
        $mail->AddAttachment($csv_filename);
    }
    $mail->Send();
}

/* ------------------------------------
 *    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);
}

/* ------------------------------------
 *    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
        // change 2013.03.18
        $u = "";
        preg_match('/([0-9\.]+)\s+?(GB|MB|KB|B)/', $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);
            }elseif($u[2] == 'B'){
                $tmp = round($u[1] / 1024 / 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;
}
?>

sakuracp.conf

<?php
/* ------------------------------------
 *    Settings
 * ------------------------------------*/

// login
$domain            = "XXXXX.sakura.ne.jp";
$password        = "XXXXX";

// mail
$mail            = ture;
$mail_subject    = "SAKURA Internet Resources Report";
$mail_body        = "GORIYOU WA KEIKAKU TEKINI :P";
$mail_addr_from    = "root@localhost";
$mail_addr_to    = "[email protected]";

// system (analyz)
$path_dom        = "./simplehtmldom/";
$delimiter        = ",";

// text report
$text_report    = true;

/* --- Ver.0.21+ --- */

// save csv
$save_csv        = false;
$save_csv_path    = "./log/";

/* --- Ver.0.23+ --- */
$save_csv_exeh    = false;
?>

※このバージョンでは、Config ファイルに設定項目が追加されました

コメント