Code

Updated rSyslog
[gosa.git] / gosa-plugins / rsyslog / addons / rsyslog / class_rsyslog.inc
1 <?php
3 class rsyslog extends plugin
4 {
5   var $plHeadline= "rSyslog";
6   var $plDescription= "View system logs";
8   var $servers = array();
9   var $selected_server = "";
10   var $selected_host = "all";
11   var $selected_priority = "all";
13   var $startTime = "";
14   var $stopTime  = "";
16   var $search_for ="";
18   var $sort_value  = "DeviceReportedTime";
19   var $sort_type  = "DESC";
20   var $limit  = "0";
21   var $limits = array(20,50,100,200,500,1000,'-');
22   var $page   = 0;
24   function rsyslog (&$config, $dn= NULL)
25   {
26     $this->config= &$config;
27     $this->ui = get_userinfo();
29     $this->startTime = date("d.m.Y", (time() - 7*24*60*60));
30     $this->stopTime  = date("d.m.Y", time());
32     // Get list of rsyslog servers 
33     $ldap = $this->config->get_ldap_link();
34     $ldap->cd($this->config->current['BASE']);
35     $ldap->search("objectClass=rSyslogServer",array("cn","rSyslogUser","rSyslogDatabase","rSyslogPassword"));
36     while($attrs = $ldap->fetch()){
37       if(empty($this->selected_server)) $this->selected_server = $attrs['cn'][0];
38       $s = array('cn' => $attrs['cn'][0], 'dn' => $attrs['dn'], 'Password' => '', 'status' => 'ok');
39       $s['User'] = $attrs['rSyslogUser'][0]; 
40       $s['Database'] = $attrs['rSyslogDatabase'][0]; 
41       $s['Hosts'] = array();
42       $s['Priorities'] = array();
43       $s['ACL'] = "";
44       if(isset($attrs['rSyslogPassword'])) $s['Password'] = $attrs['rSyslogPassword'][0];
45       $this->servers[$attrs['cn'][0]] = $s;
46     }
48     // Check for installed mysql extension, if missing abort
49     $this->mysql_extension_installed = is_callable("mysql_connect");
50     if(!$this->mysql_extension_installed) return;
52     // Test server connetivity 
53     $ui = get_userinfo();
54     foreach($this->servers as $name => $server)  
55     {
56       $link = @mysql_pconnect($server['cn'], $server['User'], $server['Password']);
57       if ($link === FALSE){
58         new log("debug","gosa_logging","dbconnect",array(),@mysql_error());
59         $this->servers[$name]['status'] = "connectfailed";
60         $this->servers[$name]['error']  = @mysql_error();
61         continue;
62       }elseif (! @mysql_select_db($server['Database'])){
63         new log("debug","gosa_logging","selectdb",array(),@mysql_error());
64         $this->servers[$name]['status'] = "dbmissing";
65         $this->servers[$name]['error']  = @mysql_error();
66         continue;
67       }else{
68         $this->servers[$name]['status'] = "ok";
69         $this->servers[$name]['error']  = "";
71         // Detect ACLs
72         $this->servers[$name]['ACL'] =  $ui->get_permissions($server['dn'], 'server/rsyslog','viewEntries');
74         // Get list of Hosts using this log server..
75         if(preg_match('/r/', $this->servers[$name]['ACL'])){
76           $query = "SELECT distinct(FromHost) FROM SystemEvents;";
77           $res = @mysql_query($query, $link);
78           if($res){
79             while($attrs = @mysql_fetch_assoc($res)){
80               $this->servers[$name]['Hosts'][$attrs['FromHost']] = $attrs['FromHost'];  
81             }
82           }else{
83             $this->servers[$name]['status'] = "query_failed";
84             $this->servers[$name]['error']  = @mysql_error();
85           }
86           $query = "SELECT distinct(Priority) FROM SystemEvents ORDER BY Priority;";
87           $res = @mysql_query($query, $link);
88           if($res){
89             while($attrs = @mysql_fetch_assoc($res)){
90               $this->servers[$name]['Priorities'][$attrs['Priority']] = $attrs['Priority'];  
91             }
92           }else{
93             $this->servers[$name]['status'] = "query_failed";
94             $this->servers[$name]['error']  = @mysql_error();
95           }
96         }
97       }
98     }
99   }
101   function execute()
102   {
103     $smarty = get_smarty();
104     $smarty->assign("usePrototype", "true");
105     $ui = get_userinfo();
106     
107     if(!isset($this->servers[$this->selected_server]) || !count($this->servers[$this->selected_server]['Hosts'])){
108       $hosts = array('-' => _("-"));
109     }else{
110       $hosts = array('all' => _("All"));
111       $hosts = array_merge($hosts,$this->servers[$this->selected_server]['Hosts']);
112     }
113     if(!isset($this->servers[$this->selected_server]) || !count($this->servers[$this->selected_server]['Priorities'])){
114       $priorities = array('-' => _("-"));
115     }else{
116       $priorities = array('all' => _("All"));
117       foreach($this->servers[$this->selected_server]['Priorities'] as $id => $name){
118         $priorities[$id] = $name;
119       }
120     }
122     $result =$this->get_result();
124     $smarty->assign("servers",$this->servers);
125     $smarty->assign("hosts",$hosts);
126     $smarty->assign("priorities",$priorities);
127     $smarty->assign("selected_server",$this->selected_server);
128     $smarty->assign("selected_host",$this->selected_host);
129     $smarty->assign("selected_priority",$this->selected_priority);
130     $smarty->assign("search_for",$this->search_for);
131     $smarty->assign("startTime",  $this->startTime);
132     $smarty->assign("stopTime",    $this->stopTime);
133     $smarty->assign("sort_type",    $this->sort_type);
134     $smarty->assign("sort_value",   $this->sort_value);
135     $smarty->assign("limits",   $this->limits);
136     $smarty->assign("limit",    $this->limit);
137     $smarty->assign("page",    $this->page);
138     $smarty->assign("plug_id", $_GET['plug']);
139     $smarty->assign("downimg", "<img src='images/lists/sort-down.png' class='center' alt='\\/' border='0'>");
140     $smarty->assign("upimg", "<img src='images/lists/sort-up.png' class='center' alt='\\/' border='0'>");
141     $smarty->assign("result", $result);
142     if($this->limit != '-'){
143       $smarty->assign("page_sel", range_selector($result['count'],$this->page,$this->limits[$this->limit]));
144     }else{
145       $smarty->assign("page_sel", "");
146     }
148     return($smarty->fetch(get_template_path("rSyslog.tpl", TRUE)));
149   }
151   function get_result()
152   {
153     $result = array();
154     $result['entries'] = array();
155     $result['status']  = "ok";
156     $result['count']   = 0;
157     $result['error']   = "";
159     // Check whether the selected server exists.
160     if(!isset($this->servers[$this->selected_server])){
161       $this->servers[$name]['status'] = sprintf(_("The selected server '%s' does not exists!"),$this->selected_server);
162       $this->servers[$name]['error']  = $this->servers[$this->selected_server]['error'];
163       return($result);
164     }
166     // Check database connectivity    
167     $name = $this->selected_server;
168     $server = $this->servers[$name];
169     $link = @mysql_pconnect($server['cn'], $server['User'], $server['Password']);
170     if ($link === FALSE){
171       new log("debug","gosa_logging","dbconnect",array(),@mysql_error());
172       $this->servers[$name]['status'] = "connectfailed";
173       $this->servers[$name]['error']  = @mysql_error();
174     }elseif (! @mysql_select_db($server['Database'])){
175       new log("debug","gosa_logging","selectdb",array(),@mysql_error());
176       $this->servers[$name]['status'] = "dbmissing";
177       $this->servers[$name]['error']  = @mysql_error();
178     }else{
179       $this->servers[$name]['status'] = "ok";
180       $this->servers[$name]['error']  = "";
181     }
183     // Get log entries matching the selected filter
184     if(preg_match('/r/', $this->servers[$name]['ACL'])){
186       $host = "%%";
187       if($this->selected_host != "all") $host = $this->selected_host;
188       $prio = "%%";
189       if($this->selected_priority != "all") $prio = $this->selected_priority;
191       $filter = "FROM SystemEvents WHERE FromHost like '{$host}' ";
192       $filter.= "AND Priority like '{$prio}' ";
193       $filter.= "AND DeviceReportedTime >= '".(date("Y.m.d 00:00:00", strtotime($this->startTime)))."' ";     
194       $filter.= "AND DeviceReportedTime <= '".(date("Y.m.d 23:59:59", strtotime($this->stopTime)))."' ";     
196       if(!empty($this->search_for)){
197         $filter.= "AND ( ( SysLogTag like '%".$this->search_for."%' ) OR  ( Message like '%".$this->search_for."%' ) ) ";
198       }
200       // Detect amount of matching entries 
201       $query = "SELECT count(ID) as `amount` ".$filter;
202       $res = @mysql_query($query, $link);
203       if($res && $attrs = @mysql_fetch_assoc($res)){ 
204         $result['count'] = $attrs['amount'];
205       }else{
206         $this->servers[$name]['status'] = "query_failed";
207         $this->servers[$name]['error']  = @mysql_error();
208       }
210       if($result['count']){
212         if($result['count'] < $this->page) $this->page = 0;
214         $filter.= "ORDER BY ".$this->sort_value." ".$this->sort_type.", DeviceReportedTime ".$this->sort_type." ";
215         if($this->limit != "-"){
216           $filter.= "LIMIT ".$this->page.", ".$this->limits[$this->limit];
217         }else{
218           $this->page = 0;
219         }
221         $query = "SELECT * ".$filter;
222         $res = mysql_query($query, $link);
223         if($res){
224           while($attrs = @mysql_fetch_assoc($res)){
225             $result['entries'][] = $attrs;
226           }
227           $this->servers[$name]['status'] = "ok";
228           $this->servers[$name]['error']  = "";
229         }else{
230           $this->servers[$name]['status'] = "query_failed";
231           $this->servers[$name]['error']  = @mysql_error();
232         }
233       }
234     }
235     $result['status'] =$this->servers[$name]['status'];
236     $result['error'] =$this->servers[$name]['error'];
237     return($result);
238   }
241   function save_object()
242   {
243     // Get timestamps
244     foreach(array("stopTime","startTime") as $attr){
245       if(isset($_POST[$attr])) $this->$attr = get_post($attr);
246     }
247     
248     // Get server from post
249     if( isset($_POST['selected_server']) && isset($this->servers[$_POST['selected_server']])){ 
250       $this->selected_server = $_POST['selected_server'];
251     }
253     // Get Host
254     if( isset($_POST['selected_host']) && 
255         ($_POST['selected_host'] == "all" || 
256          in_array($_POST['selected_host'],$this->servers[$this->selected_server]['Hosts']))){
257       $this->selected_host = $_POST['selected_host'];
258     }
260     // Get priority from post
261     if( isset($_POST['selected_priority']) && 
262         ($_POST['selected_priority'] == "all" || 
263          in_array($_POST['selected_priority'],$this->servers[$this->selected_server]['Priorities']))){
264       $this->selected_priority = $_POST['selected_priority'];
265     }
266       
267     // Get serach string
268     if(isset($_POST['search_for'])){
269       $this->search_for = trim(get_post('search_for'));
270     } 
272     // Get page navigation attributes  
273     if(isset($_GET['start'])) $this->page = $_GET['start'];
274     if(isset($_POST['limit']) && isset($this->limits[$_POST['limit']])){
275       $this->limit = $_POST['limit'];
276     }
278     // Get sorting attributes 
279     if(isset($_GET['sort_value']) && in_array($_GET['sort_value'], 
280           array("DeviceReportedTime","FromHost","Facility","Priority","Message","SysLogTag"))){
281       $sort_value = $_GET['sort_value'];
282       if($this->sort_value == $sort_value){
283         if($this->sort_type == "ASC"){
284           $this->sort_type="DESC"; 
285         }else{
286           $this->sort_type="ASC"; 
287         }
288       } 
289       $this->sort_value=$sort_value; 
290     } 
291   }
293 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
294 ?>