This commit is contained in:
kyodev 2018-06-16 03:34:41 +02:00
parent 01b8777c49
commit 35a0036bec
5 changed files with 732 additions and 687 deletions

View File

@ -1,6 +1,6 @@
# getInfo
![version: 4.4.1](https://img.shields.io/badge/version-4.4.1-blue.svg?longCache=true&style=for-the-badge)
![version: 4.6.0](https://img.shields.io/badge/version-4.6.0-blue.svg?longCache=true&style=for-the-badge)
![bash langage](https://img.shields.io/badge/bash-4-brightgreen.svg?longCache=true&style=for-the-badge)
![license LPRAB / WTFPL](https://img.shields.io/badge/license-LPRAB%20%2F%20WTFPL-blue.svg?longCache=true&style=for-the-badge)
@ -38,8 +38,8 @@ chmod +x getInfo
/ _' |/ _ \ __|| || '_ \| |_ / _ \
| (_| | __/ |_ | || | | | _| (_) |
\__, |\___|\__|___|_| |_|_| \___/
|___/ version 4.4.1 - 08/04/2018
|___/ version 4.6.0 - 16/06/2018
•ø••••••••••••••••◇◇◇•••••
les droits root sont demandés et requis pour afficher les journaux systèmes
@ -146,26 +146,26 @@ chmod +x getInfo
/ _' |/ _ \ __|| || '_ \| |_ / _ \
| (_| | __/ |_ | || | | | _| (_) |
\__, |\___|\__|___|_| |_|_| \___/
|___/ version 4.4.1 - 08/04/2018
-----------------------------------------------------------------------
|___/ version 4.6.0 - 16/06/2018
./getInfo : exécution script
getInfo : exécution script installé dans le système
options:
-c : (catégorie) menu sélection catégorie d'analyse
-cs : catégorie système -cs : catégorie configuration
-cr : catégorie réseau -ca : catégorie analyse
-j : (journaux) analyse démarrage système, log Xorg, kernel et système, catégorie -ca
-l : (list) afficher le rapport markdown existant
-p : (paste) exporte le rapport markdown existant, durée standard du paste 7 jours
-us : upgrade spécial du script en place (sans être installé)
--debug : messages d'erreur (stderr) logués et exportés avec le rapport
--ip : affiche ip publique (ipv4/ipv6), pas de rapport markdown
--mac : affiche adresses Mac, pas de rapport markdown
--rc : gfetch, affiche un résumé, destiné à l'identification et appelé depuis .batchrc
--serial : affiche n° série disques, batterie et châssis, pas de rapport markdown
--ssid : affiche configurations ssid, pas de rapport markdown, root & NetworkManager requis
-tn : durée de conservation du paste de n jour(s)
-----------------------------------------------------------------------
getInfo -c : (catégorie) menu sélection catégorie d'analyse
getInfo -cs : catégorie système -cs : catégorie configuration
getInfo -cr : catégorie réseau -ca : catégorie analyse
getInfo -j : (journaux) analyse démarrage système, log Xorg, kernel et système, catégorie -ca
getInfo -l : (list) afficher le rapport markdown existant
getInfo -p : (paste) exporte le rapport markdown existant, durée standard du paste 7 jours
getInfo -us : upgrade spécial du script en place (sans être installé)
getInfo --ip : affiche ip publique (ipv4/ipv6), pas de rapport markdown
getInfo --mac : affiche adresses Mac, pas de rapport markdown
getInfo --rc : gfetch, affiche un résumé, destiné à l'identification et appelé depuis .batchrc
getInfo --serial : affiche n° série disques, batterie et châssis, pas de rapport markdown
getInfo --ssid : affiche configurations ssid, pas de rapport markdown, root & NetworkManager requis
--debug : messages d'erreur (stderr) logués et exportés avec le rapport
-tn : durée de conservation du paste de n jour(s)
-----------------------------------------------------------------------
./getInfo -i : installation du script dans le système (root)
getInfo -h, --help : affichage aide
@ -174,7 +174,7 @@ chmod +x getInfo
getInfo --rrc : désinstallation gfetch (root)
getInfo -u, --upgrade : mise à jour script
getInfo -v, --version : version du script
-----------------------------------------------------------------------
plus d'infos: https://framaclic.org/h/doc-getinfo
```

View File

@ -13,7 +13,7 @@ de téléchargement) seront alors sous la forme `getInfo ...`.
/ _' |/ _ \ __|| || '_ \| |_ / _ \
| (_| | __/ |_ | || | | | _| (_) |
\__, |\___|\__|___|_| |_|_| \___/
|___/ version 4.4.1 - 08/04/2018
|___/ version 4.6.0 - 16/06/2018
getInfo -h : afficher l'aide
@ -45,6 +45,7 @@ de téléchargement) seront alors sous la forme `getInfo ...`.
* `getInfo -us` (update spécial), le script est mis à jour là où il est, sans installation pré-requise
* `gfetch` lanceur sur `getInfo --rc` ( si script installé )
## options diverses
* `getInfo --debug` les messages d'erreurs sont redirigés dans _/tmp/getInfo.log_ qui sera ajouté au rapport lors de l'export
@ -59,6 +60,15 @@ de téléchargement) seront alors sous la forme `getInfo ...`.
* `getInfo --rc` affiche un résumé rapide en console. cette appel est, si possible, inscrit dans le fichier -bashrc_ lors de l'installation du script. le résumé sera donc affiché lors de la connexion à une console, comme [neofetch par exemple](https://github.com/dylanaraps/neofetch). cette appel est aussi accessible via la commande `gfetch`.
## gfetch, remarques
si installé (`getInfo --irc`), un lanceur `gfetch` est créé
si un fichier _bashrc_ est trouvé, le lanceur est ajouté: un résumé système s'affiche lors de l'ouverture d'un terminal
pour désinstaller: `getInfo -rrc`
si le script getInfo est installé `getInfo -i`, le lancement manuel de `getInfo --rc` affiche un résumé système dans le terminal. le lanceur gfetch n'existe pas
## installation du script
Une fois installé, le script est accessible à tous les utilisateurs. Un test hebdomadaire est effectué et le

View File

@ -1,7 +1,7 @@
# getIp
![version: 2.12.0](https://img.shields.io/badge/version-2.12.0-blue.svg?longCache=true&style=for-the-badge)
![version: 2.13.0](https://img.shields.io/badge/version-2.13.0-blue.svg?longCache=true&style=for-the-badge)
![bash langage](https://img.shields.io/badge/bash-4-brightgreen.svg?longCache=true&style=for-the-badge)
![license LPRAB / WTFPL](https://img.shields.io/badge/license-LPRAB%20%2F%20WTFPL-blue.svg?longCache=true&style=for-the-badge)

File diff suppressed because it is too large Load Diff

View File

@ -1,44 +1,83 @@
#!/bin/bash
# shellcheck disable=SC2016,SC2119,SC1117,SC2206
# shellcheck disable=SC2016,SC1117
# SC2016 Expressions don't expand in single quotes
# SC2119 Use function "$@" if function's $1 should mean script's $1 (??)
# SC1117: Backslash is literal in "\n". Prefer explicit escaping: "\\n".
# SC2206: Quote to prevent word splitting, or split robustly with mapfile or read -a.
version=2.12.0
date="09/03/2018"
version=2.13.0
date="16/06/2018"
script="getIp"
# contact="IRC ##sdeb@freenode.net ou https://framagit.org/sdeb/getIp/issues"
##### license LPRAB/WTFPL
# auteur: simpledeb
# auteur: sdeb
# contributeurs: kyodev
#####
# test connexion, [$1=-4|-6] protocole -4 par défaut, return 0|1
f__cnx(){ # 15/06/2018-2
local proto="-4" cmds cmd ip servers
if [[ "$1" == '-6' || "$1" == '6' ]]; then
proto="-6"
servers=(
2606:4700:4700::1111 # cloudfare
2001:7fd::1 # root K RIPE
2001:500:a8::e # root E nasa
2001:4860:4860::8888 # google
)
else
servers=(
1.1.1.1 # cloudfare
193.0.14.129 # root K RIPE
192.203.230.10 # root E nasa
195.135.221.140 # conncheck.opensuse.org
80.67.169.12 # ns0.fdn.fr
8.8.8.8 # google
)
fi
type -p ping &>/dev/null && cmds+=( "ping -c1 -w1 -U " )
type -p fping &>/dev/null && cmds+=( "fping --retry=0 --elapsed --stats " )
if (( ${#cmds[@]} == 0 )); then
echo "f__cnx(): no available commands" >&2
return
fi
for cmd in "${cmds[@]}"; do
for ip in "${servers[@]}" ; do
$cmd "$proto" "$ip" &>/dev/null && return 0
done
done
if nc -4 -h &>/dev/null; then # pris en charge par netcat-openbsd
for ip in "${servers[@]}" ; do
nc "$proto" -z -w1 "$ip" 53 &>/dev/null && return 0 # paquet netcat-traditional debian obsolete, ne gere pas protocoles
done
fi
return 1
}
# shellcheck disable=SC2034
# SC2034 foo appears unused. Verify it or export it.
f__color(){ # 01/03/2018
f__color(){ # 29/05/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 )
BLACK=$( tput setaf 0 )
CYAN=$( tput setaf 6 )
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"
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
YELLOW=$'\033[0;33m' # ?
GREEN=$'\033[0;32m' # ok
BLUE=$'\033[0;34m' # info
RED=$'\033[0;31m' # alerte
STD=$'\033[0m' # standard
fi
}
@ -71,12 +110,12 @@ f__dir(){ # 05/03/2017
}
# affichage $1 en rouge, $1++ optionnels en bleu, sortie script sur erreur, log $1 si $operation=upgrade
f__error(){ # 18/12/2017
f__error(){ # 07/O6/2018
local depart=1 i
echo -e "\n$RED $script $version, erreur critique: $1 $STD"
echo -e "\\n$RED $script $version, erreur critique: $1 $STD" >&2
for (( i=2 ; i<=$# ; i++ )); do
echo -e " $BLUE${!i}$STD"
echo -e " $BLUE${!i}$STD" >&2
done
echo
[ "$operation" == "upgrade" ] && f__log "$script $version: $1"
@ -84,16 +123,20 @@ f__error(){ # 18/12/2017
}
# affichage en bleu, si $1=raw pas de ligne vide à la fin, si $1=log alors uniquement $2 logué, combiné: $1="log:raw"
f__info(){ # 05/03/2018
local depart=1 i
f__info(){ # 07/06/2018
local depart=1 log i
if [[ "$1" =~ "raw" || "$1" =~ "log" ]]; then
depart=2
fi
if [[ "$1" =~ "log" ]]; then
f__log "$( sed -E 's/\\t//;s/\\n// ' <<< "$2" | xargs )"
log="$2"
log=${log//$'\t'}
log=${log//$'\n'}
f__trim log
f__log "$log"
fi
for (( i="$depart" ; i<=$# ; i++ )); do
for (( i=depart ; i<=$# ; i++ )); do
echo -e " $BLUE${!i}$STD"
done
[[ "$1" =~ raw ]] || echo
@ -111,12 +154,30 @@ f__log(){ # 05/03/2018
fi
}
# $1=bas-haut (ex: 0-5), nombre aléatoire entre bas & haut inclus, si [$2=seq] liste avec départ aléatoire
f__random(){ # 02/06/2018
local bas haut max rand start sequence xyz
[ "${1//*-*}" ] && return 1 # bad format, no -
bas=${1%-*}
haut=${1#*-}
max=$(( 32768 / ( haut + 1 ) * ( haut + 1 ) ))
while (( (rand=RANDOM) >= max )); do : ; done
if [ "$2" == "seq" ]; then
start=$(( bas + ( rand % (haut+1-bas) ) ))
for (( xyz=start; xyz <= haut; xyz++ )); do echo "$xyz"; done
(( (start-bas) > 0 )) && for (( xyz=bas; xyz < start; xyz++ )); do echo "$xyz"; done
return
fi
echo $(( bas + ( rand % (haut+1 -bas) ) ))
}
# 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(){ # 05/03/2018
local ENV_DEBIAN ireq table package commands command commandsMissing packagesMissing
f__requis(){ # 11/06/2018
local ENV_DEBIAN c_echo ireq cmds package commands command commandsMissing packagesMissing
if type -p "dpkg" &>/dev/null ; then
if type -p dpkg &>/dev/null ; then
ENV_DEBIAN="oui" # debian
fi
if type -t f__info &>/dev/null; then
@ -124,17 +185,11 @@ f__requis(){ # 05/03/2018
else
c_echo="echo -e" # f__info existe? sinon echo
fi
for ireq in $1; do # pour tous les composants de la liste $1
table=( ${ireq//>/ } ) # split sur > évite manip $IFS
commands=( ${table[0]//|/ } ) # split sur |
if [ "${table[1]}" ]; then
package=${table[1]}
else
package=${commands[0]} # pas de packages dans les options, donc idem commands[0]
fi
for command in "${commands[@]}"; do # pour toutes les commandes
for ireq in $1; do
IFS='>' read -r cmds package <<< "$ireq" # ex: "awk|gawk>gawk wget file tar killall>psmisc"
mapfile -t -d '|' commands <<< "${cmds}"
[ -z "$package" ] && package=${commands[0]%$'\n'} # pas de packages dans les options, donc = commands[0]
for command in "${commands[@]%$'\n'}"; do
if type -p "$command" &>/dev/null ; then
unset commandsMissing packagesMissing
break
@ -162,82 +217,15 @@ f__requis(){ # 05/03/2018
[ "$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(){ # 06/03/2018
local nb sudo isudo options nbDefault=3
# $@=cmd à lancer en root avec su ou sudo. si sudo possible: prioritairesu su
f__sudo(){ # 11/06/2018
# détermination sudo possible
if sudo -v &>/dev/null && [ $EUID -ne 0 ] ; then
sudo="sudo su --preserve-environment -c "
sudo su --preserve-environment -c "$@"
else
sudo="su --preserve-environment -c "
echo -n "[su] "
su --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 -en "\n[su] Mot de passe root : "
$sudo "$options" 2>/dev/null && break
[ "$isudo" == "$nb" ] && return 1
done
echo
fi
}
# test connectivité ping, $1=-4|-6, par défaut -4, return 1 si échec
f__test_cnx(){ # 08/03/2018
local proto="-4" cmd_ping iip timeout
declare -a ping_test
if [ "$1" == "-6" ]; then
proto="-6"
ping_test=(
2001:41d0:2:73d4::100 # ns10.fr.dns.opennic.glue
2a00:6d40:60:6a7f::1 # ns1.tus.it.dns.opennic.glue
2001:41d0:302:2100::949 # ns1.hau.fr.dns.opennic.glue
2001:910:800::12 # ns0.fdn.fr
2001:67c:2178:8::16 # conncheck.opensuse.org
2001:910:800::40 # ns1.fdn.fr
)
#~ [ -h "$( type -p ping6 2>/dev/null )" ] && cmd_ping="ping -6" || cmd_ping="ping6"
else
ping_test=(
51.254.141.22 # ns1.hau.fr.dns.opennic.glue
94.177.171.127 # ns1.tus.it.dns.opennic.glue
87.98.175.85 # ns10.fr.dns.opennic.glue
80.67.169.12 # ns0.fdn.fr
195.135.221.140 # conncheck.opensuse.org
80.67.169.40 # ns1.fdn.fr
)
#~ [ -h "$( type -p ping4 2>/dev/null )" ] && cmd_ping="ping -4" || cmd_ping="ping4"
fi
for timeout in 1 0; do # 2 passes, timeout 1s, si fail, timeout standard
cmd_ping="ping -c1 -w$timeout"
for iip in "${ping_test[@]}"; do
if eval "$cmd_ping" "$iip" &>/dev/null ; then
return 0 # sortie quand ok
break 2
else
echo -e "\t ip de test connectivité en échec ($iip)" 1>&2
fi
done
done
return 1 # sortie en échec
}
# user ayant initié la session graphique, assigne $fu_user
@ -307,7 +295,7 @@ f__wcv(){ # 09/03/2018
# si $2=print affiche url testée & entêtes http & location, return 0
# si $2=loc affiche seulement location, return 0
# si $2=test return 0 si ok, return 1 si KO
f__wget_test(){ # 22/02/2018
f__wget_test(){ # 07/06/2018
local file_test_wget="/tmp/testWget-$script" retourWget retourHttp location
wget -Sq --timeout=5 --tries=2 --user-agent="$user_agent" --spider --save-headers "$1" &>"$file_test_wget"
@ -331,9 +319,9 @@ f__wget_test(){ # 22/02/2018
if [ "$2" == "print" ]; then
if [ "$retourWget" != "0" ]; then
echo " erreur wget: erreur $RED$retourWget"
echo -e "$BLUE $1$STD\t$RED $retourHttp$STD"
echo -e "$BLUE $1$STD\\t$RED $retourHttp$STD"
else
echo -e "$BLUE $1$STD\t$GREEN $retourHttp$STD"
echo -e "$BLUE $1$STD\\t$GREEN $retourHttp$STD"
fi
fi
if [ "$2" == "print" ] || [ "$2" == "loc" ]; then
@ -345,28 +333,29 @@ f__wget_test(){ # 22/02/2018
if [ "$retourWget" != "0" ]; then
rm -f "$file_test_wget"
f__error "wget, erreur $retourWget" "$1" "$YELLOW$retourHttp" "$location"
echo -e "$RED erreur wget, $retourWget \n $1 \n $YELLOW$retourHttp \n $location$STD" # pour les diags
echo -e "$RED erreur wget, $retourWget \\n $1 \\n $YELLOW$retourHttp \\n $location$STD" # pour les diags
return 1
fi
if grep -q '200' <<< "$retourHttp"; then
echo -e "$GREEN\ntout est ok, réessayer$STD\n"
echo -e "$GREEN\\ntout est ok, réessayer$STD\\n"
fi
rm -f "$file_test_wget"
exit 0
}
f_affichage(){ # 09/03/2018
local affichage_text=" _ ___
__ _ ___| |_|_ _|_ __
/ _' |/ _ \ __|| || '_ \
| (_| | __/ |_ | || |_) |
\__, |\___|\__|___| .__/
|___/ |_|"
f_affichage(){ # 15/06/2018
(( x_logo == 1 )) && return
x_logo=1
clear
echo "$BLUE$affichage_text"
clear 2>/dev/null || tput clear 2>/dev/null
echo -n "$BLUE"
cat <<- end
_ ___
__ _ ___| |_|_ _|_ __
/ _' |/ _ \ __|| || '_ \
| (_| | __/ |_ | || |_) |
\__, |\___|\__|___| .__/
|___/ |_|
end
tput cuu1 # une ligne plus haut
tput cuf 10 # 10 caractères à droite
echo -n "$YELLOW$version"
@ -374,34 +363,157 @@ f_affichage(){ # 09/03/2018
echo -e "$date$STD\n"
}
f_help(){ # 24/01/2018
local ligne help=(
"-----------------------------------------------------------------------"
"${GREEN}./getIp$STD : exécution script"
"${GREEN}getIp$STD : exécution script installé dans le système"
""
"ce script requiert une des commandes suivantes pour déterminer l'ip publique:"
" dig (dnsutils) | wget | curl | telnet | nc"
""
"$BOLD""options:$STD"
"$BLUE -4$STD, --ip4 : affiche ipv4 public"
"$BLUE -6$STD, --ip6 : affiche ipv6 public"
"$BLUE -46$STD --public : affiche ipv4 & ipv6 public"
"$BLUE ''$STD, --local : affiche adresses mac / ip privées / passerelle"
"$BLUE -us$STD : upgrade spécial du script en place (sans être installé)"
"-----------------------------------------------------------------------"
"$BLUE./$script -i$STD : installation du script dans le système $RED(root)$STD"
"$BLUE$script -h$STD, --help : affichage aide"
"$BLUE$script -r$STD, --remove : désinstallation du script $RED(root)$STD"
"$BLUE$script -u$STD, --upgrade : mise à jour script"
"$BLUE$script -v$STD, --version : version du script"
f_help(){ # 15/06/2018
cat <<- end
${GREEN}./getIp :$STD exécution script
${GREEN}getIp :$STD exécution script installé dans le système
ce script requiert une des commandes suivantes pour déterminer l'ip publique:
dig (dnsutils) | wget | curl
-----------------------------------------------------------------------
$BLUE$script -4$STD, --ip4 : affiche ipv4 public
$BLUE$script -6$STD, --ip6 : affiche ipv6 public
$BLUE$script -46$STD --public : affiche ipv4 & ipv6 public
$BLUE$script ''$STD, --local : affiche adresses mac / ip privées / passerelle
$BLUE$script -us$STD : upgrade spécial du script en place (sans être installé)
-----------------------------------------------------------------------
$BLUE./$script -i$STD : installation du script dans le système $RED(root)$STD
$BLUE$script -h$STD, --help : affichage aide
$BLUE$script -r$STD, --remove : désinstallation du script $RED(root)$STD
$BLUE$script -u$STD, --upgrade : mise à jour script
$BLUE$script -v$STD, --version : version du script
-----------------------------------------------------------------------
plus d'infos: $GREEN$url_notice$STD
end
#~ tput cuu1 # une ligne plus haut
}
# $1 [-4|-6], par défaut -4, affiche ip pub, return 1 on failure
# requiert f__cnx & f_ip_validate & f__random & f__log
f_ip_pub(){ # 16/06/2018
local proto="-4" ip_pub base_size cmd sequence xyz server user_agent="Mozilla/5.0 Firefox"
declare -a base cmds raw4 raw6 dns4 dns6
{ # ip servers
raw4=(
v4.ident.me # raw ip4 only
ipv4.whatismyip.akamai.com # raw ip4 only
alma.ch/myip.cgi # raw ip4 only
api.infoip.io/ip # raw ip4 only
api.ipify.org # raw ip4 only
myip.dnsdynamic.org # raw ip4 only
ipecho.net/plain # raw ip4 only
ipinfo.io/ip # raw ip4 only
eth0.me # raw ip4 only
# checkip.amazonaws.com # raw ip4 only lent O4/2018
#~ ifconfig.me/ip # raw ip4 only pas fiable
)
tput cuu1 # une ligne plus haut
for ligne in "${help[@]}"; do
echo -e " $ligne"
raw6=(
v6.ident.me # raw, ip6 defaut
ipv6.whatismyip.akamai.com # raw, ip6 defaut
canhazip.com # raw, ip6 defaut
ip.tyk.nu # raw, ip6 defaut
myexternalip.com/raw # raw, ip6 defaut parfois ip4
smart-ip.net/myip # raw, ip6 defaut ! requiert user-agent
diagnostic.opendns.com/myip # raw, ip6 defaut
icanhazip.com # raw, ip6 defaut
wgetip.com # raw, ip6 defaut
wtfismyip.com/text # raw, ip6 defaut
l2.io/ip # raw, ip6 defaut
tnx.nl/ip # raw, ip6 defaut
bot.whatismyipaddress.com # raw, ip6 defaut pb parfois sort ip4
#~ ipof.in/txt # raw, ip6 defaut NRP
#~ ident.me # raw, ip6 defaut
)
dns4=(
"A myip.opendns.com @resolver1.opendns.com"
"A myip.opendns.com @resolver2.opendns.com"
"A myip.opendns.com @resolver3.opendns.com"
"A myip.opendns.com @resolver4.opendns.com"
"A whoami.akamai.net @ns1-1.akamaitech.net"
)
dns6=(
"AAAA myip.opendns.com @resolver1.ipv6-sandbox.opendns.com"
"AAAA myip.opendns.com @resolver2.ipv6-sandbox.opendns.com"
"TXT o-o.myaddr.l.google.com @ns1.google.com"
)
}
[[ "$1" == '-6' || "$1" == '6' ]] && proto="-6"
type -p host &>/dev/null && cmds+=( "host -R0 -W1 -t " ) # deprecated
type -p dig &>/dev/null && cmds+=( "dig +short +timeout=1 +retry=1 " )
type -p wget &>/dev/null && cmds+=( "wget --user-agent=$user_agent --quiet --timeout=1 --tries=1 -o /dev/null -O - " )
type -p curl &>/dev/null && cmds+=( "curl --silent --location --retry 0 --max-time 1 " )
if (( ${#cmds[@]} == 0 )); then
echo "f_ip_pub(): no available commands (host|dig|wget|curl)" >&2
return
fi
for cmd in "${cmds[@]}"; do
if [[ "$proto" == '-4' && "$cmd" =~ ^(host|dig) ]] ; then
base=( "${dns4[@]}" )
elif [[ "$proto" == '-6' && "$cmd" =~ ^(host|dig) ]] ; then
base=( "${dns6[@]}" )
elif [[ "$proto" == '-4' && "$cmd" =~ ^(wget|curl) ]] ; then
base=( "${raw4[@]}" )
elif [[ "$proto" == '-6' && "$cmd" =~ ^(wget|curl) ]] ; then
base=( "${raw6[@]}" )
fi
base_size=$(( ${#base[@]} - 1 )) # array index 0
sequence=$( f__random "0-$base_size" seq ) # range: 0 to base_size
for ii in $sequence; do
read -r -a server <<< "${base[$ii]}"
[[ $cmd =~ ^host ]] && server=( "${server[@]//@}" )
ip_pub=$( $cmd "${server[@]}" )
ip_pub=${ip_pub##*has address } # extraction command host
ip_pub=${ip_pub##*has IPv6 address } # extraction command host
ip_pub=${ip_pub#*\"} # extraction o-o.myaddr.l.google.com
ip_pub=${ip_pub%\"*} # extraction o-o.myaddr.l.google.com
f_ip_validate "$1" "$ip_pub" || unset ip_pub
[ "$ip_pub" ] && break 2 # exit if valid ip
done
done
echo -e "$STD\n plus d'infos: $GREEN$url_notice\n$STD"
if [ -z "$ip_pub" ]; then
if type -t f__log &>/dev/null && ! f__cnx "$proto" ; then # f__log() exists & no connection
f__log --error "f_ip_pub(): no connection"
fi
return 1
fi
echo "$ip_pub"
}
# [-4|-6] protocole par défaut -4, IP, return 0|1|2, 1 ip invalide, 2 ipv4 privée
f_ip_validate(){ # 17/05/2018
local proto="-4" ip reg regex regex_priv="zzz" #ip6: https://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses ()https://stackoverflow.com/a/17871737/9580455)
while (( $# )) ; do
case "$1" in
-6 | 6 ) proto='-6' ;;
-4 | 4 ) proto='-4' ;;
* ) ip="$1" ;;
esac
shift
done
if [[ "$proto" == "-6" ]]; then
regex="^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$"
proto="-6"
else
reg="(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])"
regex="^$reg\\.$reg\\.$reg\\.$reg$"
regex_priv="^(127\\.$reg|10\\.$reg|172\\.(1[6-9]|2[0-9]|3[0-1])|192\\.168)\\.$reg\\.$reg$"
fi
if [[ "$ip" =~ $regex_priv ]]; then
return 2
elif [[ ! "$ip" =~ $regex ]]; then
return 1
fi
}
# f_pr "1|2|3|titre1|titre2|hl|quote|flush" "texte" '[CONDITION test]'
@ -440,6 +552,7 @@ f_pr(){ # 09/03/2018
fi
}
# affichage ip, local
fi_ip(){ # 09/03/2018
local ifn_p4 text
@ -474,15 +587,15 @@ fi_ip(){ # 09/03/2018
echo -en "$text\n" #>> "$fileOutput"
}
# $1=-4|-6|-46 protocole
fi_ip_pub(){ # 09/03/2018
local itest option="$1"
# $1=-4|-6|-46 protocole, affichage ip publiques
fi_ip_pub(){ # 15/06/2018 SPÉCIFIQUE
local itest option="$1" ippub
option=${option//-46/-4 -6}
for itest in $option; do
itest=-${itest//-}
if figet_ip_pub "$itest" ; then
echo "$BOLD$fg_ip_pub$STD"
if ippub=$(f_ip_pub "$itest"); then
echo "$BOLD$ippub$STD"
else
echo "pas de connectivité ipv${itest#-}"
fi
@ -549,114 +662,11 @@ figet_ip(){ # 06/03/2018
fg_mac=${fg_mac%[[:cntrl:]]} # suppression dernier $'\n'
}
# $1=-4|-6, assigne $fg_ip_pub
figet_ip_pub(){ # 08/03/2018
local dig_test ip_test telnet_test iip
list_ip4(){ # testé 11/12/2017
ip_test=( # pas de https
http://whatismyip.akamai.com
http://eth0.me
ipinfo.io/ip # http & https
http://alma.ch/myip.cgi # peu fiable curl
http://checkip.amazonaws.com # peu fiable wget
api.infoip.io/ip # http & https fiable wget
api.ipify.org # http & https fiable wget
http://ipecho.net/plain # peu fiable wget / curl
# http://ipof.in/txt # fail wget
)
dig_test=(
whoami.akamai.net/@ns1-1.akamaitech.net
myip.opendns.com/@resolver1.opendns.com
myip.opendns.com/@resolver2.opendns.com
myip.opendns.com/@resolver3.opendns.com
myip.opendns.com/@resolver4.opendns.com
)
telnet_test=( 212.83.150.199 4.ifcfg.me )
}
list_ip6(){ # testé 11/12/2017
ip_test=(
http://ipv6.whatismyip.akamai.com
ip.tyk.nu # http & https
wgetip.com # http & https
l2.io/ip # http & https peu fiable wget
icanhazip.com # http & https peu fiable wget
http://bot.whatismyipaddress.com # peu fiable wget
https://canhazip.com # peu fiable wget
https://tnx.nl/ip # peu fiable wget
ident.me # http & https peu fiable curl
)
dig_test=(
-6/myip.opendns.com/aaaa/@resolver1.ipv6-sandbox.opendns.com
-6/myip.opendns.com/aaaa/@resolver2.ipv6-sandbox.opendns.com
)
telnet_test=( 2001:bc8:3cc9:100::1 6.ifcfg.me )
}
unset fg_ip_pub
# assignation variables & test connectivité
if [ "$1" == "-4" ]; then
f__test_cnx "-4" || return 1 # test connectivité ipv4
list_ip4
elif [ "$1" == "-6" ]; then
f__test_cnx "-6" || return 1 # test connectivité ipv6
list_ip6
fi
# TELNET
if type -p telnet &>/dev/null && [ -z "$fg_ip_pub" ]; then
for iip in "${telnet_test[@]}"; do
fg_ip_pub=$( telnet "$iip" 23 2>/dev/null )
fg_ip_pub=${fg_ip_pub#*Your IP*is }
[ "$fg_ip_pub" ] && break
done
fi
# DIG
if type -p dig &>/dev/null && [ -z "$fg_ip_pub" ]; then
for iip in "${dig_test[@]}"; do
fg_ip_pub=$( eval dig +short "${iip//\// }" )
[ "$fg_ip_pub" ] && break
done
fi
# WGET
if type -p wget &>/dev/null && [ -z "$fg_ip_pub" ]; then
cmd="wget --quiet --tries=1 -o /dev/null -O - "
for iip in "${ip_test[@]}"; do
fg_ip_pub=$( eval "$cmd" "$iip" )
[ "$fg_ip_pub" ] && break
done
fi
# CURL
if type -p curl &>/dev/null && [ -z "$fg_ip_pub" ]; then
cmd="curl --silent --location --retry 0 "
for iip in "${ip_test[@]}"; do
fg_ip_pub=$( eval "$cmd" "$iip" )
[ "$fg_ip_pub" ] && break
done
fi
# NC
if type -p nc &>/dev/null && [ -z "$fg_ip_pub" ] && [ "$1" == "-4" ]; then
for iip in "${telnet_test[@]}"; do
fg_ip_pub=$( nc "$iip" 23 2>/dev/null )
fg_ip_pub=${fg_ip_pub#*Your IP*is }
[ "$fg_ip_pub" ] && break
done
fi
if [ -z "$fg_ip_pub" ]; then
f__error "il manque une des commandes suivantes:\n" \
"dig / wget / curl / telnet / nc ?\n" \
"ou les ip de test sont devenues défaillantes ?\n" \
"réessayer avant de d'approndir les diagnostiques"
fi
}
# anacron hebdomadaire, via cron horaire, $1=upgrade|install|remove
fscript_cronAnacron(){ # 07/03/2018
fscript_cronAnacron(){ # 11/06/2018
local dirAnacron dirSpool fileAnacron
type -t fscript_cronAnacron_special &>/dev/null && 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"
@ -668,7 +678,7 @@ fscript_cronAnacron(){ # 07/03/2018
echo "7 10 $script nice $script_install --upgrade 1>/dev/null" > "$fileAnacron" # juste erreurs en syslog
## anacron journalier pour dev logname
if [ -e "$fileDev" ]; then
echo "1 00 $script""Dev nice $script_install --upgrade 1>/dev/null" >> "$fileAnacron"
echo "1 00 ${script}Dev nice $script_install --upgrade 1>/dev/null" >> "$fileAnacron"
fi
# création spool anacron utilisateur
mkdir -p "$dirSpool"
@ -680,64 +690,72 @@ fscript_cronAnacron(){ # 07/03/2018
grep -q "$script" "/etc/crontab" || echo f__error "inscription crontab"
;;
remove )
rm -f "${dirSpool:?}/$script"* 2>/dev/null
rm -f "${dirSpool:?}/$script"*
rm -f "$fileAnacron"
rmdir "$${dirSpool:?}" "${dirAnacron:?}" 2>/dev/null
;;
esac
}
# [$1=quiet], assigne $ver_script_install, $ver_script_online, $script_a_jour=ok|KO
# shellcheck disable=SC2120
# SC2120 function references arguments, but none are ever passed. (quiet)
fscript_get_version(){ # 06/03/2018
x_script_get_version=1
# assigne $ver_script_install, $ver_script_online, $script_a_jour=ok|KO
fscript_get_version(){ # 09/06/2018
x_script_get_version=1
# version online
if ! ver_script_online=$( wget -q --timeout=15 -o /dev/null -O - "$url_script" | grep -m1 '^version=' | cut -d'=' -f2 ); then
if ver_script_online=$( wget -q --timeout=15 -o /dev/null -O - "$url_script" ); then
ver_script_online=${ver_script_online#*version=}
read -r ver_script_online <<< "$ver_script_online"
else
f__wget_test "$url_script"
fi
# version installée
if [ -e "$script_install" ]; then
ver_script_install=$( grep -m1 '^version=' "$script_install" | cut -d'=' -f2 )
while read -r ; do
if [[ "$REPLY" =~ ^version= ]]; then
ver_script_install=${REPLY#*=}
fi
done < "$script_install"
fi
# maj ?
if [[ "$ver_script_online" && "$script_install" ]]; then
[ "$ver_script_install" != "$ver_script_online" ] && script_a_jour="KO" || script_a_jour="ok"
if [ "$ver_script_install" != "$ver_script_online" ]; then
script_a_jour="KO"
else
script_a_jour="ok"
fi
fi
[ "$ver_script_online" ] || ver_script_online="${RED}n/a"
[ "$ver_script_install" ] || ver_script_install="Non installé"
[ "$1" == "quiet" ] && return 0
# affichage
ver_script_online=${ver_script_online:="${RED}n/a$STD"}
ver_script_install=${ver_script_install:="Non installé"}
f__info "raw" "script en place: $GREEN$ver_script_install"
f__info "script en ligne: $YELLOW$ver_script_online"
}
fscript_install(){ # 24/02/2018
fscript_install(){ # 09/06/2018
if grep -Eq "$script_install|/usr/bin/$script" <<< "$0"; then
f__info "${RED}l'installation dans le système doit se faire depuis le script non installé $GREEN(./$script -i )"
return 1
fi
type -t fscript_install_special &>/dev/null && 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/
cp -d "$0" "$script_install"
ln -s "$script_install" "/usr/bin/$script" &>/dev/null
chmod 775 "$script_install" # rwx rwx r-x, proprio fu_user
cp "$0" "$script_install"
ln -s "$script_install" "/usr/bin/$script" 2>/dev/null
chmod 755 "$script_install"
# cron/anacron install
fscript_cronAnacron "install"
# création fichier log
touch "$script_logs"
chmod 664 "$script_logs" # rw- rw- r--, proprio fu_user
chmod 644 "$script_logs"
chown "$fu_user:" "$script_logs" "$script_install"
[ -e "$fileDev" ] || rm -f "$0" ## on efface pas si fileDev (dev)
f__info "log" "$script $version installé dans le système." "maintenant, appel du script par: $GREEN$script$BLUE (sans ./)"
}
fscript_remove(){ # 24/02/2018
fscript_remove(){ # 09/06/2018
if ! grep -Eq "$script_install|/usr/bin/$script" <<< "$0"; then
f__info "${RED}cette fonction doit être appelée depuis le script installé dans le système $GREEN($script -r)"
@ -748,21 +766,22 @@ fscript_remove(){ # 24/02/2018
return 1
fi
type -t fscript_remove_special &>/dev/null && 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 /opt, lien /usr/bin
rm -f "$script_install"
unlink "/usr/bin/$script" &>/dev/null
unlink "/usr/bin/$script" 2>/dev/null
# cron/anacron remove
fscript_cronAnacron "remove"
f__info "log" "$script $version supprimé du système."
}
# si upgrade en place, $1 != "", [$1 message info]
fscript_update(){ # 07/03/2018
local dirTemp="/tmp/$script-maj" upgradeEnPlace="$1"
# $1: update standard $1=std, si update en place $1=message d'info
fscript_update(){ # 11/06/2018
local dirTemp="/tmp/$script-maj" upgradeEnPlace
type -t fscript_update_special &>/dev/null && fscript_update_special # test, si fonction spécifique, appel
[ "$1" != 'std' ] && upgradeEnPlace="$1"
type -t fscript_update_special &>/dev/null && fscript_update_special # test, si fonction spécifique, appel
if [ -z "$upgradeEnPlace" ] && ! grep -Eq "$script_install|/usr/bin/$script" <<< "$0"; then
f__info "${RED}cette fonction doit être appelée depuis le script installé dans le système $GREEN($script -u)"
return 1
@ -776,19 +795,19 @@ fscript_update(){ # 07/03/2018
fi
mkdir -p "$dirTemp"
if ! wget -q --tries=2 --timeout=15 -o /dev/null -O "$dirTemp/$script" "$url_script"; then
rm -fr "${dirTemp:?}"
rm -fr "$dirTemp"
f__wget_test "$url_script"
fi
if grep -q '#!/bin/bash' "$dirTemp/$script" && grep -q '^### END CONTROL' "$dirTemp/$script"; then
cp -d "$dirTemp/$script" "$script_install"
chmod 775 "$script_install" # rwx rwx r-x, proprio fu_user
cp "$dirTemp/$script" "$script_install"
chmod 755 "$script_install"
chown "$fu_user:" "$script_install"
[ -z "$upgradeEnPlace" ] && fscript_cronAnacron "upgrade"
f__info "log" "$script mis à jour en version $ver_script_online $upgradeEnPlace"
else
f_info "log" "$script: échec update" "mauvais téléchargement, réessayer plus tard"
fi
rm -fr "${dirTemp:?}"
rm -fr "$dirTemp"
}
test_user(){ # 09/03/2018
@ -808,13 +827,10 @@ test_user(){ # 09/03/2018
fi
}
# shellcheck disable=SC2034
# SC2034 foo appears unused. Verify it or export it.
prg_init(){ # 09/03/2018
prg_init(){ # 15/06/2018
PATH='/usr/sbin:/usr/bin:/sbin:/bin'
TERM=xterm
IFS_INI="$IFS"
IFS=$' \t\n'
export PATH TERM IFS
@ -876,11 +892,11 @@ for j in $options; do
-r | --remove ) # suppression du script dans le système
fscript_remove ;;
-u | --upgrade ) # upgrade script si maj possible
operation="upgrade" # log si f__error
fscript_update
operation="upgrade" # log si f__error
fscript_update std # std argument obligatoire pour upgrade normal
exit ;;
-us ) # upgrade spécial
operation="upgrade" # log si f__error
operation="upgrade" # log si f__error
script_install="$( dirname "$0" )/$script"
fscript_update "update en place" # redéfinition répertoire install avec celui du script
exit ;;