Question
Est-ce que quelqu'un a réussi à lancer une application web via un fichier de type webappctl
qui spécifie une configuration launchd dans leur webapp.plist
launchKeys
clé ?
Contexte
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 de Server.app sous les "Paramètres avancés" d'une configuration de site web.
Si vous jetez un coup d'œil à la ReadMe.txt
sur /Library/Server/Web/Config/apache2
il y a une section qui dit :
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 entrées du manuel, comme suggéré dans le ReadMe.txt par ces commandes 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 y a aussi un exemple de configuration de webapp /Library/Server/Web/Config/apache2/com.example.mywebapp.plist
qui contient des commentaires sur la façon dont cette liste peut être configurée.
Configuration
Dans mon cas, j'ai ajouté un webapp.plist
au /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 -->
<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>
En accordant une attention particulière à :
<key>launchKeys</key>
<array>
<string>org.levi.foo</string>
</array>
qui spécifie mon launchd.plist
qui est situé à /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>
<string>org.levi.foo</string>
<key>RunAtLoad</key>
<true/>
<key>Program</key>
<string>/Library/Tomcat/start.sh</string>
</dict>
</plist>
qui devrait simplement appeler le script /Library/Tomcat/start.sh
qui est 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!"
Numéro
Si j'utilise launchctl
pour charger manuellement le org.levi.foo.plist
:
$ sudo launchctl load org.levi.foo.plist
J'obtiens 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!
Cependant, si j'utilise webappctl
pour lancer la configuration de ma 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 message "Me voici !".
Cela semble indiquer que mon launchd.plist
ne va pas jusqu'à exécuter le script lorsqu'on essaie de démarrer via webappctl
mais je n'ai aucune idée de l'opération qui n'a pas pu être effectuée, ni pourquoi. Tous les fichiers que j'ai mentionnés sont la propriété de root:wheel
avec rw-r--r--
permissions, sauf pour le script, qui est rwx-r-xr-x
.
Donc, quelle magie doit être effectuée pour que ma webapp charge/décharge ma configuration launchd au démarrage/arrêt ?
Note complémentaire : Évidemment, ces configurations et scripts sont des exemples simples que j'ai utilisés à des fins de débogage et pour simplifier les détails ici. En réalité, j'essaie de mettre en place une instance de Tomcat en tant que "webapp" à exécuter derrière Apache 2 sur mon serveur, de sorte que je puisse déployer de véritables applications Web via Tomcat et les faire servir sur le Web).
Note secondaire 2 : Je sais que je peux installer mon launchd.plist
sur /Library/LaunchDaemons
et omettre le launchKeys
de mon webapp.plist
comme solution de rechange, mais cela ne me permet pas de démarrer/arrêter la webapp via Server.app (ou l'équivalent en ligne de commande), et, je veux dire, cela devrait le travail, non ?
Merci beaucoup,
Levi
(crosspost de https://discussions.apple.com/message/27946624 )