#!/bin/bash # shellcheck source=kzcommon.sh # ----------------------------------------------------------------------------- # Applijst maken. # # Geschreven door Karel Zimmer . # # Auteursrecht (c) 2013-2021 Karel Zimmer. # GNU Algemene Publieke Licentie . # # RelNum=18.04.00 # RelDat=2021-01-18 # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Global constants # ----------------------------------------------------------------------------- source "$(dirname "$0")"/kzcommon.sh readonly OUTPUTFILE_1=/root/$PROGNAME-$HOSTNAME-deb-bestanden readonly OUTPUTFILE_2=/root/$PROGNAME-$HOSTNAME-pakketbronnen readonly OUTPUTFILE_3=/root/$PROGNAME-$HOSTNAME-pakketten readonly OUTPUTFILE_4=/root/$PROGNAME-$HOSTNAME-favorieten readonly OUTPUTFILE_5=/root/$PROGNAME-$HOSTNAME-snaps readonly RUN_AS_SUPERUSER=true # Bij aanpassingen ook .completion aanpassen! readonly OPTIONS_SHORT=$OPTIONS_SHORT_COMMON readonly OPTIONS_LONG=$OPTIONS_LONG_COMMON readonly USAGE="Gebruik: $PROGNAME $OPTIONS_USAGE_COMMON" readonly HELP="Gebruik: $PROGNAME [OPTIE...] Applijst maken. Opties: $OPTIONS_HELP_COMMON" # ----------------------------------------------------------------------------- # Global variables # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- check_input() { local -i getopt_rc=0 local parsed='' parsed=$( getopt --alternative \ --options "$OPTIONS_SHORT" \ --longoptions "$OPTIONS_LONG" \ --name "$PROGNAME" \ -- "$@" ) || getopt_rc=$? if [[ $getopt_rc -ne 0 ]]; then printf '%s\n' "$USAGELINE" >&2 exit $ERROR fi eval set -- "$parsed" process_general_options "$@" while true; do case $1 in --) shift break ;; *) shift ;; esac done if [[ "$*" ]]; then printf "$PROGNAME: %s\n%s\n" 'geen argumenten opgeven' "$USAGELINE" >&2 exit $ERROR fi check_user # Na check_user voor toegang tot media. remove_old_configuration } remove_old_configuration() { rm --force "$HOME"/.lsinstal*"$HOSTNAME"* /root/.lsinstal*-"$HOSTNAME"-* } process_input() { local title='Applijst maken' local text0='Opdrachten worden verwerkt' local text1="[1/5] Bepaal welke deb-bestanden (Debian-pakketten) zijn \ geïnstalleerd" local text2="[2/5] Bepaal welke pakketbronnen (\"repositories\" of \ \"repo's\") zijn toegevoegd" local text3="[3/5] Bepaal welke pakketten door de gebruiker zijn \ geïnstalleerd" local text4='[4/5] Bepaal welke favorieten in gebruik zijn' local text5='[5/5] Bepaal welke snaps zijn geïnstalleerd' # Constructie '2> >($LOGCMD)' om stderr naar de log te krijgen. # Voorbeeld: Unable to init server: Kon niet verbinden: # Verbinding is geweigerd # en: (zenity:47712): Gtk-WARNING **: 10:35:49.339: # cannot open display: if $OPTION_GUI; then ( printf '%s\n' "#$text1" create_file_installed_without_repo printf '%s\n' "#$text2" create_file_added_repos printf '%s\n' "#$text3" create_file_installed_by_user printf '%s\n' "#$text4" create_file_favorites printf '%s\n' "#$text5" create_file_snaps ) |& zenity --progress \ --pulsate \ --auto-close \ --no-cancel \ --width 600 \ --height 50 \ --title "$title" \ --text "$text0" \ 2> >($LOGCMD) else create_file_installed_without_repo #1 create_file_added_repos #2 create_file_installed_by_user #3 create_file_favorites #4 create_file_snaps #5 fi } create_file_installed_without_repo() { local number_of_lines=0 local header="Dit zijn gedownloade deb-bestanden geïnstalleerd via \ Software, of met een opdracht zoals 'sudo apt-get --install '." local footer='' printf '%s\n' "$text1 ..." touch "$OUTPUTFILE_1" |& $LOGCMD printf '%b\n' "$header\n$DASHES" > "$OUTPUTFILE_1" apt-show-versions --initialize |& $LOGCMD if ! apt-show-versions \ --brief | grep --word-regexp \ --regexp='No available version' | cut --delimiter=':' \ --fields=1 >> "$OUTPUTFILE_1"; then true fi number_of_lines=$(wc --lines < "$OUTPUTFILE_1") number_of_lines=$((number_of_lines - 2)) footer="Dit bestand bevat $number_of_lines door de gebruiker \ geïnstalleerde deb-bestanden. Meer via de opdracht: apt-cache show | grep --regexp='Description:'" printf '%b\n' "$DASHES\n$footer" >> "$OUTPUTFILE_1" } create_file_added_repos() { local number_of_lines=0 local header="Deze pakketbronnen zijn meestal toegevoegd met de opdracht \ 'sudo add-apt-repository ppa:/'." local footer='' printf '%s\n' "$text2 ..." touch "$OUTPUTFILE_2" |& $LOGCMD printf '%b\n' "$header\n$DASHES" > "$OUTPUTFILE_2" # shellcheck disable=SC2022,SC2062 if ! grep --recursive \ --no-filename \ --regexp='^deb ' \ /etc/apt/sources.list* | grep --invert-match \ --regexp='ubuntu.com' | sort --unique >> "$OUTPUTFILE_2"; then true fi number_of_lines=$(wc --lines < "$OUTPUTFILE_2") number_of_lines=$((number_of_lines - 2)) footer="Dit bestand bevat $number_of_lines door de gebruiker toegevoegde \ pakketbronnen." printf '%b\n' "$DASHES\n$footer" >> "$OUTPUTFILE_2" } create_file_installed_by_user() { local number_of_lines=0 local header="Deze pakketten zijn meestal geïnstalleerd met Software of \ met de opdracht 'sudo apt install '." local footer='' printf '%s\n' "$text3 ..." touch "$OUTPUTFILE_3" |& $LOGCMD printf '%b\n' "$header\n$DASHES" > "$OUTPUTFILE_3" # Tabel1 = Alle geïnstalleerde pakketten op dit moment # (dpkg-query --show --showformat='${Package}\n' | sort) # Tabel2 = Alle *automatisch* geïnstalleerde pakketten op dit moment # (apt-mark showauto | sort) # Tabel3 = Door gebruiker geïnstalleerd (Tabel1-Tabel2) # (comm -13 Tabel1 Tabel2) ( comm -23 \ <(dpkg-query --show --showformat='${Package}\n' | sort) \ <(apt-mark showauto | sort) \ ) >> "$OUTPUTFILE_3" number_of_lines=$(wc --lines < "$OUTPUTFILE_3") number_of_lines=$((number_of_lines - 2)) footer="Dit bestand bevat $number_of_lines door de gebruiker \ geïnstalleerde pakketten. Meer info via de opdracht: apt-cache show | grep \ --regexp='Description:'" printf '%b\n' "$DASHES\n$footer" >> "$OUTPUTFILE_3" } create_file_favorites() { local number_of_lines=0 local header="Deze favorieten zijn de snelkoppelingen te bereiken via een \ (soort van) (snel)menu." local footer='' printf '%s\n' "$text4 ..." touch "$OUTPUTFILE_4" |& $LOGCMD printf '%b\n' "$header\n$DASHES" > "$OUTPUTFILE_4" if gsettings get org.gnome.shell favorite-apps &> /dev/null; then favorites=$(gsettings get org.gnome.shell favorite-apps) else printf '%s\n' " Niet op GNOME (e.g. Ubuntu). Geen \ favorieten veiliggesteld." >> "$OUTPUTFILE_4" favorites='' fi favorites=${favorites//,/} favorites=${favorites//.desktop/} favorites=${favorites//\[/} favorites=${favorites//\]/} for favorite in $favorites; do printf '%s\n' "${favorite//"'"/}" >> "$OUTPUTFILE_4" done number_of_lines=$(wc --lines < "$OUTPUTFILE_4") number_of_lines=$((number_of_lines - 2)) footer="Dit bestand bevat $number_of_lines favorieten." printf '%b\n' "$DASHES\n$footer" >> "$OUTPUTFILE_4" } create_file_snaps() { local number_of_lines=0 local header="Deze snaps zijn geïnstalleerd met '[sudo] install SNAP' of \ met Software." local footer='' printf '%s\n' "$text5 ..." touch "$OUTPUTFILE_5" |& $LOGCMD printf '%b\n' "$header\n$DASHES" > "$OUTPUTFILE_5" if ! snap list 2> /dev/null >> "$OUTPUTFILE_5"; then printf '%s\n' 'snap is niet geïnstalleerd op dit systeem' >> \ "$OUTPUTFILE_5" fi number_of_lines=$(wc --lines < "$OUTPUTFILE_5") number_of_lines=$((number_of_lines - 3)) footer="Dit bestand bevat $number_of_lines snaps." printf '%b\n' "$DASHES\n$footer" >> "$OUTPUTFILE_5" } term_script() { info "De vijf aangemaakte bestanden ($PROGNAME-$HOSTNAME-*) staan in de Persoonlijke map van de superuser (/root). Deze bestanden kunnen gebruikt worden om de volledigheid van de installatie, later door kzinstall, te controleren." exit $SUCCESS } # ----------------------------------------------------------------------------- # Main line # ----------------------------------------------------------------------------- main() { init_script check_input "$@" process_input term_script } main "$@" # EOF