Back-End

23 abr, 2012

Utilizando a API Watchdog em Python

Publicidade

Neste artigo, vou mostrar a instalação e um exemplo simples de implementação em Python com a API Watchdog. O ambiente utilizado aqui foi o Arch Linux e Bash Shell.

O Watchdog é uma API e um utilitário do Shell para monitorar eventos no arquivo de sistema. Em outras palavras, um diretório é passado como argumento para essa API que passa a ser observado pelo seu programa gerando alertas sobre eventos de criação, deleção, modificação e movimentação de arquivos e diretórios. Lembre-se de que só o conteúdo do diretório inicialmente especificado e seus sub-diretórios serão observados.

A instalação no Linux é bem simples e pode ser feita de várias formas:

1) Via o instalador pip:

$ sudo pip install watchdog

2) Via o instalador easy_install:

$ sudo easy_install watchdog

3) Git:

$ git clone https://github.com/gorakhargosh/watchdog.git
$ cd watchdog
$ sudo python setup.py install

Apesar de mostrar apenas a instalação e uso da API no Linux, ela também é disponível para Windows, Mac OS X, BSD e Sistemas Operacionais independentes.

Um código exemplo da API (retirado do github):

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path=sys.argv[1], recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()

Nesse exemplo, podemos observar uma implementação simples de um sistema de log do diretório. Salve esse código exemplo em sua home com o nome exemplo.py, crie uma pasta com o nome “vigiando” na sua home e execute o seguinte comando:

$ python exemplo.py vigiando

Agora, crie arquivos na pasta vigiando, diretórios e explore outros eventos da implementação e observe o resultado. Veja este exemplo de ações no meu diretório(utilize Ctrl+C para encerrar o programa):

$ pwd
/home/joaovrmaia/vigiando
$ touch a
$ mkdir pasta
$ mv a pasta/
$ rm pasta/a
$ mv pasta/ pasta2

A seguir, o resultado do programa:

2011-09-03 23:09:28 - Created file: /home/joaovrmaia/vigiando/a
2011-09-03 23:09:28 - Modified file: /home/joaovrmaia/vigiando/a
2011-09-03 23:15:51 - Created directory: /home/joaovrmaia/vigiando/pasta
2011-09-03 23:16:06 - Moved file: from /home/joaovrmaia/vigiando/a to /home/joaovrmaia/vigiando/pasta/a
2011-09-03 23:16:13 - Deleted file: /home/joaovrmaia/vigiando/pasta/a
2011-09-03 23:16:29 - Moved directory: from /home/joaovrmaia/vigiando/pasta to /home/joaovrmaia/vigiando/pasta

Conheci essa API através de uma necessidade e foi muito útil para meu projeto de graduação, que estou revisando (já apresentei e fui aprovado \o/) ainda antes de divulgar no blog. Espero que essa dica ajude alguém um dia e fica a cargo do leitor estudar o código a seguir e criar sua própria implementação.

import sys
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class ManipuladorDeEventos(FileSystemEventHandler):
def catch_all_handler(self, event):
pass

def on_moved(self, event):
print "MOVED " + str(event)
self.catch_all_handler(event)

def on_created(self, event):
print "CREATED " + str(event)
self.catch_all_handler(event)

def on_deleted(self, event):
print "DELETED " + str(event)
self.catch_all_handler(event)

def on_modified(self, event):
print "MODIFIED " + str(event)
self.catch_all_handler(event)

eventos = ManipuladorDeEventos()
observador = Observer()
observador.schedule(eventos, sys.argv[1], recursive=False)
observador.start()

try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observador.unschedule(eventos)
observador.stop()
observador.join()

print "FIM"

Até o próximo artigo… o/