Added a new script gcm_maintenance.php to cleanup the database
[gnucomo.git] / src / gcm_daemon / classes / gnucomo.process_log.php
1 <?PHP
2
3 /*
4  *    NOTE:  THIS MODULE IS OBSOLETE
5  */
6
7 /**********************************************************************************
8 **  (c) Copyright 2002, Brenno J.S.A.A.F. de Winter, De Winter Information Soltions
9 ** This is free software; you can redistribute it and/or modify it under the
10 ** terms of the GNU General Public License, see the file COPYING.
11 ***********************************************************************************/
12
13 function linux_log ()
14 {
15   /* The function linux_log will seperate the logline in several elements. This will
16    * ease the work of recognizing the type of logline. Once this has been detected
17    * the correct module will start using the data for a log_adv-table.
18    * INPUT    : NONE
19    * GLOBALS  : $dbms (database class containing the logline)
20    * OUTPUT   : Status of success ('TRUE' for success and 'FALSE' for failure
21    */
22
23    global $dbms;
24    global $developrelease;
25
26    $local_log_string = str_replace("  ", " ", $dbms->db_result_row[6]);
27    $local_logline_array = explode (" ", $local_log_string);
28
29    $service_type = $dbms->db_result_row[3];
30    switch (strtolower($service_type))
31    {
32    case "kernel":
33       //This is a kernel logline now discover which type kernel-record we have
34
35       //Detect if this is a network-line
36       if (strtolower(substr($local_logline_array[5],0,3)) == "in=")
37       {
38          //this is a networkline call the processing the routines
39          $local_result = linux_kernel_network();
40          return $local_result;
41       }
42       else
43       {
44
45          //This line is a kernel line writing about a device.
46          if (strtolower($local_logline_array[4]) == 'device')
47          {
48             echo $local_log_string;
49
50             $local_result = linux_kernel_device();
51             return $local_result;
52          }
53          else
54          {
55             if ($developrelease == 'TRUE')
56             {
57
58                $local_failing_string = "Failing string: ".$dbms->db_result_row[5];
59                syslog (LOG_INFO, "Unrecognized kernelline:".$local_log_string);
60                syslog (LOG_INFO, $local_failing_string);
61             }
62             return "FALSE";
63          }
64       }
65       break;
66
67    case "anacron":
68       $local_result = linux_daemon();
69       break;
70
71    case "apmd":
72       $local_result = linux_daemon();
73       break;
74
75    case "atd":
76       $local_result = linux_daemon();
77       break;
78
79    case "crond":
80       $local_result = linux_daemon();
81       break;
82
83    case "httpd":
84       $local_result = linux_daemon();
85       break;
86
87    case "lpd":
88       $local_result = linux_daemon();
89       break;
90
91    case "mysqld":
92       $local_result = linux_daemon();
93       break;
94
95    case "postfix":
96       $local_result = linux_daemon();
97       break;
98
99    case "random":
100       $local_result = linux_daemon();
101       break;
102
103    case "rhnsd":
104       $local_result = linux_daemon();
105       break;
106
107    case "sendmail":
108       $local_result = linux_daemon_sendmail();
109       break;
110
111    case "syslog":
112       $local_result = linux_daemon();
113       break;
114
115    case "syslogd":
116       $local_result = linux_daemon();
117       break;
118
119    case "xinetd":
120       $local_result = linux_daemon();
121       break;
122
123    default:
124       break;
125    }
126 }
127
128 function linux_daemon_sendmail()
129 {
130
131    /* This function is able to deal with the logs delivered by MTAs
132     * the following are currently supported:
133     * - sendmail
134     * INPUT   : NONE
135     * GLOBALS : $dbms, $dbms_working
136     * OUTPUT  : "TRUE" for success and "FALSE" for failure.
137     */
138
139    global $dbms;
140    global $dbms_working;
141
142     //Basic processing.
143
144     //Determine the type of records
145     //When this is sendmail find the beginning by chopping everything into
146     //little pieces.
147     $local_log_string = str_replace("  ", " ", $dbms->db_result_row[6]);
148     //echo " Processing " . $local_log_string . "\n";
149     $local_logline_array = explode (" ", $local_log_string);
150
151     $local_sql_1 = "INSERT INTO log_adv_daemon_email"; //BASIC STATEMENT
152     $local_sql_2 = "logid, detailed_table, service"; //FIELDS
153     $local_sql_3 = "'".$dbms->db_result_row[0]."', 'log_adv_daemon_email', 'sendmail'"; //VALUES
154
155     $message_id = trim($local_logline_array[5], " \t:");
156
157     if ($message_id == 'NOQUEUE')
158     {
159        //  This is an error rather than a real message id.
160
161        $local_sql_2 .= ", event";
162        $local_sql_3 .= ", '". $message_id ."'";
163
164        //  Try to find the source IP address in the 6th or 7th word.
165
166        $source_ip = strstr($local_logline_array[6], "[");
167        if ($source_ip)
168        {
169           $end =  strpos($source_ip, "]");
170           $source_ip = substr($source_ip, 1, $end - 1);
171        }
172        else
173        {
174           $source_ip = strstr($local_logline_array[7], "[");
175           if ($source_ip)
176           {
177              $end =  strpos($source_ip, "]");
178              $source_ip = substr($source_ip, 1, $end - 1);
179           }
180        }
181
182        if ($source_ip)
183        {
184           // We found a source IP address
185
186           $local_sql_2 .= ", source_ip";
187           $local_sql_3 .= ", '". $source_ip ."'";
188        }
189        else
190        {
191           echo "Sendmail error NOQUEUE but no source IP found. logid = " .$dbms->db_result_row[0] . "\n";
192        }
193     }
194     else
195     {
196        $local_sql_2 .= ", internal_messageid";
197        $local_sql_3 .= ", '". $message_id ."'";
198        $local_len   = 0;
199        $local_id    = 0;
200    
201        for ($i = 6; $i <= ( count($local_logline_array) - 1); $i++)
202        {
203    
204            //Get rid of the nasty comma's at the end
205            if ( substr($local_logline_array[$i], strlen($local_logline_array[$i])-1, 1)  == "," )
206            {
207               $local_dummylength = strlen($local_logline_array[$i]) -1;
208               $local_dummy = substr ($local_logline_array[$i], 0,$local_dummylength );
209               $local_logline_array[$i] = trim($local_dummy);
210            }
211    
212            if (substr($local_logline_array[$i],0,1) == '[' && strstr($local_sql_2, "source_ip") == false)
213            {
214              $local_dummy = trim($local_logline_array[$i], " []:");
215              $local_sql_2 .= ", source_ip";
216              $local_sql_3 .= ", '$local_dummy'";
217            }
218            else if (strstr($local_logline_array[$i], "="))
219            {
220    
221               $local_element = explode("=", $local_logline_array[$i]);
222    
223               switch (strtolower($local_element[0]))
224               {
225               case "from":
226                  $local_sql_2 .= ", from_email";
227                  $local_sql_3 .= ", '". addslashes($local_element[1]) ."'";
228                  break;
229    
230               case "relay":
231                  $local_sql_2 .= ", relay";
232                  $local_sql_3 .= ", '". addslashes(trim($local_element[1], " []")) ."'";
233                  break;
234    
235               case "size":
236                  $local_sql_2 .= ", size";
237                  $local_sql_3 .= ", '".$local_element[1]."'";
238                  break;
239    
240               case "delay":
241                  $local_sql_2 .= ", delay";
242                  $local_sql_3 .= ", '".ereg_replace("\+", " ", $local_element[1])."'";
243                  break;
244    
245               case "xdelay":
246                  $local_sql_2 .= ", xdelay";
247                  $local_sql_3 .= ", '".ereg_replace("\+", " ", $local_element[1])."'";
248                  break;
249    
250               case "mailer":
251                  $local_sql_2 .= ", mailer";
252                  $local_sql_3 .= ", '".$local_element[1]."'";
253                  break;
254    
255               case "dsn":
256                  $local_sql_2 .= ", dsn";
257                  $local_sql_3 .= ", '".$local_element[1]."'";
258                  break;
259    
260               case "msgid":
261                  $local_sql_2 .= ", external_messageid";
262                  if (substr($local_element[1],0,1) == '<')
263                  {
264                     $local_sql_3 .= ", '";
265                     $local_sql_3 .= substr($local_element[1],1,(strlen($local_element[1])-2));
266                     $local_sql_3 .= "'";
267                  }
268                  else
269                  {
270                     $local_sql_3 .= ", '".$local_element[1]."'";
271                  }
272                  break;
273    
274               //As of this point we only deal with Status
275               case "stat":
276                  $local_sql_2 .= ", status";
277                  $local_sql_3 .= ", '".$local_element[1]."'";
278    
279                  $local_pos = strrpos (strtolower($local_logline_array[$i]), "stat=");
280                  $local_len = strlen($local_logline_array[$i]) - $local_pos - 6;
281                  $local_sql_2 .= ", status_details";
282                  $local_sql_3 .= ", '".substr($local_logline_array[$i], $local_pos + 5, $local_len) . "'";
283                  break;
284    
285               case "status":
286                  $local_sql_2 .= ", status";
287                  $local_sql_3 .= ", '".$local_element[1]."'";
288    
289                  $local_pos = strrpos (strtolower($local_logline_array[$i]), "status=");
290                  $local_len = strlen($local_logline_array[$i]) - $local_pos - 8;
291                  $local_sql_2 .= ", status_details";
292                  $local_sql_3 .= ", '".substr($local_logline_array[$i], $local_pos + 7, $local_len) . "'";
293                  break;
294    
295               case "reject":
296                  if ($local_element[1] == "550")
297                  {
298                     $local_sql_2 .= ", event";
299                     $local_sql_3 .= ", 'SPAM'";
300                  }
301                  else if ($local_element[1] == "553")
302                  {
303                     $local_sql_2 .= ", event";
304                     $local_sql_3 .= ", 'Blocked SPAM'";
305                  }
306                  else
307                  {
308                     echo "Unknown reject code in sendmail log: " . $local_element[1] .
309                             ", logid = " .$dbms->db_result_row[0] . "\n";
310                  }
311                  break;
312
313               case "POSSIBLE":
314                  echo "POSSIBLE ATTACK special report: $local_log_string\n";
315                  break;
316
317               default:
318                  if (substr(strtolower($local_element[0]),0,1) == "[")
319                  {
320                    $local_sql_2 .= ", destination_ip";
321                    $local_sql_3 .= ", '". substr($local_element[1], 1, strlen($local_element[1]) - 2)."'";
322                  }
323                  break;
324               }
325            }
326        }
327     }
328
329     //Now that the data is complete create the SQL-statement
330     $local_sql = $local_sql_1." (".$local_sql_2.") VALUES (".$local_sql_3.")";
331     $dbms_working->query($local_sql);
332
333     RETURN "TRUE";
334 }
335
336 function linux_kernel_network()
337 {
338
339    /* This function is able to deal with the output of kernel-network messages
340     * coming from iptables and other similar tools. When elements are found
341     * that cannot be identified a notification will be written to the logbook
342     * for easy expansion of this routine.
343     * INPUT    : NONE
344     * GLOBALS  : $dbms, $dbms_working;
345     * OUTPUT   : "TRUE" for success and "FALSE" for failure.
346     */
347
348     global $dbms;
349     global $dbms_working;
350
351     $local_log_string = str_replace("  ", " ", $dbms->db_result_row[6]);
352     $local_logline_array = explode (" ", $local_log_string);
353     $local_sql_1 = "INSERT INTO log_adv_kernel_network"; //BASIC STATEMENT
354     $local_sql_2 = "logid, detailed_table"; //FIELDS
355     $local_sql_3 = "'".$dbms->db_result_row[0]."', 'log_adv_kernel_network'"; //VALUES
356     $local_len   = 0;
357     $local_id    = 0;
358     $local_tos   = "F";
359
360     for ($i = 4; $i <= ( count($local_logline_array) - 1); $i++)
361     {
362         $local_element = explode("=", $local_logline_array[$i]);
363         switch (strtolower($local_element[0]))
364         {
365           case "in":
366             $local_sql_2 .= ", device_in";
367             $local_sql_3 .= ", '".$local_element[1]."'";
368             break;
369
370           case "out":
371             $local_sql_2 .= ", device_out";
372             $local_sql_3 .= ", '".$local_element[1]."'";
373             break;
374
375           case "mac":
376             $local_sql_2 .= ", hw_address";
377             $local_sql_3 .= ", '".$local_element[1]."'";
378             break;
379
380           case "src":
381             $local_sql_2 .= ", source_ip";
382             $local_sql_3 .= ", '".$local_element[1]."'";
383             break;
384
385          case "dst":
386             $local_sql_2 .= ", destination_ip";
387             $local_sql_3 .= ", '".$local_element[1]."'";
388             break;
389
390          case "len":
391             if ($local_len == 0) {
392                $local_sql_2 .= ", packet_length";
393                $local_len++;
394             } else {
395                $local_sql_2 .= ", body_len";
396             }
397
398             $local_sql_3 .= ", '".$local_element[1]."'";
399             break;
400
401          case "tos":
402             if ($local_tos == "F") {
403                $local_sql_2 .= ", tos_bit";
404                $local_sql_3 .= ", '".$local_element[1]."'";
405             }
406             $local_tos = "T";
407             break;
408
409          case "prec":
410             $local_sql_2 .= ", prec_bit";
411             $local_sql_3 .= ", '".$local_element[1]."'";
412             break;
413
414          case "ttl":
415             $local_sql_2 .= ", ttl";
416             $local_sql_3 .= ", '".$local_element[1]."'";
417             break;
418
419         case "id":
420
421             if ($local_id == 0) {
422                $local_sql_2 .= ", header_id";
423                $local_sql_3 .= ", '".$local_element[1]."'";
424                $local_id = 1;
425             }
426             break;
427
428         case "proto":
429             $local_sql_2 .= ", protocol";
430             $local_sql_3 .= ", '".$local_element[1]."'";
431             if ($local_element[1] == 'ICMP') {
432                $local_icmp = true;
433             }
434             break;
435
436        case "spt":
437             $local_sql_2 .= ", destination_port";
438             $local_sql_3 .= ", '".$local_element[1]."'";
439             break;
440
441        case "dpt":
442             $local_sql_2 .= ", source_port";
443             $local_sql_3 .= ", '".$local_element[1]."'";
444             break;
445
446        case "window":
447             $local_sql_2 .= ", window";
448             $local_sql_3 .= ", '".$local_element[1]."'";
449             break;
450
451        case "urgp":
452            $local_sql_2 .= ", urgp";
453            $local_sql_3 .= ", '".$local_element[1]."'";
454            break;
455
456        case "rst":
457            $local_sql_2 .= ", rst";
458            $local_sql_3 .= ", true";
459            break;
460
461        case "syn":
462            $local_sql_2 .= ", syn";
463            $local_sql_3 .= ", true";
464            break;
465
466        case "df":
467           $local_sql_2 .= ", df";
468           $local_sql_3 .= ", true";
469           break;
470
471        case "type":
472            $local_sql_2 .= ", type";
473            $local_sql_3 .= ", '".$local_element[1]."'";
474            break;
475
476        case "code":
477           $local_sql_2 .= ", code";
478           $local_sql_3 .= ", '".$local_element[1]."'";
479           break;
480
481        case "seq":
482           $local_sql_2 .= ", sequence_number";
483           $local_sql_3 .= ", '".$local_element[1]."'";
484           break;
485
486        case "res":
487           $local_sql_2 .= ", res";
488           $local_sql_3 .= ", '".$local_element[1]."'";
489           break;
490
491        case "[src":
492           /*This record is different. In ICMP information is sometimes returned on an original packet.
493            * When the brackets are used a second line will be added to the
494            * log_adv_kernel_network-table. For that reason the processing into the database will be
495            * done here as well. After that a new insert-string will be created.
496            */
497
498           //Enter the data into the database
499           $local_sql = $local_sql_1." (".$local_sql_2.") VALUES (".$local_sql_3.")";
500           $dbms_working->query($local_sql);
501
502           $local_sql_1 = "INSERT INTO log_adv_kernel_network"; //BASIC STATEMENT
503           $local_sql_2 = "logid, detailed_table"; //FIELDS
504           $local_sql_3 = "'".$dbms->db_result_row[0]."', 'kernel_network'"; //VALUES
505           $local_len   = 0;
506           $local_id    = 0;
507           break;
508       default:
509 /*           $local_element[0];
510            syslog(LOG_INFO, "Unrecognized kernel/network entry: ".$local_element[0]);
511
512 */
513      }
514
515    }
516
517
518    //Now that the data is complete create the SQL-statement
519    $local_sql = $local_sql_1." (".$local_sql_2.") VALUES (".$local_sql_3.")";
520    $dbms_working->query($local_sql);
521    RETURN "TRUE";
522
523 }
524
525 function linux_kernel_device()
526 {
527    /* This function is able to deal with the output of kernel-network messages
528     * coming from device related processes. Typically networkcard and other
529     * hardware-related data will show-up here
530     * INPUT    : NONE
531     * GLOBALS  : $dbms, $dbms_working
532     * OUTPUT   : "TRUE" for success and "FALSE" for failure.
533     */
534
535     global $dbms, $dbms_working;
536
537  }
538
539 function linux_daemon()
540 {
541    /* This function is able to deal with the output of kernel-network messages
542     * coming from device related processes. Typically networkcard and other
543     * hardware-related data will show-up here
544     * INPUT    : NONE
545     * GLOBALS  : $dbms, $dbms_working
546     * OUTPUT   : "TRUE" for success and "FALSE" for failure.
547     */
548
549     global $dbms, $dbms_working;
550
551     $local_log_line = strtolower($dbms->db_result_row[6]);
552
553     //Find a sign of stop
554     //Using the word shutdown
555     $pos = strpos($local_log_line, "shutdown");
556     if ($pos > 0)
557     {
558        $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
559        $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
560                     .$dbms->db_result_row[3]."', 'stop')";
561
562        $dbms_working->query($local_sql);
563     }
564     else
565     {
566       //Using the word stop
567       $pos = strpos($local_log_line, "stop");
568       if ($pos > 0)
569       {
570          $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
571          $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
572                       .$dbms->db_result_row[3]."', 'stop')";
573          $dbms_working->query($local_sql);
574       }
575       else
576       {
577         //As the word restart
578         $pos = strpos($local_log_line, "restart");
579         if ($pos > 0)
580         {
581           $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
582           $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
583                        .$dbms->db_result_row[3]."', 'stop')";
584           $dbms_working->query($local_sql);
585
586           $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
587           $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
588                        .$dbms->db_result_row[3]."', 'start')";
589           $dbms_working->query($local_sql);
590         }
591         else
592         {
593           //As the word start this is an else for restart.
594           //If we wouldn't do so restart would also give a positive on start
595           $pos = strpos($local_log_line, "start");
596           if ($pos > 0)
597           {
598             $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
599             $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
600                          .$dbms->db_result_row[3]."', 'start')";
601             $dbms_working->query($local_sql);
602           }
603           else
604           {
605
606             //The word error indicates problems.
607             $pos = strpos($local_log_line, "error");
608             $pos2 = strpos($local_log_line, "crash"); //The word crash is also considered to be an error
609
610             if ($pos > 0 or $pos2 > 0)
611             {
612                $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
613                $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
614                             .$dbms->db_result_row[3]."', 'error detected')";
615                $dbms_working->query($local_sql);
616
617                //Quite often an error will be followed with information that the daemon or service ended.
618                $pos = strpos($local_log_line, "abort");
619
620                if ($pos > 0)
621                {
622                   $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
623                   $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
624                                .$dbms->db_result_row[3]."', 'abort')";
625                   $dbms_working->query($local_sql);
626                }
627                else
628                {
629                  $pos = strpos($local_log_line, "ended");
630                  if ($pos > 0)
631                  {
632                     $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
633                     $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
634                                  .$dbms->db_result_row[3]."', 'abort')";
635                     $dbms_working->query($local_sql);
636                  }
637                  else
638                  {
639                    $pos = strpos($local_log_line, "stop");
640                    if ($pos > 0)
641                    {
642                       $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
643                       $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
644                                    .$dbms->db_result_row[3]."', 'abort')";
645                       $dbms_working->query($local_sql);
646                    }
647                    else
648                    {
649
650                      //For power management there is a charge warning
651                      $pos = strpos($local_log_line, "charge");
652                      if ($pos > 0)
653                      {
654                         $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
655                         $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
656                                      .$dbms->db_result_row[3]."', 'Power warning')";
657                         $dbms_working->query($local_sql);
658                      }
659                      else
660                      {
661
662                        //As the word start this is an else for restart.
663                        //If we wouldn't do so restart would also give a positive on start
664                        //This can only be done if we ensured nothing else was the case
665                        //PLEASE USE THIS AS LATE AS POSSIBLE!!!
666                        $pos = strpos($local_log_line, "exiting");
667                        if ($pos > 0)
668                        {
669                           $local_sql = "INSERT INTO log_adv_daemon (logid, detailed_table, service, event) VALUES ";
670                           $local_sql .= "('".$dbms->db_result_row[0]."', 'log_adv_daemon', '"
671                                        .$dbms->db_result_row[3]."', 'start')";
672                           $dbms_working->query($local_sql);
673                        }
674                      }
675                    }
676                  }
677                }
678             }
679           }
680         }
681       }
682     }
683     return "ok";
684
685 }
686
687 ?>