From aa21caac183ac60f7306ec9e018f28176cf19185 Mon Sep 17 00:00:00 2001 From: kyodev <> Date: Sun, 11 Feb 2018 16:42:55 +0100 Subject: [PATCH] 2.0.0 --- scripts/sdeb | 437 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 343 insertions(+), 94 deletions(-) diff --git a/scripts/sdeb b/scripts/sdeb index eec0dd8..caa51d7 100755 --- a/scripts/sdeb +++ b/scripts/sdeb @@ -1,44 +1,119 @@ #!/bin/bash -version=1.5.0 -date=14/01/2018 +version=2.0.0 +date=11/02/2018 -f__color(){ # 08/10/2017 - YELLOW=$(tput setaf 3) # question - GREEN=$(tput setaf 2) # ok - BLUE=$(tput setaf 4) # info - RED=$(tput setaf 1) # alerte - STD=$(tput sgr0) # retour normal - MAGENTA=$(tput setaf 5) - CYAN=$(tput setaf 6) +##### license LPRAB/WTFPL +# auteur: simpledeb +# contributeurs: kyodev +##### + +f__color(){ # 31/01/2018 + BLACK=$(tput setaf 0) + 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) ITAL=$(tput sitm) SOUL=$(tput smul) } - # $1=oui|non&[-tx] réponse par défaut & -tx=timeout, $2=message question, return 0 pour oui, 1 pour non -f__dialog_oui_non(){ # 12/12/2017 + # $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 + # 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 - [[ "$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" [[ "$1" =~ oui ]] && echo -n " [O/n] " || echo -n " [o/N] " if [ "$param" ]; then - read -t2 -r + read $param -r + echo else read -r fi - if [ -z "$REPLY" ]; then - [[ "$1" =~ oui ]] && REPLY="oui" || REPLY="non" + # réponse par défaut si saisie vide + if [[ -z "$REPLY" && "$1" =~ oui ]]; then + REPLY="oui" + elif [[ -z "$REPLY" && "$1" =~ non ]]; then + REPLY="non" fi - echo - if [[ ${REPLY,,} =~ ^ou?i?$ ]]; then return 0; else return 1; fi + # effacement éventuel ligne question/réponse + 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 # si bash inexistant, return 2 -f__sudo(){ # 14/01/2018 - local nb sudo isudo toBash options +f__sudo(){ # 26/01/2018 + local nb sudo isudo toBash options nbDefault=2 + # détermination sudo possible type -p bash &>/dev/null && toBash=$( type -p bash ) || return 2 # sudo --shell bash équivalent su ? if sudo -v &>/dev/null && [ $EUID -ne 0 ] ; then @@ -46,14 +121,18 @@ f__sudo(){ # 14/01/2018 else sudo="su --shell $toBash --preserve-environment -c " fi - if [[ "$@" =~ :??: ]]; then + # extraction nb de tentatives éventuel + if [[ "$@" =~ :.{1,2}: ]]; then nb="$@" nb=${nb#*:} nb=${nb%:*} + options=${@//:$nb:/ } + (( ${nb}+1 )) 2>/dev/null || nb="$nbDefault" # test si numérique, sinon, else - nb=2 + nb="$nbDefault" + options="$@" fi - options=${@//:$nb:/ } + # lancement cmds for (( isudo=1 ; isudo<="$nb" ; isudo++ )); do $sudo " $options" [ "$?" == 0 ] && break @@ -62,11 +141,16 @@ f__sudo(){ # 14/01/2018 } # [ $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" - [ "$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" + if [ "$1" ]; then read -n1 -t"$1" -s else @@ -75,90 +159,255 @@ f__pause(){ # 24/09/2017 echo } -help(){ # 16/10/2017 - echo "$BOLD téléchargement et installation scripts$STD" - echo - echo - echo " $0 all | script getX" - echo - echo " si all : traitements de tous les scripts" - echo " script getX: $(tr ' ' '|' <<< $liste)" - echo - echo " si option incorrecte: affichage de cette aide" - echo - exit 1 + # $1 script à dl (si all, traitement liste scripts), $2 existe -> ecrase=oui +f_download(){ # 11/02/2018 + local ecrase produit iscript + + if [ "$2" ]; then + ecrase="oui" + fi + if [ "$1" == "t-all" ]; then + f__dialog_oui_non "oui clear" " charger tous les scripts?" || return + produit=( ${!urls[@]} ) + else + 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 - if [ "$(which figlet)" ]; then - echo -e "$BOLD" - figlet -w120 " script sdeb" | tr '`' "'" - printf "$STD" - else - echo -e "$BOLD\n scripts sdeb$STD" + logo=" _ _ + ___ __| | ___| |__ + / __|/ _' |/ _ \ '_ \ + \__ \ (_| | __/ |_) | + |___/\__,_|\___|_.__/ +" + 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 - echo -e " $(basename $0) $version\n" + echo -e "\n script en ligne: $YELLOW$ver_script_online" } -download(){ # 16/10/2017 - 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 -} +######## début script / initialisation -install(){ # 16/10/2017 - if [ -e "$1" ]; then - ./$1 -i - f__pause 10 - else - echo " $1 absent" - fi - echo -} + # tests au démarrage +f__requis "wget|curl" || exit 1 + + # paramètres script +script=$( basename $0 ) +user_agent="Mozilla/5.0 Firefox" +url_script=https://framagit.org/kyodev/kyopages/raw/master/scripts/sdeb +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 -[[ "$1" =~ ^get || "$1" == "all" ]] || help # si appel incorrect, help -[[ $* =~ --quiet ]] || start +options=$@ +options=${options//--quiet/ } +[ "$options" ] || options="-h" # vide? help -echo -e "$BOLD\n chargement des scripts$STD\n" -if f__dialog_oui_non "oui" " charger les scripts?"; then - if [ "$1" == "all" ];then - for ifile in $liste; do - download "$ifile" - done - else - download "$1" - fi + # root requis +if [[ $* = @(i-*|r-*) && "$EUID" -ne 0 ]]; then + echo -en "$RED ROOT$BLUE requis\n " + f__sudo "exec $0 --quiet $@" + exit fi -echo -e "$BOLD\n installation des scripts$STD\n" -if f__dialog_oui_non "oui" " installer les scripts?" ; then - if [ $EUID -ne 0 ]; then - echo " vous devez être ROOT pour installer les scripts dans le système" - f__sudo "./sdeb $* --quiet" - exit 0 - fi - if [ "$1" == "all" ];then - for ifile in $liste; do - install "$ifile" - done - else - install "$1" - fi -fi + # options, lancement actions +for j in $options; { + case $j in + i-* ) + f_install "$j" + echo + f_version "local" + ;; + r-* ) + f_remove "$j" + ;; + t-* ) + f_download "$j" + ;; + 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 wget -O sdeb https://frama.link/sdeb chmod +x sdeb && ./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