Projekt

Obecné

Profil

<?php defined('SYSPATH') or die('No direct script access.');
/*
* This file is part of open source system FreeNetIS
* and it is released under GPLv3 licence.
*
* More info about licence can be found:
* http://www.gnu.org/licenses/gpl-3.0.html
*
* More info about project can be found:
* http://www.freenetis.org/
*
*/

/**
* Ulogd controller manages control over members traffic.
*
* @author Kliment Michal
* @package Controller
*/
class Ulogd_Controller extends Controller
{
/**
* Units
*
* @var array[string]
*/
public static $units = array
(
'kB', 'MB', 'GB', 'TB'
);
/**
* Contructs controller, only to setting of menu
*
* @author Michal Kliment
*/
public function __construct()
{
parent::__construct();

// contains items of menu
$this->sections = array
(
'actual_ip_addresses_traffic' => __('Actual traffic of IP addresses'),
'actual_members_traffic' => __('Actual traffic of members'),
'time_members_traffic' => __('Traffic of members in time')
);

// time of next update of ulogd
$this->ulogd_update_next = Settings::get('ulogd_update_last')
+ Settings::get('ulogd_update_interval');

// time of previous update ulogd
$this->ulogd_update_prev = Settings::get('ulogd_update_last')
- Settings::get('ulogd_update_interval');
}

/**
* Redirects to actual traffic of ip addresses
*
* @author Michal Kliment
*/
public function index()
{
url::redirect(url_lang::base().'ulogd/actual_ip_addresses_traffic');
}

/**
* Shows actual traffic of ip addresses
*
* @author Michal Kliment
* @param integer $limit_results
* @param string $order_by
* @param string $order_by_direction
* @param string $page_word
* @param integer $page
*/
public function actual_ip_addresses_traffic(
$limit_results = 100, $order_by = '', $order_by_direction = 'DESC',
$page_word = null, $page = 1)
{
// access control
if (!$this->acl_check_view(get_class($this),'ip_address'))
Controller::error(ACCESS);

// gets new selector
if (is_numeric($this->input->get('record_per_page')))
$limit_results = (int) $this->input->get('record_per_page');

// by default orders by ulogd's type of traffic of active members
if ($order_by == '')
$order_by = Settings::get('ulogd_active_type');
// ASC or DESC
if (strtolower($order_by_direction) != 'asc')
$order_by_direction = 'DESC';

$ip_addresses_traffic_model = new Ip_addresses_traffic_Model();

// counts all traffics of ip addresses
$total_ip_addresses_traffics = $ip_addresses_traffic_model->count_all_ip_addresses_traffics();

if (($sql_offset = ($page - 1) * $limit_results) > $total_ip_addresses_traffics)
$sql_offset = 0;

// returns all traffics of ip addresses
$ip_addresses_traffics = $ip_addresses_traffic_model->get_all_ip_addresses_traffics(
$sql_offset, (int) $limit_results, $order_by, $order_by_direction
);

// create grid
$grid = new Grid(url_lang::base().'actual_ip_addresses_traffic', '', array
(
'use_paginator' => true,
'use_selector' => true,
'current' => $limit_results,
'selector_increace' => 100,
'selector_min' => 100,
'selector_max_multiplier' => 20,
'base_url' => Config::get('lang').'/ulogd/actual_ip_addresses_traffic/'
. $limit_results.'/'.$order_by.'/'.$order_by_direction ,
'uri_segment' => 'page',
'total_items' => $total_ip_addresses_traffics,
'items_per_page' => $limit_results,
'style' => 'classic',
'order_by' => $order_by,
'order_by_direction' => $order_by_direction,
'limit_results' => $limit_results,
));
// first number for order number field
// direction for order number field
if ($order_by_direction == 'DESC')
{
$first_number = $sql_offset;
$direction = 1;
}
else
{
$first_number = $total_ip_addresses_traffics-($page-1)*$limit_results+1;
$direction = -1;
}

$grid->order_callback_field(Settings::get('ulogd_active_type'))
->label(__('Order'))
->callback('callback::ulogd_order_number_field', $first_number, $direction)
->help(help::hint('ulogd_order'))
->class('right');
$grid->callback_field('ip_address')
->label(__('Ip address'))
->class('right')
->order(FALSE)
->callback('callback::ulogd_ip_address_field');
$grid->order_callback_field('upload')
->label(__('Upload'))
->callback('callback::ulogd_traffic_field')
->class('right');
$grid->order_callback_field('download')
->label(__('Download'))
->callback('callback::ulogd_traffic_field')
->class('right');
$grid->order_callback_field('total')
->label(__('Total'))
->callback('callback::ulogd_traffic_field')
->class('right');
$grid->order_callback_field('member_id')
->label(__('Member'))
->callback('callback::ulogd_member_field', __('Is not in system').'!');

$grid->datasource($ip_addresses_traffics);

$view = new View('main');
$view->title = __('Actual traffic of ip addresses');
$view->content = new View('ulogd');
$view->content->headline = __('Actual traffic of ip addresses');
$view->content->grid = $grid;
$view->content->current = 'actual_ip_addresses_traffic';
$view->content->text = __('Traffic for the period').': '.
date('Y/m/d H:i:s', $this->ulogd_update_prev) . ' - '.
date('Y/m/d H:i:s', Settings::get('ulogd_update_last')).
', '.__('Next update').': '.
date('Y/m/d H:i:s',$this->ulogd_update_next);
$view->render(TRUE);
}

/**
* Shows actual traffic of members
*
* @author Michal Kliment
* @param integer $limit_results
* @param string $order_by
* @param string $order_by_direction
* @param string $page_word
* @param integer $page
*/
public function actual_members_traffic(
$limit_results = 100, $order_by = '', $order_by_direction = 'DESC',
$page_word = null, $page = 1)
{
// access control
if (!$this->acl_check_view(get_class($this),'member'))
Controller::error(ACCESS);
// gets new selector
if (is_numeric($this->input->get('record_per_page')))
$limit_results = (int) $this->input->get('record_per_page');

// by default orders by ulogd's type of traffic of active members
if ($order_by == '')
$order_by = Settings::get('ulogd_active_type');
// ASC or DESC
if (strtolower($order_by_direction) != 'asc')
$order_by_direction = 'DESC';

$members_traffic_model = new Members_traffic_Model();

// counts all traffics of members
$total_members_traffics = $members_traffic_model->count_all_members_traffics();

if (($sql_offset = ($page - 1) * $limit_results) > $total_members_traffics)
$sql_offset = 0;

// returns all traffics of members
$members_traffics = $members_traffic_model->get_all_members_traffics(
$sql_offset, (int) $limit_results, $order_by, $order_by_direction
);

// create grid
$grid = new Grid(url_lang::base().'actual_members_traffic', '', array
(
'use_paginator' => true,
'use_selector' => true,
'current' => $limit_results,
'selector_increace' => 100,
'selector_min' => 100,
'selector_max_multiplier' => 20,
'base_url' => Config::get('lang').'/ulogd/actual_members_traffic/'
.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
'uri_segment' => 'page',
'total_items' => $total_members_traffics,
'items_per_page' => $limit_results,
'style' => 'classic',
'order_by' => $order_by,
'order_by_direction' => $order_by_direction,
'limit_results' => $limit_results,
));
// first number for order number field
// direction for order number field
if ($order_by_direction == 'DESC')
{
$first_number = $sql_offset;
$direction = 1;
}
else
{
$first_number = $total_ip_addresses_traffics-($page-1)*$limit_results+1;
$direction = -1;
}

$grid->order_callback_field(Settings::get('ulogd_active_type'))
->label(__('Order'))
->callback('callback::order_number_field', $first_number, $direction)
->help(help::hint('ulogd_order'))
->class('right');
$grid->callback_field('member_id')
->label(__('Member'))
->callback('callback::member_field')
->order(FALSE);
$grid->order_callback_field('upload')
->label(__('Upload'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('download')
->label(__('Download'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('total')
->label(__('Total'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('active')
->label(__('Active'))
->callback('callback::active_field')
->class('center')
->help(help::hint('ulogd_active_button'));

$grid->datasource($members_traffics);

$view = new View('main');
$view->title = __('Actual traffic of members');
$view->content = new View('ulogd');
$view->content->headline = __('Actual traffic of members');
$view->content->grid = $grid;
$view->content->current = 'actual_members_traffic';
$view->content->text = __('Traffic for the period').': '.
date('Y/m/d H:i:s', $this->ulogd_update_prev) . ' - '.
date('Y/m/d H:i:s', Settings::get('ulogd_update_last')).
', '.__('Next update').': '.
date('Y/m/d H:i:s',$this->ulogd_update_next);
$view->render(TRUE);
}

/**
* Shows traffic of members in time
*
* @author Michal Kliment
* @param date $date_from
* @param date $date_to
* @param integer $limit_results
* @param string $order_by
* @param string $order_by_direction
* @param string $page_word
* @param integer $page
*/
public function time_members_traffic(
$date_from = NULL, $date_to = NULL, $limit_results = 100, $order_by = '',
$order_by_direction = 'DESC', $page_word = null, $page = 1)
{
// access control
if (!$this->acl_check_view(get_class($this),'member'))
Controller::error(ACCESS);

// gets new selector
if (is_numeric($this->input->get('record_per_page')))
$limit_results = (int) $this->input->get('record_per_page');

// date from is not valid, uses actual date
if (!$date_from || !valid::date_string($date_from))
$date_from = date('Y-m-d');

// date to is not valid, uses actual date
if (!$date_to || !valid::date_string($date_to) || $date_to < $date_from)
$date_to = $date_from;

// by default orders by ulogd's type of traffic of active members
if ($order_by == '')
$order_by = Settings::get('ulogd_active_type');
// ASC or DESC
if (strtolower($order_by_direction) != 'asc')
$order_by_direction = 'DESC';

$members_traffics_daily_model = new Members_traffics_daily_Model();

// count all daily traffics of members
$total_members_traffics = $members_traffics_daily_model->count_all_members_traffics_by_dates(
$date_from, $date_to
);

if (($sql_offset = ($page - 1) * $limit_results) > $total_members_traffics)
$sql_offset = 0;

// returns all daily traffics of members
$members_traffics = $members_traffics_daily_model->get_all_members_traffics_by_dates(
$date_from, $date_to, $sql_offset, (int) $limit_results,
$order_by, $order_by_direction
);

// create grid
$grid = new Grid(url_lang::base().'time_members_traffic', '', array
(
'use_paginator' => true,
'use_selector' => true,
'current' => $limit_results,
'selector_increace' => 100,
'selector_min' => 100,
'selector_max_multiplier' => 20,
'base_url' => Config::get('lang').'/ulogd/time_members_traffic/'
.$date_from.'/'.$date_to.'/'.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
'uri_segment' => 'page',
'total_items' => $total_members_traffics,
'items_per_page' => $limit_results,
'style' => 'classic',
'order_by' => $order_by,
'order_by_direction' => $order_by_direction,
'limit_results' => $limit_results,
'variables' => $date_from.'/'.$date_to.'/',
'url_array_ofset' => 2
));
// first number for order number field
// direction for order number field
if ($order_by_direction == 'DESC')
{
$first_number = $sql_offset;
$direction = 1;
}
else
{
$first_number = $total_ip_addresses_traffics-($page-1)*$limit_results+1;
$direction = -1;
}

$grid->order_callback_field(Settings::get('ulogd_active_type'))
->label(__('Order'))
->callback('callback::order_number_field', $first_number, $direction)
->help(help::hint('ulogd_order'))
->class('right');
$grid->callback_field('member_id')
->label(__('Member'))
->callback('callback::member_field')
->order(FALSE);
$grid->order_callback_field('upload')
->label(__('Upload'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('download')
->label(__('Download'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('total')
->label(__('Total'))
->callback('callback::traffic_field')
->class('right');

$grid->datasource($members_traffics);

// form to select date
$form = new Forge(
url::base(TRUE).url::current(TRUE),'', 'POST',
array('id' => 'article_form')
);
$form->set_attr('class', 'form_class')
->set_attr('method', 'post');
$form->group('')
->label(__('Choose date'));
$form->input('date_from')
->label(__('Date from').':')
->rules('required|valid_date_string')
->value($date_from);
$form->input('date_to')
->label(__('Date to').':')
->rules('required|valid_date_string')
->value($date_to);
$form->submit('submit')
->value(__('Save'));
special::required_forge_style($form, ' *', 'required');

// form is validate
if ($form->validate())
{
$form_data = $form->as_array();

// redirect to this page with new dates
url::redirect(
url_lang::base().'ulogd/time_members_traffic/'.
$form_data['date_from'].'/'.$form_data['date_to']
);
}

$view = new View('main');
$view->title = __('Traffic of members in time');
$view->content = new View('ulogd');
$view->content->headline = __('Traffic of members in time');
$view->content->grid = $form->html().'<br /><br />'.$grid;
$view->content->current = 'time_members_traffic';
$view->render(TRUE);
}
/**
* Shows traffics of member
*
* @author Michal Kliment
* @param type $member_id
* @param type $type
* @param type $limit_results
* @param string $order_by
* @param type $order_by_direction
* @param type $page_word
* @param type $page
*/
public function show_by_member (
$member_id = NULL, $type = 'daily', $limit_results = 50,
$order_by = NULL, $order_by_direction = 'ASC', $page_word = null,
$page = 1)
{
$allowed_types = array('daily', 'weekly', 'monthly', 'yearly');
$default_order_by = array('day', 'week', 'month', 'year');
// bad parameter
if (!$member_id || !is_numeric($member_id) || !in_array($type, $allowed_types))
Controller::warning(PARAMETER);
$member = new Member_Model($member_id);
// member doesn't exist
if (!$member->id)
Controller::error(RECORD);
// access control
if (!$this->acl_check_view(get_class($this),'member', $member->id))
Controller::error(ACCESS);
// get new selector
if (is_numeric($this->input->get('record_per_page')))
$limit_results = (int) $this->input->get('record_per_page');
$type_number = array_search($type, $allowed_types);
// load default order by if is not set
if (!$order_by)
$order_by = $default_order_by[$type_number];
// filter
$filter_form = new Filter_form('d');
if ($type_number == 0)
{
$filter_form->add('day')
->type('date');
}
if ($type_number == 1)
{
$filter_form->add('week')
->type('number');
}
if ($type_number == 2)
{
$filter_form->add('month')
->type('select_number')
->values(array
(
1 => __('January'),
2 => __('February'),
3 => __('March'),
4 => __('April'),
5 => __('May'),
6 => __('June'),
7 => __('July'),
8 => __('August'),
9 => __('September'),
10 => __('October'),
11 => __('November'),
12 => __('December')
));
}
if ($type_number == 3)
{
$filter_form->add('year')
->type('number')->values(date::years());
}
$filter_form->add('upload')
->type('number');
$filter_form->add('download')
->type('number');
if ($type_number > 0)
{
$filter_form->add('avg_upload')
->label(__('Avarage day upload'))
->type('number');
$filter_form->add('avg_download')
->label(__('Avarage day download'))
->type('number');
}
$members_traffics_daily_model = new Members_traffics_daily_Model();
$total_traffics = $members_traffics_daily_model->count_member_traffics(
$member->id, $type, $filter_form->as_sql()
);
if (($sql_offset = ($page - 1) * $limit_results) > $total_traffics)
$sql_offset = 0;
$traffics = $members_traffics_daily_model->get_member_traffics(
$member->id, $type, $sql_offset, $limit_results,
$order_by, $order_by_direction, $filter_form->as_sql()
);
$grid = new Grid(url_lang::base().'members', null, array
(
'current' => $limit_results,
'order_by' => $order_by,
'order_by_direction' => $order_by_direction,
'total_items' => $total_traffics,
'selector_increace' => 50,
'selector_min' => 50,
'base_url' => Config::get('lang').'/ulogd/show_by_member/'
.$member_id.'/'.$type.'/'.$limit_results.'/'
.$order_by.'/'.$order_by_direction,
'uri_segment' => 'page',
'variables' => $member_id.'/'.$type.'/',
'url_array_ofset' => 2,
'style' => 'classic',
'total_items' => $total_traffics,
'items_per_page' => $limit_results,
'filter' => $filter_form
));
if ($type_number == 0)
{
$grid->order_field('day')
->label(__('Day'))
->class('center');
}
if ($type_number == 1)
{
$grid->order_callback_field('week')
->label(__('Week'))
->callback('callback::week_field')
->class('center');
}
if ($type_number == 2)
{
$grid->order_callback_field('month')
->label(__('Month'))
->callback('callback::month_field')
->class('center');
}
if ($type_number == 3)
{
$grid->order_field('year')
->label(__('Year'))
->class('center');
}
$grid->order_callback_field('upload')
->label(__('Upload'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('download')
->label(__('Download'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('total')
->label(__('Total'))
->callback('callback::traffic_field')
->class('right');
if ($type_number > 0)
{
$grid->order_callback_field('avg_upload')
->label(__('Avarage day upload'))
->callback('callback::traffic_field')
->class('right');
$grid->order_callback_field('avg_download')
->label(__('Avarage day download'))
->callback('callback::traffic_field')
->class('right');
}
$grid->datasource($traffics);
$arr_types = array();
foreach ($allowed_types as $allowed_type)
$arr_types[] = __(''.$allowed_type);
// form to group by type
$form = new Forge(
url::base(TRUE).url::current(TRUE),'',
'POST', array('id' => 'article_form')
);
$form->set_attr('class', 'form_class')
->set_attr('method', 'post');
$form->dropdown('type')
->label(__('Group by').':')
->options($arr_types)
->selected($type_number);
$form->submit('submit')
->value(__('Submit'));
if ($form->validate())
{
url::redirect(
url_lang::base()."ulogd/show_by_member/$member_id/".
$allowed_types[$form->type->value]
);
}
// breadcrumbs navigation
$breadcrumbs = breadcrumbs::add()
->link('members/show_all', 'Members',
$this->acl_check_view('Members_Controller','members'))
->disable_translation()
->link('members/show/'.$member->id,
"ID $member->id - $member->name",
$this->acl_check_view(
'Members_Controller','members', $member->id
)
)
->enable_translation()
->text('Show traffic');
$view = new View('main');
$view->content = new View('ulogd_show_by_member');
$view->content->js_data_array_str = '';
$current_unit_id = 0;
// due to bug in Google Chart it draw graph only if there are more than 1 record
if ($total_traffics > 1)
{
$div = 1;
// finds ideal unit of transmitted data
if ($avg = $members_traffics_daily_model->avg_member_traffics($member->id, $type))
{
$val = ($avg->upload > $avg->download) ? $avg->upload : $avg->download;
while (($val /= $div) > 1024)
{
$div *= 1024;
$current_unit_id++;
}
}
$traffics = $members_traffics_daily_model->get_member_traffics(
$member->id, $type, 0, 0, '', '', $filter_form->as_sql()
);
foreach ($traffics as $traffic)
{
switch ($type)
{
case 'daily':
$text = $traffic->day;
$title = __('Day');
break;
case 'weekly':
$text = $traffic->week.'/'.$traffic->year;
$title = __('Week');
break;
case 'monthly':
$text = $traffic->month.'/'.$traffic->year;
$title = __('Month');
break;
case 'yearly':
$text = $traffic->year;
$title = __('Year');
break;
}
$view->content->js_data_array_str .= "
['$text', ".num::decimal_point(round($traffic->upload/$div,2)).
", ".num::decimal_point(round($traffic->download/$div,2))."],";
}
}
$view->title = __('Traffic of member').' '.$member->name;
$view->breadcrumbs = $breadcrumbs->html();
$view->content->member = $member;
$view->content->title = __('Traffic of member').' '.$member->name;
$view->content->total_traffics = $total_traffics;
$view->content->current_unit_id = $current_unit_id;
$view->content->grid = $grid;
$view->content->form = $form;
$view->render(TRUE);
}
}

?>
(64-64/75)