[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