Changeset 1231 for TI12-security


Ignore:
Timestamp:
22/06/06 09:05:49 (13 years ago)
Author:
pjkersha
Message:

setup.py and README: chnage to release 0.70.

NDG/SimpleCA.py: move CA pass-phrase check to AFTER setProperties and readProperties calls so that the
'chkCAPassPhraseExe' key is set.

bin/SimpleCAServer.py: changes command line parser to optparse. Added code to enable server to be run in a
separate process.

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

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/NDG/SimpleCA.py

    r930 r1231  
    9898        self.__prop = {} 
    9999        self.__dtCertExpiry = None 
    100          
    101         # Set pass-phrase from file or string input 
    102         if configFilePath is not None: 
    103             try: 
    104                 caPassPhrase = open(configFilePath).read().strip() 
    105             except Exception, e: 
    106                 raise SimpleCAError("Reading configuration file: %s" % e) 
    107              
    108         if caPassPhrase is not None: 
    109             self.__setCAPassPhrase(caPassPhrase) 
    110100 
    111101         
     
    123113        if propFilePath is not None: 
    124114            self.readProperties(propFilePath) 
     115         
     116         
     117        # Set pass-phrase from file or string input - Call __setCAPassPhrase 
     118        # after setProperties and readProperties calls as chkCAPassPhrase 
     119        # which it uses needs to have the 'chkCAPassPhraseExe' dictionary key 
     120        # set 
     121        if configFilePath is not None: 
     122            try: 
     123                caPassPhrase = open(configFilePath).read().strip() 
     124            except Exception, e: 
     125                raise SimpleCAError, "Reading configuration file: %s" % e 
     126             
     127        if caPassPhrase is not None: 
     128            self.__setCAPassPhrase(caPassPhrase) 
    125129 
    126130         
    127131        if not 'GLOBUS_LOCATION' in os.environ or \ 
    128132           not os.environ['GLOBUS_LOCATION']: 
    129             raise SimpleCAError(\ 
    130                 "Environment variable \"GLOBUS_LOCATION\" is not set") 
     133            raise SimpleCAError, \ 
     134                "Environment variable \"GLOBUS_LOCATION\" is not set" 
    131135 
    132136 
    133137        # Set-up CA directory - use in chkCAPassPhrase() 
    134138        if not 'HOME' in os.environ or not os.environ['HOME']: 
    135             raise SimpleCAError(\ 
    136                 "Environment variable \"HOME\" is not set") 
     139            raise SimpleCAError, \ 
     140                "Environment variable \"HOME\" is not set" 
    137141                 
    138142        self.__gridCAConfigFilePath = os.path.join(os.environ['HOME'],  
     
    296300        else: 
    297301            if not isinstance(caPassPhrase, basestring): 
    298                 raise SimpleCAError("CA Pass-phrase must be a valid string") 
     302                raise SimpleCAError, "CA Pass-phrase must be a valid string" 
     303         
     304        if 'chkCAPassPhraseExe' not in self.__prop: 
     305            raise SimpleCAError, "\"chkCAPassPhraseExe\" has not been set." +\ 
     306                "  Call setProperties or readProperties method to set it" 
    299307         
    300308        chkCAPassPhraseCmd = [ 
     
    335343                                         
    336344        except IOError, e:                
    337             raise SimpleCAError(errMsgTmpl % e.strerror) 
     345            raise SimpleCAError, errMsgTmpl % e.strerror 
    338346         
    339347        except OSError, e: 
    340             raise SimpleCAError(errMsgTmpl % e.strerror) 
     348            raise SimpleCAError, errMsgTmpl % e.strerror 
    341349        
    342350        except Exception, e: 
    343             raise SimpleCAError(errMsgTmpl % e) 
     351            raise SimpleCAError, errMsgTmpl % e 
    344352         
    345353         
    346354        if errMsg is not None: 
    347             raise SimpleCAPassPhraseError(errMsg) 
     355            raise SimpleCAPassPhraseError, errMsg 
    348356 
    349357 
  • TI12-security/trunk/python/README

    r1129 r1231  
    1 NDG Prototype version 0.68 07/06/06 
     1NDG Prototype version 0.70 21/06/06 
    22___________________________________ 
     3 
     4This version first following Alpha testing 
    35 
    46To install: 
  • TI12-security/trunk/python/Tests/SecurityClientTest.py

    r1227 r1231  
    2828        try: 
    2929            # Session Manager WSDL 
    30             self.smWSDL = './sessionMgr.wsdl' 
     30#            self.smWSDL = './sessionMgr.wsdl' 
    3131#            self.smWSDL = 'http://glue.badc.rl.ac.uk/sessionMgr.wsdl' 
    32 #            self.smWSDL = 'http://gabriel.bnsc.rl.ac.uk/sessionMgr.wsdl' 
     32            self.smWSDL = 'http://gabriel.bnsc.rl.ac.uk/sessionMgr.wsdl' 
    3333     
    3434            # Public key of session manager used to encrypt requests 
     
    5252 
    5353            # Attribute Authority client tests 
    54             self.aaWSDL = '/home/pjkersha/Development/security/python/Tests/attAuthority.wsdl' 
     54#            self.aaWSDL = '/home/pjkersha/Development/security/python/Tests/attAuthority.wsdl' 
    5555#            self.aaWSDL = 'http://glue.badc.rl.ac.uk/attAuthority.wsdl' 
    56 #            self.aaWSDL = 'http://gabriel.bnsc.rl.ac.uk/attAuthority.wsdl' 
     56            self.aaWSDL = 'http://gabriel.bnsc.rl.ac.uk/attAuthority.wsdl' 
    5757            aaPubKeyFilePath = None 
    5858             
     
    6666             
    6767#            self.newUserName = 'lawrence' 
    68             self.newUserName = 'gabriel' 
     68            self.newUserName = 'YosemiteSam' 
    6969             
    7070            self.userName = 'gabriel' 
  • TI12-security/trunk/python/bin/SimpleCAServer.py

    r930 r1231  
    2929import sys 
    3030import os 
    31 import getopt 
     31import optparse 
    3232 
    3333 
     
    4040    resp._errMsg = '' 
    4141 
    42     if debug: 
     42    if options.debug: 
    4343        import pdb 
    4444        pdb.set_trace()      
     
    6969 
    7070 
    71  
    72  
    73 def usage(): 
    74     """Describes how to call SimpleCAServer from the command line""" 
    75     print "usage: %s " % sys.argv[0].split(os.sep)[-1] 
    76     print """     
    77 [-h | --help] 
    78     print usage summary 
    79      
    80 [-f <properties file path> | --file=<properties file path>] 
    81     path to properties file.  If not set, defaults to 
    82     $NDG_DIR/conf/simpleCAProperties.xml 
    83      
    84 [-c <configuration file path> | --conf=<configuration file path>] 
    85     path to configuration file used to set CA pass-phrase.  If not set,  
    86     user is prompted for pass-phrase. 
    87  
    88 [-p <port #> | --port=<port #> 
    89     port number for server to listen on 
    90  
    91 [-d | --debug] 
    92     set to stop in debugger on receipt of WS request 
    93 """ 
    94  
    95  
    96  
    97  
     71#_____________________________________________________________________________ 
     72def runInForegnd(): 
     73    """Run Simple CA in the same process as this script""" 
     74     
     75    print "Simple CA Server listening..." 
     76    try: 
     77         dispatch.AsServer(port=options.port) 
     78 
     79    except KeyboardInterrupt: 
     80        sys.exit(0) 
     81 
     82    except socket.error, e: 
     83        print >>sys.stderr, "Simple CA Server socket error: %s" % e[1] 
     84        sys.exit(1) 
     85 
     86    except Exception, e: 
     87        print >>sys.stderr, "Simple CA Server: %s" % e 
     88        sys.exit(1) 
     89         
     90 
     91#_____________________________________________________________________________ 
     92def fork(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): 
     93    """Run Simple CA in a separate child process 
     94     
     95    Thanks to Jorgen Hermann and user contributors for fork code 
     96     
     97    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 
     98     
     99    """ 
     100     
     101    try:  
     102        pid = os.fork()  
     103        if pid > 0: 
     104            # exit first parent 
     105            sys.exit(0)  
     106    except OSError, e:  
     107        print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)  
     108        sys.exit(1) 
     109 
     110    # Decouple from parent environment 
     111    os.chdir("/") # Allows for current dir path being renamed or deleted 
     112    os.setsid()  
     113    os.umask(0)  
     114     
     115    # Redirect standard file descriptors 
     116    si = file(stdin, 'r') 
     117    so = file(stdout, 'a+') 
     118    se = file(stderr, 'a+', 0) 
     119     
     120    sys.stdout.flush() 
     121    sys.stderr.flush() 
     122 
     123    os.dup2(si.fileno(), sys.stdin.fileno()) 
     124    os.dup2(so.fileno(), sys.stdout.fileno()) 
     125    os.dup2(se.fileno(), sys.stderr.fileno()) 
     126     
     127 
     128    # Do second fork 
     129    try:  
     130        pid = os.fork()  
     131        if pid > 0: 
     132            # exit from second parent 
     133            sys.exit(pid)  
     134    except OSError, e:  
     135        print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)  
     136        sys.exit(1)  
     137 
     138    # start the daemon main loop 
     139    try: 
     140         dispatch.AsServer(port=options.port) 
     141 
     142    except socket.error, e: 
     143        print >>sys.stderr, "Simple CA Server socket error: %s" % e[1] 
     144        sys.exit(1) 
     145 
     146    except Exception, e: 
     147        print >>sys.stderr, "Simple CA Server: %s" % e 
     148        sys.exit(1) 
     149 
     150 
     151#_____________________________________________________________________________ 
    98152if __name__ == '__main__': 
    99153 
    100     try: 
    101         opts, args = getopt.getopt(sys.argv[1:], 
    102                                    "hf:c:p:d", 
    103                                    ["help","file=","conf=","port=","debug"])         
    104     except getopt.GetoptError: 
    105         usage() 
    106         sys.exit(1) 
    107  
    108  
    109     propFilePath = None 
    110     configFilePath = None 
    111     port = 5500 #80 # temporary port for testing 
    112     debug = False 
    113      
    114     for opt, arg in opts: 
    115         if opt in ("-h", "--help"): 
    116             usage()                      
    117             sys.exit(0) 
    118              
    119         elif opt in ("-d", "--debug"): 
    120             debug = True 
    121              
    122         elif opt in ("-f", "--file"): 
    123             propFilePath = arg 
    124              
    125         elif opt in ("-c", "--conf"): 
    126             configFilePath = arg 
    127  
    128         elif opt in ("-p", "--port"): 
    129             port = int(arg) 
    130  
    131  
    132     if propFilePath is None: 
    133         # Check in installation area otherwise assume local directory 
    134         if 'NDG_DIR' in os.environ: 
    135             propFileDir = os.path.join(os.environ['NDG_DIR'], "conf") 
    136         else: 
    137             propFileDir = "." 
    138  
    139         propFilePath = os.path.join(propFileDir, 'simpleCAProperties.xml') 
    140  
    141          
    142     # Create server instance at start up 
    143     try: 
    144         simpleCA = SimpleCA(propFilePath=propFilePath,  
    145                             configFilePath=configFilePath) 
    146          
    147     except Exception, e: 
    148         sys.stderr.write("Initialising SimpleCA: %s\n" % e) 
    149         sys.exit(1) 
    150  
    151  
    152     # If no configuration file path was provided, read from stdin 
    153     if configFilePath is None: 
    154         import getpass 
    155  
    156         nTries = 0 
    157         while nTries < 10: 
     154    parser = optparse.OptionParser() 
     155 
     156    # Check in installation area otherwise assume local directory 
     157    propFileDir = 'NDG_DIR' in os.environ and \ 
     158                            os.path.join(os.environ['NDG_DIR'], "conf") or "." 
     159 
     160    propFilename = 'simpleCAProperties.xml' 
     161    parser.add_option("-f", 
     162                      "--file", 
     163                      dest="propFilePath", 
     164                      default=os.path.join(propFileDir, propFilename), 
     165                      help=\ 
     166"""properties file path - default is $NDG_DIR/%s or ./%s if NDG_DIR is not 
     167set""" % (propFilename, propFilename)) 
     168 
     169     
     170    parser.add_option("-c", 
     171                      "--conf", 
     172                      dest="configFilePath", 
     173                      default=None, 
     174                      help=\ 
     175"""path to configuration file used to set CA pass-phrase.  If not set, 
     176pass-phrase is prompted for from tty.""") 
     177 
     178 
     179    parser.add_option("-s", 
     180                      "--pass-phrase-from-stdin", 
     181                      action="store_true", 
     182                      dest="bPassPhraseFromStdin", 
     183                      default=False, 
     184                      help="""\ 
     185Take CA pass-phrase from stdin.  If not set, pass-phrase is prompted for from 
     186tty.""") 
     187 
     188 
     189    # Port may be set from an environment variable.  Note that this will be 
     190    # overridden if the port command line argument is set  
     191    caPortNumEnvVarName = 'NDG_CA_PORT_NUM' 
     192    defaultPort = 5500 
     193     
     194    initPort = caPortNumEnvVarName in os.environ and \ 
     195                        int(os.environ[caPortNumEnvVarName]) or defaultPort 
     196             
     197    parser.add_option("-p", 
     198                      "--port", 
     199                      dest="port", 
     200                      default=initPort, 
     201                      type="int", 
     202                      help=\ 
     203"specify a port number - default is %d or set environment variable \"%s\"" % \ 
     204                                          (defaultPort, caPortNumEnvVarName)) 
     205     
     206    foregndFlags = ("-i", "--foreground") 
     207    parser.add_option(action="store_true", 
     208                      dest="foregndProc", 
     209                      default=False, 
     210                      help=\ 
     211"run server as process in the foreground.  If not set, fork a child process", 
     212                      *foregndFlags) 
     213     
     214    parser.add_option("-d", 
     215                      "--debug", 
     216                      action="store_true", 
     217                      dest="debug", 
     218                      default=False, 
     219                      help=\ 
     220"set to stop in debugger on receipt of WS request.  %s flag must be set also"\ 
     221                                            % '/'.join(foregndFlags)) 
     222                                             
     223    (options, args) = parser.parse_args() 
     224 
     225         
     226    # Create server instance at start up - pass in config file path in case 
     227    # this was set on the command line 
     228    try: 
     229        simpleCA = SimpleCA(propFilePath=options.propFilePath, 
     230                            configFilePath=options.configFilePath) 
     231    except Exception, e: 
     232        print >>sys.stderr, "Initialising Simple CA: %s" % e 
     233        sys.exit(1) 
     234 
     235 
     236    # Check in case pass-phrase was not set via config file option 
     237    try: 
     238        if options.bPassPhraseFromStdin: 
     239             
     240            # Pass-phrase may be set from stdin 
    158241            try: 
    159                 simpleCA.caPassPhrase = \ 
    160                     getpass.getpass(prompt="SimpleCA Pass-phrase: ") 
    161                 break 
    162              
    163             except KeyboardInterrupt: 
    164                 sys.exit(1) 
     242                simpleCA.caPassPhrase = sys.stdin.read().strip() 
    165243                 
    166244            except SimpleCAPassPhraseError, e: 
    167                 nTries += 1 
    168                 if nTries >= 10: 
    169                     sys.stderr.write(\ 
    170                         "Invalid Pass-phrase - exiting after 10 attempts\n") 
     245                print >>sys.stderr, "Invalid pass-phrase set from stdin" 
     246                sys.exit(1) 
     247                     
     248        elif options.configFilePath is None: 
     249             
     250            # No configuration file was set either - read from user input at 
     251            # terminal 
     252            import getpass 
     253     
     254            nTries = 0 
     255            while nTries < 10: 
     256                try: 
     257                    simpleCA.caPassPhrase = \ 
     258                        getpass.getpass(prompt="Simple CA Pass-phrase: ") 
     259                    break 
     260                 
     261                except KeyboardInterrupt: 
    171262                    sys.exit(1) 
    172                 else: 
    173                     sys.stderr.write("Invalid Pass-phrase\n") 
    174              
    175             except Exception, e: 
    176                 # Catch all 
    177                 sys.stderr.write(\ 
    178                     "Error checking Simple CA pass-phrase: %s\n" % e) 
    179                 sys.exit(1) 
    180                          
    181          
    182     print "SimpleCA Server listening..." 
    183     try: 
    184         dispatch.AsServer(port=port) 
    185  
    186     except KeyboardInterrupt: 
    187         sys.exit(0) 
    188  
    189     except socket.error, e: 
    190         sys.stderr.write("SimpleCA Server socket error: %s\n" % \ 
    191                          e[1]) 
    192         sys.exit(1) 
    193  
    194     except Exception, e: 
    195         sys.stderr.write("SimpleCA Server: %s\n" % e) 
    196         sys.exit(1) 
     263                     
     264                except SimpleCAPassPhraseError, e: 
     265                    nTries += 1 
     266                    if nTries >= 10: 
     267                        print >>sys.stderr, \ 
     268                            "Invalid Pass-phrase - exiting after 10 attempts" 
     269                        sys.exit(1) 
     270                    else: 
     271                        print >>sys.stderr, "Invalid pass-phrase" 
     272             
     273    except Exception, e: 
     274        # Catch all 
     275        print >>sys.stderr, "Error checking Simple CA pass-phrase: %s" % e 
     276        sys.exit(1) 
     277         
     278 
     279    if options.foregndProc: 
     280        runInForegnd() 
     281    else: 
     282        if options.debug: 
     283            print >>sys.stderr, "%s must be set with debug option" % \ 
     284                                                    '/'.join(foregndFlags) 
     285            parser.print_help() 
     286            sys.exit(1) 
     287             
     288        # Run server in child process 
     289        fork()   
  • TI12-security/trunk/python/setup.py

    r1129 r1231  
    1818{ 
    1919    'name':           'NDG-Security', 
    20     'version':        '0.68', 
     20    'version':        '0.70', 
    2121    'description':    'NERC DataGrid Security Utilities', 
    2222    'author':         'P J Kershaw', 
Note: See TracChangeset for help on using the changeset viewer.