Last active
March 6, 2022 16:52
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 "%r" %s %b" /> | |
--> | |
<!-- Access log pattern "trace" --> | |
<!-- | |
<Valve className="org.apache.catalina.valves.AccessLogValve" | |
directory="logs" prefix="access_log." suffix="" | |
pattern="%h %l %u %t "%r" %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