#!/bin/sh # # Copyright (C) 2023 Etersoft # Copyright (C) 2023 Vitaly Lipatov <lav@etersoft.ru> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # EHOG='\(apt-get\|rpm\)' JCHAN='-t apt-get -t rpm' __alt_epm_history_journal() { a= journalctl $JCHAN } __alt_epm_history_uniq() { __alt_epm_history_journal | grep "$EHOG\[[0-9][0-9]*\]:" | sed -e "s@.*$EHOG\[\([0-9][0-9]*\)\]: .*@\2@" | uniq | tac } # args: pid, removed|installed __alt_epm_history_select() { local pid="$1" local verb="$2" __alt_epm_history_journal | grep "$EHOG\[$pid\]: .*$verb" | sed -e "s@.*$EHOG\[[0-9][0-9]*\]: @@" | cut -d" " -f 1 } _alt_epm_history_date() { local pid="$1" __alt_epm_history_journal | grep "$EHOG\[$pid\]: " | head -n1 | cut -d" " -f 1-3,5 | sed -e 's|:$||' } _alt_epm_history_print_group() { local i if [ -n "$2" ] ; then echo echo "$1 session:" shift else return fi for i in $* ; do echo " $i" done } __alt_epm_history_removed() { echo "Removed packages history:" __alt_epm_history_uniq | while read pid ; do date="$(_alt_epm_history_date $pid)" removed="$(epm print shortname for $(__alt_epm_history_select $pid "removed") )" installed="$(epm print shortname for $(__alt_epm_history_select $pid "installed") )" _alt_epm_history_print_group "$date" $(estrlist exclude "$installed" "$removed") done } __alt_epm_history_installed() { echo "Installed packages history:" __alt_epm_history_uniq | while read pid ; do date="$(_alt_epm_history_date $pid)" #epm print shortname for $(__alt_epm_history_select $pid "installed") | sed -e "s|^| |" removed="$(epm print shortname for $(__alt_epm_history_select $pid "removed") )" installed="$(epm print shortname for $(__alt_epm_history_select $pid "installed") )" _alt_epm_history_print_group "$date" $(estrlist exclude "$removed" "$installed") done } __alt_epm_history_updated() { echo "Updated packages history:" __alt_epm_history_uniq | while read pid ; do date="$(_alt_epm_history_date $pid)" #epm print shortname for $(__alt_epm_history_select $pid "installed") | sed -e "s|^| |" removed="$(epm print shortname for $(__alt_epm_history_select $pid "removed") )" installed="$(epm print shortname for $(__alt_epm_history_select $pid "installed") )" _alt_epm_history_print_group "$date" $(estrlist intersection "$removed" "$installed") done } epm_history_help() { echo "package management history" get_help HELPCMD $SHAREDIR/epm-history cat <<EOF Examples: epm history epm history --removed EOF } epm_history() { if [ $PMTYPE = "apt-rpm" ] ; then case "$1" in "-h"|"--help"|"help") # HELPCMD: help epm_history_help return ;; --installed) # HELPCMD: print only new installed packages __alt_epm_history_installed return ;; --removed) # HELPCMD: print only removed packages __alt_epm_history_removed return ;; --updated) # HELPCMD: print only updated packages __alt_epm_history_updated return ;; --list) # HELPCMD: (or empty) print all history entries docmd journalctl $JCHAN return ;; "") ;; *) fatal "Unknown option $1. Use epm history --help to get help." esac fi [ -z "$*" ] || fatal "No arguments are allowed here" case $PMTYPE in apt-rpm) docmd journalctl $JCHAN -r ;; apt-dpkg) docmd cat /var/log/dpkg.log ;; dnf-rpm) sudocmd dnf history ;; eopkg) sudocmd eopkg history ;; zypper-rpm) docmd cat /var/log/zypp/history ;; pacman) docmd cat /var/log/pacman.log ;; emerge) docmd cat /var/log/portage ;; *) fatal "Have no suitable command for $PMTYPE" ;; esac }