atinymon.php

Go to the documentation of this file.
00001 <?php
00002 session_name('ATMPHPSESSID') ;
00003 session_start() ;
00004 
00005 $app = "aTinyMON Real-Time monitoring application for Asterisk" ;
00006 $version = "v0.28 - 2007" ;
00007 
00008 /** \mainpage aTinyMON Real-Time monitoring application for Asterisk
00009  * \version v0.28beta - 2007
00010  */
00011 
00012 /* Written by Frederic LE FOLL (frederic       @     fr) __    /  \__
00013  * ___________________________          .lefoll free.      \__/      \_________ !
00014  *
00015  * This software is distributed under GPL 2 License (http://www.gnu.org/copyleft/gpl.html)
00016  */
00017 
00018 /** \file
00019  * A Tiny real-time monitoring board for Asterisk.
00020  *
00021  * Debug modes :
00022  * 0 : no debug
00023  * 1 : PHP error_reporting = E_ALL, display_errors = On. Debug atinyman.pl
00024  * 2 : + time = ticket time, simplified session dump
00025  * 3 : + full session dump
00026  * 4 : + step-by-step
00027  */
00028 
00029 include_once ('config.php') ;
00030 
00031 
00032 /** Protect HTML code : add escape chars.
00033  *
00034  * @param $text Input String
00035  * @returns Converted String
00036  */
00037 function my_htmlentities($text)
00038         {
00039         return (htmlentities($text, ENT_COMPAT, 'UTF-8')) ;
00040         }
00041 
00042 
00043 /** Clean device status information : delete (obsolete) call information.
00044  *
00045  * In debug or demo mode, "now", i.e. reference for tickets obsolescence, is the timestamp
00046  * of last ticket extracted from DB.
00047  * Otherwise, "now" is current server time.
00048  *
00049  * @param $type Channel type (SIP, ...)
00050  * @param $dev Device
00051  * @param $forced Set to TRUE to delete ALL call information, FALSE to delete obsolete call information only
00052  * @returns Number of calls remaining
00053  */
00054 function clean_dev_data($type, $dev, $forced)
00055         {
00056         $now = (DEBUG >= 2) || DEMO ? $_SESSION['last_ticket']['timestamp'] : time() ;
00057         $calls = 0 ;
00058         if (isset($_SESSION['st'][$type][$dev]['_chan']))
00059                 {
00060                 if ($forced)
00061                         {
00062                         $_SESSION['st'][$type][$dev]['_chan'] = array () ;
00063                         }
00064                 else
00065                         {
00066                         foreach (array_keys($_SESSION['st'][$type][$dev]['_chan']) as $chanid)
00067                                 {
00068                                 if ($now - $_SESSION['st'][$type][$dev]['_chan'][$chanid]['_ts'] > CALL_TIMEOUT)
00069                                         {
00070                                         unset ($_SESSION['st'][$type][$dev]['_chan'][$chanid]) ;
00071                                         }
00072                                 else
00073                                         {
00074                                         $calls++ ;
00075                                         }
00076                                 }
00077                         }
00078                 }
00079         if ($calls == 0 && $now - $_SESSION['st'][$type][$dev]['_ts'] > DEVICE_TIMEOUT)
00080                 {
00081                 unset ($_SESSION['st'][$type][$dev]) ;
00082                 }
00083         return ($calls) ;
00084         }
00085 
00086 
00087 /** Update device status information : handle an event about the device.
00088  *
00089  * @param $mode Mode : UPDATE or DELETE
00090  * @param $type Channel type (SIP, ...)
00091  * @param $dev Device
00092  * @param $ticket_a AMI ticket contents, stored in an associative array
00093  */
00094 function update_dev($mode, $type, $dev, $ticket_a)
00095         {
00096         if (MASK_PSEUDO &&
00097             ($type == 'Zap' && $dev == 'pseudo' ||
00098              $type == 'OutgoingSpoolFailed'))
00099                 return ;
00100 
00101         switch ($mode)
00102                 {
00103         case UPDATE :
00104                 if (!isset($_SESSION['st'][$type][$dev]))
00105                         {
00106                         $_SESSION['st'][$type][$dev] = array() ;
00107                         }
00108                 $_SESSION['st'][$type][$dev] = array_merge($_SESSION['st'][$type][$dev], $ticket_a) ;
00109                 break ;
00110 
00111         case DELETE :
00112                 unset ($_SESSION['st'][$type][$dev]) ;
00113                 break ;
00114 
00115         default :
00116                 }
00117         }
00118 
00119 
00120 /** Parse "chantype/dev-chanid" string and extract fields.
00121  *
00122  * This function analyses the input string and extracts the fields.
00123  * It tries to make its best with < Z O M B I E > and suffixes alike,
00124  * as well as with AsyncGoto/ and possibly other prefixes.
00125  * Warnin : obviously, this simplification may involve a loss of information, or
00126  * even worse, may generate incorrect information !
00127  *
00128  * @param $cnxid String, supposedly looking like "chantype/dev-chanid"
00129  * @returns array (chantype, dev, chanid)
00130  */
00131 function parse_cnxid($cnxid)
00132         {
00133         /* Remove any <xxx> suffix */
00134         $cnxid = preg_replace('/<\w+>$/', '', $cnxid) ;
00135          /* Remove any xxx/ prefix ahead of "chantype/".
00136           * Be even prepared to a cascade of A/B/C/... before chantype. */
00137         $cnxid = preg_replace('/^([\w\/]+\/)(\w+\/)/', '$2', $cnxid) ;
00138         list ($channel, $chanid) = explode('-', $cnxid) ;
00139         list($type, $dev) = explode("/", $channel) ;
00140         return (array ($type, $dev, $chanid)) ;
00141         }
00142 
00143 
00144 /** Update device status information : handle an event about a call related to the device.
00145  *
00146  * Device inherits from call event timestamp (update last time we heard about
00147  * the device ... or about a related call).
00148  *
00149  * @param $mode Mode : UPDATE or DELETE
00150  * @param $cnxid Connection id with syntax "channeltype/device-channelid"
00151  * @param $ticket_a AMI ticket contents, stored in an associative array
00152  */
00153 function update_dev_call($mode, $cnxid, $ticket_a)
00154         {
00155         list($type, $dev, $chanid) = parse_cnxid($cnxid) ;
00156 
00157         if (MASK_PSEUDO &&
00158             ($type == 'Zap' && $dev == 'pseudo' ||
00159              $type == 'OutgoingSpoolFailed'))
00160                 return ;
00161 
00162         $_SESSION['st'][$type][$dev]['_ts'] = $ticket_a['_ts'] ;
00163 
00164         switch ($mode)
00165                 {
00166         case UPDATE :
00167                 if (!isset($_SESSION['st'][$type][$dev]['_chan'][$chanid]))
00168                         {
00169                         $_SESSION['st'][$type][$dev]['_chan'][$chanid] = array() ;
00170                         }
00171                 $_SESSION['st'][$type][$dev]['_chan'][$chanid] = array_merge($_SESSION['st'][$type][$dev]['_chan'][$chanid], $ticket_a) ;
00172                 break ;
00173 
00174         case DELETE :
00175                 if (!isset($_SESSION['st'][$type][$dev]['_chan']))
00176                         {
00177                         $_SESSION['st'][$type][$dev]['_chan'] = array() ;
00178                         }
00179                 if (isset($_SESSION['st'][$type][$dev]['_chan'][$chanid]))
00180                         {
00181                         unset ($_SESSION['st'][$type][$dev]['_chan'][$chanid]) ;
00182                         }
00183                 break ;
00184 
00185         default :
00186                 }
00187         }
00188 
00189 /** Elaborate aTinyMON display
00190  */
00191 function run_session()
00192         {
00193         global $version, $ui, $status, $special, $db ;
00194 
00195         /* This code is called periodically, either because of refresh timeout, or because of user request.
00196          * Check whether a user request is pending (Post or Get method). */
00197 
00198         $userrequest = FALSE ;
00199         if (isset($_REQUEST['submit']['quit']))
00200                 {
00201                 if (isset($_COOKIE[session_name()]))
00202                         setcookie(session_name(), '', time() - 42000, '/') ;
00203                 $_SESSION = array() ;
00204                 session_destroy() ;
00205                 header('Location: ' . REDIRECT) ;
00206                 exit ;
00207                 }
00208         if (isset($_REQUEST['submit']['freeze']))
00209                 {
00210                 $_SESSION['freeze'] = TRUE ;
00211                 $userrequest = TRUE ;
00212                 }
00213         if (isset($_REQUEST['submit']['refresh']))
00214                 {
00215                 $_SESSION['freeze'] = FALSE ;
00216                 $userrequest = TRUE && !(DEBUG >= 4 /* Step-by-step mode */) ;
00217                 }
00218         if (isset($_REQUEST['submit']['view']))
00219                 {
00220                 foreach (array_keys($_REQUEST['submit']['view']) as $type)
00221                         {
00222                         $_SESSION['view'][$type] = !$_SESSION['view'][$type] ;
00223                         }
00224                 $userrequest = TRUE ;
00225                 }
00226         if (isset($_REQUEST['submit']['showoffline']))
00227                 {
00228                 $_SESSION['showoffline'] = !$_SESSION['showoffline'] ;
00229                 $userrequest = TRUE ;
00230                 }
00231         if (isset($_REQUEST['submit']['showevents']))
00232                 {
00233                 $_SESSION['showevents'] = !$_SESSION['showevents'] ;
00234                 $userrequest = TRUE ;
00235                 }
00236         if (isset($_REQUEST['itemsperrow']))
00237                 {
00238                 $_SESSION['itemsperrow'] = $_REQUEST['itemsperrow'] ;
00239                 $userrequest = TRUE ;
00240                 }
00241         if (isset($_REQUEST['zoom']))
00242                 {
00243                 $_SESSION['zoom'] = $_REQUEST['zoom'] ;
00244                 $userrequest = TRUE ;
00245                 }
00246         if (isset($_REQUEST['id']))
00247                 {
00248                 $_SESSION['last_ticket']['id'] = $_REQUEST['id'] ;
00249                 $_SESSION['last_ticket']['datetime'] = NULL ;
00250                 $_SESSION['last_ticket']['timestamp'] = NULL ;
00251                 $_SESSION['last_ticket']['ticket'] = NULL ;
00252                 $_SESSION['last_ticket']['handled'] = TRUE ;
00253                 $userrequest = TRUE ;
00254                 }
00255 
00256         /* Assign default value to any non initialized variable */
00257 
00258         if (!isset($_SESSION['counter']))
00259                 {
00260                 $_SESSION['counter'] = 0 ;
00261                 }
00262         else
00263                 {
00264                 $_SESSION['counter']++ ;
00265                 }
00266         if (!isset($_SESSION['freeze']))
00267                 {
00268                 $_SESSION['freeze'] = FALSE ;
00269                 }
00270         if (!isset($_SESSION['online']))
00271                 {
00272                 $_SESSION['online'] = FALSE ;
00273                 }
00274         if (!isset($_SESSION['refresh_min']))
00275                 {
00276                 $_SESSION['refresh_min'] = REFRESH_MIN ;
00277                 }
00278         if (!isset($_SESSION['refresh_max']))
00279                 {
00280                 $_SESSION['refresh_max'] = REFRESH_MAX ;
00281                 }
00282         if (!isset($_SESSION['last_ticket']))
00283                 {
00284                 $_SESSION['last_ticket']['id'] = 0 ;
00285                 $_SESSION['last_ticket']['datetime'] = 0 ;
00286                 $_SESSION['last_ticket']['timestamp'] = 0 ;
00287                 $_SESSION['last_ticket']['ticket'] = '' ;
00288                 $_SESSION['last_ticket']['handled'] = TRUE ;
00289                 }
00290         if (!isset($_SESSION['st']))
00291                 {
00292                 $_SESSION['st'] = array () ;
00293                 $_SESSION['st']['Asterisk']['status'] = 'unknown' ;
00294                 }
00295         if (!isset($_SESSION['view']))
00296                 {
00297                 $_SESSION['view']['Asterisk'] = TRUE ;
00298                 $_SESSION['view']['SIP'] = TRUE ;
00299                 }
00300         if (!isset($_SESSION['itemsperrow']))
00301                 {
00302                 $_SESSION['itemsperrow'] = 6 ;
00303                 }
00304         if (!isset($_SESSION['showoffline']))
00305                 {
00306                 $_SESSION['showoffline'] = OFFLINE_BY_DEFAULT ;
00307                 }
00308         if (!isset($_SESSION['showevents']))
00309                 {
00310                 $_SESSION['showevents'] = EVENTS_BY_DEFAULT || DEBUG ;
00311                 }
00312         if (!isset($_SESSION['hostname']))
00313                 {
00314                 $_SESSION['hostname'] = exec('hostname') ;
00315                 }
00316 
00317         /* Connect to DB server */
00318 
00319         $db = mysql_pconnect(DB_HOST, DB_USERNAME, DB_PASSWORD) ;
00320         if (!$db)
00321                 {
00322                 trigger_error(mysql_error() . ' after mysql_pconnect()', E_USER_ERROR) ;
00323                 }
00324 
00325         /* Select Database */
00326 
00327         if ($db)
00328                 {
00329                 $query = "set NAMES utf8" ;
00330                 $result = $db ? mysql_query($query) : FALSE ; if (!$result && $db) trigger_error(mysql_error() . ' after : ' . $query, E_USER_ERROR) ;
00331 
00332                 /* Add next two lines only if necessary */
00333                 /* $query = "set CHARACTER_SET utf8" ; */
00334                 /* $result = $db ? mysql_query($query) : FALSE ; if (!$result && $db) trigger_error(mysql_error() . ' after : ' . $query, E_USER_ERROR) ; */
00335 
00336                 $result = mysql_select_db(DB_DATABASE) ;
00337                 if (!$result)
00338                         {
00339                         trigger_error(mysql_error() . ' after mysql_select_db()', E_USER_ERROR) ;
00340                         mysql_close($db) ;
00341                         $db = NULL ;
00342                         }
00343                 }
00344 
00345         /* Check Tickets table (only during initialization phase) */
00346 
00347         if ($db && !$_SESSION['online'])
00348                 {
00349                 $query = "CREATE TABLE IF NOT EXISTS `tickets` (
00350                           `id` int(11) NOT NULL auto_increment,
00351                           `datetime` datetime NOT NULL default '0000-00-00 00:00:00',
00352                           `ticket` text NOT NULL,
00353                           PRIMARY KEY  (`id`)
00354                           ) DEFAULT CHARSET=utf8 ;" ;
00355                 $result = mysql_query($query) ;
00356                 if (!$result)
00357                         {
00358                         trigger_error(mysql_error() . ' after mysql_query()', E_USER_ERROR) ;
00359                         mysql_close($db) ;
00360                         $db = NULL ;
00361                         }
00362                 }
00363 
00364         /* Run background monitoring application */
00365 
00366         if ($db && !$_SESSION['online'])
00367                 {
00368                 if (DEMO)
00369                         {
00370                         $_SESSION['online'] = TRUE ;
00371                         }
00372                 else
00373                         {
00374                         $check = exec(MON_APP . ' ping') ;
00375                         if ($check == 'pong')
00376                                 {
00377                                 $args = AST_USERNAME . ' ' . AST_PASSWORD .
00378                                        ' -d=' . DEBUG .
00379                                        ' -h=' . AST_HOST .
00380                                        ' -p=' . AST_PORT .
00381                                        ' -a' . /* Auto-reconnect to Asterisk */
00382                                        ' -u' . /* Unique instance */
00383                                        ' -de' . /* Detach */
00384                                        ' -dbh=' . DB_HOST .
00385                                        ' -dbp=' . DB_PORT .
00386                                        ' -dbu=' . DB_USERNAME .
00387                                        ' -dbw=' . DB_PASSWORD .
00388                                        ' -dbd=' . DB_DATABASE .
00389                                        ' -dbt=' . DB_TABLE .
00390                                        ' -dbe=' . TICKETS_PURGE . /* Erase tickets older than ... */
00391                                        // ' -dbc' . /* Create table if not exists */
00392                                        ' -c="loop ' . POLLING_PERIOD . ' / action: sippeers / . / ! 1 / Action: zapshowchannels / . / ! 1 / Action: status / . /"' ;
00393                                 /* Playing with different ways to start a process in background, ...
00394                                  * The proc_open(proc_close(...)) seems slightly prefered to popen(pclose(...)) and better anyway than exec(...)
00395                                  * (my own experiments, and general opinions). */
00396                                 proc_close(proc_open (MON_APP . " $args &", array(), $pipes));
00397                                 $_SESSION['online'] = TRUE ;
00398                                 }
00399                         else
00400                                 {
00401                                 trigger_error(MON_APP . " is not available (test result : '$check')", E_USER_ERROR) ;
00402                                 }
00403                         }
00404                 }
00405 
00406         $sid = SID ? "?" . strip_tags(SID) : "" ;
00407         $url = $_SERVER['PHP_SELF'] . $sid ;
00408         $now = time() ;
00409         $_SESSION['scanstart'] = $now ;
00410 
00411         /*********************************************************************************
00412          * HTML Header, including refresh information.
00413          *********************************************************************************/
00414 
00415         header("Cache-Control: no-cache, must-revalidate") ;
00416         header("Expires: Mon, 26 Jul 1997 05:00:00 GMT") ;
00417         header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT") ;
00418         if ($_SESSION['online'] && !$_SESSION['freeze'] && !(DEBUG >= 4 /* Step-by-step mode */))
00419                 {
00420                 $refresh_min = $_SESSION['refresh_min'] ;
00421                 header("Refresh: $refresh_min; URL=$url");
00422                 }
00423 
00424         print "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" ;
00425         print "<html>\n" ;
00426         print "<head>\n" ;
00427         print "  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n" ;
00428         print "  <title>atinymon - " . $_SESSION['hostname'] . "</title>\n" ;
00429         print "  <link type=\"text/css\" href=\"css/atinymon.css\" rel=\"stylesheet\">\n" ;
00430         print "</head>\n" ;
00431         print "<body>\n" ;
00432 
00433         /* Handle tickets available in DB.
00434          * We may wait for new tickets within the time limit of $_SESSION['refresh_max'] */
00435 
00436         $maxtime = $now + $_SESSION['refresh_max'] - $_SESSION['refresh_min'] ;
00437         $newtickets = 0 ;                           /* Count the number of tickets during current page execution */
00438         $maxnewtickets = TICKETS_PER_REFRESH_MAX ;  /* Maximum number of ticket we want to read during current page execution */
00439         $nomoretickets = FALSE ;                    /* Flag : last DB query returned no ticket */
00440         $displaynow = FALSE ;                       /* Flag : stop reading tickets, and display current state */
00441         while (!$_SESSION['freeze'] &&              /* If display is user-frozen, don't update data */
00442                !$userrequest &&                     /* If this is a page refresh because of user request, don't update data this time */
00443                !($newtickets && $nomoretickets) &&  /* Flag : last DB query did not bring any ticket back */
00444                $newtickets < $maxnewtickets &&      /* We dont' want to query indefinitely, even if there are MANY tickets ahead in DB */
00445                time() <= $maxtime &&                /* Timeout */
00446                !$displaynow)                        /* Flag : stop reading tickets, and display current state */ 
00447                 {
00448                 if ($nomoretickets)
00449                         {
00450                         /* If previous query returned no data, wait a second before retrying a query */
00451                         sleep (1) ;
00452                         }
00453 
00454                 $ticketsavail = -1 ;
00455                 $query = "select count(*) from `" . DB_TABLE . "` where `id`>" . $_SESSION['last_ticket']['id'] ;
00456                 $result = $db ? mysql_query($query) : FALSE ; if (!$result && $db) trigger_error(mysql_error() . ' in : ' . $query, E_USER_ERROR) ;
00457                 if ($result)
00458                         {
00459                         $num_rows = mysql_num_rows($result) ;
00460                         if ($num_rows > 0)
00461                                 {
00462                                 $row = mysql_fetch_row($result) ;
00463                                 $ticketsavail = $row[0] ;
00464                                 }
00465                         mysql_free_result($result) ;
00466                         }
00467                 else
00468                         {
00469                         $displaynow = TRUE ; /* Stop on error */
00470                         }
00471 
00472                 if ($ticketsavail > 0)
00473                         {
00474                         $nomoretickets = FALSE ;
00475                         $newtickets++ ;
00476                         $displaynow = $displaynow || (DEBUG >= 4) ; /* Step-by-step mode */
00477                         $query = "select `id`, `datetime`, time_to_sec(timediff(`datetime`, now())), `ticket`from `" . DB_TABLE . "` where `id`>" . $_SESSION['last_ticket']['id'] . " limit 0, 1" ;
00478                         $result = $db ? mysql_query($query) : FALSE ; if (!$result && $db) trigger_error(mysql_error() . ' in : ' . $query, E_USER_ERROR) ;
00479                         if ($result)
00480                                 {
00481                                 $num_rows = mysql_num_rows($result) ;
00482                                 if ($num_rows > 0)
00483                                         {
00484                                         $row = mysql_fetch_row($result) ;
00485                                         $_SESSION['last_ticket']['id'] = $row[0] ;
00486                                         $_SESSION['last_ticket']['datetime'] = $row[1] ;
00487                                         $_SESSION['last_ticket']['timestamp'] = time() + $row[2] ;
00488                                         $_SESSION['last_ticket']['ticket'] = $row[3] ;
00489                                         $_SESSION['last_ticket']['handled'] = 0 ;
00490                                         }
00491                                 mysql_free_result($result) ;
00492                                 }
00493                         else
00494                                 {
00495                                 $displaynow = TRUE ; /* Stop on error */
00496                                 }
00497 
00498                         $ticket_l = explode("\n", $_SESSION['last_ticket']['ticket']) ;
00499                         if (preg_match("/^Asterisk Call Manager\//", $ticket_l[0]))
00500                                 {
00501                                 array_shift($ticket_l) ;
00502                                 }
00503                         $msg = trim($ticket_l[0]) ;
00504                         if (strstr($msg, ': '))
00505                                 {
00506                                 list($msg, $indication) = explode(': ', $msg) ;
00507                                 }
00508                         else
00509                                 {
00510                                 $indication = '' ;
00511                                 }
00512 
00513                         /* Analyze ticket */
00514 
00515                         switch ($msg)
00516                                 {
00517 
00518                         case 'Response' :
00519 
00520                                 switch ($indication)
00521                                         {
00522                                 case 'Success' :
00523                                         $_SESSION['st']['Asterisk']['status'] = 'online' ;
00524                                         $_SESSION['last_ticket']['handled'] = 1 ;
00525                                         break ;
00526 
00527                                 case 'Goodbye' :
00528                                         $_SESSION['st']['Asterisk']['status'] = 'unknown' ;
00529                                         $_SESSION['last_ticket']['handled'] = 1 ;
00530                                         break ;
00531 
00532                                 default :
00533 
00534                                         }
00535                                 break ;
00536 
00537                         case 'Event' :
00538 
00539                                 /* Asterisk is considered online by default as soon as we receive an event */
00540                                 $_SESSION['st']['Asterisk']['status'] = 'online' ;
00541 
00542                                 /* Make an associative array from ticket information */
00543                                 $ticket_a = array('_ts' => $_SESSION['last_ticket']['timestamp']) ; /* Store timestamp with ticket */
00544                                 foreach ($ticket_l as $line)
00545                                         {
00546                                         if (strstr($line, ': '))
00547                                                 {
00548                                                 $split = explode(": ", trim($line), 2) ;
00549                                                 $item = $split[0] ;
00550                                                 $value = count($split) > 1 ? $split[1] : '' ;
00551                                                 $ticket_a[$item] = $value ;
00552                                                 }
00553                                         }
00554 
00555                                 $_SESSION['last_ticket']['handled'] = TRUE ; /* switch 'default' entry will deny when required */
00556                                 switch ($indication)
00557                                         {
00558                                 case 'Shutdown' :
00559                                         $_SESSION['st'] = array () ;
00560                                         $_SESSION['st']['Asterisk']['status'] = 'offline' ;
00561                                         $displaynow = $displaynow || DEMO ;
00562                                         break ;
00563 
00564                                 case 'PeerEntry' :
00565                                         if (isset($ticket_a['Channeltype']) && isset($ticket_a['ObjectName']))
00566                                                 {
00567                                                 update_dev(UPDATE, $ticket_a['Channeltype'], $ticket_a['ObjectName'], $ticket_a) ;
00568                                                 $type = $ticket_a['Channeltype'] ;
00569                                                 $dev = $ticket_a['ObjectName'] ;
00570                                                 if (isset($_SESSION['st'][$type][$dev]['IPaddress']) &&
00571                                                     $_SESSION['st'][$type][$dev]['IPaddress'] == '-none-')
00572                                                         {
00573                                                         clean_dev_data($type, $dev, 1) ;
00574                                                         }
00575                                                 }
00576                                         break ;
00577 
00578                                 case 'PeerStatus' :
00579                                         if (isset($ticket_a['Peer']))
00580                                                 {
00581                                                 list($type, $dev) = explode("/", $ticket_a['Peer']) ;
00582                                                 update_dev(UPDATE, $type, $dev, $ticket_a) ;
00583                                                 }
00584                                         break ;
00585 
00586                                 case 'Newchannel' :
00587                                 case 'Newcallerid' :
00588                                 case 'Newstate' :
00589                                 case 'Status' :
00590                                         if (isset($ticket_a['Channel']))
00591                                                 {
00592                                                 update_dev_call(UPDATE, $ticket_a['Channel'], $ticket_a) ;
00593                                                 }
00594                                         $displaynow = $displaynow || DEMO && $indication != 'Newcallerid' ;
00595                                         break ;
00596 
00597                                 case 'Dial' :
00598                                         if (isset($ticket_a['Source']))
00599                                                 {
00600                                                 update_dev_call(UPDATE, $ticket_a['Source'], $ticket_a) ;
00601                                                 }
00602                                         if (isset($ticket_a['Destination']))
00603                                                 {
00604                                                 update_dev_call(UPDATE, $ticket_a['Destination'], $ticket_a) ;
00605                                                 }
00606                                         break ;
00607 
00608                                 case 'Hangup' :
00609                                         if (isset($ticket_a['Channel']))
00610                                                 {
00611                                                 update_dev_call(DELETE, $ticket_a['Channel'], $ticket_a) ;
00612                                                 }
00613                                         $displaynow = $displaynow || DEMO ;
00614                                         break ;
00615 
00616                                 case 'MeetmeJoin' :
00617                                 case 'MeetmeLeave' :
00618                                         if (!isset($ticket_a['Meetme']) || !isset($ticket_a['Channel']))
00619                                                 break ; /* Should not happen. Don't care. */
00620                                         $meetme = $ticket_a['Meetme'] ;
00621                                         $cnxid = $ticket_a['Channel'] ;
00622                                         list ($channel, $chanid) = explode('-', $cnxid) ;
00623                                         /* Update Meetme status. Let's mimic the usual "channeltype/device-channelid" identifier */
00624                                         if ($indication == 'MeetmeJoin')
00625                                                 {
00626                                                 update_dev_call(UPDATE, "Meetme/$meetme-$chanid", $ticket_a) ; 
00627                                                 }
00628                                         else
00629                                                 {
00630                                                 update_dev_call(DELETE, "Meetme/$meetme-$chanid", $ticket_a) ;
00631                                                 }
00632                                         /* Update also Participant device status */
00633                                         if (isset($ticket_a['Channel']))
00634                                                 {
00635                                                 update_dev_call(UPDATE, $ticket_a['Channel'], $ticket_a) ;
00636                                                 }
00637                                         $displaynow = $displaynow || DEMO ;
00638                                         break ;
00639 
00640                                 case 'ZapShowChannels' :
00641                                         if (isset($ticket_a['Channel']))
00642                                                 {
00643                                                 update_dev(UPDATE, 'Zap', $ticket_a['Channel'], $ticket_a) ;
00644                                                 }
00645                                         break ;
00646 
00647                                 case 'Rename' : /* This one is used for dark indicible reasons ... */
00648                                         if (!isset($ticket_a['Oldname']) || !isset($ticket_a['Newname']))
00649                                                 break ; /* Should not happen. Don't care. */
00650                                         $o_cnxid = preg_replace('/<\w+>/', '', $ticket_a['Oldname']) ; /* Remove any <xxx> sequence */
00651                                         $n_cnxid = preg_replace('/<\w+>/', '', $ticket_a['Newname']) ; /* Remove any <xxx> sequence */
00652                                         if ($n_cnxid != $o_cnxid)
00653                                                 {
00654                                                 list($o_type, $o_dev, $o_chanid) = parse_cnxid($o_cnxid) ;
00655                                                 list($n_type, $n_dev, $n_chanid) = parse_cnxid($n_cnxid) ;
00656                                                 update_dev_call(UPDATE, $o_cnxid, array ()) ; /* Just to be sure that an entry exists */
00657                                                 $_SESSION['st'][$n_type][$n_dev]['_chan'][$n_chanid] = $_SESSION['st'][$o_type][$o_dev]['_chan'][$o_chanid] ;
00658                                                 $_SESSION['st'][$n_type][$n_dev]['_chan'][$n_chanid][$msg] = $indication ;
00659                                                 unset ($_SESSION['st'][$o_type][$o_dev]['_chan'][$o_chanid]) ;
00660                                                 }
00661                                         $displaynow = $displaynow || DEMO ;
00662                                         break ;
00663 
00664                                 case 'Alarm' :
00665                                         if (isset($ticket_a['Channel']))
00666                                                 {
00667                                                 update_dev(UPDATE, 'Zap', $ticket_a['Channel'], $ticket_a) ;
00668                                                 }
00669                                         break ;
00670 
00671                                 case 'AlarmClear' :
00672                                         if (isset($ticket_a['Channel']))
00673                                                 {
00674                                                 $ticket_a['Alarm'] = 'No Alarm' ;
00675                                                 update_dev(UPDATE, 'Zap', $ticket_a['Channel'], $ticket_a) ;
00676                                                 }
00677                                         break ;
00678 
00679                                 case 'PeerlistComplete' :          /* End of an Events list, after a SipPeers query, ... */
00680                                 case 'StatusComplete' :            /* End of an Events list, after a Status query */
00681                                 case 'ZapShowChannelsComplete' :   /* End of an Events list, after a ZapShowChannels query */
00682                                 case 'Newexten' :                  /* Call routing progress information */
00683                                 case 'OriginateSuccess' :          /* Call originate success */
00684                                 case 'OriginateFailure' :          /* Call originate failure */
00685                                 case 'Link' :                      /* Communication established */
00686                                 case 'Unlink' :                    /* Communication discontinued */
00687                                 case 'Reload' :                    /* Asterisk configuration reloaded */
00688                                         /* aTinyMON just ignores these events. */
00689                                         break ;
00690 
00691                                 default :
00692                                         $_SESSION['last_ticket']['handled'] = FALSE ;
00693                                         }
00694                                 break ;
00695 
00696                         default :
00697 
00698                                 }
00699                         }
00700                 else
00701                         {
00702                         $nomoretickets = TRUE ;
00703                         }
00704                 if (FREEZE_IF_NOT_HANDLED)
00705                         {
00706                         /* Auto-freeze if ticket not handled */
00707                         $_SESSION['freeze'] = $_SESSION['freeze'] || !$_SESSION['last_ticket']['handled'] ;
00708                         }
00709                 }
00710 
00711         /*********************************************************************************
00712          * aTinyMON page structure : simple table with two cells aside
00713          *********************************************************************************/
00714 
00715         print "<table style=\"width: 100%;\">\n" ;
00716         print " <tbody>\n" ;
00717         print "  <tr>\n" ;
00718 
00719         /*********************************************************************************
00720          * Left side : information, commands, snapshots/zooms
00721          *********************************************************************************/
00722 
00723         print "   <td style=\"vertical-align: top; width: 200px;\">\n" ;
00724 
00725         /* Information */
00726 
00727         print "<span class=title>aTinyMON</span>" ;
00728         if ($_SESSION['freeze'])
00729                 {
00730                 print " <img src=\"" . $ui['frozen'][0] . "\" title=\"" . $ui['frozen'][1] . "\"/>" ;
00731                 }
00732         else
00733                 {
00734                 print " <img src=\"" . $ui['running'][0] . "\" title=\"" . $ui['running'][1] . "\"/>" ;
00735                 }
00736         print "<br/> <span class=nota>$version - Software under GPL license</span><br/>\n" ;
00737 
00738         print "aTinyMON : " . $_SESSION['hostname'] . "<br/>Asterisk : " . AST_HOST . "<br/><span class=\"info\">" . date("Y-m-d H:i:s", $now) . "</span><br/>\n" ;
00739 
00740         /* Commands */
00741 
00742         print "<form action=\"$url\" method=\"post\">\n" ;
00743         foreach (array_keys($_SESSION['view']) as $type)
00744                 {
00745                 print "<input type=\"image\" name=\"submit[view][$type]\" src=\"" .
00746                   ($_SESSION['view'][$type] ? IMG_SELECTED : IMG_NOT_SELECTED) .
00747                       "\"> $type<br/>\n" ;
00748                 }
00749 
00750         if ($_SESSION['freeze'])
00751                 {
00752                 $rule_args_list = array(2, 4, 6, 8, 16) ;
00753                 $preset = $_SESSION['itemsperrow'] ;
00754                 print "<select name=\"itemsperrow\">" ;
00755                 foreach ($rule_args_list as $arg)
00756                         {
00757                         $selected_status = ($arg == $preset) ? 'selected' : '' ;
00758                         print "<option value=\"$arg\" $selected_status>$arg " ;
00759                         }
00760                 print "</select>" ;
00761                 }
00762         else
00763                 {
00764                 print $_SESSION['itemsperrow'] ;
00765                 }
00766         print " items/row<br/>" ;
00767 
00768         print "<br/>\n" ;
00769         print "<input type=\"image\" name=\"submit[freeze]\" src=\"" . $ui['freeze'][0] . "\" title=\"" . $ui['freeze'][1] . "\"/>\n" ;
00770         print "<img src=\"" . IMG_BLANK . "\">\n" ;
00771         print "<input type=\"image\" name=\"submit[refresh]\" src=\"" . $ui['refresh'][0] . "\" title=\"" . $ui['refresh'][1] . "\"/>\n" ;
00772         print "<img src=\"" . IMG_BLANK . "\">\n" ;
00773         print "<input type=\"image\" name=\"submit[quit]\" src=\"" . $ui['quit'][0] . "\" title=\"" . $ui['quit'][1] . "\"/>\n" ;
00774         print "<br/><br/>\n" ;
00775 
00776         /* Snapshots/zooms */
00777 
00778         if (isset($_SESSION['zoom']) && strstr($_SESSION['zoom'], '/'))
00779                 {
00780                 list($type, $dev) = explode ('/', $_SESSION['zoom']) ;
00781                 print "<input type=\"submit\" name=\"zoom\" value=\"Close\"/> \n" ;
00782                 print "<span class=\"info\">Zoom $type/$dev<br/>\n" ;
00783                 print "<textarea name=\"ticket\" rows=\"10\" cols=\"32\" readonly>" ;
00784                 if (is_array($_SESSION['st'][$type][$dev]))
00785                         {
00786                         foreach (array_keys($_SESSION['st'][$type][$dev]) as $attr)
00787                                 {
00788                                 if ($attr == '_chan' || $attr == '_ts')
00789                                         {
00790                                         continue ;
00791                                         }
00792                                 $value = $_SESSION['st'][$type][$dev][$attr] ;
00793                                 print my_htmlentities("$attr: $value\n") ;
00794                                 }
00795                         }
00796                 if (is_array($_SESSION['st'][$type][$dev]['_chan']))
00797                         {
00798                         foreach (array_keys($_SESSION['st'][$type][$dev]['_chan']) as $chan)
00799                                 {
00800                                 print "* Channel $chan\n" ;
00801                                 foreach (array_keys($_SESSION['st'][$type][$dev]['_chan'][$chan]) as $chanattr)
00802                                         {
00803                                         if ($chanattr == '_ts')
00804                                                 {
00805                                                 continue ;
00806                                                 }
00807                                         $value = $_SESSION['st'][$type][$dev]['_chan'][$chan][$chanattr] ;
00808                                         print my_htmlentities("$chanattr: $value\n") ;
00809                                         }
00810                                 }
00811                         }
00812                 print "</textarea></span>" ;
00813                 }
00814 
00815         else if (isset($_SESSION['last_ticket']))
00816                 {
00817                 print "<input type=\"image\" name=\"submit[showoffline]\" src=\"" .
00818                   ($_SESSION['showoffline'] ? IMG_SELECTED : IMG_NOT_SELECTED) . "\"> Show offline devices<br/>\n" ;
00819                 print "<input type=\"image\" name=\"submit[showevents]\" src=\"" .
00820                   ($_SESSION['showevents'] ? IMG_SELECTED : IMG_NOT_SELECTED) . "\"> Show AMI events<br/>\n" ;
00821                 print "<span class=\"info\">Last Ticket - ID " . $_SESSION['last_ticket']['id'] . (!$_SESSION['last_ticket']['handled'] ? " <span class=\"msg\"> Not handled </span>" : "") . "<br/>\n" ;
00822                 print $_SESSION['last_ticket']['datetime'] . "<br/>\n" ;
00823                 if ($_SESSION['showevents'])
00824                         {
00825                         print "<textarea name=\"ticket\" rows=\"10\" cols=\"32\" readonly>" . my_htmlentities($_SESSION['last_ticket']['ticket']) . "</textarea></span>" ;
00826                         }
00827                 }
00828 
00829         print "</form>" ;
00830 
00831         print "   </td>\n" ;
00832 
00833         /***********************************************************************
00834          * Right side : real-time view
00835          ***********************************************************************/
00836 
00837         print "   <td style=\"vertical-align: top;\">\n" ;
00838 
00839         $topofpage = TRUE ;
00840         $urlsnap = (strstr ($url, '?') ? $url . '&' : '?') . 'zoom=' ;
00841 
00842         ksort($_SESSION['st']) ;
00843         foreach (array_keys($_SESSION['st']) as $type)
00844                 {
00845                 if(!isset($_SESSION['view'][$type]))
00846                         {
00847                         /* Auto-create new items in the 'view' list according to new channels */
00848                         $_SESSION['view'][$type] = VIEW_BY_DEFAULT ;
00849                         ksort($_SESSION['view']) ;
00850                         }
00851 
00852                 if (!$_SESSION['view'][$type])
00853                         {
00854                         continue ;
00855                         }
00856 
00857                 if (!$topofpage)
00858                         {
00859                         print "<hr style=\"width: 100%; height: 2px;\">\n" ;
00860                         }
00861                 $topofpage = FALSE ;
00862 
00863                 print "<div class=subtitle>$type</div>\n" ;
00864                 switch ($type)
00865                         {
00866                 case 'Asterisk' :
00867                         $sta = $_SESSION['st']['Asterisk']['status'] ;
00868                         print "<table style=\"width: 100%;\"><tbody>\n<tr><td>" ;
00869                         print "<img src=\"" . $status[$sta][0] . "\" alt=\"" . $status[$sta][1] . "\" title=\"" . $status[$sta][1] . "\">Asterisk \n" ;
00870                         print "</td></tr></table>\n" ;
00871                         break ;
00872 
00873                 default :
00874                         if (!isset($_SESSION['st'][$type]))
00875                                 {
00876                                 continue ;
00877                                 }
00878 
00879                         $devs = array_keys($_SESSION['st'][$type]) ;
00880                         sort($devs) ;
00881                         print "<table style=\"width: 100%;\"><tbody>\n<tr>" ;
00882                         $count = 0 ;
00883                         $width = 100 / $_SESSION['itemsperrow'] ;
00884                         foreach ($devs as $dev)
00885                                 {
00886                                 if ($count != 0 && $count % $_SESSION['itemsperrow'] == 0)
00887                                         {
00888                                         print "</tr>\n<tr>" ;
00889                                         }
00890                                 $channels   = clean_dev_data($type, $dev, 0) ;
00891                                 $registered = isset($_SESSION['st'][$type][$dev]) &&
00892                                               ((isset($_SESSION['st'][$type][$dev]['IPaddress']) &&
00893                                                 $_SESSION['st'][$type][$dev]['IPaddress'] != '-none-') ||
00894                                                (isset($_SESSION['st'][$type][$dev]['PeerStatus']) &&
00895                                                 $_SESSION['st'][$type][$dev]['PeerStatus'] != 'Unregistered' &&
00896                                                 $_SESSION['st'][$type][$dev]['PeerStatus'] != 'Unreachable')) ;
00897                                 $sta = $registered ? 'online' : 'offline' ;
00898                                 if ($channels)
00899                                         {
00900                                         /* Let's update device state according to its associated channels :
00901                                          * try to differenciate "ringing" devices and "anything-else" devices. */
00902                                         foreach (array_keys($_SESSION['st'][$type][$dev]['_chan']) as $chanid)
00903                                                 {
00904                                                 if (!isset($_SESSION['st'][$type][$dev]['_chan'][$chanid]['State']))
00905                                                         {
00906                                                         $sta = 'active' ; /* Channel with no state indication : consider the device as 'active' by default */
00907                                                         }
00908                                                 else
00909                                                         {
00910                                                         switch ($_SESSION['st'][$type][$dev]['_chan'][$chanid]['State'])
00911                                                                 {
00912                                                         case 'Down' :
00913                                                                 /* Just forget this channel at the moment */
00914                                                                 break ;
00915                                                         case 'Ringing' :
00916                                                                 if ($sta != 'active') /* 'active' state has priority over 'ringing' */
00917                                                                         $sta = 'ringing' ;
00918                                                                 break ;
00919                                                         default :
00920                                                                 $sta = 'active' ;
00921                                                                 }
00922                                                         }
00923                                                 }
00924                                         }
00925                                 if (isset($_SESSION['st'][$type][$dev]['Alarm']) &&
00926                                     $_SESSION['st'][$type][$dev]['Alarm'] != 'No Alarm')
00927                                         {
00928                                         /* Alarm state overrides any other state */
00929                                         $sta = 'alarm' ;
00930                                         }
00931                                 if ($sta != 'offline' || $_SESSION['showoffline'])
00932                                         {
00933                                         print "<td style=\"width: $width%;\" vertical-align: top;>" ;
00934                                         print "<img src=\"" . (isset($special[$type][$sta]) ? $special[$type][$sta] : $status[$sta][0]) . 
00935                                               "\" alt=\"" . $status[$sta][1] . "\" title=\"" . $status[$sta][1] . "\">" ;
00936                                         print "<a href=\"$urlsnap$type/$dev\">$dev</a>" ;
00937                                         print "</td>\n" ;
00938                                         $count++ ;
00939                                         }
00940                                 }
00941                         while ($count++ % $_SESSION['itemsperrow'] != 0)
00942                                 {
00943                                 print "<td style=\"width: $width%;\" vertical-align: top;></td>\n" ;
00944                                 }
00945                         print "</tr>\n" ;
00946                         print "</tbody></table>\n" ;
00947                         }
00948                 }
00949 
00950         /* debug information */
00951         if (DEBUG >= 2)
00952                 {
00953                 print "<hr style=\"width: 100%; height: 2px;\"><class=\"info\"><pre>" ;
00954                 if (DEBUG >= 3)
00955                         {
00956                         print_r($_SESSION) ;
00957                         }
00958                 else
00959                         {
00960                         foreach (array_keys($_SESSION) as $var)
00961                                 {
00962                                 print "$var = " ;
00963                                 if (!is_array($_SESSION[$var]))
00964                                         print $_SESSION[$var] . "\n" ;
00965                                 elseif (in_array($var, array ('st')))
00966                                 print "array ()\n" ;
00967                                 else
00968                                         print_r($_SESSION[$var]) ;
00969                                 }
00970                         }
00971                 print "</pre></class>\n" ;
00972                 }
00973 
00974         print "   </td>\n" ;
00975 
00976         print "  </tr>\n" ;
00977         print " </tbody>\n" ;
00978         print "</table>\n" ;
00979 
00980         if (isset($_SESSION['errorlist']))
00981                 {
00982                 display_errors() ;
00983                 }
00984 
00985         print "</body>\n" ;
00986         print "</html>\n" ;
00987         }
00988 
00989 
00990 /** Store errors and syslog them. We'll display them alltogether later.
00991  */
00992 function store_error($err_type, $err_msg, $err_file, $err_line)
00993         {
00994         /* PHP error type => syslog severity */
00995         $severity = array (
00996                 E_ERROR =>           LOG_ERR,
00997                 E_WARNING =>         LOG_WARNING,
00998                 E_PARSE =>           LOG_ERR,
00999                 E_NOTICE =>          LOG_NOTICE,
01000                 E_CORE_ERROR =>      LOG_ERR,
01001                 E_CORE_WARNING =>    LOG_WARNING,
01002                 E_COMPILE_ERROR =>   LOG_ERR,
01003                 E_COMPILE_WARNING => LOG_WARNING,
01004                 E_USER_ERROR =>      LOG_ERR,
01005                 E_USER_WARNING =>    LOG_WARNING,
01006                 E_USER_NOTICE =>     LOG_NOTICE,
01007                 E_STRICT =>          LOG_ERR
01008                 ) ;
01009 
01010         if (in_array($err_type, array (E_NOTICE, E_STRICT)))
01011                 {
01012                 return (1) ;
01013                 }
01014         $_SESSION['errorlist'][] = array ($err_type, $err_msg, $err_file, $err_line) ;
01015         $priority = isset($severity[$err_type]) ? $severity[$err_type] : LOG_ERR ;
01016         syslog($priority, "aTinyMON ($err_file:$err_line) $err_msg") ;
01017         return (1) ;
01018         }
01019 
01020 
01021 /** Display errors that have been stored.
01022  */
01023 function display_errors()
01024         {
01025         /* PHP error typ => text */
01026         $type = array (
01027                 E_ERROR =>           'ERROR',
01028                 E_WARNING =>         'WARNING',
01029                 E_PARSE =>           'PARSE',
01030                 E_NOTICE =>          'NOTICE',
01031                 E_CORE_ERROR =>      'CORE_ERROR',
01032                 E_CORE_WARNING =>    'CORE_WARNING',
01033                 E_COMPILE_ERROR =>   'COMPILE_ERROR',
01034                 E_COMPILE_WARNING => 'COMPILE_WARNING',
01035                 E_USER_ERROR =>      'USER_ERROR',
01036                 E_USER_WARNING =>    'USER_WARNING',
01037                 E_USER_NOTICE =>     'USER_NOTICE',
01038                 E_STRICT =>          'STRICT'
01039                 ) ;
01040         $sid = SID ? "?" . strip_tags(SID) : '' ;
01041         $url = $_SERVER['PHP_SELF'] . $sid ;
01042 
01043         print "<div class=\"alertbox\">\n" ;
01044         foreach ($_SESSION['errorlist'] as $error)
01045                 {
01046                 list ($err_type, $err_msg, $err_file, $err_line) = $error ;
01047                 $texttype = isset($type[$err_type]) ? $type[$err_type] : "Err $err_type" ;
01048                 $file = preg_replace ('/.*\//', '', $err_file) ;
01049                 print "$texttype ($file:$err_line) ". my_htmlentities($err_msg) . "<br/>\n" ;
01050                 }
01051         /* Submit button */
01052         print "<br/><form action=\"$url\" method=\"post\">\n" ;
01053         print "<input type=\"submit\" name=\"close_errorlist\" value=\"close\"> " ;
01054         print "</form>\n" ;     
01055         print "</div>\n" ;
01056         
01057         $_SESSION['freeze'] = TRUE ;
01058         }
01059 
01060 if (DEBUG > 0)
01061         {
01062         error_reporting(E_ALL) ;
01063         ini_set('display_errors', 'On') ;
01064         }
01065 set_error_handler('store_error') ;
01066 if (isset($_REQUEST['close_errorlist']))
01067         unset ($_SESSION['errorlist']) ;
01068 $db = NULL ;
01069 run_session() ;
01070 
01071 ?>

Generated on Sun Jan 21 20:33:34 2007 for TinyMON by  doxygen 1.5.1