PDA

Ver la Versión Completa : De los mismos creadores de pico llega ...


seoane
11-04-2007, 14:11:34
Pues eso, estos días estoy entretenido con un nuevo juguete, no se si recordáis el micro servidor que colgué por aquí (http://www.clubdelphi.com/foros/showthread.php?t=32112) ya hace un año, pico (http://http://www.clubdelphi.com/foros/showthread.php?t=32112) lo llame, pues ahora he intentando hacer algo similar en linux (el pico original no funciona en linux porque wine no implementa todavía la API TransmitFile).

Así que he abierto el gedit, y comencé a escribir código en C. Por ahora llevo unas 500 lineas de código, y ya maneja correctamente el comando Get, puede enviar archivos, mensajes de texto, listar directorios, codificar/descodificar urls y además es multihilo. Faltan por implementar la autentificación, el comando Head y algún método de Timeout a la hora de leer el socket, pero eso ya lo haremos mas adelante si es necesario.

El funcionamiento es sencillo, solo hay que ejecutar pico en un terminal y luego en cualquier navegador utilizar la url http://127.0.0.1:1978/ si es en el mismo equipo o http://tuip:1978/ si es desde otro equipo de tu red. Se puede ejecutar sin usar el terminal, pero entonces el programa permanece oculto y no mostraría ni mensajes, ni errores (si los hubiera). Una vez que accedemos a esa url vemos un listado de todo el sistema de ficheros, aquí es importante recordar que el programa tiene los mismos permisos de lectura que el usuario que lo ejecuta (para mas adelante estoy pensando en utilizar algo como chroot para cambiar el directorio raíz del proceso).

Como siempre, se admiten sugerencias, consejos, criticas (sin pasarse :p ) pero siempre recordando que se trata de un juguete y no de un servidor serio, yo al menos pienso utilizarlo como venia haciéndolo con su hermano gemelo en windows, para pasar archivos de un ordenador a otro rápidamente y sin tener que andar instalando nada, ni cambiando la configuración de las carpetas compartidas, etc ... un par de clicks y copiando, sin complicarse (muy útil cuando quieres pasar archivos al portátil de un amigo).

Cambios:

- 12/04/2006

Primer bug corregido :eek: . Solo era un problemilla de zombies ...

- 13/04/2006

Ahora si no se realizan peticiones nuevas en 30 segundo la conexión de cierra.
Se muestran mas mensajes con información, y se indica a que proceso pertenece.
Arreglado un pequeño fallo en la función urldecode

- 15/04/2006

Rehice algunas funciones.
Ahora el puerto, el timeout y el tamaño de buffer se pueden cambiar desde la linea de comandos.
Volvieron los zombies, pero ahora creo que ya los mato bien muertos ...
Los mensajes de error http son mas precisos
Ya manejo el comando HEAD

- 21/04/2006

Pequeñas modificaciones para poder utilizarlo conjuntamente con xinetd ...

Ñuño Martínez
11-04-2007, 14:30:35
(...)Por ahora llevo unas 500 lineas de código(...)519, para ser exactos ;)

No he podido probarlo, y la verdad es que no sé cuándo podré, pero hay cosillas interesantes. No dices nada de condiciones para usarlo, así que supondré que es completamente libre (el sueño de Stallman :D). Lo digo porque tengo un montón de ideas pendientes a las que tendré que dar salida cuando consiga establecerme definitivamente y... :rolleyes:

seoane
11-04-2007, 14:51:13
No dices nada de condiciones para usarlo, así que supondré que es completamente libre

Tranquilo Ñuño usalo sin problemas, es completamente libre, como un pajarillo. Yo entiendo, y es una opinión personal, que todo lo que se publica en un foro es libre, y mas si va sin licencia (por cierto, he estado echando un vistazo a tus licencias y me parece que te las voy a copiar :p ).

Por otro lado, aun siendo libres y sin tener ninguna obligación de hacerlo, estaría bien, que si utilizas el código me mandaras un mensaje para saber como termino la cosa, solo por curiosidad.

Ñuño Martínez
11-04-2007, 15:13:44
Stupendo.

Y por supuesto que puedes utilizar mis licencias, por eso las puse en mi web. Puede que las cambie algo en un futuro próximo, especialmente lo de "Modificaciones al Acuerdo de Licencia" ya que ahora mismo Burdjia, como ente, no existe y ya no dispongo del apartado de correos, pero lo demás seguirá siendo igual, así que sin problema.

seoane
11-04-2007, 18:39:41
Bueno al parecer tenia un pequeño problema de zombies. Cuando un proceso hijo finalizaba, no lo limpiaba, quedando entonces en el sistema como un proceso zombie. Bueno, eso esta solucionado, ahora manejo la señal que indica que el proceso hijo a terminado y hago limpieza. Ya subí el zip con el código corregido.

Espero que el siguiente bug tarde un poco mas en aparecer :o

dec
12-04-2007, 15:39:36
Hola,

Está muy chulo Pico Seoane. Y me he puesto a probar lo de "compartir" archivos entre ordenadores y la cosa parece muy curiosa. :)

No garantizo que vaya a estar "online", pero, ¿alguien podría probar a entrar en la siguiente dirección y decirme lo que ve? :)

http://82.159.35.98:1978

seoane
12-04-2007, 15:42:46
:D Lo que se ve dec es un dialogo pidiendo usuario y contraseña, y yo que pensé que habías puesto tu disco duro online :p

dec
12-04-2007, 15:44:38
Hola,

:D :D :D

Eso era justo lo que quería que se viera. :) :D

Ahora puedes probar con el usuario: "clubdelphi" y la contraseña "clubdelphi". :)

seoane
12-04-2007, 15:44:42
Y por lo que veo estas usando Pico :D

seoane
12-04-2007, 15:45:50
Ahora sale un directorio, con un archivo llamado hola.txt

dec
12-04-2007, 15:48:12
Hola,

Sí... :)

La verdad es que es curioso esto, ¿eh? Dan ganas de ponerse a hacer algo y todo... de momento ya he añadido a Pico la capacidad de aceptar como parámetro el nombre de un usuario, además de la contraseña. :)

No sé... esta misma tarde tengo que irme de casa a hacer unos asuntos, y el ordenador se quedará probablemente encendido... no sé si dejar a Pico "corriendo" de modo que si necesito algún archivo o algo... pueda recurrir a él.

Qué cosas... desde luego es curioso Pico. :)

seoane
12-04-2007, 15:51:50
no sé si dejar a Pico "corriendo"


Recuerda que no te garantizo que resista una ataque malintencionado, en principio debería resistir, pero no te lo garantizo :p


La verdad es que es curioso esto, ¿eh? Dan ganas de ponerse a hacer algo y todo...


Si es divertido :p ¿Probaste la version para linux?

dec
12-04-2007, 15:59:20
Hola,

Nope. No he probado la versión para Linux, pero, supongo que viniendo de quien viene será igual o mejor que la de Windows. Y sí que dan ganas de ponerse a juguetear un poco, pero, efectivamente, no sé si está uno lo suficientemente preparado para estas cosas.

Por ejemplo, el tema de la seguridad. Tal como yo lo veo, no es posible "saltarse" a Pico a no ser que se conozca el nombre de usuario y la contraseña correspondientes. Ahora bien, esto es tal y como yo lo veo. Otra cosa es que esté completamente equivocado.

Una cosa Seoane, ahora que lo pienso, lo mismo que está Pico para HTTP podría uno escribir un Pico para FTP, ¿no? Pero me estoy desviando del tema... :)

seoane
12-04-2007, 16:10:21
Por ejemplo, el tema de la seguridad. Tal como yo lo veo, no es posible "saltarse" a Pico a no ser que se conozca el nombre de usuario y la contraseña correspondientes.

En teoría no. Pero yo estaba pensando en ataques de denegación de servicio o desbordamiento de buffer. El desbordamiento de buffer creo que lo tengo controlado, pero la denegación de servicio es otra cosa. De todas formas un ataque de ese tipo solamente dejaría fuera de combate el servidor pero no afectaría a la seguridad.


Una cosa Seoane, ahora que lo pienso, lo mismo que está Pico para HTTP podría uno escribir un Pico para FTP, ¿no? Pero me estoy desviando del tema... :)

Se podría hacer, pero ten en cuenta que FTP tiene muchos mas comandos que HTTP. Pero si te animas .... :p

mamcx
12-04-2007, 16:55:38
Tranquilo Ñuño usalo sin problemas, es completamente libre, como un pajarillo. Yo entiendo, y es una opinión personal, que todo lo que se publica en un foro es libre, y mas si va sin licencia (por cierto, he estado echando un vistazo a tus licencias y me parece que te las voy a copiar :p ).

Quizas cambies de parecer al leer http://www.codinghorror.com/blog/archives/000833.html

Al final, ten en cuenta que agregar una licencia puede ser tan simple como

"Este codigo esta disponible bajo la licencia SuperWau! disponible en http://unaurl.com"

(En caso de usar una licencia con el texto publico, como las creative commons).

Por experiencia, las cosas legales son las que uno menos piensa pero luego vuelven para darte en el trasero...

Ñuño Martínez
12-04-2007, 17:15:58
Por experiencia, las cosas legales son las que uno menos piensa pero luego vuelven para darte en el trasero...Precisamente por eso creé mis licencias cuando estuve trabajando como autónomo con ayuda de un abogado.

seoane
12-04-2007, 17:38:24
Al final, ten en cuenta que agregar una licencia puede ser tan simple como

"Este codigo esta disponible bajo la licencia SuperWau! disponible en http://unaurl.com"

(En caso de usar una licencia con el texto publico, como las creative commons).

Por experiencia, las cosas legales son las que uno menos piensa pero luego vuelven para darte en el trasero...

Nunca lo había pensado de esa manera ¿Llegaría con añadir a mi firma un enlace a una licencia? Algo así:

"Todos mis mensajes, incluidos código y archivos adjuntos esta bajo la licencia Superguay"

¿Que os parece? he visto que en algún sitio lo hacían así, pero me parecía un poco pedante. Para cuatro lineas de código que se pueden meter en un mensaje me parece excesivo tener que andar pensando en licencias y demás.

mamcx
12-04-2007, 18:22:42
Con respecto al codigo que se pone en los post no es tan serio -al fin rararmente es codigo compilable o completo-, pero en el caso de PICO o cualquier software que es funcional pues si.

mamcx
12-04-2007, 18:25:54
Y una pregunta social....

Porque re-hiciste PICO en C,sabiendo que existe freepascal? Una mera aventura al lado oscuro? ;).

Bueno,no que desanime a probar otros lenguajes. Por ahi he probado ruby,python, erllang y otros mas raros tambien... simplemente que me parece que de tener una cosa funcionando....

seoane
12-04-2007, 20:36:04
Porque re-hiciste PICO en C,sabiendo que existe freepascal? Una mera aventura al lado oscuro? ;).

Pues por recordar un poco el C que lo tengo abandonado. Además se puede decir que Linux es C, muchas, por no decir la mayoría, de las aplicaciones están hechas en C, hay un montón de documentación para C, hay un montón de ejemplos en C, etc ... de hecho en varias ocasiones he preguntado que utilizar para programar en linux y siempre hay quien aconseja java, python, ... pero al final siempre termina saliendo el C.

En cuanto a freepascal, me encantaría utilizarlo, pero no termino de acostumbrarme a el :( , no es mi querido delphi :p Mas adelante lo probare de nuevo y veremos que tal ...

seoane
16-04-2007, 13:32:35
Bueno, veo que pocos lo han bajado (unas 5 personas) y como nadie dice nada, supongo que nadie lo ha probado :( Ya se que este foro no es el mas adecuado para hablar de C y menos sobre linux, pero me gustaría saber si el programa compila bien en otras distribuciones de linux y si funciona bien.

Así que si alguien tiene linux y dispone de un poco de tiempo, me gustaría que lo bajase y lo probase. Y mejor si bajáis la ultima versión, porque como podéis ver en el primer mensaje de este hilo he hecho algunos cambios.

dec
16-04-2007, 13:38:14
Hola,

Bueno. Ahora mismo estoy con Windows, empero, prometo probarlo la próxima vez que cambie a Linux... que está en otro disco duro, es cuestión de "cambiar uno por otro". Más que nada para poderte decir que sí, que todo va como se espera Seoane. :)

Casimiro Notevi
16-04-2007, 14:28:14
En cuanto llegue a casa lo pruebo.

En cuanto llegue a casa y me 'zampe' la comida. :D

dec
16-04-2007, 16:34:21
Hola,

Bueno. Ya he tratado de probar Pico en Debian Etch. No puedo compilarlo... bien porque no sé, bien porque algo "falla" en mi sistema. Estos son los comandos que ejecuto y los mensajes de error que recibo, por cierto que los mismos si lo hago como "root" como si no:


(ver más abajo)


Y la cosa es que tampoco puedo ejecutar Pico, o no sé hacerlo, ya digo. Si escribo "pico", sencillamente, se me inicia el editor "GNU Nano"... y si escribo "sh pico" esto es lo que hay:


(ver más abajo)


Seguramente no será un problema de Pico, que funciona bien en Windows y a ti te funciona Seoane... más bien se diría, en cuanto al primer problema (no puede compilarse) que algo falta en mi sistema. En cuanto al segundo problema... ahí esto todavía más perdido: el archivo tiene permisos de ejecución... pero ya ves qué ocurre... :)

Nota: Tengo que adjuntar los "mensajes de error" en un archivo porque el sistema de seguridad de los Foros impide que lo copie en el propio mensaje. Por cierto, el archivo que adjunto es un archivo de texto: cámbiese la extensión de ZIP a TXT. :)

seoane
16-04-2007, 16:43:42
Vamos por partes, para compilarlo solo tienes que situarte en el directorio donde esta el código y teclear:

make


El programa make se encargara de buscar el archivo Makefile y compilara el programa. En cuanto a ejecutar la aplicación, vuelve a situarte en el directorio y teclea:

./pico

El "./" es importante, si no linux no entenderá que es un ejecutable.

Y por ultimo siempre te queda hacer doble click sobre el :D

dec
16-04-2007, 17:33:23
Hola,

Bueno. Lo del "make" no lo sabía. Me la apunto Seoane. En cuanto al doble clic no parece que funcione... por un lado. Ahora bien, resulta que no tengo el "gcc" instalado, de modo que lo estoy instalando...

Tengo algún problema, así que paso los resultados de ejecutar Pico, esta vez con el "./":


dec@decone:~/Desktop/pico$ ./pico
./pico: /lib/tls/i686/cmov/libc.so.6: version `GLIBC_2.4' not found (required by ./pico)
dec@decone:~/Desktop/pico$


Creo que se trata de que no tengo "GLIB", que resulta que al instalar el "gcc" se ha de incluir también... ahora estoy terminando de instalar el "GCC", junto con las dependencias que creo evitarán el anterior problema...

A ver. Recapitulemos. Una vez instalado el "gcc" he podido compilar Pico sin problemas. Antes de eso no podía ejecutar Pico (el ejecutable que tú incluyes Seoane), puesto que me aparecería el error susomentado.

Al compilar Pico en mi sistema (ya digo, luego de instalar el "gcc") sí que he podido ejecutar Pico perfectamente. Es decir, que he podido ejecutar el Pico que yo he compilado en mi sistema: ¡y funciona como se espera, ahí está escuchando! :)

Edito: Una cosilla Seoane, no sé si será útil o qué. Resulta que me he percatado de que si ejecuto varias veces Pico (lo he hecho al hacer las pruebas sin darme cuenta) cuando al cabo cierra la consola desde donde lo inicio al menos un proceso de Pico sigue funcionando.

No sé. Lo primero que se me ocurre es que no se permitan más instancias de Pico... pero esto me parece que no es una solución... no sé... :)

seoane
16-04-2007, 17:47:31
El problema era debido a que estaba compilado con una versión diferente de la que tu tienes instala en tu sistema. Al volverlo a compilar, ya se adapto. Esta es una de las razones por las que los programas en linux se distribuyen en código fuente, así se pueden adaptar a cada sistema al compilarlos.


Lo del "make" no lo sabía. Me la apunto Seoane

Bueno niños, hoy hemos aprendido que "make" sirve para compilar y que para ejecutar un programa que no este en el PATH tenemos que indicar un directorio, ya sea la ruta completa o './' :p :D ;)

seoane
16-04-2007, 17:52:32
No sé. Lo primero que se me ocurre es que no se permitan más instancias de Pico... pero esto me parece que no es una solución... no sé... :)

Bueno, en principio solo se puede ejecutar una, ya que si usan el mismo puerto, al intentar ejecutar la segunda te dará una fallo mas o menos así:

[11618] bind(): Address already in use

Por otra parte no debería de quedar nada abierto al cerrarse, de hecho, si quedara el propio sistema operativo se encargaría de matarlo. Lo que me parece que paso es que hiciste doble click sobre el archivo y se quedo ejecutando en segundo plano, oculto, y ese es el que ves en la lista de tareas.

dec
16-04-2007, 17:55:39
Hola,

Pues así es la verdad. Habría jurado que probé a navegar con Pico luego de haber hecho doble clic... y de ahí que dijese que no funcionaba (en mi sistema), pero, compruebo ahora que sí, que al hacer doble clic Pico se ejecuta como se espera. :)

Efectivamente, al hacer de nuevo doble clic Pico no se ejecuta (terminará con error, pero este no se muestra) y al intentar ejecutar Pico de nuevo (esta vez desde la consola) aparece el error que mencionas Seoane.

O sea. Que bien. :D

seoane
16-04-2007, 17:57:50
Por cierto dec, muchas gracias por probarlo.

dec
16-04-2007, 17:59:25
Hola,

Nah, hombre, no hay de qué, ha sido un placer y he aprendido algos (como lo de Make, por ejemplo). Ahora que me gustaría meterme un poco más, pero, me temo que hoy por hoy es pensar en lo excusado. Todavía con Pico (en Delphi) he hecho alguna cosilla... o por mejor decir he tratado de hacerla, pero, nada del otro mundo... nada publicable. :)

Casimiro Notevi
16-04-2007, 20:04:02
Pues nada, ya he comido, un poco tarde :( y me he puesto a probar el ya famoso 'pico' :).
Veamos:

descargar el zip
extraerlo
abrir la consola de líneas de comandos
cd /home/casimiro/pico
make
./pico
desde firefox: localhost:1978
navegar por los directorios
ver algún pdf
cerrar firefox
abrir una xubuntu virtualizada para simular una conexión por red local
abrir firefox
desde firefox: http://192.168.1.2:1978
navegar por los directorios
ver algún documento
cerrar firefox
ctrl-c para cerrar el 'pico'
Resultado: perfecto.


P.d: al conectar sale siempre al principio: favicon not found, no sé qué será:

[7222] GET / HTTP/1.1
[7222] GET / favicon.ico HTTP/ 1.1
[7222] Not Found
[7222] GET / tmp/ HTTP/ 1.1

seoane
16-04-2007, 20:17:30
El favicon segun la wikipedia:

Favicon (Término reducido de la palabra inglesa Favorites icon), también conocido como icono de página, es un icono asociado a una página web concreta. Un diseñador web puede crear este icono y muchos navegadores gráficos pueden usarlos. Los navegadores que permiten esta función suelen mostrar el icono junto a la barra de direcciones, al lado del nombre de la página web en la lista de favoritos y en los títulos de las páginas. Estos iconos son de tamaño 16x16, y de extensión .ico los favicon pueden ser creados a partir de un archivo .png, y algunos pueden ser de 32 bit, 16 bit y algunos soportan transparencia alfa. Algunas aplicaciones pueden hacer los favicon automaticamente (Ejemplo: GoLive)

En ingles dan mas explicaciones: http://en.wikipedia.org/wiki/Favicon

El caso es que los navegadores que soportan el favicon, lo que hacen es intentar pedirlo cada vez que se conectan a un servidor, y si no lo encuentran, como en este caso, pues no muestran nada. Si alguno tiene un servidor web y revisa su archivo log vera como hay un montón de peticiones del famoso archivo favicon.ico

Caramba, la de cosas que estamos aprendiendo hoy :p :D

Muchas gracias Casimiro por probarloo :)

Casimiro Notevi
16-04-2007, 20:23:48
Caramba, la de cosas que estamos aprendiendo hoy :p :D
Muchas gracias Casimiro por probarloo :)
De nada, por cierto, también lo he probado desde un windows 'real' y no virtualizado de mi red local y también funciona perfecto.
Además me ha servido para averiguar que tengo el puerto 1978 abierto en el ubuntu, bueno, realmente, todos los puertos, no me había fijado que no tengo firewall activado ni nada de nada :eek:

seoane
16-04-2007, 20:30:20
Además me ha servido para averiguar que tengo el puerto 1978 abierto en el ubuntu, bueno, realmente, todos los puertos, no me había fijado que no tengo firewall activado ni nada de nada :eek:

Creo que eso es "habitual", la gente se confía con eso de que linux es seguro y no se preocupa de andar cerrando puertos. Yo estoy igual que tu y la verdad me da pereza andar configurando nada, de todas formas estoy detrás de un router así que nadie puede acceder a esos puertos desde internet. Eso si en cuento me anime un poco, me van a prestar documentación sobre iptables y me pongo con eso.

DarkMan
17-04-2007, 20:11:38
Me acabo de descargar pico y lo he probado en mi distribución Mandrake, he de decir que funciona perfecto. Como bien dicen por ahi es muy facil de usar(y tanto...) y seguramente me sea útil porque estoy continuamente desplazandome.

Enhorabuena por el buen "juguetito" que has hecho seoane:)

seoane
22-04-2007, 01:03:28
Bueno, yo sigo jugando. Ahora buscando un poco de seguridad me he fijado en xinetd (http://www.xinetd.org/). Xinetd es un demonio presente en muchos sistemas tipo Unix que gestiona las conexiones de varios demonios. La ejecución de una única instancia de Xinetd reduce la carga del sistema, en comparación con lo que significaría ejecutar cada uno de los demonios que gestiona, de forma individual. Cuando una petición llega a nuestro equipo, a uno de los puertos controlados por el, ejecuta una instancia del programa encargado de manejar esa conexión. Por ejemplo, en el caso de pico, cuando alguien se conecte al puerto 1978 xinetd ejecutara una instancia de nuestro programa para que se encargue de esa conexión, una vez cerrada la conexión nuestro programa también se cierra.

Además de la ventaja de no tener el programa siempre funcionando, xinetd nos ofrece un montón de ventajas mas, como pueden ser:

Limitar el acceso desde determinados hosts.
Limitar el numero de conexiones simultaneas.
Limitar el acceso según la hora.
Prevenir los ataques de denegación de servicio.
Crear archivos log
etc ...


He modificado levemente el programa para que funcione con xinet, puedes bajarte el zip con el programa del primer mensaje de este hilo (http://www.clubdelphi.com/foros/showpost.php?p=194075&postcount=1). Ahora para ejecutar pico de forma compatible con xinet utiliza el parametro "--inetd", algo asi:

/usr/bin/pico --inetd


Ahora ya solo nos falta configurara xinetd. Para eso vamos a crear un fichero de texto en el directorio "/ etc/xinetd.d". Algo así:

"/ etc/xinetd.d/pico"

service pico
{
disable = no
port = 1978
socket_type = stream
protocol = tcp
wait = no
user = seoane
server = /usr/bin/pico
server_args = --inetd
instances = 15
nice = 10
type = unlisted
}

Estamos suponiendo que el usuario que queremos usar es seoane, y que pico esta en el directorio "/usr/bin". Otras cosas interesantes son que hemos limitado el numero de instancias que se pueden ejecutar de forma simultanea, y hemos bajado su prioridad para que no consuma muchos recursos.

Para que esta nueva configuracion tenga efecto tenemos que reiniciar el servicio xinetd. Asi que ejecutamos el siguiente comando:

/ etc/init.d/xinetd restart

Una vez reiniciado el demonio, ya podemos acceder a nuestro servidor web como lo hacíamos antes http://127.0.0.1:1978 o http://tuip.com:1978

En la pagina de xinetd (http://www.xinetd.org/) o en esta otra (http://www.linuxfocus.org/Castellano/November2000/article175.shtml), puedes encontrar mas información sobre como limitar el acceso y demás opciones de configuración.