[Linux / MAC OS] Servcraft : installez automatiquement votre serveur en ligne de commande

Que pensez-vous de ce script?

  • Il fonctionne mal

    Votes: 0 0.0%

  • Total voters
    1

rezemika

Initiateur du projet "Mers & océans"
19 Mars 2011
1 306
197
102
Bonjour!

Je me suis rendu compte que beaucoup de personnes avaient du mal à installer un serveur Minecraft, vanilla ou non.

J'ai donc décidé de créer un script BASH qui automatique l'installation et le lancement de votre serveur sous Linux et MAC OS.

Que peut-il faire?

Il peut installer le serveur Minecraft officiel ou la dernière version recommandée ou en développement de Craftbukkit.
Il exécutera la commande de votre choix après la fin de l'installation (optionnel).
Vous pourrez lancer votre serveur par une simple commande.

Comment ça marche?

C'est très simple :
vous n'avez qu'à déplacer le fichier fourni dans le dossier qui stock vos scripts.
Pour Linux, c'est dans "/usr/bin".
Pour MAC OS, c'est usr/local/bin".

Ensuite, ouvrez un terminal et faites la commande :
servcraft install vanilla => installe la dernière version du serveur officiel
servcraft install craftbukkit rec => installe la dernière version recommandée de Craftbukkit
servcraft install craftbukkit dev => installe la dernière version en développement de Craftbukkit

Un message vous demande alors si vous souhaitez que le script lance une commande dés que l'installation est terminée.
Appuyez sur Entrée sans rien écrire pour ne rien faire.
Vous verrez alors l'installation se faire et un message vous préviendra quand elle sera terminée.
C'est là que la commande s'exécutera si vous en avez prévu une.[/spoiler]

Démarrer le serveur
Pour démarrer le serveur, faites 'servcraft l'.
Le serveur démarrera alors dans l'invite de commande.

Aide
Si vous avez oublié une commande et que vous n'avez pas envie de retourner vers ce topic pour la retrouver, faites 'servcraft help'.
Un message d'aide s'affichera et vous rappellera toutes les commandes disponibles.

Licence

Ce script est bien entendu sous licence Creative Commons By-SA.
Partagez-le et modifiez-le autant que vous le voulez.

NB : Faites attention en modifiant le script. Une commande utilisée à mauvais escient peut endommager vos données ou des fichiers systèmes.

Code:
#!/bin/bash
 
#Variable pour le nom du dossier
nom_dossier=Serveur_minecraft_servcraft
 
#Variable pour la commande à exécuter après l'installation
commande_install
 
#Variables pour les couleurs du texte d'aide
#Source : http://www.commentcamarche.net/forum/affich-21439200-bash-afficher-du-texte-en-couleur
rougefonce='\e[0;31m'
gris='\e[1;30m'
neutre='\e[0;m'
 
#Fonctions :
 
installation_vanilla () {
#Pour installer un serveur Minecraft classique
echo "Entrez une commande à lancer après la fin de l'installation."
read -p "Laissez vide pour ne rien faire : " commande_install
cd ~/
mkdir $nom_dossier
echo "Dossier du serveur créé"
cd $nom_dossier
wget https://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar?
echo "Téléchargement terminé"
commande_fin_installation
exit
}
 
installation_craftbukkit_rec () {
#Pour installer la dernière version recommandée de Craftbukkit
echo "Entrez une commande à lancer après la fin de l'installation."
read -p "Laissez vide pour ne rien faire : " commande_install
cd ~/
mkdir $nom_dossier
echo "Dossier du serveur créé"
cd $nom_dossier
wget http://dl.bukkit.org/latest-rb/craftbukkit.jar
echo "Téléchargement terminé"
commande_fin_installation
exit
}
 
installation_craftbukkit_dev () {
#Pour installer la dernière version de dévelopement de Craftbukkit
echo "Entrez une commande à lancer après la fin de l'installation."
read -p "Laissez vide pour ne rien faire : " commande_install
cd ~/
mkdir $nom_dossier
echo "Dossier du serveur créé"
cd $nom_dossier
wget http://dl.bukkit.org/latest-dev/craftbukkit.jar
echo "Téléchargement terminé"
commande_fin_installation
exit
}
 
lancement () {
#Pour lancer le serveur une fois qu'il est installé
echo "Lancement du serveur"
cd ~/$nom_dossier
#On vérifie si le .jar de la version classique est présent. Sinon, on tente de lancer le craftbukkit.jar. Si on ne peut pas, on signale l'erreur.
if [ -d "minecraft_server.jar" ]; then
    java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
elif [ -d "craftbukkit.jar" ]; then
    java -Xms1024M -Xmx1024M -jar craftbukkit.jar
else
    echo "Erreur : impossible de lancer un fichier 'minecraft_server.jar' ou 'craftbukkit.jar'."
fi
}
 
texte_aide () {
#Un petit manuel si vous êtes perdu.
echo -e "${rougefonce}    Aide de la commande 'servcraft' ${neutre}"
echo ""
echo -e "${gris}  Installation ${neutre}"
echo ""
echo "La commande d'installation est 'servcraft install'. Faites-la suivre de 'vanilla' pour installer la version classique du serveur."
echo "Pour installer un serveur avec Craftbukkit, faites 'servcraft install craftbukkit' suivi de 'rec' pour installer la dernière verson recommandée de Craftbukkit ou de 'dev' pour installer la dernière version en dévelopement."
echo "Le dossier d'installation se nomme 'Serveur_minecraft_servcraft' dans le dossier 'home' de l'utilisateur qui éxecute la commande."
echo "Avant que l'installation ne débute, un message vous demandera d'netrez une commande à exécuter à la fin de l'instalaltion. Laissez le champ vide et appuyez sur Entrée pour ne rien faire à la fin de l'installation."
echo ""
echo -e "${gris}  Démarrage du serveur ${neutre}"
echo ""
echo "Pour démarrer le serveur, faites 'servcraft l'. Le script lancera automatiquement le fichier .jar classique ou de Craftbukkit ou vous signalera une erreur le cas échéant."
echo ""
echo -e "${gris}  Aide ${neutre}"
echo "Si vous ne précisez pas de paramètre alors que c'est nécéssaire, un texte vous le signalera."
echo "Pour signaler un bug ou suggérer une amélioration, contactez rezemika via le site Minecraft.fr"
echo ""
echo -e "${gris}  Licence ${neutre}"
echo "Bien entendu, ce script est sous licence Creative Commons By-SA."
echo "Partagez-le et modifiez-le autant que vous le voulez."
echo "Attnetion, je rappelle que certains commandes BASH utilisées à mauvais escient peuvent endommager vos données."
echo "Soyez prudents lorsque vous modifiez ce script afin de ne pas endommager vos données ou des fichiers systèmes."
}
 
commande_fin_installation() {
$commande_install
}
 
#On vérifie les paramètres entrés et on réagi en lançant la fonction correspondante
case $1 in
        "install")
                case $2 in
          "vanilla")
                  installation_vanilla
                  ;;
          "craftbukkit")
                  case $3 in
                    "rec")
                        installation_craftbukkit_rec
                        ;;
                    "dev")
                        installation_craftbukkit_dev
                        ;;
                    *)
                        echo "Veuillez choisir une version de Craftbukkit. Choisissez le mode 'rec' pour installer la dernière version recommandée ou 'dev' pour installer la dernière version de dévelopement."
                        ;;
                  esac
                  ;;
          *)
                  echo "Veuillez choisir un mode d'installation. Choisissez le mode 'vanilla' pour installer un serveur Minecraft classique ou le mode 'craftbukkit' pour installer un serveur avec Craftbukkit."
                  ;;
                esac
                ;;
        "l")
                lancement
                ;;
        "help")
                texte_aide
                ;;
        *)
                echo "Désolé, mais ce paramètre n'existe pas pour cette commande ou il n'est pas encore pris en charge."
                ;;
esac
exit


Téléchargement

Pour télécharger le script, utilisez ce lien :
http://ubuntuone.com/6WJpPfsWXMPxzikziyzjf9



Merci de bien vouloir me signaler tout bug ou toute suggestion d'amélioration.
PS : c'est mon premier script BASH "avancé", soyez indulgents, il n'est pas parfaitement optimisé :).

J'attends vos avis, bon jeu à tous! :)
 

dilondilon2

Cyberdépendant avéré
19 Avril 2012
1 021
326
88
DTC
Nice!
J'ai survolé comme ça, je te donnerai pas de conseils étant donné que mes script bash sont carrément plus dégueulasse que les tiens...
Juste, ce que tu pourrais ajouter, c'est une option afin de pouvoir transférer les maps en ram pr éviter les écritures disques.
( copie des mondes en "/run/shm/map/" ou autre partition tmpfs + création des liens)
Enfin éviter, je me comprends... Repousser à toutes les n minutes.
Après je dit ça mais je connais pas mac et je sais pas si du coup c'est bien portable.
 

rezemika

Initiateur du projet "Mers & océans"
19 Mars 2011
1 306
197
102
Bonjour!

Je vais voir ça, ça me parait très possible mais après il faut dire à Minecraft d'oublier la version du monde qui est dans ses dossiers pour n'utiliser que la version stockée dans la RAM. Et ça, je sais pas faire.

Après, je dis que c'est compatible avec MAC OS parce que c'est aussi un dérivé de Unix, d'ailleurs beaucoup de commandes sont les mêmes, mais il est possible que certaines commandes ne marchent pas. Je ne peux pas tester, je n'ai pas de MAC...

Pendant les vacances, j'ai appris à faire un fichier de configuration pour les scripts BASH, ça peut servir.
Je peux toujorus voir à ajouter une option de sauvegarde de monde dans un autre dossier avec possibilité de restauration automatique.

Merci de ta réponse, je suis heureux de voir qu'un Linuxien traine dans les parages. :)
 

dilondilon2

Cyberdépendant avéré
19 Avril 2012
1 021
326
88
DTC
Je vais voir ça, ça me parait très possible mais après il faut dire à Minecraft d'oublier la version du monde qui est dans ses dossiers pour n'utiliser que la version stockée dans la RAM. Et ça, je sais pas faire.
En fait, c'est tout con, regarde du coté de la commande ln.
Dans le principe, l'idée c'est un truc du genre:

1-dans le dossier du serveur (ou ailleurs), créer un nouveau dossier, par exemple, world_on_disk/ puis y copier les dossiers de maps.
2-revenir dans le dossier du serveur, effacer les maps qui sont désormais dans world_on_disk/ .
3-toujours dans le dossier du serveur, créer des liens (ln) avec les mêmes noms que les maps et faire pointer ces liens au bon emplacement, donc dans world_on_disk/.
ex: nom_du_monde -> world_on_disk/nom_du_monde/
( à ce moment la, le serveur minecraft va interpréter les mondes qui sont donc dans world_on_disk/ quand tu le lancera )

4-Pour mettre en ram, il suffit en suite de copier les monde situé dans world_on_disk/ en /run/shm/ et une fois chose faite, changer l'emplacement ou pointe les liens de world_on_disk/ en /run/shm/
ex: nom_du_monde -> /run/shm/nom_du_monde/

Et tadam, tout ça est désormais en ram et minecraft fait son job normalement :)
J’espère que c'est clair mais je suis pas sur du tout niveau clarté de mes explications^^
Par contre, attention à bien penser de copier périodiquement les maps de /run/shm/ a world_on_disk/ pour éviter les mauvaises surprises en cas de coupure de courant ou autre buggs.

Après, je dis que c'est compatible avec MAC OS parce que c'est aussi un dérivé de Unix, d'ailleurs beaucoup de commandes sont les mêmes, mais il est possible que certaines commandes ne marchent pas. Je ne peux pas tester, je n'ai pas de MAC...
Ha yeap, ben pareil à vrai dire, je ne connais que très mal cet os. Pas sur que toute les commandes fonctionnent non plus.
Méchante pomme qui tente de conquérir le monde ^^

Sinon clair pas bête pour le fichier de conf et c'est net, ça fait toujours plaisir de tomber sur des utilisateurs de GNU Linux!
Enfin on doit pas être les seuls du forum, loin de la je pense. Tout ça se démocratise de plus en plus et ça c'est cool :)
Le logiciel libre vaincra!
 

rezemika

Initiateur du projet "Mers & océans"
19 Mars 2011
1 306
197
102
Je comprend je le principe, je vais réfléchir au code, ça m'a l'air franchement bien.
Par contre, une fois que le script a lancé le serveur, le programme du serveur "supplante" celui du script dans le terminal.
Du coup, est-ce que le script pourra copier régulièrement les données de la RAM au disque?
Sinon, le must serait de vérifier la charge de la RAM et en cas de surcharge, de revenir automatiquement en utilisation sur le disque dur.

Pour l'instant, l'ajout d'une commande de sauvegarde me parait plus à mon niveau.
J’essaie de toujours optimiser mes codes, mais je connais assez peu de commandes, du coup je suis limité à m'inspirer des exemples déjà faits de codes avant d'en connaître assez pour tout faire moi-même.

Mon rêve est de faire un jour un paquet avec une compilation de commandes utiles qui s’installerait comme n'importe quel ".deb". C'est pas si compliqué, mais pour l'instant, ça en vaut pas le coup vu la simplicité du truc.

N'hésite pas à me faire d'autres suggestions pour améliorer ça, ça me fait un bon prétexte pour m'améliorer en BASH ! :)

EDIT : d'après toi, quel est le mieux pour l'installation?
- taper directement la commande qui installe ce que l'on veut
- ou taper une commande d'installation universelle qui nous dit "taper 1 pour une version vanilla, 2 pour craftbukkit....."
 
  • J'aime
Reactions: dilondilon2

Criptoze

Ex-Staff Minecraft.fr GraphistePro. Likeaboss
14 Février 2012
101
24
13
31
J'approuve, à dévellopper, sous .exe / .jar, sa pourrais être une super aide. GG !
 

rezemika

Initiateur du projet "Mers & océans"
19 Mars 2011
1 306
197
102
Merci.

Le problème, c'est mon niveau en langage C n'est pas suffisant pour faire un programme adaptable.
Je rappelle que le BASH, c'est uniquement pour les OS sous noyau Linux comme GNU/Linux (Ubuntu, Debian, Mandrake...) ou Mac OS.
Donc il faudrait une réécriture complète (en plus les chemins de fichiers pas les mêmes).
 

dilondilon2

Cyberdépendant avéré
19 Avril 2012
1 021
326
88
DTC
Oui clair, un ELF ou exe me parait un peu lourd aussi pour ça. ( je parle niveau code ) :)
Après java peu être j'avoue, je ne connais pas assez. Mais le bash c'est magique !


Par contre, une fois que le script a lancé le serveur, le programme du serveur "supplante" celui du script dans le terminal.
Du coup, est-ce que le script pourra copier régulièrement les données de la RAM au disque?

Une petite boucle while ou la gestion d'un autre thread et ton problème est résolu. ( je sais pas comment on gère les process ni les threads en bash par contre )

Plus simple: tu rajoutes une commande différente à ton script qui permet d'effectuer la copie en parallèle via un autre shell. ( un peu plus chiant pour l'utilisateur, mais en même temps c'est une fonctionnalité un peu avancée )

Sinon le serveur, le principal problème, c'est que lui risque de modifier la map en cours pendant que tu effectue la copie, pour cela, tu peux simplement lui faire couper la sauvegarde auto pendant les quelques secondes de copie des mondes de la ram au hdd.
Pour ça, vois du coté de screen ou une autre méthode pour injecter des informations sur stdin du serveur minecraft. ( j'avoue que tout ça est un peu plus chiant et que je n'y avais pas pensé )
Je cite screen, parce que a vrai dire, pour l'avoir fait une fois, c'est la seule méthode que j'ai réussi à utiliser pour passer une commande au serveur depuis un autre script.
Si tu as besoin d'aide niveau de ça, go message privée après, ou si tu utilises xmpp, hésites pas. ;)
Et à vrai dire le problème m’intéresse, tiens au moins au courant si tu y apportes une solution. Ma méthode avec screen n'est pas super propre je trouve et je suis intrigué de voir comment tu va t'y prendre.
( sachant qu'écrire sur stdin du shell ne fonctionne pas :/ )

- taper directement la commande qui installe ce que l'on veut
- ou taper une commande d'installation universelle qui nous dit "taper 1 pour une version vanilla, 2 pour craftbukkit....."

Pour ta question, je pense que cela dépend grandement de l'utilisateur et/ou de la clareté des explications proposés.
Personnellement je n'ai pas de préférence.
Après c'est certainement plus simple pour quelqu'un n'y connaissant pratiquement rien de suivre les indicatiosn a l'écran que d'aller lire le man c'est sur.
Enfin, franchement, aucune préf vis à vis de ça.
 

rezemika

Initiateur du projet "Mers & océans"
19 Mars 2011
1 306
197
102
Je connais un peu le Java, mais clairement pas assez pour faire un programme.
Et puis tu l'a dit, le BASH c'est magique. :)

Pour la sauvegarde automatique, j'avais pensé à créer une commande qui ne serait lancée que par le script et en tâche de fond.
Ainsi, le terminal reste sur le programme du serveur tandis que l'autre script fait un décompte et sauvegarde les maps qui sont en RAM dans un dossier de sauvegarde sur le disque dur.
Ensuite, quand le serveur est arrêté, les maps sont copiées du dossier sus-cité dans le dossier des maps du serveur et elles sont effacées de la RAM.
Le tout en tâche de fond.

Ça pourrait résoudre le problème de conflit puisque la copie ne se ferait jamais à la fois en même temps et au même endroit.

Pour l'installation, je pense que je vais opter pour une commande d'installation universelle.
C'est plus simple que d'aller voir dans le man.
Soit dit en passant, comment on rajoute une entrée "man" pour notre commande?

J'ai créé une commande "servcraft help", mais ce serait plus cool de passer par "man".
Aussi, j'ai commencé à réécrire le script pour enlever un maximum de trucs superflus et rendre ça plus clair.

La prochaine version aura un fichier de configuration.
On pourra choisir l'emplacement du serveur, le nom de son dossier et on pourra lancer grâce à la commande le traitement de texte qu'on veut (vi, gedit, nano...) grâce à "servcraft config".

Pour l'ajout de la msie en RAM, je ferais ça à la version d'après.

PS : pour de l'aide je dis pas non (Du coup je dis oui). :)
 
  • J'aime
Reactions: dilondilon2

dilondilon2

Cyberdépendant avéré
19 Avril 2012
1 021
326
88
DTC
Pour la sauvegarde automatique, j'avais pensé à créer une commande qui ne serait lancée que par le script et en tâche de fond.
Ainsi, le terminal reste sur le programme du serveur tandis que l'autre script fait un décompte et sauvegarde les maps qui sont en RAM dans un dossier de sauvegarde sur le disque dur.
Ensuite, quand le serveur est arrêté, les maps sont copiées du dossier sus-cité dans le dossier des maps du serveur et elles sont effacées de la RAM.
Le tout en tâche de fond.

Clair ça me parait nickel tout ça^^
J'aurai certainement encore fait un truc plus moche pour ma part. :)

Soit dit en passant, comment on rajoute une entrée "man" pour notre commande?
lol très bonne question ça. ^^
J'ai look un peu de suite, ça m'a effrayé et casser la tête xD
En gros faut look du coté du fichier /etc/manpath.config et du traitement de document avec Groff.
Enfin quand j'ai vue le truc, ça m'a calmé direct, ça demande réflexion et petite analyse du fonctionnement à priori.

Je t’envoie un mp un peu plus tard dans la soirée pour qu'on trouve une façon plus privé de communiquer que via les forums de minecraft.fr .

En tout cas bien vue pour le fichier de config, clair ça me parait essentiel.
Faudra que tu m'expliques comment tu fait ça si tu peux ( xml ou autres language à balisage propre au monde unix ), ça pourra me servir.
J''utilise mes propres règles pour faire ce genre de truc, du coup c'est complètement chaotique :)