Last active
March 29, 2019 14:34
-
-
Save remisarrailh/ac443003221e910af22ac3bd9e4fe845 to your computer and use it in GitHub Desktop.
Script installation yana temporaire (ignore les erreurs SSL)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Auteur : Remi Sarrailh (maditnerd) | |
# Updates : Modifications mineures par Valentin CARRUESCO Idleman 28/07/2018 | |
# Licence : MIT | |
# Un probleme : https://git.idleman.fr/idleman/yana-server/issues | |
# https://tldrlegal.com/license/mit-license | |
############# | |
# Variables | |
############# | |
INSTALLVERSION="3.0.6" | |
ERR="\033[1;31m" | |
NORMAL="\033[0;39m" | |
INFO="\033[1;34m" | |
WARN="\033[1;33m" | |
OK="\033[1;32m" | |
IPADDRESS=$(hostname -I) | |
HOSTNAME=$(cat /etc/hostname) | |
doInstall=0 | |
#Installer le serveur web (se met à 0 si un autre serveur web est installé) | |
doInstallWebServer=1 | |
isRoot=0 | |
GlobalError=0 | |
confirmErase=0 | |
copyYana=1 | |
resizeSD=1 | |
################ | |
# Messages GUI | |
################ | |
# J'ai séparé les messages long du GUI du reste du programme | |
# Afin quel soit facilement modifiable | |
installMessage="\ | |
Etapes: | |
--------------------------- | |
* Renommer le Raspberry Pi | |
* Redimensionner la carte SD | |
* Mis à jour | |
* Terminal en français | |
------------------------------------ | |
* Configuration du fuseau horaire | |
* Installation wiringPi (pour gérer les GPIO) | |
------------------------------------------- | |
* Copie de Yana Server | |
* Installation du serveur web | |
* Création de l'utilisateur | |
* Permissions du serveur web | |
* Installation du socket / cron | |
" | |
checkMessage="\ | |
Nous allons revérifier toute l'installation mais sans modifier ni yana-server ni la configuration | |
" | |
renameMessage="\ | |
Vous pouvez accéder à Yana en utilisant un nom plutôt qu'une adresse IP \n\n\ | |
Pour que cela marche depuis Windows, il faut que les services BONJOUR soit installés \n\ | |
C'est le cas si vous avez SKYPE, ITUNES ou Windows 10 sinon il vous faudra l'installer \n\ | |
http://support.apple.com/kb/DL999 \n\ | |
\n\ | |
\n\ | |
Example : maison sera accessible sur http://maison.local/ | |
" | |
saveMessage="\ | |
Vous pouvez sauvegarder yana-server sur une clé USB \n\n\ | |
Ceci sauvegardera /var/www/yana-server dans le dossier yana \n\n\ | |
Si une sauvegarde existe sur la clé, elle sera effacée \n\ | |
si vous voulez conserver une sauvegarde précédente renommer le dossier \n\ | |
" | |
restoreMessage="\ | |
Vous pouvez revenir à un état précédent de yana depuis une clé USB \n\n\ | |
Ceci effacera /var/www/yana-server et le replacera par celui \n\ | |
dans le dossier sur la clé USB /yana | |
" | |
resizeSDCardMessage="\ | |
Voulez vous redimensionner la carte SD de votre Raspberry Pi ? | |
Ceci sera fait au prochain redémarrage. | |
" | |
# Message d'erreurs | |
noInternetMessage="\ | |
Je n'arrive pas à me connecter à git.idleman.fr \n\ | |
Voici votre adresse IP: $IPADDRESS\ | |
" | |
ApacheMessage="\ | |
Yana utilise lighttpd comme serveur web par défaut\n\ | |
Il semblerait que Apache (un autre serveur web) soit déjà installé...\n\n\ | |
Voulez vous quand même installer lighttpd ? \n\ | |
" | |
nginxMessage="\ | |
Yana utilise lighttpd comme serveur web par défaut\n\ | |
Il semblerait que nginx (un autre serveur web) soit déjà installé...\n\n\ | |
Voulez vous quand même installer lighttpd ? \n\ | |
" | |
yanaMessage="\ | |
Yana semble avoir déjà été copié.\n\ | |
Voulez vous que je le supprimer et que je le réinstalle ?\ | |
" | |
localeMessage="\ | |
Je n'ai pas réussi à mettre le terminal en français\n\ | |
Pour autant, ceci n'aura aucune incidence sur la suite de l'installation\n\n\ | |
Voici le message d'erreur:\ | |
" | |
aptGetErrorMessage="\ | |
Le gestionnaire de paquet apt-get est HS\n\ | |
* Soit celui-ci a été interrompu\n\ | |
* Soit il est en cours d'utilisation par un autre programme\n\ | |
Supprimer le fichier de verrou est probablement la solution\n\n\ | |
Voici le message d'erreur:\n\ | |
" | |
gitErrorMessage="\ | |
Impossible de récupérer le code source avec git\n\ | |
Cela peut être du à un problème du coté de git.idleman.fr\n\ | |
Veuillez vérifier que http://git.idleman.fr/ est en ligne\n\n\ | |
Voici le message d'erreur:\n\ | |
" | |
wiringPiErrorMessage="\ | |
Impossible de compiler wiringPi\n\ | |
Voici le message d'erreur:\n\ | |
" | |
lighttpdErrorMessage="\ | |
Le serveur web n'a pas réussi à se redémarrer correctement\n\ | |
Voici le message d'erreur:\n\ | |
" | |
#Un joli logo ascii sans avoir à installer un programme pour ça | |
yanaLogo(){ | |
clear | |
echo -ne $INFO | |
cat<<EOF | |
██╗ ██╗ █████╗ ███╗ ██╗ █████╗ ████████╗ | |
╚██╗ ██╔╝██╔══██╗████╗ ██║██╔══██╗ █ █ █ █║ | |
╚████╔╝ ███████║██╔██╗ ██║███████║ █ █║ | |
╚██╔╝ ██╔══██║██║╚██╗██║██╔══██║ ██████ ║ | |
██║ ██║ ██║██║ ╚████║██║ ██║ █ ████ █║ | |
╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ █ █══╝ | |
EOF | |
echo -ne $ERR | |
cat<<EOF | |
██╗███╗ ██╗███████╗████████╗ █████╗ ██╗ ██╗ | |
██║████╗ ██║██╔════╝╚══██╔══╝██╔══██╗██║ ██║ | |
██║██╔██╗ ██║███████╗ ██║ ███████║██║ ██║ | |
██║██║╚██╗██║╚════██║ ██║ ██╔══██║██║ ██║ | |
██║██║ ╚████║███████║ ██║ ██║ ██║███████╗███████╗ | |
╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝ | |
EOF | |
echo -ne $NORMAL | |
} | |
############## | |
# Menus | |
############## | |
# Menu principal | |
mainMenu(){ | |
optionsMain=$(whiptail --title "YANA Server $INSTALLVERSION" --menu "" --cancel-button "Annuler" 0 0 0 \ | |
"Installer" "" \ | |
"Configurer" "" \ | |
"Sauvegarder" "" \ | |
"Restaurer" "" \ | |
"Quitter" "" 3>&1 1>&2 2>&3) | |
case $optionsMain in | |
"Installer") | |
installMenu;; | |
"Configurer") | |
setupMenu;; | |
"Sauvegarder") | |
saveMenu;; | |
"Restaurer") | |
restoreMenu;; | |
*) | |
echo -e "$OK ... A la prochaine! $NORMAL" | |
;; | |
esac | |
} | |
# Menu d'installation | |
installMenu(){ | |
if(whiptail --title "Installation" --yesno "$installMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
doInstall=1 | |
else | |
echo -e "\033[1;34m... A la prochaine!\033[0;39m" | |
fi | |
} | |
# Menu de configuration | |
setupMenu(){ | |
optionsSetup=$(whiptail --title "YANA Server $INSTALLVERSION" --menu "" --cancel-button "Retour" 0 0 0 \ | |
"Vérifier YANA" "" \ | |
"Mettre à jour YANA" "" \ | |
"Redimensionner la carte SD" "" \ | |
"Renommer le Raspberry Pi" "" \ | |
"Scripts Plugins" "" \ | |
"Quitter" "" \ | |
3>&1 1>&2 2>&3) | |
case $optionsSetup in | |
"Vérifier YANA") | |
checkMenu;; | |
"Mettre à jour YANA") | |
forceYanaUpdate;; | |
"Redimensionner la carte SD") | |
resizeSDCard | |
setupMenu;; | |
"Renommer le Raspberry Pi") | |
renameMenu | |
setupMenu;; | |
"Scripts Plugins") | |
scriptsMenu;; | |
"Quitter") | |
echo -e "$OK ... A la prochaine! $NORMAL";; | |
*) | |
mainMenu;; | |
esac | |
} | |
# Menu vérification de yana | |
checkMenu(){ | |
if(whiptail --title "Vérification" --yesno "$checkMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
updateRaspberryPi | |
checkPermissions | |
checkBinariesMenu | |
installYanaSocket | |
addCron | |
else | |
setupMenu | |
fi | |
} | |
resizeSDCardMenu(){ | |
if(whiptail --title "Carte SD" --yesno "$resizeSDCardMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
resizeSDCard | |
fi | |
} | |
# Menu de renommage du Raspberry Pi | |
renameMenu(){ | |
newhostname=$(whiptail --inputbox "$renameMessage" --title "Choissisez un nom" 0 0 3>&1 1>&2 2>&3) | |
renamePi | |
} | |
# Menu de scripts pour les plugins | |
# Il faut créer un script au format .sh pour dans /var/www/yana-server/plugins/nom-du-plugin/nom-du-script.sh | |
# On peut utiliser les fonctions du script d'installation et les variables à l'intérieur d'un script | |
# Par example vous pouvez récupérer le nom $HOSTNAME ou l'adresse IP $IPADDRESS | |
# Vérifier si internet est connecté | |
scriptsMenu(){ | |
getAllScripts | |
while read -r nextScript | |
do | |
scriptName=$(echo "${nextScript//\/var\/www\/yana-server\/plugins\//}") | |
menu_options[ $i ]="$scriptName" | |
(( i++ )) | |
menu_options[ $i ]="" | |
(( i++ )) | |
done <<<"$allScripts" | |
scriptToExecute=$(whiptail --title "Plugins" --menu "Gérer un Plugin" 0 0 0 "${menu_options[@]}" 3>&1 1>&2 2>&3 ) | |
executeScript | |
} | |
executeScript(){ | |
if [[ -f /var/www/yana-server/plugins/$scriptToExecute ]];then | |
chmod +x /var/www/yana-server/plugins/$scriptToExecute | |
clear | |
yanaLogo | |
echo -e "$OK -----> Exécution de $scriptToExecute $NORMAL" | |
dir=$(dirname /var/www/yana-server/plugins/$scriptToExecute) | |
cd $dir;. /var/www/yana-server/plugins/$scriptToExecute | |
else | |
echo -e "$OK -----> Aucun script trouvé dans /var/www/yana-server/plugins/$scriptToExecute $NORMAL" | |
fi | |
} | |
# Menu de vérification des fichiers binaires | |
checkBinariesMenu(){ | |
getAllBinaries | |
if(whiptail --title "Permissions binaires" --yesno "Je peux automatiquement donner les droits roots aux programmes des plugins\n\nVoici la liste des programmes concernés: \n$allBinaries" --yes-button "Oui" --no-button "Non" 0 0) then | |
setupPermissionsBinaries | |
whiptail --title "Permissions" --msgbox "Permissions activés" 0 0 | |
fi | |
} | |
saveMenu(){ | |
if(whiptail --title "Sauvegarde USB" --yesno "$saveMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
saveUSB | |
else | |
mainMenu | |
fi | |
} | |
restoreMenu(){ | |
if(whiptail --title "Restauration USB" --yesno "$restoreMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
restoreUSB | |
checkPermissions | |
setupPermissionsBinaries | |
else | |
mainMenu | |
fi | |
} | |
## Menu d'erreurs | |
# Menu Internet HS | |
noInternetMenu(){ | |
whiptail --title "Vérifier que vous êtes connecté à internet" --msgbox "$noInternetMessage" 0 0 | |
echo -e "$ERR - Impossible de continuer sans internet $NORMAL" | |
} | |
# Menu Apache déjà installé | |
ApacheAlreadyInstalledMenu(){ | |
if(whiptail --title "Un serveur web est déjà installé" --yesno "$ApacheMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
doInstallWebServer=1 | |
else | |
doInstallWebServer=0 | |
fi | |
} | |
# Menu Nginx déjà installé | |
nginxAlreadyInstalledMenu(){ | |
if(whiptail --title "Un serveur web est déjà installé" --yesno "$nginxMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
doInstallWebServer=1 | |
else | |
doInstallWebServer=0 | |
fi | |
} | |
# Menu error APT-GET | |
aptgetErrorMenu(){ | |
#Récupère le message d'erreur apt-get | |
getAptError | |
#Affiche l'erreur dans la GUI | |
whiptail --title "le gestionnaire de paquet ne réponds pas" --msgbox "$aptGetErrorMessage $aptError" 0 0 | |
echo -e "$ERR Impossible de continuer sans apt-get $NORMAL" | |
echo -e "$WARN ERREUR - $aptGetErrorMessage $aptError" | |
exit 1 | |
} | |
# Menu erreur git | |
gitErrorMenu(){ | |
#Récupère le message d'erreur de git clone | |
getGitError | |
#Affiche l'erreur dans la GUI | |
whiptail --title "le gestionnaire de paquet ne réponds pas" --msgbox "$gitErrorMessage $gitError" 0 0 | |
exit 1 | |
} | |
# Menu erreur wiringPi | |
wiringPiErrorMenu(){ | |
getWiringPiError | |
whiptail --title "Echec de la compilation de WiringPi" --msgbox "$wiringPiErrorMessage $wiringPiError" 0 0 | |
} | |
# Menu erreur lighttpd | |
lighttpdErrorMenu(){ | |
whiptail --title "Echec du lancement de Lighttpd" --msgbox "$lighttpdErrorMessage $lighttpdError" 0 0 | |
} | |
confirmEraseUSB(){ | |
if(whiptail --title "Confirmer la suppression de la sauvegarde" --yesno "Une sauvegarde précédente existe la supprimer ?" --yes-button "Oui" --no-button "Non" 0 0) then | |
confirmErase=1 | |
else | |
confirmErase=0 | |
fi | |
} | |
############## | |
# Scripts | |
############## | |
# Toutes les parties de l'installation sont séparés en fonctions | |
# Ceci afin de faciliter les tests de chaque partie | |
#Vérifie que vous êtes bien en root | |
verifyRoot() { | |
if [ $(id -u) -ne 0 ]; then | |
echo -e "\033[1;31mVous avez oublié de vous mettre en root!\033[0;39m" | |
echo -e "Tapez \033[1;34msudo $0\033[0;39m" | |
isRoot=0 | |
else | |
isRoot=1 | |
fi | |
} | |
#Vérifie l'état de la connexion internet | |
checkInternet(){ | |
ping -c1 www.google.com > /dev/null 2>&1 && internet=1 || internet=0 | |
echo -e "$OK -----> Vérification de la connexion à internet $NORMAL" | |
if [[ $internet -eq 0 ]] | |
then | |
noInternetMenu | |
fi | |
} | |
#Récupère le message d'erreur APT-GET | |
getAptError(){ | |
rm -f /tmp/aptError.log | |
#On lance apt-get install en dry-run (simulation) afin de recuperer l'erreur | |
#et on sauve le log dans /tmp/aptError.log | |
apt-get --dry-run install > /tmp/aptError.log 2>&1 | |
aptError=$(cat /tmp/aptError.log) | |
} | |
#Récupère le message d'erreur de git | |
getGitError(){ | |
gitError=$(cat /tmp/gitError.log) | |
} | |
#Récupère le message d'erreur de WiringPi | |
getWiringPiError(){ | |
wiringPiError=$(cat /tmp/wiringPiError.log) | |
} | |
#Récupère le message d'erreur de lighttpd | |
getLighttpdError(){ | |
lighttpdError=$(cat /tmp/lighttpdReload.log) | |
} | |
#Met à jour le Raspberry Pi en utilisant whiptail comme interface | |
updateRaspberryPi(){ | |
echo -e "$OK -----> Mise à jour du Raspberry Pi $NORMAL" | |
#debconf-apt-progress permet d'afficher la progression de la mis à jour dans une GUI en français | |
debconf-apt-progress -- apt-get -q -y update | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
aptgetErrorMenu | |
fi | |
debconf-apt-progress -- apt-get -q -y upgrade | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
aptgetErrorMenu | |
fi | |
echo -e "$OK -----> Installation du client git $NORMAL" | |
#On installe aussi le client git | |
debconf-apt-progress -- apt-get install -q -y git-core | |
if [[ $globalError -ne 0 ]];then | |
aptgetErrorMenu | |
fi | |
} | |
#Change les locales de l'anglais au français de manière non interactive | |
setLocaleToFrench(){ | |
echo -e "$OK -----> Configuration du terminal en français... Patientez s'il vous plaît ... $NORMAL" | |
#Ajout des locales FR | |
sed -i -e 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen | |
#Met FR en locale par défaut | |
echo 'LANG="fr_FR.UTF-8 UTF-8"'>/etc/default/locale | |
update-locale LANG=fr_FR.UTF-8 | |
export LANG=fr_FR.UTF-8 | |
#Les locales sont installés silencieusement | |
dpkg-reconfigure --frontend=noninteractive locales > /tmp/localeSetup.log 2>&1 | |
globalError=$? | |
#En cas d'erreur on affiche le message | |
if [[ $globalError -ne 0 ]];then | |
localeError=$(cat /tmp/localeSetup.log) | |
whiptail --title "Locales FR" --msgbox "$localeMessage $localeError" 0 0 | |
fi | |
} | |
#Gestion automatique des fuseaux horaires à l'aide de tzupdate | |
configureTimeZone(){ | |
echo -ne "$OK -----> Configuration du fuseau horaire $NORMAL" | |
#Vérifie que Python PIP est disponible | |
debconf-apt-progress -- apt-get install -q -y python-pip | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
aptgetErrorMenu | |
fi | |
#Installation silencieuse du Package python tzupdate | |
pip install --quiet tzupdate | |
#Si l'installation c'est correctement passé lancé tzupdate silencieusement | |
if [ -f /usr/local/bin/tzupdate ];then | |
tzupdate > /dev/null 2>&1 | |
#On récupère après la zone géographique pour l'afficher | |
currentTimeZone=$(tzupdate -p|awk '{print $4}') | |
echo -e "$WARN : $currentTimeZone $NORMAL" | |
else | |
echo -e "$ERR Impossible de changer le fuseau horaire automatiquement (ce n'est pas nécessaire) $NORMAL" | |
fi | |
} | |
#Vérification sommaire de l'existance d'autres serveur web | |
#Si un autre serveur web est installé prévient l'utilisateur | |
#Afin qu'il choissisent s'il veut installer lighttpd ou pas | |
checkWebServer(){ | |
if [ -f "/usr/sbin/apache2" ];then | |
ApacheAlreadyInstalledMenu | |
fi | |
if [ -f "/usr/sbin/nginx" ];then | |
nginxAlreadyInstalledMenu | |
fi | |
} | |
#Installation du serveur web et de SQLite | |
installWebServer(){ | |
echo -e "$OK -----> Installation du serveur web $NORMAL" | |
debconf-apt-progress -- apt-get install -q -y lighttpd git-core sqlite3 php7.0-sqlite php7.0-common php7.0-cgi php7.0-cli php-mbstring php7.0-zip | |
if [[ $globalError -ne 0 ]];then | |
aptgetErrorMenu | |
fi | |
#On efface la page par défaut de lighttpd pour éviter d'embrouiller les utilisateurs | |
rm -f /var/www/index.lighttpd.html | |
rm -rf /var/www/html | |
} | |
#Configure lighttpd pour bloquer l'accès à la base de données | |
setupWebServer(){ | |
echo -e "$OK -----> Configuration du serveur web (/etc/lighttpd/lighttpd.conf) $NORMAL" | |
cat <<\EOF > /etc/lighttpd/lighttpd.conf | |
server.modules = ( | |
"mod_access", | |
"mod_alias", | |
"mod_compress", | |
"mod_redirect", | |
# "mod_rewrite", | |
) | |
server.document-root = "/var/www/" | |
server.upload-dirs = ( "/var/cache/lighttpd/uploads" ) | |
server.errorlog = "/var/log/lighttpd/error.log" | |
server.pid-file = "/var/run/lighttpd.pid" | |
server.username = "www-data" | |
server.groupname = "www-data" | |
server.port = 80 | |
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" ) | |
url.access-deny = ( "~", ".inc", "db","log.txt" ) | |
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) | |
compress.cache-dir = "/var/cache/lighttpd/compress/" | |
compress.filetype = ( "application/javascript", "text/css", "text/html ) ", "text/plain" ) | |
# default listening port for IPv6 falls back to the IPv4 port | |
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port | |
include_shell "/usr/share/lighttpd/create-mime.assign.pl" | |
include_shell "/usr/share/lighttpd/include-conf-enabled.pl" | |
EOF | |
lighttpdSetupError=$? | |
if [[ lighttpdSetupError -eq 1 ]];then | |
echo -e "$ERR - Le fichier /etc/lighttpd/lighttpd.conf n'a pas été modifié $NORMAL" | |
fi | |
#Activation de PHP et rechargement de lighttpd | |
lighty-enable-mod fastcgi-php > /dev/null 2>&1 | |
service lighttpd restart > /tmp/lighttpdReload.log 2>&1 | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
getLighttpdError | |
lighttpdErrorMenu | |
echo -e "$ERR - La configuration de /etc/lighttpd/lighttpd.conf a échoué $NORMAL" | |
echo -e "$WARN ERREUR: $lighttpdError $NORMAL" | |
fi | |
} | |
#Clonage de Yana | |
#Si Yana a déjà été cloné alors on propose à l'utilisateur de le réinstaller | |
cloneYana(){ | |
if [[ copyYana -eq 1 ]];then | |
if [[ -d "/var/www/yana-server" ]];then | |
if(whiptail --title "Yana déjà installé" --yesno "$yanaMessage" --yes-button "Oui" --no-button "Non" 0 0) then | |
echo -e "$ERR -----> Réinstallation de Yana Server $NORMAL" | |
rm -rf /var/www/yana-server | |
git clone http://git.idleman.fr/idleman/yana-server.git /var/www/yana-server > /tmp/gitError.log 2>&1 | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
gitErrorMenu | |
fi | |
fi | |
else | |
echo -e "$OK -----> Copie de Yana Server $NORMAL" | |
git clone http://git.idleman.fr/idleman/yana-server.git /var/www/yana-server > /tmp/gitError.log 2>&1 | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
gitErrorMenu | |
fi | |
fi | |
fi | |
} | |
# Mis à jour forcé de Yana | |
# Cela n'affectera pas la base de données | |
forceYanaUpdate(){ | |
yanaLogo | |
echo -e "$OK -----> Mise à jour de Yana Server $NORMAL" | |
cd /var/www/yana-server && git fetch --all > /dev/null 2>&1 | |
fetchStatus=$? | |
cd /var/www/yana-server && lastcomment=$(git reset --hard origin/master | awk '{$1="";$2="";$3="";$4="";$5="";print $0;}') > /dev/null 2>&1 | |
resetStatus=$? | |
cd /var/www/yana-server && pullLog=$(git pull origin master) > /dev/null 2>&1 | |
pullStatus=$? | |
if [[ $fetchStatus -eq 0 ]] && [[ $resetStatus -eq 0 ]] && [[ $pullStatus -eq 0 ]];then | |
echo -e "$INFO -----> Dernier statut - $lastcomment $NORMAL" | |
# On revérifie les permissions | |
checkPermissions | |
setupPermissionsBinaries | |
else | |
echo -e "$ERR -----> La mise à jour a échoué $NORMAL" | |
echo $pullLog | |
fi | |
} | |
#Vérification des permissions pour Yana Server et le plugin radioRelay | |
checkPermissions(){ | |
echo -e "$OK -----> Vérification des permissions de YANA $NORMAL" | |
chown -R www-data:www-data /var/www/yana-server | |
chmod 750 -R /var/www/yana-server | |
giveRootPermissions /var/www/yana-server/plugins/radioRelay/radioEmission | |
} | |
# Cherche tout les fichiers cpp dans yana-server | |
getAllBinaries(){ | |
allBinaries=$(find /var/www/yana-server/plugins -name "*.cpp") | |
} | |
# Cherche tout les fichiers cpp pour donner la permission root au fichier binaire associés | |
setupPermissionsBinaries(){ | |
while read -r file; do | |
file=$(echo "${file/.cpp/}") | |
if [[ -f $file ]];then | |
giveRootPermissions $file | |
fi | |
done <<< "$allBinaries" | |
} | |
# Cherche des scripts dans les plugins | |
getAllScripts(){ | |
allScripts=$(find /var/www/yana-server/plugins -name "*.sh") | |
if [[ -z "${allScripts// }" ]];then | |
allScripts="Aucun Script disponible" | |
fi | |
} | |
# Donne les permissions root au serveur web à un programme | |
# Les permissions ont été géré de façon à limité au maximum l'accès | |
giveRootPermissions(){ | |
rootProgram=$1 | |
chown root:www-data $rootProgram | |
chmod 000 $rootProgram | |
chmod +sx $rootProgram | |
} | |
# Installation de wiringPi dans /opt/wiringPi | |
# Une fois installé , wiringPi n'utilisera pas ce dossier qui ne contient que les sources | |
installWiringPi(){ | |
#Vérifie si WiringPi est installé sinon on ne l'installe pas | |
if [[ ! -f /usr/local/bin/gpio ]];then | |
echo -e "$OK -----> Copie de wiringPi $NORMAL" | |
#Si les sources ont déjà été copié on les efface pour les retélécharger | |
if [ -d /opt/wiringPi ];then | |
rm -rf /opt/wiringPi | |
fi | |
cd /opt/ | |
git clone git://git.drogon.net/wiringPi /opt/wiringPi > /tmp/gitError.log 2>&1 | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
gitErrorMenu | |
fi | |
cd /opt/wiringPi/ | |
echo -e "$OK -----> Installation de wiringPi $NORMAL" | |
./build > /tmp/wiringPiError.log 2>&1 | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
wiringPiErrorMenu | |
fi | |
fi | |
} | |
#Création d'un lien symbolique de l'installateur vers | |
linkInstaller(){ | |
if [[ -f /usr/local/bin/configurer ]];then | |
rm /usr/local/bin/configurer | |
fi | |
ln -s /var/www/yana-server/install.sh /usr/local/bin/configurer | |
chmod +x /usr/local/bin/configurer | |
} | |
# Installation du socket pour le client YANA | |
installYanaSocket(){ | |
echo -e "$OK -----> Installation du socket YANA $NORMAL" | |
if [[ -s /var/www/yana-server/db/.database.db ]];then | |
# Installation de supervisor | |
debconf-apt-progress -- apt-get install -q -y supervisor | |
globalError=$? | |
if [[ $globalError -ne 0 ]];then | |
aptgetErrorMenu | |
fi | |
# Configuration du socket dans supervisor | |
cat <<\EOF > /etc/supervisor/conf.d/yana.conf | |
[program:yana] | |
command=/usr/bin/php /var/www/yana-server/socket.php | |
autostart=true | |
autorestart=true | |
stdout_logfile=/var/log/yanaSocket.log | |
redirect_stderr=true | |
EOF | |
supervisorFatalError=0 | |
# Lecture du fichier de configuration | |
supervisorctl reread > /tmp/supervisorReReadError.log 2>&1 | |
supervisorError=$(cat /tmp/supervisorReReadError.log) | |
if [[ ! $supervisorError == "No config updates to processes" && ! $supervisorError == "yana: available" ]];then | |
echo -e "$ERR Erreur dans /etc/supervisor/conf.d/yana.conf - $supervisorError $NORMAL" | |
supervisorFatalError=1 | |
fi | |
# Ajout du socket dans supervisor | |
supervisorctl update > /tmp/supervisorUpdateError.log 2>&1 | |
supervisorErrorUpdate=$(cat /tmp/supervisorUpdateError.log) | |
if [[ $supervisorError == "" && ! $supervisorError == "yana: added process group" ]];then | |
echo -e "$ERR Erreur dans /etc/supervisor/conf.d/yana.conf - $supervisorError $NORMAL" | |
supervisorFatalError=1 | |
fi | |
# Relancement du socket pour test | |
if [[ $supervisorFatalError -eq 0 ]];then | |
supervisorctl stop yana > /tmp/supervisorStopError.log 2>&1 | |
supervisorctl start yana > /tmp/supervisorStartError.log 2>&1 | |
supervisorStartError=$(cat /tmp/supervisorStartError.log) | |
if [[ ! $supervisorStartError == "yana: started" ]];then | |
echo -e "$ERR Erreur lancement du socket - $supervisorStartError $NORMAL" | |
echo -e "$ERR Tapez $INFO sudo cat /var/log/yanaSocket.log pour plus d'information $NORMAL" | |
fi | |
fi | |
else | |
echo -e "$ERR Aller sur $INFO http:///$HOSTNAME.local/yana-server $ERR pour finalisez l'installation avant d'installer le socket $NORMAL" | |
fi | |
} | |
checkCron(){ | |
checkCronYana=$(crontab -l|grep 'http://localhost/action.php?action=crontab') | |
} | |
addCron(){ | |
echo -e "$OK -----> Installation du cron scénario $NORMAL" | |
if [[ -z $checkCronYana ]];then | |
crontab -l | { cat; echo '*/1 * * * * wget "http://localhost/action.php?action=crontab" -O /dev/null 2>&1'; } | crontab - | |
else | |
echo -e "$WARN -----> Installation du cron scénario (déjà effectué) $NORMAL" | |
fi | |
} | |
#Afin de sécuriser Yana une fois l'installation fini, on supprime install.php | |
#Et on change le mot de passe de l'utilisateur par défaut (pi) | |
securityCheck(){ | |
if [[ -f /var/www/yana-server/install.php ]];then | |
echo -e "$OK -----> Supression de install.php $NORMAL" | |
rm /var/www/yana-server/install.php | |
fi | |
} | |
# Pour redimensionner la carte sd, j'utilise raspi-config en mode unattended | |
resizeSDCard(){ | |
echo -e "$OK -----> Vérification du redimensionnement de la carte SD $NORMAL" | |
raspi-config --expand-rootfs > /tmp/resizeSDCardError.log 2>&1 | |
} | |
endInstall(){ | |
HOSTNAME=$(cat /etc/hostname) | |
echo -e "$OK -----> Finissez l'installation en allant sur votre $WARNING navigateur $OK à $INFO http://$HOSTNAME.local/yana-server $NORMAL" | |
echo -ne "$WARN ATTENTE DE L'UTILISATEUR $NORMAL" | |
databaseCreated=0 | |
while [[ databaseCreated -eq 0 ]] | |
do | |
if [ ! -s /var/www/yana-server/db/.database.db ];then | |
echo -ne "." | |
else | |
echo -e "$OK --> OK! $NORMAL" | |
databaseCreated=1 | |
fi | |
sleep 3 | |
done | |
} | |
#http://unix.stackexchange.com/questions/60299/how-to-determine-which-sd-is-usb par F.Hauri | |
getUSB(){ | |
cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:)) | |
} | |
saveUSB(){ | |
yanaLogo | |
USBDrive="/dev/$(getUSB)1" | |
#Si aucun lecteur n'est detecté | |
if [[ $USBDrive == "/dev/1" ]];then | |
echo -e "$WARN -----> Aucun clé USB detecté ! $NORMAL" | |
else | |
echo -e "$OK -----> Clé USB trouvé sur $INFO $USBDrive $NORMAL" | |
#Si le lecteur existe vraiment | |
if [[ -e "$USBDrive" ]];then | |
# Si la clé est déjà monté, on l'a démonte par sécurité | |
if mount |grep "/media/backupUSB" > /dev/null;then | |
umount /media/backupUSB | |
#@todo rajouter un test | |
fi | |
# Si le dossier de montage n'existe pas on le crée | |
if [ ! -d /media/backupUSB ];then | |
mkdir /media/backupUSB | |
fi | |
# On monte la clé USB | |
mount "$USBDrive" /media/backupUSB | |
mountState=$? | |
# Si le montage s'est déroulé correctement | |
if [[ $mountState -eq 0 ]];then | |
#Si une sauvegarde précédente, on prévient l'utilisateur | |
if [ -d /media/backupUSB/yana ];then | |
confirmEraseUSB | |
#On efface la sauvegarde précédente | |
if [[ confirmErase -eq 1 ]];then | |
rm -rf /media/backupUSB/yana | |
echo -e "$WARN -----> Supression de la sauvegarde précédente $NORMAL" | |
else | |
echo -e "$WARN -----> Annulation de la sauvegarde" | |
fi | |
else | |
confirmErase=1 | |
fi | |
#Si pas de sauvegarde précédente ou confirmation de la suppression | |
if [[ confirmErase -eq 1 ]];then | |
echo -e "$OK -----> Copie des fichiers $NORMAL" | |
cp -R /var/www/yana-server/ /media/backupUSB/yana | |
copyState=$? | |
if [[ $copyState -eq 0 ]];then | |
echo -e "$OK -----> Copie réussi avec succès ! $NORMAL" | |
else | |
echo -e "$ERR -----> La copie a échoué ! $NORMAL" | |
fi | |
fi | |
# Quoiqu'il arrive nous démontons la clé à la fin | |
echo -e "$OK -----> Démontage de la clé USB $NORMAL" | |
umount /media/backupUSB | |
umountState=$? | |
#Si l'état de la clé n'est pas correcte | |
if [ $umountState -eq 0 ];then | |
echo -e "$OK -----> Vous pouvez retirer votre clé en toute sécurité $NORMAL" | |
else | |
echo -e "$ERR -----> La clé n'a pas été correctement démonté $NORMAL " | |
echo -e "$INFO Vous pouvez la démonter manuellement en tapant $OK umount /media/backupUSB $NORMAL" | |
fi | |
else | |
echo -e "$ERR -----> Impossible de monter ! $NORMAL" | |
fi | |
else | |
echo -e "$ERR -----> La détection a échoué ! $NORMAL" | |
fi | |
fi | |
} | |
restoreUSB(){ | |
yanaLogo | |
USBDrive="/dev/$(getUSB)1" | |
#Si aucun lecteur n'est detecté | |
if [[ $USBDrive == "/dev/1" ]];then | |
echo -e "$WARN -----> Aucun clé USB detecté ! $NORMAL" | |
else | |
echo -e "$OK -----> Clé USB trouvé sur $INFO $USBDrive $NORMAL" | |
#Si le lecteur existe vraiment | |
if [[ -e "$USBDrive" ]];then | |
# Si la clé est déjà monté, on l'a démonte par sécurité | |
if mount |grep "/media/backupUSB" > /dev/null;then | |
umount /media/backupUSB | |
#@todo rajouter un test | |
fi | |
# Si le dossier de montage n'existe pas on le crée | |
if [ ! -d /media/backupUSB ];then | |
mkdir /media/backupUSB | |
fi | |
# On monte la clé USB | |
mount "$USBDrive" /media/backupUSB | |
mountState=$? | |
# Si le montage s'est déroulé correctement | |
if [[ $mountState -eq 0 ]];then | |
rm -rf /var/www/yana-server | |
echo -e "$WARN -----> Supression de yana-server $NORMAL" | |
echo -e "$OK -----> Restauration de la sauvegarde $NORMAL" | |
cp -R /media/backupUSB/yana /var/www/yana-server/ | |
copyState=$? | |
if [[ $copyState -eq 0 ]];then | |
echo -e "$OK -----> La restauration est un succès ! $NORMAL" | |
else | |
echo -e "$ERR -----> La restauration a échoué ! $NORMAL" | |
fi | |
# Quoiqu'il arrive nous démontons la clé à la fin | |
echo -e "$OK -----> Démontage de la clé USB $NORMAL" | |
umount /media/backupUSB | |
umountState=$? | |
#Si l'état de la clé n'est pas correcte | |
if [ $umountState -eq 0 ];then | |
echo -e "$OK -----> Vous pouvez retirer votre clé en toute sécurité $NORMAL" | |
echo -e "$INFO Pour réouvrir la clé USB tapez : $ERR mount $USBDrive /media/backupUSB $NORMAL" | |
else | |
echo -e "$ERR -----> La clé n'a pas été correctement démonté $NORMAL " | |
echo -e "$INFO Vous pouvez la démonter manuellement en tapant $OK umount /media/backupUSB $NORMAL" | |
fi | |
else | |
echo -e "$ERR -----> Impossible de monter ! $NORMAL" | |
fi | |
else | |
echo -e "$ERR -----> La détection a échoué ! $NORMAL" | |
fi | |
fi | |
} | |
# Renomme le Raspberry Pi sur le réseau | |
# Il sera alors accessible depuis newhostname.local | |
# Cela va modifier /etc/hosts et /etc/hostname où le daemon avahi | |
# va chercher le nom du Raspberry Pi | |
renamePi(){ | |
yanaLogo | |
if [[ -z $newhostname ]];then | |
newhostname="maison" | |
fi | |
cat <<EOF > /etc/hosts && | |
127.0.0.1 localhost | |
::1 localhost ip6-localhost ip6-loopback | |
fe00::0 ip6-localnet | |
ff00::0 ip6-mcastprefix | |
ff02::1 ip6-allnodes | |
ff02::2 ip6-allrouters | |
127.0.1.1 $newhostname | |
EOF | |
echo $newhostname > /etc/hostname | |
hostname $newhostname | |
service avahi-daemon restart > /dev/null 2>&1 | |
whiptail --title "Raspberry Pi s'appelle $newhostname.local" --msgbox "Tapez http://$newhostname.local/ pour accéder à Yana" 0 0 | |
echo -ne "$OK -----> Renommage du Raspberry Pi $NORMAL" | |
echo -e "$WARN : $newhostname.local $NORMAL" | |
} | |
############### | |
# La partie principale | |
############### | |
# Si vous voulez supprimer des étapes ou en rajouter | |
# C'est ici que tout se passe | |
#Vérification des droits administrateur | |
cd / | |
verifyRoot | |
if [[ $isRoot -eq 1 ]];then | |
if [[ $# -eq 1 ]];then | |
scriptToExecute=$1 | |
if [[ scriptToExecute -eq "noresize" ]];then | |
resizeSDCard=0 | |
fi | |
else | |
# Affichage du menu principal | |
mainMenu | |
# Si Installer est appuyé | |
if [[ $doInstall -eq 1 ]];then | |
if [ $resizeSD -eq 1 ];then | |
resizeSDCardMenu # Redimensionnement de la carte SD | |
fi | |
# Renommer le Raspberry Pi | |
renameMenu | |
# Vérifier si git.idleman.fr est accessible | |
checkInternet | |
if [[ $internet -eq 1 ]];then | |
setLocaleToFrench # Mettre le terminal en français | |
updateRaspberryPi # Mettre à jour le Raspberry Pi (apt-get update/upgrade) | |
configureTimeZone # Configurer le fuseau horaire automatiquement (tzupdate) | |
# Clone le repo ldleman/yana | |
cloneYana | |
# Installe le serveur web | |
checkWebServer | |
if [[ $doInstallWebServer -eq 1 ]];then | |
installWebServer | |
setupWebServer | |
fi | |
# Vérifie les permissions des fichiers et des binaires | |
checkPermissions | |
# Install WiringPi (gpio) | |
installWiringPi | |
# Fait un lien de /var/www/yana-server/install.sh ver /usr/local/bin/configuration | |
linkInstaller | |
# Affiche un message avec l'étape sur le web | |
endInstall | |
securityCheck | |
checkBinariesMenu | |
installYanaSocket | |
addCron | |
echo -e "$OK Installation TERMINE!!! Il est conseillé de $ERR redémarrer $OK votre raspberry pi $NORMAL" | |
echo -e "$INFO sudo reboot $NORMAL" | |
fi | |
fi | |
fi | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment