installapp.py
#----------------------------------------------------- # # installapp.py # # This script will... # # - stop a server # - uninstall an app # - install an app, # - add the MYLibs to the application # - start a server # # Usage example... # # d:\WAS\6.0\AppServer\bin\wsadmin.bat -lang jython # -f installapp.py # appserver # Node01 # "MyApp.ear" # "MY" # "MYLibs" # where appserver is the application server, Node01 is the node, "MyApp.ear" # is the path to the .ear, "MY" will be the applicaton name, and "MYLibs" are the application's # shared libraries # import sys from time import sleep from java.io import StringReader from java.io import File import org.xml.sax as sax import org.apache.xerces.parsers.DOMParser as domparser def updateapp(domtree): #-------------------------------------------------------------- # set up globals #-------------------------------------------------------------- global AdminConfig global AdminControl global AdminApp node = domtree.getElementsByTagName('node') nodeName = node.item(0).getAttribute('name') cellnode = domtree.getElementsByTagName('cell') cellname = cellnode.item(0).getAttribute('name') #-------------------------------------------------------------- # do some sanity checking # -- do we have a node by this name? #-------------------------------------------------------------- nodeID = AdminConfig.getid("/Node:" + nodeName + "/") print "Checking for existence of node " + nodeName if len(nodeID) == 0: print "Error: node "+ nodeName + "not found" return #-------------------------------------------------------------- # -- stop the servers # loop through the serverNamesList and stop each server #-------------------------------------------------------------- serverlistnode = domtree.getElementsByTagName('serverlist') servers = serverlistnode.item(0).getElementsByTagName('server') webserverlistnode = domtree.getElementsByTagName('webserverlist') webservers = webserverlistnode.item(0).getElementsByTagName('webserver') for ix in range(servers.getLength()): servername = servers.item(ix).getAttribute('servername') nodename = servers.item(ix).getAttribute('nodename') print "server="+servername+"nodename="+nodename runningServer = AdminControl.completeObjectName("type=Server,node=" + nodename + ",process=" + servername + ",*") if len(runningServer) > 0: print "Stopping Server: " + servername + "..." AdminControl.stopServer(servername, nodename) print "Server: " + servername + " Stopped." #-------------------------------------------------------------- # -- is a nodeSync MBean available on this node? #-------------------------------------------------------------- print "checking for the existence of a NodeSync MBean on node " + nodeName nodeSync = AdminControl.completeObjectName("type=NodeSync,node=" + nodeName + ",*") if len(nodeSync) == 0: print "Error -- NodeSync MBean not found for name " + nodeName return #-------------------------------------------------------------- # Uninstall an application on this server #-------------------------------------------------------------- appnode = domtree.getElementsByTagName('appname') appname = appnode.item(0).getAttribute('name') print "Uninstalling the application" appcheck = AdminConfig.getid("/Deployment:" + appname + "/") if len(appcheck)> 0: AdminApp.uninstall(appname) print "Application uninstalled" AdminConfig.save() enabled = AdminControl.getAttribute(nodeSync, "serverStartupSyncEnabled") if enabled == "false": print "Invoking synchronization for node " + nodeSync + " because serverStartupSyncEnabled is set to false..." AdminControl.invoke(nodeSync, "sync") sleep(20) print "Done with synchronization." if len (appcheck)<1: print "Application " + appname + " was not found." #-------------------------------------------------------------- # Install an application onto this server #-------------------------------------------------------------- print "Installing the application" appOptions = [] settings = "-server " + servername + " -node " + nodename + " -appname " + appname print "settings=" + settings print appOptions.append(settings) earnode = domtree.getElementsByTagName('path') earname = earnode.item(0).getAttribute('value') print "ear path" + earname installedapplication = AdminApp.install(earname, appOptions) print "Application installed" AdminConfig.save() #------------- # map modules to multiple servers & webservers #------------ modulesstring = AdminApp.taskInfo(earname,"MapModulesToServers") print "!!adminapp = " + modulesstring temp = modulesstring.split('are:\n') modlist = temp[1] virtualhostnode = domtree.getElementsByTagName('virtualhost') virtualhostname = virtualhostnode.item(0).getAttribute('name') webmodmapping = " -MapWebModToVH [" mappingoption = "-MapModulesToServers [" print "Modules = " + temp[1] mods = modlist.split('\r\n\r\n') print "mods = " +mods[0] for group in mods: tmp = group.split('\r\n') modname = tmp[0] if (len(modname)>0): modname = modname[8:] print "modname " + modname uriname = tmp[1] uriname = uriname[5:] print "uriname " + uriname if (uriname.find('WEB')>0): print "found it!" webmodmapping += "[\"" + modname + "\" " + uriname + " " + virtualhostname + "]" mappingoption += "[\"" + modname + "\" " + uriname + " " for jx in range(servers.getLength()): servername = servers.item(jx).getAttribute('servername') nodename = servers.item(jx).getAttribute('nodename') mappingoption += "WebSphere:cell="+ cellname + ",node=" + nodename + ",server=" + servername + "+" for kx in range(webservers.getLength()): webservername = webservers.item(kx).getAttribute('webservername') nodename = webservers.item(kx).getAttribute('nodename') mappingoption = mappingoption + "WebSphere:cell="+ cellname + ",node=" + nodename + ",server=" + webservername + "+" # remove the last plus sign mappingoption = mappingoption[:-1] mappingoption += "]" webmodmapping += "]" mappingoption += "]" print "mappingoption = " + mappingoption print "webmodmapping = " + webmodmapping opts = mappingoption + webmodmapping print AdminApp.edit(appname, opts) #-------------------------------------------------------------- # Add that applications shared libraries #-------------------------------------------------------------- print "ex1: adding shared Library" deployment = AdminConfig.getid("/Deployment:" + appname + "/") print "deployment=" print deployment appDeploy = AdminConfig.showAttribute(deployment, 'deployedObject') print appDeploy classLoader1 = AdminConfig.create('Classloader', appDeploy, [['mode', 'PARENT_FIRST']]) liblistnode = domtree.getElementsByTagName('librarylist') libsnode = liblistnode.item(0).getElementsByTagName('library') libs = libsnode.item(0).getAttribute('libraryname') if len(libs) > 0: print AdminConfig.create('LibraryRef', classLoader1, [['libraryName', libs], ['sharedClassloader', 'true']]) library = AdminConfig.getid("/Library:" + libs + "/") print "library=" + library print "Shared Library installed" #-------------------------------------------------------------- # Save all the changes #-------------------------------------------------------------- print "ex1: saving the configuration" AdminConfig.save() #-------------------------------------------------------------- # Find out if serverStartupSyncEnabled is true for this node # We just created this server, so if this attribute is set to # "false" we have to perform a sync. If we do not, the node we # are installing on may have an out-of-date copy of the config # data. #-------------------------------------------------------------- enabled = AdminControl.getAttribute(nodeSync, "serverStartupSyncEnabled") if enabled == "false": print "Invoking synchronization for node " + nodeSync + " because serverStartupSyncEnabled is set to false..." AdminControl.invoke(nodeSync, "sync") sleep(20) print "Done with synchronization." #-------------------------------------------------------------- # start the servers #-------------------------------------------------------------- for hx in range(servers.getLength()): servername = servers.item(hx).getAttribute('servername') nodename = servers.item(hx).getAttribute('nodename') print "starting server= "+servername AdminControl.startServer(servername, nodename) print "ex1: done." #----------------------------------------------------------------- # Main #----------------------------------------------------------------- # hard coding the nodename for testing purposes if (len(sys.argv) <= 0): print "ex1: this script requires 3 or 4 parameters: server name, node name, ear file, application name, and application libraries" print "e.g.: ex1 server2 mynode c:/WebSphere/AppServer/installableApps/jmsample.ear myappname applibs" else: filename = sys.argv[0] print "filename =" + filename parser = domparser() input=open(filename,'r') documentIS = sax.InputSource(input) parser.parse(documentIS) domtree = parser.getDocument() updateapp(domtree)