Задача — иметь возможность подключить дополнительную конфигурацию в файл server.xml сервера Tomcat.
Так как сам файл конфигурации server.xml является простым XML-файлом, то и выполнять это мы будем с помощью XML entity includes.
В начале файла добавляем строки:
<!DOCTYPE server [ <!ENTITY jdbcrealm SYSTEM "jdbcrealm.xml"> ]>
Путь к файлу можно указывать как относительно самого файла server.xml — так и от корня файловой системы, например:
<!ENTITY jdbcrealm SYSTEM "/home/user/APP/app-install/conf/jdbcrealm.xml">
Файл jdbcrealm.xml просто описывает realm подключения к базе Oracle — Tomcat: аутентификация пользователей с помощью JDBCRealm и MySQL или Oracle, его содержимое в данном примере такое:
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@oraclehost:1521:schemename" connectionName="DBusername" connectionPassword="DBuserpass" userTable="tmc_users_set" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles_set" roleNameCol="role_name" />
Далее, в нужном месте, вставляем вызов этого файла:
&jdbcrealm;
Полностью файл server.xml выглядит так:
<!DOCTYPE server [
<!ENTITY jdbcrealm SYSTEM "/home/user/APP/app-install/conf/jdbcrealm.xml">
]>
<Server port="${port.shutdown}" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<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" />
<Service name="APP">
<Connector
port="${port.http}"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="${port.https}"
/>
<Connector
port="${port.https}" protocol="HTTP/1.1"
maxThreads="200" SSLEnabled="true" scheme="https" secure="true" debug="0"
clientAuth="want" sslProtocol="TLS"
keystoreFile="/home/user/APP/app-install/conf/ssl/tomca7.jks"
keyAlias="tomcat7"
keystorePass="password"
truststoreFile="/home/user/APP/app-server/conf/.ssl/trustcacerts.jks"
truststorePass="password"
/>
<Engine
name="APP-UI"
defaultHost="localhost">
&jdbcrealm;
<Host
name="localhost"
appBase="${appbase}"
unpackWARs="false"
autoDeploy="false"
deployOnStartup="false">
<Context
path=""
docBase="app-application"
/>
<Valve
className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b"
/>
</Host>
</Engine>
</Service>
</Server>
Зачем это нужно? Пример использования на реальном приложении.
В зависимости от сервера, на котором запускается приложение, необходимо задавать различные сервера для аутентификации. Можно было бы использовать вариант с переменными и опциями $CATALINA_OPTS из статьи Tomcat: трюки — использование переменных в server.xml — но передавать пароли, хоть и зашифрованные, в аргументах, которые будут видны в выводе process status — не лучшая идея.
Потому — было добавлено несколько файлов для включения в server.xml:
$ ls -l conf/ | grep jdbc -rw-rw-r-- 1 user user 441 Jun 2 14:32 jdbcrealm-DEV.xml -rw-rw-r-- 1 user user 441 Jun 2 14:32 jdbcrealm-KIEV_DEV.xml -rw-rw-r-- 1 user user 441 Jun 2 14:32 jdbcrealm-UAT.xml -rw-rw-r-- 1 user user 441 Jun 2 13:35 jdbcrealm.xml
Далее — простой скрипт, который создаёт нужный файл при запуске, в зависимости от системной переменной $ENV:
$ cat bin/create_jdbc_conf.sh
#!/usr/bin/env bash
replace () {
echo -e "nWorking on $ENV box."
local FILE="$1"
local FILETOCOPY="$2"
local CONF="$3"
if [ -e $CONF ]; then
echo -e "nOld $FILE found;"
rm $CONF && echo -e "Old $FILE deleted." || echo -e "ERROR: can't delete old file $CONF!n"
fi
echo -e "nCopyiyng new $FILE - $FILETOCOPY;"
cp $FILETOCOPY $CONF && echo "New $FILE copied: " || echo -e n"ERROR - can't copy new file $FILETOCOPY to $CONF!n"
file $CONF
echo
}
replace "jdbcrealm.xml" "$APP_INSTALL/conf/jdbcrealm-$ENV.xml" "$APP_INSTALL/conf/jdbcrealm.xml";
И его выполнение:
$ ./bin/create_jdbc_conf.sh Working on KIEV_DEV box. Old jdbcrealm.xml found; Old jdbcrealm.xml deleted. Copyiyng new jdbcrealm.xml - /home/user/APP/app-install/conf/jdbcrealm-KIEV_DEV.xml; New jdbcrealm.xml copied: /home/user/APP/app-install/conf/jdbcrealm.xml: ASCII text
И при каждом запуске Tomcat — вызываем этот скрипт из startup.sh:
$ cat bin/startup.sh | grep jdbc source $APP_INSTALL/bin/create_jdbc_conf.sh
Его выполнение:
$ ./bin/startup.sh Working on KIEV_DEV box. Old jdbcrealm.xml found; Old jdbcrealm.xml deleted. Copyiyng new jdbcrealm.xml - /home/user/APP/app-install/conf/jdbcrealm-KIEV_DEV.xml; New jdbcrealm.xml copied: /home/user/APP/app-install/conf/jdbcrealm.xml: ASCII text Using CATALINA_BASE: /home/user/APP/app-server Using CATALINA_HOME: /home/user/APP/app-server Using CATALINA_TMPDIR: /home/user/APP/app-server/temp Using JRE_HOME: /home/user/APP/Java/jdk1.6.0_45/jre Using CLASSPATH: /home/user/APP/app-server/bin/bootstrap.jar:/home/user/APP/app-server/bin/tomcat-juli.jar Using CATALINA_PID: /home/user/APP/app-server/conf/catalina.pid Tomcat started.
«А теперь — со всем этим … на борту мы попробуем взлететь» (с)