This commit is contained in:
kyodev 2018-02-11 16:42:55 +01:00
parent 3818a05927
commit aa21caac18
1 changed files with 343 additions and 94 deletions

View File

@ -1,44 +1,119 @@
#!/bin/bash #!/bin/bash
version=1.5.0 version=2.0.0
date=14/01/2018 date=11/02/2018
f__color(){ # 08/10/2017 ##### license LPRAB/WTFPL
YELLOW=$(tput setaf 3) # question # auteur: simpledeb
GREEN=$(tput setaf 2) # ok # contributeurs: kyodev
BLUE=$(tput setaf 4) # info #####
RED=$(tput setaf 1) # alerte
STD=$(tput sgr0) # retour normal f__color(){ # 31/01/2018
MAGENTA=$(tput setaf 5) BLACK=$(tput setaf 0)
CYAN=$(tput setaf 6) RED=$(tput setaf 1) # alerte
GREEN=$(tput setaf 2) # ok
YELLOW=$(tput setaf 3) # question
BLUE=$(tput setaf 4) # info
CYAN=$(tput setaf 6)
MAGENTA=$(tput setaf 5)
STD=$(tput sgr0) # retour normal
STD=$(tput sgr0)$BLUE
BOLD=$(tput bold) BOLD=$(tput bold)
ITAL=$(tput sitm) ITAL=$(tput sitm)
SOUL=$(tput smul) SOUL=$(tput smul)
} }
# $1=oui|non&[-tx] réponse par défaut & -tx=timeout, $2=message question, return 0 pour oui, 1 pour non # $1=oui|non | clear | -tx (oui|non, réponse par défaut si entrée seule), $2=message, return 0 si oui, return 1 si non
f__dialog_oui_non(){ # 12/12/2017 # options: oui|non réponse par défaut, -txy timeout (sans espaces entre t et chiffres) 1 à 99s
# clear effacement ligne question/réponse
f__dialog_oui_non(){ # 30/01/2018
local param local param
[[ "$1" =~ -t[0-9]{1,2} ]] && param="$(sed -En 's/.*(-t[0-9]{1,2}).*/\1/p' <<< $1)"
# extraction timeout éventuel
if [[ "$1" =~ -t[0-9]{1,2} ]]; then
param=$( sed -En 's/.*(-t[0-9]{1,2}).*/\1/p' <<< $1 )
fi
# affichage
echo -en "$BLUE$2$STD" echo -en "$BLUE$2$STD"
[[ "$1" =~ oui ]] && echo -n " [O/n] " || echo -n " [o/N] " [[ "$1" =~ oui ]] && echo -n " [O/n] " || echo -n " [o/N] "
if [ "$param" ]; then if [ "$param" ]; then
read -t2 -r read $param -r
echo
else else
read -r read -r
fi fi
if [ -z "$REPLY" ]; then # réponse par défaut si saisie vide
[[ "$1" =~ oui ]] && REPLY="oui" || REPLY="non" if [[ -z "$REPLY" && "$1" =~ oui ]]; then
REPLY="oui"
elif [[ -z "$REPLY" && "$1" =~ non ]]; then
REPLY="non"
fi fi
echo # effacement éventuel ligne question/réponse
if [[ ${REPLY,,} =~ ^ou?i?$ ]]; then return 0; else return 1; fi if [[ "$1" =~ clear ]]; then
tput cuu1 # une ligne plus haut
tput dl1 # efface ligne
else
echo
fi
if [[ ${REPLY,,} =~ ^ou?i?$ ]]; then
return 0
else
return 1
fi
}
# recherche commandes/paquets, $1 liste: cmd1|cmd2[>paquet] (séparées par espaces) ex: "gawk|mawk>$c_awk wget"
# si manque, return 1 & affiche commandes manquantes (si debian, ajout proposition paquet à installer)
f__requis(){ # 26/01/2018
local ENV_DEBIAN ireq table package commands command commandsMissing packagesMissing
type -p "dpkg" &>/dev/null && ENV_DEBIAN="oui" # debian
type -t f__info &>/dev/null && c_echo="f__info" || c_echo="echo -e" # f__info existe? sinon echo
for ireq in $1; do # pour tous les composants de la liste $1
table=( ${ireq//>/ } ) # séparation sur >, split avec double bashisme, mais évite manip $IFS
commands=( ${table[0]//|/ } ) # séparation sur |
if [ ${table[1]} ]; then
package=${table[1]}
else
package="$commands" # pas de oackages dans les options, donc idem commands[0]
fi
for command in ${commands[@]}; do # pour toutes les commandes
if type -p "$command" &>/dev/null ; then
unset commandsMissing packagesMissing
break
else # inexistant
commandsMissing+="$command "
packagesMissing+="$package "
fi
done
done
# dédoublonnage & triage
commandsMissing=$( echo $commandsMissing | tr ' ' '\n' | sort --unique | tr '\n' ' ' )
packagesMissing=$( echo $packagesMissing | tr ' ' '\n' | sort --unique | tr '\n' ' ' )
# suppression éventuel espace final
commandsMissing=${commandsMissing% }
packagesMissing=${packagesMissing% }
# affichage final
if [ "$commandsMissing" ] && [ "$ENV_DEBIAN" ]; then
$c_echo "$RED""erreur critique, manquant: $STD$BOLD$commandsMissing" \
"vous devriez exécuter:$GREEN apt install $packagesMissing"
elif [ "$commandsMissing" ]; then
$c_echo "$RED""erreur critique, manquant: $STD$BOLD$commandsMissing"
fi
[ "$commandsMissing" ] && return 1 || return 0
} }
# $@=cmd à lancer en root avec su ou sudo. si $@ contient :x: x=nombre de tentatives, sinon 2 tentatives par défaut # $@=cmd à lancer en root avec su ou sudo. si $@ contient :x: x=nombre de tentatives, sinon 2 tentatives par défaut
# si bash inexistant, return 2 # si bash inexistant, return 2
f__sudo(){ # 14/01/2018 f__sudo(){ # 26/01/2018
local nb sudo isudo toBash options local nb sudo isudo toBash options nbDefault=2
# détermination sudo possible
type -p bash &>/dev/null && toBash=$( type -p bash ) || return 2 type -p bash &>/dev/null && toBash=$( type -p bash ) || return 2
# sudo --shell bash équivalent su ? # sudo --shell bash équivalent su ?
if sudo -v &>/dev/null && [ $EUID -ne 0 ] ; then if sudo -v &>/dev/null && [ $EUID -ne 0 ] ; then
@ -46,14 +121,18 @@ f__sudo(){ # 14/01/2018
else else
sudo="su --shell $toBash --preserve-environment -c " sudo="su --shell $toBash --preserve-environment -c "
fi fi
if [[ "$@" =~ :??: ]]; then # extraction nb de tentatives éventuel
if [[ "$@" =~ :.{1,2}: ]]; then
nb="$@" nb="$@"
nb=${nb#*:} nb=${nb#*:}
nb=${nb%:*} nb=${nb%:*}
options=${@//:$nb:/ }
(( ${nb}+1 )) 2>/dev/null || nb="$nbDefault" # test si numérique, sinon,
else else
nb=2 nb="$nbDefault"
options="$@"
fi fi
options=${@//:$nb:/ } # lancement cmds
for (( isudo=1 ; isudo<="$nb" ; isudo++ )); do for (( isudo=1 ; isudo<="$nb" ; isudo++ )); do
$sudo " $options" $sudo " $options"
[ "$?" == 0 ] && break [ "$?" == 0 ] && break
@ -62,11 +141,16 @@ f__sudo(){ # 14/01/2018
} }
# [ $1=timeout en s (O pour désactiver timeout) [$2=message] ] # [ $1=timeout en s (O pour désactiver timeout) [$2=message] ]
f__pause(){ # 24/09/2017 f__pause(){ # 30/01/2018
local message="Appuyer sur une touche pour continuer" local message="Appuyer sur une touche pour continuer"
[ "$2" ] && message="$2"
if [ "$1" ] && [ -z "$2" ]; then message+=" ou attendre $1""s"; fi if [ "$2" ]; then
message="$2"
elif [ "$1" ] && [ -z "$2" ]; then
message+=" ou attendre $1""s"
fi
printf "$message" printf "$message"
if [ "$1" ]; then if [ "$1" ]; then
read -n1 -t"$1" -s read -n1 -t"$1" -s
else else
@ -75,90 +159,255 @@ f__pause(){ # 24/09/2017
echo echo
} }
help(){ # 16/10/2017 # $1 script à dl (si all, traitement liste scripts), $2 existe -> ecrase=oui
echo "$BOLD téléchargement et installation scripts$STD" f_download(){ # 11/02/2018
echo local ecrase produit iscript
echo
echo " $0 all | script getX" if [ "$2" ]; then
echo ecrase="oui"
echo " si all : traitements de tous les scripts" fi
echo " script getX: $(tr ' ' '|' <<< $liste)" if [ "$1" == "t-all" ]; then
echo f__dialog_oui_non "oui clear" " charger tous les scripts?" || return
echo " si option incorrecte: affichage de cette aide" produit=( ${!urls[@]} )
echo else
exit 1 produit=( ${1#*-} )
f_existe "$produit" || return 1
fi
for iscript in ${produit[@]}; do
if [[ -e "$iscript" && -z "$ecrase" ]]; then
if f__dialog_oui_non "non clear" " écraser le script existant \n (sera le ${RED}défaut pour tous les scripts à venir$BLUE)?"; then
ecrase="oui"
else
ecrase="non"
fi
tput cuu1 # une ligne plus haut
tput dl1 # efface ligne
fi
[[ -z "$ecrase" || "$ecrase" == "oui" ]] || return
echo " chargement $iscript"
if type -p wget > /dev/null ; then
wget -nv --timeout=5 --user-agent "$user_agent" -o /dev/null -O "$iscript" ${urls["$iscript"]}
elif type -p curl > /dev/null ; then
curl -Ss --user-agent "$user_agent" -o "$iscript" ${urls["$iscript"]}
fi
if [ "$?" -ne 0 ]; then
echo " erreur download, vérifier serveur distant, connexion, réessayer plus tard"
rm -f "$iscript"
return 1
fi
chmod 777 "$iscript" 2>/dev/null # effaçable par un user
done
} }
start(){ # 16/10/2017 # $1 script à tester, return 0 si ok, 1 si inexistant
f_existe(){ # 11/02/2018
if ! grep -q "$1" <<< ${!urls[@]}; then
echo " $1 : script inconnu"
return 1
fi
}
f_help(){ # 10/02/2018
echo "$BOLD téléchargement et installation getScripts$STD"
echo
echo " script possible : "${!urls[@]}
echo " ( all = tous les scripts )"
echo
echo " $script i-script : installation script (téléchargement préliminaire ou utilisation script en place)"
echo " $script r-script : remove script"
echo " $script t-script : téléchargement script"
echo " $script version : version des scripts"
echo
echo " $script -h : affichage aide"
echo
}
# $1 script à installer (si all, traitement liste scripts)
f_install(){ # 11/02/2018
local produit pause iscript enplace i
if [ "$1" == "i-all" ]; then
f__dialog_oui_non "oui clear" " installer tous les scripts?" || return
produit=( ${!urls[@]} )
pause="ok"
else
produit=${1#*-}
f_existe "$produit" || return 1
fi
total_prods=${#produit[@]}
for iscript in ${produit[@]}; do
(( i++ ))
if [ "$i" -eq "$total_prods" ]; then
unset pause # évite pause finale
fi
if [[ -e "$iscript" && -z "$enplace" ]]; then
if f__dialog_oui_non "oui clear" " utiliser le script $iscript en place au lieu de le télécharger \n (sera le ${RED}défaut pour tous les scripts à venir$BLUE)?"; then
enplace="oui"
else
enplace="non"
fi
tput cuu1 # une ligne plus haut
tput dl1 # efface ligne
fi
if [[ -z "$enplace" || "$enplace" == "non" ]]; then
f_download "$iscript" "ecrase"
if [ "$?" -ne 0 ]; then
continue
fi
fi
"./$iscript" -i
if [[ "$?" -eq 0 && "$pause" ]]; then
f__pause 10
tput cuu 1 # une ligne plus haut
tput dl1 # efface ligne
fi
done
}
# $1 script à désinstaller (si all, traitement liste scripts)
f_remove(){ # 11/02/2018
local produit pause iscript i
if [ "$1" == "r-all" ]; then
f__dialog_oui_non "oui clear" " désinstaller tous les scripts?" || return
produit=( ${!urls[@]} )
pause="ok"
else
produit=( ${1#*-} )
f_existe "$produit" || return 1
fi
total_prods=${#produit[@]}
for iscript in ${produit[@]}; do
(( i++ ))
if [ "$i" -eq "$total_prods" ]; then
unset pause # évite pause finale
fi
"$iscript" -r 2>/dev/null
if [[ "$?" -eq 0 && "$pause" ]]; then
f__pause 10
tput cuu 1 # une ligne plus haut
tput dl1 # efface ligne
fi
done
}
f_start(){ # 10/02/2018
local logo
f__color f__color
if [ "$(which figlet)" ]; then logo=" _ _
echo -e "$BOLD" ___ __| | ___| |__
figlet -w120 " script sdeb" | tr '`' "'" / __|/ _' |/ _ \ '_ \
printf "$STD" \__ \ (_| | __/ |_) |
else |___/\__,_|\___|_.__/
echo -e "$BOLD\n scripts sdeb$STD" "
echo "$logo"
#~ if type -p figlet &>/dev/null ; then
#~ echo -n "$BOLD"
#~ figlet -w120 " $script" | tr '`' "'"
#~ echo -n "$STD"
#~ fi
tput cuu1 # une ligne plus haut
echo " $YELLOW$version - $date$STD"
}
# [$1=local] ne cherche pas verion en ligne
f_version(){ # 31/01/2018
local iscript ver_script_online
for iscript in ${!urls[@]}; do
if [ -x "/opt/bin/$iscript" ]; then
version=$( grep -m1 'version=' /opt/bin/$iscript )
version=${version#version=}
echo "$BLUE $iscript : $GREEN$version$STD"
else
echo "$BLUE $iscript$BLACK$BOLD non installé$STD"
fi
done
[ "$1" == "local" ] && return
if type -p wget > /dev/null ; then
ver_script_online=$( wget -q -o /dev/null -O - "$url_script" | grep -m1 '^version=' | cut -d'=' -f2 )
elif type -p curl > /dev/null ; then
ver_script_online=$( curl -s "$url_script" | grep -m1 '^version=' | cut -d'=' -f2 )
fi fi
echo -e " $(basename $0) $version\n" echo -e "\n script en ligne: $YELLOW$ver_script_online"
} }
download(){ # 16/10/2017 ######## début script / initialisation
local url
[ "$1" == "getInfo" ] && url="https://framagit.org/kyodev/kyopages/raw/master/scripts/getInfo"
[ "$1" == "getIp" ] && url="https://framagit.org/kyodev/kyopages/raw/master/scripts/getIp"
[ "$1" == "getFirefox" ] && url="https://framagit.org/kyodev/kyopages/raw/master/scripts/getFirefox"
[ "$1" == "getFlashPlayer" ] && url="https://framagit.org/kyodev/kyopages/raw/master/scripts/getFlashPlayer"
[ "$1" == "getThunderbird" ] && url="https://framagit.org/kyodev/kyopages/raw/master/scripts/getThunderbird"
wget -nv -O "$1" "$url"
chmod +x "$1"
# -q, --quiet -nv, --no-verbose
}
install(){ # 16/10/2017 # tests au démarrage
if [ -e "$1" ]; then f__requis "wget|curl" || exit 1
./$1 -i
f__pause 10 # paramètres script
else script=$( basename $0 )
echo " $1 absent" user_agent="Mozilla/5.0 Firefox"
fi url_script=https://framagit.org/kyodev/kyopages/raw/master/scripts/sdeb
echo declare -A urls=(
} ["getInfo"]="https://framagit.org/kyodev/kyopages/raw/master/scripts/getInfo"
["getIp"]="https://framagit.org/kyodev/kyopages/raw/master/scripts/getIp"
["getFirefox"]="https://framagit.org/kyodev/kyopages/raw/master/scripts/getFirefox"
["getXfox"]="https://framagit.org/kyodev/kyopages/raw/master/scripts/getXfox"
["getThunderbird"]="https://framagit.org/kyodev/kyopages/raw/master/scripts/getThunderbird"
["getFlashPlayer"]="https://framagit.org/kyodev/kyopages/raw/master/scripts/getFlashPlayer"
)
# logo et définition couleurs
[[ $* =~ --quiet ]] && echo || f_start
echo
#------ départ script ----------------------------------------------------------
liste="getInfo getIp getFirefox getFlashPlayer getThunderbird getXfox"
# traitement options # traitement options
[[ "$1" =~ ^get || "$1" == "all" ]] || help # si appel incorrect, help options=$@
[[ $* =~ --quiet ]] || start options=${options//--quiet/ }
[ "$options" ] || options="-h" # vide? help
echo -e "$BOLD\n chargement des scripts$STD\n" # root requis
if f__dialog_oui_non "oui" " charger les scripts?"; then if [[ $* = @(i-*|r-*) && "$EUID" -ne 0 ]]; then
if [ "$1" == "all" ];then echo -en "$RED ROOT$BLUE requis\n "
for ifile in $liste; do f__sudo "exec $0 --quiet $@"
download "$ifile" exit
done
else
download "$1"
fi
fi fi
echo -e "$BOLD\n installation des scripts$STD\n" # options, lancement actions
if f__dialog_oui_non "oui" " installer les scripts?" ; then for j in $options; {
if [ $EUID -ne 0 ]; then case $j in
echo " vous devez être ROOT pour installer les scripts dans le système" i-* )
f__sudo "./sdeb $* --quiet" f_install "$j"
exit 0 echo
fi f_version "local"
if [ "$1" == "all" ];then ;;
for ifile in $liste; do r-* )
install "$ifile" f_remove "$j"
done ;;
else t-* )
install "$1" f_download "$j"
fi ;;
fi version | versions ) # affichage version des scripts si installés
f_version "local"
;;
-v | --version ) # version en ligne et locales
f_version
;;
-h | --help | * ) # affichage help
f_help
;;
esac
}
echo
exit 0 exit 0
wget -O sdeb https://frama.link/sdeb wget -O sdeb https://frama.link/sdeb
chmod +x sdeb && ./sdeb chmod +x sdeb && ./sdeb
wget -O sdeb https://framagit.org/kyodev/kyopages/raw/master/scripts/sdeb wget -O sdeb https://framagit.org/kyodev/kyopages/raw/master/scripts/sdeb
curl -o sdeb https://framagit.org/kyodev/kyopages/raw/master/scripts/sdeb