188 lines
6.6 KiB
PHP
188 lines
6.6 KiB
PHP
<?php defined('SYSPATH') or die('No direct access allowed.');
|
|
|
|
/**
|
|
* This class is able to collect traffic information for Exetel hspa
|
|
*
|
|
* Traffic information is collected by each service, and cached,
|
|
* returning just the date in question.
|
|
*
|
|
* @package OSB
|
|
* @subpackage Service
|
|
* @category Helpers
|
|
* @author Deon George
|
|
* @copyright (c) 2010 Open Source Billing
|
|
* @license http://dev.osbill.net/license.html
|
|
*/
|
|
class Service_Traffic_Adsl_Exetelhspa extends Service_Traffic_Adsl {
|
|
private $login_user_field = 'login_name';
|
|
private $login_pass_field = 'password';
|
|
private $date_field = 'date';
|
|
|
|
static $return = array();
|
|
|
|
/**
|
|
* Get the data for Exetel hspa services
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function getdata($date) {
|
|
// Assume we have a good fetch, unless otherwise specified.
|
|
$this->fetchresult = TRUE;
|
|
|
|
// If we have already collected the date data, return it.
|
|
if (! empty(Service_Traffic_Adsl_Exetelhspa::$return[$date]))
|
|
return Service_Traffic_Adsl_Exetelhspa::$return[$date];
|
|
|
|
include_once 'includes/kohana/modules/simplehtmldom/classes/simple_html_dom.php';
|
|
|
|
// Find our services that need to be collected this way.
|
|
$update = array();
|
|
|
|
foreach ($this->so->services() as $so) {
|
|
if (Minion_CLI::options('verbose'))
|
|
echo " = Service: ".$so->name()."\n";
|
|
|
|
if ($so->plugin()->service_stats_collect AND $so->plugin()->service_stats_lastupdate < $date) {
|
|
// Start Session
|
|
$request = Request::factory($this->so->stats_url)
|
|
->method('POST')
|
|
->post($this->login_user_field,$so->plugin()->service_username)
|
|
->post($this->login_pass_field,$so->plugin()->service_password)
|
|
->post('doLogin',1)
|
|
->post('submit','Login');
|
|
|
|
$request->client()->options($this->curlopts+array(
|
|
CURLOPT_COOKIEJAR=>sprintf('/tmp/usage.cookies.%s.txt',$so->plugin()->service_number),
|
|
));
|
|
|
|
$response = $request->execute();
|
|
$data = $response->body();
|
|
|
|
if (! $data) {
|
|
// @todo Log into a log file
|
|
printf('Bad fetch for %s [%s]',$so->plugin()->service_number,$this->so->stats_lastupdate);
|
|
#$html = new simple_html_dom();
|
|
#$html->load($data);
|
|
#$html->save(sprintf('/afs/local/tmp/usage.%s.%s.login.html',$so->plugin()->service_number,'login'));
|
|
continue;
|
|
}
|
|
|
|
for ($servicedate=date('Y-m-d',strtotime($this->so->stats_lastupdate.'+1 day'));
|
|
$servicedate <= $this->today;
|
|
$servicedate=date('Y-m-d',strtotime('+1 month',strtotime(date('Y-m',strtotime($servicedate)).'-01')))) {
|
|
#print_r(array('sn'=>$so->plugin()->service_number,'sd'=>$servicedate));
|
|
|
|
$lastday = date('Y-m-d',strtotime('-1 second',strtotime('+1 month',strtotime(date('Y-m',strtotime($servicedate)).'-01'))));
|
|
if (strtotime($lastday) > time())
|
|
$lastday = date('Y-m-d',strtotime('yesterday'));
|
|
|
|
$html = new simple_html_dom();
|
|
$notdebug = TRUE;
|
|
if ($notdebug) {
|
|
$request = Request::factory($this->so->stats_url.'usage_customize_query.php')
|
|
->method('POST')
|
|
->post('year_search_key',date('Y',strtotime($servicedate)))
|
|
->post('month_search_key',date('m',strtotime($servicedate)))
|
|
->post('start_day_search_key',date('d',strtotime($servicedate)))
|
|
->post('end_day_search_key',date('d',strtotime($lastday)))
|
|
->post('do_usage_search',1);
|
|
|
|
$request->client()->options($this->curlopts+array(
|
|
CURLOPT_COOKIEFILE=>sprintf('/tmp/usage.cookies.%s.txt',$so->plugin()->service_number),
|
|
));
|
|
|
|
$response = $request->execute();
|
|
$result = $response->body();
|
|
|
|
$html->load($result);
|
|
#$html->save(sprintf('/afs/local/tmp/usage.%s.%s.html',$so->plugin()->service_number,$servicedate)); die();
|
|
} else {
|
|
$html->load_file(sprintf('/afs/local/tmp/usage.%s.%s.html',$so->plugin()->service_number,$servicedate));
|
|
}
|
|
|
|
$header = array();
|
|
$data = array();
|
|
|
|
foreach ($html->find('fieldset') as $index => $fieldset) {
|
|
if (! preg_match('/^Usage Detail/',$fieldset->find('legend',0)->plaintext))
|
|
continue;
|
|
|
|
#echo "X:";print_r($fieldset->find('table',0)->find('tr')->plaintext); echo "\n";
|
|
foreach ($fieldset->find('table',0)->find('tr') as $key => $values) {
|
|
foreach ($values->children() as $a => $b) {
|
|
#print_r(array('a'=>$a,'b'=>$b));
|
|
|
|
# Header
|
|
if ($key == 0) {
|
|
switch ($b->plaintext) {
|
|
case 'Date': $header[$a] = 'date'; break;
|
|
case 'OffPeak Upload': $header[$a] = 'up_offpeak'; break;
|
|
case 'Peak Upload': $header[$a] = 'up_peak'; break;
|
|
case 'Upload': $header[$a] = 'up_peak'; break;
|
|
case 'OffPeak Download': $header[$a] = 'down_offpeak'; break;
|
|
case 'Peak Download': $header[$a] = 'down_peak'; break;
|
|
case 'Download': $header[$a] = 'down_peak'; break;
|
|
case 'Duration': break;
|
|
case 'Total': break;
|
|
default:
|
|
printf('Unkown header :%s',$b->plaintext);
|
|
$this->fetchresult = FALSE;
|
|
continue;
|
|
}
|
|
#echo "INDEX: $key:$a\n";
|
|
#echo "TAG: ".$b->tag."\n";
|
|
#echo "HEADER: ".$b->plaintext."\n";
|
|
|
|
# Data
|
|
} else {
|
|
if (isset($header[$a]))
|
|
$data[$header[$a]] = $b->plaintext;
|
|
#echo "INDEX: $key:$a\n";
|
|
#echo "TAG: ".$b->tag."\n";
|
|
#echo "VALUES: ".$b->plaintext."\n";
|
|
}
|
|
}
|
|
#print_r($data);
|
|
|
|
if (isset($data['date']) && preg_match('/^[0-9]{4}/',$data['date'])) {
|
|
$sdate = date('Y-m-d',strtotime($data['date']));
|
|
unset($data['date']);
|
|
|
|
if (isset($update[$so->plugin()->service_number][$sdate]))
|
|
foreach ($data as $key => $value)
|
|
$update[$so->plugin()->service_number][$sdate][$key] += $value;
|
|
else
|
|
$update[$so->plugin()->service_number][$sdate] = $data;
|
|
|
|
$update[$so->plugin()->service_number][$sdate]['service'] = $so->plugin()->service_number;
|
|
$update[$so->plugin()->service_number][$sdate]['date'] = $sdate;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we got here and have data, we had a good fetch, update the stats date
|
|
$so->plugin()->service_stats_lastupdate = $lastday;
|
|
$so->plugin()->save();
|
|
}
|
|
}
|
|
|
|
// If there are no updates, return an empty array
|
|
if (! $update)
|
|
return array();
|
|
|
|
// Reformat the data into date order.
|
|
foreach ($update as $service => $sdata)
|
|
foreach ($sdata as $sdate => $details)
|
|
Service_Traffic_Adsl_Exetelhspa::$return[$sdate][$service] = $details;
|
|
|
|
// If the date we want is empty, return an array
|
|
if (empty(Service_Traffic_Adsl_Exetelhspa::$return[$date]))
|
|
return array();
|
|
|
|
// Return the date we asked for
|
|
return Service_Traffic_Adsl_Exetelhspa::$return[$date];
|
|
}
|
|
}
|
|
?>
|