source: TI12-security/trunk/python/ndg.security.client/ndg/security/client/LogClient.py @ 3104

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg.security.client/ndg/security/client/LogClient.py@3104
Revision 3104, 7.1 KB checked in by pjkersha, 12 years ago (diff)

ndg.security.client/ndg/security/client/LogClient.py: started SOAPHandler log handler class - will enable web service to integrate into standard Python logging framework.

  • Property svn:keywords set to Id
Line 
1#!/usr/bin/env python
2
3"""NDG Logging client - client interface class to NDG Logging WS
4
5NERC Data Grid Project
6
7This software may be distributed under the terms of the Q Public License,
8version 1.0 or later.
9"""
10__author__ = "P J Kershaw"
11__date__ = "12/05/06"
12__copyright__ = "(C) 2007 STFC & NERC"
13__license__ = \
14"""This software may be distributed under the terms of the Q Public
15License, version 1.0 or later."""
16__contact__ = "P.J.Kershaw@rl.ac.uk"
17__revision__ = "$Id$"
18
19from ZSI import ServiceProxy
20from ZSI.wstools.Utility import HTTPResponse
21import sys
22import os
23import logging
24
25from LogIO import *
26
27
28class SOAPHandler(Handler):
29    """
30    A handler class which writes logging records, appropriately formatted,
31    over a SOAP interface to logging web service
32    """
33    def __init__(self, *args, **kw):
34        """Initialize the handler.
35
36        """
37        Handler.__init__(self)
38        self._logClnt = LogClient(*args, **kw)
39
40    def emit(self, record):
41        """
42        Emit a record.
43
44        If a formatter is specified, it is used to format the record.
45        The record is then written to the stream with a trailing newline
46        [N.B. this may be removed depending on feedback]. If exception
47        information is present, it is formatted using
48        traceback.print_exception and appended to the stream.
49        """
50        try:
51            msg = self.format(record)
52            fs = "%s\n"
53            if not hasattr(types, "UnicodeType"): #if no unicode support...
54                self.stream.write(fs % msg)
55            else:
56                try:
57                    self.stream.write(fs % msg)
58                except UnicodeError:
59                    self.stream.write(fs % msg.encode("UTF-8"))
60            self.flush()
61        except (KeyboardInterrupt, SystemExit):
62            raise
63        except:
64            self.handleError(record)
65
66#_____________________________________________________________________________
67class LogClientError(Exception):
68    """Exception handling for Logging class"""
69    def __init__(self, msg):
70        self.__msg = msg
71         
72    def __str__(self):
73        return self.__msg
74
75
76#_____________________________________________________________________________
77class LogClient(object):
78   
79    #_________________________________________________________________________
80    def __init__(self, 
81                 uri=None,
82                 signingCertFilePath=None,
83                 signingPriKeyFilePath=None,
84                 signingPriKeyPwd=None, 
85                 traceFile=None):
86        """
87        uri:                   URI for Logging WS.  Setting
88                               it will set the Service Proxy
89        traceFile:             set to file object such as sys.stderr to
90                               give extra WS debug information"""
91
92        self.__srvPx = None
93        self.__uri = None
94       
95       
96        if uri:
97            self.__setWSDL(uri)
98           
99        self.__traceFile = traceFile
100       
101        self.__signingCertFilePath = signingCertFilePath
102        self.__signingPriKeyFilePath = signingPriKeyFilePath
103        self.__signingPriKeyPwd = signingPriKeyPwd
104
105         
106        # Instantiate Logging WS proxy
107        if self.__uri:
108            self.serviceProxy()
109       
110
111    #_________________________________________________________________________
112    def __setWSDL(self, uri):
113       
114        if not isinstance(uri, basestring):
115            raise LogClientError, "Logging WSDL URI must be a valid string"
116       
117        self.__uri = uri
118       
119    uri = property(fset=__setURI,doc="Set Logging WSDL URI")
120   
121       
122    #_________________________________________________________________________
123    def serviceProxy(self, uri=None):
124        """Set the WS proxy for the Logging"""
125        if uri:
126            self.__setURI(uri)
127
128        try:
129            self.__srvPx = ServiceProxy(self.__uri, 
130                                        use_uri=True, 
131                                        tracefile=self.__traceFile)
132        except HTTPResponse, e:
133            raise LogClientError, \
134                "Error initialising URI Service Proxy for \"%s\": %s %s" % \
135                (self.__uri, e.status, e.reason)
136
137        except Exception, e:
138            raise LogClientError, \
139                    "Initialising URI Service Proxy: " + str(e)
140
141                                   
142    #_________________________________________________________________________
143    def debug(self, msg):
144        """Send a debug message to the log"""
145
146        try:
147            debugReq = DebugReq(msg=msg)                   
148            debugReq.sign(self.__signingPriKeyFilePath,
149                          self.__signingPriKeyPwd,
150                          self.__signingCertFilePath)
151       
152            resp = self.__srvPx.debug(debugReq=debugReq())
153           
154        except Exception, e:
155            raise LogClientError("Error sending debug message: " + str(e))
156                             
157        if resp['debugResp']:
158            raise LogClientError(resp['debugResp'])
159
160                                   
161    #_________________________________________________________________________
162    def info(self, msg):
163        """Send a information message to the log"""
164
165        try:   
166            infoReq = InfoReq(msg=msg)                   
167            infoReq.sign(self.__signingPriKeyFilePath,
168                         self.__signingPriKeyPwd,
169                         self.__signingCertFilePath)
170       
171            resp = self.__srvPx.info(infoReq=infoReq())
172           
173        except Exception, e:
174            raise LogClientError("Error sending info message: " + str(e))
175                             
176        if resp['infoResp']:
177            raise LogClientError(resp['infoResp'])
178
179                                   
180    #_________________________________________________________________________
181    def warning(self, msg):
182        """Send a warning message to the log"""
183
184        try:   
185            warningReq = WarningReq(msg=msg)                     
186            warningReq.sign(self.__signingPriKeyFilePath,
187                            self.__signingPriKeyPwd,
188                            self.__signingCertFilePath)
189       
190            resp = self.__srvPx.warning(warningReq=warningReq())
191           
192        except Exception, e:
193            raise LogClientError("Error sending warning message: " + str(e))
194                             
195        if resp['warningResp']:
196            raise LogClientError(resp['warningResp'])
197
198                                   
199    #_________________________________________________________________________
200    def error(self, msg):
201        """Send a error message to the log"""
202
203        try:   
204            errorReq = ErrorReq(msg=msg)                     
205            errorReq.sign(self.__signingPriKeyFilePath,
206                          self.__signingPriKeyPwd,
207                          self.__signingCertFilePath)
208       
209            resp = self.__srvPx.error(errorReq=errorReq())
210           
211        except Exception, e:
212            raise LogClientError("Error sending error message: " + str(e))
213                             
214        if resp['errorResp']:
215            raise LogClientError(resp['errorResp'])
216
217
218     
Note: See TracBrowser for help on using the repository browser.