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

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

Preparing new DEWS 0.8.0 release -

ndg.security.server/setup.py: remove commented out code

setup.py, ndg.security.client/setup.py, ndg.security.test/setup.py,
ndg.security.server/setup.py, ndg.security.common/setup.py:
update version to 0.8.0

ndg.security.test/ndg/security/test/AttAuthority/siteAAttAuthorityProperties.xml:
reset default transport to http

ndg.security.test/ndg/security/test/AttAuthority/attAuthorityClientTest.cfg:
default test settings for DEWS

ndg.security.test/ndg/security/test/SessionMgr/SessionMgrClientTest.py:

  • updated for tests with SSL - sslCACertList keyword

ndg.security.test/ndg/security/test/SessionMgr/sessionMgrClientTest.cfg:

  • test with SSL

ndg.security.common/ndg/security/common/SessionMgr/init.py:

  • include new SSL settings sslCACertList and sslCACertFilePathList

keywords / properties

  • removed transdict keyword
  • changed tranport attribute to _transport and transdict to _transdict

ndg.security.common/ndg/security/common/AttAuthority/init.py:

  • import httplib to enable catch for httplib.BadStatusLine? exception - this

is thrown when trying to connect with http to https service

  • include sslCACertFilePathList property
  • remove clntCertFilePath, clntPriKeyFilePath and clntPriKeyPwd properties -

no longer needed

ndg.security.common/ndg/security/common/m2CryptoSSLUtility.py:

  • new property caCertFilePathList enables setting of CA certs from file list
  • fix to HTTPSConnection class - set _postConnectionCheck attribute to

SSL.Checker.Checker default if not equivalent keyword was set

ndg.security.common/ndg/security/common/CredWallet.py:

  • enable calls to Attribute Authorities to set CA list for peer cert

verification with SSL connections

ndg-security-install.py: added new -t option to enable install of unit tests
package

  • 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("-u",
70                          "--install-unittests",
71                          dest="installUnitTests",
72                          action="store_true",
73                          default=False,
74                          help="Install unit test package only.")
75       
76        parser.add_option("-o",
77                          "--openssl-path",
78                          dest="opensslPath",
79                          default='/usr/local/ssl',
80                          help="Path to openssl for M2Crypto to link with")
81       
82        parser.add_option("-n",
83                          "--no-twisted",
84                          dest="noTwisted",
85                          action="store_true",
86                          default=False,
87                          help=\
88"""Skip Twisted install.  This option applies to the \"all\" and \"server\"
89package options only.  Twisted is not needed for the client.""")
90       
91        parser.add_option("-t",
92                          "--twisted-uri",
93                          dest="twistedURI",
94                          default=self.__class__.defaultTwistedURI,
95                          help=\
96"""Provide an alternative location for Twisted download.  A .tar.bz type file
97is expected.  The default is \"%s\"""" % self.__class__.defaultTwistedURI)
98       
99        parser.add_option("-f",
100                          "--find-links",
101                          dest="dependencyLinks",
102                          default=self.__class__.dependencyLink,
103                          help=\
104                      'Set URLs to locate packages.  The default is "%s"' % \
105                      self.__class__.dependencyLink)
106   
107   
108        (self.opt, args) = parser.parse_args()
109   
110        # Sanity check
111        nInstallArgs = sum((self.opt.installClient, 
112                            self.opt.installServer,
113                            self.opt.installUnitTests, 
114                            self.opt.installAll))
115        if not nInstallArgs:
116            parser.error("At least one install option must be set")
117           
118        elif nInstallArgs > 1:
119            parse.error("Only one install option may be set")
120     
121        # Set M2Crypto build settings in a distutils config file
122        self.initM2CryptoDependencies() 
123   
124        # Installation based on flags set
125        if self.opt.installClient:
126            main(['-f', self.opt.dependencyLinks, "ndg_security_client"])
127           
128        elif self.opt.installServer:
129            main(['-f', self.opt.dependencyLinks, "ndg_security_server"])
130            self.installTwisted()
131           
132        elif self.opt.installUnitTests:
133            main(['-f', self.opt.dependencyLinks, "ndg_security_test"])
134            self.installTwisted()
135           
136        elif self.opt.installAll:
137            main(['-f', self.opt.dependencyLinks, "ndg_security"])
138            self.installTwisted()
139           
140           
141    def initM2CryptoDependencies(self):       
142        '''Set-up link path for openssl for M2Crypto build by creating a
143        distutils config file containing the include file and library file
144        paths'''
145       
146        opensslInclPath = os.path.join(self.opt.opensslPath, 'include')
147        opensslLibPath = os.path.join(self.opt.opensslPath, 'lib')
148       
149        distutilsCfgFilePath = os.path.join(sys.prefix,
150                                            'lib',
151                                            'python%s' % sys.version[:3],
152                                            'distutils',
153                                            'distutils.cfg')
154        configParser = SafeConfigParser()
155       
156        if configParser.read(distutilsCfgFilePath):
157            # File already exists
158            if not configParser.has_section('build_ext'):
159                configParser.add_section('build_ext')
160           
161            if configParser.has_option('build_ext', 'include_dirs'):
162                existingInclDirs=configParser.get('build_ext', 'include_dirs')
163               
164                if opensslInclPath not in existingInclDirs.split():
165                    includeDirs = "%s %s" % (opensslInclPath,existingInclDirs)
166                    configParser.set('build_ext', 'include_dirs', includeDirs)
167            else:
168                configParser.set('build_ext', 'include_dirs', opensslInclPath)
169           
170            if configParser.has_option('build_ext', 'library_dirs'):
171                existingLibDirs = configParser.get('build_ext','library_dirs')
172               
173                if opensslLibPath not in existingLibDirs.split():
174                    libraryDirs = "%s %s" % (opensslLibPath, existingLibDirs)
175                    configParser.set('build_ext', 'library_dirs', libraryDirs)
176            else:
177                configParser.set('build_ext', 'library_dirs', opensslLibPath)
178                                 
179        else:
180            # No config file present - make one
181            configParser.add_section('build_ext')
182            configParser.set('build_ext', 'include_dirs', opensslInclPath)
183            configParser.set('build_ext', 'library_dirs', opensslLibPath)
184           
185        configParser.write(open(distutilsCfgFilePath, 'w'))
186   
187   
188    def installTwisted(self):
189        '''Download and install twisted manually as it is not egg compatible
190        '''
191       
192        if self.opt.noTwisted:
193            return
194           
195        # Install Twisted sumo
196        try:
197            twistedTarBz = os.path.basename(self.opt.twistedURI)   
198            urllib.urlretrieve(self.opt.twistedURI, twistedTarBz)
199           
200        except IOError, (errMsg, e):
201            raise SecurityInstallError, 'Error retrieving Twisted from "%s": %s' % \
202                                                    (twistedTarURI, e[1])
203        except Exception, e:
204            raise SecurityInstallError, 'Error retrieving Twisted from "%s": %s' % \
205                                                    (twistedTarURI, str(e))
206
207        import tarfile
208       
209        twistedTar = tarfile.open(twistedTarBz, 'r:bz2')
210        for tarInfo in twistedTar:
211            twistedTar.extract(tarInfo)
212       
213        try:
214            twistedDir=os.path.splitext(os.path.splitext(twistedTarBz)[0])[0]
215        except Exception:
216            raise SecurityInstallError, \
217            'Error getting Twisted dir path from tar.bz file name: "%s"' % \
218                twistedTarBz
219       
220        os.chdir(twistedDir)
221        try: 
222            retCode = call([sys.prefix+'/bin/python', 'setup.py', 'install'])
223        except OSError, e:
224            raise SecurityInstallError, \
225                        "Error calling setup install for Twisted: " + str(e)
226       
227        if retCode != 0:
228            raise SecurityInstallError, "Twisted setup install returned %d" %\
229                                        retCode
230       
231        os.chdir('..')
232
233
234if __name__ == "__main__":
235    SecurityInstall()()
236     
Note: See TracBrowser for help on using the repository browser.