以前書いた「さくらインターネット リソース情報自動報告プログラム(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)」をリリースしました。
コメント