#!/bin/bash # Author: Sys4 # License: GPLv3 # Fonctions strip() { echo $1 | cut -d \' -f 2 } verif() { if [[ $? -gt 0 ]]; then echo "Erreur ! Arrêt du script." exit 1 fi } error() { echo "ERREUR : Vérifiez vos paramètres !" >&2 echo "Utilisez l'option -h pour en savoir plus" >&2 exit 1 } usage() { echo "Usage: ./install.sh [options] [--] " echo "Options :" echo -e "\t-h --help\tAffiche l'aide." echo -e "\t-j --makeopt\tNombre de threads de compilation." echo -e "\t--ssh : Identifiants ssh." echo -e "\t--url : URL distante personnalisée." echo -e "\t\tSi l'option --ssh est passée en option, il s'agira du chemin distant." echo -e "\t-i --irrlicht\tChemin personnalisé des sources irrlicht." echo -e "\t-p --postgresql\tSi vous voulez que le serveur soit configuré avec postgresql. Sinon leveldb par défaut." echo "version :" echo -e "\tstable : Installation du serveur compatible avec la dernière branche stable de minetest. Suivez les instructions... (Recommandé)" echo -e "\tdev : Installation de la version en cours de developpement du serveur. Suivez les instructions... (Le plus à jour mais non Stable !)" echo -e "\texperimental : Installation d'une version experimentale du serveur. Suivez les instructions... (Attention, très experimental !)" exit 0 } ssh() { ssh=$(strip $1) echo "Installation avec identifiants ssh : $ssh" } url() { url=$(strip $1) } makeopt() { makeopt=$(strip $1) } postgresql() { echo "Les indications à fournir ci-après nécessite d'avoir configuré un serveur postgresql au préalable. (Ctrl-C) pour annuler." read -p "Indiquez l'adresse de la base de données : " pg_url read -p "Indiquez l'utilisateur de la BDD : " pg_user read -p "Indiquez le mot de passe : " pg_password read -p "Indiquez le nom de la BDD à utiliser : " pg_dbname echo "gameid = nalc_game" > world.mt echo "backend = postgresql" >> world.mt echo "player_backend = postgresql" >> world.mt echo "pgsql_connection = host=$pg_url user=$pg_user password=$pg_password dbname=$pg_dbname" >> world.mt echo "pgsql_player_connection = host=$pg_url user=$pg_user password=$pg_password dbname=players-$pg_dbname" >> world.mt echo "auth_backend = sqlite3" >> world.mt } install_minetest() { if [[ -z $makeopt ]]; then local makeopt=$(grep -c processor /proc/cpuinfo) fi if [[ -d minetest ]]; then echo "Installation précédente de Minetest détecté." read -p "Mettre à jour ? (y,n,clean,cancel) : " continue if [[ $continue == "clean" ]]; then echo "Attention ! Cela va supprimer définitivement toutes les données." read -p "Êtes-vous certains de vouloir continuer ? (y or n) : " continue if [[ $continue == "y" ]]; then rm -rf minetest echo "Répertoire minetest supprimé." else echo "Installation annulée. Fin" exit 0 fi elif [[ $continue == "y" ]]; then cd minetest git pull verif cd .. elif [[ $continue == "cancel" ]]; then echo "Installation annulée. Fin" exit 0 fi fi if [[ ! -d minetest ]]; then local branch="-b 5.4.1" if [[ $ver == "dev" ]]; then branch="-b stable-5" elif [[ $ver == "experimental" ]]; then branch="-b master" fi if [[ -n $ssh ]]; then git clone --depth 1 $branch $ssh\:minetest/minetest.git else git clone --depth 1 $branch https://gitlab.com/minetest/minetest.git fi verif fi echo "Minetest va être (re)compilé..." sleep 3 cd minetest cmake . -DBUILD_CLIENT=0 -DBUILD_SERVER=1 -DENABLE_SOUND=0 -DENABLE_SYSTEM_GMP=1 $irrlicht_src -DENABLE_LEVELDB=1 -DENABLE_REDIS=1 -DENABLE_POSTGRESQL=1 -DRUN_IN_PLACE=1 -DENABLE_GETTEXT=1 -DENABLE_FREETYPE=1 -DENABLE_LUAJIT=1 -DENABLE_CURL=1 make -j$makeopt verif echo "Installation de Minetest terminé." cd .. } install_minetest_game() { if [[ -d nalc_game ]]; then echo "Installation précédente du jeux NALC détecté." read -p "Mettre à jour ? (y,n,clean,cancel) " continue if [[ $continue == "y" ]]; then cd nalc_game git pull verif cd .. echo "Mise à jour du jeux NALC depuis dépôt distant terminé." elif [[ $continue == "clean" ]]; then echo "/!\ Cette action va effacer les données du répertoire nalc_game" read -p "Êtes-vous sûr de vouloir continuer ? (y or n) " continue if [[ $continue == "y" ]]; then rm -rf nalc_game echo "Jeux NALC supprimé." else echo "Mise à jour annulée. Terminé." exit 0 fi elif [[ $continue == "cancel" ]]; then echo "Mise à jour annulée. Terminé." exit 0 fi fi if [[ ! -d nalc_game ]]; then local branch="-b master" if [[ $ver == "dev" ]]; then branch="-b dev" elif [[ $ver == "experimental" ]]; then branch="-b experimental" fi git clone --depth 1 $branch $URL/nalc_game.git verif echo "Clonage de nalc_game terminé." fi if [[ ! -L minetest/games/nalc_game ]]; then ln -s $(pwd)/nalc_game minetest/games/nalc_game echo "Lien symbolique minetest/games/nalc_game vers $(pwd)/nalc_game créé." fi echo "Installation/Mise à jour du jeux NALC terminé." } install_mods() { if [[ -d nalc-server-mods ]]; then echo "Le dossier de mods est déjà présent. Que souhaitez-vous faire ?" read -p "Choisissez parmi la liste, ([1]update, [2]clean update, [3]cancel, [4]Ne rien faire) : " continue if [[ $continue == 1 ]]; then ./upgrade.sh -m elif [[ $continue == 2 ]]; then rm -rf nalc-server-mods elif [[ $continue == 3 ]]; then echo "Mise à jour des mods annulé. Terminé." exit 0 fi fi if [[ ! -d nalc-server-mods ]]; then local branch="master" if [[ $ver == "dev" ]]; then branch="dev" elif [[ $ver == "experimental" ]]; then branch="experimental" fi git clone --depth 1 -b $branch $URL/nalc-server-mods.git verif ./upgrade.sh -m fi if [[ -z $pg_dbname ]]; then cp worldmt-1.1.conf world.mt fi } install_world() { local world_name="nalc-$ver" if [[ -n $pg_dbname ]]; then world_name=$pg_dbname fi if [[ -d minetest/worlds/$world_name ]]; then echo "Une map est déjà présente. Que souhaitez-vous faire ?" read -p "Choisissez parmi la liste ([1]Nouveau, [2]Mettre à jour [3]Ne rien faire) : " continuer if [[ $continuer == 1 ]]; then if [[ -n $pg_dbname ]]; then read -p "Les BDD $pg_dbname et players-$pg_dbname ne seront pas effacées. À vous de le faire manuellement après ce script ! -- Press enter -- : " continuer fi # On sauvegarde l'ancien world if [[ -d "minetest/worlds/"$world_name"_old" ]]; then rm -rf "minetest/worlds/"$world_name"_old" fi mv minetest/worlds/$world_name "minetest/worlds/"$world_name"_old" elif [[ $continuer == 2 ]]; then # On sauvegarde l'ancien world if [[ -d "minetest/worlds/"$world_name"_old" ]]; then rm -rf "minetest/worlds/"$world_name"_old" fi cp -r minetest/worlds/$world_name "minetest/worlds/"$world_name"_old" # On met à jour les fichiers contenues dans cette map ./upgrade.sh -w $world_name -b $ver fi fi if [[ ! -d minetest/worlds/$world_name ]]; then mkdir -p minetest/worlds/$world_name if [[ -n $pg_dbname ]]; then createdb $pg_dbname createdb players-$pg_dbname fi ./upgrade.sh -w $world_name -b $ver mkdir -p minetest/worlds/$world_name/runes fi } post_install() { if [[ ! -a minetest/minetest.conf ]]; then local world_name="nalc-$ver" if [[ -n $pg_dbname ]]; then world_name=$pg_dbname fi ./upgrade.sh -w $world_name -b $ver -f mtconf echo "Veuillez éditer le fichier $(pwd)/minetest/minetest.conf" fi if [[ ! -d logs ]]; then mkdir logs fi if [[ ! -a start.sh ]]; then cp start.sh.example start.sh chmod u+x start.sh echo "Veuillez éditer le fichier $(pwd)/start.sh" echo "Veuillez éditer le fichier $(pwd)/backup.sh" echo "Veuillez éditer le fichier $(pwd)/shutdown.sh" echo "" echo "Pour utiliser la génération de la carte, installer ImageMagick avec la dépendance fontconfig et truetype." echo "Il faudra aussi autoriser lecture et écriture pour PS. Dans le fichier de gestion de la police de sécurité d'ImageMagick." fi } install_mtmapper() { if [ -n $ssh ]; then URL=$ssh\:minetest else URL="https://sys4.fr/gitea/minetest" fi if [ ! -d "$(pwd)/minetestmapper" ]; then git clone --depth 1 $URL/minetestmapper.git verif fi pushd "$(pwd)/minetestmapper" git pull cmake . [ $? -eq 1 ] && echo "Vérifier les dépendances de minetestmapper puis recompiler." make -j$makeopt popd if [ -n $ssh ]; then URL=$ssh\:nalc else URL="https://sys4.fr/gitea/nalc" fi if [ ! -d "$(pwd)/leaftest" ]; then git clone --recursive --depth 1 $URL/leaftest.git verif fi } init() { ver=$(strip $1) if [[ -n $ssh && -n $url ]]; then URL=$ssh\:$url elif [[ -n $url ]]; then URL=$url else URL="https://sys4.fr/gitea/nalc" fi read -p "L'installation va démarrer. Continuer ? (y or n) : " continue if [[ $continue == "y" ]]; then install_minetest install_minetest_game install_mods install_world install_mtmapper post_install echo "L'installation est terminé. Bravo !" else echo "Installation annulée. Fin." fi } action() { local arg=$(strip $1) if [[ $arg == "dev" || $arg == "stable" || $arg == "experimental" ]]; then init $arg else error fi exit 0 } irrlicht() { local arg=$(strip $1) if [[ -d $arg ]]; then irrlicht_src="-DIRRLICHT_SOURCE_DIR=$arg" fi } # Pas de paramètre #[[ $# -lt 1 ]] && error # ou [[ $# -lt 1 ]] && usage # -o : Options courtes # -l : options longues OPT=$(getopt -o h,p,j:,i: -l help,postgresql,url:,ssh:,makeopt:,irrlicht: -- "$@") # éclatement de $options en $1, $2... set -- $OPT while true; do case "$1" in -h|--help) usage;; -i|--irrlicht) irrlicht $2 shift 2;; -p|--postgresql) postgresql shift;; --ssh) ssh $2 shift 2;; --url) url $2 shift 2;; -j|--makeopt) makeopt $2 shift 2;; --) shift;; *) action $1 shift;; esac done