AndyEsnard

wolscript

Dec 19th, 2017
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 28.70 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. ################################################################################
  4. #                                wolscript.sh                                  #
  5. ################################################################################
  6. #                                                                              #
  7. # Ce script permet de reveiller une salle en se baseant sur le contenu du      #
  8. # fichier wakeup.csv (par defaut) et sur la technologie Wake on LAN.           #
  9. #                                                                              #
  10. # Installez ce script dans le dossier /wol/ (ou alors changez l'emplacement    #
  11. # dans les paramètres plus bas dans ce fichier.                                #
  12. #                                                                              #
  13. # N'oubliez pas de rendre le script exécutable via la commande :               #
  14. # chmod +x ./wolscript.sh                                                      #
  15. #                                                                              #
  16. # Puis pour le lancer :                                                        #
  17. #  - /wol/wolscript.sh                                                         #
  18. #                                                                              #
  19. # Pour installer wakeonlan :                                                   #
  20. #  - apt-get install wakeonlan (pour Debian/Ubuntu)                            #
  21. #  ou via wget (plus à jour et compatible avec les autres distribution) :      #
  22. #  https://raw.githubusercontent.com/jpoliv/wakeonlan/master/wakeonlan         #
  23. # (Vous devez mettre l'exécutable dans le même répertoire que le script)       #
  24. #                                                                              #
  25. # Pour les dépendances du script PHP :                                         #
  26. #  - apt-get install php5 php-mysql mysql-client                               #
  27. #                                                                              #
  28. # Le script peut reconnaitre automatiquement les adresses MAC separée soit     #
  29. # par un double-points, soit par un tiret (celui sera transformé en            #
  30. # double-points pour le traitement via wakeonlan).                             #
  31. #                                                                              #
  32. # Les fichiers des salles (.wol) sont stockés dans le dossier ./script/, ils   #
  33. # contiennent toutes les adresses MAC des machines de la salle.                #
  34. # Ce script peut générer ces fichiers .wol, il peut afficher les horaires      #
  35. # des salles, convertir une adresse IP en adresse MAC et peut allumer toutes   #
  36. # les salles si besoin est.                                                    #
  37. #                                                                              #
  38. # Il faut aussi aller ajouter ce script dans /etc/crontab pour l'exécuter      #
  39. # automatiquement :                                                            #
  40. #  Ex : */10 *  * * *   root cd /wol && ./wolscript.sh --auto -f wakeup.csv    #
  41. #                                                                              #
  42. # Ou alors via la commande : crontab -e                                        #
  43. #  Ex : */10 *  * * *   cd /wol && ./wolscript.sh --auto -f wakeup.csv         #
  44. #                                                                              #
  45. # Qui permet d'executer le script automatiquement (parametre: --auto)          #
  46. # toutes les dix minutes avec les heures indiquées dans le fichier             #
  47. # wakeup.csv (paramètres: -f wakeup.csv)                                       #
  48. #                                                                              #
  49. # Si vous voulez créer la commande "wolscript", alors :                        #
  50. #  - ln -s /wol/wolscript.sh /usr/bin/wolscript                                #
  51. #                                                                              #
  52. # La commande exit permet de quitter la plupart des menus, veuillez ne donc    #
  53. # pas nommer vos fichiers avec ce nom !                                        #
  54. #                                                                              #
  55. # Pour voir les logs en temps réel : tail -f /var/log/wolscript.log            #
  56. #                                                                              #
  57. # Pour fonctionner, le script à besoin d'un fichier contenant le nom des       #
  58. # salles à réveiller (le même nom que dans les fichiers scripts des salles     #
  59. # dans le dossier script), et l'heure de la journée en minutes à laquelle les  #
  60. # ordinateurs de la salle doivent être réveillés (séparé par un ;).            #
  61. #                                                                              #
  62. # Exemple de ligne dans le fichier CSV :                                       #
  63. #  A105;600       (Les odinateurs de la salle A105 seront allumés à 10h)       #
  64. #                                                                              #
  65. # Pour cette exemple, il faut que le fichier A105.wol contenant uniquement les #
  66. # adresses MAC de la salle soit dans le dossier ./script/                      #
  67. #                                                                              #
  68. #                                                                              #
  69. #                                                                              #
  70. #               Par Andy Esnard - Décembre 2017 (rev 1.1.1)                    #
  71. #                                                                              #
  72. ################################################################################
  73.  
  74.  
  75.  
  76.                      ####################################
  77.                      #  Quelques variables modifiables  #
  78. ################################################################################
  79. #                                                                              #
  80. # Emplacement du fichier de log                                                #
  81. fichierlog="/var/log/wolscript.log"                                            #
  82. #                                                                              #
  83. # Combien de minutes doit-on allumer les machines à l'avance ?                 #
  84. delai=15                                                                       #
  85. #                                                                              #
  86. # Emplacement du script !                                                      #
  87. emplacement="/wol/"                                                            #
  88. #                                                                              #
  89. # Fichier CSV par défaut :                                                     #
  90. csvdefaut="wakeup.csv"                                                         #
  91. #                                                                              #
  92. # Commande qui régénère les horaires :                                         #
  93. commande_externe="php ./php/wakeup.php > /dev/null"                            #
  94. #                                                                              #
  95. # Lancement de la génération des horaires automatisée                          #
  96. externe_automatique="true"                                                     #
  97. #                                                                              #
  98. # true = Réveil de toutes les salles qu'importe l'heure (avec --auto !)        #
  99. forcerreveiltotal="false"                                                      #
  100. #                                                                              #
  101. # Répéter la commande wakeonlan (au minimum 1 !)                               #
  102. repetition=3                                                                   #
  103. #                                                                              #
  104. # Decommentez pour debugger                                                    #
  105. #set -ax                                                                       #
  106. #                                                                              #
  107. ################################################################################
  108.  
  109.  
  110.  
  111. # Variables globales
  112. tabsalle[0]=
  113. tabhoraire[0]=
  114.  
  115. cd "$emplacement"
  116.  
  117. # Permet de séparer chaque exécution du script dans le fichier de log pour une meilleure lisibilité
  118. echo "===============================================================================" >> $fichierlog
  119. echo "===============================================================================" >> $fichierlog
  120.  
  121. # On test la présence de la commande wakeonlan
  122. wakeonlan > /dev/null 2>&1
  123.  
  124. # Si la commande n'est pas installée via apt-get
  125. if [ $(echo $?) -gt 0 ]
  126. then
  127.     ./wakeonlan > /dev/null 2>&1
  128.    
  129.     # Si la commande n'est pas installée via wget
  130.     if [ $(echo $?) -gt 0 ]
  131.     then
  132.         # La commande n'est pas présente sur le systeme
  133.         logger "[ERROR] Arret du script : wakeonlan non présent !"
  134.         clear
  135.  
  136.         echo -e "La commande wakeonlan n'est pas présente ou n'est pas exécutable !\n"
  137.         echo "Veuillez l'installer soit par les dépots (pour Debian/Ubuntu) :"
  138.         echo " => apt-get install wakeonlan"
  139.         echo "Soit en téléchargeant le script via wget :"
  140.         echo " => wget https://raw.githubusercontent.com/jpoliv/wakeonlan/master/wakeonlan"
  141.  
  142.         echo -e "\nl'exécutable doit être dans le meme répertoire que ce script."
  143.         echo -e "\nchmod +x ./wakeonlan pour rendre le script exécutable."
  144.         echo -en "\nAppuyez sur Entrée pour continuer... "
  145.         read
  146.  
  147.         clear
  148.         exit
  149.     else
  150.         logger "[INFO] Utilisation de l'exécutable ./wakeonlan"
  151.  
  152.         # Installee via wget
  153.         wol=./wakeonlan
  154.     fi
  155. else
  156.     logger "[INFO] Utilisation de la commande wakeonlan"
  157.    
  158.     # Installée via apt-get
  159.     wol=wakeonlan
  160. fi
  161.  
  162. # On assure que le script sera exécuté au moins une fois
  163. if [ "$repetition" -lt 1 ]
  164. then
  165.     repetition=1
  166. fi
  167.  
  168. # Inscrit des informations dans le fichier de log
  169. logger () {
  170.     # La date et l'heure actuelle
  171.     datelog=$(date +"%x %X")
  172.  
  173.     echo '['$datelog'] '$1'' >> $fichierlog
  174. }
  175.  
  176. # Charge le fichier CSV des horaires
  177. charger_csv () {
  178.     if  [ -z "$1" ]
  179.     then
  180.         # Si aucun fichier n'a ete indiqué à la fonction, alore on charge le fichier par defaut
  181.         fichier_csv=$csvdefaut
  182.     else
  183.         fichier_csv="$1"
  184.     fi
  185.  
  186.     logger "[INFO] Lecture du fichier $fichier_csv..."
  187.  
  188.     # Si le fichier CSV existe
  189.     if [ -f "$fichier_csv" ]
  190.     then
  191.         i=0
  192.  
  193.         # On lit le fichier CSV
  194.         while IFS=';' read salle horaire null
  195.         do
  196.             # On calcule l'heure lisible a partir du total de minute
  197.             heure=$(echo $(($horaire/60)))
  198.             minute=$(echo $(($horaire%60)))
  199.  
  200.             # Si les minutes sont en dessous de 10, on rajoute un zéro devant
  201.             if [ $minute -lt 10 ]
  202.             then
  203.                 minute="0"$minute
  204.             fi
  205.  
  206.             # Et on log l'heure dans le fichier de log
  207.             logger "[DEBUG] $salle a "$heure"h$minute ($horaire min)"
  208.  
  209.             # On remplie les variables globales du contenu du fichier CSV
  210.             tabsalle[i]=$salle
  211.             tabhoraire[i]=$horaire
  212.  
  213.             # Et on incrémente
  214.             i=$(($i + 1))
  215.         done < "$fichier_csv"
  216.  
  217.         # Si il est vide
  218.         if [ $i -eq 0 ]
  219.         then
  220.             logger "[WARNING] le fichier $fichier est vide !"
  221.         else
  222.             logger "[INFO] Chargement du fichier $fichier réussi !"
  223.             logger "[INFO] $i salle(s) trouvée(s)."
  224.         fi
  225.     else
  226.         logger "[ERROR] Arret du script : Fichier inexistant !"
  227.  
  228.         # On renvoie une erreur
  229.         exit 1
  230.     fi
  231. }
  232.  
  233. # Menu principal pendant un lancement manuel
  234. menu () {
  235.     while true
  236.     do
  237.         clear
  238.  
  239.         # On affiche le menu
  240.         echo "-------------------------------------------------------------------------------"
  241.         echo " Menu Principal                                                         (1.1.1)"
  242.         echo "-------------------------------------------------------------------------------"
  243.         echo "0............ Sortir"
  244.         echo "1............ Réveiller une salle"
  245.         echo "2............ Voir les horaires de réveil des salles"
  246.         echo "3............ Créer un nouveau script de salle"
  247.         echo "4............ Voir les logs (44 : Les voir en temps réel)"
  248.         echo "5............ Générer les horaires"
  249.         echo "6............ Convertir une adresse IP en adresse MAC"
  250.         echo "-------------------------------------------------------------------------------"
  251.         echo "-------------------------------------------------------------------------------"
  252.  
  253.         # Et son prompt
  254.         echo -ne "\nTapez votre choix : "
  255.  
  256.         # On recupère le choix de l'utilisateur
  257.         read rep
  258.  
  259.         # Et on le compare a ceux proposes
  260.         case "$rep" in
  261.             0 | "exit") logger "[INFO] Fermeture du mode manuel..."; exit 0 ;;
  262.            
  263.             1) reveiller ;;
  264.             2) afficher ;;
  265.             3) nouveau ;;
  266.  
  267.             4)  clear; less $fichierlog ;;
  268.             44) clear; tail -f $fichierlog ;;
  269.  
  270.             5) logger "[INFO] Relance manuelle de la commande des horaires"; $commande_externe ;;
  271.             6) conversion ;;
  272.         esac
  273.  
  274.     done
  275. }
  276.  
  277. # Fonction qui permet de convertir une IP en adresse MAC
  278. conversion () {
  279.     clear
  280.  
  281.     adresse=
  282.     ip=
  283.  
  284.     while true
  285.     do
  286.         echo -n "Adresse IP (ou nom de domaine) à convertir : "
  287.         read adresse
  288.        
  289.         if [ ! -z "$adresse" ]
  290.         then
  291.             if [ ! "$adresse" = "exit" ]
  292.             then
  293.                 echo -en "\nPing en cours"
  294.                 ping -c 2 "$adresse" > /dev/null
  295.                 echo -n "."
  296.                 ping -c 2 "$adresse" > /dev/null
  297.                 echo -n "."
  298.                 ping -c 2 "$adresse" > /dev/null
  299.                 echo -n "."
  300.                 ping -c 2 "$adresse" > /dev/null
  301.  
  302.                 ip=$(nslookup $adresse | grep "Address" | sed '1d' | head -n 1 | sed -e 's/Address: //' | sed '/^$/d')
  303.  
  304.                 if [ ! -z "$ip" ]
  305.                 then
  306.                     echo -en "\n\nAdresse IP : $ip"
  307.                     mac=$(arp -a | grep "$ip)" | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')
  308.                 else
  309.                     mac=$(arp -a | grep "$adresse)" | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')
  310.                 fi
  311.  
  312.                 if [ -z "$mac" ]
  313.                 then
  314.                     echo -e "\n\nImpossible de convertir cette adresse IP ou ce nom de domaine !"
  315.                 else
  316.                     echo -e "\n\nAdresse MAC : $mac"
  317.                 fi
  318.                
  319.                 echo -en "\nAppuyez sur Entrée pour continuer... "
  320.                 read
  321.                
  322.                 break
  323.             else
  324.                 break
  325.             fi
  326.         else
  327.             adresse=
  328.         fi
  329.     done
  330. }
  331.  
  332. # Fonction qui permet de réveiller une salle via un fichier .wol
  333. reveiller () {
  334.     logger "[INFO] Ouverture du réveil manuel des salles"
  335.  
  336.     clear
  337.  
  338.     total=0
  339.     rep=
  340.     confirme=non
  341.  
  342.     echo -e "Voici les salles disponibles :\n"
  343.  
  344.     # On recupère chaque nom de fichier dans une ligne de notre tableau liste, et on évite les espaces
  345.     liste=( $(ls -ap ./script | grep -v "/$" | sed -e 's/ /[SPACE]/g') )
  346.  
  347.     # Nombre de fichier dans la liste
  348.     nb=$(echo ${#liste[*]})
  349.  
  350.     i=0
  351.  
  352.     while [ $i -lt $nb ]
  353.     do
  354.         # On affiche à l'utilisateur le nom des salles, et le nombre de machine
  355.         salle=$(echo "${liste[i]}" | sed -e 's/.wol//' | sed -e 's/\[SPACE\]/ /g')
  356.         echo -e " $(($i+1))) $salle ("$(cat "./script/$salle.wol" | egrep -v '^(#|$)' | wc -l)" postes)"
  357.         total=$(($total + $(cat "./script/$salle.wol" | egrep -v '^(#|$)' | wc -l)))
  358.  
  359.         # On incrémente
  360.         i=$(($i + 1))
  361.     done
  362.  
  363.     echo -e "\n *) /!\ Toutes les salles ($total postes) /!\ \n"
  364.     echo "Tapez exit pour quitter."
  365.  
  366.     while [ -z "$rep" ]
  367.     do
  368.         echo -en "\nQuel numéro de salle voulez vous réveiller ? "
  369.         read rep
  370.  
  371.         if [ ! -z "$rep" ]
  372.         then
  373.             if [ "$rep" = "*" ]
  374.             then
  375.                 while true
  376.                 do
  377.                     echo -n "Voulez-vous vraiment réveiller toutes les machines ? [oui/NON] "
  378.                     read confirme
  379.  
  380.                     if [ -z "$confirme" ]
  381.                     then
  382.                         confirme=non
  383.                     fi
  384.  
  385.                     if [ $confirme = "oui" ]
  386.                     then
  387.                         break
  388.                     elif [ $confirme = "non" ]
  389.                     then
  390.                         rep=
  391.                         break
  392.                     fi
  393.                 done
  394.             elif [ "$rep" = "exit" ]
  395.             then
  396.                 menu
  397.                 exit
  398.             else
  399.                 # On récupère la salle par rapport au numéro
  400.                 rep=$(($rep - 1))
  401.                 salle=$(echo "${liste[$rep]}" | sed -e 's/\[SPACE\]/ /g')
  402.                 rep=$(($rep + 1))
  403.  
  404.                 # Si la valeur rentree par l'utilisateur n'existe pas
  405.                 if [ ! -f ./script/"$salle" ]
  406.                 then
  407.                     echo "La salle numéro $rep n'existe pas ou son script n'a pas été créé !"
  408.                     logger "[WARNING] Impossible de lancer : ./script/$salle (n° $rep) !"
  409.  
  410.                     # L'utilisateur ne quittera pas la boucle
  411.                     rep=
  412.                 fi
  413.             fi
  414.         fi
  415.     done
  416.  
  417.     if [ $confirme = "oui" ]
  418.     then
  419.         logger "[INFO] Réveil de toutes les salles en cours..."
  420.         echo -e "\nRetour de la commande :"
  421.  
  422.         rm -f ./tmp.wol
  423.  
  424.         # On crée le fichier temporaire contenant toutes les adresses MAC
  425.         cat ./script/* > ./tmp.wol
  426.  
  427.         i=0
  428.        
  429.         # On exécute le script
  430.         while [ $i -lt $repetition ]
  431.         do
  432.             # On affiche le résultat qu'une fois à l'écran
  433.             if [ $i -lt 1 ]
  434.             then
  435.                 $wol -f ./tmp.wol
  436.             else
  437.                 $wol -f ./tmp.wol > /dev/null 2>&1
  438.             fi
  439.            
  440.             i=$(($i + 1))
  441.         done
  442.  
  443.         if [ $repetition -gt 1 ]
  444.         then
  445.             echo -e "\n(Les paquets ont été envoyés $repetition fois)"
  446.         fi
  447.        
  448.         # On supprime le fichier temporaire
  449.         rm -f ./tmp.wol
  450.  
  451.         echo -e "\nRéveil de toutes les salles effectués !"
  452.         echo -n "Appuyez sur Entrée pour revenir au menu principal... "
  453.         read
  454.     else
  455.         logger "[INFO] Réveil de la salle "$(echo "$salle" | sed -e 's/.wol//')" en cours..."
  456.         echo -e "\nRetour de la commande :"
  457.  
  458.         i=0
  459.        
  460.         # On execute le script
  461.         while [ $i -lt $repetition ]
  462.         do
  463.             # On affiche le résultat qu'une fois à l'écran
  464.             if [ $i -lt 1 ]
  465.             then
  466.                 $wol -f ./script/"$salle"
  467.             else
  468.                 $wol -f ./script/"$salle" > /dev/null 2>&1
  469.             fi
  470.            
  471.             i=$(($i + 1))
  472.         done
  473.        
  474.         if [ $repetition -gt 1 ]
  475.         then
  476.             echo -e "\n(Les paquets ont été envoyés $repetition fois)"
  477.         fi
  478.  
  479.         echo -e "\nRéveil de la salle "$(echo "$salle" | sed -e 's/.wol//')" effectué !"
  480.         echo -n "Appuyez sur Entrée pour revenir au menu principal... "
  481.         read
  482.     fi
  483. }
  484.  
  485. # Fonction pour afficher l'heure de démarrage automatique des salles
  486. afficher () {
  487.     clear
  488.  
  489.     fichier=
  490.  
  491.     echo -e "\nVous vous situez actuellement dans : $(pwd)\n"
  492.  
  493.     # On demande a l'utilisateur le fichier CSV à lire
  494.     while [ -z "$fichier" ]
  495.     do
  496.         echo -n "Quel fichier .csv voulez-vous ouvrir ? [$csvdefaut] "
  497.         read -e fichier
  498.  
  499.         # Si l'utilisateur veut sortir de ce menu
  500.         if [ "$fichier" = "exit" ]
  501.         then
  502.             menu
  503.             exit
  504.         fi
  505.        
  506.         if [ -z "$fichier" ]
  507.         then
  508.             fichier="$csvdefaut"
  509.         fi
  510.  
  511.         # Si le fichier renseigné par l'utilisateur est vide
  512.         if [ ! -f "$fichier" ]
  513.         then
  514.             echo "Le fichier $fichier n'existe pas !"
  515.             fichier=
  516.         fi
  517.     done
  518.  
  519.     logger "[INFO] Affichage des horaires du fichier $fichier"
  520.  
  521.     clear
  522.  
  523.     # On charge le fichier .csv dans les variables globales via la fonction
  524.     charger_csv "$fichier"
  525.  
  526.     # On calcule le nombre de salle
  527.     nb=$(cat "$fichier" | wc -l);
  528.  
  529.     i=0
  530.  
  531.     if [ $nb -gt 0 ]
  532.     then
  533.         # On affiche ce nombre à l'utilisateur
  534.         echo -e "Il y a $nb salle(s) dans le fichier $fichier :\n"
  535.  
  536.         while [ $i -lt $nb ]
  537.         do
  538.             # On calcule l'heure lisible à partir du total des minutes
  539.             heure=$(echo $((${tabhoraire[$i]}/60)))
  540.             minute=$(echo $((${tabhoraire[$i]}%60)))
  541.  
  542.             # Si les minutes sont en dessous de 10, on rajoute un zéro devant
  543.             if [ $minute -lt 10 ]
  544.             then
  545.                 minute="0"$minute
  546.             fi
  547.  
  548.             # Et on l'affiche à l'utilisateur
  549.             echo -ne "\tSalle: ${tabsalle[$i]} -> "$heure"h$minute\n"
  550.  
  551.             i=$(($i + 1))
  552.         done
  553.  
  554.         # On fait une ligne vide pour une meilleure lisibilité.
  555.         if [ $i -gt 0 ]
  556.         then
  557.             echo ""
  558.         fi
  559.     else
  560.         echo -e "Le fichier d'horaire est vide ! Aucun réveil de prevu.\n"
  561.     fi
  562.  
  563.     # Et on laisse le temps à l'utilisateur de lire ce qu'il y a à l'écran
  564.     echo -n "Appuyez sur Entrée pour continuer... "
  565.     read null
  566. }
  567.  
  568. # Fonction pour créer de nouveau script de salle
  569. nouveau () {
  570.     fichier=
  571.     rep=
  572.  
  573.     clear
  574.  
  575.     while [ -z "$fichier" ]
  576.     do
  577.         echo -n "Quel nom voulez-vous donner au fichier (le nom dans le .csv) ? "
  578.         read fichier
  579.        
  580.         # Si l'utilisateur veut quitter ce menu
  581.         if [ "$fichier" = "exit" ]
  582.         then
  583.             menu
  584.             exit
  585.         fi
  586.  
  587.         # Si le fichier renseigne par l'utilisateur existe déjà
  588.         if [ -f "script/$fichier.wol" ]
  589.         then
  590.             while true
  591.             do
  592.                 echo -n "Le fichier existe déjà, voulez-vous l'écraser ? [oui/NON] "
  593.                 read rep
  594.                
  595.                 # Si l'utilisateur veut quitter ce menu
  596.                 if [ "$rep" = "exit" ]
  597.                 then
  598.                     menu
  599.                     exit
  600.                 fi
  601.  
  602.                 if [ -z "$rep" ]
  603.                 then
  604.                     rep=non
  605.                 fi
  606.  
  607.                 # On récupère la réponse en minuscule
  608.                 rep=$(echo $rep | tr [A-Z] [a-z])
  609.  
  610.                 if [ "$rep" = "non" ]
  611.                 then
  612.                     # L'utilisateur reste dans la boucle (mais quitte celle de cette question), et doit préciser un nouveau nom
  613.                     fichier=
  614.                     break
  615.                 elif [ "$rep" = "oui" ]
  616.                 then
  617.                     break
  618.                 fi
  619.             done
  620.         fi
  621.     done
  622.  
  623.     while true
  624.     do
  625.         rep=
  626.  
  627.         while true
  628.         do
  629.             echo -ne "\nVoulez-vous ouvrir nano pour copier le texte à filtrer contenant les adresses MAC, ou renseigner une URL de fichier ? [NANO/url] ? "
  630.             read rep
  631.            
  632.             # Si l'utilisateur veut quitter ce menu
  633.             if [ "$rep" = "exit" ]
  634.             then
  635.                 menu
  636.                 exit
  637.             fi
  638.  
  639.             # Si la reponse est vide, alors celle par defaut (nano) sera prit en compte
  640.             if [ -z "$rep" ]
  641.             then
  642.                 rep=nano
  643.             fi
  644.  
  645.             # On recupère la réponse en minuscule
  646.             rep=$(echo $rep | tr [A-Z] [a-z])
  647.  
  648.             if [ "$rep" = "nano" ]
  649.             then
  650.                 break
  651.             elif [ "$rep" = "url" ]
  652.             then
  653.                 break
  654.             fi
  655.         done
  656.  
  657.         # On supprime un ancien fichier temporaire si jamais il existe
  658.         rm -f "$fichier.tmp" >> /dev/null
  659.  
  660.         if [ "$rep" = "nano" ]
  661.         then
  662.             echo -e "\nNano va s'ouvrir, copiez le contenu d'un fichier contenant les adresses MAC, elles-y seront automatiquement extraites.\nVous pouvez aussi directement inscrire les adresses MAC.\n\nN'oubliez pas de faire Ctrl+O pour enregistrer !\n"
  663.             echo -n "Appuyez sur Entrée pour continuer... "
  664.             read
  665.  
  666.             # On ouvre nano sur le fichier temporaire qui va nous servir pour le filtrage
  667.             nano "$fichier.tmp"
  668.         else
  669.             echo -e "Vous vous situez actuellement dans : $(pwd)\n"
  670.  
  671.             while true
  672.             do
  673.                 echo -n "Quel est l'URL du fichier ? "
  674.  
  675.                 # L'option -e permet d'accepter l'auto-completion (tabulation)
  676.                 read -e url
  677.                
  678.                 # Si l'utilisateur veut quitter ce menu
  679.                 if [ "$url" = "exit" ]
  680.                 then
  681.                     menu
  682.                     exit
  683.                 fi
  684.  
  685.                 # Si le fichier precisé n'existe pas
  686.                 if [ ! -f "$url" ]
  687.                 then
  688.                     echo "Le fichier $url n'existe pas !"
  689.                 else
  690.                     # On copie le fichier precisé en tant que fichier temporaire
  691.                     cp "$url" "./$fichier.tmp"
  692.                     break
  693.                 fi
  694.             done
  695.         fi
  696.  
  697.         # Variable servant savoir si le fichier est vide ou pas
  698.         vide=true
  699.  
  700.         # On transforme tout les tirets point des double-points (pour récuperer les adresses MAC avec tirets)
  701.         sed -i 's/\-/:/g' "$fichier.tmp"
  702.  
  703.         # On compte le nombre de ligne du fichier
  704.         ligne=$(cat "$fichier".tmp | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | wc -l)
  705.  
  706.         # Si il y au moins une ligne
  707.         if [ $ligne -gt 0 ]
  708.         then
  709.             clear
  710.  
  711.             echo -e "Voici le contenu filtré du fichier : \n"
  712.  
  713.             # On affiche les adresses MAC qui sont dans le fichier
  714.             cat "$fichier".tmp | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
  715.  
  716.             rep=
  717.  
  718.             while true
  719.             do
  720.                 echo -en "\nCela vous semble correct ? [OUI/non] "
  721.                 read rep
  722.                
  723.                 # Si l'utilisateur veut quitter ce menu
  724.                 if [ "$rep" = "exit" ]
  725.                 then
  726.                     menu
  727.                     exit
  728.                 fi
  729.  
  730.                 if [ -z "$rep" ]
  731.                 then
  732.                     rep=oui
  733.                 fi
  734.  
  735.                 # On récupère la réponse en minuscule
  736.                 rep=$(echo $rep | tr [A-Z] [a-z])
  737.  
  738.                 if [ "$rep" = "non" ]
  739.                 then
  740.                     # L'utilisateur va devoir repréciser une URL ou reremplir nano
  741.                     break
  742.                 elif [ "$rep" = "oui" ]
  743.                 then
  744.                     # Le fichier va etre écrit.
  745.                     vide=false
  746.                     break
  747.                 fi
  748.  
  749.                 echo -n "Valeur incorrecte !"
  750.             done
  751.         else
  752.             rm -f "$fichier.tmp"
  753.  
  754.             echo -e "\nErreur, aucune adresse MAC trouvée dans ce fichier !"
  755.             echo "Appuyez sur la touche Entrée pour continuer... "
  756.             read
  757.         fi
  758.  
  759.         # Si le fichier n'est pas vide, on quitte cette boucle
  760.         if [ $vide = false ]
  761.         then
  762.             break
  763.         fi
  764.     done
  765.  
  766.     logger "[INFO] Création du fichier de script : $fichier.wol"
  767.  
  768.     # On écrit le fichier dans le dossier script
  769.     cat "$fichier".tmp | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' > script/"$fichier.wol"
  770.  
  771.     # On supprime le fichier temporaire
  772.     rm -f "$fichier.tmp" >> /dev/null
  773.  
  774.     echo -en "\nEcriture du script terminée !\nAppuyer sur Entrée pour retourner au menu... "
  775.     read
  776. }
  777.  
  778. logger "[INFO] Démarrage du script..."
  779. logger "[INFO] Exécution dans : $(pwd)"
  780.  
  781. # Si le dossier des scripts n'existe pas (Premiere utilisation du script)
  782. if [ ! -x ./script ]
  783. then
  784.     logger "[INFO] Création du dossier ./script"
  785.     mkdir ./script
  786. fi
  787.  
  788. if [ ! -z $1 ]
  789. then
  790.     # Si c'est un lancement automatique du script
  791.     if [ $1 = '--auto' ]
  792.     then
  793.         logger "[INFO] Exécution automatique du script"
  794.        
  795.         if [ "$externe_automatique" = "true" ]
  796.         then
  797.             logger "[INFO] Régéneration des horaires automatique"
  798.  
  799.             $commande_externe 2>&1
  800.            
  801.             if [ $(echo $?) -gt 0 ]
  802.             then
  803.                 logger "[WARNING] Une erreur s'est produite durant la régéneration"
  804.             fi
  805.         fi
  806.  
  807.         # On fait appel a la fonction pour charger le fichier CSV
  808.         if [ ! -z ${2:-f} ] && [ ${2:-f} = "-f" ]
  809.         then
  810.             if [ ! -z "$3" ]
  811.             then
  812.                 if [ -f "$3" ]
  813.                 then
  814.                     # On charge le fichier CSV donné en paramètre du script via la fonction
  815.                     charger_csv "$3"
  816.                 else
  817.                     logger "[WARNING] Fichier $3 inexistant ! Chargement du fichier par défaut..."
  818.  
  819.                     # On charge le fichier par défaut du script
  820.                     charger_csv ""
  821.                 fi
  822.             else
  823.                 logger "[WARNING] Paramètre incorrect, chargement du fichier par défaut..."
  824.  
  825.                 charger_csv ""
  826.             fi
  827.         else
  828.             charger_csv ""
  829.         fi
  830.  
  831.         # On vérifie que les deux tableaux obtenus sont de la même taille, sinon on arrête tout
  832.         if [ ${#tabsalle[*]} -eq ${#tabhoraire[*]} ]
  833.         then
  834.             nb=$(echo ${#tabsalle[*]});
  835.         else
  836.             logger "[ERROR] Arrêt du script : Incohérence dans le tableau"
  837.             exit
  838.         fi
  839.  
  840.         i=0
  841.         j=0
  842.  
  843.         # On calcul le temps actuel en minute
  844.         tempsminute=$(($(($(date +"%-k") * 60)) + $(date +%-M)))
  845.  
  846.         # Si on a active l'option pour réveiller quoi qu'il se passe toute les salles
  847.         if [ $forcerreveiltotal = "true" ]
  848.         then
  849.             tempsminute=0
  850.             delai=3600
  851.         fi
  852.  
  853.         resultat[0]=""
  854.  
  855.         logger "[INFO] Minutes actuelles : $tempsminute (marge de "$delai"min)"
  856.  
  857.         # On regarde si il y a des salles a réveiller
  858.         while [ $i -lt $nb ]
  859.         do
  860.             if [ $(($tempsminute + $delai)) -ge ${tabhoraire[$i]} ] && [ $tempsminute -le ${tabhoraire[$i]} ]
  861.             then
  862.                 # On récupère les salles à réveiller
  863.                 resultat[j]=${tabsalle[$i]}
  864.                 j=$(($j + 1))
  865.             fi
  866.  
  867.             i=$(($i + 1))
  868.         done
  869.  
  870.         logger "[INFO] $j salle(s) à réveiller"
  871.  
  872.         # Si il y a des salles à réveiller
  873.         if [ $j -gt 0 ]
  874.         then
  875.             # On les logs
  876.             logger "[INFO] Salle(s) à réveiller : ${resultat[*]}"
  877.  
  878.             i=0
  879.             err=0
  880.  
  881.             # Et on les réveille
  882.             while [ $i -lt $j ]
  883.             do
  884.                 logger "[INFO] Exécution de $wol -f script/${resultat[i]}.wol ..."
  885.  
  886.                 # Si le fichier existe
  887.                 if [ -f script/"${resultat[i]}.wol" ]
  888.                 then
  889.                     i=0
  890.                    
  891.                     while [ $i -lt $repetition ]
  892.                     do
  893.                         # On affiche le résultat qu'une fois dans les logs
  894.                         if [ $i -lt 1 ]
  895.                         then
  896.                             $wol -f "script/${resultat[i]}.wol" 2> /dev/null | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | sed -e "s/^/[$(echo $(date +"%x %X")| sed "s/\//\\\\\//g")] [DEBUG] Reveil de /g" >> $fichierlog
  897.                         else
  898.                             $wol -f "script/${resultat[i]}.wol" > /dev/null 2>&1
  899.                         fi
  900.                        
  901.                         i=$(($i + 1))
  902.                     done
  903.                    
  904.                     if [ $repetition -gt 1 ]
  905.                     then
  906.                         logger "[INFO] Les paquets ont ete envoyés $repetition fois"
  907.                     fi
  908.                
  909.                     if [ ! $? -eq 0 ]
  910.                     then
  911.                         logger "[WARNING] Une erreur s'est produite durant l'exécution !"
  912.                         err=$(($err + 1))
  913.                     fi
  914.                 else
  915.                     logger "[WARNING] le fichier ${resultat[i]}.wol n'existe pas !"
  916.                     err=$(($err + 1))
  917.                 fi
  918.  
  919.                 i=$(($i + 1))
  920.             done
  921.  
  922.             if [ -z $err ]
  923.             then
  924.                 logger "[INFO] Exécution(s) terminée(s) avec succès !"
  925.             else
  926.                 logger "[WARNING] Exécution(s) terminée(s) avec erreur(s) !"
  927.             fi
  928.  
  929.             logger "[WARNING] $(($j - $err))/$j commandes effectuées avec succès !"
  930.  
  931.             # Fin du script automatique
  932.             logger "[INFO] Arrêt du script : Script terminé"
  933.         else
  934.             logger "[INFO] Arrêt du script : Rien à faire"
  935.         fi
  936.     else
  937.         # Si il y a un probleme d'argument
  938.         logger "[ERROR] Arrêt du script : Mauvais arguments"
  939.  
  940.         echo -e "Arguments invalides !\n"
  941.         echo "Vous pouvez utilisez les arguments tel que :"
  942.         echo " --auto :              Pour un lancement de script automatisé"
  943.         echo " --auto -f <fichier> : Pour specifier un fichier .csv"
  944.         echo ""
  945.         echo "Vous pouvez aller modifier l'entête du script pour modifier"
  946.         echo "quelques paramètres suplémentaires (dans le cadre dédié)."
  947.     fi
  948. else
  949.     # Exécution en manuel, avec une UI
  950.     logger "[INFO] Exécution manuelle du script"
  951.  
  952.     # On appelle la fonction menu
  953.     menu
  954.  
  955.     logger "[INFO] Arrêt du script : Script terminé"
  956.     exit
  957. fi
  958.  
  959. ## Fin du script
Advertisement
Add Comment
Please, Sign In to add comment