epics/Archiver Appliance インストールメモ: deployMultipleTomcats.py

File deployMultipleTomcats.py, 7.9 KB (added by Shuei Yamada, 10 months ago)
Line 
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
38import sys
39import os
40import xml.dom.minidom
41#import urlparse
42from urllib.parse import urlparse
43import shutil
44
45def 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
127if __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