From 81f497431f445d9c7d00e1d87c7f810bb278d84f Mon Sep 17 00:00:00 2001 From: kyodev <> Date: Fri, 26 Jan 2018 17:05:36 +0100 Subject: [PATCH] getInfo 3.8.0 --- scripts/getInfo | 145 ++++++++++++++++++++--------------- scripts/getInfo_changelog.md | 14 +++- 2 files changed, 96 insertions(+), 63 deletions(-) diff --git a/scripts/getInfo b/scripts/getInfo index 07af1b2..e8de607 100755 --- a/scripts/getInfo +++ b/scripts/getInfo @@ -1,7 +1,7 @@ #!/bin/bash -version=3.7.1 -date="24/01/2018" +version=3.8.0 +date="26/01/2018" projet="simpledeb" contact="IRC freenode ##sdeb ou https://framagit.org/kyodev/kyopages/issues/" script="getInfo" @@ -133,43 +133,69 @@ f__log(){ # 4/12/2017 fi } - # test dépendances/paquets, $1 liste commande[>paquet] (ex: killall>psmisc) - # si manque, return 1 & info commandes manquantes, si debian proposition paquet à installer - # si $2=debOnly et si paquets manquants: return 1 et $debOnlyAbsent ( $1=liste paquets ) - # si $2=debOnly et si paquets présent: return 0 et $debOnlyPresent ( $1=liste paquets ) - # attention priorité $debOnlyAbsent sur $debOnlyPresent -f__requis(){ # 4/12/2017 - local dependsMissing packagesMissing command package ireq compteur pluriel + # recherche commandes/paquets, $1 liste: cmd1|cmd2[>paquet] (séparées par espaces) ex: "gawk|mawk>gawk 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 - unset debOnlyAbsent debOnlyPresent - for ireq in $1; do - command="$(cut -d '>' -f 1 <<< $ireq)" - package="$(cut -d '>' -f 2 <<< $ireq)" - if [ "$2" == "debOnly" ]; then - if type -p "dpkg" &>/dev/null ; then # package only et debian - LC_ALL=C dpkg --get-selections | grep -qE "^$package[[:space:]]+install" \ - && debOnlyPresent+="$package " || debOnlyAbsent+="$package " + 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 - elif ! type -p "$command" &>/dev/null ; then - dependsMissing+="$command " - packagesMissing+="$package " - fi + done done - [ "$debOnlyAbsent" ] && debOnlyAbsent="$(xargs <<< $debOnlyAbsent)" # trim début & fin - [ "$debOnlyPresent" ] && debOnlyPresent="$(xargs <<< $debOnlyPresent)" # trim début & fin - [ "$debOnlyAbsent" ] && return 1 - [ "$debOnlyPresent" ] && return 0 - if [ "$dependsMissing" ]; then - compteur="$(wc -w <<< $dependsMissing)" - [ "$compteur" -gt "1" ] && pluriel="s" || unset pluriel - if [ -e /etc/debian_version ]; then - f__info "$RED""erreur critique: $compteur paquet"$pluriel" manquant"$pluriel": $STD$BOLD$dependsMissing" \ - "\n vous devriez exécuter:$GREEN apt install $packagesMissing" - else - f__info "$RED""erreur critique: $compteur commande"$pluriel" manquante"$pluriel": $STD$BOLD$dependsMissing" - fi - return 1 + + # 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 +} + + # recherche paquet deb (scission f__requis), $1 liste paquets ("paquet1 paquet2"), si un paquet absent return 1 + # assigne $deb_absent & $deb_present, si hors debian: return 1 mais $deb_present & $deb_absent vides +f__requis_deb(){ # 26/01/2018 + local ireq + unset deb_present deb_absent + + type -p "dpkg" &>/dev/null || return 1 # si pas dpkg, sortie return 0 + + for ireq in $1; do + LC_ALL=C dpkg --get-selections | grep -qE "^$ireq[[:space:]]+install" \ + && deb_present+="$ireq " || deb_absent+="$ireq " + done + + deb_absent=${deb_absent% } # suppression éventuel espace final + deb_present=${deb_present% } # suppression éventuel espace final + [ "$deb_absent" ] && return 1 + [ "$deb_present" ] && return 0 } # $@=cmd à lancer en root avec su ou sudo. si $@ contient :x: x=nombre de tentatives, sinon 2 tentatives par défaut @@ -211,7 +237,7 @@ f__unit_human(){ # 5/12/2017 # user ayant initié la session graphique, assigne $fu_user # return 1 sur échec identification user, return 2 sur absence home/ # gestion variable environnement user avec: USER_INSTALL= script -f__user(){ # 3/12/2017 +f__user(){ # 25/01/2018 local user userid test root_login root_login="$(grep ':0:' /etc/passwd | cut -d':' -f1)" || root_login="root" @@ -241,9 +267,9 @@ f__user(){ # 3/12/2017 if [ "$SUDO_USER" ] && [ "$SUDO_USER" != "$root_login" ]; then user="$SUDO_USER"; elif grep -qv 'root' <<< "$(who)"; then - user="$(grep -v 'root' <<< $(who) | head -n1 | cut -d ' ' -f1)"; # grep -v 'root' <<< $(who) | gawk 'FNR==1{print $1}' + user="$(grep -v 'root' <<< $(who) | head -n1 | cut -d ' ' -f1)"; # grep -v 'root' <<< $(who) | awk 'FNR==1{print $1}' elif grep -q 'hourly.*get[A-Z].*\.anacrontab.*\.config/anacron/spool' /etc/crontab; then - user="$(grep 'hourly.*get[A-Z].*\.anacrontab.*\.config/anacron/spool' /etc/crontab | head -n1 | cut -d' ' -f2)"; # grep 'hourly.*get[A-Z].*\.anacrontab.*\.config/anacron/spool' /etc/crontab | gawk 'FNR==1{print $2} + user="$(grep 'hourly.*get[A-Z].*\.anacrontab.*\.config/anacron/spool' /etc/crontab | head -n1 | cut -d' ' -f2)"; # grep 'hourly.*get[A-Z].*\.anacrontab.*\.config/anacron/spool' /etc/crontab | awk 'FNR==1{print $2} fi fi fu_user="$user" @@ -1574,7 +1600,7 @@ fi_packagers(){ #v2 23/11/2017 fi } -fi_pkg_apt(){ #v3 30/12/2017 +fi_pkg_apt(){ #v3 26/01/2018 local dateMaj nb_packages ifile info_update text pluriel local sources cmt_sources cmd_sources dir_source result local apt_v apt_version apt_prefs cmt_apt_prefs cmd_apt_prefs @@ -1642,15 +1668,14 @@ fi_pkg_apt(){ #v3 30/12/2017 # divers dateMaj=$( date -r /var/cache/apt/pkgcache.bin '+%d/%m/%Y %H:%M %z' 2>/dev/null) || \ dateMaj=$( date -r /var/cache/apt '+%d/%m/%Y %H:%M %z' 2>/dev/null ) # /var/lib/dpkg/ - nb_packages=$( dpkg -l | grep -c '^ii' ) - #nb_packages alternatif: grep -c '\.list' <<< $(ls -1 /var/lib/dpkg/info/*.list) + nb_packages=$( dpkg -l | grep -c '^ii' ) # alternatif: grep -c '\.list' <<< $(ls -1 /var/lib/dpkg/info/*.list) # https - apt_version=$( apt --version ) # apt 1.4.8 (i386) - apt_version=${apt_version#apt } # 1.4.8 (i386) - apt_version=${apt_version% (*} # 1.4.8 - apt_v=${apt_version%.*} # 1.4 + apt_version=$( apt --version ) # apt 1.4.8 (i386) + apt_version=${apt_version#apt } # 1.4.8 (i386) + apt_version=${apt_version% (*} # 1.4.8 + apt_v=${apt_version%.*} # 1.4 alert_https=$( gawk '{if ( $1 > 1.5 ) {print "https inutile"}}' <<< $apt_v ) - if f__requis "apt-transport-https" "debOnly" && [ "$alert_https" ]; then + if f__requis_deb "apt-transport-https" && [ "$alert_https" ]; then alert_https="le paquet est inutile maintenant avec la version $apt_v d'apt (depuis 1.6)" else unset alert_https @@ -3414,7 +3439,7 @@ figet_hw(){ #v2 14/12/2017 } # $1=-4|-6, assigne $fg_ip, $fg_gws6, $fg_ifn, $fg_mac -figet_ip(){ # 15/12/2017 +figet_ip(){ # 25/01/2018 local target ifn x_ip=1 @@ -3422,7 +3447,7 @@ figet_ip(){ # 15/12/2017 [ "$1" ] && proto="$1" || proto="-4" # adresses ip fg_ip=$( - gawk -v proto="$proto" ' + awk -v proto="$proto" ' BEGIN { if (proto == -6) esp=41; else esp=16 } /scope global/ { sub(/wl.*/,$2" (wifi)",$2); sub(/.*en.*|.*eth.*/,$2" (ethernet)",$2); @@ -3441,14 +3466,14 @@ figet_ip(){ # 15/12/2017 ) # passerelles fg_gws=$( - gawk ' + awk ' BEGIN { if (proto == -6) esp=42; else esp=12 } /default via/ { printf "%-"esp"s (%s)\n",$3,$5 } ' <<< $( ip $proto route ) ) # interface sortante if [ "$proto" == "-6" ]; then - target=$( gawk '/proto ra / { print $1; exit}' <<< $( ip $proto -o route ) ) + target=$( awk '/proto ra / { print $1; exit}' <<< $( ip $proto -o route ) ) fg_ifn_prior=$( ip $proto route get $target ) fg_ifn_prior=$( ip $proto route get $target | sed -En 's/.*dev (.*) proto.*src ([0-9a-f:]+).*/\1 (\2)/p' ) else @@ -3990,10 +4015,10 @@ fipaste_curl_markdownshare(){ # à tester/finir } # tache upgrade dans anacron hebdomadaire, via cron horaire, $1=upgrade|install|remove -fscript_cronAnacron(){ # 29/12/2017 +fscript_cronAnacron(){ # 26/01/2018 local dirAnacron dirSpool fileAnacron - [ "$( type -t fscript_cronAnacron_special )" ] && fscript_cronAnacron_special # test, si fonction spécifique, appel + type -t fscript_cronAnacron_special &>/dev/null && fscript_cronAnacron_special # test, si fonction spécifique, appel dirAnacron="/home/$fu_user/.config/anacron" dirSpool="$dirAnacron/spool" fileAnacron="$dirAnacron/$script.anacrontab" @@ -4048,14 +4073,14 @@ fscript_get_version(){ # 24/01/2018 } # installation du script dans le système -fscript_install(){ # 15/01/2018 +fscript_install(){ # 26/01/2018 if grep -q 'bin' <<< "$( dirname $0 )" ; then f__info "$RED""l'installation dans le système doit se faire depuis un script local $GREEN(./$script -i )" return 1 fi - [ "$( type -t fscript_install_special )" ] && fscript_install_special # test, si fonction spécifique, appel + type -t fscript_install_special &>/dev/null && fscript_install_special # test, si fonction spécifique, appel f__requis "wget anacron cron" || exit 1 # install /opt mkdir -p /opt/bin/ @@ -4074,7 +4099,7 @@ fscript_install(){ # 15/01/2018 } # suppression du script dans le système -fscript_remove(){ # 15/01/2018 +fscript_remove(){ # 26/01/2018 if ! grep -q 'bin' <<< "$( dirname $0 )" ; then f__info "$RED""cette fonction doit être appelée depuis le script installé dans le système $GREEN($script -r)" @@ -4085,7 +4110,7 @@ fscript_remove(){ # 15/01/2018 return 1 fi - [ "$( type -t fscript_remove_special )" ] && fscript_remove_special # test, si fonction spécifique, appel + type -t fscript_remove_special &>/dev/null && fscript_remove_special # test, si fonction spécifique, appel # suppression de /opt lien /usr/bin rm -f "$script_install" unlink "/usr/bin/$script" &>/dev/null @@ -4096,10 +4121,10 @@ fscript_remove(){ # 15/01/2018 } # mise à jour script, [$1 != "" si upgrade en place, $1 dans message info] -fscript_update(){ # 24/01/2018 +fscript_update(){ # 26/01/2018 local dirTemp="/tmp/$script-maj" upgradeEnPlace="$1" - [ "$(type -t fscript_update_special)" ] && fscript_update_special # test, si fonction spécifique, appel + type -t fscript_update_special &>/dev/null && fscript_update_special # test, si fonction spécifique, appel if [ -z "$upgradeEnPlace" ] && ! grep -q 'bin' <<< "$( dirname $0 )" ; then f__info "$RED""cette fonction doit être appelée depuis le script installé dans le système $GREEN($script -u)" return 1 @@ -4129,7 +4154,7 @@ fscript_update(){ # 24/01/2018 rm -rf "$dirTemp/" } -prg_init(){ # 4/12/2017 +prg_init(){ # 25/01/2018 PATH='/usr/sbin:/usr/bin:/sbin:/bin' TERM=xterm @@ -4188,7 +4213,7 @@ prg_init(){ # 4/12/2017 fi # requis pour fonctionnement programme - f__requis "gawk wget ip>iproute2 lspci>pciutils wc>coreutils uptime>procps" || exit 1 + f__requis "gawk|mawk>gawk wget ip>iproute2 lspci>pciutils wc>coreutils uptime>procps" || exit 1 # detect rapide systeme deb [ $( f__which dpkg ) ] && ENV_DEBIAN="oui" diff --git a/scripts/getInfo_changelog.md b/scripts/getInfo_changelog.md index 88a2956..48bbac7 100644 --- a/scripts/getInfo_changelog.md +++ b/scripts/getInfo_changelog.md @@ -4,7 +4,15 @@ traitements options dans les options :/ * révision: général, invocation f__sudo dans traitement options, plus confortable si su & _all_ * mawk à tester -## getInfo 3.7.1 24/01/2018 +## getInfo 3.8.0 26/01/2018 + +* révision: test avec mawk, f__user, figet_ip +* révision: plus d'imposition gawk only, prg_init +* révision: mineur, fscript_cronAnacron fscript_install fscript_remove fscript_update +* révision: f__requis, commandes alternatives possible (gawk|mawk), mawk installé par défaut sur debian :( +* révision: f__requis_deb issu de f__requis, fi_pkg_apt + +## getInfo 3.7.0 24/01/2018 * nouveau: cumul options (opérations) possibles pour la plupart des opérations * révision: invocation f__sudo dans traitement options, plus confortable si su & _all_ @@ -44,8 +52,8 @@ révision, syncro: f__info, option combinée raw:log ## getInfo 2.70.0 18/12/2017 -*syncro: f__archive_test, f__error, f__info, f__sudo, fscript_cronAnacron, fscript_get_version, - fscript_install, fscript_remove, fscript_update +* syncro: f__archive_test, f__error, f__info, f__sudo, fscript_cronAnacron, fscript_get_version, + fscript_install, fscript_remove, fscript_update ## getInfo 2.69.0 18/12/2017