Обновить

Комментарии 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()

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

Публикации