Here is an example from the demo server, but also we do a similar thing at penn. An env (e.g. WS, UI, loader/pspng) would have a dir and a command for patches for that env, and a script to run it.
e.g. the demo server UI
[appadmin@i2midev1 patchesAuto]$ more grouper.installer.properties # this should be before the version number #download.server.url = http://localhost:8090/grouper-ws/temp download.server.url = http://software.internet2.edu/grouper # default version to install grouper.version = 2.3.0 # default to install or upgrade (default is install) grouperInstaller.default.installOrUpgrade = patch # default app to upgrade: api, ui, ws, or client grouperInstaller.default.appToUpgrade = ui # default of directory where app will be installed grouperInstaller.default.installDirectory = /opt/tomcats/tomcat_f/webapps/grouper_v2_3 grouperInstaller.default.existingInstalledDirectory = /opt/tomcats/tomcat_f/webapps/grouper_v2_3 # if patches that are named grouper_v2_2_1_api_patch_0_test.tar.gz should be used to test a patch # NOTE: the demo server is where patches are tested, so we have this set, but its commented out, since you shouldnt # grouperInstaller.useTestPatches = true ############################## ## Autorun properties ## ## If you uncomment one of these properties it will be used as empty, only uncomment to use ## ############################## #### set this to true to try to use defaults for everything. Only things without default values will need to be set grouperInstaller.autorun.useDefaultsAsMuchAsAvailable = true [appadmin@i2midev1 patchesAuto]$ more run.sh #!/bin/bash export JAVA_HOME=/opt/java8 export PATH=$JAVA_HOME/bin:$PATH /sbin/service tomcat_f stop cd /opt/grouper/2.3/patchesAuto java -cp .:grouperInstaller.jar edu.internet2.middleware.grouperInstaller.GrouperInstaller rm -rf /opt/tomcats/tomcat_f/work/Catalina /sbin/service tomcat_f start [appadmin@i2midev1 patchesAuto]$
Here is an example run of that script (note, no user input is required)
[appadmin@i2midev1 patchesAuto]$ ./run.sh Shutting down tomcat_f Tomcat services: Using CATALINA_BASE: /opt/tomcats/tomcat_f Using CATALINA_HOME: /opt/tomcat6base Using CATALINA_TMPDIR: /opt/tomcats/tomcat_f/temp Using JRE_HOME: /opt/javas/java_f Using CLASSPATH: /opt/tomcat6base/bin/bootstrap.jar Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Waiting for exit... Killing the tomcat abruptly ..... Do you want to 'install' a new installation of grouper, 'upgrade' an existing installation, 'patch' an existing installation, 'admin' utilities, or 'createPatch' for Grouper developers (enter: 'install', 'upgrade', 'patch', 'admin', 'createPatch' or blank for the default) [patch]: <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.actionEgInstallUpgradePatch>: Enter in a Grouper temp directory to download tarballs (note: better if no spaces or special chars) [/opt/grouper/2.3/patchesAuto/tarballs]: <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.tarballDirectory>: What do you want to patch? api, ui, ws, pspng, or psp? [UI]: <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.appToUpgrade>: Where is the grouper UI installed? [/opt/tomcats/tomcat_f/webapps/grouper_v2_3]: <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.grouperWhereInstalled>: What do you want to do with patches (install, revert, status, fixIndexFile)? [install]: <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.patchAction>: Do you want to fix the patch index file (download all patches and see if they are installed?) (not recommended) (t|f)? [f]: <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.fixIndexFile>: ################ Checking patch grouper_v2_3_0_api_patch_0 Patch: grouper_v2_3_0_api_patch_0: was applied on: 2016/04/20 23:05:12 ... ################ Checking patch grouper_v2_3_0_api_patch_51 Patch: grouper_v2_3_0_api_patch_51: was applied on: 2017/01/26 08:39:23 ################ Checking patch grouper_v2_3_0_api_patch_52 .Downloading from URL: http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_api_patch_52.tar.gz to file: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_52.tar.gz Unzipping: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_52.tar.gz Expanding: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_52.tar to /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_52 Would you like to install all patches (t|f)? [t]: <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.installAllPatches>: Patch grouper_v2_3_0_api_patch_52 is low risk, is not a security patch GRP-1475: Delete loader jobs when loader group is deleted - added to end of property file: grouper_v2_3_0_api_patch_52.date = 2017/02/09 22:01:13 This patch requires all processes that user Grouper to be stopped. Please stop these processes if they are running and press <enter> to continue... <using default which is blank due to grouperInstaller.autorun.useDefaultsAsMuchAsAvailable and grouperInstaller.autorun.continueAfterPatchStopProcesses>: Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/attr/assign/AttributeAssign.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/attr/assign/AttributeAssign$3.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/attr/assign/AttributeAssign.java Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/attr/assign/AttributeAssign$2.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/attr/assign/AttributeAssign$1.class Patch successfully applied: grouper_v2_3_0_api_patch_52 - added to end of property file: grouper_v2_3_0_api_patch_52.state = applied ################ Checking patch grouper_v2_3_0_api_patch_53 Downloading from URL: http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_api_patch_53.tar.gz to file: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_53.tar.gz Unzipping: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_53.tar.gz Expanding: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_53.tar to /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_53 Patch grouper_v2_3_0_api_patch_53 is low risk, is not a security patch GRP-1445: Grouper loader real time updates - change log table for SQL jobs - added to end of property file: grouper_v2_3_0_api_patch_53.date = 2017/02/09 22:01:15 Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob$1.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob.java Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob$Row.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3DAO.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3DAO.java Patch successfully applied: grouper_v2_3_0_api_patch_53 - added to end of property file: grouper_v2_3_0_api_patch_53.state = applied ################ Checking patch grouper_v2_3_0_api_patch_54 Downloading from URL: http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_api_patch_54.tar.gz to file: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_54.tar.gz Unzipping: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_54.tar.gz Expanding: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_54.tar to /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_54 Patch grouper_v2_3_0_api_patch_54 is low risk, is not a security patch GRP-1476: Real time loader mysql issues - added to end of property file: grouper_v2_3_0_api_patch_54.date = 2017/02/09 22:01:17 Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob$1.class Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob.java Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/app/loader/GrouperLoaderIncrementalJob$Row.class Patch successfully applied: grouper_v2_3_0_api_patch_54 - added to end of property file: grouper_v2_3_0_api_patch_54.state = applied ################ Checking patch grouper_v2_3_0_api_patch_55 Downloading from URL: http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_api_patch_55.tar.gz to file: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_55.tar.gz Unzipping: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_55.tar.gz Expanding: /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_55.tar to /opt/grouper/2.3/patchesAuto/tarballs/patches/grouper_v2_3_0_api_patch_55 Patch grouper_v2_3_0_api_patch_55 is low risk, is not a security patch GRP-1477: Reduce error logging when code fails in threads that would be retried out of threads - added to end of property file: grouper_v2_3_0_api_patch_55.date = 2017/02/09 22:01:18 Applying file: /opt/tomcats/tomcat_f/webapps/grouper_v2_3/WEB-INF/classes/edu/internet2/middleware/grouper/util/GrouperUtil.java ... Patch successfully applied: grouper_v2_3_0_api_patch_55 - added to end of property file: grouper_v2_3_0_api_patch_55.state = applied ################ Checking patch grouper_v2_3_0_api_patch_56 Patch doesnt exist yet (not an error): http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_api_patch_56.tar.gz Patch doesnt exist yet (not an error): http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_api_patch_56_test.tar.gz ################ Checking patch grouper_v2_3_0_ui_patch_0 Patch: grouper_v2_3_0_ui_patch_0: was applied on: 2016/04/24 19:48:40 ... ################ Checking patch grouper_v2_3_0_ui_patch_15 Patch: grouper_v2_3_0_ui_patch_15: was applied on: 2017/01/24 19:47:09 ################ Checking patch grouper_v2_3_0_ui_patch_16 Patch doesnt exist yet (not an error): http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_ui_patch_16.tar.gz Patch doesnt exist yet (not an error): http://software.internet2.edu/grouper/release/2.3.0/patches/grouper_v2_3_0_ui_patch_16_test.tar.gz There are no new UI patches to install Starting tomcat_f Tomcat services: Using CATALINA_BASE: /opt/tomcats/tomcat_f Using CATALINA_HOME: /opt/tomcat6base Using CATALINA_TMPDIR: /opt/tomcats/tomcat_f/temp Using JRE_HOME: /opt/javas/java_f Using CLASSPATH: /opt/tomcat6base/bin/bootstrap.jar [appadmin@i2midev1 patchesAuto]$
Here is the demo server WS:
[appadmin@i2midev1 patchesAutoWs]$ ls grouperInstaller.jar grouper.installer.properties grouper.installer.properties~ run.sh run.sh~ tarballs [appadmin@i2midev1 patchesAutoWs]$ more grouper.installer.properties # this should be before the version number #download.server.url = http://localhost:8090/grouper-ws/temp download.server.url = http://software.internet2.edu/grouper # default version to install grouper.version = 2.3.0 # default to install or upgrade (default is install) grouperInstaller.default.installOrUpgrade = patch # default app to upgrade: api, ui, ws, or client grouperInstaller.default.appToUpgrade = ws # default of directory where app will be installed grouperInstaller.default.installDirectory = /opt/tomcats/tomcat_g/webapps/grouper-ws_v2_3 grouperInstaller.default.existingInstalledDirectory = /opt/tomcats/tomcat_g/webapps/grouper-ws_v2_3 # if patches that are named grouper_v2_2_1_api_patch_0_test.tar.gz should be used to test a patch # NOTE: the demo server is where patches are tested, so we have this set, but its commented out, since you shouldnt # grouperInstaller.useTestPatches = true ############################## ## Autorun properties ## ## If you uncomment one of these properties it will be used as empty, only uncomment to use ## ############################## #### set this to true to try to use defaults for everything. Only things without default values will need to be set grouperInstaller.autorun.useDefaultsAsMuchAsAvailable = true [appadmin@i2midev1 patchesAutoWs]$ more run.sh #!/bin/bash export JAVA_HOME=/opt/java6 export PATH=$JAVA_HOME/bin:$PATH /sbin/service tomcat_g stop cd /opt/grouper/2.3/patchesAutoWs java -cp .:grouperInstaller.jar edu.internet2.middleware.grouperInstaller.GrouperInstaller rm -rf /opt/tomcats/tomcat_g/work/Catalina /sbin/service tomcat_g start [appadmin@i2midev1 patchesAutoWs]$
Here is what we use at Penn for PSPNG/loader. Note, the /opt/appserv/tomcat/apps/grouperWs/loader directory is the API directory where the PSPNG is installed. See the "ls" at the bottom
[appadmin@fastprod-mgmt-01 patcher]$ ls grouperInstaller.jar grouper.installer.properties grouper.installer.properties~ run.sh run.sh~ tarballs [appadmin@fastprod-mgmt-01 patcher]$ more grouper.installer.properties # this should be before the version number #download.server.url = http://localhost:8090/grouper-ws/temp download.server.url = https://software.internet2.edu/grouper # default version to install grouper.version = 2.3.0 # default to install or upgrade (default is install) grouperInstaller.default.installOrUpgrade = patch # default app to upgrade: api, ui, ws, or client grouperInstaller.default.appToUpgrade = pspng # default of directory where app will be installed grouperInstaller.default.installDirectory = /opt/appserv/tomcat/apps/grouperWs/loader grouperInstaller.default.existingInstalledDirectory = /opt/appserv/tomcat/apps/grouperWs/loader ############################## ## Autorun properties ## ## If you uncomment one of these properties it will be used as empty, only uncomment to use ## ############################## #### set this to true to try to use defaults for everything. Only things without default values will need to be set grouperInstaller.autorun.useDefaultsAsMuchAsAvailable = true [appadmin@fastprod-mgmt-01 patcher]$ more run.sh #!/bin/bash export JAVA_HOME=/opt/appserv/common/java7 export PATH=$JAVA_HOME/bin:$PATH cd /opt/appserv/tomcat/apps/grouperWs/loader/patcher java -cp .:grouperInstaller.jar edu.internet2.middleware.grouperInstaller.GrouperInstaller echo echo "run this to complete the patching" echo "clusterCopy.sh grouperWs /opt/appserv/tomcat/apps/grouperWs/loader" echo "clusterRun fastprod-medium-a-01 '/sbin/service grouperLoader restart'" [appadmin@fastprod-mgmt-01 patcher]$ ls /opt/appserv/tomcat/apps/grouperWs/loader bin classes ddlScripts grouperPatchStatus.properties lib patcher [appadmin@fastprod-mgmt-01 patcher]$