#!/bin/sh
# This file is part of LTSP, https://ltsp.org
# Copyright 2019 the LTSP team, see AUTHORS
# SPDX-License-Identifier: GPL-3.0-or-later

# Helper script to locate most (but not all) of the non-essential binaries
# that LTSP scripts use, to make it easier to maintain the Depends/Recommends
# lines.

set -e

die() {
    printf "%s\n" "$*" >&2
    exit 1
}

essential_packages() {
    dpkg-query -Wf '${Package;-40}${Essential}\n' |
        awk '$2 == "yes" { print $1 }'
}

essential_binaries() {
    local package file_

    for package in $(essential_packages); do
        for file_ in $(dpkg -L "$package"); do
            test -f "$file_" || continue
            test -x "$file_" || continue
            echo "$file_"
        done
    done | sort
}

ltsp_binaries() {
    cd ${0%/*} || die "Error running: cd ${0%/*}"
    grep -r '^[[:space:]]*r[ew] ' ../ltsp | awk '{ print $3 }' | sort -u
}

main() {
    local eb lb fullb

    eb=$(echo " " $(essential_binaries) " ")
    for lb in $(ltsp_binaries); do
        fullb=$(which "$lb" 2>/dev/null || true)
        if [ -n "$fullb" ]; then
            case "$eb" in
                *" "$fullb" "*) continue ;;  # Essential, don't print
            esac
        fi
        echo "${fullb:-$lb}"
    done
}

main "$@"

false && true <<"EOF"
# Essential packages
base-files base-passwd bash bsdutils coreutils dash debianutils diffutils
dpkg findutils grep gzip hostname init-system-helpers libc-bin login
ncurses-base ncurses-bin perl-base sed sysvinit-utils tar util-linux

# Essential binaries
/bin/bash
/bin/cat
/bin/chgrp
/bin/chmod
/bin/chown
/bin/cp
/bin/dash
/bin/date
/bin/dd
/bin/df
/bin/dir
/bin/dmesg
/bin/dnsdomainname
/bin/domainname
/bin/echo
/bin/egrep
/bin/false
/bin/fgrep
/bin/findmnt
/bin/grep
/bin/gunzip
/bin/gzexe
/bin/gzip
/bin/hostname
/bin/ln
/bin/login
/bin/ls
/bin/lsblk
/bin/mkdir
/bin/mknod
/bin/mktemp
/bin/more
/bin/mountpoint
/bin/mv
/bin/nisdomainname
/bin/pidof
/bin/pwd
/bin/rbash
/bin/readlink
/bin/rm
/bin/rmdir
/bin/run-parts
/bin/sed
/bin/sh
/bin/sh.distrib
/bin/sleep
/bin/stty
/bin/su
/bin/sync
/bin/tar
/bin/tempfile
/bin/touch
/bin/true
/bin/uname
/bin/uncompress
/bin/vdir
/bin/wdctl
/bin/which
/bin/ypdomainname
/bin/zcat
/bin/zcmp
/bin/zdiff
/bin/zegrep
/bin/zfgrep
/bin/zforce
/bin/zgrep
/bin/zless
/bin/zmore
/bin/znew
/etc/cron.daily/dpkg
/etc/init.d/hwclock.sh
/etc/rmt
/etc/update-motd.d/00-header
/etc/update-motd.d/10-help-text
/etc/update-motd.d/50-motd-news
/lib/init/init-d-script
/lib/udev/hwclock-set
/sbin/agetty
/sbin/blkdiscard
/sbin/blkid
/sbin/blockdev
/sbin/chcpu
/sbin/ctrlaltdel
/sbin/findfs
/sbin/fsck
/sbin/fsck.cramfs
/sbin/fsck.minix
/sbin/fsfreeze
/sbin/fstab-decode
/sbin/fstrim
/sbin/getty
/sbin/hwclock
/sbin/installkernel
/sbin/isosize
/sbin/killall5
/sbin/ldconfig
/sbin/ldconfig.real
/sbin/mkfs
/sbin/mkfs.bfs
/sbin/mkfs.cramfs
/sbin/mkfs.minix
/sbin/mkswap
/sbin/pivot_root
/sbin/raw
/sbin/runuser
/sbin/start-stop-daemon
/sbin/sulogin
/sbin/swaplabel
/sbin/switch_root
/sbin/wipefs
/sbin/zramctl
/usr/bin/[
/usr/bin/addpart
/usr/bin/arch
/usr/bin/b2sum
/usr/bin/base32
/usr/bin/base64
/usr/bin/basename
/usr/bin/bashbug
/usr/bin/captoinfo
/usr/bin/catchsegv
/usr/bin/chcon
/usr/bin/chrt
/usr/bin/cksum
/usr/bin/clear
/usr/bin/clear_console
/usr/bin/cmp
/usr/bin/comm
/usr/bin/csplit
/usr/bin/cut
/usr/bin/deb-systemd-helper
/usr/bin/deb-systemd-invoke
/usr/bin/delpart
/usr/bin/diff
/usr/bin/diff3
/usr/bin/dircolors
/usr/bin/dirname
/usr/bin/dpkg
/usr/bin/dpkg-deb
/usr/bin/dpkg-divert
/usr/bin/dpkg-maintscript-helper
/usr/bin/dpkg-query
/usr/bin/dpkg-split
/usr/bin/dpkg-statoverride
/usr/bin/dpkg-trigger
/usr/bin/du
/usr/bin/env
/usr/bin/expand
/usr/bin/expr
/usr/bin/factor
/usr/bin/faillog
/usr/bin/fallocate
/usr/bin/find
/usr/bin/flock
/usr/bin/fmt
/usr/bin/fold
/usr/bin/getconf
/usr/bin/getent
/usr/bin/getopt
/usr/bin/groups
/usr/bin/head
/usr/bin/hostid
/usr/bin/i386
/usr/bin/iconv
/usr/bin/id
/usr/bin/infocmp
/usr/bin/infotocap
/usr/bin/install
/usr/bin/ionice
/usr/bin/ipcmk
/usr/bin/ipcrm
/usr/bin/ipcs
/usr/bin/ischroot
/usr/bin/join
/usr/bin/last
/usr/bin/lastb
/usr/bin/lastlog
/usr/bin/ldd
/usr/bin/link
/usr/bin/linux32
/usr/bin/linux64
/usr/bin/locale
/usr/bin/locale-check
/usr/bin/localedef
/usr/bin/logger
/usr/bin/logname
/usr/bin/lscpu
/usr/bin/lsipc
/usr/bin/lslocks
/usr/bin/lslogins
/usr/bin/lsmem
/usr/bin/lsns
/usr/bin/mcookie
/usr/bin/md5sum
/usr/bin/md5sum.textutils
/usr/bin/mesg
/usr/bin/mkfifo
/usr/bin/namei
/usr/bin/newgrp
/usr/bin/nice
/usr/bin/nl
/usr/bin/nohup
/usr/bin/nproc
/usr/bin/nsenter
/usr/bin/numfmt
/usr/bin/od
/usr/bin/partx
/usr/bin/paste
/usr/bin/pathchk
/usr/bin/perl
/usr/bin/perl5.26.1
/usr/bin/pinky
/usr/bin/pldd
/usr/bin/pr
/usr/bin/printenv
/usr/bin/printf
/usr/bin/prlimit
/usr/bin/ptx
/usr/bin/realpath
/usr/bin/rename.ul
/usr/bin/renice
/usr/bin/reset
/usr/bin/resizepart
/usr/bin/rev
/usr/bin/rgrep
/usr/bin/runcon
/usr/bin/savelog
/usr/bin/script
/usr/bin/scriptreplay
/usr/bin/sdiff
/usr/bin/seq
/usr/bin/setarch
/usr/bin/setsid
/usr/bin/setterm
/usr/bin/sg
/usr/bin/sha1sum
/usr/bin/sha224sum
/usr/bin/sha256sum
/usr/bin/sha384sum
/usr/bin/sha512sum
/usr/bin/shred
/usr/bin/shuf
/usr/bin/sort
/usr/bin/split
/usr/bin/stat
/usr/bin/stdbuf
/usr/bin/sum
/usr/bin/tabs
/usr/bin/tac
/usr/bin/tail
/usr/bin/taskset
/usr/bin/tee
/usr/bin/test
/usr/bin/tic
/usr/bin/timeout
/usr/bin/toe
/usr/bin/tput
/usr/bin/tr
/usr/bin/truncate
/usr/bin/tset
/usr/bin/tsort
/usr/bin/tty
/usr/bin/tzselect
/usr/bin/unexpand
/usr/bin/uniq
/usr/bin/unlink
/usr/bin/unshare
/usr/bin/update-alternatives
/usr/bin/users
/usr/bin/utmpdump
/usr/bin/wall
/usr/bin/wc
/usr/bin/whereis
/usr/bin/who
/usr/bin/whoami
/usr/bin/x86_64
/usr/bin/xargs
/usr/bin/yes
/usr/bin/zdump
/usr/sbin/add-shell
/usr/sbin/chmem
/usr/sbin/chroot
/usr/sbin/fdformat
/usr/sbin/iconvconfig
/usr/sbin/invoke-rc.d
/usr/sbin/ldattach
/usr/sbin/nologin
/usr/sbin/readprofile
/usr/sbin/remove-shell
/usr/sbin/rmt-tar
/usr/sbin/rtcwake
/usr/sbin/service
/usr/sbin/tarcat
/usr/sbin/update-passwd
/usr/sbin/update-rc.d
/usr/sbin/zic
/usr/share/doc/util-linux/examples/getopt-parse.bash
/usr/share/doc/util-linux/examples/getopt-parse.tcsh
EOF
