1 | #!/usr/bin/env python |
---|
2 | |
---|
3 | # This script deploys a archiver appliance build onto a appliance into four separate JVM's as per the documentation. |
---|
4 | # The artifacts from the build are four war files that are independent of each other. |
---|
5 | # One can choose to deploy all of these on one JVM; however, as the archiver appliance is a fairly memory intensive application; this can adversely impact GC on the single JVM. |
---|
6 | # Also, one does not want a large user retrieval to affect the engine or ETL. |
---|
7 | # Therefore, there are some advantages to deploying each war file on a separate JVM. |
---|
8 | |
---|
9 | # This script uses TOMCAT_HOME to determine the source of the Tomcat distribution. |
---|
10 | # It then makes four subfolders in the specified folder, one each for the mgmt, engine, etl and retrieval webapps. |
---|
11 | # It copies over the necessary content from the source into each of these subfolders and adjusts the configuration as necessary. |
---|
12 | # It then deploys the war files into the appropriate tomcats. |
---|
13 | # The war files are assumed to be in the parent folder; however you can use an option to override this. |
---|
14 | |
---|
15 | # This is the just the deployment step; you can then have individual /etc/init.d scripts (or use commons daemon) to start the four webapps. |
---|
16 | # So your deployment script should be something like 1) Stop webapps 2) Deploy webapps using this script 3) Start webapps. |
---|
17 | |
---|
18 | # The appliance port configuration is determined from appliances.xml as specified in the ARCHAPPL_APPLIANCES environment variable. |
---|
19 | # The identity for this appliance is determined from the ARCHAPPL_MYIDENTITY environment variable and ise used to lookup the parameters for this appliance in appliances.xml. |
---|
20 | # The tomcat start/stop ports are set by incrementing the port specified in the source for each of the webapps. |
---|
21 | |
---|
22 | # To generate start and stop script use something like this |
---|
23 | # export CATALINA_HOME=$TOMCAT_HOME |
---|
24 | # DEPLOY_DIR=/opt/local/ArchiverAppliance/tomcats |
---|
25 | # The stop sequences.... |
---|
26 | # export CATALINA_BASE=${DEPLOY_DIR}/mgmt; ${CATALINA_HOME}/bin/catalina.sh stop |
---|
27 | # export CATALINA_BASE=${DEPLOY_DIR}/engine; ${CATALINA_HOME}/bin/catalina.sh stop |
---|
28 | # export CATALINA_BASE=${DEPLOY_DIR}/etl; ${CATALINA_HOME}/bin/catalina.sh stop |
---|
29 | # export CATALINA_BASE=${DEPLOY_DIR}/retrieval; ${CATALINA_HOME}/bin/catalina.sh stop |
---|
30 | # The start sequences |
---|
31 | # export CATALINA_BASE=${DEPLOY_DIR}/mgmt; ${CATALINA_HOME}/bin/catalina.sh start |
---|
32 | # export CATALINA_BASE=${DEPLOY_DIR}/engine; ${CATALINA_HOME}/bin/catalina.sh start |
---|
33 | # export CATALINA_BASE=${DEPLOY_DIR}/etl; ${CATALINA_HOME}/bin/catalina.sh start |
---|
34 | # export CATALINA_BASE=${DEPLOY_DIR}/retrieval; ${CATALINA_HOME}/bin/catalina.sh start |
---|
35 | |
---|
36 | |
---|
37 | |
---|
38 | import sys |
---|
39 | import os |
---|
40 | import xml.dom.minidom |
---|
41 | #import urlparse |
---|
42 | from urllib.parse import urlparse |
---|
43 | import shutil |
---|
44 | |
---|
45 | def deployMultipleTomcats(destFolder): |
---|
46 | tomcatHome = os.getenv("TOMCAT_HOME") |
---|
47 | if tomcatHome == None: |
---|
48 | print("We determine the source Tomcat distribution using the environment variable TOMCAT_HOME which does not seem to be set.") |
---|
49 | sys.exit(1) |
---|
50 | thisAppliance = os.getenv("ARCHAPPL_MYIDENTITY") |
---|
51 | if thisAppliance == None: |
---|
52 | print("We determine the identity of this appliance using the environment variable ARCHAPPL_MYIDENTITY which does not seem to be set.") |
---|
53 | sys.exit(1) |
---|
54 | appliancesXML = os.getenv("ARCHAPPL_APPLIANCES") |
---|
55 | if appliancesXML == None: |
---|
56 | print("We determine the location of the appliances.xml file using the environment variable ARCHAPPL_APPLIANCES which does not seem to be set.") |
---|
57 | sys.exit(1) |
---|
58 | |
---|
59 | print("Using\n\ttomcat installation at", tomcatHome, "\n\tto generate deployments for appliance", thisAppliance, "\n\tusing configuration info from", appliancesXML, "\n\tinto folder", destFolder) |
---|
60 | |
---|
61 | # Parse the tomcat/conf/server.xml file and determine the stop start port |
---|
62 | # We start incrementing and use this port+1 for each of the new webapps |
---|
63 | tomcatServerConfSrc = tomcatHome + '/conf/server.xml' |
---|
64 | serverdom = xml.dom.minidom.parse(tomcatServerConfSrc); |
---|
65 | serverStopStartPort = serverdom.getElementsByTagName('Server').item(0).getAttribute('port') |
---|
66 | if int(serverStopStartPort) == 8005: |
---|
67 | print("The start/stop port is the standard Tomcat start/stop port. Changing it to something else random - 16000") |
---|
68 | serverStopStartPort='16000' |
---|
69 | newServerStopStartPort = int(serverStopStartPort)+1 |
---|
70 | print('The stop/start ports for the new instance will being at ', newServerStopStartPort) |
---|
71 | |
---|
72 | # Parse the appliances.xml and determine the ports for the HTTP listeners |
---|
73 | appliancesXMLDOM = xml.dom.minidom.parse(appliancesXML) |
---|
74 | appliances = appliancesXMLDOM.getElementsByTagName('appliance') |
---|
75 | for appliance in appliances: |
---|
76 | identity = appliance.getElementsByTagName('identity').item(0).firstChild.data |
---|
77 | if identity != thisAppliance: |
---|
78 | # print "Skipping config for", appliance, " looking for ", thisAppliance |
---|
79 | continue |
---|
80 | httplistenerports = {} |
---|
81 | mgmtUrl = appliance.getElementsByTagName('mgmt_url').item(0).firstChild.data |
---|
82 | engineUrl = appliance.getElementsByTagName('engine_url').item(0).firstChild.data |
---|
83 | etlUrl = appliance.getElementsByTagName('etl_url').item(0).firstChild.data |
---|
84 | retrievalUrl = appliance.getElementsByTagName('retrieval_url').item(0).firstChild.data |
---|
85 | |
---|
86 | httplistenerports['mgmt'] = urlparse(mgmtUrl).port |
---|
87 | httplistenerports['engine'] = urlparse(engineUrl).port |
---|
88 | httplistenerports['etl'] = urlparse(etlUrl).port |
---|
89 | httplistenerports['retrieval'] = urlparse(retrievalUrl).port |
---|
90 | |
---|
91 | for app in ['mgmt', 'engine', 'etl', 'retrieval']: |
---|
92 | # Delete any existing subfolders if any and make new ones. |
---|
93 | subFolder = destFolder + '/' + app |
---|
94 | if os.access(subFolder, os.W_OK): |
---|
95 | print("Removing ", subFolder) |
---|
96 | shutil.rmtree(subFolder) |
---|
97 | print("Generating tomcat folder for ", app, " in location", subFolder) |
---|
98 | os.makedirs(subFolder) |
---|
99 | # See http://kief.com/running-multiple-tomcat-instances-on-one-server.html for the steps we are using here. |
---|
100 | shutil.copytree(tomcatHome + '/conf', subFolder + '/conf') |
---|
101 | shutil.copytree(tomcatHome + '/webapps', subFolder + '/webapps') |
---|
102 | os.makedirs(subFolder + '/logs') |
---|
103 | os.makedirs(subFolder + '/temp') |
---|
104 | os.makedirs(subFolder + '/work') |
---|
105 | |
---|
106 | # print 'StopStart for', app, ' is', newServerStopStartPort, "and the HTTP listener port as determined from appliances.xml is", httplistenerports[app] |
---|
107 | newServerDom = xml.dom.minidom.parse(subFolder + '/conf/server.xml') |
---|
108 | newServerDom.getElementsByTagName('Server').item(0).setAttribute('port', str(newServerStopStartPort)) |
---|
109 | # Find the 'Connector' whose 'protocol' is 'HTTP/1.1' |
---|
110 | haveSetConnector = False |
---|
111 | for httplistenerNode in newServerDom.getElementsByTagName('Connector'): |
---|
112 | if httplistenerNode.hasAttribute('protocol') and httplistenerNode.getAttribute('protocol') == 'HTTP/1.1': |
---|
113 | httplistenerNode.setAttribute('port', str(httplistenerports[app])) |
---|
114 | haveSetConnector = True |
---|
115 | else: |
---|
116 | print("Commenting connector with protocol ", httplistenerNode.getAttribute('protocol'), ". If you do need this connector, you should un-comment this.") |
---|
117 | comment = httplistenerNode.ownerDocument.createComment(httplistenerNode.toxml()) |
---|
118 | httplistenerNode.parentNode.replaceChild(comment, httplistenerNode) |
---|
119 | if haveSetConnector == False: |
---|
120 | raise AssertionError("We have not set the HTTP listener port for " + app); |
---|
121 | |
---|
122 | |
---|
123 | with open(subFolder + '/conf/server.xml', 'w') as file: |
---|
124 | newServerDom.writexml(file) |
---|
125 | newServerStopStartPort = newServerStopStartPort+1 |
---|
126 | |
---|
127 | if __name__ == "__main__": |
---|
128 | if len(sys.argv) < 2: |
---|
129 | print("Usage: ", sys.argv[0], "<DeploymentFolder>") |
---|
130 | sys.exit(1) |
---|
131 | deployMultipleTomcats(sys.argv[1]) |
---|
132 | |
---|
133 | |
---|
134 | |
---|