{"id":2686,"date":"2016-07-11T16:08:32","date_gmt":"2016-07-11T21:08:32","guid":{"rendered":"http:\/\/itsoftware.com.co\/content\/?p=2686"},"modified":"2019-05-18T12:41:59","modified_gmt":"2019-05-18T17:41:59","slug":"consultar-extensiones-caidas-asterisk-historicamente","status":"publish","type":"post","link":"https:\/\/itsoftware.com.co\/content\/consultar-extensiones-caidas-asterisk-historicamente\/","title":{"rendered":"Consultar extensiones ca\u00eddas en Asterisk hist\u00f3ricamente"},"content":{"rendered":"<p>Este art\u00edculo busca crear un procedimiento para informar por correo electr\u00f3nico, el comportamiento de extensiones ca\u00eddas en Asterisk, por periodos de 10 o m\u00e1s d\u00edas.<\/p>\n<figure style=\"width: 246px\" class=\"wp-caption alignnone\"><img fetchpriority=\"high\" decoding=\"async\" class=\"\" src=\"http:\/\/www.jksistemas.com.co\/imagenes\/asterisk.jpg\" width=\"246\" height=\"205\" \/><figcaption class=\"wp-caption-text\">Estado Extensiones Asterisk<\/figcaption><\/figure>\n<p><!--more--><\/p>\n<p>El problema en general con respecto al estado de las extensiones Asterisk, radica en que s\u00f3lo se nos reporta el estado actual de las extensiones, a modo de una foto en el instante en que hacemos un requerimiento de estado de las mismas. No existe un historial que nos indique cu\u00e1nto tiempo una extensi\u00f3n ha estado desconectada en el transcurso del d\u00eda o de los d\u00edas.<\/p>\n<p>Para darle una soluci\u00f3n a esta problem\u00e1tica, el siguiente procedimiento busca tomar el estado de las extensiones cada hora, subiendo esta informaci\u00f3n a una tabla de la base de datos MySQL. Si una extensi\u00f3n ha estado desconectada por 19 o m\u00e1s veces en un d\u00eda, entonces se considera que ha estado desconectada durante ese d\u00eda. Con base en esa premisa, se buscan todas las extensiones que han estado desconectadas por 10 o m\u00e1s d\u00edas consecutivos, para crear una lista que se env\u00eda por correo electr\u00f3nico.<\/p>\n<p>Los siguientes ser\u00edan los pasos a realizar para activar esta soluci\u00f3n:<\/p>\n<p><b>A) En la DB MySQL<\/b><\/p>\n<p>1) Se crea una tabla para subir los estados de las extensiones:<\/p>\n<blockquote><p>CREATE TABLE `t_peer_status` (<br \/>\n`cod_peer_status` int(11) NOT NULL AUTO_INCREMENT,<br \/>\n`date_st` datetime NOT NULL DEFAULT &#8216;0000-00-00 00:00:00&#8217;,<br \/>\n`username` varchar(26) CHARACTER SET latin1 NOT NULL DEFAULT \u00bb,<br \/>\n`host` varchar(40) CHARACTER SET latin1 DEFAULT \u00bb,<br \/>\n`dyn` varchar(4) CHARACTER SET latin1 DEFAULT NULL,<br \/>\n`forceport` varchar(11) CHARACTER SET latin1 DEFAULT NULL,<br \/>\n`acl` varchar(4) CHARACTER SET latin1 DEFAULT NULL,<br \/>\n`port` varchar(9) CHARACTER SET latin1 DEFAULT NULL,<br \/>\n`status` varchar(12) CHARACTER SET latin1 DEFAULT NULL,<br \/>\nPRIMARY KEY (`cod_peer_status`),<br \/>\nUNIQUE KEY `date_st` (`date_st`,`username`)<br \/>\n) ENGINE=MyISAM AUTO_INCREMENT=9774040 DEFAULT CHARSET=utf8;<\/p><\/blockquote>\n<div><\/div>\n<div><\/div>\n<p>2) Se crea una tabla para almacenar los nombres de los archivos logs de estados de extensiones:<\/p>\n<blockquote><p>CREATE TABLE `t_files_peer_st` (<br \/>\n`cod_file_per_st` int(11) NOT NULL AUTO_INCREMENT,<br \/>\n`NOMBRE` varchar(30) DEFAULT NULL,<br \/>\n`MODIFICACION` datetime DEFAULT NULL,<br \/>\n`DIRECTORIO` varchar(30) DEFAULT NULL,<br \/>\nPRIMARY KEY (`cod_file_per_st`)<br \/>\n) ENGINE=MyISAM AUTO_INCREMENT=285 DEFAULT CHARSET=latin1;<\/p><\/blockquote>\n<p>3) Se crea la siguiente vista de apoyo para recoger el estado de las extensiones de los \u00faltimos 12 d\u00edas:<\/p>\n<div><\/div>\n<blockquote>\n<div>CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_exten_cur` AS select `t_peer_status`.`cod_peer_status` AS `cod_peer_status`,`t_peer_status`.`date_st` AS `date_st`,`t_peer_status`.`username` AS `username`,`t_peer_status`.`host` AS `host`,`t_peer_status`.`dyn` AS `dyn`,`t_peer_status`.`forceport` AS `forceport`,`t_peer_status`.`acl` AS `acl`,`t_peer_status`.`port` AS `port`,`t_peer_status`.`status` AS `status` from `t_peer_status` where (cast(`t_peer_status`.`date_st` as date) between (curdate() &#8211; interval 12 day) and curdate());<\/div>\n<div><\/div>\n<div><\/div>\n<\/blockquote>\n<p>4) Se crea un procedimiento almacenado para hacer la consulta de los 10 d\u00edas desconectados en forma continua, haciendo uso tambi\u00e9n de un cursor para detectar l\u00edneas desconectadas en ese tiempo :<\/p>\n<blockquote>\n<div><\/div>\n<div>CREATE DEFINER=`root`@`localhost` PROCEDURE `off_days`(_inicio int(11),_extension varchar(50), out _exten INT(11))<br \/>\nbegin<br \/>\nSET @extension=trim(_extension);<br \/>\nSET @inicio=_inicio;<br \/>\nset @c=\u00bb;PREPARE stmt FROM \u00abselect SC.cont\u00a0 INTO @c from (<br \/>\nselect distinct count(username) as cont,date(date_st),hour(date_st),username<br \/>\nfrom v_exten_cur<br \/>\nwhere (date(date_st) = (curdate() &#8211; interval (?) day)) and (substring(status,1,2)&lt;&gt;&#8217;OK&#8217;) and (username = ? )<br \/>\ngroup by username<br \/>\n) SC\u00bb;EXECUTE stmt USING @inicio,@extension;<br \/>\nDEALLOCATE PREPARE stmt;<br \/>\nset _exten=@c;<br \/>\nend;<\/div>\n<div><\/div>\n<div><\/div>\n<div>CREATE DEFINER=`root`@`localhost` PROCEDURE `exten_down_10`(_inicio INT)<br \/>\nbegin<br \/>\nDECLARE _extension varchar (26);<br \/>\nDECLARE _dias\u00a0 INT;<br \/>\nDECLARE _dias_caidos\u00a0 INT;<br \/>\nDECLARE _fin_down INT;<br \/>\nDECLARE _exten INT;<br \/>\nDECLARE fin INTEGER DEFAULT 0;DECLARE dircon CURSOR FOR select SC.username from (<br \/>\nselect count(username) as cont,date(date_st),hour(date_st) ,username<br \/>\nfrom t_peer_status<br \/>\nwhere date(date_st) = curdate() &#8211; interval (_inicio) day and substring(status,1,2)&lt;&gt;&#8217;OK&#8217;<br \/>\ngroup by\u00a0 username<br \/>\n)<br \/>\nSC where SC.cont&gt;=19;DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin=1;DROP TEMPORARY\u00a0 TABLE IF EXISTS tmp_exten_down;CREATE\u00a0 TEMPORARY TABLE tmp_exten_down (extension varchar(20), dias int);OPEN dircon;loop1: LOOPSET _dias = _inicio;<br \/>\nSET _dias_caidos = 0;<br \/>\nSET _fin_down=0;<br \/>\nSET _exten=0;FETCH dircon INTO _extension;<\/p>\n<p>IF fin = 1 THEN<br \/>\nLEAVE loop1;<br \/>\nEND IF;<\/p>\n<p>while _fin_down=0 and _dias &lt; 11 DO<\/p>\n<p>call off_days(_dias,_extension,_exten);<\/p>\n<p>IF\u00a0 _exten = 0\u00a0 THEN<br \/>\nSET _fin_down=1;<br \/>\nEND IF;<\/p>\n<p>SET _dias=_dias+1;<\/p>\n<p>IF\u00a0 _exten &gt;= 19\u00a0 THEN<br \/>\nSET _dias_caidos=_dias_caidos + 1;<br \/>\nEND IF;<\/p>\n<p>end while;<\/p>\n<p>insert into tmp_exten_down values (_extension, _dias_caidos);<\/p>\n<p>END LOOP loop1;<\/p>\n<p>CLOSE dircon;<\/p>\n<p>select * from tmp_exten_down where dias&gt;=0\u00a0 ;<\/p>\n<p>DROP TEMPORARY\u00a0 TABLE IF EXISTS tmp_exten_down;<\/p>\n<p>end;<\/p>\n<\/div>\n<\/blockquote>\n<div><\/div>\n<div><\/div>\n<p><b>B) En el servidor Asterisk (Linux):<\/b><br \/>\n1) Se crea un script\u00a0(<em>query.sh<\/em>) para traer el estado de las extensiones (<em>asterisk -rx \u00absip show peers<\/em>\u00ab) y guardarlo en un archivo de texto (<em>extension_&lt;fecha&gt;<\/em>) :<\/p>\n<blockquote><p>#!\/bin\/bash<\/p>\n<p>printf \u00ab\\n\\n******************\\n\u00bb\u00a0 &gt;&gt; \/home\/soporte\/extensiones\/logs\/extension_$(date +\u00bb%m-%d-%y\u00bb)<\/p>\n<p>printf \u00ab$(date +\u00bb%Y-%m-%d %H:%M\u00bb)\\n\u00bb\u00a0 &gt;&gt; \/home\/soporte\/extensiones\/logs\/extension_$(date +\u00bb%m-%d-%y\u00bb)<\/p>\n<p>printf \u00ab$(\/usr\/sbin\/asterisk -rx \u00absip show peers\u00bb)\u00bb\u00a0\u00a0 &gt;&gt; \/home\/soporte\/extensiones\/logs\/extension_$(date +\u00bb%m-%d-%y\u00bb)<\/p>\n<p>exit<\/p><\/blockquote>\n<p>2) Se crea un archivo <em>importa.php<\/em> para recoger los datos de los archivos logs con los estados de las extensiones, al final llama al php <em>ext_down.php<\/em> que reporta las extensiones ca\u00eddas por 10 o m\u00e1s d\u00edas:<\/p>\n<blockquote><p>&lt;?php<\/p>\n<p>require_once(\u00abincludes\/CConexion.php\u00bb);<\/p>\n<p>$conex=new CConexion();<\/p>\n<p>$conex-&gt;Conectar();<br \/>\n$original_mem = ini_get(&#8216;memory_limit&#8217;);<br \/>\nmysql_query(\u00abSET AUTOCOMMIT=0&#8243;,$conex-&gt;getConexion()) or die(mysql_error());<\/p>\n<p>function ExplorarDir($ruta){<br \/>\n$direct=null;<\/p>\n<p>if($dh=opendir($ruta)){<br \/>\n$j=0;<br \/>\nwhile (($file = readdir($dh)) !== false) {<br \/>\nif (is_dir($ruta . $file) &amp;&amp; $file!=\u00bb.\u00bb &amp;&amp; $file!=\u00bb..\u00bb){<br \/>\n$direct[$j]=(string)$file;<br \/>\n$j++;<br \/>\n}<br \/>\n}<br \/>\nclosedir($dh);<br \/>\n}<br \/>\nreturn $direct;<br \/>\n}<\/p>\n<p>function ExplorarFile($ruta){<br \/>\n$files=null;<br \/>\necho $ruta.\u00bb&lt;br&gt;\u00bb;<br \/>\nif($dh=opendir($ruta)){<br \/>\n$j=0;<br \/>\nwhile (($file = readdir($dh)) !== false) {<\/p>\n<p>if (!is_dir($ruta . $file) &amp;&amp; $file!=\u00bb.\u00bb &amp;&amp; $file!=\u00bb..\u00bb){<br \/>\n$files[$j]=(string)$file;<br \/>\n$j++;<br \/>\n}<br \/>\n}<br \/>\nclosedir($dh);<br \/>\n}<br \/>\nreturn $files;<br \/>\n}<\/p>\n<p>function TraerFecha($mifecha){<br \/>\nreturn $mifecha;<br \/>\n}<\/p>\n<p>$ruta=\u00bb\/home\/soporte\/extensiones\/logs\u00bb;<\/p>\n<p>$work=true;<br \/>\n$directorio = null;<br \/>\n$archivos = null;<br \/>\n$directorio=ExplorarDir($ruta);<br \/>\n$ingresos=0;<br \/>\n$error_de_insercion=0;<br \/>\n$archivos=null;<br \/>\n$archivos=ExplorarFile(\u00ab\/home\/soporte\/extensiones\/logs\u00bb);<\/p>\n<p>for($k=0;$k&lt;count($archivos);$k++)<br \/>\n{<br \/>\necho \u00abCONTEO: $i &#8211; DIRECTORIO:\u00bb.$directorio.\u00bb- ARCHIVO:\u00bb.$archivos[$k].\u00bb&lt;br&gt;\u00bb;<\/p>\n<p>$modificacion=date(\u00abY-m-d H:i:s.\u00bb, filemtime($ruta.$directorio.\u00bb\/\u00bb.$archivos[$k]));<br \/>\n$res_t=mysql_query(\u00abselect count(*) as cuenta from t_files_peer_st where NOMBRE='\u00bb.$archivos[$k].\u00bb&#8216; AND MODIFICACION = &#8216;\u00bb.$modificacion.\u00bb&#8216;\u00bb,$conex-&gt;getConexion());<\/p>\n<p>if($reg_t=mysql_fetch_assoc($res_t))<br \/>\nif(!$reg_t[\u00abcuenta\u00bb])\/\/Si no exste coincidencia en la base de datos<br \/>\n{<br \/>\n$error_de_insercion=0;<br \/>\n$cont_lineas=0;<br \/>\n$periodo=0;<br \/>\n$cerrado=false;<br \/>\necho $ruta.$directorio;<\/p>\n<p>$archivo=fopen($ruta.$directorio.\u00bb\/\u00bb.$archivos[$k], \u00abr\u00bb);<\/p>\n<p>if(!$archivo)<br \/>\n{<br \/>\necho \u00abEl archivo \u00ab.$archivos[$k].\u00bb no pudo abrirse\u00bb;<br \/>\nexit();<br \/>\n}<br \/>\n$start=false;<br \/>\nwhile ($linea = fgets($archivo,1024))<br \/>\n{<br \/>\necho $linea.\u00bb&lt;br \/&gt;\u00bb;<br \/>\nif(trim($linea)==\u00bb******************\u00bb)\u00a0\u00a0 \u00a0{<br \/>\n$start=true;<br \/>\necho \u00abencabezado\u00bb;<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\nif($start)<br \/>\n{<br \/>\n$fecha=trim($linea);<br \/>\n$start=false;<br \/>\necho $fecha;<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\n$work=true;<br \/>\nif((strpos($linea,\u00bbName\/username\u00bb)!==FALSE ) || (strpos($linea,\u00bb*********\u00bb)!==FALSE )\u00a0 || (strpos($linea,\u00bbsip peers\u00bb)!==FALSE ) || trim($linea)==\u00bb\u00bb )<br \/>\n$work=false;<\/p>\n<p>if ($work) {<br \/>\n$string = $linea;<br \/>\n$intervals = array(27, 40, 4, 11, 4,9,11);<br \/>\n$start1 = 0;<br \/>\n$parts = array();<br \/>\nforeach ($intervals as $i)<br \/>\n{<br \/>\n$parts[] = trim(mb_substr($string, $start1, $i));<br \/>\n$start1 += $i;<br \/>\n}<br \/>\n$sql=\u00bb<br \/>\ninsert into t_peer_status<br \/>\n(<br \/>\ndate_st,<br \/>\nusername,<br \/>\nhost,<br \/>\ndyn,<br \/>\nforceport,<br \/>\nacl,<br \/>\nport,<br \/>\nstatus<br \/>\n)<br \/>\nvalues (<br \/>\n&#8216;$fecha&#8217;,<br \/>\n&#8216;\u00bb.$parts[0].\u00bb&#8216;,<br \/>\n&#8216;\u00bb.$parts[1].\u00bb&#8216;,<br \/>\n&#8216;\u00bb.$parts[2].\u00bb&#8216;,<br \/>\n&#8216;\u00bb.$parts[3].\u00bb&#8216;,<br \/>\n&#8216;\u00bb.$parts[4].\u00bb&#8216;,<br \/>\n&#8216;\u00bb.$parts[5].\u00bb&#8216;,<br \/>\n&#8216;\u00bb.$parts[6].\u00bb&#8216;<br \/>\n)<br \/>\n\u00ab;<br \/>\necho $sql;<br \/>\n}<br \/>\nmysql_query($sql,$conex-&gt;getConexion()) ;<br \/>\n}<\/p>\n<p>}<\/p>\n<p>$cont_lineas++;<br \/>\n}<\/p>\n<p>if(!$cerrado)<br \/>\nfclose ($archivo);<\/p>\n<p>$sql=\u00bbinsert into t_files_peer_st (NOMBRE,DIRECTORIO,MODIFICACION) values (&#8216;\u00bb.$archivos[$k].\u00bb&#8216;,'\u00bb.$directorio.\u00bb&#8216;,'\u00bb.$modificacion.\u00bb&#8216;)\u00bb;<br \/>\n$res_a=@mysql_query($sql,$conex-&gt;getConexion());<\/p>\n<p>if(!$res_a){<br \/>\necho \u00abHubo un inconveniente al ingresar el nombre del archivo a la base de datos&lt;br&gt;\u00bb;<br \/>\n\/\/exit();<br \/>\n}<\/p>\n<p>mysql_query(\u00abCOMMIT\u00bb,$conex-&gt;getConexion());<\/p>\n<p>}\/\/Cierra no existe en la base de datos<br \/>\nelse<br \/>\necho \u00ab$i &#8211; El archivo \u00ab.$archivos[$k].\u00bb ya se encuentra ingresado&lt;br&gt;\u00bb;<\/p>\n<p>}\/\/cierra el for k<\/p>\n<p>\/\/mysql_query(\u00abROLLBACK\u00bb,$conex-&gt;getConexion());<br \/>\n$conex-&gt;Desconectar();<br \/>\nini_set(&#8216;memory_limit&#8217;,$original_mem);<br \/>\nini_set(&#8216;max_execution_time&#8217;, 30);<\/p>\n<p>require_once(\u00abext_down.php\u00bb);<br \/>\n?&gt;<\/p><\/blockquote>\n<p>3) Se crea el script php <em>ext_down.php<\/em> para traer las extensiones con 10 d\u00edas o m\u00e1s y reportarlas por correo electr\u00f3nico:<\/p>\n<blockquote><p>&lt;?php<br \/>\n$conexion = mysql_connect(&#8216;localhost&#8217;, &#8216;root&#8217;, &#8216;xxxx&#8217;);<br \/>\nmysql_select_db(&#8216;mya2billing&#8217;);<br \/>\n$exten=array();<br \/>\n$sql3=\u00bbCALL mya2billing.exten_down_10(0)\u00bb;<br \/>\n$j=0;<br \/>\n$res3=mysql_query($sql3,$conexion) or die(mysql_error());<\/p>\n<p>while($reg=mysql_fetch_assoc($res3)){<br \/>\n$exten[$j][0]=$reg[\u00abextension\u00bb];<br \/>\n$exten[$j][1]=$reg[\u00abdias\u00bb];<br \/>\n$j++;<br \/>\n}<\/p>\n<p>require(\u00abclass.phpmailer.php\u00bb);<br \/>\n$mail = new PHPMailer();<br \/>\n$mail-&gt;PluginDir = \u00ab\u00bb;<br \/>\n$mail-&gt;Mailer = \u00absmtp\u00bb;<br \/>\n$mail-&gt;SMTPAuth = false;<br \/>\n$mail-&gt;Host = \u00abmail.xxx.com\u00bb;<br \/>\n$mail-&gt;Port = 25;<br \/>\n$mail-&gt;From = \u00abprueba@correo.com\u00bb;<br \/>\n$mail-&gt;FromName = \u00abSistema de Informacion\u00bb;<br \/>\n$mail-&gt;Subject = \u00abInforme Extensiones Caidas\u00bb;<br \/>\n$mail-&gt;Username = \u00abprueba@correo.com\u00bb;<br \/>\n$mail-&gt;Password = \u00abxxxxxx\u00bb;<br \/>\n$mail-&gt;AddCC(\u00abprueba1@correo.com\u00bb);<br \/>\n$body .= \u00ab&lt;b&gt;Extensiones con 10 dias consecutivos desconectados&lt;\/b&gt; &lt;br&gt;&lt;br&gt;\u00bb;<br \/>\n$body .= \u00ab&lt;table style=&#8217;font-family:Arial, Helvetica, sans-serif;\u00a0 font-size:11px; border-right: 1px solid #001f27; text-indent: 5px;<br \/>\nborder-bottom: 1px solid #001f27; border-top: 1px solid #001f27; border-left: 1px solid #001f27;&#8217; border=&#8217;0&#8242; width=&#8217;100%&#8217; &gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td style=&#8217;background-color:#069; color:#FFF; &#8216;&gt;&lt;strong&gt;EXTENSION&lt;\/strong&gt;&lt;\/td&gt;<br \/>\n&lt;td style=&#8217;background-color:#069; color:#FFF; &#8216;&gt;&lt;strong&gt;DIAS CAIDOS&lt;\/strong&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;\u00bb;<\/p>\n<p>for($i=0;$i&lt;sizeof($exten);$i++)<br \/>\n$body .= \u00ab&lt;tr style=&#8217;background-color: #FFF; font-size:10px;&#8217;&gt;<br \/>\n&lt;td style=&#8217;font-size:10px; color: $font&#8217;&gt;\u00bb.$exten[$i][0].\u00bb&lt;\/td&gt;<br \/>\n&lt;td style=&#8217;font-size:10px; color: $font&#8217;&gt;\u00bb.$exten[$i][1].\u00bb&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;\u00bb;<br \/>\n$mail-&gt;Body = $body;<\/p>\n<p>if (!$mail-&gt;Send())<br \/>\n{<br \/>\necho \u00abOperaci\u00f3n Fallida: \u00ab.$mail-&gt;ErrorInfo.\u00bb&lt;\/br&gt;&lt;\/br&gt;\u00bb;<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\necho \u00abNotificaci\u00f3n Enviada&lt;\/br&gt;&lt;\/br&gt;\u00bb;<br \/>\n$mail-&gt;Timeout=120;<br \/>\n}<br \/>\nmysql_close($conexion);<br \/>\n?&gt;<\/p><\/blockquote>\n<p>4) Se crean las siguientes tareas programadas para realizar autom\u00e1ticamente esta operaci\u00f3n (a las 11:30 pm se importan los datos de los archivos logs, y a las 00 se reporta por correo las extensiones ca\u00eddas):<\/p>\n<div><\/div>\n<blockquote>\n<div>$ crontab -l<\/div>\n<div>00 * * * * \/home\/soporte\/extensiones\/query.sh<\/div>\n<div>30 23 * * * php \/home\/soporte\/extensiones\/importa\/importa.php<\/div>\n<\/blockquote>\n<div><\/div>\n<p>En resumen:<\/p>\n<p>El script <i>query.sh<\/i> se encarga de crear cada hora los logs de estado de las extensiones. Se crea un archivo diario con todas las extensiones.<\/p>\n<p>El archivo <i>importa.php<\/i> se encarga de importar los archivos creados por <i>query.sh<\/i>, para subirlos a la base de datos. Luego llama las consultas para determinar el n\u00famero de d\u00edas de desconexi\u00f3n de las extensiones, y env\u00eda dicho resultado por correo electr\u00f3nico, mediante el script <em>ext_down.php<\/em>.<\/p>\n<p>Si est\u00e1s interesado en realizar automatizaciones de este tipo o similares, en <a href=\"http:\/\/itsoftware.com.co\">ITSoftware SAS<\/a> contamos con personal especializado para hacer m\u00e1s eficientes cualquier proceso que quieras mejorar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este art\u00edculo busca crear un procedimiento para informar por correo electr\u00f3nico, el comportamiento de extensiones ca\u00eddas en Asterisk, por periodos de 10 o m\u00e1s d\u00edas.<\/p>\n","protected":false},"author":1,"featured_media":8125,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[305],"tags":[785,801,802],"class_list":["post-2686","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automatizacion","tag-automatizaciones","tag-scripts-linux","tag-scripts-php"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/itsoftware.com.co\/content\/wp-content\/uploads\/2016\/07\/asterisk-caidas.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts\/2686","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/comments?post=2686"}],"version-history":[{"count":0,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts\/2686\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/media\/8125"}],"wp:attachment":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/media?parent=2686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/categories?post=2686"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/tags?post=2686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}