Changeset 1236 for TI12-security


Ignore:
Timestamp:
22/06/06 17:32:38 (13 years ago)
Author:
pjkersha
Message:

Tests/LogClientTest?.py: LogServer? WS client unit tests

Tests/LogTest?.py: Log unit tests

ndgSetup.sh: added optional environment variable setting for security WS ports: NDG_CA_PORT_NUM,
NDG_LOG_PORT_NUM, and NDG_GK_PORT_NUM

share/ndg-sm, share/ndg-log, share/ndg-gk and share/ndg-ca: SysV init scripts for the Session Manager, NDG Log,
Gatekeeper and Simple CA WSs.

conf/gatekeeperProperties.xml: include basic settings

NDG/LogIO.py: interface for Log WS messages - not checked in previously (!)

bin/AttAuthorityServer.py, bin/LogServer.py, bin/SessionMgrServer.py, bin/GatekeeperServer.py and
bin/SimpleCAServer.py: all working with ability to fork a new process for the respective server. Debug code
allows error messages to be reported to a temp file if required - set logForkErr flag in the code to True.

Location:
TI12-security/trunk/python
Files:
6 added
9 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/Tests/LogTest.py

    r917 r1236  
    1313import unittest 
    1414 
     15from NDG.Log import * 
     16 
    1517class LogTestCase(unittest.TestCase): 
    1618 
    17     def setup(self): 
     19    def setUp(self): 
    1820        self.log = Log(logFilePath="./ndg.log", console=True) 
    19          
     21 
    2022    def test(self): 
    2123         
  • TI12-security/trunk/python/bin/AttAuthorityServer.py

    r1227 r1236  
    179179                      default=os.path.join(propFileDir, propFilename), 
    180180                      help=\ 
    181 """properties file path - default is $NDG_DIR/%s or ./%s if NDG_DIR is not 
    182 set""" % (propFilename, propFilename)) 
     181"""properties file path - default is $NDG_DIR/conf/%s or ./%s if NDG_DIR is 
     182not set""" % (propFilename, propFilename)) 
    183183 
    184184 
     
    236236            sys.exit(1) 
    237237             
    238         # Run server in child process 
    239         fork()     
    240          
     238         
     239        # Set this flag to True to catch errors raised in the new process 
     240        # in a log.  Normally stderr is re-directed to /dev/null to avoid 
     241        # conflists with the parent process     
     242        logForkErr = False 
     243        if logForkErr: 
     244            import tempfile 
     245            errLogH, errLogFilePath = tempfile.mkstemp(".err","AttAuthority-") 
     246        else: 
     247            errLogFilePath = '/dev/null' 
     248 
     249        # Run server in separate process 
     250        fork(stderr=errLogFilePath)     
     251         
  • TI12-security/trunk/python/bin/GatekeeperServer.py

    r968 r1236  
    7575 
    7676#_____________________________________________________________________________ 
     77def runInForegnd(): 
     78    """Run Log Server in the same process as this script""" 
     79         
     80    print "Gatekeeper Server listening..." 
     81    try: 
     82         AsServer(port=options.port,  
     83                  services=(gatekeeper(gatekeeperSrv, debug=options.debug),),  
     84                  RequestHandlerClass=GatekeeperSOAPRequestHandler) 
     85 
     86    except KeyboardInterrupt: 
     87        sys.exit(0) 
     88 
     89    except socket.error, e: 
     90        print >>sys.stderr, "Gatekeeper Server socket error: %s" % e[1] 
     91        sys.exit(1) 
     92         
     93    except Exception, e: 
     94        print >>sys.stderr, "Gatekeeper Server: %s" % str(e) 
     95        sys.exit(1)         
     96 
     97 
     98#_____________________________________________________________________________ 
     99def fork(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): 
     100    """Run Log Server in a separate child process 
     101     
     102    Thanks to Jorgen Hermann and user contributors for fork code 
     103     
     104    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 
     105     
     106    """ 
     107     
     108    try:  
     109        pid = os.fork()  
     110        if pid > 0: 
     111            # exit first parent 
     112            sys.exit(0)  
     113    except OSError, e:  
     114        print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)  
     115        sys.exit(1) 
     116 
     117    # Decouple from parent environment 
     118    os.chdir("/") # Allows for current dir path being renamed or deleted 
     119    os.setsid()  
     120    os.umask(0)  
     121     
     122    # Redirect standard file descriptors 
     123    si = file(stdin, 'r') 
     124    so = file(stdout, 'a+') 
     125    se = file(stderr, 'a+', 0) 
     126     
     127    sys.stdout.flush() 
     128    sys.stderr.flush() 
     129 
     130    os.dup2(si.fileno(), sys.stdin.fileno()) 
     131    os.dup2(so.fileno(), sys.stdout.fileno()) 
     132    os.dup2(se.fileno(), sys.stderr.fileno()) 
     133     
     134    # Do second fork 
     135    try:  
     136        pid = os.fork()  
     137        if pid > 0: 
     138            # exit from second parent 
     139            sys.exit(pid)  
     140    except OSError, e:  
     141        print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)  
     142        sys.exit(1)  
     143 
     144    # start the daemon main loop 
     145    try: 
     146         AsServer(port=options.port,  
     147                  services=(gatekeeper(gatekeeperSrv, debug=options.debug),),  
     148                  RequestHandlerClass=GatekeeperSOAPRequestHandler) 
     149 
     150    except socket.error, e: 
     151        print >>sys.stderr, "Gatekeeper Server socket error: %s" % e[1] 
     152        sys.exit(1) 
     153         
     154    except Exception, e: 
     155        print >>sys.stderr, "Gatekeeper Server: %s" % str(e) 
     156        sys.exit(1)         
     157 
     158 
     159#_____________________________________________________________________________ 
    77160if __name__ == '__main__': 
    78161 
    79162    parser = optparse.OptionParser() 
     163     
     164    # Port may be set from an environment variable.  Note that this will be 
     165    # overridden if the port command line argument is set  
     166    gkPortNumEnvVarName = 'NDG_GK_PORT_NUM' 
     167    defaultPort = 5200 
     168     
     169    initPort = gkPortNumEnvVarName in os.environ and \ 
     170                        int(os.environ[gkPortNumEnvVarName]) or defaultPort 
     171     
    80172    parser.add_option("-p",  
    81173                      "--port",  
    82174                      dest="port", 
    83175                      type="int", 
    84                       default=5200, 
    85                       help="specify a port number to override the default") 
    86  
     176                      default=initPort, 
     177                      help=\ 
     178"specify a port number - default is %d or set environment variable \"%s\"" % \ 
     179                                          (defaultPort, gkPortNumEnvVarName)) 
     180 
     181    propFileDir = 'NDG_DIR' in os.environ and \ 
     182                            os.path.join(os.environ['NDG_DIR'], "conf") or "." 
     183 
     184    propFilename = 'gatekeeperProperties.xml' 
    87185    parser.add_option("-f",  
    88186                      "--file", 
    89187                      dest="propFilePath", 
    90188                      help=\ 
    91    "properties file path - default is $NDG_DIR/conf/gatekeeperProperties.xml") 
     189"""properties file path - default is $NDG_DIR/conf/%s or ./%s if NDG_DIR is 
     190not set""" % (propFilename, propFilename)) 
     191 
     192    foregndFlags = ("-i", "--foreground") 
     193    parser.add_option(action="store_true", 
     194                      dest="foregndProc", 
     195                      default=False, 
     196                      help=\ 
     197"run server as process in the foreground.  If not set, fork a child process", 
     198                      *foregndFlags) 
    92199 
    93200    parser.add_option("-d",  
     
    96203                      action="store_true", 
    97204                      default=False, 
    98                       help="set to stop in debugger on receipt of WS request") 
     205                      help=\ 
     206"set to stop in debugger on receipt of WS request.  %s flag must be set also"\ 
     207                                            % '/'.join(foregndFlags)) 
    99208 
    100209    (options, args) = parser.parse_args() 
    101  
    102  
    103     if options.propFilePath is None: 
    104         # Check in installation area otherwise assume local directory 
    105         if 'NDG_DIR' in os.environ: 
    106             propFileDir = os.path.join(os.environ['NDG_DIR'], "conf") 
    107         else: 
    108             propFileDir = "." 
    109  
    110         options.propFilePath = os.path.join(propFileDir,  
    111                                             'gatekeeperProperties.xml') 
    112210 
    113211 
     
    117215 
    118216    except Exception, e: 
    119         sys.stderr.write("Initialising Gatekeeper: %s\n" % str(e)) 
    120         sys.exit(1) 
    121      
    122     print "Gatekeeper Server listening..." 
    123     try: 
    124          AsServer(port=options.port,  
    125                   services=[gatekeeper(gatekeeperSrv, debug=options.debug)],  
    126                   RequestHandlerClass=GatekeeperSOAPRequestHandler) 
    127  
    128     except KeyboardInterrupt: 
    129         sys.exit(0) 
    130  
    131     except socket.error, e: 
    132         sys.stderr.write("Gatekeeper Server socket error: %s\n" % \ 
    133                          e[1]) 
    134         sys.exit(1) 
    135          
    136     except Exception, e: 
    137         sys.stderr.write("Gatekeeper Server: %s\n" % str(e)) 
    138         sys.exit(1) 
    139          
     217        print >>sys.stderr, "Initialising Gatekeeper: %s" % str(e) 
     218        sys.exit(1) 
     219     
     220 
     221    if options.foregndProc: 
     222        runInForegnd() 
     223    else: 
     224        if options.debug: 
     225            print >>sys.stderr, "%s must be set for debug option" % \ 
     226                                                        '/'.join(foregndFlags) 
     227            parser.print_help() 
     228            sys.exit(1) 
     229         
     230        # Set this flag to True to catch errors raised in the new process 
     231        # in a log.  Normally stderr is re-directed to /dev/null to avoid 
     232        # conflists with the parent process     
     233        logForkErr = False 
     234        if logForkErr: 
     235            import tempfile 
     236            errLogH, errLogFilePath = tempfile.mkstemp(".err",  
     237                                                       "GatekeeperServer-") 
     238        else: 
     239            errLogFilePath = '/dev/null' 
     240 
     241        # Run server in separate process 
     242        fork(stderr=errLogFilePath)     
     243         
  • TI12-security/trunk/python/bin/LogServer.py

    r968 r1236  
    7575 
    7676#_____________________________________________________________________________ 
     77def runInForegnd(): 
     78    """Run Log Server in the same process as this script""" 
     79         
     80    print "Logging Server listening..." 
     81    try: 
     82         AsServer(port=options.port,  
     83                  services=(log(logSrv, debug=options.debug),),  
     84                  RequestHandlerClass=LogSOAPRequestHandler) 
     85 
     86    except KeyboardInterrupt: 
     87        sys.exit(0) 
     88 
     89    except socket.error, e: 
     90        print >>sys.stderr, "Log Server socket error: %s" % e[1] 
     91        sys.exit(1) 
     92 
     93    except Exception, e: 
     94        print >>sys.stderr, "Log Server: %s" % e 
     95        sys.exit(1) 
     96         
     97 
     98#_____________________________________________________________________________ 
     99def fork(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): 
     100    """Run Log Server in a separate child process 
     101     
     102    Thanks to Jorgen Hermann and user contributors for fork code 
     103     
     104    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 
     105     
     106    """ 
     107     
     108    try:  
     109        pid = os.fork()  
     110        if pid > 0: 
     111            # exit first parent 
     112            sys.exit(0)  
     113    except OSError, e:  
     114        print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)  
     115        sys.exit(1) 
     116 
     117    # Decouple from parent environment 
     118    os.chdir("/") # Allows for current dir path being renamed or deleted 
     119    os.setsid()  
     120    os.umask(0)  
     121     
     122    # Redirect standard file descriptors 
     123    si = file(stdin, 'r') 
     124    so = file(stdout, 'a+') 
     125    se = file(stderr, 'a+', 0) 
     126     
     127    sys.stdout.flush() 
     128    sys.stderr.flush() 
     129 
     130    os.dup2(si.fileno(), sys.stdin.fileno()) 
     131    os.dup2(so.fileno(), sys.stdout.fileno()) 
     132    os.dup2(se.fileno(), sys.stderr.fileno()) 
     133     
     134    # Do second fork 
     135    try:  
     136        pid = os.fork()  
     137        if pid > 0: 
     138            # exit from second parent 
     139            sys.exit(pid)  
     140    except OSError, e:  
     141        print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)  
     142        sys.exit(1)  
     143 
     144    # start the daemon main loop 
     145    try: 
     146         AsServer(port=options.port,  
     147                  services=(log(logSrv, debug=options.debug),),  
     148                  RequestHandlerClass=LogSOAPRequestHandler) 
     149 
     150    except socket.error, e: 
     151        print >>sys.stderr, "Log Server socket error: %s" % e[1] 
     152        sys.exit(1) 
     153 
     154    except Exception, e: 
     155        print >>sys.stderr, "Log Server: %s" % e 
     156        sys.exit(1) 
     157 
     158 
     159#_____________________________________________________________________________ 
    77160if __name__ == '__main__': 
    78161 
    79162    parser = optparse.OptionParser() 
     163 
     164 
     165    # Port may be set from an environment variable.  Note that this will be 
     166    # overridden if the port command line argument is set  
     167    logPortNumEnvVarName = 'NDG_LOG_PORT_NUM' 
     168    defaultPort = 5100 
     169     
     170    initPort = logPortNumEnvVarName in os.environ and \ 
     171                        int(os.environ[logPortNumEnvVarName]) or defaultPort 
     172                         
    80173    parser.add_option("-p",  
    81174                      "--port",  
    82175                      dest="port", 
    83176                      type="int", 
    84                       default=5100, 
    85                       help="specify a port number to override the default") 
     177                      default=initPort, 
     178                      help=\ 
     179"specify a port number - default is %d or set environment variable \"%s\"" % \ 
     180                                          (defaultPort, logPortNumEnvVarName)) 
     181 
     182 
     183    logFileDir = 'log' 
     184    logFilename = 'ndg.log' 
     185    logFileDirPath = 'NDG_DIR' in os.environ and \ 
     186                        os.path.join(os.environ['NDG_DIR'], logFileDir) or "." 
    86187 
    87188    parser.add_option("-f",  
    88189                      "--log-file", 
    89190                      dest="logFilePath", 
    90                       help=\ 
    91                 "file path for log file to log to - default is $NDG_DIR/log") 
     191                      default=os.path.join(logFileDirPath, logFilename), 
     192                      help=\ 
     193"""file path for log file - default is $NDG_DIR/%s/%s or /tmp/%s if NDG_DIR 
     194is not set""" % (logFileDir, logFilename, logFilename)) 
     195     
     196    foregndFlags = ("-i", "--foreground") 
     197    parser.add_option(action="store_true", 
     198                      dest="foregndProc", 
     199                      default=False, 
     200                      help=\ 
     201"run server as process in the foreground.  If not set, fork a child process", 
     202                      *foregndFlags) 
    92203 
    93204    parser.add_option("-d",  
     
    96207                      action="store_true", 
    97208                      default=False, 
    98                       help="set to stop in debugger on receipt of WS request") 
     209                      help=\ 
     210"set to stop in debugger on receipt of WS request.  %s flag must be set also"\ 
     211                                            % '/'.join(foregndFlags)) 
     212 
     213    parser.add_option("-c",  
     214                      "--console", 
     215                      dest="console", 
     216                      action="store_true", 
     217                      default=False, 
     218                      help=\ 
     219"echo log messages to stderr at console window.  %s flag must be set also" \ 
     220                                            % '/'.join(foregndFlags)) 
    99221 
    100222    (options, args) = parser.parse_args() 
     
    103225    # Create server instance at start up 
    104226    try: 
    105         logSrv = Log(logFilePath=options.logFilePath) 
     227        logSrv = Log(logFilePath=options.logFilePath, console=options.console) 
    106228 
    107229    except Exception, e: 
    108         sys.stderr.write("Initialising Logging: %s\n" % str(e)) 
    109         sys.exit(1) 
    110      
    111     print "Logging Server listening..." 
    112     try: 
    113          AsServer(port=options.port,  
    114                   services=[log(logSrv, debug=options.debug)],  
    115                   RequestHandlerClass=LogSOAPRequestHandler) 
    116  
    117     except KeyboardInterrupt: 
    118         sys.exit(0) 
    119  
    120     except socket.error, e: 
    121         sys.stderr.write("Logging Server socket error: %s\n" % \ 
    122                          e[1]) 
    123         sys.exit(1) 
    124          
    125     except Exception, e: 
    126         sys.stderr.write("Logging Server: %s\n" % str(e)) 
    127         sys.exit(1) 
    128          
     230        print >>sys.stderr, "Initialising Logging: %s\n" % str(e) 
     231        sys.exit(1) 
     232 
     233    if options.foregndProc: 
     234        runInForegnd() 
     235    else: 
     236        if options.debug or options.console: 
     237            print >>sys.stderr, \ 
     238                            "%s must be set for debug and console options" % \ 
     239                                                    '/'.join(foregndFlags) 
     240            parser.print_help() 
     241            sys.exit(1) 
     242         
     243        # Set this flag to True to catch errors raised in the new process 
     244        # in a log.  Normally stderr is re-directed to /dev/null to avoid 
     245        # conflists with the parent process     
     246        logForkErr = False 
     247        if logForkErr: 
     248            import tempfile 
     249            errLogH, errLogFilePath = tempfile.mkstemp(".err", "LogServer-") 
     250        else: 
     251            errLogFilePath = '/dev/null' 
     252 
     253        # Run server in separate process 
     254        fork(stderr=errLogFilePath)     
     255         
  • TI12-security/trunk/python/bin/SessionMgrServer.py

    r1227 r1236  
    173173                      default=os.path.join(propFileDir, propFilename), 
    174174                      help=\ 
    175 """properties file path - default is $NDG_DIR/%s or ./%s if NDG_DIR is not 
    176 set""" % (propFilename, propFilename)) 
     175"""properties file path - default is $NDG_DIR/conf/%s or ./%s if NDG_DIR is 
     176not set""" % (propFilename, propFilename)) 
    177177     
    178178    parser.add_option("-w", 
     
    273273            sys.exit(1) 
    274274             
    275         # Run server in child process 
    276         fork()     
    277  
     275         
     276        # Set this flag to True to catch errors raised in the new process 
     277        # in a log.  Normally stderr is re-directed to /dev/null to avoid 
     278        # conflists with the parent process     
     279        logForkErr = False 
     280        if logForkErr: 
     281            import tempfile 
     282            errLogH, errLogFilePath = \ 
     283                                tempfile.mkstemp(".err", "SessionMgrServer-") 
     284        else: 
     285            errLogFilePath = '/dev/null' 
     286 
     287        # Run server in separate process 
     288        fork(stderr=errLogFilePath)     
     289 
  • TI12-security/trunk/python/bin/SimpleCAServer.py

    r1231 r1236  
    164164                      default=os.path.join(propFileDir, propFilename), 
    165165                      help=\ 
    166 """properties file path - default is $NDG_DIR/%s or ./%s if NDG_DIR is not 
    167 set""" % (propFilename, propFilename)) 
     166"""properties file path - default is $NDG_DIR/conf/%s or ./%s if NDG_DIR is 
     167not set""" % (propFilename, propFilename)) 
    168168 
    169169     
     
    286286            sys.exit(1) 
    287287             
    288         # Run server in child process 
    289         fork()   
     288         
     289        # Set this flag to True to catch errors raised in the new process 
     290        # in a log.  Normally stderr is re-directed to /dev/null to avoid 
     291        # conflists with the parent process     
     292        logForkErr = False 
     293        if logForkErr: 
     294            import tempfile 
     295            errLogH, errLogFilePath = tempfile.mkstemp(".err",  
     296                                                       "SimpleCAServer-") 
     297        else: 
     298            errLogFilePath = '/dev/null' 
     299 
     300        # Run server in separate process 
     301        fork(stderr=errLogFilePath)     
  • TI12-security/trunk/python/conf/gatekeeperProperties.xml

    r964 r1236  
    55        <!-- Resource interface class --> 
    66    <resrcModFilePath></resrcModFilePath> 
    7     <resrcModName></resrcModName> 
    8     <resrcClassName></resrcClassName> 
     7    <resrcModName>TestGatekeeperResrc</resrcModName> 
     8    <resrcClassName>TestGatekeeperResrc</resrcClassName> 
    99    <resrcPropFile></resrcPropFile> 
    10         <!-- CA Certificate used in validation of Attribute Certificate XML  
    11         singature --> 
    12         <caCertFilePath></caCertFilePath> 
     10        <!-- CA Certificate used in validation of Attribute Certificate XML --> 
     11        <caCertFilePath>$NDG_DIR/conf/certs/cacert.pem</caCertFilePath> 
    1312</gatekeeperProp> 
  • TI12-security/trunk/python/ndgSetup.sh

    r1227 r1236  
    4343 
    4444 
    45 # Override default Attribute Authority and Session Manager port number 
    46 # settings 
     45# Override default port number settings for web services 
    4746#export NDG_AA_PORT_NUM=5001 
    4847#export NDG_SM_PORT_NUM= 
     48#export NDG_CA_PORT_NUM= 
     49#export NDG_LOG_PORT_NUM= 
     50#export NDG_GK_PORT_NUM= 
    4951 
    5052 
Note: See TracChangeset for help on using the changeset viewer.