Commit 718bc4d5 authored by fenwe's avatar fenwe
Browse files

2021.06.28:v2.0.0-2021.06.28

 * isDebugShowVars -> isShowVars
 * selfUpdateLocal
 * showVarsLocal()
 * showVarsPost()
 * loadConfsLocal()
 * fusion avec legite-update
 * pushConfToPi(src [dest])
 * TEMP=$(getopt \
    --options v::dVhnS \
    --long help,version,verbose::,debug,update,showVars,conf::,showLibs\
,none \
    -- "$@")
 * pushBashToUpdates
parent b43ae738
../Test.sh
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
#!/bin/bash
set -u
#set -eE # same as: `set -o errexit -o errtrace`
#style
#https://abs.traduc.org/abs-5.0-fr/ch32.html#unofficialst
#http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html#The-Set-Builtin
set -u
#set -eE # same as: `set -o errexit -o errtrace`
declare -r SCRIPT_PATH=`realpath $0`; # chemin absolu complet du script rep + nom
declare -r SCRIPT_REP=`dirname $SCRIPT_PATH`;# repertoire absolu du script (pas de slash de fin)
declare -r VERSION="v1.0.0-2021.06.06";
declare -r VERSION="v2.0.0-2021.06.28";
if [ ! -f "$SCRIPT_REP/legite-lib.sh" ]
then
......@@ -22,36 +21,15 @@ fi
# variables #
# init #
#############
# --- variables des includes --- #
declare -r UPDATE_HTTP="$UPDATE_HTTP_ROOT/legite-install";
#declare -i isConf=0;
#declare -r CONF_ETC_ROOT="/etc/legite";
#declare -r CONF_ETC_FILENAME="$SCRIPT_NAME.etc.$SCRIPT_EXT";
#declare -r CONF_ETC_PATH="$CONF_ETC_ROOT/$CONF_ETC_FILENAME";
#declare -r CONF_USER_ROOT="/root/.legite";
#declare -r CONF_USER_ROOT="$HOME/.legite";
#declare -r CONF_USER_FILENAME="$SCRIPT_NAME.sh";
#declare -r CONF_USER_PATH="$CONF_USER_ROOT/$CONF_USER_FILENAME";
#declare conf_run=""; # fichier de configuration donné par --conf
# le fichier origine est copier lors de chaque installation
declare -r CONF_ORI_FILENAME="$SCRIPT_NAME.ori.sh";
declare -r CONF_ORI_PATH="$CONF_USR_ROOT/$CONF_ORI_FILENAME";
#isConf=0; # chargement d'un fichier de configuration(CONF_USER_FILENAME) doit il etre lancé?
# --- variables des parametres supplementaires --- #
#declare PSP_sup=""; # parametre supplementaire($@) => $1 $2 $n "$@""
# --- variables du projet --- #
#declare -A librairiesTbl; # tableau contenant les fonctions (remplis par les fichiers de configuration)
#declare -i isShowLibs=0; # affiche une liste des fonctions definies
#librairieRep="$CONF_USER_ROOT/collections";
#declare collectionPath=""; # chemin d'acce a la collection en cours (inutile est un index de librairiesTbl)
#############
# VARIABLES #
# DU PROJET #
#############
# --- variables des includes --- #
declare -r UPDATE_HTTP="$UPDATE_HTTP_ROOT/legite-install";
declare -i isLegiteLibsDw=0; # la lib legite-lib est elle deja telechargé?
# #################### #
......@@ -60,17 +38,11 @@ declare -r CONF_ORI_PATH="$CONF_USR_ROOT/$CONF_ORI_FILENAME";
usage (){
if [ $argNb -eq 0 ];
then
echo "$SCRIPT_FILENAME [--showLibs] [--update] [--conf=fichier.sh] [programme]";
echo " [-d] [--showVars] # fonctions de debug";
echo "--update: update le programme legite-install.sh lui meme"
echo "--conf: execute un fichier de configuration si existe"
echo "--showLibs: Affiche la liste des fonctions"
echo "Fichiers de configuration"
echo "$CONF_ETC_PATH: est copier a chaque installation et mise a jours (ne pas editer)"
echo "$CONF_ORI_PATH: est un exemple d'utilisation"
echo "$CONF_USR_PATH"
echo "$CONF_PSP_PATH: se lance avec --conf"
echo "programme: si fournis execute la fonction (contenu dans un fichier de conf) . 1 seule pour l'instant"
echo "$SCRIPT_FILENAME [-d] [--showVars] [--showLibs] [--update] [--conf=fichier.sh] [programme]";
echo "--update: update le programme legite-install.sh lui meme (via $UPDATE_HTTP)."
echo "--conf: execute un fichier de configuration si existe."
echo "Fichier de configurations: (visible avec --showVars)."
echo "programme: execute une fonction (visible avec --showLibs)."
exit $E_ARG_NONE;
fi
}
......@@ -81,27 +53,64 @@ showVarsLocal(){
}
showVarsPost(){
showDebug "$FUNCNAME($*)"
if [ $isShowVars -eq 1 ]
then
showVarsLocal
fi
}
################
# MISE A JOURS #
################
# - telecharge et installe la derniere version en remplacant le script qui a lancer l'update - #
selfUpdate (){
if [ $isUpdate -eq 1 -a $IS_ROOT -eq 1 ];
then
if [ ! -d "$CONF_ETC_ROOT" ];then mkdir "$CONF_ETC_ROOT";fi
if [ ! -d "$CONF_USER_ROOT" ];then mkdir "$CONF_USER_ROOT";fi
echo "mise a jours du programme";
updateProg "$UPDATE_HTTP/$SCRIPT_FILENAME" "/usr/local/bin/$SCRIPT_FILENAME"
updateProg "$UPDATE_HTTP/$CONF_ETC_FILENAME" "$CONF_ETC_PATH"
updateProg "$UPDATE_HTTP/$CONF_ORI_FILENAME" "$CONF_ORI_PATH"
#updateProg "$UPDATE_HTTP/CONF_USER_FILENAME" "$CONF_USER_PATH"
fi
#selfUpdateLocal(){
# copier le modele de ./legite-lib.sh
#}
#############
# LOAD_CONF #
#############
loadConfsLocal(){
showDebug "$FUNCNAME($*)"
execFile "$CONF_REP/legite-push.cfg.sh"
}
# ################### #
# FONCTIONS DU PROJET #
# ################### #
#pushProg ("src" "dest")
pushBashToUpdates(){
local src="${1:-""}"; local dest="${2:-"$src"}";
if [ "$src" == "" ]; then return;fi
evalCmd "scp -p /www/bash/$src pi@192.168.0.202:/www/www-sites/updates/$dest > /dev/null"
if [ $? -ne 0 ]
then
echo "${WARN}Erreur avec le fichier: $dest$NORMAL"
fi
}
#pushConfToPi ("src1" ["src2"])
pushConfToPi(){
local src="${1:-""}"; local dest="${2:-"$src"}";
if [ "$src" == "" ]; then return;fi
local srcPath="/home/pascal/.legite/$src"
if [ ! -f "$srcPath" ]
then
echo $WARN"$srcPath inextant."$NORMAL
return
fi
evalCmd "scp -p '$srcPath' pi@192.168.0.202:/home/pi/.legite/$dest > /dev/null"
if [ $? -ne 0 ]
then
echo $WARN"Erreur avec le fichier: $dest"$NORMAL
fi
}
##########################
......@@ -114,7 +123,8 @@ selfUpdate (){
# ########## #
TEMP=$(getopt \
--options v::dVhnS \
--long help,version,verbose::,debug,showVars,update,conf::,showLibs \
--long help,version,verbose::,debug,update,showVars,conf::,showLibs\
,none \
-- "$@")
eval set -- "$TEMP"
......@@ -139,8 +149,8 @@ do
;;
# - Debug - #
-d|--debug) isDebug=1;isDebugShowVars=1;shift; ;;
--showVars) isDebugShowVars=1; shift ;;
-d|--debug) isDebug=1;isShowVars=1;shift; ;;
--showVars) isShowVars=1; shift ;;
# - Mise a jours - #
--update) isUpdate=1; shift ;;
......@@ -158,7 +168,7 @@ do
shift;
break;
fi
#echo "--)"
#echo "--)$argument,$parametre"
librairie="$parametre";
librairiesCall[$librairiesCallIndex]="$librairie"
((librairiesCallIndex++))
......@@ -171,7 +181,7 @@ do
shift 1;
break;
fi
#librairie=${2:-""}
#echo "*)$argument,$parametre"
librairie="$argument";
librairiesCall[$librairiesCallIndex]="$librairie"
((librairiesCallIndex++))
......@@ -181,6 +191,7 @@ do
esac
done
########
# main #
########
......@@ -190,22 +201,14 @@ echo "${INFO}$SCRIPT_PATH $VERSION$NORMAL";
usage;
selfUpdate;
showVars;
if [ $isUpdate -eq 1 ];then exit 0;fi
loadConfs
showLibs;
showDebug $LINENO ${librairiesCall[*]}
# - Execution des librairies appellées - #
displayVar "{librairiesCall[*]}" "${librairiesCall[*]}"
execLibrairiesCall
echo "Résumé: "
#echo "Résumé: "
notifsShow;
erreursShow;
if [ $isTrapCAsk -eq 1 ]
then
exit E_CTRL_C
fi
showVarsPost
if [ $isTrapCAsk -eq 1 ];then exit E_CTRL_C;fi
exit 0
\ No newline at end of file
#!/bin/bash
#declare -r SCRIPT_PATH=$(realpath $0); # chemin absolu complet du script rep + nom
#declare -r SCRIPT_REP=$(dirname $SCRIPT_PATH); # repertoire absolu du script (pas de slash de fin)
declare -r SCRIPT_FILENAME=${0##*/}; # /path/nom.pasext.ext -> nom.pasext.ext
declare -r SCRIPT_NAME=${SCRIPT_FILENAME%.*} # nom.pasext.ext -> nom.pasext # uniquement le nom
declare -r SCRIPT_EXT=${SCRIPT_FILENAME##*.} # nom.pasext.ext -> ext # uniquement l'extention
################
# COLORISATION #
################
declare -r RESET_COLOR=$(tput sgr0)
declare -r BOLD=`tput smso`
declare -r NOBOLD=`tput rmso`
declare -r BLACK=`tput setaf 0`
declare -r RED=`tput setaf 1`
declare -r GREEN=`tput setaf 2`
declare -r YELLOW=`tput setaf 3`
declare -r CYAN=`tput setaf 4`
declare -r MAGENTA=`tput setaf 5`
declare -r BLUE=`tput setaf 6`
declare -r WHITE=`tput setaf 7`
declare -r NORMAL=$WHITE
declare -r INFO=$BLUE
declare -r CMD=$YELLOW
declare -r WARN=$RED
declare -r TITRE1=$GREEN
declare -r TITRE2=$MAGENTA
declare -r DEBUG_COLOR=$MAGENTA
####################
# CODES DE SORTIES #
####################
#http://www.gnu.org/software/bash/manual/html_node/Exit-Status.html#Exit-Status
#https://abs.traduc.org/abs-5.0-fr/apd.html#exitcodesref
#https://tldp.org/LDP/abs/html/exitcodes.html
declare -r -i E_MISC=1
declare -r -i E_INTERNE=2
# 64..113: USER EXIT
declare -r -i E_ARG_NONE=65
declare -r -i E_ARG_BAD=66
declare -r -i E_REQUIRE=67;
declare -r -i E_UPDATE=68; # sorite apres une update
#>=129.255 FATAL_ERROR
declare -r -i E_CMD_CANT_EXEC=126
declare -r -i E_CMD_NOT_FOUND=127
declare -r -i E_EXIT_BAD=128 # valeur d'exit invalide
declare -r -i E_CTRL_C=130
declare -r -i E_EXIT_EOR=255 # error Of Range ?
#############
# VARIABLES #
# GLOBALES #
#############
# --- variables des includes --- #
declare -r UPDATE_HTTP_ROOT="http://updates.legite.org";
declare CONF_REP="$HOME/.legite";
declare CONF_ORI_PATH="$CONF_REP/$SCRIPT_NAME.ori.sh";
declare CONF_SRC_PATH="$SCRIPT_REP/$SCRIPT_NAME.ori.sh";
declare CONF_FILENAME="$SCRIPT_NAME.cfg.sh";
declare CONF_USR_PATH="$CONF_REP/$CONF_FILENAME";
declare CONF_PSP_PATH=""; # fournis en parametre
# --- Definir si root ou user --- #
[ "$(id -u)" == "0" ] && declare -r -i IS_ROOT=1 || declare -r -i IS_ROOT=0;
# --- tag d'interuption --- #
declare -i isTrapCAsk=0; # demande d'interuption par control C
# --- variables generiques --- #
declare -r -i argNb=$#;
declare argument; # argument actuel ($1)
declare parametre; # parametre actuel ($2)
declare -i isUpdate=0; # demande de update
declare -i verbosity=0; # niveau de verbosité
declare -i isDebug=0;
declare -i isShowVars=0; # montrer les variables
declare -i isShowLibs=0; #
#################
# NOTIFICATIONS #
#################
declare -a notifsPile; # tableau contenant la pile de notifications
declare -i notifsIndex=0; # index utilisé pour le remplissage de la pile de notifs
#notifsAdd($txt) # ajoute une notif dans la pile de notifs
notifsAdd(){
local notif="$1"
if [ -z "$notif" ]
then
return 1;
fi
notifsPile[$notifsIndex]="$notif"
((notifsIndex++))
return 0;
}
#notifsShow($separateur="\n") # affiche la pile des notifs
notifsShow(){
if [ -z "${notifsPile[*]}" ];then return 1;fi
local separateur=${1:-"\n"}
echo -e "\n"$TITRE1"Notifs($notifsIndex)"$NORMAL
for notif in "${notifsPile[@]}"
do
echo -ne "$notif$separateur";
done
return 0;
}
###########
# ERREURS #
###########
declare -a erreursPile; # tableau contenant la pile de notifications
declare -i erreursPileIndex=0; # index utilisé pour le remplissage de la pile des erreur
#erreursAdd($txt) # ajoute une notif dans la pile de notifs
erreursAdd(){
local erreur="$1"
if [ -z "$erreur" ];then return 1; fi
erreursPile[$erreursPileIndex]="$erreur"
((erreursPileIndex++))
return 0;
}
#erreursShow($separateur="\n") # affiche la pile des erreurs
erreursShow(){
if [ -z "${erreursPile[*]}" ];then return 1;fi
local separateur=${1:-"\n"}
echo -e "\n"$WARN"Erreurs($erreursPileIndex)"$NORMAL
for erreur in "${erreursPile[@]}"
do
echo -ne "$erreur$separateur";
done
return 0;
}
############
# TRAP_ERR #
############
declare -a trapErrPile; # tableau contenant la pile de notifications
declare -i trapErrPileIndex=0; # index utilisé pour le remplissage de la pile des erreur
#trapErrAdd($txt) # ajoute une notif dans la pile
trapErrAdd(){
local valeur="$1"
if [ -z "$valeur" ];then return 1; fi
trapErrPile[$trapErrPileIndex]="$valeur"
((trapErrPileIndex++))
return 0;
}
#trapErrShow($separateur="\n") # affiche la pile
trapErrShow(){
if [ -z "${trapErrPile[*]}" ]; then return 1; fi
echo -e "\n"$TITRE1"Erreurs($erreursPileIndex)"$NORMAL
local separateur=${1:-"\n"}
for valeur in "${erreursPile[@]}"
do
echo -ne "$valeur$separateur";
done
return 0;
}
#########
# DEBUG #
#########
#evalCmd($cmd $ligneNu $txt)
evalCmd(){
if [ $# -gt 0 ]
then
local ligneNu=${2:-""}
local txt=${3:-""}
echo "${DEBUG_COLOR}$ligneNu$CMD$1$NORMAL$txt";
eval "$1";
return $?
fi
}
#showDebug(texte pre post)
showDebug(){
if [ $isDebug -eq 1 -a $# -gt 0 ]
then
texte="$1";
local pre=${2:-""}
local post=${3:-""}
echo "${DEBUG_COLOR}$pre$texte$post$NORMAL"
fi
}
displayVar (){
#showDebug "$FUNCNAME($*)"
local out="";
while [ $# -gt 1 ]
do
out="$out $INFO $1:$NORMAL'$2'"
shift 2;
done
echo "$out"
}
# ##### #
# TRAPS #
# ##### #
#http://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins
#trap -l #trap --help
#https://linuxhint.com/bash_error_handling/
#https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html
trap 'echo "$LINENO";ctrl_c' INT
function ctrl_c() {
showDebug "$FUNCNAME($@) ** Trapped CTRL-C"
isTrapCAsk=1;
}
#trap 'echo "$WARN"catch: ligne=$LINENO code_retour=$?"$NORMAL"' ERR
################
# MISE A JOURS #
################
# telecharge la derniere version en supprimant la version local
#updateProg ("src" "dest") # chemin absolu
updateProg(){
showDebug "$FUNCNAME($*)"
if [ $isUpdate -eq 1 ]
then
src="$1"; dest="$2"
echo "${INFO}Update de $src$NORMAL"
#if [ $IS_ROOT -eq 1 ]
#then
local dbak=$(date +'%m-%d-%HH%Mm');
evalCmd "cp '$dest' '$dest-$dbak.bak'"; # Fait une sauvegarde
evalCmd "rm '$dest'";
evalCmd "wget -O '$dest' '$src'"
evalCmd "chmod +x '$dest'"
if [ $? -ne 0 ]
then
echo $WARN"Erreur lors de l'installation de $dest."$NORMAL
evalCmd "mv '$dest.bak' '$dest'"
fi
#else
# echo "${WARN}Seul root peut updater (ecrire dans /usr/local/bin/, /root/.legite/)"
#fi
fi
}
# - telecharge et installe la derniere version en remplacant le script qui a lancer l'update - #
selfUpdate (){
if [ $isUpdate -eq 1 ]
then
echo "mise a jours du programme";
cd "$SCRIPT_REP";
updateProg "$UPDATE_HTTP/$SCRIPT_FILENAME" "./$SCRIPT_FILENAME"
cd -
if [ ! -d "$CONF_USR_ROOT" ];then mkdir "$CONF_USR_ROOT";fi
updateProg "$UPDATE_HTTP/CONF_ORI_FILENAME" "$CONF_ORI_PATH"
updateProg "$UPDATE_HTTP/CONF_USR_FILENAME" "$CONF_USR_PATH"
selfUpdateLocal
exit $E_UPDATE;
fi
}
# a surcharger par le projet
selfUpdateLocal(){
if [ $isUpdate -eq 1 ]
then
showDecho "mise a jours specifique au programme";
if [ $IS_ROOT -eq 1 ]
then
showDebug ""
fi
fi
}
# #### #
# EXEC #
# #### #
# creer et execute les fichiers locaux
# LocalFileExec(localName){
execFile(){
showDebug "$FUNCNAME($*)";
local localName="$1";
if [ -z "$localName" ]; then return; fi
if [ -f "$localName" ]
then
if [ ! -x "$localName" ];then evalCmd "chmod +x $localName;"; fi
#echo "nano $localName # Pour modifier le fichier"
evalCmd ". $localName";
else
echo " ${WARN}$localName n'existe pas.$NORMAL"
fi
}
# ######## #
# SHOWVARS #
# ######## #
showVars(){
showDebug "$FUNCNAME($*)"
if [ $isShowVars -eq 1 ]
then
#displayVar " argNb=$argNb"
displayVar "VERSION" "$VERSION"
displayVar "IS_ROOT " "$IS_ROOT" "isUpdate" "$isUpdate"
displayVar "verbosity" "$verbosity" "isDebug" "$isDebug" "isShowVars" "$isShowVars" "isShowLibs" "$isShowLibs"
displayVar "UPDATE_HTTP_ROOT" "$UPDATE_HTTP_ROOT";
displayVar "UPDATE_HTTP " "$UPDATE_HTTP";
displayVar "CONF_REP " "$CONF_REP";
displayVar "CONF_SRC_PATH " "$CONF_SRC_PATH";
displayVar "CONF_FILENAME " "$CONF_FILENAME";
displayVar "CONF_ORI_PATH " "$CONF_ORI_PATH";
displayVar "CONF_USR_PATH " "$CONF_USR_PATH";
displayVar "CONF_PSP_PATH " "$CONF_PSP_PATH";
displayVar "librairiesCall[*]" "${librairiesCall[*]}"
displayVar "librairiesTbl[*]" "${librairiesTbl[*]}"
showVarsLocal
fi
}
# a surcharger dans le projet
showVarsLocal(){
showDebug "$FUNCNAME($@)";
}
# a surcharger dans le projet
showVarsPost(){
showDebug "$FUNCNAME($*)"
if [ $isShowVars -eq 1 ]
then
showVarsLocal
fi
}
##########################
# GESTION DES LIBRAIRIES #
##########################
declare -A librairiesCall; # (array) liste des librairies appellées
declare -i librairiesCallIndex=0 # index pour construire le tableau
declare librairie=""; # librairie en cours
declare -A librairiesTbl;
default(){
showDebug "@FUNCNAME'$*)"
}
librairiesTbl['default']=default;
showLibs(){
if [ $isShowLibs -eq 1 ]
then
local sorted='';
echo "Librairies possibles:";
IFS=$'\n';
sorted=($(sort <<<"${librairiesTbl[*]}"));
unset IFS
local out="";
for value in "${sorted[@]}";
do
out="$out $value"
done;
echo "$out";
fi
}
# renvoie:
# -1 si pas d'argument
# -2 si lib == ""
# 1 si lib existe
# 0 autre (lib non existe)
isLibExist(){