freenetis-github/application/controllers/device_logs.php @ b8a40ec0
8baed187 | Michal Kliment | <?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/
|
|||
*
|
|||
*/
|
|||
/**
|
|||
* Controller performs device' logs actions.
|
|||
*
|
|||
* @package Controller
|
|||
*/
|
|||
class Device_logs_Controller extends Controller
|
|||
{
|
|||
/**
|
|||
* Bridge between syslog mysql API and Freenetis's filter form library
|
|||
* @var array
|
|||
*/
|
|||
protected static $opers = array
|
|||
(
|
|||
Filter_form::OPER_CONTAINS => 'contains',
|
|||
Filter_form::OPER_CONTAINS_NOT => 'containsnot',
|
|||
Filter_form::OPER_IS => 'is',
|
|||
Filter_form::OPER_EQUAL => 'is',
|
|||
Filter_form::OPER_IS_NOT => 'isnot',
|
|||
Filter_form::OPER_EQUAL_NOT => 'isnot',
|
|||
Filter_form::OPER_SMALLER => 'smaller',
|
|||
Filter_form::OPER_GREATER_OR_EQUAL => 'smallernot',
|
|||
Filter_form::OPER_GREATER => 'greater',
|
|||
Filter_form::OPER_SMALLER_OR_EQUAL => 'greaternot',
|
|||
);
|
|||
c1bdc1c4 | Michal Kliment | /**
|
|
* Constructor, only test if networks is enabled
|
|||
*/
|
|||
public function __construct()
|
|||
{
|
|||
parent::__construct();
|
|||
// access control
|
|||
if (!Settings::get('networks_enabled'))
|
|||
Controller::error (ACCESS);
|
|||
}
|
|||
8baed187 | Michal Kliment | /**
|
|
* Shows all logs of all devices
|
|||
*
|
|||
* @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 show_all ($limit_results = 50, $order_by = 'datetime',
|
|||
$order_by_direction = 'DESC', $page_word = null, $page = 1)
|
|||
{
|
|||
// access control
|
|||
c1bdc1c4 | Michal Kliment | if (!$this->acl_check_view('Device_logs_Controller', 'device_log'))
|
|
8baed187 | Michal Kliment | Controller::error(ACCESS);
|
|
$filter_form = new Filter_form();
|
|||
$filter_form->add('host');
|
|||
$filter_form->add('facility');
|
|||
$filter_form->add('priority');
|
|||
$filter_form->add('level');
|
|||
$filter_form->add('tag');
|
|||
$filter_form->add('datetime')
|
|||
->label('Time')
|
|||
->type('date');
|
|||
$filter_form->add('program');
|
|||
$filter_form->add('msg')
|
|||
->label('Message');
|
|||
$data = $this->get_logs(
|
|||
$page, $limit_results, $order_by, $order_by_direction,
|
|||
$filter_form->as_array()
|
|||
);
|
|||
/**
|
|||
* @todo Replace with own exception handler
|
|||
*/
|
|||
if (!$data)
|
|||
Controller::error(RECORD);
|
|||
$title = __('Show logs of device');
|
|||
// grid of devices
|
|||
$grid = new Grid('devices', null, array(
|
|||
'current' => $limit_results,
|
|||
'selector_increace' => 50,
|
|||
'selector_min' => 50,
|
|||
'selector_max_multiplier' => 20,
|
|||
'base_url' => Config::get('lang').'/device_logs/show_all/'.
|
|||
$limit_results.'/'.$order_by.'/'.$order_by_direction ,
|
|||
'uri_segment' => 'page',
|
|||
'total_items' => $data->total,
|
|||
'items_per_page' => $limit_results,
|
|||
'style' => 'classic',
|
|||
'order_by' => $order_by,
|
|||
'order_by_direction' => $order_by_direction,
|
|||
'limit_results' => $limit_results,
|
|||
'filter' => $filter_form
|
|||
));
|
|||
$grid->order_field('host')
|
|||
->class('center');
|
|||
$grid->order_field('facility')
|
|||
->label(__('Facility'))
|
|||
->class('center');
|
|||
$grid->order_field('priority')
|
|||
->label(__('Priority'))
|
|||
->class('center');
|
|||
$grid->order_field('level')
|
|||
->label(__('Level'))
|
|||
->class('center');
|
|||
$grid->order_field('tag')
|
|||
->label(__('Tag'))
|
|||
->class('center');
|
|||
$grid->order_field('datetime')
|
|||
->label(__('Time'))
|
|||
->class('center');
|
|||
$grid->order_field('program')
|
|||
->label(__('Program'))
|
|||
->class('center');
|
|||
$grid->order_field('msg')
|
|||
->label(__('Message'))
|
|||
->class('center');
|
|||
$grid->datasource($data->rows);
|
|||
// breadcrumbs navigation
|
|||
$breadcrumbs = breadcrumbs::add()
|
|||
->link('devices/show_all', 'Devices',
|
|||
$this->acl_check_view('Devices_Controller', 'devices'))
|
|||
->text('Show logs of device');
|
|||
$view = new View('main');
|
|||
$view->title = $title;
|
|||
$view->breadcrumbs = $breadcrumbs->html();
|
|||
$view->content = new View('show_all');
|
|||
$view->content->headline = $title;
|
|||
$view->content->table = $grid;
|
|||
$view->render(TRUE);
|
|||
}
|
|||
/**
|
|||
* Shows logs belong to device
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param integer $device_id
|
|||
* @param integer $limit_results
|
|||
* @param string $order_by
|
|||
* @param string $order_by_direction
|
|||
* @param string $page_word
|
|||
* @param integer $page
|
|||
*/
|
|||
public function show_by_device ($device_id = NULL, $limit_results = 500, $order_by = 'datetime',
|
|||
$order_by_direction = 'DESC', $page_word = null, $page = 1)
|
|||
{
|
|||
// bad paremeter
|
|||
if (!$device_id || !is_numeric($device_id))
|
|||
Controller::warning (PARAMETER);
|
|||
$device = new Device_Model($device_id);
|
|||
// device doesn't exist
|
|||
if (!$device->id)
|
|||
Controller::error(RECORD);
|
|||
// access control
|
|||
c1bdc1c4 | Michal Kliment | if (!$this->acl_check_view('Device_logs_Controller', 'device_log', $device->user->member_id))
|
|
8baed187 | Michal Kliment | Controller::error(ACCESS);
|
|
$filter_form = new Filter_form(NULL, url_lang::current(3));
|
|||
$filter_form->add('facility');
|
|||
$filter_form->add('priority');
|
|||
$filter_form->add('level');
|
|||
$filter_form->add('tag');
|
|||
$filter_form->add('datetime')
|
|||
->label('Time')
|
|||
->type('date');
|
|||
$filter_form->add('program');
|
|||
$filter_form->add('msg')
|
|||
->label('Message');
|
|||
$ip_address_model = new Ip_address_Model();
|
|||
$ip_addresses = $ip_address_model->get_ip_addresses_of_device($device->id);
|
|||
$ips = array();
|
|||
foreach ($ip_addresses as $ip_address)
|
|||
$ips[] = $ip_address->ip_address;
|
|||
$data = $this->get_logs($page, $limit_results, $order_by,
|
|||
$order_by_direction, $filter_form->as_array(), $ips
|
|||
);
|
|||
/**
|
|||
* @todo Replace with own exception handler
|
|||
*/
|
|||
if (!$data)
|
|||
Controller::error(RECORD);
|
|||
$title = __('Show logs of device');
|
|||
// grid of devices
|
|||
$grid = new Grid('devices', null, array(
|
|||
'current' => $limit_results,
|
|||
'selector_increace' => 500,
|
|||
'selector_min' => 500,
|
|||
'selector_max_multiplier' => 20,
|
|||
'base_url' => Config::get('lang').'/device_logs/show_by_device/'.
|
|||
$device_id.'/'.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
|
|||
'uri_segment' => 'page',
|
|||
'total_items' => $data->total,
|
|||
'items_per_page' => $limit_results,
|
|||
'style' => 'classic',
|
|||
'order_by' => $order_by,
|
|||
'order_by_direction' => $order_by_direction,
|
|||
'limit_results' => $limit_results,
|
|||
'variables' => $device_id . '/',
|
|||
'url_array_ofset' => 1,
|
|||
'filter' => $filter_form
|
|||
));
|
|||
$grid->order_field('facility')
|
|||
->label(__('Facility'))
|
|||
->class('center');
|
|||
$grid->order_field('priority')
|
|||
->label(__('Priority'))
|
|||
->class('center');
|
|||
$grid->order_field('level')
|
|||
->label(__('Level'))
|
|||
->class('center');
|
|||
$grid->order_field('tag')
|
|||
->label(__('Tag'))
|
|||
->class('center');
|
|||
$grid->order_field('datetime')
|
|||
->label(__('Time'))
|
|||
->class('center');
|
|||
$grid->order_field('program')
|
|||
->label(__('Program'))
|
|||
->class('center');
|
|||
$grid->order_field('msg')
|
|||
->label(__('Message'))
|
|||
->class('center');
|
|||
$grid->datasource($data->rows);
|
|||
// breadcrumbs navigation
|
|||
$breadcrumbs = breadcrumbs::add()
|
|||
->link('members/show_all', 'Members',
|
|||
$this->acl_check_view('Members_Controller', 'members'))
|
|||
->disable_translation()
|
|||
->link('members/show/' . $device->user->member->id,
|
|||
'ID ' . $device->user->member->id . ' - ' . $device->user->member->name,
|
|||
$this->acl_check_view('Members_Controller', 'members', $device->user->member->id))
|
|||
->enable_translation()
|
|||
->link('users/show_by_member/' . $device->user->member_id, 'Users',
|
|||
$this->acl_check_view('Users_Controller', 'users', $device->user->member_id))
|
|||
->disable_translation()
|
|||
->link('users/show/' . $device->user->id,
|
|||
$device->user->name . ' ' . $device->user->surname . ' (' . $device->user->login . ')',
|
|||
$this->acl_check_view('Users_Controller', 'users', $device->user->member_id))
|
|||
->enable_translation()
|
|||
->link('devices/show_by_user/' . $device->user->id, 'Devices',
|
|||
$this->acl_check_view('Devices_Controller', 'devices', $device->user->member_id))
|
|||
->disable_translation()
|
|||
->link('devices/show/' . $device->id . '#device_' . $device_id . '_link',
|
|||
$device->name,
|
|||
$this->acl_check_edit('Devices_Controller', 'devices', $device->user->member_id))
|
|||
->enable_translation()
|
|||
->text('Show logs of device');
|
|||
$view = new View('main');
|
|||
$view->title = $title;
|
|||
$view->breadcrumbs = $breadcrumbs->html();
|
|||
$view->content = new View('show_all');
|
|||
$view->content->headline = $title;
|
|||
$view->content->table = $grid;
|
|||
$view->render(TRUE);
|
|||
}
|
|||
/**
|
|||
* Returns all logs depending on input data
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param integer $page
|
|||
* @param type $count
|
|||
* @param type $order_by
|
|||
* @param type $order_by_direction
|
|||
* @param type $filter
|
|||
* @param type $ip_addresses
|
|||
* @return type
|
|||
*/
|
|||
private function get_logs ($page = 1, $count = 200,
|
|||
$order_by = 'datetime', $order_by_direction = 'desc',
|
|||
$filter = array(), $ip_addresses = array())
|
|||
{
|
|||
if (!Settings::get('syslog_ng_mysql_api_enabled'))
|
|||
return NULL;
|
|||
$URL = Settings::get('syslog_ng_mysql_api_url')
|
|||
.'&order_by='.$order_by
|
|||
.'&order_by_direction='.$order_by_direction
|
|||
.'&page='.$page
|
|||
.'&count='.$count;
|
|||
foreach ($ip_addresses as $ip_address)
|
|||
$URL .= '&host[]='.urlencode ($ip_address);
|
|||
foreach ($filter as $filter_item)
|
|||
{
|
|||
if (!isset(self::$opers[$filter_item['op']]))
|
|||
continue;
|
|||
foreach ($filter_item['value'] as $value)
|
|||
{
|
|||
$URL .= '&'.$filter_item['key']
|
|||
.'_'.self::$opers[$filter_item['op']]
|
|||
.'[]='. urlencode($value);
|
|||
}
|
|||
}
|
|||
$json = @file_get_contents($URL);
|
|||
$data = json_decode($json);
|
|||
return $data;
|
|||
}
|
|||
}
|
|||
?>
|