[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