add usage example
[shellsnippets/shellsnippets.git] / mksh / sysadmin / showlcl.sh
1 #!/bin/mksh
2 # -*- mode: sh -*-
3 #-
4 # Copyright © 2019
5 #       mirabilos <t.glaser@tarent.de>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21 #-
22 # Shows all packages whose installed version is not available from a
23 # repository any more.
24 #
25 # Suggested extra usage:
26 # apt-cache policy $(mksh showlcl.sh | while read a b; do echo $a; done) | less
27
28 unset LANGUAGE
29 export LC_ALL=C
30
31 . "$(dirname "$0")"/../progress-bar
32
33 if ! T=$(mktemp /tmp/showlcl.XXXXXXXXXX); then
34         print -ru2 "E: cannot create temporary file"
35         exit 1
36 fi
37
38 set -o noglob
39
40 dpkg-query -Wf '${binary:Package}\n' | \
41     xargs apt-cache showpkg >"$T"
42 init_progress_bar $(grep -c '^Package: ' <"$T")
43 exec <"$T"
44 rm "$T"
45 s=0
46 while IFS= read -r line; do
47         case $s:$line {
48         (0:Package:+(\ )*)
49                 draw_progress_bar
50                 p=${line##*([!:]):*( )}
51                 s=1
52                 ;;
53         (1:Versions:*(\ ))
54                 s=2
55                 ;;
56         (2:[0-9]*)
57                 set -- $line
58                 if [[ $2 = '(/var/lib/dpkg/status)' && -z $3 ]]; then
59                         print -ru2 -- "D: found $p (= $1)"
60                         print -r -- "$p (= $1)"
61                 fi
62                 ;;
63         (2:[!\ 0-9]*)
64                 s=0
65                 ;;
66         }
67         #print -ru2 -- "D: s=$s l=${line@Q}"
68 done | {
69         res=$(sort -u)
70         print -ru2 -- "I: outputting result set to stdout"
71         done_progress_bar 0
72         print -r -- "$res"
73 }