{"id":822,"date":"2020-05-28T16:59:37","date_gmt":"2020-05-28T19:59:37","guid":{"rendered":"http:\/\/blog.saperx.com.br\/?p=822"},"modified":"2020-05-28T18:12:46","modified_gmt":"2020-05-28T21:12:46","slug":"monitorando-o-asterisk-no-zabbix","status":"publish","type":"post","link":"https:\/\/blog.saperx.com.br\/index.php\/2020\/05\/28\/monitorando-o-asterisk-no-zabbix\/","title":{"rendered":"Monitorando o Asterisk no Zabbix"},"content":{"rendered":"\n<p>Compartilharemos aqui um script que desenvolvemos para monitorar o Asterisk atrav&eacute;s do Zabbix.<\/p>\n\n\n\n<p>Com este script voc&ecirc; ser&aacute; capaz de monitorar:<\/p>\n\n\n\n<ul><li>Status de um SIP em espec&iacute;fico<\/li><li>Tempo (qualify) de um SIP em espec&iacute;fico<\/li><li>Quantidade de chamadas ativas<\/li><li>Status do processo do asterisk, para saber se est&aacute; rodando ou n&atilde;o<\/li><li>Dura&ccedil;&atilde;o da chamada mais longa em curso<\/li><li>Quantidade de SIP online<\/li><\/ul>\n\n\n\n<p>O resultado final, no seu Zabbix, ser&aacute; semelhante a este abaixo:<\/p>\n\n\n\n<ul class=\"wp-block-gallery columns-1 is-cropped\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"1024\" height=\"113\" src=\"http:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-27-43-1024x113.png\" alt=\"Screenshot from 2020 05 28 16 27 43 1024x113 - Monitorando o Asterisk no Zabbix\" data-id=\"823\" data-link=\"http:\/\/blog.saperx.com.br\/?attachment_id=823\" class=\"wp-image-823\" srcset=\"https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-27-43-1024x113.png 1024w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-27-43-300x33.png 300w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-27-43-768x85.png 768w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-27-43-600x66.png 600w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-27-43.png 1898w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" title=\"Monitorando o Asterisk no Zabbix\"><\/figure><\/li><\/ul>\n\n\n\n<p>Perceba que, na imagem acima, estou monitorando o SIP 8009001.<\/p>\n\n\n\n<p>Abaixo, segue um exemplo do script em execu&ccedil;&atilde;o, sendo executado pelo terminal:<\/p>\n\n\n\n<ul class=\"wp-block-gallery columns-1 is-cropped\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"705\" height=\"250\" src=\"http:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-42-25.png\" alt=\"Screenshot from 2020 05 28 16 42 25 - Monitorando o Asterisk no Zabbix\" data-id=\"825\" data-link=\"http:\/\/blog.saperx.com.br\/?attachment_id=825\" class=\"wp-image-825\" srcset=\"https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-42-25.png 705w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-42-25-300x106.png 300w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-42-25-600x213.png 600w\" sizes=\"(max-width: 705px) 100vw, 705px\" title=\"Monitorando o Asterisk no Zabbix\"><\/figure><\/li><\/ul>\n\n\n\n<p>Os arquivos que ser&atilde;o alterados no seu asterisk server s&atilde;o:<\/p>\n\n\n\n<ul><li>ast_zabbix.php (novo!)<\/li><li>manager.conf<\/li><li>zabbix_agentd.conf<\/li><\/ul>\n\n\n\n<p>Este script foi batizado de &ldquo;ast_zabbix.php&rdquo;. O que ele faz &eacute; coletar informa&ccedil;&otilde;es no Asterisk atrav&eacute;s da AMI (Asterisk Manager Interface) e apresentar em um formato adequado para o Zabbix monitorar.<\/p>\n\n\n\n<p>Abaixo segue um &ldquo;how-to&rdquo; bem direto para fazer funcionar este c&oacute;digo em seu asterisk.<\/p>\n\n\n\n<p><strong>Passo 01 &ndash; manager.conf<br><\/strong>Acesse \/etc\/asterisk\/manager.conf e adicione as linhas abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[ast-zabbix]\nsecret=lkdjaskdj131\ndeny=0.0.0.0\/0.0.0.0\npermit=127.0.0.1\/255.255.255.255\nread=all\nwrite=all\ndisplayconnects=no\n<\/code><\/pre>\n\n\n\n<p>Ap&oacute;s, na console do asterisk, d&ecirc; um reload no m&oacute;dulo com o comando &ldquo;module reload&rdquo;.<\/p>\n\n\n\n<p><strong>Passo 02 &ndash; ast_zabbix.php:<br><\/strong>Copie o c&oacute;digo abaixo em \/var\/local\/ast_zabbix.php, dando permiss&atilde;o de execu&ccedil;&atilde;o ao mesmo (chmod +x \/var\/local\/ast_zabbix.php).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/*\nCriado por: Ronaldo Sacco - ronaldo@saperx.com.br\n\nScript criado para facilitar a comunicacao entre ZABBIX e ASTERISK, utilizando AMI (Asterisk Manager Interface).\nEste script monitora:\n\n                \"peerstatus peer   - Retorna o status de um determinado peer\";\n                \"peertime peer     - Retorna o tempo (qualify) de um determinado peer\";\n                \"activecalls       - Retorna quantas chamadas estao em curso\";\n                \"longestcall       - Retorna o valor em minutos da chamada com mais tempo em duracao\";\n                \"onlinepeers       - Retorna a quantidade de SIP online\";\n\nModo de execucao:\nphp ast_zabbix.php COMANDO SIP_PEER\n\nExemplo:\nphp ast_zabbix sipstatus 200\n\n*\/\n\n\n\/*\nCredenciais do manager\nDeve ser configurado as variaveis $MANAGER_ que seguem abaixo.\n*\/\n\n$MANAGER_user = 'spx-modules';\n$MANAGER_pass = 'SPDJA213$kk1';\n$MANAGER_host = '127.0.0.1';\n$MANAGER_port = 5038;\n\n\n\/*\nInicio do codigo. \nNao alterar nada daqui para baixo.\n*\/\n\nfunction manager_connect() {\n        global $MANAGER_host, $MANAGER_user, $MANAGER_port, $MANAGER_pass;\n\n        $manager_connection_timeout = 3; \/\/segundos\n\n        \/\/Conexao com manager\n        $socket = fsockopen($MANAGER_host, $MANAGER_port, $errno, $errstr, $manager_connection_timeout);\n\n        if (!$socket) {\n                echo \"ERRO na conexao com manager\\n\";\n                exit(1);\n        } else {\n                $login = \"Action: login\\r\\n\";\n                $login .= \"Username: \" . $MANAGER_user . \"\\r\\n\";\n                $login .= \"Secret: \" . $MANAGER_pass . \"\\r\\n\";\n                $login .= \"Events: Off\\r\\n\";\n                $login .= \"\\r\\n\";\n                fwrite($socket, $login);\n\n                \/\/Coletando primeiras linhas\n                $manager_version = fgets($socket);\n                $cmd_response = fgets($socket);\n                $response = fgets($socket);\n                $blank_line = fgets($socket);\n\n                if (substr($response, 0, 9) == \"Message: \") {\n                        \/* We have got a response *\/\n                        $loginresponse = trim(substr($response, 9));\n                        if ($loginresponse != \"Authentication Accepted\" &amp;&amp; $loginresponse != \"Authentication accepted\") {\n                                echo(\"-- Unable to log in: $loginresponse\\n\");\n                                fclose($socket);\n                                exit(1);\n                        } else {\n\t\t\t\treturn $socket;\n\t\t\t}\n\t\t}else{\n                        echo \"Unexpected response: $response\\n\";\n                        fclose($socket);\n\t\t\texit(0);\n                }\n        }\n\n\n}\n\nfunction peerstatus($peer,$search) {\n\t\/\/Returns a number of qualify OR peer status\n\n\t$socket = manager_connect();\n\t$checkpeer = \"Action: SIPpeerstatus\\r\\n\";\n\t$checkpeer .= \"Peer: $peer\\r\\n\";\n\t$checkpeer .= \"\\r\\n\";\n\tfwrite($socket, $checkpeer);\n\n\t$count = 0;\n\t$line=NULL;\n\twhile ($line != \"Event: SIPpeerstatusComplete\") {\n\t\t\/\/echo $line . \"\\n\";\n\n\t\tif($line==\"Response: Error\"){\n\t\t\techo $line.\"\\nPeer existe?\\n\";\n\t\t\tfclose($socket);\n\t\t\texit(0);\n\t\t}\n\n\t\t$value = explode(\":\",$line);\n\n\t\tif($value[0]==$search){\n\t\t\techo ltrim($value[1]).\"\\n\";\n\t\t\tfclose($socket);\n\t\t\texit;\n\t\t}\n\n\t\tif($count++==1000){\n\t\t\techo \"Algum erro ocorreu. Loop. Finalizando\\n\";\n\t\t\texit(1);\n\t\t}\n\n\t\t$line = trim(fgets($socket));\n\t}\n\n\tfclose($socket);\n}\n\nfunction onlinepeers() {\n        \/\/Returns a number of online peers\n\n        $socket = manager_connect();\n        $checkpeer = \"Action: SIPpeerstatus\\r\\n\";\n        $checkpeer .= \"\\r\\n\";\n        fwrite($socket, $checkpeer);\n\n        $count = 0;\n        $line=NULL;\n\t$onlinepeer=0;\n        while ($line != \"Event: SIPpeerstatusComplete\") {\n                \/\/echo $line . \"\\n\";\n\n                if($line==\"Response: Error\"){\n                        echo $line.\"\\nPeer existe?\\n\";\n                        fclose($socket);\n                        exit(0);\n                }\n\n                $value = explode(\":\",$line);\n\n                if($line==\"PeerStatus: Reachable\"){\n\t\t\t$onlinepeer++;\n                }\n\n                if($count++==1000){\n                        echo \"Algum erro ocorreu. Loop. Finalizando\\n\";\n                        exit(1);\n                }\n\n                $line = trim(fgets($socket));\n        }\n\t\n\techo $onlinepeer.\"\\n\";\n\n        fclose($socket);\n}\n\nfunction activecalls(){\n\t\/\/Returns a number of active calls\n        \/\/Returns a number of qualify OR peer status\n\n        $socket = manager_connect();\n        $checkpeer = \"Action: CoreStatus\\r\\n\";\n        $checkpeer .= \"\\r\\n\";\n        fwrite($socket, $checkpeer);\n\n        $count = 0;\n        $line=NULL;\n        $line = trim(fgets($socket));\n\n        do {\n                $line = trim(fgets($socket));\n\n                \/\/echo $line . \"\\n\";\n\n                if($line==\"Response: Error\"){\n                        echo $line.\"\\n\";\n                        fclose($socket);\n                        exit(0);\n                }\n\n                $value = explode(\":\",$line);\n\n                if($value[0]==\"CoreCurrentCalls\"){\n                        echo ltrim($value[1]).\"\\n\";\n                        fclose($socket);\n                        exit;\n                }\n\n                $value = explode(\":\",$line);\n\n\n                if($count++==1000){\n                        echo \"Algum erro ocorreu. Loop. Finalizando\\n\";\n                        exit(1);\n                }\n\n        } while(substr($line,0,16) != \"CoreCurrentCalls\");\n\n        fclose($socket);\n\n}\n\nfunction asteriskrunning(){\n\t\/\/Return 1 = Asterisk is running\n\t\/\/\t 0 = Asterisk is not running\n\t\n\t$ret = exec(\"\/bin\/ps -A | grep asterisk | wc -l\");\n\tif($ret&gt;0)\n\t\techo \"1\\n\";\n\telse\n\t\techo \"0\\n\";\n}\n\nfunction longestcall(){\n\t\/\/Return the longest call, in seconds, running on asterisk\n\n        $socket = manager_connect();\n        $checkpeer = \"Action: CoreShowChannels\\r\\n\";\n        $checkpeer .= \"\\r\\n\";\n        fwrite($socket, $checkpeer);\n\n        $count = 0;\n        $line=NULL;\n        $line = trim(fgets($socket));\n\t$seconds = 0;\n        do {\n                $line = trim(fgets($socket));\n\n                \/\/echo $line . \"\\n\";\n\n                if($line==\"Response: Error\"){\n                        echo $line.\"\\n\";\n                        fclose($socket);\n                        exit(0);\n                }\n\n                $value = explode(\":\",$line);\n\n                if($value[0]==\"Duration\"){\n\t\t\t\/\/HH:MM:SS em segundos\n\t\t\t$tempo = ltrim($value[1])*60*60 + $value[2]*60 + $value[3];\n\n\t\t\tif($tempo &gt; $seconds)\n\t\t\t\t$seconds=$tempo;\n                }\n\n                $value = explode(\":\",$line);\n\n                if($count++==1000){\n                        echo \"Algum erro ocorreu. Loop. Finalizando\\n\";\n                        exit(1);\n                }\n\n        } while($line != \"EventList: Complete\");\n\n\techo $seconds.\"\\n\";\n\n        fclose($socket);\n}\n\nif(!isset($argv[1])){\n\techo \"Parametros necessarios. Digite help para saber mais.\\n\";\n\texit;\n}\n\nswitch($argv[1]){\n\tcase 'peerstatus':\n\t\tpeerstatus($argv[2],\"PeerStatus\");\n\t\tbreak;\n\tcase 'peertime':\n\t\tpeerstatus($argv[2],\"Time\");\n\t\tbreak;\n\tcase 'activecalls':\n                activecalls();\n                break;\n\tcase 'asteriskrunning':\n\t\tasteriskrunning();\n\t\tbreak;\n\tcase 'longestcall':\n\t\tlongestcall();\n\t\tbreak;\n\tcase 'onlinepeers':\n\t\tonlinepeers();\n\t\tbreak;\n\tcase '--help':\n\tcase '?':\n\t\techo \"Help\\n\\n\";\n                echo \"peerstatus peer   - Retorna o status de um determinado peer\\n\";\n                echo \"peertime peer     - Retorna o tempo (qualify) de um determinado peer\\n\";\n                echo \"activecalls       - Retorna quantas chamadas estao em curso\\n\";\n                echo \"asteriskrunning   - Retorna 1 se asterisk estiver rodando. Senao 0\\n\";\n                echo \"longestcall       - Retorna o valor em minutos da chamada com mais tempo em duracao\\n\";\n                echo \"onlinepeers       - Retorna a quantidade de SIP online\\n\";\n                echo \"\\n\";\n                break;\n\n\tDefault:\n\t\techo \"Comando \".$argv[1].\" n&atilde;o encontrado. Digite --help ou ? para saber mais\\n\\n\";\n\t\tbreak;\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-gallery columns-0 is-cropped\"><\/ul>\n\n\n\n<p><strong>Passo 03 &ndash; zabbix_agentd.conf<\/strong><\/p>\n\n\n\n<p>Agora acesse o seu \/etc\/zabbix\/zabbix_agentd.conf e adicione esta linha no final do arquivo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UserParameter=spx.asterisk[*],\/usr\/bin\/php \/var\/local\/ast_zabbix.php $1 $2\n<\/code><\/pre>\n\n\n\n<p>Ap&oacute;s, restarte o seu zabbix e pronto!<\/p>\n\n\n\n<p><strong>Passo 04 &ndash; Configurando o Zabbix:<\/strong><\/p>\n\n\n\n<p>Se voc&ecirc; chegou at&eacute; aqui, falta apenas este &uacute;ltimo passo, onde configuraremos o seu host no zabbix.<\/p>\n\n\n\n<p>Adicione um novo item no seu host, configurando conforme o exemplo abaixo:<\/p>\n\n\n\n<ul class=\"wp-block-gallery columns-1 is-cropped\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"697\" height=\"111\" src=\"http:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-48-28.png\" alt=\"Screenshot from 2020 05 28 16 48 28 - Monitorando o Asterisk no Zabbix\" data-id=\"826\" data-link=\"http:\/\/blog.saperx.com.br\/?attachment_id=826\" class=\"wp-image-826\" srcset=\"https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-48-28.png 697w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-48-28-300x48.png 300w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-48-28-600x96.png 600w\" sizes=\"(max-width: 697px) 100vw, 697px\" title=\"Monitorando o Asterisk no Zabbix\"><\/figure><\/li><\/ul>\n\n\n\n<p>Veja a &ldquo;Chave&rdquo;, que est&aacute; monitorando o ramal 8009001.<\/p>\n\n\n\n<p>Voc&ecirc; pode adicionar quantos ramais voc&ecirc; desejar monitorar. Basta adicionar um monitoramento para cada ramal.<\/p>\n\n\n\n<p>Para consultar todas as chaves poss&iacute;veis de serem utilizadas, basta rodar o script: php \/var\/local\/ast_zabbix.php &ndash;help<\/p>\n\n\n\n<ul class=\"wp-block-gallery columns-1 is-cropped\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"684\" height=\"155\" src=\"http:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-53-39.png\" alt=\"Screenshot from 2020 05 28 16 53 39 - Monitorando o Asterisk no Zabbix\" data-id=\"827\" data-link=\"http:\/\/blog.saperx.com.br\/?attachment_id=827\" class=\"wp-image-827\" srcset=\"https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-53-39.png 684w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-53-39-300x68.png 300w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-53-39-600x136.png 600w\" sizes=\"(max-width: 684px) 100vw, 684px\" title=\"Monitorando o Asterisk no Zabbix\"><\/figure><\/li><\/ul>\n\n\n\n<p><br><\/p>\n\n\n\n<p>Abaixo, mais um exemplo para facilitar o seu entendimento:<\/p>\n\n\n\n<ul class=\"wp-block-gallery columns-1 is-cropped\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"631\" height=\"127\" src=\"http:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-54-24.png\" alt=\"Screenshot from 2020 05 28 16 54 24 - Monitorando o Asterisk no Zabbix\" data-id=\"828\" data-link=\"http:\/\/blog.saperx.com.br\/?attachment_id=828\" class=\"wp-image-828\" srcset=\"https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-54-24.png 631w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-54-24-300x60.png 300w, https:\/\/blog.saperx.com.br\/wp-content\/uploads\/2020\/05\/Screenshot-from-2020-05-28-16-54-24-600x121.png 600w\" sizes=\"(max-width: 631px) 100vw, 631px\" title=\"Monitorando o Asterisk no Zabbix\"><\/figure><\/li><\/ul>\n\n\n\n<p><strong>Finalizando<\/strong><\/p>\n\n\n\n<p>F&aacute;cil n&atilde;o? <br>Agora que voc&ecirc; entendeu, pode monitorar o que voc&ecirc; quiser no Asterisk. Basta usar a sua criatividade.<br>Pode usar este c&oacute;digo como quiser, seja para fins acad&ecirc;micos ou comerciais.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Compartilharemos aqui um script que desenvolvemos para monitorar o Asterisk atrav&eacute;s do Zabbix. Com este script voc&ecirc; ser&aacute; capaz de monitorar: Status de um SIP em espec&iacute;fico Tempo (qualify) de um SIP em espec&iacute;fico Quantidade de chamadas ativas Status do processo do asterisk, para saber se est&aacute; rodando ou n&atilde;o Dura&ccedil;&atilde;o da chamada mais longa [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":704,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[8],"tags":[37,119],"_links":{"self":[{"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/posts\/822"}],"collection":[{"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=822"}],"version-history":[{"count":6,"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/posts\/822\/revisions"}],"predecessor-version":[{"id":1151,"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/posts\/822\/revisions\/1151"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/media\/704"}],"wp:attachment":[{"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.saperx.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}