[Oval-commits] r200 - in trunk/oval-agent: . oval oval/ovalHttpClient

Pavel Vinogradov blaze-guest at alioth.debian.org
Thu Aug 23 15:59:00 UTC 2007


Author: blaze-guest
Date: 2007-08-23 15:59:00 +0000 (Thu, 23 Aug 2007)
New Revision: 200

Added:
   trunk/oval-agent/oval/ovalHttpClient/
   trunk/oval-agent/oval/ovalHttpClient/__init__.py
   trunk/oval-agent/oval/ovalHttpClient/ovalHttpClient.py
Removed:
   trunk/oval-agent/oval/ovalHttpClient/__init__.py
   trunk/oval-agent/oval/ovalHttpClient/ovalHttpClient.py
   trunk/oval-agent/ovalHttpClient/
Log:
Move ovalHttpCLietn to oval

Copied: trunk/oval-agent/oval/ovalHttpClient (from rev 171, trunk/oval-agent/ovalHttpClient)

Deleted: trunk/oval-agent/oval/ovalHttpClient/__init__.py
===================================================================

Copied: trunk/oval-agent/oval/ovalHttpClient/__init__.py (from rev 199, trunk/oval-agent/ovalHttpClient/__init__.py)
===================================================================
--- trunk/oval-agent/oval/ovalHttpClient/__init__.py	                        (rev 0)
+++ trunk/oval-agent/oval/ovalHttpClient/__init__.py	2007-08-23 15:59:00 UTC (rev 200)
@@ -0,0 +1,13 @@
+#
+# __init__.py: defines this directory as the 'oval-agent' package
+#
+######################################################################
+#
+# (c) 2007 Pavel Vinogradov                                                                                                       
+# Licensed under the GNU General Public License version 2.
+#
+######################################################################
+
+__all__ = ['ovalHttpClient']
+__version__ = 0.5
+version = 0.2

Deleted: trunk/oval-agent/oval/ovalHttpClient/ovalHttpClient.py
===================================================================
--- trunk/oval-agent/ovalHttpClient/ovalHttpClient.py	2007-08-20 15:09:24 UTC (rev 171)
+++ trunk/oval-agent/oval/ovalHttpClient/ovalHttpClient.py	2007-08-23 15:59:00 UTC (rev 200)
@@ -1,35 +0,0 @@
-import urllib, time
-
-global logger
-
-class OvalHttpClient:
-	version = 0.1
-	UserAgent = "OvalHttpClient/%d" % version
-	
-	def __init__(self, config, logger):
-		self.server = config['server']
-		self.port = int(config['port'])
-		self.baseurl = config['baseurl']
-		self.check_interval = int(config['check_interval'])
-		self.workdir = config['workdir']
-		self.logger = logger
-		
-	def fetchIndex(self):
-		url = "http://%s:%d%s" % (self.server, self.port, self.baseurl)
-		self.logger.debug ("Fetch: %s" % url)
-		index = urllib.urlopen (url)
-		data = index.read()
-		
-		file = open('%s/definitions.xml' % self.workdir, 'w')
-		file.write(data)
-		file.close()
-		
-	def run(self):
-		while 1:
-			self.logger.debug ('Check updates on server')
-			try:
-				self.fetchIndex()
-			except IOError, e:
-				self.logger.info('Server not available %s' % str(e))
-			self.logger.debug ('Go to sleep')
-			time.sleep(60 * self.check_interval)			
\ No newline at end of file

Copied: trunk/oval-agent/oval/ovalHttpClient/ovalHttpClient.py (from rev 199, trunk/oval-agent/ovalHttpClient/ovalHttpClient.py)
===================================================================
--- trunk/oval-agent/oval/ovalHttpClient/ovalHttpClient.py	                        (rev 0)
+++ trunk/oval-agent/oval/ovalHttpClient/ovalHttpClient.py	2007-08-23 15:59:00 UTC (rev 200)
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+#                                                                                                                                              
+# Written by Pavel Vinogradov
+# Licensed under the GNU General Public License version 2.
+
+""" Client class for interacting with oval-server over HTTP protocol """
+
+import urllib, urllib2, time
+import httplib, mimetypes
+import os, re, sys
+import exceptions
+
+class OvalHttpClient:
+	version = 0.1
+	UserAgent = "OvalHttpClient/%d" % version
+	
+	def __init__(self, config, logger):
+		"""Initializethe instance
+		
+		@type config: C(dict)
+		@param config: Dict with config values
+		@type logger: C(class)
+		@param logger: instance of logging class
+		"""
+		
+		#Strore config values in self-fields 
+		self.server = config['server']
+		self.port = int(config['port'])
+		self.baseurl = config['baseurl']
+		self.check_interval = int(config['check_interval'])
+		self.workdir = config['workdir']
+		self.url = "http://%s:%d%s" % (self.server, self.port, self.baseurl)
+		self.logger = logger
+		
+		self.definitionsPath = '%s/definitions.xml' % self.workdir
+		self.systemCharacteristic = '%s/system-characteristic.xml' % self.workdir
+		
+		self.evaluationResult = {}
+		 
+	def getDefinitions(self):
+		"""Request definitions file from oval-server
+		
+		Connect to oval-server and send GET / HTTP/1.1 request.
+		In response we must receive definitions file that would stored in self.workdir
+		
+		"""   
+		#TODO: add agent header, use definitions hash
+		#http://www.diveintopython.org/http_web_services/index.html
+		self.logger.debug ("Fetch: %s" % self.url)
+		try:
+			index = urllib2.urlopen (self.url)
+			data = index.read()
+		
+			file = open(self.definitionsPath, 'w')
+			file.write(data)
+			file.close()
+		except urllib2.URLError, e:
+			self.logger.warning ('Cant fetch file %s' % str(e))
+			self.logger.warning ('Server %s not available.' % self.server)
+		except IOError, e:
+			self.logger.critical ('Cant write to file %s : %s' % (self.definitionsPath, str(e)))
+		
+	def postResult(self):
+		""" Send result of evaluation back to server
+		
+		Generate POST / HTTP/1.1 request to server. 
+		Use evaluation result as field, value data in POST request.
+		"""
+		self.logger.debug('Send response to server')
+		if self.evaluationResult:
+			#try:
+			fp = urllib2.urlopen(self.url, urllib.urlencode(self.evaluationResult))
+			fp.geturl()
+			#except BadStatusLine, e:
+			#	self.logger.warning ('Get bas response from server: %s' % str(e))
+		else:
+			self.logger.warning ('None to report.')
+	
+	def parse (self, result):
+		""" Parse output of OVAL interpretator
+			
+		Search for definitions evaluation result and extract definitions id and evaluation status.
+		@type result: C(string)
+		@param result: ovaldi output
+		""" 
+		status = []
+		
+		pattern = re.compile(r'oval:org\.debian:def:(\d{1,5}) *([true|false])')
+		
+		for line in result.split('\n'):
+			result = pattern.search (line)
+			if result:
+				status.append((result.groups()[0], result.groups()[1])) 
+		return status
+			
+	def evaluate(self):
+		""" Evaluate received OVAL definitions
+		
+		Use ovaldi interpretator to evaluate received OVAL definitions.
+		Interpretator output stored and parsed to dict
+		
+		""" 
+		self.evaluationResult = {}
+		self.logger.debug ('Start definitions evaluation')
+		try:
+			os.chdir(self.workdir)
+			result = os.popen('ovaldi -m -o %s/definitions.xml' % self.workdir)
+			res = result.read()
+			self.evaluationResult = self.parse (res)
+		except OSError, e:
+			self.logger.critical ('Cant chdir to directory %s : %s' % (self.workdir, str(e)))
+			
+	def run(self):
+		""" Fetch definitions, evaluate it and report result back to server.
+		""" 
+		while 1:
+			self.logger.debug ('Check updates on server')
+			
+			self.getDefinitions()
+			self.evaluate()
+			self.postResult()
+		
+			self.logger.debug ('Go to sleep')
+			time.sleep(60 * self.check_interval)			
\ No newline at end of file




More information about the Oval-commits mailing list