Hace unas semanas intenté acceder al blog para subir algunos post pero al intentar dar mi login y password en el admin de este blog simplemente no pude acceder, por lo que pensé que igual se me había olvidado la contraseña, así que entré vía SSH al servidor, me validé en la base de datos y cambié el password usando md5 en la tabla de usuarios e intenté otra vez acceder al administrador del blog pero igual no me validaba.
Lo que pude ver es que si introducía un login o password erróneo si me lo indicaba, pero si daba los datos correctos, entonces tardaba unos segundos como intentando hacer algo pero regresaba a la página de validación, como si hubiera un error en la sessión.
Revisé que alguien no hubiera alterado el código del jaws, así como vi los logs para ver si algo raro ocurría con el servidor web o si estaba comprometido, pero nada, por lo que como tenía cosas que hacer lo dejé por semanas, hasta hoy en la madrugada que me dije hoy si quiero bloguear aunque tenga que cambiar la versión de jaws.
Por lo que respaldé la base de datos, pero al hacer el dumping, vi que me marcaba error en las tablas de ipvisitor, session y captcha, por lo que solo reparé las tablas con el siguiente comando:
Al momento de hacer una relación m:m en vTiger con 2 módulos personalizados e intentar seleccionar los registros de un módulo detalle desde un módulo maestro vTiger me generaba el siguiente error:
vTiger Warning: Invalid argument supplied for foreach() in /var/www/vtigercrm/include/utils/ListViewUtils.php on line 1418
Este error se generaba en esta porción del código de vTiger
Al parecer esto ya que al definir las variables en la clase MiModulo.php estas las definía en minúsculas, por lo que vTiger buscaba en el arreglo un nombre de campo con la primer letra mayúscula, por lo que si todo estaba en minúscula no encontraba el registro y por ende mandaba el error, por ello solo entre a la clase del módulo y definí el nombre de los campos con la primer letra mayúscula, con esto se resolvió el problema.
Hace unos días empecé a experimentar problemas con mi servidor web el cuál tendía a mandar errores de conexión de MySQL pero por falta de tiempo no me había metido a investigar porqué, solo reiniciaba MySQL y listo.
Pero debido que esto me pasaba 1 o 2 veces por días, entré al log para ver que pasaba y ahí pude ver algo como lo siguiente:
mysqldump: Got error: 145: Table './MYSQLDB/TABLA' is marked as crashed and should be repaired when using LOCK TABLES
Al parecer algunas tablas, 3 para ser exactos tenían un error por lo cuál recurrentemente a MySQL lo "crasheaban", por lo cuál me metí a investigar cuál fue el detalle y la solución fue entrar al directorio de la base de datos de MySQL y correr un chequeo de MySQL, en este caso suponiendo que la base de datos se llame MySQLDB y la tabla TABLA, tendríamos que hacer lo siguiente:
cd/var/lib/mysql/MySQLDB
myisamchk -r TABLA
Repetir lo anterior con cada una de las tablas dañadas.
Uno de los clásicos problemas al tener una IP Pública Dinámica con telmex o algún otro provedor, es que los correos electrónicos no salen como por ejemplo cuándo envías un mail desde una aplicación PHP, este es rechazado por el servidor destino ya que no estamos autentificados para enviar correos.
Una solución es instalar postfix como un smarthost(relay host) no como Internet Site, esto hará que postfix no envíe el correo al dominio destino, si no más bien use un servidor de correos externo como puente y así los servidores destinos acepten el correo.
En este caso pongo la liga de un tutorial bastante práctico el cuál me sirvió para resolver este detalle en unos minutos y así quitarme el problema que me había acosado por bastante rato.
En la mañana configurando una aplicación web en la cuál en base al horario del sistema tenía que controlar cierto flujo de información, lo curioso del caso es que la hora del servidor Linux era la correcta, pero la hora que mostraba la aplicación web usando date("H i s") me daba una hora adelantada, por lo que revisando los logs pude ver que apache-php estaba configurando la zona horaria a América/Chicago, algo curioso ya que en el servidor había ajustado el timezone a América/Mexico_City.
El detalle de esto es que en la configuración de php también hay que indicar la zona horaria en el archivo /etc/php/apache2/php.ini.
date.timezone =America/Mexico_City
Con lo anterior solo basta guardar el archivo de configuración y luego reiniciar el servicio de Apache,.
Esta semana que pasó 5-8 de Octubre del 2010 se llevó en ESIME IPN Zacatenco el Congreso Nacional de Software Libre 2010, en la cuál tuve la fortuna de poder participar con 2 pláticas:
vTiger CRM & Asterisk: Dónde hablamos como un CRM puede ser de utilidad en una empresa para la relación con sus clientes, mejor atención, así como su integración con Asterisk para tener información del cliente que llama en la pantalla de nuestra computadora.
Fotografía Digital & Software Libre: Fué una plática dónde comparto mi gusto por la fotografía y como hago uso de herramientas libres para darle mayor realce a mis capturas fotográficas.
AsterBilling SL permite mostrar el costo de la llamada en las pantallas de los Teléfonos IP que soporten SIP Messages como el Atcom 530, esto en base al destino, tiempo y tarifa configurada en la administración del sistema.
Para poder habilitar esta característica es necesario primero instalar el software de Tarificación de AsterBilling SL
#Después de instalado el software de Tarificación, ir al directorio de instalación cd/var/www/tarificador #Editar el archivo extensions-voip.php sudo editor /var/www/tarificador/extensions-voip.php #Cambiar los siguientes valores por los datos del Asterisk Manager Interface definido en /etc/asterisk/manager.conf $amiHost = "localhost"; //servidor de AMI $amiUser = "cloudvoox"; //login AMI $amiSecret = "cloudvoox";//password AMI $amiContext = "from-internal";//contexto #También asignar los datos de acceso a la base de datos del Tarificador creados anteriormente $mysql_server = "localhost"; $mysql_user = "tarificador"; $mysql_secret = "tarificador"; $mysql_db = "tarificador"; #Ahora solo ejecutar el script
php -q/var/www/tarificador/extensions-voip.php #Para probarlo puede usar un Teléfono IP Atcom 530 o un Atcom 620 el cuál tiene una Pantalla con BackLight. #Para que se ejecute el script al inicio del sistema ponerlo en /etc/init.d o gestionarlo a traves de /etc/crontab #Con esto ya podemos tener un visor en tiempo real del costo de la llamada que esté realizandose desde la cabina(Locutorio). Si se modifica en la administración las tarifas, automáticamente el sistema envía los costos configurados a las pantallas de los teléfonos IPs. La información del tiempo cambia cada vez que se completa el periodo de cargo de la tarifa.
Pongo este post para comentar y compartir un proyecto sobre un Tarificador Web basado en AsterBilling, el cuál he modificado para quitar la parte del pago de licencias por canal monitorerado de la versión original y ligar el tarificador con la base de datos MySQL del CDR de Asterisk, entre otras características que se le han añadido al Tarificador y la traducción al español de las interfaces de administración y operación..
TARIFICADOR para Asterisk "ASTERBILLING SL"
Historia
AsterBilling SL está basado completamente en AsterBilling (http://www.astercrm.org). La versión original de AsterBilling está incluída dentro del proyecto AsterCC que incluye un CRM y Tarificador para Asterisk.
AsterBilling originalmente se diseño para ser un tarificador para Asterisk en tiempo real, en este caso tiene una interfaz de administración y otra de configuración.
En la interfaz de administración se configuran las casetas, cabinas y las tarifas.
En la interfaz de Operación AsterBilling usa un mecanismo que no es OpenSource y se paga por licencias por canal para poder mostrar en tiempo real el costo de la llamada en el cajón de la cabina correspondiente de acuerdo a la configuración de las tarifas realizadas en la parte de administración.
Las interfaces Web de Administración y Operación original de AsterBilling están liberadas como Software Libre.
El motor de AsterCC es software cerrado, esta parte es la que monitorea las llamadas en Asterisk y provee a la interfaz de operación, información en tiempo real del tiempo y costo de la llamada en curso, AsterCC se cobra por el número de canales a monitorear.
¿Porqué se derivó un proyecto a partir de AsterBilling ?
Las 2 principales razones son:
*AsterBilling requiere un pago de licencias por el número de canales a monitorear.
*Algunas ocasiones AsterBilling no tarificaba el tiempo correcto (billsec) de las llamadas realizadas, esto ya que cortaba antes el conteo ó a veces paraba el conteo segundos después de que terminaba la llamada.
Otras razones:
Junto con un amigo del bachillerato (Bernardo Rodríguez Alamilla) planeamos poner un negocio de casetas telefónicas usando la plataforma de Asterisk para ruteo inteligente de llamadas, tarificación, impresión de tickets, facturación y visor en tiempo real de costo de llamadas en teléfonos IP ya que desistimos usar tarificadores chinos y argentinos.
Algunos otros aspectos por el que quitamos el motor AsterCC de AsterBilling es que consumía procesamiento de CPU adicional. No generaba e imprimía tickets ni los foliaba. Idiomas de las interfaces estaban solo en Chino e Ingles.
¿Que cambios realizamos en AsterBilling?
Se desligó la interfaz del operador del motor de AsterCC y se conectó con la base de datos de MySQL usando el CDR de Asterisk.
Se agregó impresión de Tickets usando impresoras de tickets conectadas a un puerto paralelo.
Por motivos fiscales se permite foliar los tickets.
Permite identificar si un número móvil es de Telcel, Movistar u otra compañía en base a una base de datos de la COFETEL y tarificar por compañía.
Ruteo de llamadas identificando a que compañía pertenece un número móvil.
Traducción al español de interfaz de Administración y Operación.
Se modificó el reporteador de CDR Stats para listas, filtrar y graficar llamadas, también para buscar llamadas cobradas y facturadas.
Se usan las pantallas de los teléfonos IP como Visores, para esto se creo un scripts que permite identificar que extensiones IP son tarificadas y enviarles en tiempo real el costo de la llamada en base al destino marcado y duración de la llamada.(Requiere teléfonos que soporten SIP MESSAGES).
Al realizar modificaciones de las tarifas en la administración del sistema, en automático muestra el cambio del costo de llamada en las pantallas de los teléfonos IP que estén llamando.Video Demo [ http://www.youtube.com/watch?v=hoWp4_hpFK4].
Como Mostrar Costo de Llamadas en tiempo real en las pantallas de Teléfonos IP que soporten SIP Messages (Ej. Atcom 530 )
Por ahora el proyecto aun no se sube a SourceForge.Net, pero por via de mientras enviame un correo a fileinleon ARROBA gmail DOT com para que a vuelta de correo te replique el proyecto completo con el manual de instalación y configuración.
#Requerimientos para instalación de AsterBilling SL sobre Ubuntu 8.04 Server #Paquetes requeridos para la instalación a traves de código fuente en Ubuntu Server de Asterisk + Zaptel o DAHDI + OSLEC + SPANDSP + FreePBX + AsterBilling sudoapt-getinstall--yes openssh-server ssh openssl && sudoapt-getinstall--yes openssl libssl-dev ssh&& sudoapt-getinstall--yesgccmakeg++patchautoconfautomake&& sudoapt-getinstall--yes linux-headers-2.6.24-26-server linux-source-2.6.24 linux-image-2.6.24-26-server && sudoapt-getinstall--yesnmaplynxunzip&& sudoapt-getinstall--yes festival festival-dev && sudoapt-getinstall--yes ncurses-base ncurses-bin ncurses-term libncurses5 libncursesw5 libncurses5-dev libncursesw5-dev && sudoapt-getinstall--yes zlib1g zlib1g-dev && sudoapt-getinstall--yesbison bison-doc libxml2 libxml2-dev libtiff4 libtiff4-dev && sudoapt-getinstall--yes libasound2 libgsm1 libltdl3 libpq5 libspeex1 libsqlite0 libtonezone1 libaudiofile0 libaudiofile-dev mpg123 libmad0 libmad0-dev libsox-fmt-*&& sudoapt-getinstall--yes libgnokii3 libgnokii3-dev gnokii gnokii-smsd && sudoapt-getinstall--yesflex&& sudoapt-getinstall--yes openvpn unzip&& sudoapt-getinstall--yes subversion curl doxygen && sudoapt-getinstall--yes libnet-telnet-perl mime-construct libipc-signal-perl libmime-types-perl libproc-waitstat-perl && sudoapt-getinstall--yes apache2 && sudoapt-getinstall--yes php5 php5-cli php5-mysql php-pear libapache2-mod-php5 php5-curl php5-gd php-db && sudoapt-getinstall--yes mysql-client-5.0 mysql-server-5.0 libmysqlclient15-dev #Algunos paquetes de php-pear requeridos cd/usr/src/freepbx-*/ sudo pear install db sudo pear install mdb2 #Crear el usuario Asterisk sudo groupadd asterisk sudo useradd -c"Asterisk PBX"-d/var/lib/asterisk -g asterisk asterisk sudomkdir-p/var/run/asterisk sudochown asterisk:asterisk /var/run/asterisk #Asignar al usuario y grupo asterisk al usuario y grupo de Apache sudo editor /etc/apache2/envvars
user asterisk
group asterisk #Algunos parámetros requeridos en el php.ini sudo editor /etc/php5/apache2/php.ini
default_charset = "utf8"
magic_quotes_gpc = off
upload_max_filesize = 32M
max_execution_time = 600
max_input_time = 600
memory_limit = 128M #Despues de compilar Asterisk, Zaptel o DAHDI no olvidar compilar Asterisk-Addons con soporte de UNIQUEID cd/usr/src/asterisk/asterisk-addons-1.4.* sudo editor cdr/cdr_addon_mysql.c #agregar al principio la siguiente línea tal como está #define MYSQL_LOGUNIQUEID sudo editor cdr/Makefile #agregar al final la siguiente línea tal como está
CFLAGS+=-DMYSQL_LOGUNIQUEID sudo ./configure && sudomake&&sudomakeinstall&& sudomake samples #Editar los parámetros de mysql para que el CDR de Asterisk apunte a la base de datos del tarificador, ver más abajo la parte de configuración de la base de datos del tarificador sudo editor /etc/asterisk/cdr_mysql.conf hostname = localhost dbname=tarificador
password = tarificador
user = tarificador #Si están usando FreePBX editar los parámetros de amportal para que CDR Stats muestre el CDR del Tarificador sudo editor /etc/amportal.conf #Agregar o Editar las siguientes líneas si ya existen
#Aplicar los cambios en freepbx, hacer esto después de instalar la base del tarificador (mas abajo).
#reiniciar asterisk sudo amportal restart
#OBTENCION DEL PROYECTO #Aun no se sube el proyecto a SourceForge, enviame un correo a fileinleon ARROBA gmail DOT com para reenviarte el proyecto completo mkdir ~/asterisk cd ~/asterisk wget http://AUN_SIN_SERVIDOR/tarificador-1.1.tar
cd/var/www sudotar-xvf ~/asterisk/tarificador-1.1.tar cd tarificador
#Creamos la base de datos del tarificador, usuario y password
mysql -u root -p
create database tarificador;
grant all privileges on tarificador.* to tarificador@localhost identified by "tarificador";
flush privileges;
#pasamos el esquema de la BD al servidor de base de datos del tarificador
mysql -u tarificador -p tarificador < tarificador-1.1.sql #creamos el directorio donde colocaremos el archivo de los tickets generados para impresion sudomkdir/tickets sudochmod-R 0755 /tickets #Asignar el usuario del servidor Apache sudochown-R asterisk:asterisk /tickets #Editamos la configuración del sistema sudo editor asterbilling.conf.php #cambiar información de base de datos
dbtype = mysql
dbhost = localhost
dbname = tarificador
dbport = 3306
username = tarificador
password = tarificador #Si estamos usando FreePBX podemos modificar el reporteador para mostrar el canal de salida de la llamada, costo de la llamada y folio de facturación #buscar el archivo admin/cdr/call-log.php, en este caso usaré la ruta de mi servidor sudo editor /var/www/cloudvoox/admin/cdr/call-log.php #En la Linea 85 después de #/* --AMP Begin-- */ #if (!@include($amp_conf['ASTETCDIR'].'/call-log-table.php')) { # Quitar desde aquí todo hasta FG_COL_QUERY y poner lo siguente $FG_TABLE_COL[]=array ("Calldate", "calldate", "18%", "center", "SORT", "19"); $FG_TABLE_COL[]=array ("Channel", "channel", "13%", "center", "", "30", "", "", "", "", "", "display_acronym"); $FG_TABLE_COL[]=array ("Source", "src", "14%", "center", "", "30"); //$FG_TABLE_COL[]=array ("Clid", "clid", "26%", "center", "", "80",,,,,'','filter_html'); $FG_TABLE_COL[]=array ("Dst", "dst", "14%", "center", "SORT", "30"); $FG_TABLE_COL[]=array ("Troncal", "dstchannel", "13%", "center", "", "30", "", "", "", "", "", "display_acronym"); $FG_TABLE_COL[]=array ("Disposition", "disposition", "9%", "center", "", "30"); if((!isset($resulttype)) || ($resulttype=="min"))$minute_function= "display_minute"; $FG_TABLE_COL[]=array ("Duration", "duration", "6%", "center", "SORT", "30", "", "", "", "", "", "$minute_function"); $FG_TABLE_COL[]=array ("Precio", "price", "6%", "center", "SORT", "30", "", "", "", "", "", ""); $FG_TABLE_COL[]=array ("Folio", "folio", "6%", "center", "SORT", "30", "", "", "", "", "", ""); $FG_TABLE_DEFAULT_ORDER = "calldate"; $FG_TABLE_DEFAULT_SENS = "DESC"; // This Variable store the argument for the SQL query //$FG_COL_QUERY='calldate, channel, src, clid, lastapp, lastdata, dst, dst, serverid, disposition, duration'; $FG_COL_QUERY='calldate, channel, src, dst, dstchannel, disposition, duration, price, folio '; #listo ya tenemos el tarificador instalado ahora solo entrar a la aplicación web del tarificador
http://IP_SERVIDOR_ASTERISK/tarificador
Modo Administrador
Login : admin
Password: admin
Configurar cabinas a tarificar, costo de destinos y login-passwords de acceso modo admin y operador.
Modo Operador
Login: ventas
Password: ventas
Presionando el botón refrescar muestra las llamadas que se han hecho de la cabina seleccionada y que aun no ha sido tarificada
Pulsando el botón recibo imprime el ticket y marca las llamadas realizadas de la cabina como cobradas
Pulsando el botón recibo imprime el ticket y marca las llamadas realizadas de la cabina como facturadas asignándole un folio
Hace un par de meses instalé un conmutador de Voz sobre IP a un cliente el cuál realiza en promedio cerca de 150 llamadas diarias, por lo que me solicitó que en el conmutador se grabaran las llamadas que recibiera e hiciera, esto quedo funcionando bien, el detalle que en ese tiempo se me pasó agregar un parámetro para que después de finalizada la grabación copiara el archivo de la llamada grabada a una carpeta con la fecha actual de la grabación, esto para ir organizando las llamadas, pero como esto no se hizo 40 días después obviamente tenía miles de llamadas grabadas por lo que revisar una por una fue complicado.
Por lo que se me ocurrió rápidamente hacer un script en PHP que listara la información por fecha y en base a la fecha del archivo crear una carpeta si es que este directorio no existiera y mover ahí el archivo grabado.
En el código solo modificar el directorio de búsqueda y el directorio dónde se crearán las carpetas y moverán los archivos, obviamente este script puede funcionar para cualquier tipo de archivo pero aquí lo hice para que busque archivos wav, cree un directorio de la fecha del archivo si esta no existe y mover ahí el archivo, y asi consecutivamente con todos los archivos.
Espero este script pueda serle de utilidad a alguien más y cualquier comentario hacérmelo llegar..
Comentarios Recientes