[Oval-commits] r189 - trunk/oval-agent/ovalHttpClient

Pavel Vinogradov blaze-guest at alioth.debian.org
Tue Aug 21 09:42:59 UTC 2007


Author: blaze-guest
Date: 2007-08-21 09:42:59 +0000 (Tue, 21 Aug 2007)
New Revision: 189

Modified:
   trunk/oval-agent/ovalHttpClient/ovalHttpClient.py
Log:
Add documentation and exception handlers

Modified: trunk/oval-agent/ovalHttpClient/ovalHttpClient.py
===================================================================
--- trunk/oval-agent/ovalHttpClient/ovalHttpClient.py	2007-08-21 09:42:28 UTC (rev 188)
+++ trunk/oval-agent/ovalHttpClient/ovalHttpClient.py	2007-08-21 09:42:59 UTC (rev 189)
@@ -2,16 +2,28 @@
 #                                                                                                                                              
 # 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
-import re
+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']
@@ -23,27 +35,54 @@
 		self.definitionsPath = '%s/definitions.xml' % self.workdir
 		self.systemCharacteristic = '%s/system-characteristic.xml' % self.workdir
 		
-		self.evaluationResult = {'1341' : 't', '1353' : 't', '1245' : 'f'}
+		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)
-		index = urllib2.urlopen (self.url)
-		print index.info()
-		data = index.read()
+		try:
+			index = urllib2.urlopen (self.url)
+			data = index.read()
 		
-		file = open(self.definitionsPath, 'w')
-		file.write(data)
-		file.close()
-		result = self.evaluate()
-		self.postResult()
+			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')
-		fp = urllib2.urlopen(self.url, urllib.urlencode(self.evaluationResult))
-		fp.geturl()
+		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])')
@@ -55,18 +94,31 @@
 		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')
-		os.chdir(self.workdir)
-		result = os.popen('ovaldi -m -o %s/definitions.xml' % self.workdir)
-		res = result.read()
-		self.evaluationResult = self.parse (res)
-		
+		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')
-			try:
-				self.getDefinitions()
-			except IOError, e:
-				self.logger.info('Server not available %s' % str(e))
+			
+			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