Skip to content

Instantly share code, notes, and snippets.

@ggrandes
Last active March 6, 2022 16:52
Show Gist options
  • Save ggrandes/7505277 to your computer and use it in GitHub Desktop.
Save ggrandes/7505277 to your computer and use it in GitHub Desktop.
Automatic Deploy of Apache Tomcat (7.0.x; DEPRECATED; EOL 31/03/2021) and Log4J (1.2.x) (Linux)
#!/bin/bash
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Original Source:
# https://gist.github.com/ggrandes/7505277
#
DIST="${DIST:-dist}"
UNPACKED="${UNPACKED:-unpacked}"
TOMCAT_WANTED="${TOMCAT_WANTED:-7\.0\.[0-9]+}"
LOG4J_WANTED="${LOG4J_WANTED:-1\.2\.[0-9]+}"
MANAGER_WANTED="${MANAGER_WANTED:-false}"
EXAMPLES_WANTED="${EXAMPLES_WANTED:-false}"
SERVER_XML_WANTED="${SERVER_XML_WANTED:-false}"
CONTEXT_XML_WANTED="${CONTEXT_XML_WANTED:-false}"
#
getVersion () {
local xml="$1"
local wanted="$2"
wget --tries=8 --timeout=180 -qO - $xml |
awk -F'[<|>]' '($2 ~ /^version$/ && $3 ~ /^'$wanted'$/) { V=$3 } END { printf "%s\n",V }'
}
extractPlaceHolders () {
local file="$1"
echo '###' Placeholders for: $file
perl -e 'my %h; while (<STDIN>) { $h{$1}=1 if (m/\$\{([^}]+)\}/); }; print join("\n", sort(keys(%h))), "\n";' < $file
}
#
TOMCAT_VERSION_XML="https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/maven-metadata.xml"
LOG4J_VERSION_XML="https://repo1.maven.org/maven2/log4j/log4j/maven-metadata.xml"
TOMCAT_VERSION="$(getVersion $TOMCAT_VERSION_XML $TOMCAT_WANTED)"
LOG4J_VERSION="$(getVersion $LOG4J_VERSION_XML $LOG4J_WANTED)"
TOMCAT_ZIP_DOWNLOAD="http://archive.apache.org/dist/tomcat/tomcat-${TOMCAT_VERSION//.*}/v${TOMCAT_VERSION}/bin"
TOMCAT_MD5_DOWNLOAD="https://archive.apache.org/dist/tomcat/tomcat-${TOMCAT_VERSION//.*}/v${TOMCAT_VERSION}/bin"
LOG4J_ZIP_DOWNLOAD="http://archive.apache.org/dist/logging/log4j/${LOG4J_VERSION}"
LOG4J_MD5_DOWNLOAD="https://archive.apache.org/dist/logging/log4j/${LOG4J_VERSION}"
TOMCAT_DIST="${DIST}/tomcat-${TOMCAT_VERSION}"
LOG4J_DIST="${DIST}/log4j-${LOG4J_VERSION}"
CATALINA_DIR="apache-tomcat-${TOMCAT_VERSION}"
CATALINA_HOME="${UNPACKED}/${CATALINA_DIR}"
LOG4J_CONFIG="${CATALINA_HOME}/lib/log4j.properties"
OLD_LOG_CONFIG="${CATALINA_HOME}/conf/logging.properties"
SERVER_CONFIG="${CATALINA_HOME}/conf/server.xml"
CONTEXT_CONFIG="${CATALINA_HOME}/conf/context.xml"
AUTH_CONFIG="${CATALINA_HOME}/conf/tomcat-users.xml"
#
die () {
echo "FAILED" "$1"
exit 1;
}
checksum () {
local jar="$1"
local sha512="${jar}.sha512"
local md5="${jar}.md5"
local chk
[ -f "$jar" ] || die "FILE NOT FOUND: $jar"
[ -f "$md5" ] && chk=$md5
[ -f "$sha512" ] && chk=$sha512
[ -f "$chk" ] || die "FILE NOT FOUND: $sha512 / $md5"
grep "${jar}" "${chk}" > "${chk}.chk"
if [ "$?" != "0" ]; then
cat "${chk}" > "${chk}.chk"
echo -e " *${jar}" >> "${chk}.chk"
fi
[ -f "${sha512}.chk" ] && { sha512sum -c "${sha512}.chk" || die "Invalid SHA512: $sha512"; }
[ -f "${md5}.chk" ] && { md5sum -c "${md5}.chk" || die "Invalid MD5: $md5"; }
return 0
}
download () {
local binurl="$1"
local md5url="$2"
local file="$3"
local url;
for url in "${binurl}/${file}" "${md5url}/${file}.sha512" "${md5url}/${file}.md5"; do {
wget -c -N --tries=8 --timeout=180 "${url}"
} done
checksum "${file}" || die "CHECKSUM"
}
# Tomcat
(
mkdir -p "${TOMCAT_DIST}" 1>/dev/null 2>&1
cd "${TOMCAT_DIST}"
download "${TOMCAT_ZIP_DOWNLOAD}" "${TOMCAT_MD5_DOWNLOAD}" "apache-tomcat-${TOMCAT_VERSION}.zip"
download "${TOMCAT_ZIP_DOWNLOAD}/extras" "${TOMCAT_MD5_DOWNLOAD}/extras" "tomcat-juli.jar"
download "${TOMCAT_ZIP_DOWNLOAD}/extras" "${TOMCAT_MD5_DOWNLOAD}/extras" "tomcat-juli-adapters.jar"
)
# Log4j
(
mkdir -p "${LOG4J_DIST}" 1>/dev/null 2>&1
cd "${LOG4J_DIST}"
download "${LOG4J_ZIP_DOWNLOAD}" "${LOG4J_MD5_DOWNLOAD}" "log4j-${LOG4J_VERSION}.jar"
)
#
# Unpack
unzip -o "${TOMCAT_DIST}/apache-tomcat-${TOMCAT_VERSION}.zip" -d "${UNPACKED}/" || die "UNZIP"
chmod +x "${CATALINA_HOME}"/bin/*.sh || die "CHMOD"
#
# Customize Shell (Most significative parameters first - for ps/top view)
sed -e 's/$LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS/$CATALINA_OPTS $JAVA_OPTS $LOGGING_MANAGER/g' -i "${CATALINA_HOME}"/bin/catalina.sh
#
# Enable Log4J
cp -av "${TOMCAT_DIST}/tomcat-juli.jar" "${CATALINA_HOME}/bin/" || die "COPY LOG4J"
cp -av "${LOG4J_DIST}/log4j-${LOG4J_VERSION}.jar" "${TOMCAT_DIST}/tomcat-juli-adapters.jar" "${CATALINA_HOME}/lib/" || die "COPY LOG4J"
rm -fv "${OLD_LOG_CONFIG}" || die "REMOVE OLD LOG"
# Remove not used
rm -fv "${CATALINA_HOME}"/lib/{tomcat-i18n-??,tomcat7-websocket}.jar || die "REMOVE BAD JARS"
rm -fv "${CATALINA_HOME}"/bin/*.bat || die "REMOVE BAT"
if [ "${EXAMPLES_WANTED}" != "true" ]; then
rm -frv "${CATALINA_HOME}"/webapps/{ROOT,docs,examples} || die "REMOVE MANAGER EXAMPLES"
fi
if [ "${MANAGER_WANTED}" != "true" ]; then
rm -frv "${CATALINA_HOME}"/webapps/{host-manager,manager} || die "REMOVE MANAGER WEBAPPS"
fi
#
###### CONFIGURE
#
#
### LOG4J.PROPERTIES
#
cat > "${LOG4J_CONFIG}" <<'END'
log4j.rootLogger=INFO, TOMCAT
# Define all the appenders
log4j.appender.TOMCAT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.TOMCAT.File=${catalina.base}/logs/tomcat.log
log4j.appender.TOMCAT.Append=true
log4j.appender.TOMCAT.Encoding=UTF-8
# Roll-over the log once per day
log4j.appender.TOMCAT.DatePattern='.'yyyy-MM-dd
log4j.appender.TOMCAT.layout=org.apache.log4j.PatternLayout
log4j.appender.TOMCAT.layout.ConversionPattern=%d [%t] %-5p %c- %m%n
#log4j.appender.TOMCAT.layout.ConversionPattern=%d{ISO8601} [%t] %p %c [%X{IP}:%X{SESSION}:%x] %m%n
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d [%t] %-5p %c- %m%n
log4j.appender.LOCALHOST=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File=${catalina.base}/logs/localhost.log
log4j.appender.LOCALHOST.Append=true
log4j.appender.LOCALHOST.Encoding=UTF-8
log4j.appender.LOCALHOST.DatePattern='.'yyyy-MM-dd
log4j.appender.LOCALHOST.layout=org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern=%d [%t] %-5p %c- %m%n
# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, LOCALHOST
END
[ "${MANAGER_WANTED}" = "true" ] &&
cat >> "${LOG4J_CONFIG}" <<'END'
log4j.appender.MANAGER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MANAGER.File=${catalina.base}/logs/manager.log
log4j.appender.MANAGER.Append=true
log4j.appender.MANAGER.Encoding=UTF-8
log4j.appender.MANAGER.DatePattern='.'yyyy-MM-dd
log4j.appender.MANAGER.layout=org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern=%d [%t] %-5p %c- %m%n
log4j.appender.HOST-MANAGER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST-MANAGER.File=${catalina.base}/logs/host-manager.log
log4j.appender.HOST-MANAGER.Append=true
log4j.appender.HOST-MANAGER.Encoding=UTF-8
log4j.appender.HOST-MANAGER.DatePattern='.'yyyy-MM-dd
log4j.appender.HOST-MANAGER.layout=org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern=%d [%t] %-5p %c- %m%n
# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]=INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]=INFO, HOST-MANAGER
END
extractPlaceHolders "${LOG4J_CONFIG}"
#
### DEFAULT-SERVER
#
if [ "${SERVER_XML_WANTED}" = "true" ]; then
cat > "${SERVER_CONFIG}" <<'END'
<?xml version='1.0' encoding='utf-8'?>
<!-- Define Server, default shutdown port 8005 -->
<Server port="${tomcat.port.shutdown}" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
minSpareThreads="10"
maxThreads="${tomcat.executor.threads.max}"
prestartminSpareThreads="false" />
<!-- Define a SSL HTTP/1.1 Connector, default HTTP port 8443 -->
<!--
<Connector port="${tomcat.port.https}"
protocol="HTTP/1.1"
SSLEnabled="true" scheme="https" secure="true"
sslProtocol="TLS" clientAuth="false"
sslEnabledProtocols="TLSv1.2,TLSv1.1,TLSv1"
sessionCacheSize="8192" sessionTimeout="86400"
keystoreFile="conf/server.p12"
keystoreType="PKCS12" keystorePass="changeit"
server="Apache"
executor="tomcatThreadPool"
connectionTimeout="20000"
enableLookups="false" />
-->
<!-- Define a non-SSL HTTP/1.1 Connector, default HTTP port 8080 -->
<Connector port="${tomcat.port.http}"
protocol="HTTP/1.1"
server="Apache"
executor="tomcatThreadPool"
connectionTimeout="20000"
enableLookups="false" />
<!-- Define an AJP 1.3 Connector, default AJP port 8009 -->
<Connector port="${tomcat.port.ajp}"
protocol="AJP/1.3"
server="Apache"
executor="tomcatThreadPool"
connectionTimeout="20000"
enableLookups="false" />
<Engine name="Catalina" defaultHost="localhost"><!-- jvmRoute="jvm1" -->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- UserDatabase in the global JNDI under key "UserDatabase" -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase" />
</Realm>
<Host name="localhost" appBase="webapps"
autoDeploy="true" unpackWARs="false" deployXML="false">
<Valve className="org.apache.catalina.valves.ErrorReportValve"
showReport="false" showServerInfo="false" />
<!-- Access log pattern "common" -->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="access_log." suffix=""
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
-->
<!-- Access log pattern "trace" -->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="access_log." suffix=""
pattern="%h %l %u %t &quot;%r&quot; %s %b %D %I %S" />
-->
</Host>
</Engine>
</Service>
</Server>
END
extractPlaceHolders "${SERVER_CONFIG}"
fi
#
### DEFAULT-CONTEXT
#
if [ "${CONTEXT_XML_WANTED}" = "true" ]; then
cat > "${CONTEXT_CONFIG}" <<'END'
<?xml version='1.0' encoding='ISO-8859-1'?>
<Context swallowOutput="true" allowLinking="true" failCtxIfServletStartFails="true">
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
searchVirtualFirst="true"
virtualClasspath="${tomcat.loader.virtualwebapp.classpath}" />
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
</Context>
END
extractPlaceHolders "${CONTEXT_CONFIG}"
fi
#
### TOMCAT-USERS
#
cat > "${AUTH_CONFIG}" <<'END'
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="example-role"/>
<!--
manager-gui - allows access to the HTML GUI and the status pages
manager-script - allows access to the text interface and the status pages
manager-jmx - allows access to the JMX proxy and the status pages
manager-status - allows access to the status pages only
admin-gui - allows access to the HTML GUI
admin-script - allows access to the text interface
-->
<!--
<user username="tomcat" password="changeit" roles="example-role,manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
-->
</tomcat-users>
END
#
echo ${TOMCAT_VERSION} > ${UNPACKED}/tomcat7-version
rm -f ${UNPACKED}/tomcat7-home 1>/dev/null 2>&1; ln -fs ${CATALINA_DIR} ${UNPACKED}/tomcat7-home
#
echo ${TOMCAT_VERSION} > ${UNPACKED}/tomcat-version
rm -f ${UNPACKED}/tomcat-home 1>/dev/null 2>&1; ln -fs ${CATALINA_DIR} ${UNPACKED}/tomcat-home
#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment