#!/bin/bash version=2.3.0 date=05/03/2018 ##### license LPRAB/WTFPL # auteur: simpledeb # contributeurs: kyodev ##### f__color(){ # 01/03/2018 if type -p tput &>/dev/null && tput setaf 1 &>/dev/null; then 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" BOLD=$( tput bold ) ITAL=$( tput sitm ) SOUL=$( tput smul ) else YELLOW=$( echo -n "\033[0;33m" ) # ? GREEN=$( echo -n "\033[0;32m" ) # ok BLUE=$( echo -n "\033[0;34m" ) # info RED=$( echo -n "\033[0;31m" ) # alerte COLOR=$( echo -n "\033[0m" ) # standard STD=$( echo -n "\033[0m" ) # standard fi } # $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(){ # 22/02/2018 local param # 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 $param -r echo else read -r fi # 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 # 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, 3 par défaut # si sudo si possible sera utilisé. # si su &2 redirigé sur &1 # si bash inexistant, return 2 f__sudo(){ # 24/02/2018 local nb sudo isudo toBash options nbDefault=3 # 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 sudo="sudo su --shell $toBash --preserve-environment -c " else sudo="su --shell $toBash --preserve-environment -c " fi # 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="$nbDefault" options="$@" fi # lancement cmds if [[ "$sudo" =~ ^sudo ]]; then $sudo "$options" else for (( isudo=1 ; isudo<="$nb" ; isudo++ )); do echo -n "[su] Root, " $sudo "$options" 2>&1 # redirection demande pass (et erreur) sur &1 (utile quand &2 est redirigé en amont) [ "$?" == 0 ] && break [ "$isudo" == "$nb" ] && return 1 done fi } # [ $1=timeout en s (O pour désactiver timeout) [$2=message] ] f__pause(){ # 30/01/2018 local message="Appuyer sur une touche pour continuer" 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 read -n1 -s fi echo } # $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 } # $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 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 "\n script en ligne: $YELLOW$ver_script_online" } ######## début script / initialisation # 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 # traitement options options=$@ options=${options//--quiet/ } [ "$options" ] || options="-h" # vide? help # root requis if [[ $* == @(i-*|r-*) && "$EUID" -ne 0 ]]; then echo -en "$RED ROOT$BLUE requis\n " f__sudo "exec $0 --quiet $@" exit 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