4 votos

Configurar Yosemite Server WebApp con LaunchD

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 )

2voto

Pablo Puntos 39

Resulta que el programa de instalación lo puse en mi pregunta es correcta, y funciona como se esperaba. Esto fue confirmado por @klanomath, que fue capaz de reproducir la configuración de mi y ver que las cosas funcionen como se esperaba. Específicamente:

Después de la emisión:

$ sudo webappctl start org.apache.tomcat

Llego el esperado "¡Aquí estoy!" mensaje en /var/log/system.log.

La solución para mí fue simplemente reiniciar mi máquina.

Tome nota, aparentemente, la launchd configuraciones en /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/ aparecen en la memoria caché de alguna manera, y los cambios realizados no son recogidos por webappctl hasta algo* se reinicia.

Esperemos que esto de salvar a alguien el día que me llevó a tener una gentil "¿has probado a reiniciar?" propuesta de resolver el problema.

Levi

*No estoy seguro de lo que debe ser reiniciado... traté de iniciar y detener el servidor web y el Servidor.aplicación, activación y desactivación de la aplicación web desde dentro de la Configuración.aplicación de interfaz gráfica de usuario, con ningún efecto. La única cosa que recoger los cambios que se trataba de un reinicio del sistema.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X