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

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

top-level setup.py: fixed to version 0.7.3

Tests/dewsBinaryDataGet/binaryDataGet.py: uri can now be set on command line.

ndg-security-install.py: fixed bug in Twisted install ref'd var should be 'twistedTarBz'

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