+

Search Tips   |   Advanced Search

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 appserver, 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)