source: TI12-security/trunk/python/ndg-security-install.py @ 2391

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg-security-install.py@2391
Revision 2391, 8.3 KB checked in by pjkersha, 13 years ago (diff)

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
  • Property svn:executable set to *
Line 
1#!/usr/bin/env python
2"""Install NDG Server package with M2Crypto build settings and to include
3Twisted
4
5NERC Data Grid Project
6
7@author P J Kershaw 15/03/07
8
9@copyright (C) 2007 CCLRC & NERC
10
11@license This software may be distributed under the terms of the Q Public
12License, version 1.0 or later.
13"""
14import os, sys
15import urllib
16import optparse
17from ConfigParser import SafeConfigParser
18from subprocess import call
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 = \
36'http://tmrc.mit.edu/mirror/twisted/Twisted/2.2/TwistedSumo-2006-02-12.tar.bz2'
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('..')
217
218
219if __name__ == "__main__":
220    SecurityInstall()()
221     
Note: See TracBrowser for help on using the repository browser.