Hola.

Estoy haciendo un script en Python para que se recompile automáticamente el módulo del kernel cada vez que se actualice éste (si es que se instaló VirtualBox usando su repositorio y no el que viene con openSUSE). De momento llevo ésto:

Código:
#!/usr/bin/python
# -*- coding: utf-8 -*-


from pyinotify import *
from Queue import Queue
import time
import subprocess
import random
import re


_DEPURACION_ACTIVA = True



class ProcesadorNotificacion (ProcessEvent):
	
	_DIRECTORIO_REGISTRO   = "/var/log/zypp"
	_ARCHIVO_REGISTRO       = "history"
	_RUTA_ARCHIVO_REGISTRO = os.path.join (_DIRECTORIO_REGISTRO, _ARCHIVO_REGISTRO)
	_MASCARA_DIRECTORIO    = IN_CREATE
	_MASCARA_ARCHIVO       = IN_MODIFY


	def __init__ (self, watchManager):
		if _DEPURACION_ACTIVA:
			print "Iniciando ProcesadorNotificacion"
			
		self._colaEventos  = Queue ()
		self._watchManager = watchManager
		
		try:
			# Abrir el archivo de registro en modo solo lectura
			self._fichero = open (self._RUTA_ARCHIVO_REGISTRO, "r")
		
			# Avanzar en el fichero hasta el final: solo interesan las líneas nuevas
			while True:
				linea = self._fichero.readline()
				if not linea:
					break
			
			# Iniciar un objeto Consumidor y añadir el observador del fichero del historial
			self._consumidor = Consumidor (self._colaEventos)
			self._consumidor.start ()
			self._watchManager.add_watch (self._RUTA_ARCHIVO_REGISTRO, self._MASCARA_ARCHIVO)
			
		except IOError:
			# Si aún no existe el fichero que se quiere observar
			# se observa el directorio que lo debería contener
			# a la espera de que se cree dicho fichero
			self._fichero         = None
			self._consumidor      = None
			self._watchDescriptor = self._watchManager.add_watch (self._DIRECTORIO_REGISTRO, _MASCARA_DIRECTORIO).get (self._DIRECTORIO_REGISTRO)
			
			if _DEPURACION_ACTIVA:
				print "\tProcesadorNotificacion: " + self._RUTA_ARCHIVO_REGISTRO + " no existe aún"


	def process_IN_CREATE (self, event):
		if _DEPURACION_ACTIVA:
			print "ProcesadorNotificacion (IN_CREATE): %s " % os.path.join (event.path, event.name)
		
		# Comprobar si el fichero que se acaba de crear es el que interesa
		if event.path == self._DIRECTORIO_REGISTRO and event.name == self._ARCHIVO_REGISTRO:
			try:
				self._consumidor = Consumidor (self._colaEventos)
				self._consumidor.start ()
				self._fichero = open (self._RUTA_ARCHIVO_REGISTRO, "r")
				self._watchManager.rm_watch (self._watchDescriptors)
				self._watchManager.add_watch (self._RUTA_ARCHIVO_REGISTRO, self._MASCARA_ARCHIVO)
			except IOError:
				if _DEPURACION_ACTIVA:
					print "ERROR: no se pudo abrir el archivo '" + self._RUTA_ARCHIVO_REGISTRO + "' para su monitorización"


	def process_IN_MODIFY (self, event):
		if _DEPURACION_ACTIVA:
			print "ProcesadorNotificacion (IN_MODIFY): %s " % os.path.join (event.path, event.name)
			
		self._colaEventos.put (self._fichero.readline ())

	"""
	QUIZÁS DEBERÍA CONTROLAR TAMBIÉN IN_DELETE SOBRE EL FICHERO
	"""
      
	def termina (self):
		if _DEPURACION_ACTIVA:
			print "ProcesadorNotificacion.termina ()"
			
		if self._fichero is not None:
			self._fichero.close ()
			
		if self._consumidor is not None:
			self._consumidor.termina ()
			self._colaEventos.put ("Terminar")



class Consumidor (threading.Thread):
  
	def __init__ (self, queue):
		if _DEPURACION_ACTIVA:
			print "Iniciado Consumidor"
			
		threading.Thread.__init__(self)
		self._colaEventos = queue
		self._terminar  = False
    
    
	def run (self):
		if _DEPURACION_ACTIVA:
			print "Consumidor.run (): Iniciando bucle de proceso"
		
		while not self._terminar:
			linea = self._colaEventos.get ()
			
			if _DEPURACION_ACTIVA:
				print "Procesando línea: " + linea
			
			"""
                        Líneas de prueba:

			2013-03-16 02:18:12|install|kernel-desktop|3.7.10-1.1.1|x86_64|2783:y2base|openSUSE-12.3-1.7|15ecf7915419c5b0fc620e62b935aee3a352da084ebc7512bb68043b7eae7423|
			2013-03-17 20:27:09|install|kernel-devel|3.7.10-1.1.1|noarch||repo-oss|1db8bc637a404d206f01b0a254eeb26713f0bdf2aa74dfa9ce2c38714d959ffc|
			2013-03-17 20:27:12|install|kernel-xen-devel|3.7.10-1.1.1|x86_64||repo-oss|337e97646062889a88d2c80800ea826286f74a958b1fa60f8d19aa1eaef78d1f|
			2013-03-17 20:27:12|install|kernel-desktop-devel|3.7.10-1.1.1|x86_64|root@jcsl.phenom|repo-oss|dcc7a1bcf807600586f18eb92fb4e3a07b1862121a4d3ca51d0486b5490b0cb6|
			2013-03-17 20:27:13|install|kernel-default-devel|3.7.10-1.1.1|x86_64||repo-oss|faad7fba66bf4a8de0b772efa2d922b1ab160055e37a28fadea102e998f3bce8|
			2013-03-17 20:27:14|install|kernel-syms|3.7.10-1.1.1|x86_64|root@jcsl.phenom|repo-oss|b555bbe9fff88463498fc32158641e64718af7c6564227662c36afbed5653389|
			"""
			kernel = re.match ("^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\|install\|kernel-(desktop|pae|default)(\|*\|)+", linea)
			if not kernel is None:
				print "\tIniciando compilación del módulo"
				#subprocess.call (["/etc/init.d/vboxdrv", "setup"])
				print "\tFinalizada la compilación del módulo"
			else:
				print "\tLínea no significativa: no se hace nada"
      
		if _DEPURACION_ACTIVA:
			print "Consumidor.run (): Finalizado bucle de proceso"


	def termina (self):
		if _DEPURACION_ACTIVA:
			print "Consumidor.termina ()"
			
		self._terminar = True



def main (args):
	watchManager           = WatchManager()
	procesadorNotificacion = ProcesadorNotificacion (watchManager)
	notificador            = Notifier (watchManager, procesadorNotificacion)

	while True:
		try:
			notificador.process_events()
			if notificador.check_events():
				# Leer los eventos notificados y añadirlos a la cola
				notificador.read_events()
		except KeyboardInterrupt:
			# Destruir la instacia de inotify cuando ocurra esta interrupción (detener monitorización)
			notificador.stop()
			procesadorNotificacion.termina ()
			break

    

if __name__ == '__main__':
	main(sys.argv)
¿Cómo lo veis? ¿Qué se os ocurre que pueda añadir (o que sobre)?

Un saludo.