mirror of
https://github.com/endeavouros-team/eos-bash-shared.git
synced 2026-06-13 01:34:36 +00:00
208 lines
6.6 KiB
Bash
Executable File
208 lines
6.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Pacdiff for EndeavourOS.
|
|
|
|
UserWants() {
|
|
case "$user_wants" in
|
|
cli | both) [ "$1" = "cli" ] && return 0 ;;
|
|
esac
|
|
which yad &>/dev/null || return 1
|
|
case "$user_wants" in
|
|
gui | both) [ "$1" = "gui" ] && return 0 ;;
|
|
esac
|
|
return 1
|
|
}
|
|
|
|
SafetyWarning() {
|
|
if [ "$EOS_PACDIFF_WARNING" = "yes" ] ; then
|
|
local txt=""
|
|
txt+="NOTE: <b>$progname</b> is a powerful tool, so use it carefully!\n\n"
|
|
txt+="For example, please do <i>not</i> modify files like:\n"
|
|
txt+="<tt> /etc/passwd</tt>\n"
|
|
txt+="<tt> /etc/group</tt>\n"
|
|
txt+="<tt> /etc/shadow</tt>\n"
|
|
txt+="and related files unless you know <i>exactly</i> what you are doing.\n\n"
|
|
txt+="You can remove this warning popup by changing the value of\n"
|
|
txt+="variable <tt>EOS_PACDIFF_WARNING</tt> in file <tt>/etc/eos-script-lib-yad.conf</tt>.\n"
|
|
txt+="(Note that you may need to merge the changes from\nfile /etc/eos-script-lib-yad.conf.pacnew first!)\n"
|
|
|
|
if UserWants cli ; then
|
|
txt2="$(echo "$txt" | sed -e 's|<[/bit]*>||g' -e 's|\\n|\n|g')"
|
|
printf "%s\n\n" "$txt2" >&2
|
|
fi
|
|
if UserWants gui ; then
|
|
eos_yad --form --image=$ICO_WARNING --title="Warning" --text="$txt" --button="yad-ok!!I understand":1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
HasPacdiffs() { test -n "$(echo q | DIFFPROG=diff /usr/bin/pacdiff)" ; }
|
|
DoesSudo() { groups | grep -Pw 'root|wheel' >/dev/null ; }
|
|
|
|
PacdiffCmd() {
|
|
local differ="$1"
|
|
|
|
if HasPacdiffs ; then
|
|
case "$differ" in # some differs may need options
|
|
vim) differ+=" -d" ;;
|
|
esac
|
|
local -r doas="/usr/bin/sudo"
|
|
local -r compress="/usr/bin/gzip" # compress with "gzip" or "zstd --rm"
|
|
local cmdfile
|
|
cmdfile=$(mktemp "$HOME/.tmp.$progname.tmpXXX") || DIE "creating a temporary file under $HOME failed" # don't mount $HOME with noexec!
|
|
|
|
cat <<EOF > $cmdfile
|
|
#!/bin/bash
|
|
echo "==> starting pacdiff with '$differ' diff support..." >&2
|
|
EOF
|
|
if [ $backup_all = yes ] ; then
|
|
local -r pacnews=($(DIFFPROG=diff /usr/bin/pacdiff -o))
|
|
local -r time=$(date +%Y%m%d-%H%M%S)
|
|
|
|
cat <<EOF >> $cmdfile
|
|
echo " -> creating backups under folder $backupdir" >&2
|
|
$doas /usr/bin/mkdir -p $backupdir
|
|
$doas /usr/bin/chmod go-rwx $backupdir
|
|
EOF
|
|
local bf bu
|
|
for bf in "${pacnews[@]}" ; do
|
|
bf=${bf%.*} # e.g. /etc/akm.conf
|
|
bu=${bf##*/}.$time # e.g. akm.conf.20250215-170300
|
|
echo "$doas /usr/bin/cp $bf $backupdir/$bu" >> $cmdfile
|
|
echo "$doas $compress $backupdir/$bu" >> $cmdfile
|
|
done
|
|
fi
|
|
|
|
echo "DIFFPROG=\"/usr/bin/$differ\" /usr/bin/pacdiff -s 2>/dev/null" >> $cmdfile
|
|
chmod u+x,go-rwx $cmdfile
|
|
|
|
if [ $start_new_terminal = yes ] ; then
|
|
RunInTerminal "$cmdfile"
|
|
else
|
|
bash -c "$cmdfile"
|
|
fi
|
|
rm -f $cmdfile
|
|
return $diffs_yes
|
|
else
|
|
local msg="$progname: nothing to do."
|
|
if UserWants cli ; then
|
|
echo "$indent$msg" >&2
|
|
fi
|
|
if UserWants gui ; then
|
|
eos_yad_nothing_todo "<tt>$msg</tt>" 5
|
|
fi
|
|
|
|
[ $start_new_terminal = yes ] && return $diffs_no_nt || return $diffs_no
|
|
fi
|
|
}
|
|
|
|
Usage() {
|
|
cat <<EOF >&2
|
|
Usage: $progname [options]
|
|
Options: -h, --help This help.
|
|
-b, --backup Save the old files (in view, merge, and overwrite modes) with .bak. Default.
|
|
--no-backup The opposite of option --backup.
|
|
--nt Starts a new terminal for the output (used by the Welcome app).
|
|
--quiet Do not display messages.
|
|
--msg-types=WHAT Selects how informational messages will be displayed.
|
|
Supported values for WHAT:
|
|
"cli" Only using terminal CLI.
|
|
"gui" Only using popup windows.
|
|
"both" "cli" + "gui".
|
|
"" Do not display messages (same as --quiet).
|
|
Default: "both".
|
|
EOF
|
|
case "$1" in
|
|
OK) exit 0 ;;
|
|
FAIL) exit 1 ;;
|
|
esac
|
|
}
|
|
|
|
DIE() {
|
|
local msg="$1"
|
|
local linenr="${BASH_LINENO[0]}"
|
|
|
|
case "$linenr" in
|
|
[1-9]*) linenr=" (line $linenr)" ;;
|
|
*) linenr="" ;;
|
|
esac
|
|
echo -e "\n==> $progname$linenr: error: $msg\n" >&2
|
|
Usage FAIL
|
|
}
|
|
|
|
Main()
|
|
{
|
|
local progname=${0##*/}
|
|
# exit codes
|
|
local diffs_yes=0
|
|
local diffs_error=1
|
|
local diffs_no=2
|
|
local diffs_no_nt=3
|
|
|
|
local start_new_terminal=no
|
|
local indent=""
|
|
local user_wants=both
|
|
local -r backup_default=yes
|
|
local backup_all=$backup_default
|
|
local -r backupdir="/etc/.EOS_BACKUPDIR"
|
|
local -r extra_conf=/etc/$progname.conf
|
|
local arg
|
|
|
|
DoesSudo || DIE "sorry, user needs to have proper rights for 'sudo'"
|
|
|
|
# pre-handling of certain options
|
|
for arg in "$@" ; do
|
|
case "$arg" in
|
|
--quiet) user_wants="" ;;
|
|
--msg-types=*) user_wants="${1#*=}" ;; # cli gui both ""
|
|
esac
|
|
done
|
|
|
|
source /usr/share/endeavouros/scripts/eos-script-lib-yad || return $diffs_error
|
|
export -f eos_yad
|
|
export -f eos_yad_nothing_todo
|
|
AssignIconVariables_in_eos_bash_shared
|
|
|
|
case "$user_wants" in
|
|
gui|both) CanRunYad || user_wants=cli ;;
|
|
esac
|
|
|
|
# read config file if it exists; command line options will override config file values
|
|
if [ -e $extra_conf ] ; then
|
|
case "$user_wants" in
|
|
cli | both) echo "==> reading $extra_conf" >&2 ;;
|
|
esac
|
|
source $extra_conf
|
|
else
|
|
echo "==> info: file $extra_conf is not available." >&2
|
|
fi
|
|
|
|
# handle rest of the options
|
|
while [ "$1" ] ; do
|
|
case "$1" in
|
|
-h | --help) Usage OK ;;
|
|
-b | --backup) backup_all=yes ;;
|
|
--no-backup) backup_all=no ;;
|
|
--indent=*) indent="${1#*=}" ;;
|
|
--nt) start_new_terminal=yes ;;
|
|
--quiet) ;; # user_wants="" ;;
|
|
--msg-types=*) ;; # user_wants="${1#*=}" ;; # cli gui both ""
|
|
-*) DIE "option '$1' not supported." ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
SafetyWarning
|
|
|
|
# see /etc/eos-script-lib-yad.conf about EOS_WELCOME_PACDIFFERS
|
|
|
|
for differ in "${EOS_WELCOME_PACDIFFERS[@]}" ; do
|
|
if [ -x /usr/bin/${differ%% *} ] ; then
|
|
PacdiffCmd "$differ"
|
|
return $?
|
|
fi
|
|
done
|
|
}
|
|
|
|
Main "$@"
|