mirror of https://framagit.org/kyodev/kyopages.git
430 lines
12 KiB
Bash
Executable File
430 lines
12 KiB
Bash
Executable File
#!/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
|