PyJupiter meet the World, World this is PyJupiter

From a few months now I’ve been using Jupiter to speed up certain tasks in my laptop (usually I work with an external monitor in my home, so I’m constantly connecting and disconecting the monitor from my Acer Aspire One D250, obviously its more comfortable to work in a 15.6″ display that in the built in 10.1″ laptop display).

Jupiter is great without any doubt. But for me has some “issues”. The main one is that the GUI is developed in C#, this means that needs mono installed to work. In Ubuntu 11.10 (distribution that I’m using right now) mono came installed by default, applications like Banshee are also developed in mono. In the future nearby (with Ubuntu 12.04), this is not true any more.

Besides all this, in Ubuntu 11.10, installing Jupiter also means installing all this packages:

libmono-corlib2.0-cil libmono-data-tds2.0-cil libmono-i18n-west2.0-cil libmono-messaging2.0-cil libmono-posix2.0-cil libmono-security2.0-cil libmono-sharpzip2.84-cil libmono-sqlite2.0-cil libmono-system-data-linq2.0-cil libmono-system-data2.0-cil libmono-system-messaging2.0-cil libmono-system-web2.0-cil libmono-system2.0-cil libmono-wcf3.0-cil libmono2.0-cil

This is about 17MB of packages that I need to install just to use the Applet. Besides all these elements, the original implementation uses an icon in the notification area, in Unity the use of an indicator provides e better integration, and I really like keeping my system organize.

Keeping all this in mind, i started to rewrite the GUI part of Jupiter in something called PyJupiter, essentially I continue using all the bash scripts and just rewrote the GUI, using Python, PyGTK, and improving the integration with Unity using an indicator. After some advise from the original developer Andrew Wyatt I also included the systray icon to keep compatibility with those users that don’t use Unity. Also I included some multithread capabilities, so each submenu is rendered by a different thread increasing the ideal of a responsive interface. Some minor tweaks have also been made in the menu, using radio buttons or check boxes instead of the original asters to indicate the active element.

I’ve packaged the system into a deb package, so installation in Ubuntu 11.10 is easy, for those distributions RPM based the code is inside the deb file, so packaging for others systems should be easy.

So without anymore delay I’ll give you PyJupiter (Download).

Please share any comments/thoughts in the comments.

Advertisements

Autenticando contra un LDAP desde Python

Desde hace ya algún tiempo soy un lector asiduo de los blogs de Zuzel, Yasser, Luis y otros muchachos de la UH, que poseen su blog. Realmente son algunos de los escasos blogs que existen en Cuba que se actualicen y que además publican contenidos que me resulten interesantes :-).

En fin gracias a un trabajo que presentó Zuzel en la Jornada Científica en la Universidad de la Habana llegúe al DrProject, que según su propia web:

DrProject is a web-based project management portal that integrates revision control, issue tracking, mailing lists, a wiki, and other tools that software development teams need to succeed. DrProject was designed to be simple enough for undergraduate students to master in less than an hour, and is now being used by universities, open source projects, and commercial teams in several companies.

Me pareció bastante interesante y además mucho más sencillo que otros como el GForge, además el atribuido adicional de tener a una experta cerca era tentadora. Pues nada me puse en contacto con ella y como para ella no era ningún problema el venir hasta la Universidad, ayudarme a instalar y configurar, pues asi lo hicimos. Luego de luchar con algunas “p” mal escritas :-), se logró hacer funcionar todo sin mayores problemas.

De todo el proceso, la parte que más le interesaba a Zuzel era la de hacer autenticar al drproject contra el LDAP de la Universidad, luego de escribir algún que otro código lo dejamos con una autentificación, que en ese momento, pensé que funcionaba, la cuestión fue que al final, luego de probar varias veces llegué a la conclusión de que realmente no funcionaba, pues cualquier combinación de usuario / contraseña que le proporcionaba se logeaba perfectamente.

Entonces fue cuando comenzé a buscar información sobre la librería python-ldap que estábamos utilizando para la autentificación, luego de una búsqueda bastante amplia, no encontré ninguna información que me fuera del todo clara o que me proporcionara algún ejemplo que me permitiera adaptarlo de forma rápida y fácil a mis necesidades. Finalmente, pude encontrar en estos artículos la mejor información disponible, y aquí un ejemplo que aunque orientado a django me fue muy útil para lograr un script funcional. A continuación dejo el código del fichero validate.py que se encarga de realizar la autentificación desde la interfaz web del DrProject:

Expliquemos un poco el código:

AD_DNS_NAME = 'uci.cu'
AD_LDAP_PORT = 389
AD_SEARCH_DN = 'OU=UCI Domain Users,DC=uci,DC=cu'
AD_SEARCH_FIELDS = ['displayname', 'mail', 'mailnickname', 'title']
AD_LDAP_URL = 'ldap://%s:%s' % (AD_DNS_NAME, AD_LDAP_PORT)
DOMAIN = "uci.cu"

Estas líneas son simplemente de configuración para establecer el AD_LDAP_URL que es la URL que se utiliza para conectar al servidor LDAP.


username = sys.stdin.readline().strip("\n")
password = sys.stdin.readline().strip("\n")
try:
l = ldap.initialize(AD_LDAP_URL)
r = l.simple_bind_s("%s@%s"%(username, DOMAIN), password)
l.unbind_s()
sys.exit(0)
except ldap.LDAPError, e:
# print e.message['info']
if type(e.message) == dict and e.message.has_key('desc'):
print e.message['desc']
else:
print e
sys.exit(1)

Esta es la función validate que es la que encarga de corroborar las credenciales del usuario. En el caso particular de DrProject se leen el usuario y la contraseña mediante la entrada estándard y luego se comprueban con el servidor LDAP.

Finalmente lo que se incluye es una llamada a la función validate para ejecutarla:


if __name__ == '__main__': validate()

De esta forma se logra que el DrProject autentique directamente contra un servidor LDAP, lo cual puede ser útil debido a que la gestión de usuarios no queda de parte del DrProject y además se evita que los usuarios tengan que crearse nuevas cuentas y recordar más contraseñas 🙂