Как стать автором
Обновить

Комментарии 17

Конечно молодец что пытаетесь оптимизировать рутинные вещи. Но зачем везде пихать то что там не нужно. Ну вот не нужен здесь php совсем
Вот пример который пришел в голову сразу
asterisk -rx "sip show registry" | awk 'BEGIN{print "{\n\"data\": ["; } NF>6 {gsub(/:.+/, "", $1); print "\t{ \"{#TRUNKIP}\": \""$1"\" },";} END{print "\t]\n}";}'
Вывод на одном пире такой
{ "data": [ { "{#TRUNKIP}": "172.21.0.23" }, ] }

Второй скрипт
asterisk -rx "sip show registry" | awk 'BEGIN{print "{\n\"data\": ["; } NF>6 {print "\t{ \"{#TRUNKNAME}\": \""$3"\" },";} END{print "\t]\n}";}'

Вывод
{ "data": [ { "{#TRUNKNAME}": "050" }, ] }

Ну и уж если надо выводить состояние
asterisk -rx "sip show registry" | awk '$$3 ~ /'$1'/ || $$1 ~ /''$1/ {if($5 ~ /Registered/) print 1; else print 0;}'
именно в таком виде кормить заббиксу
и не надо никаких php и тп
Надеюсь поможет в дальнейшем ))
Спасибо. Действительно, без php будет лучше. Впрочем, главное, чтобы скрипт давал нужный вывод — язык дело вторичное.
Проверьте на своих данных
у меня на одном пире все гуд
хочется узнать как будет на больших данных.
В первом скрипте, для {#TRUNKIP}, не отфильтровываются повторяющиеся IP-адреса. Это не страшно, но и доставляет некоторые неудобства.
sort -k1 -u думаю выручит
ну или uniq
Создал шаблон низкоуровневого обнаружения — в результате выдается ошибка Value should be a JSON object., хотя zabbix_get возвращает следующее:
m0ps@zabbix:~$ zabbix_get -s pbx.company.com -k asterisk.discovery[ips]{
        "data":[

        {
                "{#TRUNKIP}":"sip.skype.com"
        },
        {
                "{#TRUNKIP}":"natsip.datagroup.com.ua"
        },

        ]
}

ЗЫ скрипты на php а не awk.
какая версия заббикс?
у меня все скрипты возвращают примерно тоже самое и все норм, версия заббикса 2.0
Хотя некоторые парсеры json ругаются на не валидность данных из-за последней запятой {
"{#TRUNKIP}":«natsip.datagroup.com.ua»
},

У нас 2.2.3
может в новой весии поменялся парсер json и ему уже не нравится запятая в конце?
А можешь выгрузить шаблон, возможно я его неправильно создал.
ооооо
так это к автору статьи
я то просто работаю с заббиксом
могу предложить проверить вот таким скриптом
#!/bin/bash

ARRAY=(
one
two
three
four
)

echo -en "{\"data\": ["

for i in ${ARRAY[@]}; do
    echo -en "{\"{#QUEUENAME}\":\"$i\"},"
done

echo -en "]}"

буквально сегодня таким методом много проверок заставил автоматом добавляться

Блин парсер схавал переводы строк
Проверил вывод скрипта тут: jsonlint.com/ — как и в скриптах из статьи — ошибка валидации. Последняя строка с запятой в конце не нравиться :(
решение в лоб
#!/bin/bash

ARRAY=(
one
two
three
four
)

s=""
echo -en "{\"data\": ["

for i in ${ARRAY[@]}; do
    echo -en "$s"
    s=","
    echo -en "{\"{#QUEUENAME}\":\"$i\"}"
done

echo -en "]}"

Не очень оптимальное но валидацию проходит
Допилил скрипт из статьи:
trunk_disc.php
#!/usr/bin/php
<?php
error_reporting(1);
exec("/usr/bin/sudo -u asterisk /usr/sbin/asterisk -rx 'sip show registry'", $tr_list);
foreach($tr_list as $line) {
        $ar_line = null;
        $ar_line[] = trim(substr($line, 0, 40));
        $ar_line[] = trim(substr($line, 47, 19));
        $ar_line = array_diff($ar_line, array(''));
        $ar_line = array_combine(array(0,1), $ar_line);
        $trunks[] = $ar_line['1'];
        $ip = explode(":", $ar_line['0']);
        if (!in_array($ip['0'], $ips)) {
                $ips[] = $ip['0'];
        }
}
$trunks[0] = '';
$ips[0] = '';
$trunks = array_diff($trunks, array(''));
$ips = array_diff($ips, array(''));

function getJson($items, $name) {
        $first = 1;
        print "{\n";
        print "\t\"data\":[\n\n";
        $lastitem = end($items);
        foreach ($items as $item) {
                if ($item != $lastitem) {
                        if (!$first) {
                                print "\t,\n" ;
                                $first = 0;
                        }
                        print "\t{\n";
                        print "\t\t\"{#$name}\":\"$item\"\n";
                        print "\t},\n";
                } else {
                        if (!$first) {
                                print "\t,\n" ;
                                $first = 0;
                        }
                        print "\t{\n";
                        print "\t\t\"{#$name}\":\"$item\"\n";
                        print "\t}\n";
                }
        }
        print "\n\t]\n";
        print "}\n";
}

if ($argv[1] == 'trunks') {
        getJson($trunks, "TRUNKNAME");
}
elseif ($argv[1] == 'ips') {
        getJson($ips, "TRUNKIP");
}
else {
        print "error";
}


ЗЫ В php полный н0ль, так что сори за индусятину :)
Хм… Меня эта запятая тоже поначалу смущала. Но Заббикс ее прекрасно схавал. На днях буду переходить на версию 2.2 — посмотрим как там.
У меня тоже один из транков периодически терял регистрацию. Не придумал, зачем мониторить это в заббиксе, ведь первым делом надо починить регистрацию. Не будучи особо гуру в asterisk, в гугле выяснил, что заставить транк перерегистрироваться можно релоадом sip.
Итого получилось нечто вроде:
#!/bin/bash
CID="7383xxxxxxx" #пользователь, под которым подключается глючный транк, дабы отделить от остальных транков
reg=`asterisk -rx  "sip show registry"| grep $CID | awk '{print $5}'`

if [ "$reg" != "Registered" ]; then
    asterisk -rx "sip reload"
    echo `date`" sip reloaded" >> /var/log/sipreg.log
fi

и было засунуто в cron
Вы издеваетесь такое писать на PHP?:)

function getJson($items, $name) {
        $first = 1;
        print "{\n";
        print "\t\"data\":[\n\n";
        $lastitem = end($items);
        foreach ($items as $item) {
                if ($item != $lastitem) {
                        if (!$first) {
                                print "\t,\n" ;
                                $first = 0;
                        }
                        print "\t{\n";
                        print "\t\t\"{#$name}\":\"$item\"\n";
                        print "\t},\n";
                } else {
                        if (!$first) {
                                print "\t,\n" ;
                                $first = 0;
                        }
                        print "\t{\n";
                        print "\t\t\"{#$name}\":\"$item\"\n";
                        print "\t}\n";
                }
        }
        print "\n\t]\n";
        print "}\n";
}


есть встроенная функция json_encode()

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории