Changeset 2391


Ignore:
Timestamp:
10/04/07 16:09:13 (12 years ago)
Author:
pjkersha
Message:

security/python/Makefile: added -f flag to rm call in clean target

security/python/ndg-security-install.py:

  • converted into a class
  • added command line options to specify twisted download and dependency links URIs
  • call easy_install from main() function call instead of making an OS system call
  • using tarfile module for twisted install instead of system call to tar
Location:
TI12-security/trunk/python
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/Makefile

    r2285 r2391  
    2727        @-for dir in ${EGG_DIRS}; do \ 
    2828                cd $$dir; \ 
    29                 rm dist/*.egg; \ 
     29                rm -f dist/*.egg; \ 
    3030                cd ..; \ 
    3131        done; 
  • TI12-security/trunk/python/ndg-security-install.py

    r2368 r2391  
    1717from ConfigParser import SafeConfigParser 
    1818from subprocess import call 
    19  
    20  
    21 def installTwisted(): 
    22     if opt.noTwisted: 
    23         return 
    24          
    25     # Install Twisted sumo 
    26     twistedTarURI = \ 
     19from setuptools.command.easy_install import main 
     20         
     21 
     22class SecurityInstall(object): 
     23    '''Wrapper class for NDG security installation 
     24     
     25    A wrapper is required over and above easy_install as additional setup 
     26    steps are required to enable for example custom build settings for  
     27    M2Crypto 
     28     
     29    @cvar dependencyLink: default location for dependencies 
     30    @type dependencyLink: string 
     31     
     32    @cvar defaultTwistedURI: default location for Twisted download 
     33    @type param: string''' 
     34    dependencyLink = "http://ndg.nerc.ac.uk/dist/"   
     35    defaultTwistedURI = \ 
    2736'http://tmrc.mit.edu/mirror/twisted/Twisted/2.2/TwistedSumo-2006-02-12.tar.bz2' 
    28     urllib.urlretrieve(twistedTarURI, 'TwistedSumo-2006-02-12.tar.bz2') 
    29      
    30     import tarfile 
    31     
    32     twistedTar = tarfile.open('TwistedSumo-2006-02-12.tar.bz2', 'r:bz2') 
    33     for tarInfo in twistedTar: 
    34         twistedTar.extract(tarInfo) 
    35     
    36     os.chdir('TwistedSumo-2006-02-12') 
    37     try:  
    38         retCode = call(sys.prefix + '/bin/python setup.py install') 
    39     except OSError, e: 
    40         raise SystemError, "Error calling setup install for Twisted: "+str(e) 
    41      
    42     if retCode != 0: 
    43         raise SystemError, "Twisted setup install returned %d" % retCode 
    44      
    45     os.chdir('..') 
     37     
     38    def __call__(self): 
     39        self.main() 
     40         
     41    def main(self): 
     42        '''Parse command line args and execute the installation''' 
     43         
     44        parser = optparse.OptionParser() 
     45         
     46        parser.add_option("-a", 
     47                          "--install-all", 
     48                          dest="installAll", 
     49                          action="store_true", 
     50                          default=False, 
     51                          help="Install client AND server packages.") 
     52         
     53        parser.add_option("-c", 
     54                          "--install-client", 
     55                          dest="installClient", 
     56                          action="store_true", 
     57                          default=False, 
     58                          help="Install client package only.") 
     59         
     60        parser.add_option("-s", 
     61                          "--install-server", 
     62                          dest="installServer", 
     63                          action="store_true", 
     64                          default=False, 
     65                          help="Install server package only.") 
     66         
     67        parser.add_option("-o", 
     68                          "--openssl-path", 
     69                          dest="opensslPath", 
     70                          default='/usr/local/ssl', 
     71                          help="Path to openssl for M2Crypto to link with") 
     72         
     73        parser.add_option("-n", 
     74                          "--no-twisted", 
     75                          dest="noTwisted", 
     76                          action="store_true", 
     77                          default=False, 
     78                          help=\ 
     79"""Skip Twisted install.  This option applies to the \"all\" and \"server\" 
     80package options only.  Twisted is not needed for the client.""") 
     81         
     82        parser.add_option("-t", 
     83                          "--twisted-uri", 
     84                          dest="twistedURI", 
     85                          default=self.__class__.defaultTwistedURI, 
     86                          help=\ 
     87"""Provide an alternative location for Twisted download.  A .tar.bz type file 
     88is expected.  The default is \"%s\"""" % self.__class__.defaultTwistedURI) 
     89         
     90        parser.add_option("-f", 
     91                          "--find-links", 
     92                          dest="dependencyLinks", 
     93                          default=self.__class__.dependencyLink, 
     94                          help=\ 
     95                      'Set URLs to locate packages.  The default is "%s"' % \ 
     96                      self.__class__.dependencyLink) 
     97     
     98     
     99        (self.opt, args) = parser.parse_args() 
     100     
     101        # Sanity check 
     102        nInstallArgs = sum((self.opt.installClient,  
     103                            self.opt.installServer,  
     104                            self.opt.installAll)) 
     105        if not nInstallArgs: 
     106            parser.error("At least one install option must be set") 
     107             
     108        elif nInstallArgs > 1: 
     109            parse.error("Only one install option may be set") 
     110      
     111        # Set M2Crypto build settings in a distutils config file 
     112        self.initM2CryptoDependencies()   
     113     
     114        # Installation based on flags set 
     115        if self.opt.installClient: 
     116            main(['-f', self.opt.dependencyLinks, "ndg_security_client"]) 
     117             
     118        elif self.opt.installServer: 
     119            main(['-f', self.opt.dependencyLinks, "ndg_security_server"]) 
     120            self.installTwisted() 
     121             
     122        elif self.opt.installAll: 
     123            main(['-f', self.opt.dependencyLinks, "ndg_security"]) 
     124            self.installTwisted() 
     125             
     126             
     127    def initM2CryptoDependencies(self):        
     128        '''Set-up link path for openssl for M2Crypto build by creating a  
     129        distutils config file containing the include file and library file  
     130        paths''' 
     131         
     132        opensslInclPath = os.path.join(self.opt.opensslPath, 'include') 
     133        opensslLibPath = os.path.join(self.opt.opensslPath, 'lib') 
     134         
     135        distutilsCfgFilePath = os.path.join(sys.prefix, 
     136                                            'lib', 
     137                                            'python%s' % sys.version[:3], 
     138                                            'distutils', 
     139                                            'distutils.cfg') 
     140        configParser = SafeConfigParser() 
     141         
     142        if configParser.read(distutilsCfgFilePath): 
     143            # File already exists 
     144            if not configParser.has_section('build_ext'): 
     145                configParser.add_section('build_ext') 
     146             
     147            if configParser.has_option('build_ext', 'include_dirs'): 
     148                existingInclDirs=configParser.get('build_ext', 'include_dirs') 
     149                 
     150                if opensslInclPath not in existingInclDirs.split(): 
     151                    includeDirs = "%s %s" % (opensslInclPath,existingInclDirs) 
     152                    configParser.set('build_ext', 'include_dirs', includeDirs) 
     153            else: 
     154                configParser.set('build_ext', 'include_dirs', opensslInclPath) 
     155             
     156            if configParser.has_option('build_ext', 'library_dirs'): 
     157                existingLibDirs = configParser.get('build_ext','library_dirs') 
     158                 
     159                if opensslLibPath not in existingLibDirs.split(): 
     160                    libraryDirs = "%s %s" % (opensslLibPath, existingLibDirs) 
     161                    configParser.set('build_ext', 'library_dirs', libraryDirs) 
     162            else: 
     163                configParser.set('build_ext', 'library_dirs', opensslLibPath) 
     164                                  
     165        else: 
     166            # No config file present - make one 
     167            configParser.add_section('build_ext') 
     168            configParser.set('build_ext', 'include_dirs', opensslInclPath) 
     169            configParser.set('build_ext', 'library_dirs', opensslLibPath) 
     170             
     171        configParser.write(open(distutilsCfgFilePath, 'w')) 
     172     
     173     
     174    def installTwisted(self): 
     175        '''Download and install twisted manually as it is not egg compatible 
     176        ''' 
     177         
     178        if self.opt.noTwisted: 
     179            return 
     180             
     181        # Install Twisted sumo 
     182        try: 
     183            twistedTarBz = os.path.basename(self.opt.twistedURI)     
     184            urllib.urlretrieve(self.opt.twistedURI, twistedTarBz) 
     185             
     186        except IOError, (errMsg, e): 
     187            raise SystemExit, 'Error retrieving Twisted from "%s": %s' % \ 
     188                                                    (twistedTarURI, e[1]) 
     189        except Exception, e: 
     190            raise SystemExit, 'Error retrieving Twisted from "%s": %s' % \ 
     191                                                    (twistedTarURI, str(e)) 
     192 
     193        import tarfile 
     194        
     195        twistedTar = tarfile.open(twistedTar, 'r:bz2') 
     196        for tarInfo in twistedTar: 
     197            twistedTar.extract(tarInfo) 
     198        
     199        try: 
     200            twistedDir=os.path.splitext(os.path.splitext(twistedTarBz)[0])[0] 
     201        except Exception: 
     202            raise SystemExit, \ 
     203            'Error getting Twisted dir path from tar.bz file name: "%s"' % \ 
     204                twistedTarBz 
     205         
     206        os.chdir(twistedDir) 
     207        try:  
     208            retCode = call([sys.prefix+'/bin/python', 'setup.py', 'install']) 
     209        except OSError, e: 
     210            raise SystemExit, "Error calling setup install for Twisted: " + \ 
     211                              str(e) 
     212         
     213        if retCode != 0: 
     214            raise SystemExit, "Twisted setup install returned %d" % retCode 
     215         
     216        os.chdir('..') 
    46217 
    47218 
    48219if __name__ == "__main__": 
    49     dependencyLink = "http://ndg.nerc.ac.uk/dist/"   
    50         
    51     parser = optparse.OptionParser() 
    52      
    53     parser.add_option("-a", 
    54               "--install-all", 
    55               dest="installAll", 
    56               action="store_true", 
    57               default=False, 
    58               help="Install client AND server packages.") 
    59      
    60     parser.add_option("-c", 
    61               "--install-client", 
    62               dest="installClient", 
    63               action="store_true", 
    64               default=False, 
    65               help="Install client package only.") 
    66      
    67     parser.add_option("-s", 
    68               "--install-server", 
    69               dest="installServer", 
    70               action="store_true", 
    71               default=False, 
    72               help="Install server package only.") 
    73      
    74     parser.add_option("-o", 
    75                       "--openssl-path", 
    76                       dest="opensslPath", 
    77                       default='/usr/local/ssl', 
    78                       help="Path to openssl for M2Crypto to link with") 
    79      
    80     parser.add_option("-n", 
    81                       "--no-twisted", 
    82                       dest="noTwisted", 
    83                       action="store_true", 
    84                       default=False, 
    85                       help=\ 
    86 """Skip Twisted install.  This option applies to the all and server package  
    87 options only.  Twisted is not needed for the client.""") 
    88      
    89     parser.add_option("-f", 
    90                       "--find-links", 
    91                       dest="dependencyLinks", 
    92                       default=dependencyLink, 
    93                       help=\ 
    94 """Set URLs to locate packages.  Default is \"%s\"""" % dependencyLink) 
    95  
    96     (opt, args) = parser.parse_args() 
    97  
    98     # Sanity check 
    99     nInstallArgs = sum((opt.installClient, opt.installServer, opt.installAll)) 
    100     if not nInstallArgs: 
    101         parser.error("At least one install option must be set") 
    102          
    103     elif nInstallArgs > 1: 
    104         parser.error("Only one install option may be set") 
    105          
    106          
    107     # Set-up link path for openssl for M2Crypto build by creating a distutils 
    108     # config file containing the include file and library file paths 
    109      
    110     opensslInclPath = os.path.join(opt.opensslPath, 'include') 
    111     opensslLibPath = os.path.join(opt.opensslPath, 'lib') 
    112      
    113     distutilsCfgFilePath = os.path.join(sys.prefix, 
    114                                         'lib', 
    115                                         'python%s' % sys.version[:3], 
    116                                         'distutils', 
    117                                         'distutils.cfg') 
    118     configParser = SafeConfigParser() 
    119      
    120     if configParser.read(distutilsCfgFilePath): 
    121         # File already exists 
    122         if not configParser.has_section('build_ext'): 
    123             configParser.add_section('build_ext') 
    124          
    125         if configParser.has_option('build_ext', 'include_dirs'): 
    126             existingInclDirs = configParser.get('build_ext','include_dirs') 
    127              
    128             if opensslInclPath not in existingInclDirs.split(): 
    129                 includeDirs = "%s %s" % (opensslInclPath, existingInclDirs) 
    130                 configParser.set('build_ext', 'include_dirs', includeDirs) 
    131         else: 
    132             configParser.set('build_ext', 'include_dirs', opensslInclPath) 
    133          
    134         if configParser.has_option('build_ext', 'library_dirs'): 
    135             existingLibDirs = configParser.get('build_ext','library_dirs') 
    136              
    137             if opensslLibPath not in existingLibDirs.split(): 
    138                 libraryDirs = "%s %s" % (opensslLibPath, existingLibDirs) 
    139                 configParser.set('build_ext', 'library_dirs', libraryDirs) 
    140         else: 
    141             configParser.set('build_ext', 'library_dirs', opensslLibPath) 
    142                               
    143     else: 
    144         # No config file present - make one 
    145         configParser.add_section('build_ext') 
    146         configParser.set('build_ext', 'include_dirs', opensslInclPath) 
    147         configParser.set('build_ext', 'library_dirs', opensslLibPath) 
    148          
    149     configParser.write(open(distutilsCfgFilePath, 'w')) 
    150  
    151      
    152     easyInstallCmd = "%s/bin/easy_install -f %s %%s" % (sys.prefix,  
    153                                                         opt.dependencyLinks) 
    154     from setuptools.command.easy_install import main 
    155      
    156     import pdb;pdb.set_trace() 
    157     
    158     # Installation based on flags set 
    159     if opt.installClient: 
    160         main(['-f', opt.dependencyLinks, "ndg_security_client"]) 
    161          
    162     elif opt.installServer: 
    163         main(['-f', opt.dependencyLinks, "ndg_security_server"])        
    164         installTwisted() 
    165          
    166     elif opt.installAll: 
    167         main(['-f', opt.dependencyLinks, "ndg_security"]) 
    168         installTwisted() 
    169     
     220    SecurityInstall()() 
     221       
Note: See TracChangeset for help on using the changeset viewer.