Registrarse
Home
Foros
Miembros
Calendario
Normas
Ayuda

Foros de usuarios de openSUSE
Retroceder   ForoSUSE > Zona Técnica > Programación y Scripts > Scripts


Síguenos en Twitter Suscríbete a nuestras noticias Acompáñanos en Facebook

 
 
Herramientas Desplegado

Recompilar módulo de VirtualBox automáticamente.
  #1  
Antiguo 25-mar-2013, 23:24
jcsl jcsl está desconectado
Miembro FOROSuSE
 
Fecha de Ingreso: 18-mayo-2008
Versión: Tumbleweed
Mensajes: 2.104
Agradecimientos: 0
Agradecido 973 Veces en 587 Mensajes
Poder de Credibilidad: 13
jcsl llegará a ser famoso muy pronto
Recompilar módulo de VirtualBox automáticamente.

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.
Responder Citando
 

Marcadores

Etiquetas
modulo, python, virtualbox


(0 miembros y 1 visitantes)
 
Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado

Ir al Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
How-to VirtualBox. darkskimmer Virtualización 192 05-sep-2015 00:49
Problema con virtualbox en opensuse 11.4? Jonathan Miguel Software 9 09-jul-2012 19:28
falla la instalacion de virtualbox guest additions ramses_17 Virtualización 24 21-ene-2011 09:56
problemas de coma flotante con VirtualBox Master38 Virtualización 2 14-nov-2010 21:46
problemas con virtualbox 3.2 (Oracle VM Virtualbox) blaw La cafetería 1 23-may-2010 09:15



Síguenos en Twitter Suscríbete a nuestras noticias Acompáñanos en Facebook


La franja horaria es GMT +2. Ahora son las 17:36.
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.

Esta página está bajo una licencia de Creative Commons, salvo que no se indique lo contrario.
Creative Commons License

Valid CSS!

Diseño por:Designed by: vbdesigns.devbdesigns.de 
Contáctenos - ForoSUSE - Archivo - Declaración de Privacidad - Arriba