#!/bin/bash # 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" echo "Arguments :" echo -e "\t5.0 : Installation du serveur avec minetest-5.x. Suivez les instructions... (Non stable !)" echo -e "\t0.4 : Installation du serveur avec minetest-0.4.x. Suivez les instructions... (Stable)" echo -e "\tmaster : Installation du serveur avec la branche master de minetest. Suivez les instructions... (Non Stable !)" exit 0 } ssh() { ssh=$(strip $1) echo "Installation avec identifiants ssh : $ssh" } url() { url=$(strip $1) } makeopt() { makeopt=$(strip $1) } full() { if [[ -n $URL ]]; then echo "Full install... with "$URL else echo "ERREUR: Vous devez choisir l'option --ssh ou --https avec cette commande !" usage fi } clean() { echo "clean install..." } 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 } install_0.4() { if [[ -d server-0.4 ]]; then echo "Installation précédente détecté. Voulez-vous faire la mise à jour ?" read -p "Votre choix ? (y, n, clean) " continuer if [[ $continuer == "y" ]]; then cd server-0.4 git pull verif git -c http.sslVerify=false submodule update --init --recursive verif cd .. elif [[ $continuer == "clean" ]]; then rm -rf server-0.4 git -c http.sslVerify=false clone --depth 1 $URL/server-nalc.git server-0.4 verif cd server-0.4 git -c http.sslVerify=false submodule update --init --recursive verif cd .. else echo "Mise à jour annulée" fi else git -c http.sslVerify=false clone --depth 1 $URL/server-nalc.git server-0.4 verif cd server-0.4 git -c http.sslVerify=false submodule update --init --recursive verif cd .. fi } 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 master" if [[ $ver == "0.4" ]]; then branch="-b stable-0.4" elif [[ $ver == "5.0" ]]; then branch="-b stable-5.0" fi git clone --depth 1 $branch https://github.com/minetest/minetest.git 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 == "0.4" ]]; then branch="-b nalc" elif [[ $ver == "5.0" ]]; then branch="-b stable-5.0" 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_world() { local world_name="nalc" 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]Utiliser) : " 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 # dropdb $pg_dbname # dropdb players-$pg_dbname # createdb $pg_dbname # createdb players-$pg_dbname fi 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" 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 ln -s $(pwd)/world.mt minetest/worlds/$world_name/world.mt cp -r world/* minetest/worlds/$world_name/ mkdir minetest/worlds/$world_name/runes fi } 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, [3]cancel, [4]Ne rien faire) : " continue if [[ $continue == 1 ]]; then cd nalc-server-mods git pull verif git submodule update --init --recursive verif cd .. 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 git clone $URL/nalc-server-mods.git verif cd nalc-server-mods git submodule update --init --recursive cd .. fi # Recréation des liens symboliques et du fichier world.mt (dans tous les cas) rm minetest/mods/* if [[ -a world.mt && -z $pg_dbname ]]; then rm world.mt cp worldmt.conf world.mt fi if [[ -d custom/mods ]]; then ls custom/mods | while read -r mod; do if [[ -d custom/mods/$mod ]]; then rm nalc-server-mods/$mod ln -s $(pwd)/custom/mods/$mod nalc-server-mods/$mod fi done fi local i=0 local md[1]="" # Mods to disable for mod in 3d_armor_ip 3d_armor_sfinv nalc_lib worldedit_brush; do i=$(( $i+1 )) md[$i]=$mod done ls nalc-server-mods | while read -r mod; do if [[ -d nalc-server-mods/$mod ]]; then ln -s $(pwd)/nalc-server-mods/$mod minetest/mods/$mod if [[ -a nalc-server-mods/$mod/modpack.txt ]]; then ls nalc-server-mods/$mod | while read -r submod; do if [[ -d nalc-server-mods/$mod/$submod ]]; then local mod_enable="true" for (( modn=1; modn<=$i; modn++ )); do if [[ ${md[$modn]} == $submod ]]; then mod_enable="false" fi done echo "load_mod_$submod = $mod_enable" >> world.mt fi done else local mod_enable="true" for (( modn=1; modn<=$i; modn++ )); do if [[ ${md[$modn]} == $mod ]]; then mod_enable="false" fi done echo "load_mod_$mod = $mod_enable" >> world.mt fi fi done echo "Liens des mods créés dans minetest/mods/" } post_install() { if [[ ! -a minetest/minetest.conf ]]; then cp minetest-$ver.conf minetest/minetest.conf 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 echo "Veuillez éditer le fichier $(pwd)/start.sh" echo "Veuillez éditer le fichier $(pwd)/backup.sh" echo "Veuillez éditer le fichier $(pwd)/shutdown.sh" fi # fix technic_worldgen crash #cd server-0.4/mods/technic #git checkout fb93388f06fe87ee75aaaf04cf6edcf01a26d981 technic_worldgen/oregen.lua #cd ../../.. #echo "Fix technic_worldgen pour éviter crash appliqué." # skindb updater (à relancer à la main plusieurs fois pour l'instant) #if [[ -d nalc-server-mods/skinsdb/updater ]]; then # cd nalc-server-mods/skinsdb/updater # ./update_from_db.py # cd ../../.. #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 post_install echo "L'installation est terminé. Bravo !" else echo "Installation annulée. Fin." fi } action() { local arg=$(strip $1) if [[ $arg == "5.0" || $arg == "0.4" || $arg == "master" ]]; 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