Controle de ponto usando dbus-monitor

Aqui no trabalho, a folha de ponto é registrada manualmente, usando uma planilha do Excel onde precisamos registrar as horas de entrada/saída. É arcaico, mas tem sido menos problemático do que o ponto eletrônico, que às vezes dava pane, engatava o rolo, acabava papel etc.

Pois bem, até recentemente, eu vinha coletando a hora de entrada/saída a partir dos logs de sistema da minha máquina (visto que quase sempre eu dou resume/suspend no início/fim do expediente). Mas às vezes eu não desligava a máquina e por isso não tinha aquele dia registrado. Tive então a ideia de monitorar as mensagens D-Bus que são enviadas quando faço o bloqueio/desbloqueio da tela. Para quem não sabe, o D-Bus é a ferramenta mais usada no Linux para comunicação entre processos (InterProcess Communication, IPC). Por exemplo, sempre que a tela é bloqueada, certa mensagem é enviada via D-Bus e os processos interessados ficam “ouvindo” por esta mensagem. O mesmo ocorre no desbloqueio.

Sem mais rodeios, este é o script que escrevi:

#!/bin/bash
dbus-monitor --profile \
"type=signal,path=/org/gnome/SessionManager/Presence,\
interface=org.gnome.SessionManager.Presence,\
member=StatusChanged" | \
awk '$7 != "NameAcquired"{system("date -d @"$2)}'

O dbus-monitor permite “ouvir” as mensagens D-Bus que foram autorizadas para o usuário. A opção --profile altera o formato da saída de modo que cada mensagem D-Bus seja expressa em uma linha. Exemplo de saída:

sig 1389965062 467981 2 /org/freedesktop/DBus org.freedesktop.DBus NameAcquired

Estamos interessados na segunda coluna, que é um “timestamp” que pode ser convertido para o dia/hora em que a mensagem foi recebida. No script, o comando date é usado para converter esse timestamp para uma data legível. Por exemplo, date -d @1389965062 gera Fri Jan 17 09:24:22 AMT 2014 no meu fuso horário (UTC-4).

O awk é uma poderosa ferramenta para filtrar e processar texto, especialmente se este tiver um formato tabular como o gerado pelo “dbus-monitor –profile”. No script, ele simplesmente lê a segunda coluna de cada linha e executa o comando “date” (como descrito acima) para converter o timestamp para uma data legível. Notem que ele exclui a linha onde a sétima coluna seja igual a “NameAcquired”. Essa linha sempre é gerada quando se inicia o dbus-monitor e não representa o evento que nos interessa. Para entender melhor o funcionamento do awk, sugiro ler o bom e velho manual.

Só resta explicar o significado do texto:

"type=signal,path=/org/gnome/SessionManager/Presence,\
interface=org.gnome.SessionManager.Presence,\
member=StatusChanged"

De acordo com o manual do dbus-monitor, esta é uma “watch expression”. Basicamente, é um filtro que descreve que tipo de mensagens queremos observar (as demais são ignoradas). Em português, a linha acima diz que estamos interessados em sinais (type=signal) cujo caminho seja /org/gnome/SessionManager/Presence, interface org.gnome.SessionManager.Presence e nome StatusChanged. Mais detalhes sobre o significado dos temos usados aqui podem ser encontrados no tutorial do D-Bus.

Faltou ainda explicar como eu uso o script. Por enquanto, eu inicio ele manualmente usando este comando (que pode ser digitado em qualquer terminal):

./scripts/track_login_logout.sh &>> ~/ponto.txt &

Usei algumas funcionalidades do shell que talvez não sejam do conhecimento geral, então vale explicar. “&>> ~/ponto.txt” siginifica “redirecione tanto a saída padrão como a saída de erro para o arquivo ~/ponto.txt. O “&” ao final da linha significa que o comando irá rodar em background, portanto a janela do terminal poderá ser fechada e o script continuará em execução.

Uma última observação: a mesma técnica pode ser usada para monitorar outras mensagens D-Bus, basta trocar a “watch expression”. A que eu usei depende do GNOME/Unity, e foi testado apenas no Ubuntu 12.04.

About lizardo

My hobby: figure out how systems are expected to work; induce them to work unexpectedly; and responsibly disclose.
This entry was posted in General, Portuguese and tagged . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s