source: TI04-geosplat/trunk/setup.py @ 1660

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI04-geosplat/trunk/setup.py@6809
Revision 1660, 13.8 KB checked in by astephen, 14 years ago (diff)

Version with overlay of trajectories on top of model fields draft version working before any rigourous testing.

Line 
1#!/usr/bin/env python
2
3"""
4setup.py
5========
6
7Set up script for the GeoSPlAT package.
8
9The GeoSPlAT is a server package (gss) that is exposed
10as a Web Service using python's ZSI SOAP Library.
11
12There is also a client package to primarily support the CGI client
13package (gsc).
14
15This installation includes both server and client and assumes you want
16to install both on your local machine. If you only wish to install either
17server or client use one of the following options:
18
19--gsc-only # only install the client package
20--gss-only # only install the server package
21
22
23Usage:
24======
25
26    [<your_python>/bin/python] setup.py [options] 
27
28[options] can include the above as well as the usual
29
30build | install
31
32Note that using "--overwrite" will automatically overwrite
33existing directories regardless of whether
34
35"""
36
37from distutils.core import setup
38import sys, os, shutil, time, re
39from ConfigParser import ConfigParser
40version="0.3.1"
41overwrite="OFF"
42
43
44def createSourceBundle(packages=["gss", "gsc"]):
45    """
46    Creates the packages required and includes the directories needed.
47    """
48    basePackage=packages[0][:2]
49    packMap={"s":"Server", "c":"Client"}
50       
51    for package in packages: 
52        if os.path.isfile("MANIFEST"): os.remove("MANIFEST")
53        pypackage="py"+package
54        packageName="Python GeoSPlAT %s" % packMap[pypackage[-1]]
55        print "\nBundling up source of python package: %s" % packageName
56   
57        setup(name=pypackage,
58            version=version,
59            description=packageName,
60            author="Ag Stephens",           
61            author_email="a.stephens@rl.ac.uk",
62            url="http://ndg.nerc.ac.uk/GeoSPlAT",
63            license="""Copyright (C) 2004 CCLRC & NERC( Natural Environment Research Council ).
64This software may be distributed under the terms of the
65Q Public License, version 1.0 or later. http://ndg.nerc.ac.uk/public_docs/QP""",
66            packages=[pypackage])   
67           
68        print "Bundling up the source of the non-python stuff and python scripts for: %s" % packageName
69        tarfile="%s-%s.tar" % (package, version)
70        gzipfile=tarfile+".gz"
71        os.system("tar -cvf %s %s" % (tarfile, package))
72        os.system("gzip %s" % tarfile)
73       
74        if not os.path.isfile(gzipfile):
75            raise "Did not successfully package up non-python source for '%s'." % package
76           
77        print "Moving gzip file into distribution..."
78        os.rename(gzipfile, os.path.join("dist", gzipfile))
79
80        if package=="gsc":
81            print "Copying cgi directory..."
82            if os.path.isdir("dist/cgi"):
83                if os.path.isfile("dist/cgi/splatui"):
84                    os.remove("dist/cgi/splatui")
85                os.rmdir("dist/cgi")
86            shutil.copytree("cgi", "dist/cgi")
87           
88            print "Copying web_extras directory..."
89            if os.path.isdir("dist/web_extras"):
90                os.system("rm -fR dist/web_extras")
91            shutil.copytree("web_extras", "dist/web_extras")       
92           
93    print "Copying README.txt and install.conf files..."
94    shutil.copy("README.txt", "dist")
95    shutil.copy("install.sh", "dist")   
96    shutil.copy("install.conf", "dist") 
97    shutil.copy("install.conf", "dist/install.conf.orig")           
98       
99    print "Tarring up everything in dist directory..."
100    tarAllFile="%s-%s-all.tar" % (basePackage, version)
101    os.system("cd dist ; tar -cvf %s *" % tarAllFile)
102       
103    if not os.path.isfile(os.path.join("dist", tarAllFile)):
104        raise "Did not successfully package up tar-all file '%s'." % tarAllFile
105       
106
107
108def setupPackages(packages=["gss", "gsc"]):
109    """
110    Controls the entire setup and creates directories and
111    permissions where necessary to get the ancillary stuff working.
112    """   
113    testImportExternalPackages()
114   
115    packMap={"s":"Server", "c":"Client"}
116       
117    for package in packages: 
118        pypackage="py"+package
119        packageName="Python GeoSPlAT %s" % packMap[package[-1]]
120           
121        print "Installing the non-python stuff and python scripts for: %s" % packageName
122        unpackageDir="%s-%s" % (package, version)
123        tarfile="%s.tar" % unpackageDir
124        gzipfile=tarfile+".gz"
125        os.system("cd .. ; gunzip %s" % tarfile)       
126        os.system("cd .. ; tar -xvf %s" % tarfile)
127
128        packageDir=os.path.join("..", package)
129        if not os.path.isdir(packageDir):
130            raise "Did not successfully unpack the source files for %s." % package
131           
132        print "Reading configuration file to get %s local details." % package
133        config=ConfigParser()
134        config.read("../install.conf")
135 
136        print "Set the configuration variables that are used to generate others..."
137        for item in ["BASEDIR", "STATIC_WEBSERVER_LOCAL_PATH", "STATIC_WEBSERVER_URL_PATH",
138                     "WEB_EXTRAS_URL_PATH"]:
139            if item.lower() in config.options(package):
140                exec("%s=%s" % (item.upper(), config.get(package, item.lower())))
141                print "SET:", item
142 
143        print "\n\n"
144        configVarDict={}
145        for configVar in config.options(package):
146                value=config.get(package, configVar)
147                print "Setting: %s=%s" % (configVar.upper(), value)
148                exec("%s=%s" % (configVar.upper(), value))
149                configVarDict[configVar.upper()]=value
150
151        print "Now we have parsed the config file we can start copying and making the source directories."
152        print "Installing base package '%s' in: %s" % (package, BASEDIR)
153
154        if overwrite!="ON":
155            destroy=raw_input("Type 'yes' to remove existing directory before re-installing: '%s' :" % packageDir)
156            if destroy!="yes":
157                print "Exiting setup without completing."
158                sys.exit()
159       
160           
161        if not os.path.isdir(BASEDIR):
162            try:
163                os.makedirs(BASEDIR)
164            except:
165                pass
166       
167        for item in os.listdir(packageDir):
168            sourceCopy=os.path.join(packageDir, item)
169            target=os.path.join(BASEDIR, item)
170            if os.path.exists(target): 
171                if item in ("sessionObjects", "logs"): continue
172                os.system("rm -fr %s" % target)
173           
174            if os.path.isfile(sourceCopy):
175                shutil.copy(sourceCopy, target)
176            elif os.path.isdir(sourceCopy):
177                shutil.copytree(sourceCopy, target)
178       
179        print "Installed non-python package and scripts under:", BASEDIR
180
181        if "OUTPUT_DIR" in configVarDict.keys():
182            if overwrite!="ON":
183                destroy=raw_input("Type 'yes' to remove existing directory before re-installing: '%s' :" % OUTPUT_DIR)
184                if destroy!="yes":
185                    print "Exiting setup without completing."
186                    sys.exit()   
187            try:
188                os.system("rm -fR %s" % OUTPUT_DIR)
189                os.makedirs(OUTPUT_DIR, OUTPUT_DIR_PERMISSION)
190                #os.chmod(OUTPUT_DIR, OUTPUT_DIR_PERMISSION)
191                os.system("chown -Rf %s.%s %s" % (OUTPUT_FILE_USER, OUTPUT_FILE_GROUP, OUTPUT_DIR))
192            except:
193                raise "Cannot create directory: %s" % OUTPUT_DIR
194
195        for dirToMake in ["OUTPUT_DIR_LOCAL_PATH"]:
196         
197          if dirToMake in configVarDict.keys():
198            dirToMake=eval(configVarDict[dirToMake])
199            if overwrite!="ON":
200                destroy=raw_input("Type 'yes' to remove existing directory before re-installing: '%s' :" % dirToMake)
201                if destroy!="yes":
202                    print "Exiting setup without completing."
203                    sys.exit()   
204            try:
205                os.system("rm -fR %s" % dirToMake)
206                os.makedirs(dirToMake, 0755)
207                #os.chmod(dirToMake, 0755)
208                #os.system("chown -Rf %s.%s %s" % (OUTPUT_FILE_USER, OUTPUT_FILE_GROUP, OUTPUT_DIR))
209            except:
210                raise "Cannot create directory: %s" % dirToMake
211               
212        if "CGI_SCRIPT_LOCAL_PATH" in configVarDict.keys():
213            if overwrite!="ON":
214                destroy=raw_input("Type 'yes' to remove existing script before re-installing: '%s' :" % CGI_SCRIPT_URL_PATH)
215                if destroy!="yes":
216                    print "Exiting setup without completing."
217                    sys.exit()   
218            try:
219                shutil.copy("../cgi/splatui", CGI_SCRIPT_LOCAL_PATH)
220                os.chmod(CGI_SCRIPT_LOCAL_PATH, 0755)
221                thisPython=sys.modules["os"].__file__.split("lib")[0]+"bin/python"
222                print thisPython
223                os.system("perl -p -i -w -e 's:<YOUR_PYTHON_HERE>:%s:g;' %s*" % (thisPython, CGI_SCRIPT_LOCAL_PATH))
224                #os.system("perl -p -i -w -e 's!BASEDIR=\".*?\"!BASEDIR=\"%s\"!g;' %s*" % ("/home/as56/abstractWebService/test_installs/20060328/pygsc-0.1/pygsc", CGI_SCRIPT_LOCAL_PATH))
225                print "\nCopied CGI script to: %s" % CGI_SCRIPT_LOCAL_PATH
226            except:
227                raise "Cannot move CGI script to: %s" % CGI_SCRIPT_LOCAL_PATH
228
229        if "WEB_EXTRAS_LOCAL_PATH" in configVarDict.keys():
230            if overwrite!="ON":
231                destroy=raw_input("Type 'yes' to remove existing directory before re-installing: '%s' :" % WEB_EXTRAS_LOCAL_PATH)
232                if destroy!="yes":
233                    print "Exiting setup without completing."
234                    sys.exit()   
235            try:
236                os.system("rm -fR %s" % WEB_EXTRAS_LOCAL_PATH)
237                os.makedirs(WEB_EXTRAS_LOCAL_PATH, 0755)
238                #os.chmod(OUTPUT_DIR, OUTPUT_DIR_PERMISSION)
239                #os.system("chown -Rf %s.%s %s" % (OUTPUT_FILE_USER, OUTPUT_FILE_GROUP, OUTPUT_DIR))
240            except:
241                raise "Cannot create directory: %s" % WEB_EXTRAS_LOCAL_PATH                     
242
243            webExtrasDir="../web_extras"
244            for item in os.listdir(webExtrasDir):
245                sourceCopy=os.path.join(webExtrasDir, item)
246                target=os.path.join(WEB_EXTRAS_LOCAL_PATH, item)
247                if os.path.exists(target): 
248                    os.system("rm -fR %s" % target)
249           
250                if os.path.isfile(sourceCopy):
251                    shutil.copy(sourceCopy, target)
252                elif os.path.isdir(sourceCopy):
253                    shutil.copytree(sourceCopy, target)
254       
255            print "Installed web extras components under:", WEB_EXTRAS_LOCAL_PATH
256
257        if "REQUEST_XML_DIR_LOCAL_PATH" in configVarDict.keys():
258            if overwrite!="ON":
259                destroy=raw_input("Type 'yes' to remove existing directory before re-installing: '%s' :" % REQUEST_XML_DIR_LOCAL_PATH)
260                if destroy!="yes":
261                    print "Exiting setup without completing."
262                    sys.exit()   
263            try:
264                os.system("rm -fR %s" % REQUEST_XML_DIR_LOCAL_PATH)
265                os.makedirs(REQUEST_XML_DIR_LOCAL_PATH)
266                print "Made Request XML directory: %s" % REQUEST_XML_DIR_LOCAL_PATH
267                os.chmod(REQUEST_XML_DIR_LOCAL_PATH, 0777)
268                #os.system("chown -Rf %s.%s %s" % (OUTPUT_FILE_USER, OUTPUT_FILE_GROUP, OUTPUT_DIR))
269            except:
270                raise "Cannot create directory: %s" % REQUEST_XML_DIR_LOCAL_PATH
271       
272        configMap={"s":os.path.join("..", "%s-%s" % (pypackage, version), pypackage, "serverConfig.py"), 
273                   "c":os.path.join("..", "%s-%s" % (pypackage, version), pypackage, "clientConfig.py")}
274        print "Renaming configuration variables in config file:"
275       
276        configFileName=configMap[package[-1]]
277        configFile=open(configFileName)
278        configLines=configFile.readlines()
279        configFile.close()
280       
281        shutil.copy(configFileName, configFileName+".bak")
282       
283        newLines=[]
284        for line in configLines:
285            matched=None
286            for confVar, value in configVarDict.items():
287               
288                if re.match(r"\s*%s\s*=" % confVar, line):
289                    newLine="%s=%s\n" % (confVar, value)
290                    print "CHANGING:   %sTO:         %s" % (line, newLine)
291                    newLines.append(newLine)
292                    matched=1
293                    break
294                   
295            if matched==None:
296                newLines.append(line)     
297
298        print len(configLines), len(newLines)
299        configFile=open(configFileName, "w")
300        configFile.write("".join(newLines))
301        configFile.close()
302        print "Re-written config file: %s\n" % (configFileName)
303
304        if package=="gss":
305            print "Updating VCS templates in your '~/PCMDI_GRAPHICS/initial.attributes' file is needed."
306            print "Note that a backup version will be written.\n"
307            os.system("cd %s/scripts ; addGeosplatTemplates.py ~/PCMDI_GRAPHICS/initial.attributes" % BASEDIR)
308            print "\nDone.\n"       
309
310        print "Installing python package: %s" % packageName
311
312        os.chdir(os.path.join("..", "%s-%s" % (pypackage, version)))
313        setup(name=pypackage,
314            version=version,
315            description=packageName,
316            author="Ag Stephens",           
317            author_email="a.stephens@rl.ac.uk",
318            url="http://ndg.nerc.ac.uk/DataExtractor",
319            license="""Copyright (C) 2004 CCLRC & NERC( Natural Environment Research Council ).
320This software may be distributed under the terms of the
321Q Public License, version 1.0 or later. http://ndg.nerc.ac.uk/public_docs/QP""",
322            packages=[pypackage])       
323
324    print "\nIt looks like setup has completed successfully!\n"
325    print """You can start the server Web Service by typing:
326    python %s/bin/GSWSInterface.py
327
328You should then be able to view the client package via a browser at:
329    %s
330   
331Have fun!....and of course send any bugs to <a.stephens@rl.ac.uk>
332
333""" % (BASEDIR, CGI_SCRIPT_URL_PATH)
334       
335   
336def testImportExternalPackages():
337    """
338    Tests that external packages can be imported.
339    """
340    print "Testing import of required cdms (CDAT) package...",
341    try:
342        import cdms         
343        print "OK!"
344    except:
345        print """\n\nCannot import cdms package. Please try the one or more of the following to fix this:
346
3471. Set your PYTHONPATH environment variable to pick up the correct directory containing the cdms package.
3482. Retry using the correct python installation such as "<my_python>/bin/python setup.py"
3493. Install CDAT (cdms)."""
350        sys.exit()
351
352    print "Testing import required ZSI package...",
353    try:
354        import ZSI
355        print "OK!"
356    except:
357        print """\n\nCannot import ZSI package. Please try one or more of the following to fix this:
358
3591. Set your PYTHONPATH environment variable to pick up the correct directory containing the ZSI package.
3602. Install ZSI."""
361        sys.exit()
362 
363
364if __name__=="__main__":
365
366    packages=["gss", "gsc"]       
367
368    if "--overwrite" in sys.argv[1:]:
369        print "Setting overwrite to ON"
370        overwrite="ON"
371        sys.argv.remove("--overwrite")
372       
373    if "--gss-only" in sys.argv[1:]:
374        sys.argv.remove("--gss-only")
375        packages=["gss"]
376    elif "--gsc-only" in sys.argv[1:]:
377        sys.argv.remove("--gsc-only")
378        packages=["gsc"]       
379
380    if "sdist" in sys.argv[1:]:
381        createSourceBundle(packages)
382    else:
383        if "install" not in sys.argv[1:]:
384            print "\nWARNING: Building without installing may mean your version won't pick up the location of the python packages."
385            time.sleep(0.3)   
386        setupPackages(packages)
387       
Note: See TracBrowser for help on using the repository browser.