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

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

情報を解析して送信されたレポート(1つ前の画像)と実際に表示されるさくらインターネットのコントロールパネル(上の画像)。
CPU使用時間
CPU 使用時間が「0」の時は、「00:00:00」などと表示して欲しかったが、処理できないようだった。ソースを読むと、解析の時に、「(時間|分|秒)」となっているので、1秒以上の使用時間であれば処理できるが、0 の時は、「0秒」と表示されず「0」となるので、処理対象がCPU 時間であることに気がつけないということのようだった。
ウェブ転送量
ウェブ転送量は、プログラム作成時に遭遇したのが「GB」と「MB」だったので、ソースを読むと「GB とそれ以外(=MB)」と処理しているようだった。確かに移転でもしなければKB に遭遇する事もないと思うが、メールに書かれているCSV をそのままコピペしたいから、正しく処理させたい。ちなみに、GB はMB にしているので、KB の時もMB にしないと、既存のCSV データと整合性が保持できなくなってしまう。
動作確認

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

別のサーバーのもの。こちらも正しく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(" ", "", $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)」をリリースしました。


コメント