FLISOL 2009 LIMA PERU

Abril 21, 2009

Este sábado 25 se festeja el Festival Latinoamericano de Instalación de Software Libre  ¨FLISOL¨ , y en Lima-Perú , se desarrollara en la sede de la Universidad nacional de Ingeniera , para lo cual, voy a tener el gusto de participar, con una charla sobre Asterisk en el mercado Peruano, estoy seguro que todo saldrá muy bien, como lo fue año pasado.

Mas información en :

http://flisol.info/FLISOL2009/Peru/Lima
http://flisol.uniestudia.org/

Afiche del Evento

afiche_1-726x1024

Actualización:
Gracias al amigo  Crhistian “BiNaRiO” Peralta  quien publico las fotos del evento, las pueden ver en su Galería de fotos


Howto : configurar Asterisk con Gizmo5

Febrero 26, 2009

Gizmo5 es un proveedor voip muy interesante , funciona como un tradicional voip provider, además de proveer DIDs , hace poco implemento la funcionalidad de poder registrado en un Asterisk vía Trunk SIP, por tema de facilidad de administración de Asterisk , para este caso particular, tuve que usar Freepbx , esta configuración funciona para usar gizmo en llamadas salientes , como para DID entrante:

1.-  Crear Trunk, Ir a  Configuracion  pbx / Trunks / Add Sip Trunk

Trunk Name: Gizmo5
PEER Details:

disallow=all
allow=ulaw&alaw&ilbc
canreinvite=no
context=from-trunk
dtmfmode=rfc2833
fromdomain=proxy01.sipphone.com
fromuser=tuusuario
host=proxy01.sipphone.com
insecure=very
secret=tupassword
type=peer
username=tuusuario

Register String:
tuusuario:tupassword@proxy01.sipphone.com

2.- Crear ruta de salida/entrada

- Ir a  Configuración  pbx / Outbound Routes / Add Route
Route Name : 08_outside
Dial Patterns : 8|.
Trunk Secuence : Sip/Gizmo5

- Ir a  Configuración  pbx / inbound Routes / Add Route
No se llena nada solo en Set Destination le decimos a que extencion/ivr , va ir la llamada entrante

gizmo

Rerefencia : http://www.freepbx.org/support/documentation/howtos/howto-setting-up-voip-provider-trunks/gizmo5


Conferencias via IRC de ASTERISK-PERU

Enero 19, 2009

El viernes pasado participe como ponente en una conferencia via Irc , organizada por la comuna de Asterisk-Peru , mi tema fue hablar un poco sobre las novedades de Astrisk 1.6 , la cual creo que salio muy simpatica , asi mismo estuvo Edgar Landivar de Elastix , hablando sobre el famoso modulo de callcenter , y finalmente Mark Warren , hablando sobre los equipos  redfone , Appliance de alta disponibilidad para Asterisk , todo lo que se converso en la conferencia lo pueden encontrar en estos enlaces.

Charla irc Asterisk 1.6 : http://www.asterisk-peru.com/node/1450

Carla irc Modulo de callcenter Elastix :  http://www.asterisk-peru.com/node/1449

Carla irc Redphone : http://www.asterisk-peru.com/node/1451


Plug-in de integración de Thunderbird y SugarCrm

Diciembre 30, 2008

Siguiendo con el tema de integraciones con sugarcrm, encontré Asertiva Thunderbird Extension for Sugar , un interesante plugin , agregado , modulo , como lo quieran llamar :)   para trabajar las funcionalidades de sugarcrm desde thunderbird , la estalación es muy sencilla basta con descargar el archivo sugarbird-0.9.9.2.xpi (la version actual en este momento) y ir a  thunderbird , e ir al menú :  Herramientas/agregados  y pulsar en el botón ¨instalar¨  buscamos el archivo descargado y lo instalamos.  luego de eso hay que configurar los parámetros del servidor  como sigue :

sugar-thunderbird1

sugar-thunderbird2

Luego podremos trabajar con los objetos de sugar de manera transparente y crear cuentas,contactos , oprtunidades..etc.

sugar-thunderbird3

Esto es muy comodo en realidad, cuando queremos cargar datos rapidamente y no ingresar a toda la aplicacion web, que se torna un poco pesada de acuarde cuanta data tengamos.


Howto Integración Asterisk y SugarCrm

Diciembre 29, 2008

Hace un tiempo que vengo usando sugar, si bien es cierto no es el mejor crm, ya que considero que vtiger tiene mas características, pero por su tiempo de desarrollo, tiene módulos bastante interesantes donde saca un poco de ventaja , en este caso VOICERD , nos permite integrar un servidor asterisk a sugar, si bien es cierto la versión open , solo nos servirá ,para conseguir un click-to-dial , y generar llamadas desde nuestras cuentas o contactos , ya es un gran avance, obviamente la versión comercial tiene todo el soporte para llamadas entrantes con generación de popups. Aunque según leo, en la versión 5.1 de vtiger, trae un modulo de integración con asterisk con muchas características que no tiene esta versión open de VOICERD en sugar , habrá que esperar su lanzamiento :) , bueno igual vamos a ver como se instala VOICERD en sugarcrm:

1.- DESCARGA

Bajamos la version de voicerd opensouce para nuestra version de sugarcrm desde esta página

2.- INSTALACIÓN DE VOICERD

- Ingresar a sugarcrm como usuario admin  e ingresar al modulo de administración

sugar1

- Ingresar al asistente de actualizaciones (Upgrade Wizard)

sugar2

- Iniciar el chekeo del sistema

sugar3

- Si nuestro sistema esta bien , pulsaremos el boton siguiente

sugar4

- Selecionamos el archivo previamente descargado y pulsamos subir actualización

sugar5

- Esperamos unos minutos y la actualización quedara instalada de la siguiente forma

sugar6

- Se completara la instalación con las comprobaciones

sugar7

sugar8

sugar9

3.- CONFIGURACIÓN DE ASTERISK

- Una vez instalado toca configurar el manager de asterisk para que sugar se pueda comunicar con él

vi /etc/asterisk/manager.conf

[sugaruser]
secret = secretpass
deny=0.0.0.0/0.0.0.0
permit=192.168.1.0/255.255.255.0
permit=127.0.0.1/255.255.255.255
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user

- Luego actualizamos los cambios

# asterisk -rvvvvvvvvvvvvvvvv

asterisk*CLI>reload

4.- CONFIGURACIÓN DE SUGAR

- Ingresamos a :  admin/system setings

sugar10

- Y luego ubicamos la sección de configuración del servidor Asterisk

sugar-asterisk

bueno los parámetros son los usuales , el servidor , el usuario que pusimos en el manager y el prefijo como el conexto que vamos a usar para sacar las llamadas .

- Ahora sigue decirle a sugar que anexo , va usar un determinado usuario , para esto ingresamos con algún usuario que tengamos creado y vamos a la seccion ¨MY ACCOUNT¨ , pulsamos editar y  nos vamos a: USER SETTINGS

sugar-asterisk2

En donde ingresaremos el anexo del usuario por ejemplo :  SIP/101  , IAX2/102   y luego guardamos los cambios

- Finalmente si vamos a cuentas el campo teléfono ahora tiene habilitado hypervinculo que al pulsarlo asterisk marcara al destino seleccionado.

sugar-asterisk3

Que pasen Felices Fiestas !!!!!!!!!!!


El FBI descubre ahora una vulnerabilidad de Asterisk corregida en Marzo

Diciembre 10, 2008

La verdad no soy mucho de repetir noticias de otros blog , pero esta de verdad que me pareció muy peculiar y por demás interesante, la recojo del blog de sinologic el cual suelo leer mucho :

[Se ha armado bastante revuelo en la blogosfera debido a que el IC3 (Internet Crime Complain Center) algo así como la “División de Delitos Informáticos” española, pero perteneciente al FBI acaba de hacer público (ahora) una vulnerabilidad de Asterisk que consiste en permitir a un usuario malvado hacerse con cierto control de Asterisk.

La noticia es importante por que demuestra que al FBI le interesa este software y se hace cargo de que son muchas las empresas que lo utilizan. Las voces en la red sacan a relucir la “inseguridad” de esta hasta el punto que el IC3 ha enviado una nota de prensa preparando a los usuarios sobre esta “gravísima vulnerabilidad“.

Lo que parece que no mucha gente se ha percatado al anunciar a bombo y platillo este anuncio, es que dicha vulnerabilidad fue corregida hace 9 meses (en Marzo de este año).

Por lo tanto, uno puede llegar a pensar que si el IC3 cae ahora en las vulnerabilidades de hace 9 meses… deberían actualizar su Asterisk pronto. ) ]

Nota de prensa del IC3: http://www.ic3.gov/media/2008/081205-2.aspx
Respuesta de Digium: http://blogs.digium.com/2008/12/06/sip-security-and-asterisk/

Fuente : http://www.sinologic.net/2008-12/el-fbi-descubre-ahora-una-vulnerabilidad-de-asterisk-corregida-en-marzo/


Charla sobre Asterisk – Ciclo de conferencias de la UPCI

Noviembre 30, 2008

Hace unas semanas , un buen amigo de la Universidad Peruana de Ciencias e Informática , me invito a participar con una charla sobre Asterisk , para un ciclo de conferencias que estaba realizando su facultad, bueno la charla salio bastante simpática y amena ,hubo muchas preguntas e interrogantes , lo cual hizo que se despejarán muchas dudas referentes a este interesante software, la presentación que realicé esta aquí , si la desean descargar.

Juan-Oliva-2da_conferencia-Upci

2da_conferencia-048


Howto Resolver problema de VMWARE y las tarjetas wifi sobre UBUNTU

Noviembre 21, 2008

Bueno , seguro a mas de uno le ha pasado que después de trabajar las maquinas virtuales con vmware perfectamente, usando la interface eth0 en modo bridge, se ha llevado el mal rato de no poder usarla de la misma forma sus maquinas virtuales pero usando la interface wifi , bueno realmente hace tiempo que tenia este problema y no le metía el suficiente tiempo para hallar la solución , bueno aprobechando el feriado por la APEC , decidi rebuscar información, y entontre finalmente con la solución :

Entorno

Ubuntu 8.04
kernel 2.6.24
wifi  BCM4311
Vmware 1.0.6

1) Descargar y aplicar el parche

#cd /tmp
#tar xvf /usr/lib/vmware/modules/source/vmnet.tar
#wget http://www.hauke-m.de/fileadmin/vmware/vmware-wireless.patch
#patch -p0 < vmware-wireless.patch
#tar cvf vmnet.tar vmnet-only
#mv /usr/lib/vmware/modules/source/vmnet.tar /usr/lib/vmware/modules/source/vmnet.orig.tar
#mv vmnet.tar /usr/lib/vmware/modules/source/vmnet.tar

2) Reconfigurar los parametros de red de vmware

#vmware-config.pl

(Responder ¨si¨  a todas las preguntas)

3)Reiniciar la maquina

#reboot

4)Cambiar la interface de la maquina virtual

- Ir a la maquina virtual  los ¨settings¨
- ir a ethernet1  , y es escoger ¨CUSTOM¨  y elegir  /dev/vmnet2

Esto es en mi caso , para verificar en que dispositivo virtual hace bridge con las interfaces verificar con

#ps -eaf|grep vmnet-bridge

/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge-0.pid /dev/vmnet0 eth0
/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge-2.pid /dev/vmnet2 wlan0

saldra algo como esto

Referencia : http://communities.vmware.com/message/1038390;jsessionid=7F8D97F7F5EF9B929F986CF2F129077F

Espero que les sirva
Saludos
Juan Oliva


HOW TO : Instalación servidor ORACLE XE y soporte en PHP5 sobre DEBIAN ETCH-R4

Noviembre 1, 2008

Hola, voy a describir la manera configuráramos un entorno de desarrollo sobre debian, para programar con Oracle y php, para esto instalamos Oracle XE sobre debian etch-r4  , y la configuración del modulo oci8 , necesario en PHP5 , necesario para consultar bases de oracle en general , pero esto sobre un debian etch-R4 , bueno al grano.

ATENCIÓN : REQUISITO INDESPENSABLE , REPITO ¨INDISPENSABLE¨ , TENER UN SWAP DE POR LO MENOS 1.5GB , si no mejor no sigas adelante.

A) INSTALACIÓN Y CONFIGURACIÓN DE ORACLE XE

1.- Instalación dependencias
#apt-get install bc libaio1

2.- Instalación del paquete , descargarlo desde aquí
#cd /usr/src
#dpkg -i  oracle-xe-universal_10.2.0.1-1.0_i386.deb

3.-  configuración de parámetros
/etc/init.d/oracle-xe configure

Specify the HTTP port that will be used for Oracle Application Express [8080]: 8080
Specify a port that will be used for the database listener [1521]:1521
Ingresar el password para las cuentas de administración (SYS & SYSTEM) : 123456
Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]: y

4.- Configuración de variables de entorno

#vi /root/.bashrc

##Variables de servidor oracle xe
ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_HOME
export ORACLE_SID=XE
export PATH

5.- Pruebas de variables

#echo $ORACLE_HOME
#echo $ORACLE_SID

6.- Verificar variables de inicio de oracle

#cat $ORACLE_HOME/network/admin/tnsnames.ora
#mkdir /etc/oracle
#cp $ORACLE_HOME/network/admin/tnsnames.ora /etc/oracle

7.- verificar inicio correcto

# cd $ORACLE_HOME/bin
# tnsping XE

si sale :

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dapper)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
TNS-12545: Connect failed because target host or object does not exist

reiniciar servicio : /etc/init.d/oracle restart

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = mail)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (10 msec)

entonces todo esta correcto.

8.-  conexión al servidor vía sqlplus como sys

#sqlplus sys as sysdba
Enter password: 123456

Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 – Production

SQL>

9.- Desbloquear usuario HR , para poder conectarnos

SQL> alter user HR account unlock;
User altered.

SQL> alter user HR identified by 654321;
User altered.

SQL> exit;

10.- Conectarse por sqlplus como usuario HR

#sqlplus HR/654321@XE

SQL*Plus: Release 11.1.0.6.0 – Production on Sat Nov 1 09:12:54 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 – Production

SQL>
11.- Estamos conectados ahora Probamos  realizar una consulta a una tabla ya creada en la instalación.

SQL> select * from JOBS;

JOB_ID       JOB_TITLE                   MIN_SALARY MAX_SALARY
———- ———————————– ———- ———-
AD_PRES    President                    20000      40000
AD_VP       Administration Vice President        15000      30000
AD_ASST    Administration Assistant             3000    6000
FI_MGR       Finance Manager                 8200      16000
FI_ACCOUNT Accountant                     4200    9000
AC_MGR       Accounting Manager                 8200      16000
AC_ACCOUNT Public Accountant                 4200    9000
SA_MAN       Sales Manager                10000      20000
SA_REP       Sales Representative              6000      12000

Hasta aquí tenemos correcto el servidor ahora configuramos apache php para hacer consultas

ANEXOS

1.-Verificar si el servicio esta activo , Aveces no se porque el servicio no se inicia durante el startup , para eso podemos verificar si el servicio esta activo.

# cd $ORACLE_HOME/bin
# tnsping XE

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = mail)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (10 msec)

B-1) INSTALACIÓN DEL SOPORTE PARA ORACLE EN PHP5

1.- Instalar dependencias
#apt-get install apache2.2-common libapache2-mod-php5 php5 php5-cli rpm libaio1

2.-Bajar los paquetes :

- oracle-instantclient-basic-11.1.0.1-1.i386.rpm
- oracle-instantclient-devel-11.1.0.1-1.i386.rpm
- oracle-instantclient-sqlplus-11.1.0.1-1.i386.rpm

de la siguiente direccion : http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html
3.-Instalar los paquetes
#rpm -ivh /root/oracle-instantclient-*
4.- Crear directorio para archivos de configuración
#mkdir /etc/oracle

5.- Copiar/verificar el archivo tnsnames.ora del servidor local/remoto dónde nos vamos a conectar y copiarlo a /etc/oracle/

###########################################
# tnsnames.ora Network Configuration File:

XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mail)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

################################################################

Donde ¨mail¨ es el nombre del servidor.

6.- Agregar variables de entorno
#vim /root/.bashrc

#Variables de cliente oracle xe
export TNS_ADMIN=/etc/oracle
export SQLPATH=/usr/lib/oracle/11.1.0.1/client/bin
export LD_LIBRARY_PATH=/usr/lib/oracle/11.1.0.1/client/lib/;$LD_LIBRARY_PATH
export PATH=$PATH:$SQLPATH

7.- Reiniciar la sesión de root para que los cambios en las variables de entorno tengan efecto.

8.- Comprobar conectividad con servidor  local/remoto

#sqlplus usuario@servidor

Dónde usuario es el nombre de usuario o esquema y servidor es uno de los definidos en el tnsnames.ora
Pedirá la contraseña y si todo va bien nos devolverá el prompt del servidor Oracle.

B-2) Generar e Instalar módulo OCI en PHP

1.- Instalar dependencias
#apt-get install build-essential php5-dev

2.- Si no está creado, creamos el directorio de fuentes
#mkdir -p /usr/local/src

3.- Descargamos las fuentes PECL del futuro módulo OCI:
#wget http://pecl.php.net/get/oci8-1.2.4.tgz

4.- Descomprimimos
#tar xzf oci8-1.2.4.tgz

5.- Entramos al directorio creado
#cd /usr/local/src/oci8-1.2.4

6.- Preparamos el módulo para que sea generado para PHP
#phpize

7.- Configuramos el módulo para la generación
#./configure –with-oci8=instantclient,/usr/lib/oracle/11.1.0.1/client/lib/

La ruta es dónde se encuentran los *.so que hemos instalado con el InstantClient

8.- Construcción e instalación
#make
#make install

9.- Editamos la configuración de PHP.

#vim /etc/php5/apache2/php.ini

Añadimos la línea:
extension=oci8.so

y repetimos lo mismo para el archivo /etc/php5/cli/php.ini

10.- Reiniciamos Apache
#/etc/init.d/apache2 restart

11.- crear phpinfo.php para verificar el modulo oci8
#vi /var/www/apache2-default/phpinfo.php

<?php

// Muestra toda la información, por omisión INFO_ALL
phpinfo();

// Mostrar sólo la información de módulos.
// phpinfo(8) produce el mismo resultado.
phpinfo(INFO_MODULES);

?>

12.- Generar consulta basica

#vi /var/www/apache2-default/consulta.php

<?php

$connection = ocilogon(“HR”,”654321″,”//192.168.1.180/XE”);
$query = “select * from JOBS”;
$statement = oci_parse ($connection, $query);
oci_execute ($statement);
$statement = oci_parse ($connection, $query);
oci_execute ($statement);
echo “JOD_ID|JOB_TITLE|MIN_SALARY|MAX_SALARY”;
while ($row = oci_fetch_array ($statement, OCI_BOTH)) {
echo “$row[0]|$row[1]|$row[2]|$row[3]“;
}
oci_close($connection);

?>

- Donde  ¨192.168.1.180¨ seria la ip del servidor o maquina de la implementacion
- Verficiamos la consulta  entrando a :  http://ipdelamaquina/apache2-default/consulta.php   , si nos genera la consulta entonces ya tenemos todo completo y podemos empezar a desarrollar nuestras aplicaciones

Espero que les sirva la info.

Referencias
http://www.esdebian.org/configuracion/24219/how-to-apache22-php-oci-cliente-oracle
http://afosorio.blogspot.com/2006/05/php-oracle-sobre-iis.html
http://marqueta.org/linux/oracle/
http://www.esdebian.org/instalacion/23992/como-instalar-oracle-10g-express-editon-debian-etchlenny
http://ubuntulife.wordpress.com/2008/05/11/instalar-oracle-xe-en-ubuntu-804-hardy-heron/


Howto consulta de stocks usando ASTERISK, PHPAGI y MYSQL

Octubre 26, 2008

Hola, hace tiempo que no posteo, ya que he entrado en un training complicado, y no dispongo de mucho tiempo, pero , siempre es posible hacerse de un espacio, bueno en este pequeno howto, voy a tratar de explicar como implementar un sistema de consulta de stocks, con datos almacenados una base de datos en mysql , que será invocado vía al dialplan de asterisk y consultado usando phpagi.

Cual es la idea , podemos automatizar un sistema de consulta de productos vía nuestra central en asterisk, y así liberar un poco a nuestro departamento de ventas, además de otras aplicaciones que podamos realizar en teniendo como base esta idea.

1.- Creación de la base de datos en Mysql

#mysql -p
mysql>create database stock;
mysql>CREATE TABLE `productos` (
mysql>`producto` int(4) NOT NULL default ‘0′,
mysql>`cantidad` int(4) NOT NULL default ‘0′
mysql> );

mysql>INSERT INTO productos (producto,cantidad) VALUES (4001,5);
mysql>INSERT INTO productos (producto,cantidad) VALUES (4002,3);
mysql>SELECT * FROM productos;

2.- Implementando el dialplan en extension.conf

[local] ;contexto de todos mis anexos
exten=> _*5,1,Goto(consulta,s,1)   ;cuando marquemos *5 saltara al contexto consulta

[consulta] ;contexto para la consulta de datos
exten=> _s,1,Answer
exten=> _s,2,Background(solicita-codigo-producto) ; reproduzco un audio que pregunte  por el codigo
exten=> _s,3,Waitexten(4) ; espero 4 segundos
exten=> _XXXX,1,Set(COD=${EXTEN}) ; capturo lo digitado y lo guardo en la variable COD
exten=> _XXXX,2,AGI(consulta.php|${COD}) ; lanzo el agi y le envio la variable COD
exten=> _XXXX,3,HangUp

3. – Implementado el phpagi  , lo que hara es recibir la variable COD , se conectara con la base de datos ¨stock¨  , para esto tenemos que tener los privilegios de acceso , y luego con la consulta echa , reproducirá la cantidad encontrada en voz mediante la función SayDigits , en   ¨/var/lib/asterisk/agi-bin/¨     crear consulta.php con el siguiente código :

consulta.php

#!/usr/bin/php -q
<?php
ob_implicit_flush(true);
set_time_limit(6);
error_reporting(0);
$in = fopen(“php://stdin”,”r”);
$stdlog = fopen(“/var/log/asterisk/agi.log”, “w”);

// Habilita modo debugging (mas verbose)
$debug = true;

// Hacer las definiciones de funciones antes de empezar el bucle principal
function read() {
global $in, $debug, $stdlog;
$input = str_replace(“\n”, “”, fgets($in, 4096));
if ($debug) fputs($stdlog, “read: $input\n”);
return $input;
}

function write($line) {
global $debug, $stdlog;
if ($debug) fputs($stdlog, “write: $line\n”);
echo $line.”\n”;
}

// Colocamos headers AGI dentro de un array
while ($env=read()) {
$s = split(“: “,$env);
$agi[str_replace("agi_","",$s[0])] = trim($s[1]);
if (($env == “”) || ($env == “\n”)) {
break;
}
}

// Función que conecta al banco de datos
function connect_db() {
$db_connection = mysql_connect(‘localhost’,'usuario’,'contrasena’) or die
(mysql_error());
$db_select = mysql_select_db(’stock’) or die (mysql_error());
}

// Programa Principal
connect_db();
// Almacena valor de la variable COD en
write(“GET VARIABLE COD”);

//lee variable in
$c = fgets($in, 4096);
// reemplaza retorno de carro por espacios
$c = str_replace(“\n”,”",$c);
// quita 14 caracteres a la izquiera y 1 a la derecha
$c = substr($c,14);
$c = substr($c,0,-1);
$query = “SELECT cantidad FROM productos WHERE producto=’$c’”;
$query_result = @mysql_query($query);
$result = mysql_fetch_row($query_result);
$valor = “$result[0]“;
write(“EXEC SayDigits \” $valor \”\n”);
read();
fclose($in);
fclose($stdlog);
exit;
?>

Espero que les sirva
Saludos
Juan Oliva