Discussion:
Refresco permanente de un comando en PHP
(demasiado antiguo para responder)
Josep Ma. Serra
2005-08-31 23:44:35 UTC
Permalink
Hola compañeros, ante todo mil gracias again, espero poder responder
tantas cosas como vosotros (en especial a Oscar que es el amo!!) pero de
momento pido opinion otra vez...

Esta vez, hay que ejecutar un programa .bat el cual tarda unos 10
minutos en ejecutarse y permanentemente (cada segundo) va sacando por
pantalla informacion de lo que esta haciendo.

Mi duda es como puedo hacer que se ejecute dicho proceso via web
programada con php de forma dinamica, es decir que se vaya actualizando
(cada ciertos segundos ) pero sin colgar el proceso que dura 10 minutos.

He pensado en que el proceso vaya escribiendo en un archivo de texto
(redirigiendo la salida en plan '>') desde php cada vez q actualiza la
pagina lea lo que hay en el archivo i lo devuelva al cliente web,
entonces tengo k crear un proceso con proc_open() para que no se cuelgue
cuando refresque verdad?

os parece bien la idea? o mejor aprendo un poco de java y hago algun
applet o historia parecida?

Billones de gracias!!
Oscar Garcia
2005-09-01 04:10:24 UTC
Permalink
El Thu, 01 Sep 2005 01:44:35 +0200, "Josep Ma. Serra"
Post by Josep Ma. Serra
Mi duda es como puedo hacer que se ejecute dicho proceso via web
programada con php de forma dinamica, es decir que se vaya actualizando
(cada ciertos segundos ) pero sin colgar el proceso que dura 10 minutos.
No entiendo bien lo que quieres hacer.

¿Quieres que el trabajo que hacía un .bat lo haga el PHP? ¿O quieres
que la salida del .bat se muestre por pantalla en una página web?
Post by Josep Ma. Serra
He pensado en que el proceso vaya escribiendo en un archivo de texto
(redirigiendo la salida en plan '>') desde php cada vez q actualiza la
pagina lea lo que hay en el archivo i lo devuelva al cliente web,
entonces tengo k crear un proceso con proc_open() para que no se cuelgue
cuando refresque verdad?
Creo que lo mejor sería un passthru que vuelque directamente a
pantalla la salida del .bat y que metas un META Refresh en el head que
te recargue la web cada x segundos.
Post by Josep Ma. Serra
os parece bien la idea? o mejor aprendo un poco de java y hago algun
applet o historia parecida?
No llego a entender lo que quieres hacer y por eso no te puedo
recomendar nada.
Post by Josep Ma. Serra
Billones de gracias!!
De nada.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Josep Ma. Serra
2005-09-01 09:00:00 UTC
Permalink
Post by Oscar Garcia
No entiendo bien lo que quieres hacer.
¿Quieres que el trabajo que hacía un .bat lo haga el PHP? ¿O quieres
que la salida del .bat se muestre por pantalla en una página web?
Quiero que la salida del .bat se muestre por pantalla en una pagina web

Pero la ejecucion de ese bat tarda 10 minutos!! i el usuario no se puede
esperar ese tiempo a ver la salida, por lo que hay que ir mostrando la
salida (refrescando) cada 2 o 3 segundos.
Post by Oscar Garcia
Creo que lo mejor sería un passthru que vuelque directamente a
pantalla la salida del .bat y que metas un META Refresh en el head que
te recargue la web cada x segundos.
pero al hacer refresh no mato la ejecucion del .bat??
Alvaro G Vicario
2005-09-01 09:21:43 UTC
Permalink
Post by Josep Ma. Serra
Quiero que la salida del .bat se muestre por pantalla en una pagina web
Pero la ejecucion de ese bat tarda 10 minutos!! i el usuario no se puede
esperar ese tiempo a ver la salida, por lo que hay que ir mostrando la
salida (refrescando) cada 2 o 3 segundos.
¿El comando debe lanzarse únicamente cuando el usuario ve la página? ¿No
hay problema en que se produzcan ejecuciones concurrentes?


Sin saber exactamente tus necesidades, yo me limitaría a ampliar el tiempo
máximo de ejecución de ese script:

ini_set('max_execution_time', 1200); // 20 minutos
--
-- Álvaro G. Vicario - Burgos, Spain
-- http://bits.demogracia.com - Mi sitio sobre programación web
-- Don't e-mail me your questions, post them to the group
--
Josep Ma. Serra
2005-09-01 10:11:04 UTC
Permalink
Post by Alvaro G Vicario
¿El comando debe lanzarse únicamente cuando el usuario ve la página? ¿No
hay problema en que se produzcan ejecuciones concurrentes?
No se pueden lanzar ejecuciones concurrentes, es una reconstruccion de
los indices de una BD , i si se hace 2 a la vez dios sabe que podria
ocurrir ;)
Post by Alvaro G Vicario
yo me limitaría a ampliar el tiempo
ini_set('max_execution_time', 1200); // 20 minutos
pero el usuario no se puede esperar 20 minutos a empezar a ver que esta
sucediendo, se creeria que se ha colgado
Alvaro G Vicario
2005-09-01 10:45:46 UTC
Permalink
Post by Josep Ma. Serra
No se pueden lanzar ejecuciones concurrentes, es una reconstruccion de
los indices de una BD , i si se hace 2 a la vez dios sabe que podria
ocurrir ;)
A menos que sea un proceso problemático y sea imprescindible que haya un
tipo delante mirando por si falla algo, yo programaría el *.bat para
ejecutarse por su cuenta cada X tiempo y haría un script en PHP que
simplemente descargara el log. O hasta generaría el log en una carpeta de
la web y lo enlazaría directamente.

Si sólo se necesita reconstruir los índices cuando lo quiera el usuario me
parece que tendrás que recurrir a la creatividad, porque en Windows no se
puede ejecutar un script en segundo plano sin instalar aplicaciones de
terceros. Porque lo suyo es tener dos programas: el que reconstruye y el
que lee el log. Tu sistema es muy delicado: las conexiones se cortan, las
ventanas del navegador de cierran...
Post by Josep Ma. Serra
Post by Alvaro G Vicario
ini_set('max_execution_time', 1200); // 20 minutos
pero el usuario no se puede esperar 20 minutos a empezar a ver que esta
sucediendo, se creeria que se ha colgado
Búscalo en la documentación, esto no hace dormir el script 20 minutos, lo
que hace es permitirle ejecutarse hasta un máximo de 20 minutos (por
defecto es interrumpido a los 30 segundos).
--
-- Álvaro G. Vicario - Burgos, Spain
-- http://bits.demogracia.com - Mi sitio sobre programación web
-- Don't e-mail me your questions, post them to the group
--
Josep Ma. Serra
2005-09-01 11:53:17 UTC
Permalink
Post by Alvaro G Vicario
A menos que sea un proceso problemático y sea imprescindible que haya un
tipo delante mirando por si falla algo, yo programaría el *.bat para
ejecutarse por su cuenta cada X tiempo y haría un script en PHP que
simplemente descargara el log. O hasta generaría el log en una carpeta de
la web y lo enlazaría directamente.
El ususrio siempre estara delante viendo la salida, me han pedido que
como es un proceso ultracritico hay que verlo entero por pantalla sin
interrupciones. :(
Post by Alvaro G Vicario
Tu sistema es muy delicado: las conexiones se cortan, las
ventanas del navegador de cierran...
Ya... la verdad es que pueden ocurrir varias cosas, no se cual acabara
siendo la mejor manera de hacerlo ...
Post by Alvaro G Vicario
Post by Alvaro G Vicario
ini_set('max_execution_time', 1200); // 20 minutos
< Búscalo en la documentación, esto no hace dormir el script 20 minutos, lo
Post by Alvaro G Vicario
que hace es permitirle ejecutarse hasta un máximo de 20 minutos (por
defecto es interrumpido a los 30 segundos).
sisi, lo que queria decir es que no quiero esperar a que acabe el
proceso (el .bat) a que el usuario vea la primera linea de texto de la
salida
Oscar Garcia
2005-09-01 12:04:44 UTC
Permalink
El Thu, 01 Sep 2005 13:53:17 +0200, "Josep Ma. Serra"
Post by Josep Ma. Serra
Post by Alvaro G Vicario
Tu sistema es muy delicado: las conexiones se cortan, las
ventanas del navegador de cierran...
Ya... la verdad es que pueden ocurrir varias cosas, no se cual acabara
siendo la mejor manera de hacerlo ...
¿Has pensado en portar a PHP el script .bat?

PHP ofrece muchísima más funcionalidad como lenguaje de script que los
archivos por lotes de Windows.

No lo digo por llamar luego a ese php desde otro php distinto, si no
porque podrás controlar si quieres o no un buffer en la salida
estandar del programa, guardar la salida en una base de datos mejor
que en un archivo, etc...

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Josep Ma. Serra
2005-09-01 12:23:48 UTC
Permalink
Post by Oscar Garcia
¿Has pensado en portar a PHP el script .bat?
bueno la verdad es que el .bat lo unico que hace es ejecutar un programa
en java, el contenido del .bat es:

---------------------------------------------------------
java -cp
e:\scripts\excalibur\bsh-1.3b1.jar;e:\scripts\excalibur\ifxjdbc.jar
bsh.Interpreter e:\scripts\excalibur\ixex.bsh c
e:\scripts\excalibur\config.bsh %*
--------------------------------------------------------

pero el problema es que todo esto funciona i me lo han dado exo, las
fuentes en java la verdad es que son bastante complejas por la cantidad
de historias que han hecho...

el gozo en un pozo :)

lo del codigo del implicit flush que he dixo antes sabes porque no me
funciona?

<?php
ob_implicit_flush(true);
passthru('C:\noparis.exe');
?>
Alvaro G Vicario
2005-09-02 06:49:43 UTC
Permalink
Post by Josep Ma. Serra
lo del codigo del implicit flush que he dixo antes sabes porque no me
funciona?
<?php
ob_implicit_flush(true);
passthru('C:\noparis.exe');
?>
La página de manual indica que ob_implicit_flush(true) fuerza el volcado de
la salida cada vez que hay una llamada de salida. Sospecho que passthru()
se considera *una sola* llamada de salida. En un comentario de la página de
passthru() un lector apunta que es preferible usar popen().
--
-- Álvaro G. Vicario - Burgos, Spain
-- http://bits.demogracia.com - Mi sitio sobre programación web
-- Don't e-mail me your questions, post them to the group
--
Josep Ma. Serra
2005-09-01 12:58:53 UTC
Permalink
Lo del implicit flush que no funciona me parece que es un Bug php!!

lo he visto en:

http://bugs.php.net/bug.php?id=16676
http://bugs.php.net/bug.php?id=23877

pero no acabo de entender cual es la solucion
Josep Ma. Serra
2005-09-01 13:05:58 UTC
Permalink
este codigo consigue ir enviando cada 2 segundos la salida al explorador:

<?php

if (ob_get_level() == 0) ob_start();

for ($i = 0; $i<10; $i++){

echo "<br> Line to show.";
echo str_pad('',4096)."\n";

ob_flush();
flush();
sleep(2);
}

echo "Done.";

ob_end_flush();

?>


PERO si pongo por ahi enmedio el passthru ejecutando el comando externo,
hasta que no acaba el comando no sigue enviando contenido al explorador.


Quiza soy un poco pesado, lo siento, pero realmente es muy importante
que esta parte funcione, mercii
Oscar Garcia
2005-09-01 11:31:12 UTC
Permalink
El Thu, 01 Sep 2005 12:11:04 +0200, "Josep Ma. Serra"
Post by Josep Ma. Serra
Post by Alvaro G Vicario
¿El comando debe lanzarse únicamente cuando el usuario ve la página? ¿No
hay problema en que se produzcan ejecuciones concurrentes?
No se pueden lanzar ejecuciones concurrentes, es una reconstruccion de
los indices de una BD , i si se hace 2 a la vez dios sabe que podria
ocurrir ;)
Usa un sistema de bloqueos basado en archivos (por ejemplo) para que
no se ejecute concurrentemente dos veces el mismo archivo por lotes.
Si aún está ejecutandose simplemente debes mostrar el contenido del
archivo temporal.

Es decir:

* Creamos un proceso que cree el archivo de bloqueo.
* Llama al .bat y lo dejas funcionando en segundo plano (siento no
ayudarte porque desconozco la forma que existe de ejecutar algo en
segundo plano desde un proceso por lotes en Windows).
* La salida del .bat la debes redirigir a un archivo.
* Borras el archivo de bloqueo al terminar la ejecución del script.

También puedes implementarlo con bloqueos de bases de datos (es mucho
más robusto frente a interbloqueos).

La forma de trabajar en PHP sería:

* Si no existe el archivo de bloqueo entonces ejecutamos el script que
lo crea y lanza el .bat en segundo plano.
* Si existe el archivo de bloqueo entonces simplemente vamos mostrando
el contenido de la salida por pantalla (contenido en un archivo).
Post by Josep Ma. Serra
Post by Alvaro G Vicario
yo me limitaría a ampliar el tiempo
ini_set('max_execution_time', 1200); // 20 minutos
pero el usuario no se puede esperar 20 minutos a empezar a ver que esta
sucediendo, se creeria que se ha colgado
Si juegas como te dije con el ob_implicit_flush por cada línea de
texto que saque tu programa (el .bat) se manda dicho texto al
navegador.

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Josep Ma. Serra
2005-09-01 11:56:55 UTC
Permalink
Post by Oscar Garcia
Post by Josep Ma. Serra
Post by Alvaro G Vicario
¿El comando debe lanzarse únicamente cuando el usuario ve la página? ¿No
hay problema en que se produzcan ejecuciones concurrentes?
No se pueden lanzar ejecuciones concurrentes, es una reconstruccion de
los indices de una BD , i si se hace 2 a la vez dios sabe que podria
ocurrir ;)
Usa un sistema de bloqueos basado en archivos (por ejemplo) para que
no se ejecute concurrentemente dos veces el mismo archivo por lotes.
Si aún está ejecutandose simplemente debes mostrar el contenido del
archivo temporal.
* Creamos un proceso que cree el archivo de bloqueo.
* Llama al .bat y lo dejas funcionando en segundo plano (siento no
ayudarte porque desconozco la forma que existe de ejecutar algo en
segundo plano desde un proceso por lotes en Windows).
* La salida del .bat la debes redirigir a un archivo.
* Borras el archivo de bloqueo al terminar la ejecución del script.
Me gusta la idea, lo probare a ver q tal
Post by Oscar Garcia
Si juegas como te dije con el ob_implicit_flush por cada línea de
texto que saque tu programa (el .bat) se manda dicho texto al
navegador.
lo he probado lo del implicit_flush i no funciona, para emularlo he
usado un programa en c que lo unico que hace es un printf("hola") cada 2
segundos hasta 20segundos.
Lo que hace el navegador (el iexplore i el firefox) es esperar los 20
segundos para mostrar el resultado completo.
El codigo que uso exactamente es:

<?php
ob_implicit_flush(true);
passthru('C:\noparis.exe');
?>

esta correcto?

gracias una vez mas
Oscar Garcia
2005-09-01 09:26:19 UTC
Permalink
El Thu, 01 Sep 2005 11:00:00 +0200, "Josep Ma. Serra"
Post by Josep Ma. Serra
Post by Oscar Garcia
¿Quieres que el trabajo que hacía un .bat lo haga el PHP? ¿O quieres
que la salida del .bat se muestre por pantalla en una página web?
Quiero que la salida del .bat se muestre por pantalla en una pagina web
Pero la ejecucion de ese bat tarda 10 minutos!! i el usuario no se puede
esperar ese tiempo a ver la salida, por lo que hay que ir mostrando la
salida (refrescando) cada 2 o 3 segundos.
Activa el flush implícito:
ob_implicit_flush(true);

Con eso, cada vez que el .bat devuelva algo, se mostrará por pantalla.

Ahora depende de que tu navegador sea capaz de renderizar contenidos
parciales de páginas web. Mozilla Firefox lo hace bajo cualquier
escenario... ¿Internet Explorer también? Creo que en casos de tablas y
divs espera a completarlos para irlos mostrando.
Post by Josep Ma. Serra
Post by Oscar Garcia
Creo que lo mejor sería un passthru que vuelque directamente a
pantalla la salida del .bat y que metas un META Refresh en el head que
te recargue la web cada x segundos.
pero al hacer refresh no mato la ejecucion del .bat??
La idea es no hacer un refresh, si no que la salida del .bat vaya
mostrandose en la misma página web.

Si no te convence este sistema, siempre puedes usar otros alternativos
como ejecución en segundo plano de procesos por lotes (¿windows lo
soporta?).

En UN*X sería muy sencillo:

passthru('comando.sh > salida.txt &');

Y luego ya puedes ir observando la salida de dicho archivo.

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Bart Ogryczak
2005-09-02 00:59:09 UTC
Permalink
Post by Josep Ma. Serra
Post by Oscar Garcia
No entiendo bien lo que quieres hacer.
żQuieres que el trabajo que hacía un .bat lo haga el PHP? żO quieres
que la salida del .bat se muestre por pantalla en una página web?
Quiero que la salida del .bat se muestre por pantalla en una pagina web
Pero la ejecucion de ese bat tarda 10 minutos!! i el usuario no se puede
esperar ese tiempo a ver la salida, por lo que hay que ir mostrando la
salida (refrescando) cada 2 o 3 segundos.
No estoy seguro si esto podria funcionar en Windows.

<?php
/* script de CLI, sea p.e. X:\script1.php */
set_time_limit(0);
$fp = fopen('X:\output.txt','w+');
flock($fp, LOCK_EX);
$result = exec('X:\el.bat');
fwrite($fp, $result);
flock($fp, LOCK_UN);
fclose($fp);
?>

<?php
/* script de WWW */
if(!file_exists('X:\output.txt')) {
exec('C:\algo\algo\php.exe X:\script1.php &');
// no me acuerdo si esto ^ funciona en Windows??
header("Refresh: 5; $PHP_SELF");
die("el bat epieza a funcionar\n");
} else { /* el bat esta funcionando o ha terminado */
$fp = fopen('X:\output.txt','r');
if(flock($fp, LOCK_EX | LOCK_NB)) /* ya ha terminado */
{
fpassthru($fp);
fclose($fp);
unlink('X:\output.txt');
} else { //esta funcionando
fpassthru($fp);
fclose($fp);
header("Refresh: 5; $PHP_SELF");
die("\n\n el bat todavia esta funcionando\n");
};
};

?>

/* perdona mi castellano ... */

bart
--
"Friendship is neither inherited nor transitive." [Annotated C++ Ref. Manual]
bart @bart.w-wa.pl || http://bart.w-wa.pl || http://faq.pl/php/
Josep Ma. Serra
2005-09-02 07:38:25 UTC
Permalink
Post by Bart Ogryczak
No estoy seguro si esto podria funcionar en Windows.
<?php
/* script de CLI, sea p.e. X:\script1.php */
set_time_limit(0);
$fp = fopen('X:\output.txt','w+');
flock($fp, LOCK_EX);
$result = exec('X:\el.bat');
fwrite($fp, $result);
flock($fp, LOCK_UN);
fclose($fp);
?>
<?php
/* script de WWW */
if(!file_exists('X:\output.txt')) {
exec('C:\algo\algo\php.exe X:\script1.php &');
// no me acuerdo si esto ^ funciona en Windows??
header("Refresh: 5; $PHP_SELF");
die("el bat epieza a funcionar\n");
} else { /* el bat esta funcionando o ha terminado */
$fp = fopen('X:\output.txt','r');
if(flock($fp, LOCK_EX | LOCK_NB)) /* ya ha terminado */
{
fpassthru($fp);
fclose($fp);
unlink('X:\output.txt');
} else { //esta funcionando
fpassthru($fp);
fclose($fp);
header("Refresh: 5; $PHP_SELF");
die("\n\n el bat todavia esta funcionando\n");
};
};
?>
El script fantastico i funcionaria a la perfeccion pero, el unico
`problema es que el '&' no funciona en windows, nose como ejecutar una
tarea i dejandola correr en background sin instalar software de terceros.

Alguien sabe como se puede hacer el '&' de u*ix en windows ??
Post by Bart Ogryczak
/* perdona mi castellano ... */
Porque? si esta muy bien!!


Muchas Gracias!!!
Alvaro G Vicario
2005-09-02 07:58:58 UTC
Permalink
Post by Josep Ma. Serra
Alguien sabe como se puede hacer el '&' de u*ix en windows ??
Tengo entendido que un tal "NT resource kit" de Microsoft trae una utilidad
que te permite ejecutar cualquier aplicación como servicio. Supongo que lo
podrías configurar como manual y lanzarlo y pararlo a voluntad con "net
start nombre_del_servicio". Yo nunca lo he probado.

Luego, aquí tienes una versión de "nohup" para Windows, aunque supongo que
no sirve de mucho si no puedes lanzar el programa en segundo plano:

http://gnuwin32.sourceforge.net/packages/coreutils.htm
--
-- Álvaro G. Vicario - Burgos, Spain
-- http://bits.demogracia.com - Mi sitio sobre programación web
-- Don't e-mail me your questions, post them to the group
--
Jose Miguel Pérez
2005-09-02 10:29:38 UTC
Permalink
Post by Josep Ma. Serra
Alguien sabe como se puede hacer el '&' de u*ix en windows ??
"START" puesto al principio de la línea de comandos.

Algo como esto:

C:\> START DIR C:\ /s

Es un ejemplo, evidentemente el comando DIR no es muy útil. :-)

Saludos.
Jose Miguel.
Josep Ma. Serra
2005-09-02 11:31:24 UTC
Permalink
Post by Jose Miguel Pérez
Post by Josep Ma. Serra
Alguien sabe como se puede hacer el '&' de u*ix en windows ??
"START" puesto al principio de la línea de comandos.
pero no deja la tarea en background!!
es decir, este comando ejecuta un nuevo shell o interprete y dentro de
el el comando pasado, pero el hilo principal de ejecucion que lo ha
creado php no se cierra hasta que acaba el comando.

SOLUCION (possible): (llevo todo el dia con la misma historia)
---------------------------------------------------------

'programar' la tarea para el mismo momento i que sea el 'demonio'
taskmgr quien la ejecute, la primera opcion es el comando 'at' que
pretende lo mismo que el AT de u*ix, pero se le tiene que pasar una
hora/dia/etc... se puede hacer pero encontre algo mejor :D

la utilidad SOON que viene a ser lo mismo que AT pero a soon se le pasa
el numero de segundos a partir del momento actual, en el que jay que
programar la tarea
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/soon-o.asp

el unico problema q tengo ahora es que lo programa a los X segundos de
la hora actual pero del dia siguiente!! ya lo solucionare...

-----------------------------------------------------------

El caso es que hemos conseguido delegarle la ejecucion a otro proceso
que no es php, lo bueno es que si el usuario cambia de pagina o
similares, el proceso NO se cuelga.


bueno cuando cosiga que todo funcione perfecto ya pegare el codigo :)
Josep Ma. Serra
2005-09-02 12:38:34 UTC
Permalink
Post by Josep Ma. Serra
bueno cuando cosiga que todo funcione perfecto ya pegare el codigo :)
sigo con mis miserias por si a alguien le interesa...

instalando el Windows Server 2003 Resource Kit Tools (rktools.exe)
http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en

Hay muchisimas utilidades para ejecutar desde linea de comandos i una de
ellas instala servicios directamente, pos para hacer todo el proceso
habria que ejecutar:

instsrv.exe indexos REMOVE //por si estaba ya creado
instsrv.exe indexos //lo volvemos a crear con nombre 'indexos'
net start indexos //iniciamos el servicio creado ->ejecuta


bien, si ahora cerramos el explorador, el proceso no se cuelga xq es un
servicio!!

el problema que tengo ahora es que igualmente la salida del comando que
ejecuta el proceso no la redirecciona al fichero hasta que no acaba. Es
decir, el servicio ejecuta algo del estilo c:\comando > out.txt

bien pues a out.txt no se le envia NADA hasta que no se acaba de
ejecutar TODO el proceso de 'comando'

VAYA MIERDA!!!!!!!! tantas vueltas al asunto y ahora el problema radica
en algo tan sencillo como los buffers intermedios que hay entre la
salida stdout i la redireccion a fichero, ahora no quiero esa
'eficiencia' !!!!

-- Como se puedo notar estoy *algo* desesperado :·S


some idea?

Continúe leyendo en narkive:
Loading...