MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

Mejoras que estan por venir: TcosMonitor 0.0.10.beta2
No es aún una versión semi-estable pero las mejoras, sobre todo en el aspecto gráfico son bastante impresionantes, ni yo mismo al principio pensaba que python fuese tan flexible y a la vez tan potente.

He grabado un screencast (captura de pantalla en modo video) con byzanz que lo guarda en formato gif, aquí teneis mezcladas una de las próximas mejoras (una barra inferior de progreso) y acciones globales para todos los host que haya en la lista (quizás añada un checkbox para filtrar equipos a nuestro antojo). Perdonad por el tamaño pero si lo reduzco no se ve del todo bien. En el ejemplo se ven 3 equipos (un tcos, un ltsp y un pxes) a los que bloqueo la pantalla y desbloqueo (reiniciar tambien funciona, apagar no va en ltsp :( )






El look and feel es importante TcosMonitor 0.0.10
Para que una aplicación gráfica guste, lo primero es que funcione bien, pero lo segundo y en este órden es que sea agradable a la vista y no parezca que se arrastra...

Por eso he estado implementando que algunas acciones de TcosMonitor se ejecuten en hilos (Threads) para que la interfaz no se congele, todavía no funciona todo lo bien que quisiera pero la fluided se nota bastante.

Por ejemplo, el descubrimiento de equipos, es decir, las máquinas conectadas al puerto 6000 del servidor (realmente a 6000-6009 porque parece que LTSP si se configura startx en un screen distinto del 0 se conecta a otro puerto... )
Esto es el código que se ejecuta al pulsar el botón de actualizar:

def on_refreshbutton_click(self,widget): if self.init.searching: print_debug( "on_refreshbutton_click() searching TRUE" ) # FIXME show a msg return self.write_into_statusbar ( _("Searching for connected hosts...") ) allclients=self.localdata.GetAllClients() if len(allclients) == 0: self.write_into_statusbar ( _("Not connected hosts found.") )

return
else:
txt=_("Found %d hosts, retrieving data..." ) %len(allclients)
self.write_into_statusbar ( txt )
# populate_list in a thread
Thread( target=self.init.populate_hostlist, args=([allclients]) ).start() return

La acción que más tiempo lleva es tomar usuario, nombre de host, número de procesos, tiempo conectado, y estado del bloqueo de pantalla para cada equipo, por lo que esto se ejecuta en un nuevo Thread (línea negrita), siendo el trozo subrallado la función que hace todas estas cosas.


La función populate_hostlist de la clase Initialize es la siguiente:

def populate_hostlist(self, clients): print_debug ( "populate_hostlist() init" ) start1=time() if self.searching:
return
self.searching=True # clean list print_debug ( "populate_hostlist() clear list!!!" ) self.model.clear() COL_HOST, COL_IP, COL_USERNAME, COL_ACTIVE, COL_LOGGED, COL_BLOCKED, COL_PROCESS, COL_TIME = range(8) inactive_image = gtk.gdk.pixbuf_new_from_file(shared.GLADE_DIR + '/images/inactive.png') active_image = gtk.gdk.pixbuf_new_from_file(shared.GLADE_DIR + '/images/active.png') logged_image = gtk.gdk.pixbuf_new_from_file(shared.GLADE_DIR + '/images/logged.png') unlogged_image = gtk.gdk.pixbuf_new_from_file(shared.GLADE_DIR + '/images/unlogged.png') locked_image = gtk.gdk.pixbuf_new_from_file(shared.GLADE_DIR + '/images/locked.png') unlocked_image = gtk.gdk.pixbuf_new_from_file(shared.GLADE_DIR + '/images/unlocked.png') i=0 for host in clients: i += 1 self.main.localdata.newhost(host) self.main.xmlrpc.newhost (host) ip=host hostname=self.main.localdata.GetHostname(ip) username=self.main.localdata.GetUsername(ip) num_process=self.main.localdata.GetNumProcess(ip) time_logged=self.main.localdata.GetTimeLogged(ip) if self.main.localdata.IsActive(ip): image_active=active_image else: image_active=inactive_image if self.main.localdata.IsLogged(ip): image_logged=logged_image else: image_logged=unlogged_image if self.main.localdata.IsBlocked(host): image_blocked=locked_image else: image_blocked=unlocked_image gtk.threads_enter() self.iter = self.model.append (None) self.model.set_value (self.iter, COL_HOST, hostname ) self.model.set_value (self.iter, COL_IP, host ) self.model.set_value (self.iter, COL_USERNAME, username ) self.model.set_value (self.iter, COL_ACTIVE, image_active ) self.model.set_value (self.iter, COL_LOGGED, image_logged) self.model.set_value (self.iter, COL_BLOCKED, image_blocked) self.model.set_value (self.iter, COL_PROCESS, num_process ) self.model.set_value (self.iter, COL_TIME, time_logged) gtk.threads_leave() crono(start1, "populate_host_list(%s)" %(ip) ) print_debug ( "populate_hostlist() END" ) self.searching=False return

El código en negrita es lo más crítico de la función ya que accede al interfaz gráfico GTK para completar los valores del TreeView, por eso van encerrados entre llamadas a gtk.threads_{enter,leave}. La función crono no es más que un cronómetro que resta dos variables de tiempo para saber cuando se tarda en ejecutar el proceso, si se desactiva el modo debug hay muchas cosas que ya no se ejecutan como ésta.

Como se puede adivinar self.searching es un bloqueo para que no se llame a esta función si ya se está ejecutando.

Funciona bastante bien pero de vez en cuando y aleatoriamente da una extraña violación de segmento acompañada de un fallo de tubería de wc, que me da que pensar que algo falla en la extracción del número de procesos:

cmd=" ps aux|grep "^%s "| wc -l" %(self.username)

He añadido un par de condiciones a la función que lo hace y parece que ya no ha vuelto a suceder.

También estoy implementando un control de cache de los datos, por ejemplo, guardar en un array si el equipo está vivo (responde a los ping), los puertos abiertos, usuario y nombre de equipo, para que sólo se calculen la primera vez y el resto se devuelvan desde cache, para evitar problemas cada elemento del array (cada host) tiene un tiempo de vida que si se supera se vuelve a pedir, (configurable desde las preferencias).

Para terminar unas capturas de la interfaz un poco más bonita con sus iconos de menús, con una red simple de 3 equipos funcionando sobre 3 vmplayer en mi pobre portátil:
  • tcos1 es un equipo basado en TCOS
  • tcos2 es un equipo basado en LTSP 4.2
  • tcos3 es un equipo basado en PXES 1.2
Con esto se demuestra que TcosMonitor ya funciona medianamente en las tres plataformas.






ATENCIÓN:

Los paquetes los he partido para no tener que instalar cosas que no vamos a usar:

tcosmonitor - interfaz pyhton
tcos-tcosmonitor - complementos para que tcosmonitor funcione con tcos
pxes-1.0-tcosmonitor - complementos para que tcosmonitor funcione con pxes-1.0
pxes-1.1-tcosmonitor - complementos para que tcosmonitor funcione con pxes-1.1
pxes-1.2-tcosmonitor - complementos para que tcosmonitor funcione con pxes1.2
ltsp-tcosmonitor - complementos para que tcosmonitor funcione con LTSP (instalado en /opt/ltsp)

El mirror donde siempre:

deb http://soleup.eup.uva.es/tcos/debian unstable main





¿Qué vas a hacer este verano?
Puedes irte a la playa, a la montaña, o puedes aprender, participar y colaborar con el software libre (entre otras cosas).

Ahora imaginamos pasar unos días en Andalucía, concretamente en su centro geográfico donde se sumarán varios eventos:

¿Donde encontrar todo esto?

la respuesta se llama e-verano.org


Puedes mirar los eventos programados, sus objetivos, y los responsables que se dejan la piel para que todo funcione y siempre sea mejor que el anterior.

Ramón, tu si que trabajas por el software libre!!!!!



Hace un año: Openoffice2

TcosMonitor 0.0.9 (ahora compatible con PXES)
Esta tarde he estado «juankeando» PXES para que funcionase con TcosMonitor, y puedo decir, como ya he anunciado en la lista LTSP-es que he conseguido que al menos funcionen las utilidades básicas.

Para usar TcosMonitor en un aula PXES (versiones soportadas 1.1 y 1.2):

Añadir al sources.list:
# tcos
deb http://soleup.eup.uva.es/tcos/debian unstable main

Importar mi clave GPG:

# wget http://soleup.eup.uva.es/tcos/mariodebian-pub.key

# cat mariodebian-pub.key| sudo apt-key add -

Instalar:

# apt-get update
# apt-get install tcospxes-1.1-tcosmonitor



(para pxes-1.2)
# apt-get install tcospxes-1.2-tcosmonitor




Una vez instalado no hay que tocar nada, sólo rehacer las imágenes de arranque de PXES:

# pxesconfig

Una vez la/s máquinas arranquen lanzamos el programa:

$ tcosmonitor

(es preferible ejecutarlo como usuario cuando necesite más privilegios como crear configuración personalizada o matar sesiones de usuario ya nos pedirá la contraseña de root mediante gksu|kdesu.

Por defecto no carga ningún equipo, hay que pulsar en actualizar, se puede activar la auto-actualización en las preferencias pero todavía no funciona muy fino.....

Cuando actualicéis la lista os empezará a decir que el usuario o la contraseña de las preferencias no son correctos, pulsar en el botón preferencias y en la segunda pestaña poner estos datos:

usuario: user
contraseña: pass

No es ni mucho menos seguro pero de momento es lo que hay ;)

Para cambiar la contraseña por defecto sólo hay que editar un archivo:

# echo "USUARIO:$(tcosmd5 PASS)" > /opt/pxes-1.1/stock/dist/etc/tcospasswd

cuidadin con la version de pxes !!!! HAY QUE REHACER LA IMAGEN CADA VEZ QUE SE EDITE ALGO DENTRO DE /opt/pxes*/stock/dist

Cosas que si funcionan:

  • Ver información del terminal (no toda, lo de xorg es bastante chapucilla)
  • Matar sessión del usuario
  • Ejecutar aplicación en pantalla de usuario
  • Abrir una sessión ssh remota (si se activa en PXES)
Cosas que aun no, pero se podrá:
  • Reiniciar sesión gráfica (Xorg y Xfree !!!)
  • Bloquear/desbloquear pantalla (lockscreen no funciona con PXES y en mi debian, o en TCOS si, supongo que es por estar enlazado a librerías de xorg en vez de xfree, si alguien puede compilarlo sobre xfree sería de ayuda.
  • Reiniciar y apagar tampoco va (cosas del start-stop-daemon)

Para los más curiosos esta es la estructura de archivos/directorios que se ha añadido a la imagen de PXES (~ 600 Kb)

/opt/pxes-1.1 /opt/pxes-1.1/stock
/opt/pxes-1.1/stock/dist
/opt/pxes-1.1/stock/dist/bin
/opt/pxes-1.1/stock/dist/bin/lockscreen
/opt/pxes-1.1/stock/dist/bin/tcosmd5
/opt/pxes-1.1/stock/dist/bin/tcosxmlrpc
/opt/pxes-1.1/stock/dist/bin/configurexorg
/opt/pxes-1.1/stock/dist/bin/screenshot.sh
/opt/pxes-1.1/stock/dist/bin/needmodules.sh
/opt/pxes-1.1/stock/dist/bin/awk
/opt/pxes-1.1/stock/dist/bin/start-stop-daemon
/opt/pxes-1.1/stock/dist/lib
/opt/pxes-1.1/stock/dist/lib/libxmlrpc_abyss_server.so.3
/opt/pxes-1.1/stock/dist/lib/libxmlrpc_abyss.so.3
/opt/pxes-1.1/stock/dist/lib/libxmlrpc.so.3
/opt/pxes-1.1/stock/dist/lib/libxmlrpc_xmlparse.so.3
/opt/pxes-1.1/stock/dist/lib/libxmlrpc_xmltok.so.3
/opt/pxes-1.1/stock/dist/etc
/opt/pxes-1.1/stock/dist/etc/rc.d
/opt/pxes-1.1/stock/dist/etc/rc.d/Stcosxmlrpc
/opt/pxes-1.1/stock/dist/etc/mime.types
/opt/pxes-1.1/stock/dist/etc/abyss.conf
/opt/pxes-1.1/stock/dist/etc/tcospasswd

Lo que más ocupa es awk ya que el busybox que se usa en PXES no lo lleva y muchos de mis scripts o tcosxmlrpc lo usan.

Me gustaría que alguien lo pruebe (y si es en un aula grande mejor) y ya de paso que me mande o cuelgue en algún sitio capturas de TcosMonitor funcionando....

Así mismo si se tuesta la interfaz o no funciona la descarga de información podéis ver el debug que sale por consola, o conectaros por ssh al terminal y revisar el archivo /var/log/tcosxmlrpc.log que también muestra bastante debug.

Y para no varian un «escrinchoto»






Flash para máquinas de 64 bits
Muchos de los equipos que se llevan vendiendo durante más de un año han sido de arquitectura de 64 bits, esto en vez de una ventaja en mejora de rendimiento ha sido (sobre todo en pxs de escritorio) un inconveninete, falta de drivers, falta de aplicaciones y falta de flash o plugins de video.

Hasta ahora la gente lo solucionaba con una jaula «chroot» de 32 bits, pero hoy leo en linux.com, que hay disponible un plugin para firefox que actúa de capa intermedia entre firefox (de 64 bits) y flash (de 32 bits) y otros plugins.

El plugin se llama NSpluginwrapper y por lo que aparece en la captura es capaz de hacer funcionar flash en el firefox de ubuntu de 64 bits.

Entre los plugins soportados se encuentran:

  • Acrobat Reader (5.0.9 and 7.0.1)
  • DejaVu Libre (3.5.14)
  • Flash Player (7.0)
  • Linux JPEG 2000 (0.0.2)
  • Mplayerplug-in (2.80)
  • Real Player (10.0.5)

Buenas noticias para los 64 bits !!!!





TcosMonitor 0.0.8
Como ya decia en otro artículo entre examen y examen he estado trabajando en un monitor para redes de clientes ligeros, en las anteriores versiones sólo obtenía información del terminal, ahora es posible realizar acciones simples o incluso complejas.

Creo que este proyecto aporta muchas cosas que no tiene ni PXES ni LTSP como una herramienta sencilla para configurar cada terminal por separado, y de manera gráfica. Sigo bastante ilusionado porque creo que tengo entre mis manos una nueva «killer-app», el código python aún está muy guarro, espero después de exámenes limpiarlo y mejorar el control de errores, casi inexistente ahora.

He dejado los últimos paquetes en el repositorio de TCOS:

deb http://soleup.eup.uva.es/tcos/debian unstable main

Adjunto unas cuantas capturas, airé comentando cosas sobra cada captura.

Capturar la pantalla del terminal:
Scrot + busybox http (solución un poco cutre pero efectiva, <0,7 seg en hacer y descargar una captura de pantalla)




Ver configuración de Xorg:
Muchas de estas variables se pueden editar, en la siguiente captura veremos como.


Personalizar configuración de Xorg para un equipo concreto:



Reiniciar Xorg con la nueva configuración (la configuración una vez guardada es permanente y la descargará el terminal cada vez que arranque):



Nueva captura de pantalla (GDM) esta vez a 800x600 @ 60Hz:



Aquí se ven los 800x600 en la actualización de la información:



Abrimos una sesión ssh contra el terminal:



Comandos ejecutados en el terminal con busybox ash ( free, hostname, uname -a, uptime):
El equipo de pruebas tiene mogollón de RAM pero en 64 Mb prometo que funciona igual de bien.


Bloquear y desbloquear pantalla en el terminal (en la lista de host aparece el candado rojo cuando está bloqueado):
El teclado y el ratón también dejan de responder.


Ejecutar aplicación en la pantalla del usuario (xterm por ejemplo, mira la captura):





Diálogo de preferencias generales ( intervalo de auto-actualización, método de descubrimiento de equipos (netstat o ping) interfaz de la red thin client (para el ping) ):
Para ver equipos conectados se hace un netstat filtrando a las conexiones del puerto 6000, el método ping, mucho más lento pero potente hace un ping a toda la red y devuelve los equipos vivos (clientes ligeros, routers, etc...)


Usuario y contraseña de tcosxmlrpc:
Estos datos no van encriptados por lo que es posible verlos por la red, al ser información no demasiado importante (en el terminal y por medio de tcosxmlrpc sólo se pueden ejecutar algunas cosas, matarlas o reiniciar/apagar terminal, no se puede borrar o acceder a información importante). Además los comandos que se pueden ejecutar no aceptan parámetros por lo que un rm -rf se quedaría en un rm a secas dadno error de falta de archivos o modificadores.
Además la mayoria de las redes thin client no son públicas, se suelen usar redes separadas para minimizar el impacto en otras redes (tipo 192.168.0.X), por lo que los únicos que pueden "esnifar" las contraseñas son los mismos usuarios de la red.



Información que pediremos a tcosxmlrpc (alguna opción puede ser bastante pesada, como PCI, o los módulos del kernel):

Es bastante interesante la información de los módulos, ya que se reciben dos variables, los modulos cargados (lsmod) y los módulos que discover ha intentado cargar y no ha encontrado, gracias a esto podemos saber qué componentes del equipo no funcionan por falta de módulos y rehacer la imagen con los módulos que faltan. (He estado pensando que incluso crear un fichero automáticamente desde TcosPersonalize tipo 192.168.0.X.modules.squashfs para la máquina que queramos)

Todos las preferencias se guardan en un archivo de la home del usuario que lo ejecute (~/.tcosmonitor.conf && chmod 600) y la configuración personalizda por terminal se guarda en /tftpboot/tcos/conf/dir_ip.conf (se pedirá la contraseña de root si ejecutamos TcosMonitor como usuario) así cada terminal que tiene asignada una ip por mac en el servidor DHCP, se descarga su configuración personalizada. De momento se puede personalizar casi todas las opciones de Xorg mediante un pequeño script llamado configurexorg, lo ideal es que se puedan configurar/personalizar casi toda la configuración del terminal como es el soporte extra de aplicaciones como iTALC (que también se puede lanzar desde TcosMonitor), VNC, o aplicaciones empotradas (un navegador web, freenx, etc...) o incluso soporte para paquetes klik.


Hace un año: ADSL que vuela