This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/modules/adsl/classes/Service/Traffic/ADSL/iiNetADSL.php

125 lines
4.2 KiB
PHP
Raw Normal View History

2010-11-29 22:41:08 +00:00
<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class is able to collect traffic information for iiNet ADSL
*
* 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_iiNetADSL extends Service_Traffic_ADSL {
private $login_user_field = 'username';
private $login_pass_field = 'password';
private $date_field = 'period';
static $return = array();
// The fields in the XML which are translated into database columns
private $fields = array(
'peak'=>'down_peak',
'offpeak'=>'down_offpeak',
'uploads'=>'up_peak',
'freezone'=>'internal',
);
/**
* Get the data for iiNet ADSL services
*
* @return array
*/
protected function getdata($date) {
// Assume we have a bad fetch, unless otherwise specified.
$this->fetchresult = FALSE;
// If we have already collected the date data, return it.
if (! empty(Service_Traffic_ADSL_iiNetADSL::$return[$date]))
return Service_Traffic_ADSL_iiNetADSL::$return[$date];
// Find our services that need to be collected this way.
$update = array();
foreach ($this->so->services() as $so) {
if ($so->service_adsl->service_stats_collect AND $so->service_adsl->service_stats_lastupdate < $date) {
$lastperiod = '';
for ($servicedate=date('Y-m-d',strtotime($this->so->stats_lastupdate.'+1 day'));
$servicedate <= $this->today;
$servicedate=date('Y-m-d',strtotime('+1 day',strtotime($servicedate)))) {
$debug = FALSE;
$debug_file = '/tmp/data';
// IINET gives us data a month at a time.
if ($lastperiod != date('Ym',strtotime($servicedate))) {
$lastperiod = date('Ym',strtotime($servicedate));
$postfields = http_build_query(array(
$this->login_user_field=>$so->service_adsl->service_username,
$this->login_pass_field=>$so->service_adsl->service_password,
'period'=>$lastperiod,
'usage_view'=>'month',
'action'=>'login',
));
if ($debug AND file_exists($debug_file))
$data = file_get_contents($debug_file);
else
$data = Remote::get($this->so->stats_url,$this->curlopts+array(CURLOPT_POSTFIELDS=>$postfields));
// @todo There exists a possibility to skip a month, if we get a bad fetch on a previous month.
if ($data)
$this->fetchresult = TRUE;
if ($debug AND ! file_exists($debug_file))
file_put_contents($debug_file,$data);
}
$return = array();
2012-07-05 03:06:17 +00:00
foreach (XML::factory(NULL,'ii_feed',$data)->volume_usage->volume_usage->get('day_hour') as $day_hour) {
2010-11-29 22:41:08 +00:00
$attrs = array();
$period = $day_hour->attributes();
// If we find a field we dont understand, we'll return.
if (empty($period['period']))
return array();
foreach ($day_hour->get('usage') as $usage) {
$fields = $usage->attributes();
2012-08-01 12:43:33 +00:00
2010-11-29 22:41:08 +00:00
// If we find a field we dont understand, we'll return.
if (empty($fields['type']) OR empty($this->fields[$fields['type']]))
return array();
// Traffic is in bytes, need to convert to MB
if (empty($attrs[$this->fields[$fields['type']]]))
$attrs[$this->fields[$fields['type']]] = $usage->value()/1000/1000;
else
$attrs[$this->fields[$fields['type']]] += $usage->value()/1000/1000;
}
Service_Traffic_ADSL_iiNetADSL::$return[$period['period']][$so->service_adsl->service_username] = $attrs;
Service_Traffic_ADSL_iiNetADSL::$return[$period['period']][$so->service_adsl->service_username]['date'] = $period['period'];
Service_Traffic_ADSL_iiNetADSL::$return[$period['period']][$so->service_adsl->service_username]['service'] = $so->service_adsl->service_username;
}
}
// If we got here and have data, we had a good fetch, update the stats date
$so->service_adsl->service_stats_lastupdate = $date;
$so->service_adsl->save();
}
}
// If the date we want is empty, return an array
if (empty(Service_Traffic_ADSL_iiNetADSL::$return[$date]))
return array();
// Return the date we asked for
return Service_Traffic_ADSL_iiNetADSL::$return[$date];
}
}
?>