aboutsummaryrefslogtreecommitdiffstats
path: root/System/apt-list-obsolete-bin-packages.sh
blob: ce493d63e228a49c40bb220217af2d0d80957729 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/bash
########################################################################################################################
# apt-list-obsolete-bin-packages.sh
########################################################################################################################
#
# All rights reserved Ⓒ 2017-2023 sdxlive.com
#
# Written by Jean-Christophe Manciot <jcmanciot@sdxlive.com>
#
# Licensed under a GPLv3 License.
# You may not use this file except in compliance with the License. You may obtain a copy of the License at
#
#    https://www.gnu.org/licenses/gpl-3.0.md
#
# The licensor cannot revoke these freedoms as long as you follow the license terms.
#
# Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. 
# You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
#
########################################################################################################################

########################################################################################################################
#
# Listing all obsolete installed binary packages, i.e. all packages which have no installation candidate.
# It is possible to pass a perl regular expression to narrow the search for installed binary packages which need to be 
# listed.
#
########################################################################################################################
#
# Requirements:
# ------------
#
#  - We assume that apt alongside all its dependencies is already installed.
#
########################################################################################################################
#
# Parameters:
# ----------
#
# - <perl_regex_include_pattern>: optional perl regular expression used with 'grep -P --' to narrow the search for the  
#                                 matched installed binary packages. Some special characters may need to be escaped.
#                                 Use with caution: setting <auto> to false is strongly advised when using 
#                                 <perl_regex_include_pattern>.
# - <perl_regex_exclude_pattern>: optional perl regular expression used with 'grep -Pv --' to exclude some binary packages
#                                 from the search. Some special characters may need to be escaped.
#                                 Use with caution: setting <auto> to false is strongly advised when using 
#                                 <perl_regex_exclude_pattern>.
#
#######################################################################################################################
#
# Usage example:
# -------------
# 
# apt-list-obsolete-bin-packages.sh
#
########################################################################################################################
# set -x
# Expanding aliases
shopt -s expand_aliases

perl_regex_include_pattern=$3
perl_regex_exclude_pattern=$4
PARAMETERS_NUMBER=0

case "$#" in
        $PARAMETERS_NUMBER)
                perl_regex_include_pattern=''
                perl_regex_exclude_pattern=''
                ;;
        $((PARAMETERS_NUMBER+1)))
                case "$1" in
                        -h|--help)
                                end_of_help_message_line_number=$(awk '/^# set -x/{ print NR; exit }' $(which apt-list-obsolete-bin-packages.sh))
                                ((end_of_help_message_line_number--))
                                if [[ (-n $(apt-cache -q=0 2>&1 policy zenity | grep Installed)) && (! ($(apt-cache -q=0 2>&1 policy zenity | grep Installed) =~ none)) ]]; then
                                        awk -v var=$end_of_help_message_line_number 'NR >= 2 && NR <= var' $(which apt-list-obsolete-bin-packages.sh) | zenity --text-info --title "apt-list-obsolete-bin-packages.sh help" --width 1350 --height 1000
                                else
                                        awk -v var=$end_of_help_message_line_number 'NR >= 2 && NR <= var' $(which apt-list-obsolete-bin-packages.sh)
                                fi
                                exit 1
                                ;;
                        *)
                                perl_regex_exclude_pattern=''
                                ;;
                esac
                ;;
        $((PARAMETERS_NUMBER+2)))
                ;;
        *)
                echo -e ''$_{1..180}'\b-'
                echo Wrong number of parameters: $(basename $0) $@
                echo -e ''$_{1..180}'\b-'
                exit 1
                ;;
esac

# Escaping the '$.*?/|\^(){}+@[]' characters for later grep -P searched string
# Letters, digits and '-' must not be escaped
alias escape_grep_pcre_search_string=$'sed -e \'s|[]$.*?/|\^(){}+@[]|\\\&|g\''
# '

dpkg-lock.sh apt update

# Installed binary packages
sorted_bin_package_names=()
if [[ -n "$perl_regex_exclude_pattern" ]]; then
        readarray -t sorted_bin_package_names < <(apt list --installed 2>/dev/null | grep -v ^Listing\.\.\.$ | grep -Pv -- "$perl_regex_exclude_pattern" | grep -P -- "$perl_regex_include_pattern" | cut -d '/' -f 1 | sort -u)
else
        readarray -t sorted_bin_package_names < <(apt list --installed 2>/dev/null | grep -v ^Listing\.\.\.$ | grep -P -- "$perl_regex_include_pattern" | cut -d '/' -f 1 | sort -u)
fi

obsolete_bin_package_names_versions=()

for ((s=0; s<${#sorted_bin_package_names[@]}; s++))
do
        bin_package_name="${sorted_bin_package_names[${s}]}"
        if [[ -z "$bin_package_name" ]]; then
                continue
        fi
        grep_esc_bin_package_name="$(echo "$bin_package_name" | escape_grep_pcre_search_string)"

        bin_package_installation_candidates=()
        bin_package_installed_version=$(apt-cache -q=0 2>&1 policy "$bin_package_name" | grep Installed | sed -E 's|^.*?: (.*)$|\1|g')
        readarray -t bin_package_installation_candidates < <(apt-cache -q=0 2>&1 madison "$bin_package_name" | grep -P "$grep_esc_bin_package_name" | grep amd64)

        if [[ ${#bin_package_installation_candidates[@]} -eq 0 ]]; then
                obsolete_bin_package_names_versions=("${obsolete_bin_package_names_versions[@]}" "${bin_package_name}=${bin_package_installed_version}")
        fi
done

if [[ ${#obsolete_bin_package_names_versions[@]} -ne 0 ]]; then
        printf "\n"
        echo -e ''$_{1..180}'\b='
        echo "The following binary packages are obsolete:"
        echo -e ''$_{1..180}'\b='
        printf "%s\n" "${obsolete_bin_package_names_versions[@]}" | sort -uV | sed -E 's|=| <--> |g'
fi

exit 0