Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
utilisateurs:tawal:scripts:apt-history-research [12/03/2023 22:36] Tawal [Apt History Research] |
utilisateurs:tawal:scripts:apt-history-research [14/05/2023 13:22] Tawal [Outil de recherche dans l'historique d'apt] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Outil de recherche dans l'historique d'APT ====== | + | ====== Outil de recherche dans l'historique d'apt ====== |
+ | <note>\\ | ||
+ | Mise à jour le : 12/05/2023</note>\\ | ||
- | * Outil de recherche dans l'historique d'apt. | ||
- | * Nécessite //gawk// : ''apt install gawk'' | + | * Outil de recherche dans l'historique d'apt. |
+ | * Recherche par motif de nom de paquet | ||
+ | * Recherche par la date | ||
+ | * Recherche par la commande d'appel d'//apt// | ||
+ | * Recherche par le type d'action d'//apt// | ||
+ | * Recherche possible dans les fichiers de logs archivés | ||
+ | * Affichage humainement lisible | ||
+ | * Script directement fonctionnel (pas de modification nécessaire). | ||
+ | <note warning>Nécessite //gawk// et //zcat// : <code root>apt install gawk gzip</code></note> | ||
===== L'aide ===== | ===== L'aide ===== | ||
- | <code>Apt History Research - ahr | + | <code>Apt History Research - ahr - 2023-05-12-22:05 |
Usage : | Usage : | ||
ahr [-a | -z N] [--apt [-0]] [-c COMMAND] [-d DATE] [-t TYPE] MOTIF | ahr [-a | -z N] [--apt [-0]] [-c COMMAND] [-d DATE] [-t TYPE] MOTIF | ||
Ligne 51: | Ligne 60: | ||
Tawal®©</code> | Tawal®©</code> | ||
===== Le script ===== | ===== Le script ===== | ||
- | (mis à jour le 10/03/2023 21:22) | + | (mis à jour le 12/05/2023 22:05) |
<file bash ahr>#!/bin/bash | <file bash ahr>#!/bin/bash | ||
Ligne 60: | Ligne 69: | ||
# Nécessite : gawk (apt install gawk) | # Nécessite : gawk (apt install gawk) | ||
# | # | ||
- | version=2023-03-10 | + | version=2023-05-12-22:05 |
### Répertoire des logs d'apt (personnalisable) | ### Répertoire des logs d'apt (personnalisable) | ||
apt_folder="/var/log/apt" | apt_folder="/var/log/apt" | ||
Ligne 78: | Ligne 86: | ||
### Fonctions | ### Fonctions | ||
- | usage() | + | usage_quit() |
{ | { | ||
- | echo -e "Apt History Research - ahr | + | echo -e "Apt History Research - ahr - $version |
Usage : | Usage : | ||
${Surb}${0##*/} [-a | -z N] [--apt [-0]] [-c COMMAND] [-d DATE] [-t TYPE] MOTIF${Rst} | ${Surb}${0##*/} [-a | -z N] [--apt [-0]] [-c COMMAND] [-d DATE] [-t TYPE] MOTIF${Rst} | ||
Ligne 128: | Ligne 136: | ||
} | } | ||
- | version() | + | version_quit() |
{ | { | ||
echo "$version" | echo "$version" | ||
Ligne 134: | Ligne 142: | ||
} | } | ||
- | erreur() | + | erreur_quit() |
{ | { | ||
echo -n "${0##*/} : " | echo -n "${0##*/} : " | ||
- | [ "$1" = "log" ] && echo -e "Le fichier '$apt_folder/history.log' n'existe pas." | + | [ "$1" = "log" ] && echo -e "Le fichier '$apt_folder/history.log' n'existe pas." |
- | [ "$1" = "zip" ] && echo -e "Le fichier '$apt_folder/history.log.$2.gz' n'existe pas." | + | [ "$1" = "zip" ] && echo -e "Le fichier '$apt_folder/history.log.$2.gz' n'existe pas." |
- | [ "$1" = "opt" ] && echo -e "Option ${Surb}'$2'${Rst} non-reconnue." | + | [ "$1" = "opt" ] && echo -e "Option ${Surb}'$2'${Rst} non-reconnue." |
- | [ "$1" = "opt0" ] && echo -e "Option '${Surb}-0${Rst}' utilisée sans '${Surb}--apt${Rst}'." | + | [ "$1" = "opt0" ] && echo -e "Option '${Surb}-0${Rst}' utilisée sans '${Surb}--apt${Rst}'." |
- | [ "$1" = "motif" ] && echo -e "Motif absent ou pas d'utilisation d'une des options '${Surb}-c${Rst}' ou '${Surb}-d${Rst}' ou '${Surb}-t${Rst}'." | + | [ "$1" = "motif" ] && echo -e "Motif absent ou pas d'utilisation d'une des options '${Surb}-c${Rst}' ou '${Surb}-d${Rst}' ou '${Surb}-t${Rst}'." |
- | [ "$1" = "opt_az" ] && echo -e "Options '${Surb}-a${Rst}' et '${Surb}-z${Rst}' incompatibles." | + | [ "$1" = "opt_az" ] && echo -e "Options '${Surb}-a${Rst}' et '${Surb}-z${Rst}' incompatibles." |
- | [ "$1" = "opt_z" ] && echo -e "L'argument de l'option ${Surb}'-z'${Rst} doit être un nombre." | + | [ "$1" = "opt_z" ] && echo -e "L'argument de l'option ${Surb}'-z'${Rst} doit être un nombre." |
- | [ "$1" = "opt_t" ] && echo -e "L'option ${Surb}-t${Rst} ne prend que les mots ${Surb}Install${Rst}, ${Surb}Reinstall${Rst}, ${Surb}Upgrade${Rst}, ${Surb}Remove${Rst} et ${Surb}Purge${Rst}." | + | [ "$1" = "opt_t" ] && echo -e "L'option ${Surb}-t${Rst} ne prend que les mots ${Surb}Install${Rst}, ${Surb}Reinstall${Rst}, ${Surb}Upgrade${Rst}, ${Surb}Remove${Rst} et ${Surb}Purge${Rst}." |
- | [ "$1" = "opt_d" ] && echo -e "Date incorrecte : ${*:2}" | + | [ "$1" = "opt_d" ] && echo -e "Date incorrecte : ${*:2}" |
+ | [[ $1 =~ gawk|zcat ]] && echo -e "Nécessite ${Ital}${BASH_REMATCH[0]}${Rst} : apt install ${BASH_REMATCH[0]}" | ||
+ | | ||
exit 1 | exit 1 | ||
} >&2 | } >&2 | ||
Ligne 194: | Ligne 204: | ||
case $option in | case $option in | ||
a) opt_a="on" | a) opt_a="on" | ||
- | [ "$opt_z" ] && erreur opt_az | + | [ "$opt_z" ] && erreur_quit opt_az |
dezip_type="all" | dezip_type="all" | ||
;; | ;; | ||
Ligne 200: | Ligne 210: | ||
;; | ;; | ||
d) opt_d="$OPTARG" | d) opt_d="$OPTARG" | ||
- | test_opt opt_d "$opt_d" || erreur opt_d "$opt_d" | + | test_opt opt_d "$opt_d" || erreur_quit opt_d "$opt_d" |
;; | ;; | ||
z) opt_z="on" | z) opt_z="on" | ||
[ "$opt_a" ] && erreur opt_az | [ "$opt_a" ] && erreur opt_az | ||
- | test_opt opt_z "$OPTARG" || erreur opt_z | + | test_opt opt_z "$OPTARG" || erreur_quit opt_z |
dezip_type="one" | dezip_type="one" | ||
dezip_nb="$OPTARG" | dezip_nb="$OPTARG" | ||
;; | ;; | ||
- | h) usage | + | h) usage_quit |
;; | ;; | ||
t) opt_t="$OPTARG" | t) opt_t="$OPTARG" | ||
- | test_opt opt_t "$opt_t" || erreur opt_t | + | test_opt opt_t "$opt_t" || erreur_quit opt_t |
;; | ;; | ||
- | v) version | + | v) version_quit |
;; | ;; | ||
0) opt_null="on" | 0) opt_null="on" | ||
Ligne 219: | Ligne 229: | ||
-) case $OPTARG in | -) case $OPTARG in | ||
all) opt_a="on" | all) opt_a="on" | ||
- | [ "$opt_z" ] && erreur opt_az | + | [ "$opt_z" ] && erreur_quit opt_az |
dezip_type="all" | dezip_type="all" | ||
;; | ;; | ||
Ligne 228: | Ligne 238: | ||
;; | ;; | ||
date) opt_d="${!OPTIND}" | date) opt_d="${!OPTIND}" | ||
- | test_opt opt_d "$opt_d" || erreur opt_d | + | test_opt opt_d "$opt_d" || erreur_quit opt_d |
OPTIND=$((OPTIND+1)) | OPTIND=$((OPTIND+1)) | ||
;; | ;; | ||
Ligne 234: | Ligne 244: | ||
opt_z="on" | opt_z="on" | ||
[ "$opt_a" ] && erreur opt_az | [ "$opt_a" ] && erreur opt_az | ||
- | test_opt opt_z ${!OPTIND} || erreur opt_z | + | test_opt opt_z ${!OPTIND} || erreur_quit opt_z |
dezip_type="one" | dezip_type="one" | ||
dezip_nb=${!OPTIND} | dezip_nb=${!OPTIND} | ||
OPTIND=$((OPTIND+1)) | OPTIND=$((OPTIND+1)) | ||
;; | ;; | ||
- | help) usage | + | help) usage_quit |
;; | ;; | ||
type) opt_t=${!OPTIND} | type) opt_t=${!OPTIND} | ||
- | test_opt opt_t "$opt_t" || erreur opt_t | + | test_opt opt_t "$opt_t" || erreur_quit opt_t |
OPTIND=$((OPTIND+1)) | OPTIND=$((OPTIND+1)) | ||
;; | ;; | ||
- | version) version | + | version) version_quit |
;; | ;; | ||
- | *) erreur opt --"$OPTARG" | + | *) erreur_quit opt --"$OPTARG" |
;; | ;; | ||
esac | esac | ||
;; | ;; | ||
- | *) erreur opt -"$OPTARG" | + | *) erreur_quit opt -"$OPTARG" |
;; | ;; | ||
esac | esac | ||
done | done | ||
shift $((OPTIND-1)) | shift $((OPTIND-1)) | ||
+ | |||
+ | if ! hash gawk 2>dev/null | ||
+ | then | ||
+ | erreur_quit gawk | ||
+ | fi | ||
+ | |||
+ | if ! hash zcat 2>dev/null | ||
+ | then | ||
+ | erreur_quit zcat | ||
+ | fi | ||
if [ "$1" ] | if [ "$1" ] | ||
Ligne 262: | Ligne 282: | ||
elif [ ! "$opt_c" ] && [ ! "$opt_d" ] && [ ! "$opt_t" ] | elif [ ! "$opt_c" ] && [ ! "$opt_d" ] && [ ! "$opt_t" ] | ||
then | then | ||
- | erreur motif | + | erreur_quit motif |
fi | fi | ||
if [ "$opt_null" ] && [ ! "$opt_apt" ] | if [ "$opt_null" ] && [ ! "$opt_apt" ] | ||
then | then | ||
- | erreur opt0 | + | erreur_quit opt0 |
fi | fi | ||
Ligne 280: | Ligne 300: | ||
zap="on" | zap="on" | ||
else | else | ||
- | erreur log | + | erreur_quit log |
fi | fi | ||
fi | fi | ||
Ligne 289: | Ligne 309: | ||
# shellcheck disable=SC1004 | # shellcheck disable=SC1004 | ||
gawk -vrech="$rech" -vopt_c="$opt_c" -vopt_d="$opt_d" -vopt_t="$opt_t" -vapt="$opt_apt" -vnull="$opt_null" ' | gawk -vrech="$rech" -vopt_c="$opt_c" -vopt_d="$opt_d" -vopt_t="$opt_t" -vapt="$opt_apt" -vnull="$opt_null" ' | ||
+ | function afficher(verb, zero, mess, Array, ArrayTmp, tmp, k,n) { | ||
+ | if (0 in Array) { | ||
+ | if (!verb && mess) {print mess} | ||
+ | for (n in Array) { | ||
+ | if (tmp && Array[n] ~ /,/) { | ||
+ | ArrayTmp[k++]=Array[n] | ||
+ | continue | ||
+ | } | ||
+ | if (!verb) {printf("\t")} | ||
+ | printf(Array[n]) | ||
+ | if (zero) {printf("\0")}else{printf("\n")} | ||
+ | } | ||
+ | } | ||
+ | } | ||
BEGIN { | BEGIN { | ||
PROCINFO["sorted_in"]="@val_str_asc" | PROCINFO["sorted_in"]="@val_str_asc" | ||
Ligne 369: | Ligne 403: | ||
if (demand) {print "Demandeur : "demand} | if (demand) {print "Demandeur : "demand} | ||
} | } | ||
- | if (0 in I) { | + | |
- | if (!apt) {print "Installés :"} | + | afficher(apt, null, "Installés :", I, Itmp, "on") |
- | for (w in I) { | + | afficher(apt, null, "", Itmp) |
- | if (I[w] ~ /,/) { | + | afficher(apt, null, "Upgradés :", U) |
- | Itmp[l++]=I[w] | + | afficher(apt, null, "Désinstallés :", R) |
- | continue | + | afficher(apt, null, "Purgés :", P) |
- | } | + | afficher(apt, null, "Réinstallés :", Re) |
- | if (!apt) {printf("\t")} | + | |
- | printf(I[w]) | + | |
- | if (null) {printf("\0")}else{printf("\n")} | + | |
- | } | + | |
- | } | + | |
- | if (0 in Itmp) { | + | |
- | for (tmp in Itmp) { | + | |
- | if (!apt) {printf("\t")} | + | |
- | printf(Itmp[tmp]) | + | |
- | if (null) {printf("\0")}else{printf("\n")} | + | |
- | } | + | |
- | } | + | |
- | if (0 in U) { | + | |
- | if (!apt) {print "Upgradés :"} | + | |
- | for (x in U) { | + | |
- | if (!apt) {printf("\t")} | + | |
- | printf(U[x]) | + | |
- | if (null) {printf("\0")}else{printf("\n")} | + | |
- | } | + | |
- | } | + | |
- | if (0 in R) { | + | |
- | if (!apt) {print "Désinstallés :"} | + | |
- | for (y in R) { | + | |
- | if (!apt) {printf("\t")} | + | |
- | printf(R[y]) | + | |
- | if (null) {printf("\0")}else{printf("\n")} | + | |
- | } | + | |
- | } | + | |
- | if (0 in P) { | + | |
- | if (!apt) {print "Purgés :"} | + | |
- | for (z in P) { | + | |
- | if (!apt) {printf("\t")} | + | |
- | printf(P[z]) | + | |
- | if (null) {printf("\0")}else{printf("\n")} | + | |
- | } | + | |
- | } | + | |
- | if (0 in Re) { | + | |
- | if (!apt) {print "Réinstallés : "} | + | |
- | for (w in Re) { | + | |
- | if (!apt) {printf("\t")} | + | |
- | printf(Re[w]) | + | |
- | if (null) {printf("\0")}else{printf("\n")} | + | |
- | } | + | |
- | } | + | |
if (!apt) { | if (!apt) { | ||
if (a>1) {s1="s"}else{s1=""} | if (a>1) {s1="s"}else{s1=""} | ||
Ligne 437: | Ligne 428: | ||
date="" | date="" | ||
demand="" | demand="" | ||
- | a=0; b=0; c=0; d=0; e=0; ok=0; ok1=0; l=0 | + | a=0; b=0; c=0; d=0; e=0; ok=0; ok1=0 |
} | } | ||
} | } | ||
Ligne 490: | Ligne 481: | ||
youtube-dl:amd64 (2021.06.06-1, 2021.12.17-1~bpo11+1) | youtube-dl:amd64 (2021.06.06-1, 2021.12.17-1~bpo11+1) | ||
1 paquet upgradé | 1 paquet upgradé | ||
+ | </code> | ||
+ | |||
+ | === Afficher l'historique des désinstallations d'unattended-upgrade dans le fichier archive 1 === | ||
+ | <code user>ahr -c unattended -t Remove -z1</code> | ||
+ | <code> | ||
+ | Date Début : 2023-04-29 23:34:02 | ||
+ | Date Fin : 2023-04-29 23:34:23 | ||
+ | Commande : /usr/bin/unattended-upgrade | ||
+ | Demandeur : tawal (1000) | ||
+ | Désinstallés : | ||
+ | linux-headers-5.10.0-20-amd64:amd64 (5.10.158-2) | ||
+ | 1 paquet désinstallé | ||
+ | |||
+ | |||
+ | Date Début : 2023-04-29 23:34:38 | ||
+ | Date Fin : 2023-04-29 23:34:48 | ||
+ | Commande : /usr/bin/unattended-upgrade | ||
+ | Désinstallés : | ||
+ | linux-headers-5.10.0-20-common:amd64 (5.10.158-2) | ||
+ | 1 paquet désinstallé | ||
+ | |||
+ | |||
+ | Date Début : 2023-04-29 23:35:05 | ||
+ | Date Fin : 2023-04-29 23:35:41 | ||
+ | Commande : /usr/bin/unattended-upgrade | ||
+ | Désinstallés : | ||
+ | linux-image-5.10.0-20-amd64:amd64 (5.10.158-2) | ||
+ | 1 paquet désinstallé | ||
</code> | </code> |