Pregunta
Alguien ha estado con éxito capaz de iniciar una webapp a través de un webappctl
de configuración que especifica un launchd de configuración en sus webapp.plist
launchKeys
clave?
De fondo
Específicamente, con el Servidor.instalada la aplicación, uno puede, en teoría, configurar aplicaciones web personalizadas que aparecen en el Servidor.aplicación de la GUI en virtud de la "Configuración Avanzada" de un sitio Web de configuración.
Si usted echa un vistazo a la ReadMe.txt
en /Library/Server/Web/Config/apache2
hay una sección que dice:
webapps/
This directory contains the webapp.plist files for all defined webapps.
See the man page for webapp.plist(8) and webappctl(8).
(Server app man pages are present in /Applications/Server.app/Contents/ServerRoot/usr/share/man/.)
Administrators are strongly encouraged to use the webapp mechanism
instead of modifying virtual host config files directly.
In general, you can place Apache configuration directives in an "Include" file,
and create a webapp.plist file that references that Include file.
You can then activate or de-activate that Include file for the default
sites, or for specific custom sites, by using webappctl(8).
También puede leer el hombre de las entradas, como se sugiere en el ReadMe.txt por estos comandos de terminal:
man -M /Applications/Server.app/Contents/ServerRoot/usr/share/man/ webapp.plist
man -M /Applications/Server.app/Contents/ServerRoot/usr/share/man/ webappctl
También hay una muestra de la webapp de configuración /Library/Server/Web/Config/apache2/com.example.mywebapp.plist
que tiene algún comentario acerca de cómo este plist podría ser configurado.
El programa de instalación
En mi caso he añadido un webapp.plist
a la /Library/Server/Web/Config/apache2/
directorio que se parece a esto:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- See man pages for webapp.plist(5) and webappctl(8) for information about webapp.plist -->
<plist version="1.0">
<dict>
<key>includeFiles</key>
<array/> <!-- Include files are activated in virtual host when webapp is started -->
<key>launchKeys</key>
<array> <!-- Launchd plists in /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons are loaded when webapp is started -->
<string>org.levi.foo</string>
</array>
<key>name</key>
<string>org.apache.tomcat</string>
<key>displayName</key> <!-- Name shown in Server app -->
<string>Tomcat</string>
<key>proxies</key> <!-- ProxyPass/ProxyPassReverse directives are activated when webapp is started -->
<dict/>
<key>requiredModuleNames</key>
<array/>
<key>installationIndicatorFilePath</key> <!-- The presence of this file indicates web app is installed -->
<string>/Library/Tomcat/Home/bin/catalina.sh</string>
<key>sslPolicy</key> <!-- Determines webapp SSL behavior -->
<integer>0</integer> <!-- 0: default, UseSSLWhenEnabled -->
<!-- 1: UseSSLAlways -->
<!-- 2: UseSSLOnlyWhenCertificateIsTrustable -->
<!-- 3: UseSSLNever -->
<!-- 4: UseSSLAndNonSSL -->
</dict>
</plist>
Prestando especial atención a:
<key>launchKeys</key>
<array>
<string>org.levi.foo</string>
</array>
en el que se especifica mi launchd.plist
que se encuentra en /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plist
y se ve como:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.levi.foo</string>
<key>RunAtLoad</key>
<true/>
<key>Program</key>
<string>/Library/Tomcat/start.sh</string>
</dict>
</plist>
que sólo tiene que llamar el script /Library/Tomcat/start.sh
que es simplemente:
#!/bin/bash
BASENAME=`basename $0`
LOGGER_B="/usr/bin/logger"
function log {
MESSAGE="$1"
${LOGGER_B} -i -p daemon.notice -t ${BASENAME} ${MESSAGE}
}
log "Here I am!"
Problema
Si utilizo launchctl
a cargar manualmente el org.levi.foo.plist
:
$ sudo launchctl load org.levi.foo.plist
Me sale el mensaje esperado en /var/log/system.log
:
Apr 2 16:12:01 host sudo[85791]: levi : TTY=ttys000 ; PWD=/Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons ; USER=root ; COMMAND=/bin/launchctl load org.levi.foo.plist
Apr 2 16:12:01 host start.sh[85795]: Here I am!
Sin embargo, si utilizo webappctl
a empezar mi webapp de configuración (arriba):
$ sudo webappctl start org.apache.tomcat
Me da un error en /var/log/system.log
:
Apr 2 16:18:46 host sudo[85904]: levi : TTY=ttys000 ; PWD=/Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons ; USER=root ; COMMAND=/Applications/Server.app/Contents/ServerRoot/usr/sbin/webappctl start org.apache.tomcat
Apr 2 16:18:47 host serverctl[85914]: ERROR: The operation couldn't be completed. Operation not permitted
Apr 2 16:18:49 host serverctl[85915]: ERROR: The operation couldn't be completed. Operation not permitted
Apr 2 16:18:49 host servermgr_web[85908]: XSWebConfig:ERROR: Failed on second attempt to load /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plist
y no veo mi "¡Aquí estoy!" mensaje.
Esto parece indicar que mi launchd.plist
no se la medida de lo ejecuta la secuencia de comandos cuando se trata a través de la webappctl
, pero no tengo idea de lo que la operación no pudo completarse, o por qué no. Todos los archivos que he mencionado son propiedad de root:wheel
con rw-r--r--
permisos, excepto para la secuencia de comandos, que es rwx-r-xr-x
.
Así que, ¿qué magia se deben realizar para obtener mi webapp para cargar/descargar mi launchd de configuración en inicio/parada?
Nota al margen: Obviamente estas configuraciones y secuencias de comandos son simples ejemplos que he usado para fines de depuración y para simplificar los detalles aquí. En realidad estoy tratando de levantarse una instancia de Tomcat como un "webapp" para correr detrás de Apache 2 en mi servidor de tal manera que puedo implementar verdaderas aplicaciones web a través de Tomcat y les han servido para la web.)
Nota 2:
Sé que puedo instalar mi launchd.plist
en /Library/LaunchDaemons
, y omitir la launchKeys
de mi webapp.plist
como solución, pero este no me permite iniciar/detener la webapp a través del Servidor.la aplicación (o el equivalente de línea de comandos), y, quiero decir, se debe trabajar, ¿verdad?
Muchas gracias,
Levi
(de postear algo de https://discussions.apple.com/message/27946624 )