Interface de compilation/reboot/logging avancé pour les développeurs Core
Bonjour à tous,

aujourd'hui, je vous propose d'utiliser le WebCompiler, une interface que j'avais développé il y a quelques mois pour mon serveur Mist-Eria.


Fonctionnalités disponibles
  • Interface Web regroupant trois pages de log différentes.
    • Page 1 : Compilation. Affiche le résultat de la dernière compilation effectuée. Affiche en rouge les lignes comportant une erreur (pour une meilleure identification des problèmes de compilation.
    • Page 2 : Crash. Affiche les derniers crashs du serveur avec un rapport GDB de l'erreur, ainsi qu'un bout (20 lignes) du fichier de log principal afin d'avoir éventuellement des informations supplémentaires (spellid qui fait crash, par exemple).
    • Page 3 : Logs. Affiche une page de log spécifique.
  • L'ensemble de ces pages sont dynamiques. Elles sont mises à jour toutes les secondes. Nul besoin de faire F5 pour mettre à jour l'affichage.
  • Plusieurs personne peuvent voir l'interface et l'utiliser en même temps.
  • Il y a également quatre fonctionnalités en haut à gauche qui permettent de gérer le serveur.
    • Le bouton de recompilation. Lance un script qui effectue un git pull puis une recompilation du serveur.
    • Le bouton de redémarrage. Redémarre le serveur de jeu (en réalité, le fait crasher, puis le restarter le redémarre juste après).
    • Le bouton de pause. Permet de mettre en Pause la mise à jour de l'affichage des trois fenêtres (pour pouvoir copier coller un message d'erreur, par exemple).
    • Le champ de sélection du log à afficher et le nombre de lignes affichées. Permet de choisir le nombre de lignes et le log affiché sur la fenêtre de droite.

Voici à quoi ressemble l'interface :

   

Le revers de la médaille, c'est que ces différentes fonctionnalités demandent d'être configurées correctement, et c'est un peu long. C'est donc l'objet de la seconde partie.


Configuration du système


1) Pré-requis

Ce système, pour être totalement fonctionnel, à besoin de plusieurs applications pour fonctionner.

Premièrement, le système utilise plusieurs scripts BASH. Il vous faut donc être sous Linux.

Deuxièmement, le système a besoin de faire tourner des scripts en continu. Il vous faut donc (pour simplifier le travail) utiliser le logiciel screen. Je ne donnerais pas d'explications sur son fonctionnement ici, sachez juste que ça permet de garder des consoles ouvertes même lorsque vous vous déconnectez du serveur.

Troisièmement, le système a besoin d'un serveur Web avec le support du PHP. Moi, j'utilise Apache, mais libre à vous d'utiliser le serveur que vous souhaitez.

Quatrièmement, le système utilise gdb pour récupérer les crashs du serveur. La encore, je ne fournirais pas d'explications supplémentaires. Pour gdb, il n'y aura "rien" à comprendre, seulement à compiler votre serveur en mode Debug (option WITH_COREDEBUG à 1) et utiliser le script que je mets à votre disposition.

Enfin, le système utilise le système de log interne du serveur. Cela veut dire que vous devez avoir compris le fonctionnement des Loggers et Appenders dans le fichier worldserver.conf du serveur.

Ces scripts sont donc à destination d'un public un minimum habitué à Linux, les débutants devront malheureusement passer leur chemin.


2) configuration des logs

La première chose à faire est de configurer votre serveur pour générer des logs utilisables. Je n'expliquerais pas ici comment fonctionnent les Appenders et Loggers, la documentation dans le worldserver.conf est suffisante. La seule chose nécessaire est de configurer le logsDir pour que les logs soient sauvegardés dans un sous dossier. Pour ma part, ce sera le répertoire logs (donc serverdir/bin/logs/).

3) configuration du restarter


Premièrement, placez vous dans le dossier de votre jeu (le dossier bin) et créez le dossier webcompiler (donc serverdir/bin/webcompiler/).

mkdir webcompiler

puis donnez lui des accès 777 afin que notre utilisateur web puisse y avoir accès. Donnez également ces mêmes accès au dossier logs pour les mêmes raisons.

chmod -R 777 webcompiler
chmod -R 777 logs

Configurez également le pidFile dans le worldserver.conf pour avoir un fichier contenant le pid (numéro de processus) du serveur. Cela permettra de le redémarrer par la suite.

Ensuite, copiez et coller ce code dans le fichier restarter.sh (donc serverdir/bin/restarter.sh) :

#!/bin/sh

crashlog="logs/Crash.log"
serverlog="logs/Server.log"
while true; do
        gdb -batch -x gdb.sh worldserver
        sleep 2
        tail -20 $serverlog >> gdb.txt
        cp gdb.txt $crashlog
done

Les deux variables crashlog et serverlog sont configurables si nécessaires (crashlog sera le fichier de log contenant les crashs, serverlog est le fichier de log général généré par le serveur).

Le second script à créer est le script gdb.sh (donc serverdir/bin/gdb.sh) :
set logging on
set pagination off

run
bt full

quit

Vous pouvez modifier le nom du script, mais dans ce cas il faut modifier son appel dans le restarter.sh

Donnez ensuite le droit d'exécution à ces deux fichiers
chmod +x restarter.sh gdb.sh

Enfin, créez une nouvelle fenêtre screen et exécutez le restarter.sh

Voilà, c'est tout pour la partie restarter

4)Configuration du Compiler

je pars du principe que vous avez un dossier de compilation dans lequel vous avez créé le dossier build dans lequel vous compilez votre serveur.

Déplacez-vous dans ce dossier build et créez les deux fichiers suivants :

compile.sh :
git pull
make -j7 install

Si votre serveur n'est pas lié à un dépôt git tiers sur lequel vous envoyez vos modifications, enlevez simplement la première ligne (celle avec le git pull).

autocompile.sh :
#!/bin/sh

base="/serverdir/bin/";
datadir=$base"webcompiler/"
logsdir=$base"logs/"
pidFile=$base"world.pid"


compile=$datadir"compile"
restart=$datadir"restart"
outputCompile=$logsdir"compile.log"


while true; do
        if [ -e $restart ]; then
                echo "Restarting server"
                kill -9 `cat $pidFile`
                sleep 5
                rm $restart
        elif [ -e $compile ]; then
                echo "Starting compilation"
                echo "Starting compilation :" > $outputCompile
                date >> $outputCompile
                ./compile.sh 1>>$outputCompile 2>>$outputCompile
                echo "Finished compiling"
                echo "Finished compiling :" >> $outputCompile
                date >> $outputCompile
                sleep 5
                rm $compile
        else
                echo "Nothing to compile"
                sleep 5
        fi
done

Les quatre premières variables sont à configurer. Il faut définir le répertoire de base de votre serveur (là ou est exécuté le worldserver), le répertoire webcompiler créé en 3), le dossier de logs, et enfin le nom du fichier contenant le pid, également défini dans le worldserver.conf.

Une fois encore, ajoutez le droit d'exécution à ces deux scripts.

chmod +x compile.sh autocompile.sh

Enfin, exécutez le fichier autocompile.sh dans un second screen afin qu'il tourne en boucle.

Voilà qui est fait pour le compiler. Il nous reste encore l'interface web.

5) L'interface web

Dernier élément, mais non des moindres, l'interface web qui va relier tout ça Smile

Premièrement, il faut récupérer les fichiers du dossier web contenu dans l'archive mise à votre disposition et les coller dans un dossier de votre serveur web. Pour moi ce sera le dossier webcompiler.

Deuxièmement, il vous faut ouvrir le fichier config.php
et modifier le fichier en conséquence (adaptez le chemin vers le dossier de votre serveur. Si vous souhaitez afficher d'autres logs que le Server.log, il vous suffit d'ajouter le nom du fichier de log en reprenant le même shéma, après avoir modifié votre worldserver.conf pour générer ce fichier évidemment).

Il ne vous reste plus qu'à vous rendre dans votre navigateur, à taper l'adresse de cette interface, et d'apprécier les logs qui défilent devant vos yeux ébahis :3

Derniers rappels au cas ou

Comme la procédure d'installation est assez longue, je rappelle les éléments principaux :

L'archive comporte 3 dossiers :
  • Web contient tous les fichiers à mettre dans l'interface web. Il faut ensuite modifier le config.php pour adapter l'interface à votre serveur.
  • restarter contient les 2 fichiers nécessaires au redémarrage de votre serveur. Ces fichiers sont à mettre à côté de votre worldserver. N'oubliez pas de créer le dossier webcompiler de modifier le restarter.sh puis le worldserver.conf pour ajouter le pid et enregistrer les logs dans le sous-dossier logs.
  • compiler contient les 2 fichiers nécessaires à la recompilation et au redémarrage de votre serveur. N'oubliez pas de modifier le fichier autocompile.sh pour qu'il soit également adapté à votre serveur.

J'ai tout dit il me semble, face à la complexité de la procédure, j'ai demandé à plusieurs personnes de tester chez eux pour voir si cela est réalisable,


Comme toujours, je reste disponible pour toute demande supplémentaire Wink
Pièce(s) jointe(s)
.tgz  webcompiler.tgz (Taille : 34.37 Ko)
Un grand merci pour ce partage qui va en aider plus d'un (et moi le premier !) Smile

Retourner en haut WoW-Emu