Files
eos-bash-shared/paccache-service-manager

265 lines
9.5 KiB
Bash
Executable File

#!/bin/bash
#
# Simple service manager for pacman cache cleaner.
#
# Requires packages:
# pacman-contrib (for paccache)
# yad (for yad)
# polkit (for pkexec)
#
source /usr/share/endeavouros/scripts/eos-script-lib-yad || exit 1
export -f eos_yad
AssignIconVariables_in_eos_bash_shared
PaccacheOptions_for_keep() {
local opts=""
local lopts="dryrun,move:,remove,arch:,cachedir:,force,help,ignore:,keep:,min-atime:,min-mtime:,nocolor,null,quiet,uninstalled,verbose,version"
local sopts="dm:ra:c:i:fhk:zquvV"
opts="$(/usr/bin/getopt -o="$sopts" --longoptions "$lopts" --name "$progname" -- "$@")" || {
$OptFunc -h
return 1
}
eval set -- "$opts"
while true ; do
case "$1" in
--) shift; break ;;
# these options we simply ignore or don't want:
-d|--dryrun|-m|--move) DIE "$FUNCNAME: paccache option $1 was not expected" ;;
-a|--arch|-c|--cachedir|-i|--ignore|--min-atime|--min-mtime) shift ;;
-f|--force|-h|--help|--nocolor|-z|--null|-q|--quiet|-u|--uninstalled|-v|--verbose|-V|--version) ;;
# this is what we are looking for:
-r|--remove) current_keepcount=3 ;;
-k|--keep) current_keepcount="$2"
[ "${current_keepcount//[0-9]/}" ] && DIE "cannot parse paccache options.\nFile:\n $s\nLine:\n $exec_start_line"
shift
;;
esac
shift
done
}
DIE() {
local msg="$1"
shift
if false ; then
echo "Error: $msg" | eos_yad --text-info --image=$ICO_ERROR --title="$progname error" \
--wrap --width=500 --height=300 --button=yad-quit:1 "$@"
else
eos_yad --form --image=$ICO_ERROR --title="$progname error" --text="Error: $msg" --button=yad-quit:1 --scroll "$@"
fi
exit 1
}
GetCurrentValues() {
local t="$timer"
local s="$service"
if [ ! -r $s ] ; then
# service is only under /usr/lib/... so get current values from there
t="$dir2/$pt"
s="$dir2/paccache.service"
local why="Is pacman-contrib installed?"
test -r $t || DIE "sorry, $t does not exist. $why"
test -r $s || DIE "sorry, $s does not exist. $why"
fi
current_period="$(grep "^OnCalendar=" $t | cut -d '=' -f 2)"
current_delete_uninstalled=FALSE
# Note: the ExecStart= line can be a bit tricky.
current_keepcount="$(grep "^ExecStart=.*-rk" $s | tail -n1 | sed -E 's|.*-rk([^ ;]*).*|\1|')" # only get the * of '-rk*' from the ExecStart= line
if [ -z "$current_keepcount" ] ; then
current_keepcount="$(grep "^ExecStart=.*keep=" $s | tail -n1 | sed -E 's|.*keep=([^ ;]*).*|\1|')" # only get the * of 'keep=*' from the ExecStart= line
fi
[ "$current_keepcount" ] || current_keepcount=3
# current_keepcount=$(eval echo ${current_keepcount})
# PaccacheOptions_for_keep $current_keepcount
local arg args=()
for arg in $current_keepcount ; do
case "$arg" in
'$PACCACHE_ARGS') args+=($PACCACHE_ARGS) ;;
*) args+=(-k "$arg") ;;
esac
done
PaccacheOptions_for_keep "${args[@]}"
}
Usage() {
cat <<EOF
Usage: $progname [options]
Options:
--defaults Enable manager with default values (run $period, keep latest $keepcount).
-v, --verbose Increase verbosity (= see more terminal output).
-h, --help This help.
EOF
[ -n "$1" ] && exit "$1"
}
AddCommand() {
local show=yes
case "$1" in
--silent) show=no; shift ;;
esac
local command="$1"
cmds+=" ; $command"
if [ "$verbose" = "yes" ] && [ "$show" = "yes" ] ; then
echo "$command" >> $vfile
fi
}
_paccache_cleaner_manager()
{
local progname=paccache-service-manager
eos_assert_deps $progname yad || return 1
local dir=/etc/systemd/system
local dir2=/usr/lib/systemd/system # current values may be only here...
local service=$dir/paccache.service
local timer=$dir/paccache.timer
local current_period
local current_keepcount
local current_delete_uninstalled
local pt="paccache.timer"
local cmd_yad
local cmds=":" cmds2=() cmd_period cmd_ruk=""
local xx
local period_vals=""
local txt
local image=$ICO_DISK # drive-harddisk # disk-utility
local result=""
local field_nr=1
local indent="<tt> </tt>"
local options=""
local defaults=no
local period=weekly keepcount=2 delete_uninstalled=FALSE
local first_time=no
local verbose=no
local vfile="" # temporary file for showing all commands in verbose mode
local keepcount_max=100
local -r cachedir=$(GetCacheDir)
local du="$(LANG=C /usr/bin/du --si -s "$cachedir" 2>/dev/null | /usr/bin/awk '{print $1}' | sed 's|\([KMGT]\)$| \1B|')"
local df="$(LANG=C /usr/bin/df --si | /usr/bin/grep -w / | /usr/bin/awk '{print $4}' | sed 's|\([KMGT]\)$| \1B|')"
if [ ! -r $service ] ; then
first_time=yes
fi
case "$1" in
-v | --verbose) options+=" -v"
options="${options# }" # drop leading space
verbose=yes
vfile="$(mktemp)"
;;
-h | --help) Usage 0
;;
--defaults) defaults=yes
;;
esac
GetCurrentValues
if [ "$defaults" = "no" ] ; then
txt="<b>Modifies the service that cleans up pacman cache periodically.\n"
txt+="Below you'll see settings and their current values.\n\n"
txt+="Current status:\n"
txt+="${indent}Package cache usage: $du\n"
txt+="${indent}Free space on disk: $df</b>\n"
txt+="\n"
# List possible period values, and set the default
for xx in daily weekly monthly ; do
test -n "$period_vals" && period_vals+="!" # separator
test "$xx" = "$current_period" && period_vals+="^" # default
period_vals+="$xx"
done
cmd_yad=(
eos_yad --form --width=500 --image=$image
--title='Pacman cache cleaner service manager'
--text="$txt"
--field='Cleaning period!How often the package cache will be cleaned':CB "$period_vals"
--field='Number of the latest package versions to keep!Keep only the selected number of each package':NUM "$current_keepcount"
--field='Remove uninstalled but still cached packages now!One time operation':CHK "$current_delete_uninstalled"
)
result="$("${cmd_yad[@]}" 2>/dev/null)"
[ -n "$result" ] || return # package kde-gtk-config should remove possible gtk related yad warnings...
# New values
period="$( echo "$result" | cut -d '|' -f $field_nr)" ; ((++field_nr))
keepcount="$( echo "$result" | cut -d '|' -f $field_nr)" ; ((++field_nr))
delete_uninstalled="$(echo "$result" | cut -d '|' -f $field_nr)" ; ((++field_nr))
# ad hoc value checks
[ "$(echo "$keepcount" | sed 's|[0-9]||g')" = "" ] || DIE "sorry, keep count value '$keepcount' is not a number"
[ $keepcount -le $keepcount_max ] || DIE "sorry, keep count value '$keepcount' is more than $keepcount_max and not supported"
case "$period" in
daily | weekly | monthly) ;;
*) DIE "sorry, cleaning period '$period' is unsupported" ;;
esac
case "$delete_uninstalled" in
TRUE | FALSE) ;;
*) DIE "sorry, value '$delete_uninstalled' for removing uninstalled packages is unsupported" ;;
esac
fi
# Build the final paccache command list.
# Clean up cache now and periodically
if [ "$delete_uninstalled" = "TRUE" ] ; then
cmd_ruk="paccache $options -ruk0"
fi
if [ "$keepcount $period $delete_uninstalled" != "$current_keepcount $current_period $current_delete_uninstalled" ] || [ "$first_time" = "yes" ] ; then
cmd_period="paccache $options -rk$keepcount"
if [ ! -r $service ] ; then
AddCommand "cp $dir2/$pt $timer"
AddCommand "cp $dir2/paccache.service $service"
fi
# Allow ExecStart line with both /usr/bin/paccache or just paccache.
AddCommand "sed -i $service -e 's|^ExecStart=paccache .*$|ExecStart=$cmd_period|' -e 's|^ExecStart=/usr/bin/paccache .*$|ExecStart=$cmd_period|'"
AddCommand "sed -i $timer -e 's|^OnCalendar=.*$|OnCalendar=$period|'"
AddCommand "systemctl enable --now $pt"
AddCommand "systemctl daemon-reload"
fi
if [ -n "$cmd_ruk" ] ; then
AddCommand "$cmd_ruk"
fi
# Execute the command list.
if [ "$cmds" != ":" ] ; then
AddCommand --silent "echo Service reloaded."
if [ "$verbose" = "yes" ] ; then
# pkexec bash -c "cat '$vfile' ; $cmds"
RunInTerminal "cat \"$vfile\"; $EOS_ROOTER \"$cmds\""
rm -f "$vfile"
else
# pkexec bash -c "$cmds"
if [ "$verbose" = "yes" ] ; then
RunInTerminal "cat \"$vfile\"; $EOS_ROOTER \"$cmds\""
else
RunInTerminal "echo \"Running selected commands.\"; $EOS_ROOTER \"$cmds\""
fi
fi
else
# echo "No change to settings."
local msg="Nothing to do (settings not changed)"
eos_yad --form --image=$ICO_INFO --title="$progname" --text="$msg" --button=yad-quit:1 --scroll
fi
}
_paccache_cleaner_manager "$@"