Мониторинг транков Asterisk с уведомлением о проблеме по почте

Хочу привести пример php скрипта, который я иногда использую для мониторинга транков. Я помещаюего в cron с интервалом в 15 минут. После срабатывания он проверит транки. Если есть не работающий — дает паузу в 20 секунд. Снова проверяет состояние транков. Если ничего не изменилось — перегружаем модуль chan_sip в asterisk. И если это не могло — шлем email с отчетом по почте, указанной в переменной $report_email.
Скрипт не мой лично — но нареканий в работе у меня нет.

#!/usr/bin/php -q
<!--?php 

// set up the email address to receive the alert email
$report_email = '[email protected]';

$state = wots_up();
echo $state;

if ($state == 'ok')
{
 //если все нормально - прекращаем выполнение
 exit;
}
else
{
 //если нет - пауза в 20 секунд и снова проверяем
 sleep(20);
 $state = wots_up();
 $have_done = "We have retried in 20 seconds.\r\n";
}

if ($state == 'ok')
{
 //если все нормально - прекращаем выполнение
 exit;
}
else
{
 $have_done .= "Trying to reload the sip channels.\r\n";
 $have_done .= shell_exec('/usr/sbin/asterisk -rx "module reload chan_sip"');
 sleep(20);
 $have_done .= "Reloaded sip channels and waited 20 seconds.\r\n";
 $state = wots_up();
}

if ($state == 'ok')
{
 //wipes the sweat
 exit;
}

$status = "$have_done\r\n====have done above, the current status: ====\r\n$status";

if ($state == 'requesting')
{
 send_alert_email('Trunk has been sending registrating requests', $status);
}
elseif ($state == 'empty')
{
 send_alert_email('Voip trunk registration status is empty', $status);
}
elseif ($state == 'no_auth')
{
 send_alert_email('No Authentication is reported, wrong password?', $status);
}
elseif ($state == 'unregistered')
{
 send_alert_email('We have Unregistered trunk', $status);
}
elseif ($state == 'failed')
{
 send_alert_email('We have Registration failed trunk', $status);
}
elseif ($state == 'auth_sent')
{
 send_alert_email('We have trunk with Auth. Sent status', $status);
}
elseif ($state == 'rejected')
{
 send_alert_email('We have trunk with Rejected status', $status);
}
else
{
 send_alert_email('Trunk status is not registered', "$state\r\n\r\n$status");
}

function wots_up()
{
 global $status;

 //Берем статусы транков
 $status = shell_exec('/usr/sbin/asterisk -rx "sip show registry"');

 if (strlen(trim($status)) == 0)
 {
  return 'empty';
 }

 $lines = explode("\n", str_replace("\r\n", "\n", trim($status)));

 for ($i = 1; $i < count($lines) - 1; $i++)
 {
  //echo "line $i " .  $lines[$i] . "\n";
  if (strpos($lines[$i], 'Request Sent') !== false)
  {
   return 'requesting';
  }
  elseif(strpos($lines[$i], 'No Authentication') !== false)
  {
   return 'no_auth';
  }
  elseif(strpos($lines[$i], 'Unregistered') !== false)
  {
   return 'unregistered';
  }
  elseif (strpos($lines[$i], 'Failed') !== false)
  {
   return 'failed';
  }
  elseif (strpos($lines[$i], 'Auth. Sent') !== false)
  {
   return 'auth_sent';
  }
  elseif (strpos($lines[$i], 'Rejected') !== false)
  {
   return 'rejected';
  }
  elseif (strpos($lines[$i], 'Timeout') !== false)
  {
   return 'timeout';
  }
  elseif (strpos($lines[$i], 'Unknown') !== false)
  {
   return 'unknown';
  }

  $temp = preg_split('/\s+/', $lines[$i]);
  if (!isset($temp[3]))
  {
   return "Can not extract Reg State for this line: " . $lines[$i];
  }
  elseif ($temp[3] <--> "Registered")
  {
   return "Unknown Reg state for this line: " . $lines[$i];
  }
 }

 return 'ok';
}

function send_alert_email($subject, $email_content = '')
{
 global $report_email;
 mail($report_email, $subject, $email_content);
}

?&gt;

Оставить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *