Asterisk PHP Peer Status

Полезные ссылки, документация и тп.

Модераторы: Admins, Модераторы

Ответить
Аватара пользователя
anest
Модератор
Сообщения: 5700
Зарегистрирован: 28 ноя 2004, 10:04

Asterisk PHP Peer Status

Сообщение anest » 25 сен 2009, 15:08

Простой php скрипт для слежения за состоянием пира, периодически опрашивает астериск о состоянии заданного пира, если коннекта по каким то причинам нет - звонит на указанный заранее телефон и проигрывает сообщение о проблеме с пиром.
Может быть полезным при мониторинге состояния проблемных (или очень важных) пиров.
http://www.venturevoip.com/news.php?rssid=2217

Аватара пользователя
Obi Van
Сообщения: 425
Зарегистрирован: 17 янв 2007, 08:40
Откуда: Россия, г.Новочеркасск, Рост.обл

Сообщение Obi Van » 30 сен 2009, 13:53

Хороший скрипт. Спасибо за ссылку. Можно и к веб морде прилепить, да вообще идей масса. :)

Аватара пользователя
anest
Модератор
Сообщения: 5700
Зарегистрирован: 28 ноя 2004, 10:04

Сообщение anest » 30 сен 2009, 21:34

если приделаешь гуй или еще чего креативного на его основе - просьба поделиться тоже ;)

Аватара пользователя
anest
Модератор
Сообщения: 5700
Зарегистрирован: 28 ноя 2004, 10:04

Сообщение anest » 04 июл 2010, 00:05

небольшая модификация, позволяющая передавать имя пира как параметр вызова скрипта
взят из коментов, сохранен для архива.

Код: Выделить всё

<?
/* ============================ */
/*   PHP Asterisk Peer Status   */
/* ============================ */
/*    &#40;C&#41; 2009 Matt Riddell     */
/*     Daily Asterisk News      */
/* www.venturevoip.com/news.php */
/*      Public domain code      */
/* Modified by Chilling_Silence */
/* 20090915 - Takes Ext as var  */
/* ============================ */

/* Connection details */
$manager_host = "127.0.0.1";
$manager_user = "admin";
$manager_pass = "*******";

/* Default Port */
$manager_port = "5038";

/* Connection timeout */
$manager_connection_timeout = 30;

/* The Asterisk peer you would like to check */
$peer_name = $_GET&#91;"ext"&#93;;

/* The type of peer &#40;i.e. iax2 or sip&#41; */
$peer_type = "sip";

/* Connect to the manager */
$fp = fsockopen&#40;$manager_host, $manager_port, $errno, $errstr, $manager_connection_timeout&#41;;
if &#40;!$fp&#41; &#123;
    echo "There was an error connecting to the manager&#58; $errstr &#40;Error Number&#58; $errno&#41;\n";
&#125; else &#123;
    echo "-- Connected to the Asterisk Manager\n";
    echo "-- About to log in\n";

    $login = "Action&#58; login\r\n";
    $login .= "Username&#58; $manager_user\r\n";
    $login .= "Secret&#58; $manager_pass\r\n";
    $login .= "Events&#58; Off\r\n";
    $login .= "\r\n";
    fwrite&#40;$fp,$login&#41;;

    $manager_version = fgets&#40;$fp&#41;;

    $cmd_response = fgets&#40;$fp&#41;;

    $response = fgets&#40;$fp&#41;;

    $blank_line = fgets&#40;$fp&#41;;

    if &#40;substr&#40;$response,0,9&#41; == "Message&#58; "&#41; &#123;
        /* We have got a response */
        $loginresponse = trim&#40;substr&#40;$response,9&#41;&#41;;
        if &#40;!$loginresponse == "Authentication Accepted"&#41; &#123;
            echo "-- Unable to log in&#58; $loginresponse\n";
            fclose&#40;$fp&#41;;
            exit&#40;0&#41;;
        &#125; else &#123;
            echo "-- Logged in Successfully\n";
            $checkpeer = "Action&#58; Command\r\n";
            $checkpeer .= "Command&#58; $peer_type show peer $peer_name\r\n";
            $checkpeer .= "\r\n";
            fwrite&#40;$fp,$checkpeer&#41;;
            $line = trim&#40;fgets&#40;$fp&#41;&#41;;
            $found_entry = false;
            while &#40;$line != "--END COMMAND--"&#41; &#123;
                if &#40;substr&#40;$line,0,6&#41; == "Status"&#41; &#123;
                    $status = trim&#40;substr&#40;strstr&#40;$line, "&#58;"&#41;,1&#41;&#41;;
                    $found_entry = true;
                    if &#40;substr&#40;$status,0,2&#41; == "OK"&#41; &#123;
                        $peer_ok = true;
                    &#125; else &#123;
                        $peer_ok = false;
                    &#125;
                &#125;
                $line = trim&#40;fgets&#40;$fp&#41;&#41;;
            &#125;
            if &#40;$found_entry == false&#41; &#123;
                echo "-- We didn't get the response we were looking for - is the peer name correct? Use ?ext=XXX after the URL\n";
            &#125; else if &#40;$peer_ok == true&#41; &#123;
                echo "-- Peer looks good at the moment&#58; $status\n";
            &#125; else &#123;
                /* We received a response other than ok - you can really do whatever */
                /* you want here - in this example I'm going to use the originate    */
                /* command to call me and play me the tt-monkeys sound - if I hear   */
                /* this then I know there is an issue &#58;&#41;                             */
                echo "-- Peer not ok &#40;$status&#41; - running some code\n";

                $originate = "Action&#58; originate\r\n";
                $originate .= "Channel&#58; Zap/g1/1234r\n";
                $originate .= "Application&#58; Playback\r\n";
                $originate .= "Data&#58; tt-monkeys\r\n";
                $originate .= "\r\n";
                fwrite&#40;$fp, $originate&#41;;
            &#125;
            fclose&#40;$fp&#41;;
            exit&#40;0&#41;;
        &#125;
    &#125; else &#123;
        echo "Unexpected response&#58; $response\n";
        fclose&#40;$fp&#41;;
        exit&#40;0&#41;;
    &#125;
&#125;
?>


источник: http://www.venturevoip.com/peer-status.phps

JackW810
Сообщения: 43
Зарегистрирован: 26 ноя 2009, 11:04

Сообщение JackW810 » 24 ноя 2010, 11:18

Заинтересовал скрипт, спасибо.
Думаю его использовать для сигнализации пропадания сип провайдера. Актуально как раз для круглосуточных служб (таких как такси), там каждая минута простоя это деньги, а интернет какой бы идеальный не был, то 100 процентов что он ни разу не пропадет никто не даст.
Настроил его на пир провайдера, а отзвон через GSM шлюз. Пока на себя, а потом на хозяина конторы, пусть мучается :D.
Теперь думаю как бы смоделировать пропадания интернета ему и посмотреть через сколько сработает скрипт, думаю не одобрят мои тесты.

anest
ну ты и выложил код, сидел полчаса менял &quot; на " и всеравно где-то какая-то ошибка или скобки нету или еще что-то. пришлось брать с источника.

Аватара пользователя
anest
Модератор
Сообщения: 5700
Зарегистрирован: 28 ноя 2004, 10:04

Сообщение anest » 24 ноя 2010, 20:07

за что купил, за то и продаю. все претензии в /dev/null

JackW810
Сообщения: 43
Зарегистрирован: 26 ноя 2009, 11:04

Сообщение JackW810 » 25 ноя 2010, 11:51

Сегодня пропал инет. Скрипт исправно отзвонил и предупредил.
Он у меня в кронтабе каждые 10 минут запускается. Из за этого недостаток что и отзванивать будет каждые 10 минут, а если чаще ...
Возникла мысль доделать его:
Завести в базу астериска или мускула какую-то переменную которая бы как флаг срабатывала.
В PHP проверять ее, т.е. изначально флаг 0 если пропал пир то отзвонил и поставил флаг в 1, если пир ок и флаг 1 то отзвонить и сказать что все норм и обнулить флаг, в остальных случаях ничего не делать.

Аватара пользователя
anest
Модератор
Сообщения: 5700
Зарегистрирован: 28 ноя 2004, 10:04

Сообщение anest » 29 ноя 2011, 17:18

правильней на мой взгляд будет сделать чтобы при звонке после оповещения события (например "Транк на головной офис упал.") спрашивало бы подтвеждения того что сообщение достигнуто уха назначения и понято, например спрашивало бы "Больше не звонить? нажмите 1." если нажато - менять в базе ключ. иначе - пусть названивает каждые 10 минут - так даже лучше (ибо может там упало всё а админ спит блин).
кто доделает такой функционал - просьба поделиться исходником.

dotprint
Сообщения: 385
Зарегистрирован: 03 фев 2011, 06:52
Откуда: Коломна
Контактная информация:

Сообщение dotprint » 29 ноя 2011, 17:51

Кстати, господа! А есть у кого-нибудь идея, как по-быстрому из php узнать device state устройств?
Или вообще что-то вроде BFL?

pavel shlag
Сообщения: 141
Зарегистрирован: 21 июн 2011, 08:00

Сообщение pavel shlag » 29 ноя 2011, 18:40

например парсить core show hint[s]

dotprint
Сообщения: 385
Зарегистрирован: 03 фев 2011, 06:52
Откуда: Коломна
Контактная информация:

Сообщение dotprint » 30 ноя 2011, 04:56

pavel shlag писал(а):например парсить core show hint[s]
Да, у меня кроме этих костылей в голову больше ничего и не приходило. Сам не нашел, думал более нативный способ есть.

Аватара пользователя
anest
Модератор
Сообщения: 5700
Зарегистрирован: 28 ноя 2004, 10:04

Сообщение anest » 30 ноя 2011, 05:09

:flood3:

Ответить