Saltar captcha al autenticar en portal CFDI del SAT

Posted by admin on February 27, 2017

En días recientes, el SAT realizó cambios en su portal CFDI para solicitar se resuelva un captcha al de autenticarse, lo cual causó problemas con varios servicios de descarga masiva de CFDIs. Uno de estos servicios es uno que desarrollamos hace algunos años con CSFacturación, así que hubo que buscar la manera de resolverlo.

Hay varias maneras para solucionar el problema:

  1. Generar un token de autenticación utilizando la llave privada de la FIEL del contribuyente (de la misma manera que lo hace el applet de java que utiliza el SAT en su portal).
  2. Utilizar un servicio externo de resolución de captchas como Anti Captcha.
  3. Utilizar un algoritmo propio con un OCR.
  4. Saltar el captcha completamente.

La opción 1) la exploré y hubo buenos resultados, pero requería el uso de la FIEL. La opción 2) es la que utilizamos para salir del problema inicialmente y aún está soportada para casos futuros. La opción 3) es algo más compleja y propensa a errores, hice un par de pruebas pero no hubo muy buenos resultados. La opción 4) es la que voy a explicar.

Después de investigar un poco, el SAT utiliza un servicio de autenticación provisto por NetIQ. Al entrar directamente a la URL del portal CFDI del SAT se utiliza un método de autenticación (SATUPCFDiCon) que requiere se resuelva un captcha, pero existe un método adicional que se manifiesta en ocasiones, por errores del portal del SAT. Este método (mat-ptsc-totp) no requiere un captcha, ejecutando las peticiones correctas es posible autenticarse y ejecutar peticiones autenticadas al portal del SAT sin resolver captchas. Este método parece ser temporal, sería muy bueno que el SAT incluyera opciones como OAuth para autenticarse de manera segura, pero seguramente eso no sucederá y terminaremos utilizando las opciones 1) o 2) en el futuro. Mientras tanto:

El recurso de autenticación es el mismo de antes: https://cfdiau.sat.gob.mx/nidp/app/login

Pero ahora cambia el atributo id, el método que requiere captcha tiene id 'SATUPCFDiCon', el nuevo método que utilizaremos tiene id 'mat-ptsc-totp'. Los demás atributos quedan igual. La URL final quedaría: https://cfdiau.sat.gob.mx/nidp/app/login?id=mat-ptsc-totp&sid=0&option=credential. Los datos a enviar en el payload del POST a realizar deben ser los mismos que se utilizan para el id 'SATUPCFDiCon', con la excepción del captcha.

Ejemplo de la petición con cURL:

curl "https://cfdiau.sat.gob.mx/nidp/app/login?id=mat-ptsc-totp&sid=0&option=credential" \ 
  -H 'Accept: text/html' \
  -c cookies.txt \
  -d 'option=credential&Ecom_User_ID=RFC&Ecom_Password=PASS&submit=Enviar'

Donde:

-c cookies.txt: Esta opción indica un archivo donde almacenar las cookies que devuelva el servidor en la respuesta.
-d 'option=credential&Ecom_User_ID=RFC&Ecom_Password=PASS&submit=Enviar': El payload a enviar con la petición, cambiar los valores para 'Ecom_User_ID' y 'Ecom_Password' al RFC y CIEC, respectivamente, del contribuyente que se quiera autenticar.

Después de realizar la petición a través de POST, si se han establecido correctamente las credenciales de acceso, se podrá continuar con el flujo normal para completar la autenticación (como se hacía anteriormente).

Puedes comprobar que la autenticación ha sido exitosa, ejecutando la siguiente petición GET:

curl 'https://cfdiau.sat.gob.mx/nidp/jsp/content.jsp?sid=0' \
  -H 'Accept: text/html' \
  -b cookies.txt \
  -c cookies.txt

En el HTML de la respuesta debe haber este mensaje: Your session has been authenticated and is valid for 10 minutes.

Este método ha disminuido también los errores en la autenticación que se producen aleatoriamente al autenticarse utilizando el método SATUPCFDICon, incluso es más eficiente ya que requiere menos peticiones para comenzar la autenticación, puede iniciarse directamente con esta petición, a diferencia del método SATUPCFDICon que requiere realizar peticiones específicas para comenzar el proceso de autenticación.

5 Comments Read full post »

HT503 como SIP TRUNK en Asterisk con PJSIP

Posted by admin on February 19, 2017

Hace algunos días configuré un Grandstream HT503 como puerta de enlace FXO con Asterisk. Este ATA permite marcar directamente a la extensión SIP donde se registra el FXO, sin embargo esto significaba que no podría marcar de manera transparente números locales (e.g. tendría que marcar 9 para llamadas "externas"), o que al hacerlo, se escuchara siempre el tono de discado antes de enlazar la llamada (usando Dial para rediscado en extension.conf).

Para evitar lo anterior y poder usar el HT503 como un trunk SIP, para redirigir las llamadas de manera transparente, hubo que realizar la siguiente configuración. Esto es utilizando Asterisk 14 y PJSIP, no encontré nada (en inglés ni en español) que explicara cómo realizar la configuración utilizando PJSIP, así que lo comparto.

Configuración pjsip.conf

[ht503fxo]
type=aor
contact=sip:HT503_IP:5062
 
[ht503fxo]
type=endpoint
context=internal
disallow=all
allow=ulaw
aors=ht503fxo,EXT_FXO,EXT_FXS
direct_media=yes
 
[ht503fxo]
type=identify
endpoint=ht503fxo
match=HT503_IP

Algunas notas sobre la configuración:

HT503_IP: Debe ser la IP asignada al Grandstream (puerto WAN o LAN, dependiendo su configuración).
EXT_FXO: La extensión asignada al puerto FXO. Únicamente necesario si se está registrando la extensión con el servidor.
EXT_FXS: La extensión asignada al puerto FXS.

En varias partes encontré información sobre el usuario SIP del puerto FXO, que debía ser el utilizado para autenticarse con el SIP trunk, pero esto resultó no ser necesario (por eso no hay secciones tipo auth en la configuración). Registrar el FXO en nuestro asterisk con su propia extensión es opcional.

Algo que sí es importante configurar en el HT503: Port FXO -> Channel Dialing -> Stage Method (1/2), elegir 1. Si no se especifica esta configuración, las llamadas no serán redirigidas por el HT503 y no podremos realizar llamadas al exterior de manera transparente.

Una vez realizados los ajustes anteriores, podemos marcar directamente al exterior utilizando la siguiente configuración para nuestras extensiones.

Configuración extensions.conf

[internal]
; números como 030, 070, etc. se van por el HT503
exten => _XXX,1,Dial(PJSIP/${EXTEN}@ht503fxo,25)
exten => _XXX,n,Hangup()
 
; números de más de 5 elementos, se van automáticamente por el HT503
exten => _XXXXX.,1,Dial(PJSIP/${EXTEN}@ht503fxo,25)
exten => _XXXXX.,n,Hangup()
 
1 Comment Read full post »

Recientemente, he necesitado dar soporte a distintos clientes de manera remota en sus equipos. Para ello, en algunos conecté los equipos a una VPN y utilicé el servidor de UltraVNC para windows, en otros casos utilicé la herramienta comercial TeamViewer. Sin embargo, necesitaba reemplazar a teamviewer, no porque sea malo, todo lo contrario es buenísimo, pero no tengo licencia y no quería tener que pagarla tampoco (ni utilizarla ilegalmente).

Es por ello que busqué las alternativas libres que existen, ya alguna vez había usado UltraVNC SC que resuelve la mitad del problema (siendo el cliente el que solicita la conexión, se puede saltar su firewall, pero aún queda el de nuestro lado), pero en cuestión de seguridad deja bastante que desear (hay algunos "hacks" para utilizar el creador del ejecutable UltraVNC SC para incluir SecureVNC en lugar de MSRC4, pero funciona con versiones anteriores o solicitando el código fuente al desarrollador...). Para resolver el asunto de la conexión de nuestro lado, se puede resolver de distintas maneras:

  1. Redireccionar los puertos en nuestro router principal. Esta es la opción más sencilla y directa, pero tiene el inconveniente que si nos movemos a una red distinta con un router que no esté redireccionando los puertos, no funcionará.
  2. Utilizar un "repetidor". Esta es la opción que recomiendo, se puede implementar de distintas maneras, yo lo hice utilizando OpenVPN y un servidor con Linux (con un par de reglas de iptables para la redirección de puertos), pero es posible hacerlo también utilizando esta herramienta.

Por lo anterior, decidí realizar una herramienta de soporte propia que sustituya a UltraVNC SC, con los elementos que había a la mano: UltraVNC, SecureVNC e IExpress.

Crear la herramienta de soporte

Para crear la herramienta de soporte (que sustituye a UltraVNC SC) utilizaremos. Descarga lo siguiente:

La versión descargada de UltraVNC instálala en una máquina con windows, CONFIGURA (asigna una contraseña y otros aspectos) el servidor desde el administrador y copia los siguientes archivos de la carpeta de instalación a una nueva carpeta:

  1. winvnc.exe
  2. vnchooks.dll
  3. schook.dll
  4. ultravnc.ini

Puedes utilizar el comando iexpress y crear el archivo utilizando el wizard, incluir los 5 archivos descritos anteriormente en el paquete a crear y asegurarse que se ejecute el siguiente comando cuando se desempaqueten los archivos al dar doble click sobre el ejecutable creado:

winvnc.exe -connect host-ultravnc-viewer:5500 -sc_exit -sc_prompt -run

Cambia "host-ultravnc-viewer" por el nombre del host donde estará el Viewer de UltraVNC escuchando conexiones (la máquina desde la que se dará soporte), la opción "sc_exit" indica que debe cerrar el servidor VNC al terminar la conexión, mientras que la opción "sc_prompt" enviará una alerta a la máquina desde la que se dará soporte para aceptar la conexión.

Todo lo anterior se puede simplificar, si utilizan este script SED y ejecutan el siguiente comando en una terminal windows (verifica las rutas de los archivos en el script SED antes de ejecutarlo):

iexpress /N soporte.SED

Con esto obtendremos un archivo que al ser ejecutado iniciará un servidor VNC en el puerto 5500 y enviará una petición de conexión al host que determinemos (host-ultravnc-viewer). Es muy similar a la función que realiza UltraVNC SC, sin embargo utiliza SecureVNC en lugar de MSRC4. En este artículo no explico cómo incluir PKI, pero es posible realizarlo generando las llaves necesarias (directamente desde winvnc).

Mejoras futuras a la herramienta

El inconveniente de esta herramienta en comparación con UltraVNC SC es que inicia automáticamente la conexión al ser ejecutado y no permite incluir múltiples hosts de soporte, además no es compatible con algunas versiones anteriores de windows (e.g. Windows XP), sería bueno contar con una interfaz gráfica que permita configurar distintos hosts (como lo hace UltraVNC SC), actualmente no conozco ninguna herramienta para windows que permita crear una lista de comandos a ejecutar (gráfica), por lo que es necesario adentrarse en los oscuros rincones de C++ y las MFC (el problema de trabajar con máquina virtuales cuando necesitas una "aplicación ligera y nativa").

Por otro lado, en algunos sistemas actuales que utilizan SmartScreen (e.g. Windows 8), esta aplicación es reconocida como una amenaza, por lo que sería necesario firmar digitalmente el ejecutable para evitar este problema.

Repetidor

El servidor donde corre nuestra VPN (OpenVPN) tiene una IP pública fija, por lo que es utilizado como "repetidor", para permitirme dar soporte desde cualquier ubicación (siempre y cuando esté conectado a la VPN). La manera en la que lo realicé fue la siguiente:

  1. Asigna una IP estática dentro de tu VPN (e.g. a través de client-config-dir) al host que utilizarás para dar soporte (e.g. tu computadora): 172.16.10.101.
  2. Redirige el tráfico al host: iptables -t nat -A PREROUTING -p tcp --dport 5500 -j DNAT --to-destination 172.16.10.101:5500.
  3. Permite NATeo (a.k.a. masquerading) en la interfaz de openvpn: iptables -t nat -A POSTROUTING -p tcp -o tun0 -j MASQUERADE.

Con la configuración anterior, es posible dar soporte desde cualquier ubicación a través de mi laptop, siempre que me encuentre conectado a nuestra VPN.

Host de soporte

Mi laptop corre la distro Archlinux, por lo que corro una máquina virtual de Windows con VirtualBox. En Windows, utilizo el VNCViewer de UltraVNC en modo pasivo (escuchando en el puerto TCP 5500). En un acceso directo en el escritorio, tengo el siguiente comando:

vncviewer.exe -listen -dsmplugin SecureVNCPlugin.dsm

Es necesario para esto que el archivo SecureVNCPlugin.dsm se encuentre en la misma carpeta que el ejecutable vncviewer.exe.

Conclusiones

Con un poco de tiempo y paciencia, es posible crear la infraestructura necesaria para ofrecer soporte remoto sin necesidad de configuraciones complicadas del lado del cliente utilizando software libre.

0 Comments Read full post »

Udev en Android

Posted by admin on November 12, 2012

Desde hace algún tiempo, descubrí que era posible instalar una distribución Debian bajo Android, basta con tener acceso a la cuenta de root desde nuestro dispositivo. Aquí hay una guía para hacerlo (en inglés), aunque si su partición de almacenamiento interno (/mnt/sdcard) utiliza el sistema de archivos FAT, tienes que realizar primero una imagen y montarla, como se describe en esta guía.

Lo que describiré a continuación se realizó utilizando una tablet Acer Iconia A500, utilizando el ROM no oficial de CM 10 para la a500, que utiliza Android 4.1.2, aunque puede realizarse en sistemas anteriores siempre y cuando el dispositivo tenga un puerto USB (como la Motorola Xoom). No es una guía paso a paso sobre cómo realizarlo, más bien una introducción a algunas de las cosas que podemos realizar teniendo debian para proveernos de aplicaciones GNU sobre el kernel de Android (que es linux).

La primera vez que lo hice, fue para instalar un módem 3g usb (de los que da telcel con su servicio de banda ancha móvil en México). Esta vez necesitaba montar automáticamente una unidad usb lectora de dvd para ver películas directamente del disco, sin tener que rippear/codificarlas antes. Es posible montar la unidad manualmente y sin necesidad de correr debian, sin embargo Android no provee ningún mecanismo para monitorear los dispositivos que se conectan al dispositivo y realizar alguna acción cuando eso suceda (al menos no de manera sencilla). Es aquí donde udev resulta útil.

Udev es el gestor de dipositivos utilizado en linux 2.6, básicamente permite definir reglas para realizar ciertas acciones cuando un dispositivo se conecta/desconecta del sistema. Una vez que tengamos configurado nuestro sistema debian (que no es más que un jail chroot), podemos ejecutar el servicio udevd y definir nuestras reglas en /etc/udev/rules.d.

Como es necesario que el sistema host Android pueda leer el contenido de la carpeta donde se montó el dispositivo, se debe realizar esta operación desde el sistema host. ¿Cómo hacer entonces para integrar esto con udev, si udev corre bajo un jail chroot que no puede acceder directamente al sistema host? Una solución es utilizando SSH localmente, nuestro sistema Android viene preparado con una versión reciente de OpenSSH (podría utilizarse telnet también). Sólo hace falta configurar el servicio (yo lo configuré para que sólo escuche peticiones locales y utilizando infraestructura de llave pública para la autenticación) y ejecutarlo. Una vez que se esté ejecutando, podemos acceder desde nuestro jail chroot y montar la unidad desde ahí, con un comando como el siguiente:

ssh -p 2222 root@localhost "busybox mount /dev/block/sr0 /mnt/sdcard/dvd"

Con lo anterior, podemos crear una regla udev, que se encargue de montar automáticamente el dispositivo ejecuutando un comando similar al de arriba. Incluso podemos obtener el número del nodo que se está creando, utilizando una regla como la  siguiente:

SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}=="DVDRW SOHW-1693S",
RUN+="ssh -p 2222 'busybox mount /dev/block/sr%n /mnt/sdcard/dvd'", ACTION=="add"

Esto es sólo una prueba de lo que es posible hacer utilizando aplicaciones de usuario GNU en dispositivos Android, hay algunos problemas con esta implementación (por ejemplo, es difícil mantener /dev consistente, debido a que al desconectar la unidad no se ejecuta completamente la acción "remove" de udev y no es posible desmontar limpiamente la unidad), pero abre las posibilidades para automatizar muchas acciones que el sistema Android no realiza ni permite nativamente.

El siguiente experimento a realizar es utilizar una antena WIFI externa con la tablet, y la suite aircrack para hacer wardriving utilizando sólo la iconia a500 (y debian, por supuesto), pero eso será tema de otro artículo. Espero esto sirva para alentarlos a realizar experimentos como éste y poder leer sus comentarios.

0 Comments Read full post »

FaceBrute: facebook brute force script

Posted by admin on June 14, 2012

Para probar la seguridad de mi contraseña de facebook, decidí crear un script para intentar adivinar la contraseña mediante un ataque de fuerza bruta. Este script necesita una lista de contraseñas para funcionar (un sitio con varias ligas para conseguir diccionarios), y su uso es muy sencillo:

facebrute.py -u email -p pass.list [-e encoding] [-P proxy:port]
 
email: Correo electrónico de la cuenta objetivo
pass.list: Archivo con contraseñas a intentar
encoding: La codificación de caracteres del archivo pass.list (por defecto es utf-8)
proxy: El servidor proxy desde el cual realizar el ataque, indicando el puerto (ej. localhost:8118)

El script está desarrollado en python puro, por lo que puede correr en cualquier sistema operativo que cuente con un intérprete de python (probado en python 2.7, pero debería funcionar con versiones mayores a 2.4).

Para descarga y más información, visita el repositorio en github.

2 Comments Read full post »

Extensión de Gnome-Shell: PowerAltTab

Posted by admin on June 14, 2012

Siguiendo con el fervor de las extensiones de gnome-shell en javascript, he creado esta nueva extensión que reemplaza la funcionalidad original de la combinación Alt+Tab en gnome-shell por funcionalidad similar a la que provee el módulo de Xmonad Contrib CycleRecentWS.

Actualmente, el binding "switch_windows" en gnome-shell (ligado a la combinación de teclas Alt+Tab) se encarga de iterar entre las distintas aplicaciones en ejecución en nuestro escritorio, agrupando las ventanas de éstas. Esta extensión hace que el binding "switch_windows" itere entre los espacios de trabajo disponibles, ordenándolos de acuerdo al último utilizado, a manera de pila.

La extensión también reemplaza el binding "switch_group" (ligado a la combinación de teclas Alt+~) para que se pueda iterar entre las ventanas del espacio de trabajo activo, ordenándolas de acuerdo a la última enfocada, a manera de pila (el viejo comportamiento de la combinación Alt+Tab).

Para utilizar la extensión, seguir estas instrucciones:

cd ~/.local/share/gnome-shell/extensions
git clone git@github.com:emerinohdz/PowerAltTab.git
mv PowerAltTab PowerAltTab@devpower.org 

Después basta con reiniciar gnome-shell (Alt+F2 - r) y habilitar la extensión con gnome-tweak-tool.

El código fuente de la extensión se encuentra disponible en mi repositorio de github.

0 Comments Read full post »

Extensión de Gnome-Shell: StatusTitleBar

Posted by admin on June 14, 2012

Hasta hace unos días utilizaba un entorno gráfico extremadamente personalizado que incluía: el gestor de sesiones Slim, el TWM Xmonad y una sesión de XFCE para hacer agradables mis ventanas GTK.

Aunque todo iba muy bien, había algunos problemas con esto: las ventanas pierden sus decoraciones, incluso los diálogos, lo cual las hace verse muy mal. Es por esto que decidí regresar a Gnome en su versión 3 con gnome-shell, su gestor gráfico (ventanas, notificaciones, etc.). Es bastante agradable a la vista, pero estando acostumbrado a utilizar siempre ventanas maximizadas, sin decoraciones y mostrando el título de la ventana enfocada en la barra de estado de la sesión las cosas se sentían un poco raras.

Es por esto que desarrollé esta sencilla extensión, que se encarga de sustituir el botón de aplicaciones (junto del botón de Actividades) por un componente que muestre el título de la ventana enfocada SÓLO si está maximizada, si no está maximizada regresa a la funcionalidad anterior del botón de aplicaciones en donde muestra sólo el nombre de la aplicación enfocada.

Al habilitar esta extensión, se recomienda instalar y habilitar la extensión Move Clock.

Para utilizar la extensión, seguir estas instrucciones:

cd ~/.local/share/gnome-shell/extensions
git clone git@github.com:emerinohdz/StatusTitleBar.git
mv StatusTitleBar StatusTitleBar@devpower.org 

Después basta con reiniciar gnome-shell (Alt+F2 - r) y habilitar la extensión con gnome-tweak-tool.

El código fuente de la extensión se encuentra disponible en mi repositorio de github.

0 Comments Read full post »

Desde hace algunas semanas he estado programando una interfaz para ejecutar comandos remotos utilizando como interfaz de usuario (UI) el correo electrónico: MailCommander.

MailCommander está desarrollado en python y es un proyecto de software libre hospedado en github.

Esta interfaz no impone restricciones sobre los comandos que se pueden implementar, el control y acceso de los comandos será manejado por el administrador de sistemas, ayudándose del módulo de autorización/autenticación incluido con la aplicación.

El uso actual que le estoy dando es para altas de nuevos correos electrónicos en la empresa donde trabajo, así como cambios de contraseña, eliminación de cuentas, etc.

Existen soluciones que ya incluyen módulos que cumplen con la misma función que MailCommander, pero éste se diferencia en que es software libre y cualquiera puede utilizar el código con o sin fines de lucro, ya que está liberado bajo una licencia no restrictiva: Artistic License 2.0.

El código fuente se encuentra aquí.

0 Comments Read full post »

Utilizando OpenVPN es posible utilizar un nodo remoto (en realidad cualquier nodo en una red distinta de la nuestra) de la misma manera en la que lo haríamos con la puerta de enlace de nuestra red. El nodo que se utilizará como puerta de enlace deberá hacer NAT entre la red de OpenVPN y la(s) red(es) externa(s) a la(s) que se quiera acceder.

Para el siguiente ejemplo, se utilizará el comando iptables que se encuentra disponible en cualquier distribución GNU/Linux y la siguiente configuración de red en el nodo que servirá como puerta de enlace (NODO GW):

eth0 (internet)
ip: 172.16.1.1
 
tun0 (red OpenVPN)
ip: 192.168.1.1

Utilizamos la acción MASQUERADE de iptables para hacer NAT en el NODO GW:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

Ahora es posible utilizar el nodo 192.168.1.1 como puerta de enlace en la red 192.168.1.0/24 para acceder a internet desde ahí.

Esta configuración se puede utilizar siempre utilizando dos interfaces de red en un nodo, por eso funciona también con OpenVPN al crear éste un dispositivo virtual (tun/tap) que para el kernel se comporta igual que cualquier otra interfaz.

0 Comments Read full post »

UnicodeParser: python email parser

Posted by admin on June 14, 2012

Desde el mes pasado he estado trabajando en un sistema para el trabajo para facilitarme la vida con la creación de cuentas nuevas de correo, entre otras cosas. En el proceso, he tenido la necesidad de utilizar la clase Parser del módulo email.parser, sin embargo es un poco tedioso obtener las cabeceras del correo como cadenas unicode, por lo que he creado la clase UnicodeParser, la cual funciona exactamente igual que la clase Parser (de la cual desciende), con la diferencia que al obtener cualquier cabecera ésta será una cadena unicode.

El módulo incluye también la función "unicode_email_body", la cual devuelve el cuerpo del correo electrónico también como una cadena unicode.

  1. from mail import UnicodeParser, unicode_email_body
  2.  
  3. # Mismo uso que la clase email.parser.Parser
  4. email = UnicodeParser().parse(open("/path/to/email_source"))
  5.  
  6. # Cuerpo del correo como cadena unicode
  7. body = unicode_email_body(email)

El módulo requiere python >= 2.5.
Descargar.

0 Comments Read full post »

last.py

Posted by admin on June 14, 2012

En estos días en el trabajo tuvimos que checar información sobre los usuarios que se conectan al servidor de VPNs "poptop" que corre en la empresa, éste tiene un plugin en donde almacena toda la información en un archivo UTMP (/var/log/wtmp).

Para ello se utiliza el comando "last" en sistemas *nix, sin embargo la aplicación por defecto corta los nombres de los usuarios a sólo 10 caracteres, con lo que no nos era posible saber exactamente qué usuarios se estaban conectando.

Utilizando la librería pyutmp recreé el comando "last" en python, sólo que esta vez el límite de caracteres mostrados para el nombre de usuario es 30, además que cuando los usuarios aún se encuentran conectados muestra el PID del proceso que gobierna la conexión. Sólo tiene implementada la opción "-f" para proveer al programa del archivo UTMP que se utilizará, las demás opciones del comando original "last" no están implementadas, pero debería ser suficiente.

Descarga last.py

0 Comments Read full post »

mpc_osd.py: Cliente mpd con soporte OSD

Posted by admin on June 14, 2012

Desde hace ya algún tiempo utilizo mpd como mi reproductor de música y estaba en busca de un cliente que soportara OSD que no corra como un servidor y pudiera desplegar las notificaciones en la misma ventana siempre.

Es por eso que desarrollé mpc_osd.py, su uso es muy sencillo y es ideal para utilizarlo ligado a accesos rápidos de teclas (key bindings). Soporta todos los comandos provistos por el módulo mpd de python, además del comando "toggle" el cuál cambia el estado del reproductor de pausado a tocando y viceversa.

El script puede utilizar Desktop Notifications (como notify-osd o xfce4-notifyd) a través de DBUS o puede utilizar XOSD mediante la librería pyosd.

mpc_osd.py <opciones> [comando]
 
Opciones disponibles:
  -d, --display
  -s, --stack
  -h, --host
  -p, --port
  -c, --config
 
  --font
  --color
  --help
 
Comandos disponibles:
  play
  pause
  toggle
  info
  next
  previous
  shuffle

Requerimientos:
python >= 2.5
python-mpdclient

DBUS
python-dbus
Una implementación de la Desktop Notifications Specification (e.g. notify-osd)

XOSD
pyosd

Descarga mpc_osd.py

18 Comments Read full post »