Configurez Yosemite Server WebApp avec LaunchD

Question

Quelqu'un at-il pu démarrer une application web via une configuration webappctl qui spécifie une configuration launchd dans sa key de webapp.plist launchKeys ?

Context

Plus précisément, avec Server.app installé, on peut, en théorie, configurer des applications Web personnalisées qui apparaîtraient dans l'interface graphique Server.app sous les «Paramètres avancés» d'une configuration de site Web.

Si vous consultez le ReadMe.txt dans /Library/Server/Web/Config/apache2 , une section indique:

 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). 

Vous pouvez également lire les inputs man, comme suggéré dans ReadMe.txt par ces commands 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 

Il existe également un exemple de configuration /Library/Server/Web/Config/apache2/com.example.mywebapp.plist qui contient quelques commentaires sur la façon dont ce langage peut être configuré.

Installer

Dans mon cas, j'ai ajouté un webapp.plist au webapp.plist /Library/Server/Web/Config/apache2/ qui ressemble à ceci:

 <?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 --> <ssortingng>org.levi.foo</ssortingng> </array> <key>name</key> <ssortingng>org.apache.tomcat</ssortingng> <key>displayName</key> <!-- Name shown in Server app --> <ssortingng>Tomcat</ssortingng> <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 --> <ssortingng>/Library/Tomcat/Home/bin/catalina.sh</ssortingng> <key>sslPolicy</key> <!-- Determines webapp SSL behavior --> <integer>0</integer> <!-- 0: default, UseSSLWhenEnabled --> <!-- 1: UseSSLAlways --> <!-- 2: UseSSLOnlyWhenCertificateIsTrustable --> <!-- 3: UseSSLNever --> <!-- 4: UseSSLAndNonSSL --> </dict> </plist> 

Prêter une attention particulière à:

 <key>launchKeys</key> <array> <ssortingng>org.levi.foo</ssortingng> </array> 

qui spécifie mon launchd.plist qui se trouve dans /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plist et ressemble à:

 <?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> <ssortingng>org.levi.foo</ssortingng> <key>RunAtLoad</key> <true/> <key>Program</key> <ssortingng>/Library/Tomcat/start.sh</ssortingng> </dict> </plist> 

qui devrait simplement appeler le script /Library/Tomcat/start.sh qui est tout simplement:

 #!/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!" 

Problème

Si j'utilise launchctl pour charger manuellement la page org.levi.foo.plist :

 $ sudo launchctl load org.levi.foo.plist 

Je reçois le message attendu dans /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! 

Toutefois, si j'utilise webappctl pour démarrer ma configuration webapp (ci-dessus):

 $ sudo webappctl start org.apache.tomcat 

Je reçois une erreur dans /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 

et je ne vois pas mon "Ici, je suis!" message.

Cela semble indiquer que mon launchd.plist n'est pas aussi loin que d'exécuter le script lors de la tentative de démarrage via webappctl , mais je n'ai aucune idée de l'opération qui n'a pas pu être complétée ou pourquoi pas. Tous les files que j'ai mentionnés appartiennent à root:wheel with rw-r--r-- permissions, à l'exception du script, qui est rwx-r-xr-x .

Alors, quelle magie doit être effectuée pour que mon webapp puisse charger / décharger ma configuration lancée au démarrage / arrêt?

Note latérale: Évidemment, ces configurations et scripts sont des exemples simples que j'ai utilisés à des fins de debugging et pour simplifier les détails ici. En réalité, j'essaie de résister à une instance de Tomcat en tant que "webapp" pour courir derrière Apache 2 sur mon server afin que je puisse déployer des applications Web authentiques via Tomcat et les faire fonctionner sur le Web.)

Note latérale 2: Je sais que je peux installer mon launchd.plist dans /Library/LaunchDaemons , et omettre le launchKeys de mon webapp.plist comme solution de contournement, mais cela ne me permet pas de démarrer / arrêter la webapp via Server.app (ou l'équivalent de la command line), et je veux dire, ça devrait fonctionner, n'est-ce pas?

Merci beaucoup,

Levi

(crosspost de https://discussions.apple.com/message/27946624 )

Il s'avère que l'installation que j'ai posée dans ma question est correcte et fonctionne comme prévu. Ceci a été confirmé par @klanomath, qui a pu reproduire ma configuration et voir les choses fonctionner comme prévu. Plus précisément:

Après avoir publié:

 $ sudo webappctl start org.apache.tomcat 

Je reçois le prévu "Ici, je suis!" message dans /var/log/system.log .

La solution pour moi était simplement de redémarrer ma machine.

Prenez note, en apparence, des configurations /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/ dans /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/ semblent être mis en cache de quelque façon, et les modifications apscopes ne sont pas récupérées par webappctl jusqu'à ce que quelque chose * soit redémarré.

J'espère que cela sauvera quelqu'un le jour où il m'a fallu un doux "avez-vous essayé de redémarrer?" suggestion résoudre le problème.

Levi

* Je ne suis pas sûr de ce qui doit être redémarré … J'ai essayé de démarrer et d'arrêter le server Web et Server.app, en activant et en désactivant l'application Web à partir de Setting.app GUI, sans effet. La seule chose qui a repris les changements était un redémarrage complet du système.