mirror of
https://bitbucket.org/jsuto/piler.git
synced 2024-12-27 06:30:11 +01:00
268 lines
10 KiB
PHP
268 lines
10 KiB
PHP
<?php
|
|
|
|
class ModelAccountingAccounting extends Model
|
|
{
|
|
|
|
public function run_counters( $start=NULL, $stop = NULL )
|
|
{
|
|
$now = time();
|
|
$counter = array();
|
|
$accepteddomains = array_flip( $this->__getAcceptedDomains() );
|
|
$return = array(
|
|
'starttimestamp' => 0,
|
|
'stoptimestamp' => 0,
|
|
'addedstats' => 0,
|
|
'deletedstats' => 0,
|
|
);
|
|
|
|
if ( !is_null($start) )
|
|
{
|
|
$start = $this->__decodeDate( $start );
|
|
} elseif ( is_null($start) )
|
|
{
|
|
//if we are passed nothing, operate on today
|
|
$start = $this->__decodeDate( "00:00:00" );
|
|
}
|
|
|
|
if ( !is_null($stop) )
|
|
{
|
|
$stop = $this->__decodeDate( $stop );
|
|
$stop = $stop + 86400;
|
|
} elseif ( is_null($stop) )
|
|
{
|
|
//if we are passed nothing, operate on today
|
|
$stop = $this->__decodeDate( "00:00:00" );
|
|
$stop = $stop + 86400;
|
|
}
|
|
|
|
$return['starttimestamp'] = $start;
|
|
$return['stoptimestamp'] = $stop;
|
|
|
|
// run query to return all messages
|
|
$tousers = $this->db->query('SELECT `sent`-(`sent`%86400) as `day`,`to`,count(*) as `count`,sum(`size`) as `size` FROM ' . VIEW_MESSAGES . ' WHERE `sent` >= '.$start.' AND `sent` < '.$stop.' GROUP BY FROM_UNIXTIME(`day`, "%Y.%m.%d."), `to`;');
|
|
$fromusers = $this->db->query('SELECT `sent`-(`sent`%86400) as `day`,`from`,count(*) as `count`,sum(`size`) as `size` FROM ' . VIEW_MESSAGES . ' WHERE `sent` >= '.$start.' AND `sent` < '.$stop.' GROUP BY FROM_UNIXTIME(`day`, "%Y.%m.%d."), `from`;');
|
|
|
|
// process results from above four queries
|
|
if($tousers->num_rows > 0)
|
|
{
|
|
foreach($tousers->rows as $row)
|
|
{
|
|
$counter[$row['day']][$row['to']]['recd'] = $row['count'];
|
|
$counter[$row['day']][$row['to']]['sizerecd'] = $row['size'];
|
|
}
|
|
}
|
|
if($fromusers->num_rows > 0)
|
|
{
|
|
foreach($fromusers->rows as $row)
|
|
{
|
|
$counter[$row['day']][$row['from']]['sent'] = $row['count'];
|
|
$counter[$row['day']][$row['from']]['sizesent'] = $row['size'];
|
|
}
|
|
}
|
|
|
|
foreach( $counter as $date=>$users )
|
|
{
|
|
|
|
// execute queries to update the users and domains counter table
|
|
$deletestats = $this->db->query("DELETE FROM " . TABLE_STAT_COUNTER . " WHERE `date` = $date;");
|
|
$return['deletedstats'] = $return['deletedstats'] + $this->db->countAffected();
|
|
|
|
foreach( $users as $username => $userdata)
|
|
{
|
|
//todo: consolidate
|
|
$sent = isset($userdata['sent']) ? $userdata['sent'] : 0;
|
|
$recd = isset($userdata['recd']) ? $userdata['recd'] : 0;
|
|
$sizesent = isset($userdata['sizesent']) ? $userdata['sizesent'] : 0;
|
|
$sizerecd = isset($userdata['sizerecd']) ? $userdata['sizerecd'] : 0;
|
|
|
|
$parts = explode('@',$username);
|
|
|
|
if ( isset($parts[1]) && isset($accepteddomains[ $parts[1] ]) ) {
|
|
$addusers = $this->db->query("INSERT INTO " . TABLE_STAT_COUNTER . " (`date`,`email`,`domain`,`sent`,`recd`,`sentsize`,`recdsize`) VALUES($date,'$username','".$parts[1]."',$sent,$recd,$sizesent,$sizerecd);");
|
|
$return['addedstats'] = $return['addedstats'] + $this->db->countAffected();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if(ENABLE_SYSLOG == 1) { syslog(LOG_INFO, sprintf("processed %s to %s: %d records deleted, %d records added",date(DATE_TEMPLATE, $return['starttimestamp']),date(DATE_TEMPLATE, $return['stoptimestamp']),$return['deletedstats'],$return['addedstats'])); }
|
|
|
|
return $return;
|
|
}
|
|
|
|
public function get_accounting($item = 'email',$search='',$page=0,$pagelen=0,$sort='item',$order=0 ) {
|
|
|
|
// item can be either email or domain, maybe folder in the future??
|
|
|
|
$_order = 0;
|
|
$_order = "";
|
|
$limit = "";
|
|
$return = array();
|
|
|
|
/*
|
|
if(MEMCACHED_ENABLED) {
|
|
$memcache = Registry::get('memcache');
|
|
|
|
$statscounter = $memcache->get(Registry::get('statscounters'));
|
|
|
|
if(isset($counter[MEMCACHED_PREFIX . 'counters_last_update'])) {
|
|
if(isset($counter[MEMCACHED_PREFIX . 'size'])) { $asize = nice_size($counter[MEMCACHED_PREFIX . 'size'], ' '); }
|
|
unset($counter[MEMCACHED_PREFIX . 'size']);
|
|
|
|
return array ($asize, $counter);
|
|
}
|
|
} */
|
|
|
|
$account_for_emails = $this->__getEmails();
|
|
$account_for_domains = $this->__getDomains();
|
|
|
|
$search = preg_replace("/\s{1,}/", "", $search);
|
|
|
|
if ($item == 'email') {
|
|
$account_for_emails = $this->__getEmails();
|
|
$account_for_domains = $this->__getDomains();
|
|
$query = "SELECT `email` AS `item`,MIN(`date`) as `oldest`,MAX(`date`) as `newest`,sum(`sent`) as `sent`,sum(`recd`) as `recd`,SUM(`sentsize`) as `sentsize`,AVG(`sentsize`) as `sentavg`,SUM(`recdsize`) as `recdsize`,AVG(`recdsize`) as `recdavg` FROM " . TABLE_STAT_COUNTER;
|
|
$where = "WHERE ( `email` IN ('".implode("','",$account_for_emails)."') OR `domain` IN ('".implode("','",$account_for_domains)."') )";
|
|
if($search){
|
|
$where .= " AND ( `email` like '%".$search."%' OR `domain` like '%".$search."%' )";
|
|
}
|
|
$group = "GROUP BY `email`";
|
|
} elseif ($item == 'domain') {
|
|
$account_for_domains = $this->__getDomains();
|
|
$query = "SELECT `domain` AS `item`,MIN(`date`) as `oldest`,MAX(`date`) as `newest`,sum(`sent`) as `sent`,sum(`recd`) as `recd`,SUM(`sentsize`) as `sentsize`,AVG(`sentsize`) as `sentavg`,SUM(`recdsize`) as `recdsize`,AVG(`recdsize`) as `recdavg` FROM " . TABLE_STAT_COUNTER;
|
|
$where = "WHERE ( `domain` IN ('".implode("','",$account_for_domains)."') )";
|
|
if($search){
|
|
$where .= " AND `domain` like '%".$search."%'";
|
|
}
|
|
$group = "GROUP BY `domain`";
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
if($order == 0) { $order = "ASC"; }
|
|
else { $order = "DESC"; }
|
|
|
|
$_order = "ORDER BY `$sort` $order";
|
|
|
|
$from = (int)$page * (int)$pagelen;
|
|
|
|
if($pagelen > 0) { $limit = " LIMIT " . (int)$from . ", " . (int)$pagelen; }
|
|
|
|
$query = $this->db->query($query.' '.$where.' '.$group.' '.$_order.' '.$limit.';');
|
|
|
|
if($query->num_rows >= 1)
|
|
{
|
|
return $query->rows;
|
|
} else {
|
|
// no results found
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
public function count_accounting($item = 'email',$search='') {
|
|
|
|
$account_for_emails = $this->__getEmails();
|
|
$account_for_domains = $this->__getDomains();
|
|
|
|
$search = preg_replace("/\s{1,}/", "", $search);
|
|
|
|
if($search){
|
|
$search_cond .= " AND ( `email` like '%".$search."%' OR `domain` like '%".$search."%' )";
|
|
}
|
|
|
|
$query = "SELECT `email` AS `item`,MIN(`date`) as `oldest`,MAX(`date`) as `newest`,sum(`sent`) as `sent`,sum(`recd`) as `recd`,sum(`sentsize`) as `sentsize`,sum(`recdsize`) as `recdsize` FROM " . TABLE_STAT_COUNTER;
|
|
|
|
if ($item == 'email') {
|
|
$where = "WHERE `email` IN ('".implode("','",$account_for_emails)."') OR `domain` IN ('".implode("','",$account_for_domains)."')";
|
|
if($search){
|
|
$where .= " AND ( `email` like '%".$search."%' OR `domain` like '%".$search."%' )";
|
|
}
|
|
$group = "GROUP BY `email`";
|
|
} elseif ($item == 'domain') {
|
|
$where = "WHERE `domain` IN ('".implode("','",$account_for_domains)."')";
|
|
if($search){
|
|
$where .= " AND `domain` like '%".$search."%'";
|
|
}
|
|
$group = "GROUP BY `domain`";
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
$query = $this->db->query($query.' '.$where.' '.$group.';');
|
|
|
|
return $query->num_rows;
|
|
}
|
|
|
|
private function __getEmails() {
|
|
$return = array();
|
|
$session = Registry::get('session');
|
|
|
|
array_push($return, $session->get("email"));
|
|
$emails = $session->get("emails");
|
|
|
|
foreach ($emails as $e) {
|
|
array_push($return,$e);
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
private function __getDomains() {
|
|
$return = array();
|
|
$session = Registry::get('session');
|
|
|
|
if(Registry::get('admin_user') >= 1) {
|
|
$return = $this->__getAcceptedDomains();
|
|
}elseif(Registry::get('auditor_user') == 1) {
|
|
array_push($return, $session->get("domain"));
|
|
$auditdomains = $session->get("auditdomains");
|
|
|
|
foreach ($auditdomains as $d) {
|
|
array_push($return,$d);
|
|
}
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
|
|
private function __getAcceptedDomains() {
|
|
// todo: move to domains model?
|
|
$return = array();
|
|
|
|
$query = $this->db->query("SELECT domain, mapped FROM " . TABLE_DOMAIN . " ORDER BY domain ASC");
|
|
|
|
foreach($query->rows as $domain)
|
|
{
|
|
if ($domain['domain'] == $domain['mapped']) {
|
|
array_push($return,$domain['domain']);
|
|
} else {
|
|
array_push($return,$domain['mapped']);
|
|
}
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
private function __decodeDate( $input ) {
|
|
|
|
if ( !is_numeric($input) )
|
|
{
|
|
// if we are passed words (yesterday, today), convert to unix timestamps representing the start of the day
|
|
$input = strtotime($input);
|
|
$return = $input - ($input%86400);
|
|
|
|
} elseif ( is_numeric($input) )
|
|
{
|
|
// if we are passed unix timestamps, ensure they represent the start of the day
|
|
$return = $input - ($input%86400);
|
|
}
|
|
|
|
return $return;
|
|
|
|
}
|
|
|
|
}
|
|
?>
|