forked from nalc/nalc-server
418 lines
12 KiB
Bash
Executable File
418 lines
12 KiB
Bash
Executable File
#!/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] [--] <version>"
|
||
echo -e "\nOptions :"
|
||
echo -e "\t-h | --help\t\tAffiche cette aide."
|
||
echo -e "\t-j | --makeopt\t\tNombre de threads de compilation. (Nombre total de cœurs par défaut)"
|
||
echo -e "\t--ssh <user@host>\tIdentifiants ssh."
|
||
echo -e "\t--url <URL>\t\tURL distante personnalisée."
|
||
echo -e "\t\t\t\tSi l'option --ssh est passée en option, il s'agira du chemin distant."
|
||
echo -e "\t-i | --irrlicht\t\tChemin personnalisé des sources irrlicht."
|
||
echo -e "\t-p | --postgresql\tBackend map et joueurs avec postgresql. Sinon leveldb sera utilisé par défaut."
|
||
echo -e "\t-e | --exec <minetest bin>\tChemin de l'exécutable Minetest. Ex. /usr/local/bin/minetestserver"
|
||
echo -e "\t-d | --dir <minetest server dir>\tDossier d'exécution du serveur. Ex. /var/lib/minetest/.minetest"
|
||
echo -e "\nversion :"
|
||
echo -e "\tstable : La dernière version stable du serveur sera installée avec la dernière version stable de minetest. Suivez les instructions... (Recommandé)"
|
||
echo -e "\tdev : La version du serveur en cours de developpement sera installée avec la dernière version stable de minetest. Suivez les instructions... (Le plus à jour mais risques d'instabilités !)"
|
||
echo -e "\texperimental : La version experimentale du serveur sera installée avec la branche master de Minetest (version de dev). Suivez les instructions... (Attention, très experimental !)"
|
||
echo -e "\nExemples :"
|
||
echo -e "\n\t\$ ./install.sh stable"
|
||
echo -e "\tInstalle la dernière version stable du serveur avec leveldb comme backend pour la map et les utilisateurs. Tous les cœurs du processeur sont utilisés pour la compilation."
|
||
echo -e "\n\t\$ ./install.sh -j12 --url https://sys4.fr/gitea/grossam -i /home/grossam/lib/irrlichtmt -p dev"
|
||
echo -e "\tInstalle la version dev d'un fork de nalc créé par l'utilisateur grossam avec 12 threads de compilation, chemin personnalisé d'irrlichtmt et support de PostgreSQL comme backend de la map et des joueurs.\n"
|
||
echo -e "\nÀ voir également :"
|
||
echo -e "\tGuide de contribution et de développement du serveur NALC"
|
||
echo -e "\thttps://sys4.fr/gitea/nalc/nalc-server/wiki/Guide-de-contribution-et-de-d%C3%A9veloppement-du-serveur-NALC\n"
|
||
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
|
||
|
||
local branch="-b 5.5.0"
|
||
if [ $ver == "dev" ]; then
|
||
branch="-b stable-5"
|
||
elif [ $ver == "experimental" ]; then
|
||
branch="-b master"
|
||
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
|
||
if [ -n $ssh ]; then
|
||
git clone --depth 1 $branch $ssh\:minetest/minetest.git
|
||
else
|
||
git clone --depth 1 $branch https://github.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 -DENABLE_JSONCPP=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=0 -DENABLE_CURSES=1 -DENABLE_SPATIAL=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érifiez les dépendances de minetestmapper puis recompilez."
|
||
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
|
||
# Vérification de l'environnement
|
||
|
||
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_INCLUDE_DIR=$arg"
|
||
fi
|
||
}
|
||
|
||
exepath() {
|
||
local arg=$(strip "$1")
|
||
if [ -e "$arg" ]; then
|
||
minetest_bin="$arg"
|
||
else
|
||
error "$arg n'existe pas"
|
||
fi
|
||
}
|
||
|
||
minedir() {
|
||
local arg=$(strip "$1")
|
||
if [ -d "$arg" ]; then
|
||
minetest_dir="$arg"
|
||
else
|
||
error "$arg n'est pas un répertoire"
|
||
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:,e:,d: -l help,postgresql,url:,ssh:,makeopt:,irrlicht:,exec:,dir: -- "$@")
|
||
|
||
# é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;;
|
||
-e|--exec)
|
||
exepath $2
|
||
shift 2;;
|
||
-d|--dir)
|
||
minedir $2
|
||
shift 2;;
|
||
--)
|
||
shift;;
|
||
*)
|
||
action $1
|
||
shift;;
|
||
esac
|
||
done
|