install.sh 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113
  1. #!/bin/bash
  2. # Auteur : Remi Sarrailh (maditnerd)
  3. # Updates : Modifications mineures par Valentin CARRUESCO Idleman 28/07/2018
  4. # Licence : MIT
  5. # Un probleme : https://git.idleman.fr/idleman/yana-server/issues
  6. # https://tldrlegal.com/license/mit-license
  7. #############
  8. # Variables
  9. #############
  10. INSTALLVERSION="3.0.6"
  11. ERR="\033[1;31m"
  12. NORMAL="\033[0;39m"
  13. INFO="\033[1;34m"
  14. WARN="\033[1;33m"
  15. OK="\033[1;32m"
  16. IPADDRESS=$(hostname -I)
  17. HOSTNAME=$(cat /etc/hostname)
  18. doInstall=0
  19. #Installer le serveur web (se met à 0 si un autre serveur web est installé)
  20. doInstallWebServer=1
  21. isRoot=0
  22. GlobalError=0
  23. confirmErase=0
  24. copyYana=1
  25. resizeSD=1
  26. ################
  27. # Messages GUI
  28. ################
  29. # J'ai séparé les messages long du GUI du reste du programme
  30. # Afin quel soit facilement modifiable
  31. installMessage="\
  32. Etapes:
  33. ---------------------------
  34. * Renommer le Raspberry Pi
  35. * Redimensionner la carte SD
  36. * Mis à jour
  37. * Terminal en français
  38. ------------------------------------
  39. * Configuration du fuseau horaire
  40. * Installation wiringPi (pour gérer les GPIO)
  41. -------------------------------------------
  42. * Copie de Yana Server
  43. * Installation du serveur web
  44. * Création de l'utilisateur
  45. * Permissions du serveur web
  46. * Installation du socket / cron
  47. "
  48. checkMessage="\
  49. Nous allons revérifier toute l'installation mais sans modifier ni yana-server ni la configuration
  50. "
  51. renameMessage="\
  52. Vous pouvez accéder à Yana en utilisant un nom plutôt qu'une adresse IP \n\n\
  53. Pour que cela marche depuis Windows, il faut que les services BONJOUR soit installés \n\
  54. C'est le cas si vous avez SKYPE, ITUNES ou Windows 10 sinon il vous faudra l'installer \n\
  55. http://support.apple.com/kb/DL999 \n\
  56. \n\
  57. \n\
  58. Example : maison sera accessible sur http://maison.local/
  59. "
  60. saveMessage="\
  61. Vous pouvez sauvegarder yana-server sur une clé USB \n\n\
  62. Ceci sauvegardera /var/www/yana-server dans le dossier yana \n\n\
  63. Si une sauvegarde existe sur la clé, elle sera effacée \n\
  64. si vous voulez conserver une sauvegarde précédente renommer le dossier \n\
  65. "
  66. restoreMessage="\
  67. Vous pouvez revenir à un état précédent de yana depuis une clé USB \n\n\
  68. Ceci effacera /var/www/yana-server et le replacera par celui \n\
  69. dans le dossier sur la clé USB /yana
  70. "
  71. resizeSDCardMessage="\
  72. Voulez vous redimensionner la carte SD de votre Raspberry Pi ?
  73. Ceci sera fait au prochain redémarrage.
  74. "
  75. # Message d'erreurs
  76. noInternetMessage="\
  77. Je n'arrive pas à me connecter à git.idleman.fr \n\
  78. Voici votre adresse IP: $IPADDRESS\
  79. "
  80. ApacheMessage="\
  81. Yana utilise lighttpd comme serveur web par défaut\n\
  82. Il semblerait que Apache (un autre serveur web) soit déjà installé...\n\n\
  83. Voulez vous quand même installer lighttpd ? \n\
  84. "
  85. nginxMessage="\
  86. Yana utilise lighttpd comme serveur web par défaut\n\
  87. Il semblerait que nginx (un autre serveur web) soit déjà installé...\n\n\
  88. Voulez vous quand même installer lighttpd ? \n\
  89. "
  90. yanaMessage="\
  91. Yana semble avoir déjà été copié.\n\
  92. Voulez vous que je le supprimer et que je le réinstalle ?\
  93. "
  94. localeMessage="\
  95. Je n'ai pas réussi à mettre le terminal en français\n\
  96. Pour autant, ceci n'aura aucune incidence sur la suite de l'installation\n\n\
  97. Voici le message d'erreur:\
  98. "
  99. aptGetErrorMessage="\
  100. Le gestionnaire de paquet apt-get est HS\n\
  101. * Soit celui-ci a été interrompu\n\
  102. * Soit il est en cours d'utilisation par un autre programme\n\
  103. Supprimer le fichier de verrou est probablement la solution\n\n\
  104. Voici le message d'erreur:\n\
  105. "
  106. gitErrorMessage="\
  107. Impossible de récupérer le code source avec git\n\
  108. Cela peut être du à un problème du coté de git.idleman.fr\n\
  109. Veuillez vérifier que http://git.idleman.fr/ est en ligne\n\n\
  110. Voici le message d'erreur:\n\
  111. "
  112. wiringPiErrorMessage="\
  113. Impossible de compiler wiringPi\n\
  114. Voici le message d'erreur:\n\
  115. "
  116. lighttpdErrorMessage="\
  117. Le serveur web n'a pas réussi à se redémarrer correctement\n\
  118. Voici le message d'erreur:\n\
  119. "
  120. #Un joli logo ascii sans avoir à installer un programme pour ça
  121. yanaLogo(){
  122. clear
  123. echo -ne $INFO
  124. cat<<EOF
  125. ██╗ ██╗ █████╗ ███╗ ██╗ █████╗ ████████╗
  126. ╚██╗ ██╔╝██╔══██╗████╗ ██║██╔══██╗ █ █ █ █║
  127. ╚████╔╝ ███████║██╔██╗ ██║███████║ █ █║
  128. ╚██╔╝ ██╔══██║██║╚██╗██║██╔══██║ ██████ ║
  129. ██║ ██║ ██║██║ ╚████║██║ ██║ █ ████ █║
  130. ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ █ █══╝
  131. EOF
  132. echo -ne $ERR
  133. cat<<EOF
  134. ██╗███╗ ██╗███████╗████████╗ █████╗ ██╗ ██╗
  135. ██║████╗ ██║██╔════╝╚══██╔══╝██╔══██╗██║ ██║
  136. ██║██╔██╗ ██║███████╗ ██║ ███████║██║ ██║
  137. ██║██║╚██╗██║╚════██║ ██║ ██╔══██║██║ ██║
  138. ██║██║ ╚████║███████║ ██║ ██║ ██║███████╗███████╗
  139. ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝
  140. EOF
  141. echo -ne $NORMAL
  142. }
  143. ##############
  144. # Menus
  145. ##############
  146. # Menu principal
  147. mainMenu(){
  148. optionsMain=$(whiptail --title "YANA Server $INSTALLVERSION" --menu "" --cancel-button "Annuler" 0 0 0 \
  149. "Installer" "" \
  150. "Configurer" "" \
  151. "Sauvegarder" "" \
  152. "Restaurer" "" \
  153. "Quitter" "" 3>&1 1>&2 2>&3)
  154. case $optionsMain in
  155. "Installer")
  156. installMenu;;
  157. "Configurer")
  158. setupMenu;;
  159. "Sauvegarder")
  160. saveMenu;;
  161. "Restaurer")
  162. restoreMenu;;
  163. *)
  164. echo -e "$OK ... A la prochaine! $NORMAL"
  165. ;;
  166. esac
  167. }
  168. # Menu d'installation
  169. installMenu(){
  170. if(whiptail --title "Installation" --yesno "$installMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  171. doInstall=1
  172. else
  173. echo -e "\033[1;34m... A la prochaine!\033[0;39m"
  174. fi
  175. }
  176. # Menu de configuration
  177. setupMenu(){
  178. optionsSetup=$(whiptail --title "YANA Server $INSTALLVERSION" --menu "" --cancel-button "Retour" 0 0 0 \
  179. "Vérifier YANA" "" \
  180. "Mettre à jour YANA" "" \
  181. "Redimensionner la carte SD" "" \
  182. "Renommer le Raspberry Pi" "" \
  183. "Scripts Plugins" "" \
  184. "Quitter" "" \
  185. 3>&1 1>&2 2>&3)
  186. case $optionsSetup in
  187. "Vérifier YANA")
  188. checkMenu;;
  189. "Mettre à jour YANA")
  190. forceYanaUpdate;;
  191. "Redimensionner la carte SD")
  192. resizeSDCard
  193. setupMenu;;
  194. "Renommer le Raspberry Pi")
  195. renameMenu
  196. setupMenu;;
  197. "Scripts Plugins")
  198. scriptsMenu;;
  199. "Quitter")
  200. echo -e "$OK ... A la prochaine! $NORMAL";;
  201. *)
  202. mainMenu;;
  203. esac
  204. }
  205. # Menu vérification de yana
  206. checkMenu(){
  207. if(whiptail --title "Vérification" --yesno "$checkMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  208. updateRaspberryPi
  209. checkPermissions
  210. checkBinariesMenu
  211. installYanaSocket
  212. addCron
  213. else
  214. setupMenu
  215. fi
  216. }
  217. resizeSDCardMenu(){
  218. if(whiptail --title "Carte SD" --yesno "$resizeSDCardMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  219. resizeSDCard
  220. fi
  221. }
  222. # Menu de renommage du Raspberry Pi
  223. renameMenu(){
  224. newhostname=$(whiptail --inputbox "$renameMessage" --title "Choissisez un nom" 0 0 3>&1 1>&2 2>&3)
  225. renamePi
  226. }
  227. # Menu de scripts pour les plugins
  228. # Il faut créer un script au format .sh pour dans /var/www/yana-server/plugins/nom-du-plugin/nom-du-script.sh
  229. # On peut utiliser les fonctions du script d'installation et les variables à l'intérieur d'un script
  230. # Par example vous pouvez récupérer le nom $HOSTNAME ou l'adresse IP $IPADDRESS
  231. # Vérifier si internet est connecté
  232. scriptsMenu(){
  233. getAllScripts
  234. while read -r nextScript
  235. do
  236. scriptName=$(echo "${nextScript//\/var\/www\/yana-server\/plugins\//}")
  237. menu_options[ $i ]="$scriptName"
  238. (( i++ ))
  239. menu_options[ $i ]=""
  240. (( i++ ))
  241. done <<<"$allScripts"
  242. scriptToExecute=$(whiptail --title "Plugins" --menu "Gérer un Plugin" 0 0 0 "${menu_options[@]}" 3>&1 1>&2 2>&3 )
  243. executeScript
  244. }
  245. executeScript(){
  246. if [[ -f /var/www/yana-server/plugins/$scriptToExecute ]];then
  247. chmod +x /var/www/yana-server/plugins/$scriptToExecute
  248. clear
  249. yanaLogo
  250. echo -e "$OK -----> Exécution de $scriptToExecute $NORMAL"
  251. dir=$(dirname /var/www/yana-server/plugins/$scriptToExecute)
  252. cd $dir;. /var/www/yana-server/plugins/$scriptToExecute
  253. else
  254. echo -e "$OK -----> Aucun script trouvé dans /var/www/yana-server/plugins/$scriptToExecute $NORMAL"
  255. fi
  256. }
  257. # Menu de vérification des fichiers binaires
  258. checkBinariesMenu(){
  259. getAllBinaries
  260. 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
  261. setupPermissionsBinaries
  262. whiptail --title "Permissions" --msgbox "Permissions activés" 0 0
  263. fi
  264. }
  265. saveMenu(){
  266. if(whiptail --title "Sauvegarde USB" --yesno "$saveMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  267. saveUSB
  268. else
  269. mainMenu
  270. fi
  271. }
  272. restoreMenu(){
  273. if(whiptail --title "Restauration USB" --yesno "$restoreMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  274. restoreUSB
  275. checkPermissions
  276. setupPermissionsBinaries
  277. else
  278. mainMenu
  279. fi
  280. }
  281. ## Menu d'erreurs
  282. # Menu Internet HS
  283. noInternetMenu(){
  284. whiptail --title "Vérifier que vous êtes connecté à internet" --msgbox "$noInternetMessage" 0 0
  285. echo -e "$ERR - Impossible de continuer sans internet $NORMAL"
  286. }
  287. # Menu Apache déjà installé
  288. ApacheAlreadyInstalledMenu(){
  289. if(whiptail --title "Un serveur web est déjà installé" --yesno "$ApacheMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  290. doInstallWebServer=1
  291. else
  292. doInstallWebServer=0
  293. fi
  294. }
  295. # Menu Nginx déjà installé
  296. nginxAlreadyInstalledMenu(){
  297. if(whiptail --title "Un serveur web est déjà installé" --yesno "$nginxMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  298. doInstallWebServer=1
  299. else
  300. doInstallWebServer=0
  301. fi
  302. }
  303. # Menu error APT-GET
  304. aptgetErrorMenu(){
  305. #Récupère le message d'erreur apt-get
  306. getAptError
  307. #Affiche l'erreur dans la GUI
  308. whiptail --title "le gestionnaire de paquet ne réponds pas" --msgbox "$aptGetErrorMessage $aptError" 0 0
  309. echo -e "$ERR Impossible de continuer sans apt-get $NORMAL"
  310. echo -e "$WARN ERREUR - $aptGetErrorMessage $aptError"
  311. exit 1
  312. }
  313. # Menu erreur git
  314. gitErrorMenu(){
  315. #Récupère le message d'erreur de git clone
  316. getGitError
  317. #Affiche l'erreur dans la GUI
  318. whiptail --title "le gestionnaire de paquet ne réponds pas" --msgbox "$gitErrorMessage $gitError" 0 0
  319. exit 1
  320. }
  321. # Menu erreur wiringPi
  322. wiringPiErrorMenu(){
  323. getWiringPiError
  324. whiptail --title "Echec de la compilation de WiringPi" --msgbox "$wiringPiErrorMessage $wiringPiError" 0 0
  325. }
  326. # Menu erreur lighttpd
  327. lighttpdErrorMenu(){
  328. whiptail --title "Echec du lancement de Lighttpd" --msgbox "$lighttpdErrorMessage $lighttpdError" 0 0
  329. }
  330. confirmEraseUSB(){
  331. 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
  332. confirmErase=1
  333. else
  334. confirmErase=0
  335. fi
  336. }
  337. ##############
  338. # Scripts
  339. ##############
  340. # Toutes les parties de l'installation sont séparés en fonctions
  341. # Ceci afin de faciliter les tests de chaque partie
  342. #Vérifie que vous êtes bien en root
  343. verifyRoot() {
  344. if [ $(id -u) -ne 0 ]; then
  345. echo -e "\033[1;31mVous avez oublié de vous mettre en root!\033[0;39m"
  346. echo -e "Tapez \033[1;34msudo $0\033[0;39m"
  347. isRoot=0
  348. else
  349. isRoot=1
  350. fi
  351. }
  352. #Vérifie l'état de la connexion internet
  353. checkInternet(){
  354. ping -c1 www.google.com > /dev/null 2>&1 && internet=1 || internet=0
  355. echo -e "$OK -----> Vérification de la connexion à internet $NORMAL"
  356. if [[ $internet -eq 0 ]]
  357. then
  358. noInternetMenu
  359. fi
  360. }
  361. #Récupère le message d'erreur APT-GET
  362. getAptError(){
  363. rm -f /tmp/aptError.log
  364. #On lance apt-get install en dry-run (simulation) afin de recuperer l'erreur
  365. #et on sauve le log dans /tmp/aptError.log
  366. apt-get --dry-run install > /tmp/aptError.log 2>&1
  367. aptError=$(cat /tmp/aptError.log)
  368. }
  369. #Récupère le message d'erreur de git
  370. getGitError(){
  371. gitError=$(cat /tmp/gitError.log)
  372. }
  373. #Récupère le message d'erreur de WiringPi
  374. getWiringPiError(){
  375. wiringPiError=$(cat /tmp/wiringPiError.log)
  376. }
  377. #Récupère le message d'erreur de lighttpd
  378. getLighttpdError(){
  379. lighttpdError=$(cat /tmp/lighttpdReload.log)
  380. }
  381. #Met à jour le Raspberry Pi en utilisant whiptail comme interface
  382. updateRaspberryPi(){
  383. echo -e "$OK -----> Mise à jour du Raspberry Pi $NORMAL"
  384. #debconf-apt-progress permet d'afficher la progression de la mis à jour dans une GUI en français
  385. debconf-apt-progress -- apt-get -q -y update
  386. globalError=$?
  387. if [[ $globalError -ne 0 ]];then
  388. aptgetErrorMenu
  389. fi
  390. debconf-apt-progress -- apt-get -q -y upgrade
  391. globalError=$?
  392. if [[ $globalError -ne 0 ]];then
  393. aptgetErrorMenu
  394. fi
  395. echo -e "$OK -----> Installation du client git $NORMAL"
  396. #On installe aussi le client git
  397. debconf-apt-progress -- apt-get install -q -y git-core
  398. if [[ $globalError -ne 0 ]];then
  399. aptgetErrorMenu
  400. fi
  401. }
  402. #Change les locales de l'anglais au français de manière non interactive
  403. setLocaleToFrench(){
  404. echo -e "$OK -----> Configuration du terminal en français... Patientez s'il vous plaît ... $NORMAL"
  405. #Ajout des locales FR
  406. sed -i -e 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen
  407. #Met FR en locale par défaut
  408. echo 'LANG="fr_FR.UTF-8 UTF-8"'>/etc/default/locale
  409. update-locale LANG=fr_FR.UTF-8
  410. export LANG=fr_FR.UTF-8
  411. #Les locales sont installés silencieusement
  412. dpkg-reconfigure --frontend=noninteractive locales > /tmp/localeSetup.log 2>&1
  413. globalError=$?
  414. #En cas d'erreur on affiche le message
  415. if [[ $globalError -ne 0 ]];then
  416. localeError=$(cat /tmp/localeSetup.log)
  417. whiptail --title "Locales FR" --msgbox "$localeMessage $localeError" 0 0
  418. fi
  419. }
  420. #Gestion automatique des fuseaux horaires à l'aide de tzupdate
  421. configureTimeZone(){
  422. echo -ne "$OK -----> Configuration du fuseau horaire $NORMAL"
  423. #Vérifie que Python PIP est disponible
  424. debconf-apt-progress -- apt-get install -q -y python-pip
  425. globalError=$?
  426. if [[ $globalError -ne 0 ]];then
  427. aptgetErrorMenu
  428. fi
  429. #Installation silencieuse du Package python tzupdate
  430. pip install --quiet tzupdate
  431. #Si l'installation c'est correctement passé lancé tzupdate silencieusement
  432. if [ -f /usr/local/bin/tzupdate ];then
  433. tzupdate > /dev/null 2>&1
  434. #On récupère après la zone géographique pour l'afficher
  435. currentTimeZone=$(tzupdate -p|awk '{print $4}')
  436. echo -e "$WARN : $currentTimeZone $NORMAL"
  437. else
  438. echo -e "$ERR Impossible de changer le fuseau horaire automatiquement (ce n'est pas nécessaire) $NORMAL"
  439. fi
  440. }
  441. #Vérification sommaire de l'existance d'autres serveur web
  442. #Si un autre serveur web est installé prévient l'utilisateur
  443. #Afin qu'il choissisent s'il veut installer lighttpd ou pas
  444. checkWebServer(){
  445. if [ -f "/usr/sbin/apache2" ];then
  446. ApacheAlreadyInstalledMenu
  447. fi
  448. if [ -f "/usr/sbin/nginx" ];then
  449. nginxAlreadyInstalledMenu
  450. fi
  451. }
  452. #Installation du serveur web et de SQLite
  453. installWebServer(){
  454. echo -e "$OK -----> Installation du serveur web $NORMAL"
  455. 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
  456. if [[ $globalError -ne 0 ]];then
  457. aptgetErrorMenu
  458. fi
  459. #On efface la page par défaut de lighttpd pour éviter d'embrouiller les utilisateurs
  460. rm -f /var/www/index.lighttpd.html
  461. rm -rf /var/www/html
  462. }
  463. #Configure lighttpd pour bloquer l'accès à la base de données
  464. setupWebServer(){
  465. echo -e "$OK -----> Configuration du serveur web (/etc/lighttpd/lighttpd.conf) $NORMAL"
  466. cat <<\EOF > /etc/lighttpd/lighttpd.conf
  467. server.modules = (
  468. "mod_access",
  469. "mod_alias",
  470. "mod_compress",
  471. "mod_redirect",
  472. # "mod_rewrite",
  473. )
  474. server.document-root = "/var/www/"
  475. server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
  476. server.errorlog = "/var/log/lighttpd/error.log"
  477. server.pid-file = "/var/run/lighttpd.pid"
  478. server.username = "www-data"
  479. server.groupname = "www-data"
  480. server.port = 80
  481. index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
  482. url.access-deny = ( "~", ".inc", "db","log.txt" )
  483. static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
  484. compress.cache-dir = "/var/cache/lighttpd/compress/"
  485. compress.filetype = ( "application/javascript", "text/css", "text/html ) ", "text/plain" )
  486. # default listening port for IPv6 falls back to the IPv4 port
  487. include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
  488. include_shell "/usr/share/lighttpd/create-mime.assign.pl"
  489. include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
  490. EOF
  491. lighttpdSetupError=$?
  492. if [[ lighttpdSetupError -eq 1 ]];then
  493. echo -e "$ERR - Le fichier /etc/lighttpd/lighttpd.conf n'a pas été modifié $NORMAL"
  494. fi
  495. #Activation de PHP et rechargement de lighttpd
  496. lighty-enable-mod fastcgi-php > /dev/null 2>&1
  497. service lighttpd restart > /tmp/lighttpdReload.log 2>&1
  498. globalError=$?
  499. if [[ $globalError -ne 0 ]];then
  500. getLighttpdError
  501. lighttpdErrorMenu
  502. echo -e "$ERR - La configuration de /etc/lighttpd/lighttpd.conf a échoué $NORMAL"
  503. echo -e "$WARN ERREUR: $lighttpdError $NORMAL"
  504. fi
  505. }
  506. #Clonage de Yana
  507. #Si Yana a déjà été cloné alors on propose à l'utilisateur de le réinstaller
  508. cloneYana(){
  509. if [[ copyYana -eq 1 ]];then
  510. if [[ -d "/var/www/yana-server" ]];then
  511. if(whiptail --title "Yana déjà installé" --yesno "$yanaMessage" --yes-button "Oui" --no-button "Non" 0 0) then
  512. echo -e "$ERR -----> Réinstallation de Yana Server $NORMAL"
  513. rm -rf /var/www/yana-server
  514. GIT_SSL_NO_VERIFY=true git clone https://git.idleman.fr/idleman/yana-server.git /var/www/yana-server > /tmp/gitError.log 2>&1
  515. globalError=$?
  516. if [[ $globalError -ne 0 ]];then
  517. gitErrorMenu
  518. fi
  519. fi
  520. else
  521. echo -e "$OK -----> Copie de Yana Server $NORMAL"
  522. GIT_SSL_NO_VERIFY=true git clone https://git.idleman.fr/idleman/yana-server.git /var/www/yana-server > /tmp/gitError.log 2>&1
  523. globalError=$?
  524. if [[ $globalError -ne 0 ]];then
  525. gitErrorMenu
  526. fi
  527. fi
  528. fi
  529. }
  530. # Mis à jour forcé de Yana
  531. # Cela n'affectera pas la base de données
  532. forceYanaUpdate(){
  533. yanaLogo
  534. echo -e "$OK -----> Mise à jour de Yana Server $NORMAL"
  535. cd /var/www/yana-server && git fetch --all > /dev/null 2>&1
  536. fetchStatus=$?
  537. cd /var/www/yana-server && lastcomment=$(git reset --hard origin/master | awk '{$1="";$2="";$3="";$4="";$5="";print $0;}') > /dev/null 2>&1
  538. resetStatus=$?
  539. cd /var/www/yana-server && pullLog=$(git pull origin master) > /dev/null 2>&1
  540. pullStatus=$?
  541. if [[ $fetchStatus -eq 0 ]] && [[ $resetStatus -eq 0 ]] && [[ $pullStatus -eq 0 ]];then
  542. echo -e "$INFO -----> Dernier statut - $lastcomment $NORMAL"
  543. # On revérifie les permissions
  544. checkPermissions
  545. setupPermissionsBinaries
  546. else
  547. echo -e "$ERR -----> La mise à jour a échoué $NORMAL"
  548. echo $pullLog
  549. fi
  550. }
  551. #Vérification des permissions pour Yana Server et le plugin radioRelay
  552. checkPermissions(){
  553. echo -e "$OK -----> Vérification des permissions de YANA $NORMAL"
  554. chown -R www-data:www-data /var/www/yana-server
  555. chmod 750 -R /var/www/yana-server
  556. giveRootPermissions /var/www/yana-server/plugins/radioRelay/radioEmission
  557. }
  558. # Cherche tout les fichiers cpp dans yana-server
  559. getAllBinaries(){
  560. allBinaries=$(find /var/www/yana-server/plugins -name "*.cpp")
  561. }
  562. # Cherche tout les fichiers cpp pour donner la permission root au fichier binaire associés
  563. setupPermissionsBinaries(){
  564. while read -r file; do
  565. file=$(echo "${file/.cpp/}")
  566. if [[ -f $file ]];then
  567. giveRootPermissions $file
  568. fi
  569. done <<< "$allBinaries"
  570. }
  571. # Cherche des scripts dans les plugins
  572. getAllScripts(){
  573. allScripts=$(find /var/www/yana-server/plugins -name "*.sh")
  574. if [[ -z "${allScripts// }" ]];then
  575. allScripts="Aucun Script disponible"
  576. fi
  577. }
  578. # Donne les permissions root au serveur web à un programme
  579. # Les permissions ont été géré de façon à limité au maximum l'accès
  580. giveRootPermissions(){
  581. rootProgram=$1
  582. chown root:www-data $rootProgram
  583. chmod 000 $rootProgram
  584. chmod +sx $rootProgram
  585. }
  586. # Installation de wiringPi dans /opt/wiringPi
  587. # Une fois installé , wiringPi n'utilisera pas ce dossier qui ne contient que les sources
  588. installWiringPi(){
  589. #Vérifie si WiringPi est installé sinon on ne l'installe pas
  590. if [[ ! -f /usr/local/bin/gpio ]];then
  591. echo -e "$OK -----> Copie de wiringPi $NORMAL"
  592. #Si les sources ont déjà été copié on les efface pour les retélécharger
  593. if [ -d /opt/wiringPi ];then
  594. rm -rf /opt/wiringPi
  595. fi
  596. cd /opt/
  597. git clone git://git.drogon.net/wiringPi /opt/wiringPi > /tmp/gitError.log 2>&1
  598. globalError=$?
  599. if [[ $globalError -ne 0 ]];then
  600. gitErrorMenu
  601. fi
  602. cd /opt/wiringPi/
  603. echo -e "$OK -----> Installation de wiringPi $NORMAL"
  604. ./build > /tmp/wiringPiError.log 2>&1
  605. globalError=$?
  606. if [[ $globalError -ne 0 ]];then
  607. wiringPiErrorMenu
  608. fi
  609. fi
  610. }
  611. #Création d'un lien symbolique de l'installateur vers
  612. linkInstaller(){
  613. if [[ -f /usr/local/bin/configurer ]];then
  614. rm /usr/local/bin/configurer
  615. fi
  616. ln -s /var/www/yana-server/install.sh /usr/local/bin/configurer
  617. chmod +x /usr/local/bin/configurer
  618. }
  619. # Installation du socket pour le client YANA
  620. installYanaSocket(){
  621. echo -e "$OK -----> Installation du socket YANA $NORMAL"
  622. if [[ -s /var/www/yana-server/db/.database.db ]];then
  623. # Installation de supervisor
  624. debconf-apt-progress -- apt-get install -q -y supervisor
  625. globalError=$?
  626. if [[ $globalError -ne 0 ]];then
  627. aptgetErrorMenu
  628. fi
  629. # Configuration du socket dans supervisor
  630. cat <<\EOF > /etc/supervisor/conf.d/yana.conf
  631. [program:yana]
  632. command=/usr/bin/php /var/www/yana-server/socket.php
  633. autostart=true
  634. autorestart=true
  635. stdout_logfile=/var/log/yanaSocket.log
  636. redirect_stderr=true
  637. EOF
  638. supervisorFatalError=0
  639. # Lecture du fichier de configuration
  640. supervisorctl reread > /tmp/supervisorReReadError.log 2>&1
  641. supervisorError=$(cat /tmp/supervisorReReadError.log)
  642. if [[ ! $supervisorError == "No config updates to processes" && ! $supervisorError == "yana: available" ]];then
  643. echo -e "$ERR Erreur dans /etc/supervisor/conf.d/yana.conf - $supervisorError $NORMAL"
  644. supervisorFatalError=1
  645. fi
  646. # Ajout du socket dans supervisor
  647. supervisorctl update > /tmp/supervisorUpdateError.log 2>&1
  648. supervisorErrorUpdate=$(cat /tmp/supervisorUpdateError.log)
  649. if [[ $supervisorError == "" && ! $supervisorError == "yana: added process group" ]];then
  650. echo -e "$ERR Erreur dans /etc/supervisor/conf.d/yana.conf - $supervisorError $NORMAL"
  651. supervisorFatalError=1
  652. fi
  653. # Relancement du socket pour test
  654. if [[ $supervisorFatalError -eq 0 ]];then
  655. supervisorctl stop yana > /tmp/supervisorStopError.log 2>&1
  656. supervisorctl start yana > /tmp/supervisorStartError.log 2>&1
  657. supervisorStartError=$(cat /tmp/supervisorStartError.log)
  658. if [[ ! $supervisorStartError == "yana: started" ]];then
  659. echo -e "$ERR Erreur lancement du socket - $supervisorStartError $NORMAL"
  660. echo -e "$ERR Tapez $INFO sudo cat /var/log/yanaSocket.log pour plus d'information $NORMAL"
  661. fi
  662. fi
  663. else
  664. echo -e "$ERR Aller sur $INFO http:///$HOSTNAME.local/yana-server $ERR pour finalisez l'installation avant d'installer le socket $NORMAL"
  665. fi
  666. }
  667. checkCron(){
  668. checkCronYana=$(crontab -l|grep 'http://localhost/action.php?action=crontab')
  669. }
  670. addCron(){
  671. echo -e "$OK -----> Installation du cron scénario $NORMAL"
  672. if [[ -z $checkCronYana ]];then
  673. crontab -l | { cat; echo '*/1 * * * * wget "http://localhost/action.php?action=crontab" -O /dev/null 2>&1'; } | crontab -
  674. else
  675. echo -e "$WARN -----> Installation du cron scénario (déjà effectué) $NORMAL"
  676. fi
  677. }
  678. #Afin de sécuriser Yana une fois l'installation fini, on supprime install.php
  679. #Et on change le mot de passe de l'utilisateur par défaut (pi)
  680. securityCheck(){
  681. if [[ -f /var/www/yana-server/install.php ]];then
  682. echo -e "$OK -----> Supression de install.php $NORMAL"
  683. rm /var/www/yana-server/install.php
  684. fi
  685. }
  686. # Pour redimensionner la carte sd, j'utilise raspi-config en mode unattended
  687. resizeSDCard(){
  688. echo -e "$OK -----> Vérification du redimensionnement de la carte SD $NORMAL"
  689. raspi-config --expand-rootfs > /tmp/resizeSDCardError.log 2>&1
  690. }
  691. endInstall(){
  692. HOSTNAME=$(cat /etc/hostname)
  693. echo -e "$OK -----> Finissez l'installation en allant sur votre $WARNING navigateur $OK à $INFO http://$HOSTNAME.local/yana-server $NORMAL"
  694. echo -ne "$WARN ATTENTE DE L'UTILISATEUR $NORMAL"
  695. databaseCreated=0
  696. while [[ databaseCreated -eq 0 ]]
  697. do
  698. if [ ! -s /var/www/yana-server/db/.database.db ];then
  699. echo -ne "."
  700. else
  701. echo -e "$OK --> OK! $NORMAL"
  702. databaseCreated=1
  703. fi
  704. sleep 3
  705. done
  706. }
  707. #http://unix.stackexchange.com/questions/60299/how-to-determine-which-sd-is-usb par F.Hauri
  708. getUSB(){
  709. 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)) <(:))) <(:))
  710. }
  711. saveUSB(){
  712. yanaLogo
  713. USBDrive="/dev/$(getUSB)1"
  714. #Si aucun lecteur n'est detecté
  715. if [[ $USBDrive == "/dev/1" ]];then
  716. echo -e "$WARN -----> Aucun clé USB detecté ! $NORMAL"
  717. else
  718. echo -e "$OK -----> Clé USB trouvé sur $INFO $USBDrive $NORMAL"
  719. #Si le lecteur existe vraiment
  720. if [[ -e "$USBDrive" ]];then
  721. # Si la clé est déjà monté, on l'a démonte par sécurité
  722. if mount |grep "/media/backupUSB" > /dev/null;then
  723. umount /media/backupUSB
  724. #@todo rajouter un test
  725. fi
  726. # Si le dossier de montage n'existe pas on le crée
  727. if [ ! -d /media/backupUSB ];then
  728. mkdir /media/backupUSB
  729. fi
  730. # On monte la clé USB
  731. mount "$USBDrive" /media/backupUSB
  732. mountState=$?
  733. # Si le montage s'est déroulé correctement
  734. if [[ $mountState -eq 0 ]];then
  735. #Si une sauvegarde précédente, on prévient l'utilisateur
  736. if [ -d /media/backupUSB/yana ];then
  737. confirmEraseUSB
  738. #On efface la sauvegarde précédente
  739. if [[ confirmErase -eq 1 ]];then
  740. rm -rf /media/backupUSB/yana
  741. echo -e "$WARN -----> Supression de la sauvegarde précédente $NORMAL"
  742. else
  743. echo -e "$WARN -----> Annulation de la sauvegarde"
  744. fi
  745. else
  746. confirmErase=1
  747. fi
  748. #Si pas de sauvegarde précédente ou confirmation de la suppression
  749. if [[ confirmErase -eq 1 ]];then
  750. echo -e "$OK -----> Copie des fichiers $NORMAL"
  751. cp -R /var/www/yana-server/ /media/backupUSB/yana
  752. copyState=$?
  753. if [[ $copyState -eq 0 ]];then
  754. echo -e "$OK -----> Copie réussi avec succès ! $NORMAL"
  755. else
  756. echo -e "$ERR -----> La copie a échoué ! $NORMAL"
  757. fi
  758. fi
  759. # Quoiqu'il arrive nous démontons la clé à la fin
  760. echo -e "$OK -----> Démontage de la clé USB $NORMAL"
  761. umount /media/backupUSB
  762. umountState=$?
  763. #Si l'état de la clé n'est pas correcte
  764. if [ $umountState -eq 0 ];then
  765. echo -e "$OK -----> Vous pouvez retirer votre clé en toute sécurité $NORMAL"
  766. else
  767. echo -e "$ERR -----> La clé n'a pas été correctement démonté $NORMAL "
  768. echo -e "$INFO Vous pouvez la démonter manuellement en tapant $OK umount /media/backupUSB $NORMAL"
  769. fi
  770. else
  771. echo -e "$ERR -----> Impossible de monter ! $NORMAL"
  772. fi
  773. else
  774. echo -e "$ERR -----> La détection a échoué ! $NORMAL"
  775. fi
  776. fi
  777. }
  778. restoreUSB(){
  779. yanaLogo
  780. USBDrive="/dev/$(getUSB)1"
  781. #Si aucun lecteur n'est detecté
  782. if [[ $USBDrive == "/dev/1" ]];then
  783. echo -e "$WARN -----> Aucun clé USB detecté ! $NORMAL"
  784. else
  785. echo -e "$OK -----> Clé USB trouvé sur $INFO $USBDrive $NORMAL"
  786. #Si le lecteur existe vraiment
  787. if [[ -e "$USBDrive" ]];then
  788. # Si la clé est déjà monté, on l'a démonte par sécurité
  789. if mount |grep "/media/backupUSB" > /dev/null;then
  790. umount /media/backupUSB
  791. #@todo rajouter un test
  792. fi
  793. # Si le dossier de montage n'existe pas on le crée
  794. if [ ! -d /media/backupUSB ];then
  795. mkdir /media/backupUSB
  796. fi
  797. # On monte la clé USB
  798. mount "$USBDrive" /media/backupUSB
  799. mountState=$?
  800. # Si le montage s'est déroulé correctement
  801. if [[ $mountState -eq 0 ]];then
  802. rm -rf /var/www/yana-server
  803. echo -e "$WARN -----> Supression de yana-server $NORMAL"
  804. echo -e "$OK -----> Restauration de la sauvegarde $NORMAL"
  805. cp -R /media/backupUSB/yana /var/www/yana-server/
  806. copyState=$?
  807. if [[ $copyState -eq 0 ]];then
  808. echo -e "$OK -----> La restauration est un succès ! $NORMAL"
  809. else
  810. echo -e "$ERR -----> La restauration a échoué ! $NORMAL"
  811. fi
  812. # Quoiqu'il arrive nous démontons la clé à la fin
  813. echo -e "$OK -----> Démontage de la clé USB $NORMAL"
  814. umount /media/backupUSB
  815. umountState=$?
  816. #Si l'état de la clé n'est pas correcte
  817. if [ $umountState -eq 0 ];then
  818. echo -e "$OK -----> Vous pouvez retirer votre clé en toute sécurité $NORMAL"
  819. echo -e "$INFO Pour réouvrir la clé USB tapez : $ERR mount $USBDrive /media/backupUSB $NORMAL"
  820. else
  821. echo -e "$ERR -----> La clé n'a pas été correctement démonté $NORMAL "
  822. echo -e "$INFO Vous pouvez la démonter manuellement en tapant $OK umount /media/backupUSB $NORMAL"
  823. fi
  824. else
  825. echo -e "$ERR -----> Impossible de monter ! $NORMAL"
  826. fi
  827. else
  828. echo -e "$ERR -----> La détection a échoué ! $NORMAL"
  829. fi
  830. fi
  831. }
  832. # Renomme le Raspberry Pi sur le réseau
  833. # Il sera alors accessible depuis newhostname.local
  834. # Cela va modifier /etc/hosts et /etc/hostname où le daemon avahi
  835. # va chercher le nom du Raspberry Pi
  836. renamePi(){
  837. yanaLogo
  838. if [[ -z $newhostname ]];then
  839. newhostname="maison"
  840. fi
  841. cat <<EOF > /etc/hosts &&
  842. 127.0.0.1 localhost
  843. ::1 localhost ip6-localhost ip6-loopback
  844. fe00::0 ip6-localnet
  845. ff00::0 ip6-mcastprefix
  846. ff02::1 ip6-allnodes
  847. ff02::2 ip6-allrouters
  848. 127.0.1.1 $newhostname
  849. EOF
  850. echo $newhostname > /etc/hostname
  851. hostname $newhostname
  852. service avahi-daemon restart > /dev/null 2>&1
  853. whiptail --title "Raspberry Pi s'appelle $newhostname.local" --msgbox "Tapez http://$newhostname.local/ pour accéder à Yana" 0 0
  854. echo -ne "$OK -----> Renommage du Raspberry Pi $NORMAL"
  855. echo -e "$WARN : $newhostname.local $NORMAL"
  856. }
  857. ###############
  858. # La partie principale
  859. ###############
  860. # Si vous voulez supprimer des étapes ou en rajouter
  861. # C'est ici que tout se passe
  862. #Vérification des droits administrateur
  863. cd /
  864. verifyRoot
  865. if [[ $isRoot -eq 1 ]];then
  866. if [[ $# -eq 1 ]];then
  867. scriptToExecute=$1
  868. if [[ scriptToExecute -eq "noresize" ]];then
  869. resizeSDCard=0
  870. fi
  871. else
  872. # Affichage du menu principal
  873. mainMenu
  874. # Si Installer est appuyé
  875. if [[ $doInstall -eq 1 ]];then
  876. if [ $resizeSD -eq 1 ];then
  877. resizeSDCardMenu # Redimensionnement de la carte SD
  878. fi
  879. # Renommer le Raspberry Pi
  880. renameMenu
  881. # Vérifier si git.idleman.fr est accessible
  882. checkInternet
  883. if [[ $internet -eq 1 ]];then
  884. setLocaleToFrench # Mettre le terminal en français
  885. updateRaspberryPi # Mettre à jour le Raspberry Pi (apt-get update/upgrade)
  886. configureTimeZone # Configurer le fuseau horaire automatiquement (tzupdate)
  887. # Clone le repo ldleman/yana
  888. cloneYana
  889. # Installe le serveur web
  890. checkWebServer
  891. if [[ $doInstallWebServer -eq 1 ]];then
  892. installWebServer
  893. setupWebServer
  894. fi
  895. # Vérifie les permissions des fichiers et des binaires
  896. checkPermissions
  897. # Install WiringPi (gpio)
  898. installWiringPi
  899. # Fait un lien de /var/www/yana-server/install.sh ver /usr/local/bin/configuration
  900. linkInstaller
  901. # Affiche un message avec l'étape sur le web
  902. endInstall
  903. securityCheck
  904. checkBinariesMenu
  905. installYanaSocket
  906. addCron
  907. echo -e "$OK Installation TERMINE!!! Il est conseillé de $ERR redémarrer $OK votre raspberry pi $NORMAL"
  908. echo -e "$INFO sudo reboot $NORMAL"
  909. fi
  910. fi
  911. fi
  912. fi