Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 05-10-2019 02:04:24

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

apt-history

Bonjour,

Le script qui suit reprend la même idée que la commande "yum history" que l'on trouve sur la famille des distributions Linux Fedora :


#!/usr/bin/perl -w

# Commande apt-history

use v5.10 ;
use Getopt::Long ;

my $base = "$ENV{HOME}/.apt-history" ;

GetOptions
    'update'      => \&update ,
    'list'        => \&list   ,
    'info=i'      => \&info   ,
    'remove=i'    => \&remove ,
    'help'    => \&help   ;

sub update
{
    use IO::Uncompress::Gunzip qw( gunzip $GunzipError ) ;

    my $log_files = "/var/log/apt/history.log*" ;
    my $n = 1 ;
    my $d ;
    my $h ;
    my $o ;
    my $c ;
    my $p ;

    dbmopen my %h , $base , 0644 ;

    say "" ;

    foreach ( sort { -M $b <=> -M $a } glob $log_files )
    {
  say "Traitement du fichier de log $_" ;

  my $f = IO::Uncompress::Gunzip -> new ( $_ ) or die "gunzip failed: $GunzipError\n" ;

  while ( <$f> )
  {
      if ( $_ =~ m/^Start-Date: (.{10,10}).*(.{8,8})/ )
      {
    ( $d , $h ) = ( $1 , $2 ) ;
    ( $c ) = <$f> =~ m/^Commandline: (.*)/ ;
    ( $o , $p ) = <$f> =~ m/^(.*?): (.*)/ ;
    ( $o , $p ) = <$f> =~ m/^(.*?): (.*)/ if $o eq "Requested-By" ;
    $p =~ s/\(.*?\)//g ;
    $p =~ s/, //g ;
    $h { $n++ } = "$d;$h;$o;$c;$p" ;
      }
  }
  close $f ;
    }
    dbmclose %h ;

    say "" ;
}

sub list
{
    use Term::ReadKey ;

    my ( $width_chars ) = GetTerminalSize() ;

    dbmopen my %h , $base , 0644 ;

    say "" ;

    foreach ( sort { $a <=> $b } keys %h )
    {
  my ( $d , $h , $o , $c ) = split ";" , $h { $_ } ;

  say substr sprintf ( "%5d | %s | %s | %-9s | %s" , $_ , $d , $h , $o , $c ) , 0 , $width_chars ;
    }

    dbmclose %h ;

    say "" ;
}

sub info
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;
    say "\nDate :\t\t$d" ;
    say "Heure :\t\t$h" ;
    say "Opération :\t$o" ;
    say "\nCommande :\n$c" ;
    say "\nPaquets mis en jeu:\n$p\n" ;

    dbmclose %h ;
}

sub remove
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;

    say "\napt -s --purge autoremove $p" ;
    say `apt -s --purge autoremove $p` ;

    dbmclose %h ;
}

sub help
{
    say "\napt-history 0.0.1\n" ;
    say "Usage : apt-history [options] argument\n" ;
    say "apt-history est un outil en ligne de commande qui permet de gérer l'historique des transactions sur les paquets deb.\n" ;
    say "Les options :" ;
    say "\t--update\t- importe les fichiers de logs dans la base de données locale.";
    say "\t--list\t\t- affiche l'historique des transactions sur les paquets." ;
    say "\t--info n\t- affiche les détails de la transaction n." ;
    say "\t--remove n\t- simule la désinstallation des paquets mis en jeux lors de la transaction n.\n" ;
}
 


En plus de perl, vous devrez, éventuellement, installer le paquet "libterm-readkey-perl" pour faire fonctionner ce script.

Par ailleurs, pensez à rendre le script exécutable avec 'chmod' par exemple.

Dites-moi s'il y a des choses que vous trouvez incorrectes.

Dernière modification par Beta-Pictoris (06-10-2019 14:12:11)

Hors ligne

#2 06-10-2019 11:43:48

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

Bonjour smile

Ne soyez pas timide ! smile

N'hésitez pas à tester ce truc et me dire s'il sert à quelque chose ! smile

Par ailleurs, je vois que l'indentation dans les balises de code perl est boguée. wink

Dernière modification par Beta-Pictoris (06-10-2019 11:44:34)

Hors ligne

#3 06-10-2019 13:52:50

otyugh
CA Debian-Facile
Lieu : Quimperlé/Arzano
Distrib. : Debian Stable
Inscription : 20-09-2016
Site Web

Re : apt-history

Ne connaissant pas yum de Fedora... x)

Tu pourrai faire une petite demo ? Genre quand j'avais fait un script pour ffmpeg, ça ne parlait à personne avant que je ponde une vidéo d'un "cas d'usage" tout simple : https://pouet.chapril.org/system/media_ … 1567014214

datalove-datalove-s1-2.png agendadulibre-lagendadulibre.png arzinfo-arzinfo.png

En ligne

#4 06-10-2019 14:24:39

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

Pour la vidéo, on verra plus tard.
Voici un exemple d'utilisation :

./apt-history --update


Traitement du fichier de log /var/log/apt/history.log.6.gz
Traitement du fichier de log /var/log/apt/history.log.5.gz
Traitement du fichier de log /var/log/apt/history.log.4.gz
Traitement du fichier de log /var/log/apt/history.log.3.gz
Traitement du fichier de log /var/log/apt/history.log.2.gz
Traitement du fichier de log /var/log/apt/history.log.1.gz
Traitement du fichier de log /var/log/apt/history.log
 


./apt-history --list


.........................................................................
  552 | 2019-09-20 | 23:46:55 | Install   | apt install racket
  553 | 2019-09-21 | 09:10:13 | Upgrade   | apt full-upgrade
  554 | 2019-09-21 | 09:13:12 | Purge     | apt --purge autoremove tuned
  555 | 2019-09-21 | 09:13:52 | Install   | apt install tlp
  556 | 2019-09-21 | 09:20:11 | Purge     | apt --purge autoremove tlp
  557 | 2019-09-22 | 20:27:46 | Install   | apt install perl-tk
  558 | 2019-09-24 | 19:04:03 | Upgrade   | /usr/bin/unattended-upgrade -d
  559 | 2019-09-25 | 07:54:44 | Upgrade   | /usr/bin/unattended-upgrade -d
  560 | 2019-09-25 | 07:54:48 | Upgrade   | /usr/bin/unattended-upgrade -d
  561 | 2019-09-25 | 07:54:59 | Upgrade   | /usr/bin/unattended-upgrade -d
  562 | 2019-09-28 | 13:52:34 | Upgrade   | /usr/bin/unattended-upgrade -d
  563 | 2019-09-28 | 13:52:38 | Upgrade   | /usr/bin/unattended-upgrade -d
  564 | 2019-09-28 | 13:53:03 | Upgrade   | /usr/bin/unattended-upgrade -d
  565 | 2019-09-28 | 13:53:07 | Upgrade   | /usr/bin/unattended-upgrade -d
  566 | 2019-09-28 | 13:53:11 | Upgrade   | /usr/bin/unattended-upgrade -d
  567 | 2019-09-28 | 13:53:15 | Upgrade   | /usr/bin/unattended-upgrade -d
  568 | 2019-09-28 | 18:22:50 | Install   | apt install libterm-readkey-perl/stable
  569 | 2019-09-29 | 22:15:29 | Upgrade   | /usr/bin/unattended-upgrade -d
  570 | 2019-10-01 | 21:17:10 | Install   | apt install msmtp
  571 | 2019-10-02 | 20:19:21 | Upgrade   | /usr/bin/unattended-upgrade -d
  572 | 2019-10-02 | 20:19:25 | Upgrade   | /usr/bin/unattended-upgrade -d
 


./apt-history --info 568


Date :    2019-09-28
Heure :   18:22:50
Opération :  Install

Commande :
apt install libterm-readkey-perl/stable

Paquets mis en jeu:
libterm-readkey-perl:amd64
 


 ./apt-history --remove 568


apt -s --purge autoremove libterm-readkey-perl:amd64

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

NOTE: Ceci n'est qu'une simulation !
      apt a besoin des privilèges du superutilisateur
      pour pouvoir vraiment fonctionner.
      Veuillez aussi noter que le verrouillage est désactivé,
      et la situation n'est donc pas forcément représentative
      de la réalité !
Lecture des listes de paquets…
Construction de l'arbre des dépendances…
Lecture des informations d'état…
Les paquets suivants seront ENLEVÉS :
  libterm-readkey-perl*
0 mis à jour, 0 nouvellement installés, 1 à enlever et 5 non mis à jour.
Purg libterm-readkey-perl [2.38-1]
 

Dernière modification par Beta-Pictoris (06-10-2019 14:26:07)

Hors ligne

#5 06-10-2019 14:32:54

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

A noter, il y a, aussi, une petite aide integrée :

 ./apt-history --help



apt-history 0.0.1

Usage : apt-history [options] argument

apt-history est un outil en ligne de commande qui permet de gérer l'historique des transactions sur les paquets deb.

Les options :
  --update  - importe les fichiers de logs dans la base de données locale.
  --list    - affiche l'historique des transactions sur les paquets.
  --info n  - affiche les détails de la transaction n.
  --remove n  - simule la désinstallation des paquets mis en jeux lors de la transaction n.
 

Hors ligne

#6 07-10-2019 08:42:25

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Buster/Sid/Rc-Buggy
Noyau : Linux (≥ 4.12)
(G)UI : i3-wm (≥ 4.13)
Inscription : 07-07-2008
Site Web

Re : apt-history

Plop,

Sympa comme script smile

J'ai tenté, j'ai eu quelques erreurs

apt-history --update


Traitement du fichier de log /var/log/apt/history.log.12.gz
Traitement du fichier de log /var/log/apt/history.log.11.gz
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN2> line 37.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN2> line 63.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN2> line 104.
Traitement du fichier de log /var/log/apt/history.log.10.gz
Traitement du fichier de log /var/log/apt/history.log.9.gz
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN6> line 18.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN6> line 53.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN6> line 59.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN6> line 65.
Traitement du fichier de log /var/log/apt/history.log.8.gz
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN8> line 68.
Traitement du fichier de log /var/log/apt/history.log.7.gz
Traitement du fichier de log /var/log/apt/history.log.6.gz
Traitement du fichier de log /var/log/apt/history.log.5.gz
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN14> line 187.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN14> line 210.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN14> line 222.
Traitement du fichier de log /var/log/apt/history.log.4.gz
Traitement du fichier de log /var/log/apt/history.log.3.gz
Traitement du fichier de log /var/log/apt/history.log.2.gz
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN20> line 41.
Use of uninitialized value $c in concatenation (.) or string at /home/xxxx/.local/bin/apt-history line 49, <GEN20> line 47.
Traitement du fichier de log /var/log/apt/history.log.1.gz
Traitement du fichier de log /var/log/apt/history.log



dpkg -l libterm-readkey-perl


Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements
|/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais)
||/ Nom                  Version      Architecture Description
+++-====================-============-============-=======================================
ii  libterm-readkey-perl 2.38-1       amd64        perl module for simple terminal control


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.
Je suis parrain linux !

Hors ligne

#7 07-10-2019 17:58:04

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

Tu as des fichiers de log qui ne respectent, peut-être, pas le format utilisé par apt sur buster.

Exemple de blocs que l'on trouve dans les fichiers de logs :


Start-Date: 2019-10-01  21:17:10
Commandline: apt install msmtp
Install: msmtp:amd64 (1.8.3-1)
End-Date: 2019-10-01  21:17:12

 


La variable $c correspond à ce qui suit le "Commandline: " de la seconde ligne.

Dernière modification par Beta-Pictoris (07-10-2019 18:00:48)

Hors ligne

#8 08-10-2019 08:37:35

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Buster/Sid/Rc-Buggy
Noyau : Linux (≥ 4.12)
(G)UI : i3-wm (≥ 4.13)
Inscription : 07-07-2008
Site Web

Re : apt-history

Toutes ces commandes sont des commandes apt valides. Peut-être que ton script ne les parse pas toutes correctement ?

Commandline: apt autoremove
Commandline: apt dist-upgrade
Commandline: apt install dehydrated
Commandline: apt install dehydrated -t sid
Commandline: apt install dehydrated-apache2
Commandline: apt install firefox -t sid
Commandline: apt install gpodder
Commandline: apt install grim
Commandline: apt install gtk-4-examples -t sid
Commandline: apt install imv
Commandline: apt install libreoffice -t sid
Commandline: apt install libreoffice -t sid --no-install-recommends
Commandline: apt install ocaml
Commandline: apt install postfix
Commandline: apt install rofi
Commandline: apt install rustc -t sid
Commandline: apt install sass-stylesheets-compass
Commandline: apt install sassc
Commandline: apt install slurp
Commandline: apt install sway -t experimental
Commandline: apt install sway swayidle swaylock
Commandline: apt install thunderbird -t experimental
Commandline: apt install wl-clipboard
Commandline: apt install xterm
Commandline: apt install xwayland
Commandline: apt purge argyll ca-certificates-mono ebtables firebird3.0-common fonts-noto-hinted icedtea-netx icedtea-netx-common irqbalance libapache2-mod-php5.6 libatk-adaptor:amd64 libreoffice-sdbc-firebird libxml-commons-resolver1.1-java linux-image-4.19.0-1-amd64 mono-runtime-common orca speech-dispatcher xbrlapi
Commandline: apt purge fusedav ibus-qt4 libssl1.0.2
Commandline: apt purge gtk-4-examples
Commandline: apt purge libdbus-glib-1-dev libreoffice-avmedia-backend-gstreamer
Commandline: apt purge libpython2.7-dev:amd64
Commandline: apt purge linux-image-4.19.0-4-amd64
Commandline: apt purge ruby-sass
Commandline: apt purge vim vim-addon-manager vim-common vim-gtk3 vim-gui-common vim-runtime vim-syntastic vim-tiny
Commandline: apt purge xtron
Commandline: apt-get install -y -o DPkg::Options::=--force-confold xtron
Commandline: apt-get install autoconf2.13 build-essential nodejs python-dev python-pip python-setuptools unzip uuid zip
Commandline: apt-get install libasound2-dev libcurl4-openssl-dev libdbus-1-dev libdbus-glib-1-dev libgtk-3-dev libgtk2.0-dev libpulse-dev libx11-xcb-dev libxt-dev python-dbus xvfb yasm
Commandline: apt-get install nasm
Commandline: apt-get purge -y -o DPkg::Options::=--force-confold xtron



Il y a aussi des blocs sans Commandline :

Start-Date: 2019-08-19  11:56:15
Requested-By: xxxxx (1000)
Install: libsqlite3-dev:amd64 (3.29.0-2)
End-Date: 2019-08-19  11:56:16


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.
Je suis parrain linux !

Hors ligne

#9 08-10-2019 18:39:46

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

J'ai modifié le script pour qu'il tienne compte des blocs sans "Commandline" :

#!/usr/bin/perl -w

# Commande apt-history
# Version 0.0.2

use v5.10 ;
use Getopt::Long ;

my $base = "$ENV{HOME}/.apt-history" ;

GetOptions
    'update'      => \&update ,
    'list'        => \&list   ,
    'info=i'      => \&info   ,
    'remove=i'    => \&remove ,
    'help'    => \&help   ;

sub update
{
    use IO::Uncompress::Gunzip qw( gunzip $GunzipError ) ;

    my $log_files = "/var/log/apt/history.log*" ;
    my $n = 1 ;
    my $regexp = qr/^(.*?): (.*)/ ;
    my ( $d , $h , $c , $o , $p ) ;

    dbmopen my %h , $base , 0644 ;

    %h = () ;

    say "" ;

    foreach ( sort { -M $b <=> -M $a } glob $log_files )
    {
  say "Traitement du fichier de log $_" ;

  my $f = IO::Uncompress::Gunzip -> new ( $_ ) or die "gunzip failed: $GunzipError\n" ;

  while ( <$f> )
  {
      $c = "?" ;
      if ( $_ =~ m/^Start-Date: (.{10,10}).*(.{8,8})/ )
      {
    ( $d , $h ) = ( $1 , $2 ) ;
    ( $o , $p ) = <$f> =~ m/$regexp/ ;
    if ( $o eq "Commandline" )
    {
        $c = $p ;
        ( $o , $p ) = <$f> =~ m/$regexp/ ;
    }
    ( $o , $p ) = <$f> =~ m/$regexp/ if $o eq "Requested-By" ;
    $p =~ s/\(.*?\)//g ;
    $p =~ s/, //g ;
    $h { $n++ } = "$d;$h;$o;$c;$p" ;
      }
  }
  close $f ;
    }
    dbmclose %h ;

    say "" ;
}

sub list
{
    use Term::ReadKey ;

    my ( $width_chars ) = GetTerminalSize() ;

    dbmopen my %h , $base , 0644 ;

    say "" ;

    foreach ( sort { $a <=> $b } keys %h )
    {
  my ( $d , $h , $o , $c ) = split ";" , $h { $_ } ;

  say substr sprintf ( "%5d | %s | %s | %-9s | %s" , $_ , $d , $h , $o , $c ) , 0 , $width_chars ;
    }

    dbmclose %h ;

    say "" ;
}

sub info
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;
    say "\nDate :\t\t$d" ;
    say "Heure :\t\t$h" ;
    say "Opération :\t$o" ;
    say "\nCommande :\n$c" ;
    say "\nPaquets mis en jeu:\n$p\n" ;

    dbmclose %h ;
}

sub remove
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;

    say "\napt -s --purge autoremove $p" ;
    say `apt -s --purge autoremove $p` ;
    say "Pour supprimer définitivement les paquets, utilisez la commande suivante :\n" ;
    say "apt --purge autoremove $p\n" ;

    dbmclose %h ;
}

sub help
{
    say "\napt-history 0.0.2\n" ;
    say "Usage : apt-history [options] argument\n" ;
    say "apt-history est un outil en ligne de commande qui permet de gérer l'historique des transactions sur les paquets deb.\n" ;
    say "Les options :" ;
    say "\t--update\t- importe les fichiers de logs dans la base de données locale.";
    say "\t--list\t\t- affiche l'historique des transactions sur les paquets." ;
    say "\t--info n\t- affiche les détails de la transaction n." ;
    say "\t--remove n\t- simule la désinstallation des paquets mis en jeux lors de la transaction n.\n" ;
}
 



J'espère qu'il marchera mieux. smile

Dernière modification par Beta-Pictoris (08-10-2019 18:40:10)

Hors ligne

#10 08-10-2019 19:07:21

Debian Alain
Adhérent(e)
Distrib. : stable / ubuntu / testing
Noyau : Linux 5.6.0-1 amd 64
(G)UI : Gnome X.org (X11) / GDM3
Inscription : 11-03-2017

Re : apt-history

super , ton utilitaire , Beta-Pictoris !

./apt-history --help


apt-history 0.0.2

Usage : apt-history [options] argument

apt-history est un outil en ligne de commande qui permet de gérer l'historique des transactions sur les paquets deb.

Les options :
  --update  - importe les fichiers de logs dans la base de données locale.
  --list    - affiche l'historique des transactions sur les paquets.
  --info n  - affiche les détails de la transaction n.
  --remove n  - simule la désinstallation des paquets mis en jeux lors de la transaction n.
 



./apt-history --update


Traitement du fichier de log /var/log/apt/history.log.12.gz
Traitement du fichier de log /var/log/apt/history.log.11.gz
Traitement du fichier de log /var/log/apt/history.log.10.gz
Traitement du fichier de log /var/log/apt/history.log.9.gz
Traitement du fichier de log /var/log/apt/history.log.8.gz
Traitement du fichier de log /var/log/apt/history.log.7.gz
Traitement du fichier de log /var/log/apt/history.log.6.gz
Traitement du fichier de log /var/log/apt/history.log.5.gz
Traitement du fichier de log /var/log/apt/history.log.4.gz
Traitement du fichier de log /var/log/apt/history.log.3.gz
Traitement du fichier de log /var/log/apt/history.log.2.gz
Traitement du fichier de log /var/log/apt/history.log.1.gz
Traitement du fichier de log /var/log/apt/history.log
 



exemple :

./apt-history --info 2509


Date :    2019-10-08
Heure :   14:59:17
Opération :  Install

Commande :
apt install --reinstall conky-std

Paquets mis en jeu:
conky-std:amd64

Dernière modification par Debian Alain (08-10-2019 19:29:43)

En ligne

#11 09-10-2019 20:21:04

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

Nouvelle version du script : smile

#!/usr/bin/perl -w

# Commande apt-history
# Version 0.0.3

use v5.10 ;
use strict ;
use Getopt::Long ;

my $base = "$ENV{HOME}/.apt-history" ;

GetOptions
    'update'      => \&update ,
    'list'        => \&list   ,
    'info=i'      => \&info   ,
    'remove=i'    => \&remove ,
    'help'    => \&help   ;

sub update
{
    use IO::Uncompress::Gunzip qw( gunzip $GunzipError ) ;

    my $log_files = "/var/log/apt/history.log*" ;
    my $n = 1 ;
    my ( $d , $h , $c , $o , $p ) ;

    dbmopen my %h , $base , 0644 ;

    %h = () ;

    say "" ;

    foreach ( sort { -M $b <=> -M $a } glob $log_files )
    {
  say "Importation du fichier de log $_" ;

  my $f = IO::Uncompress::Gunzip -> new ( $_ ) or die "gunzip failed: $GunzipError\n" ;

  while ( <$f> )
  {
      if ( ( $d , $h ) = m/^Start-Date: (.{10,10}).*(.{8,8})/ )
      {
    $c = "?" ;
    while ( <$f> =~ m/^(.*?): (.*)/ )
    {
        do { $c = $2 ; next } if $1 eq "Commandline" ;
        next if $1 eq "Requested-By" ;
        last if $1 eq "End-Date" ;
        ( $o , $p ) = ( $1 , $2 ) ;
    }
    $p =~ s/\(.*?\)|, //g ;
    $h { $n++ } = "$d;$h;$o;$c;$p" ;
      }
  }
  close $f ;
    }
    dbmclose %h ;

    say "" ;
}

sub list
{
    use Term::ReadKey ;

    my ( $width_chars ) = GetTerminalSize() ;

    dbmopen my %h , $base , 0644 ;

    say "" ;

    foreach ( sort { $a <=> $b } keys %h )
    {
  my ( $d , $h , $o , $c ) = split ";" , $h { $_ } ;

  say substr sprintf ( "%5d | %s | %s | %-9s | %s" , $_ , $d , $h , $o , $c ) , 0 , $width_chars ;
    }

    dbmclose %h ;

    say "" ;
}

sub info
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;
    say "\nDate :\t\t$d" ;
    say "Heure :\t\t$h" ;
    say "Opération :\t$o" ;
    say "\nCommande :\n$c" ;
    say "\nPaquets mis en jeu:\n$p\n" ;

    dbmclose %h ;
}

sub remove
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;

    say "\napt -s --purge autoremove $p" ;
    say `apt -s --purge autoremove $p` ;
    say "Pour supprimer définitivement les paquets, utilisez la commande suivante :\n" ;
    say "apt --purge autoremove $p\n" ;

    dbmclose %h ;
}

sub help
{
    say "\napt-history 0.0.3\n" ;
    say "Usage : apt-history [options] argument\n" ;
    say "apt-history est un outil en ligne de commande qui permet de gérer l'historique des transactions sur les paquets deb.\n" ;
    say "Les options :" ;
    say "\t--update\t- importe les fichiers de logs dans la base de données locale.";
    say "\t--list\t\t- affiche l'historique des transactions sur les paquets." ;
    say "\t--info n\t- affiche les détails de la transaction n." ;
    say "\t--remove n\t- simule la désinstallation des paquets mis en jeux lors de la transaction n.\n" ;
}

Dernière modification par Beta-Pictoris (10-10-2019 16:30:28)

Hors ligne

#12 10-10-2019 08:13:12

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Buster/Sid/Rc-Buggy
Noyau : Linux (≥ 4.12)
(G)UI : i3-wm (≥ 4.13)
Inscription : 07-07-2008
Site Web

Re : apt-history

Merci Beta-Pictoris.
Détail: la commande help ne renvoie pas le bon numéro de version du script big_smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.
Je suis parrain linux !

Hors ligne

#13 10-10-2019 16:31:06

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

yep, c'est corrigé.

Alors, ça marche mieux ? smile

Hors ligne

#14 11-10-2019 08:19:54

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Buster/Sid/Rc-Buggy
Noyau : Linux (≥ 4.12)
(G)UI : i3-wm (≥ 4.13)
Inscription : 07-07-2008
Site Web

Re : apt-history

Carrément, ça change tout ! big_smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.
Je suis parrain linux !

Hors ligne

#15 20-10-2019 19:47:23

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

Bonjour,

J'ai mis à jour le script :

#!/usr/bin/perl -w

# Commande apt-history
# Version 0.0.5

use v5.10 ;
use strict ;
use Getopt::Long ;

my $base = "$ENV{HOME}/.apt-history" ;

GetOptions
    'update'      => \&update ,
    'list'        => \&list   ,
    'info=i'      => \&info   ,
    'remove=i'    => \&remove ,
    'help'    => \&help   ;

sub update
{
    use IO::Uncompress::Gunzip qw( gunzip $GunzipError ) ;

    my $log_files = "/var/log/apt/history.log*" ;
    my $n = 0 ;
    my ( $c , $o , $p ) ;

    dbmopen my %h , $base , 0644 ;

    %h = () ;

    say "" ;

    foreach ( sort { -M $b <=> -M $a } glob $log_files )
    {
  say "Importation du fichier de log $_" ;

  my $f = IO::Uncompress::Gunzip -> new ( $_ ) or die "gunzip failed: $GunzipError\n" ;

  while ( <$f> )
  {
      next if m/^($|End-Date|Requested-By)/ ;

      do { $n++ ; $h { $n } = "$1;$2" ; $c = "?" ; next } if m/^Start-Date: (.{10,10}).*(.{8,8})/ ;
     
      do { $c = $1 ; next } if m/^Commandline: (.*)/ ;
     
      do { $p =~ s/\(.*?\)|, //g ; $h { $n } .= ";$o;$c;$p" } if ( $o , $p ) = m/^(Install|Purge|Reinstall|Remove|Upgrade): (.*)/ ;
  }
  close $f ;
    }
    dbmclose %h ;

    say "" ;
}

sub list
{
    use Term::ReadKey ;

    my ( $width_chars ) = GetTerminalSize() ;

    dbmopen my %h , $base , 0644 ;

    say "" ;

    foreach ( sort { $a <=> $b } keys %h )
    {
  my ( $d , $h , $o , $c ) = split ";" , $h { $_ } ;

  say substr sprintf ( "%5d | %s | %s | %-9s | %s" , $_ , $d , $h , $o , $c ) , 0 , $width_chars ;
    }

    dbmclose %h ;

    say "" ;
}

sub info
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;

    print <<EOF ;
\nDate :\t\t$d
Heure :\t\t$h
Opération :\t$o
\nCommande :\t
$c
\nPaquets mis en jeu:
$p\n
EOF

    dbmclose %h ;
}

sub remove
{
    my ( $opt , $n ) = @_ ;

    dbmopen my %h , $base , 0644 ;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n } ;

    say "\napt -s --purge remove $p" ;
    say `apt -s --purge remove $p` ;
    say "Pour supprimer définitivement les paquets, utilisez la commande suivante :" ;
    say "\napt --purge remove $p\n" ;

    dbmclose %h ;
}

sub help
{
    print <<EOF ;
\napt-history 0.0.5
\nUsage : apt-history [options] argument
\napt-history est un outil en ligne de commande qui permet de gérer l'historique des transactions sur les paquets deb.
\nLes options :
\t--update\t- importe les fichiers de logs dans la base de données locale.
\t--list\t\t- affiche l'
historique des transactions sur les paquets.
\t--info n\t- affiche les détails de la transaction n.
\t--remove n\t- simule la désinstallation des paquets mis en jeux lors de la transaction n.\n
EOF
}



J'ai fait quelques corrections et simplifié le code.

Hors ligne

#16 10-11-2019 19:43:25

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

Petite mise à jour : smile

# Commande apt-history
# Version 0.0.7

use v5.10;
use strict;
use Getopt::Long;
use Pod::Usage;

my $base = "$ENV{HOME}/.apt-history";

pod2usage( -verbose => 2 , -noperldoc => 1 ) unless @ARGV;

GetOptions
    'update'    => \&update ,
    'list'      => \&list   ,
    'info=i'    => \&info   ,
    'remove=i'  => \&remove ,
    or pod2usage ( -verbose => 2 , -noperldoc => 1 );

sub update
{
    use IO::Uncompress::Gunzip qw( gunzip $GunzipError );

    my $log_files = "/var/log/apt/history.log*";
    my $n = 0;
    my ( $c , $o , $p );

    dbmopen my %h , $base , 0644;

    %h = ();

    say "";

    foreach ( sort { -M $b <=> -M $a } glob $log_files )
    {
        say "Importation du fichier de log $_";

        my $f = IO::Uncompress::Gunzip -> new( $_ ) or die "gunzip failed: $GunzipError\n";

        while ( <$f> )
        {
            next if m/^($|End-Date|Requested-By)/;

            do { $n++ ; $h { $n } = "$1;$2" ; $c = "?" ; next } if m/^Start-Date: (.{10,10}).*(.{8,8})/;

            do { $c = $1 ; next } if m/^Commandline: (.*)/;

            do { $p =~ s/\(.*?\)|, //g ; $h { $n } .= ";$o;$c;$p" } if ( $o , $p ) = m/^(Install|Purge|Reinstall|Remove|Upgrade): (.*)/;
        }
        close $f;
    }
    dbmclose %h;

    say "";
}

sub list
{
    eval { require Term::ReadKey } or die "Module non trouvé !\nVeuillez installer le paquet 'libterm-readkey-perl'.\n";

    Term::ReadKey -> import();

    my ( $width_chars ) = GetTerminalSize();

    dbmopen my %h , $base , 0644;

    say "";

    foreach ( sort { $a <=> $b } keys %h )
    {
        my ( $d , $h , $o , $c ) = split ";" , $h { $_ };

        say substr sprintf ( "%5d | %s | %s | %-9s | %s" , $_ , $d , $h , $o , $c ) , 0 , $width_chars;
    }

    dbmclose %h;

    say "";
}

sub info
{
    my ( $opt , $n ) = @_;

    dbmopen my %h , $base , 0644;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n };

    dbmclose %h;

    print <<EOF;
    \nDate :\t\t$d
    \rHeure :\t\t$h
    \rOpération :\t$o
    \nCommande :\t
    \r$c
    \nPaquets mis en jeu:
    \r$p\n
EOF

}

sub remove
{
    my ( $opt , $n ) = @_;

    dbmopen my %h , $base , 0644;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n };

    dbmclose %h;
   
    say "\napt -s --purge remove $p";
    say `apt -s --purge remove $p`;
    say "Pour supprimer définitivement les paquets, utilisez la commande suivante :";
    say "\napt --purge remove $p\n";
}

__END__

=encoding utf8

=head1 NAME

apt-history - Utilitaire APT de consultation de l'historique des opérations sur les paquets deb.

=head1 SYNOPSYS

apt-history | --update | --list | --info n | --remove n |

=head1 DESCRIPTION

B<apt-history> est un outil en ligne de commande qui permet d'afficher l'historique des transactions sur les paquets deb.

Il peut aussi simuler la désinstallation d'un paquet et de toutes ses dépendances précédemment installées.

=head1 OPTIONS

=over 12

=item B<-update>

Importe les fichiers de logs dans la base de données locale.

=item B<-list>

Affiche l'historique des transactions sur les paquets.

=item B<-info n>

Affiche les détails de la transaction n.

=item B<-remove n>

Simule la désinstallation des paquets mis en jeux lors de la transaction n.

=back

=cut

Hors ligne

#17 23-11-2019 13:54:18

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

#!/usr/bin/perl -w

# Commande apt-history
# Version 0.0.8

BEGIN { $Pod::Usage::Formatter = 'Pod::Text::Termcap'; }

use v5.10;
use strict;
use Getopt::Long;
use Pod::Usage;

my $base = "$ENV{HOME}/.apt-history";

pod2usage( -verbose => 2 , -noperldoc => 1 ) unless @ARGV;

GetOptions
    'update'    => \&update ,
    'list'      => \&list   ,
    'info=i'    => \&info   ,
    'remove=i'  => \&remove ,
    or pod2usage ( -verbose => 2 , -noperldoc => 1 );

sub update
{
    use IO::Uncompress::Gunzip qw( gunzip $GunzipError );

    my $log_files = "/var/log/apt/history.log*";
    my $n = 0;
    my ( $c , $o , $p );

    dbmopen my %h , $base , 0644;

    %h = ();

    say "";

    foreach ( sort { -M $b <=> -M $a } glob $log_files )
    {
        say "Importation du fichier de log $_";

        my $f = IO::Uncompress::Gunzip -> new( $_ ) or die "gunzip failed: $GunzipError\n";

        while ( <$f> )
        {
            next if m/^($|End-Date|Requested-By)/;

            do { $n++ ; $h { $n } = "$1;$2" ; $c = "?" ; next } if m/^Start-Date: (.{10,10}).*(.{8,8})/;

            do { $c = $1 ; next } if m/^Commandline: (.*)/;

            do { $p =~ s/\(.*?\)|, //g ; $h { $n } .= ";$o;$c;$p" } if ( $o , $p ) = m/^(Install|Purge|Reinstall|Remove|Upgrade): (.*)/;
        }
        close $f;
    }
    dbmclose %h;

    say "";
}

sub list
{
    eval { require Term::ReadKey } or die "Module non trouvé !\nVeuillez installer le paquet 'libterm-readkey-perl'.\n";

    Term::ReadKey -> import();

    my ( $width_chars ) = GetTerminalSize();

    dbmopen my %h , $base , 0644;

    say "";

    foreach ( sort { $a <=> $b } keys %h )
    {
        my ( $d , $h , $o , $c ) = split ";" , $h { $_ };

        say substr sprintf ( "%5d | %s | %s | %-9s | %s" , $_ , $d , $h , $o , $c ) , 0 , $width_chars;
    }

    dbmclose %h;

    say "";
}

sub info
{
    my ( $opt , $n ) = @_;

    dbmopen my %h , $base , 0644;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n };

    dbmclose %h;

    print <<EOF;
    \nDate :\t\t$d
    \rHeure :\t\t$h
    \rOpération :\t$o
    \nCommande :\t
    \r$c
    \nPaquets mis en jeu:
    \r$p\n
EOF

}

sub remove
{
    my ( $opt , $n ) = @_;

    dbmopen my %h , $base , 0644;

    my ( $d , $h , $o , $c , $p ) = split ";" , $h { $n };

    dbmclose %h;
   
    say "\napt -s --purge remove $p";
    say `apt -s --purge remove $p`;
    say "Pour supprimer définitivement les paquets, utilisez la commande suivante :";
    say "\napt --purge remove $p\n";
}

__END__

=encoding utf8

=head1 NAME

apt-history - Utilitaire APT de consultation de l'historique des opérations sur les paquets deb.

=head1 SYNOPSYS

apt-history | --update | --list | --info n | --remove n |

=head1 DESCRIPTION

apt-history est un outil en ligne de commande qui permet d'afficher l'historique des transactions sur les paquets deb.

Il peut aussi simuler la désinstallation d'un paquet et de toutes ses dépendances précédemment installées.

=head1 OPTIONS

=over 12

=item B<-update>

Importe les fichiers de logs dans la base de données locale.

=item B<-list>

Affiche l'historique des transactions sur les paquets.

=item B<-info n>

Affiche les détails de la transaction n.

=item B<-remove n>

Simule la désinstallation des paquets mis en jeux lors de la transaction n.

=back

=cut



Mise à jour du script "apt-history".

On peut lancer l'aide juste en lançant la commande "apt-history".

Et l'aide est formatée comme des pages de manuel.

Hors ligne

#18 23-11-2019 19:53:37

Debian Alain
Adhérent(e)
Distrib. : stable / ubuntu / testing
Noyau : Linux 5.6.0-1 amd 64
(G)UI : Gnome X.org (X11) / GDM3
Inscription : 11-03-2017

Re : apt-history

ton programme est très intéressant , bêta-pictoris .

amha , il le serai encore plus si tu y ajoutais aussi les mme commandes mais avec une lettre ,

format court , donc .

si tu vois ce que je veux dire .

merci .

En ligne

#19 24-11-2019 13:11:06

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : apt-history

L'idée reste quand-même de faire une commande proche des commandes apt, apt-get,.... au niveau utilisation.

Avec des options courtes, on s'en éloigne un peu.

Hors ligne

Pied de page des forums