4 votes

Configuration de la WebApp du serveur Yosemite avec LaunchD

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 )

2voto

levigroker Points 161

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

Après l'émission :

$ sudo webappctl start org.apache.tomcat

J'obtiens le message attendu "Me voici !" en /var/log/system.log .

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

Prenez note, apparemment, des configurations de launchd en /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/ semblent être mis en cache d'une manière ou d'une autre, et les modifications qui y sont apportées ne sont pas reprises par webappctl jusqu'à ce que quelque chose* soit redémarré.

J'espère que cela permettra à quelqu'un d'économiser la journée qu'il m'a fallu pour qu'un simple "avez-vous essayé de redémarrer ?" permette de 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 serveur web et Server.app, d'activer et de désactiver l'application web depuis l'interface graphique Settings.app, sans aucun effet. La seule chose qui a détecté les changements a été un redémarrage complet du système.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X