I've been playing with a little script to update packages.
So here is the thing. When a package manager has an exclusive lock and this script tries to start the update, it calls a function to check wheather there is a lock or not.
If there is a lock it opens a Yad progress dialog which waits until the package manager (synaptic, gdebi-gtk, aptitude, apt...) releases the lock.
Now, when I click on Cancel on that same dialog Yad kills the parent process but there is still a child process that is checking the lock.
It eventualy closes when the package manager is closed, but I wonder if there is a way to kill it along with the parent.
The problem is in function checklock. When the synaptic is running and you select the 'Update Packages' from the main dialog, click the Cancel and look for the process with htop.
Any suggestions are welcome. :)
#!/bin/bash
# Licensed under the GNU GPLv3.
#.%%...%%..%%%%%%...%%%%...%%..%%...%%%%.._.
#.%%%.%%%....%%....%%......%%.%%...%%..%%.2.
#.%%.%.%%....%%.....%%%%...%%%%....%%..%%.0.
#.%%...%%....%%........%%..%%.%%...%%..%%.8.
#.%%...%%..%%%%%%...%%%%...%%..%%...%%%%..3.
# Bash/YAD Debian Package Updater based on Linux Lite update tool
# ------- Change log ------
# Switched to YAD and adapted to Debian
# Added: a main dialog loop, log, option to purge the lists, about dialog
# Added: a check for exclusive lock
# -----------------------------------
# Note: function checklock -> if Cancel is selected while the package manager (synaptic) is open
# Yad progress kills the parent but will not kill the child process running the exclusive lock check
# Subshell will be running until the package manager releases the lock
# -----------------------------------
# Milos Pavlovic
#
APPNAME="Update Tool"
LOGFILE=/var/log/misko-update.log
UPDATELOG=/var/log/last-update-log.log
# dist-upgrade or upgrade, change next line
COMMAND=dist-upgrade
# Yad window icon
ic=/usr/local/bin/images/vsidoorb_80.png
# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root!" 1>&2
echo "TIP: Use gksudo or a similar tool." 1>&2
exit 1
fi
function log(){
message="$@"
echo '['$(date +%D\ %H:%M:%S)'] '$message | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?m//g" | fold -sw 76 >>$LOGFILE
}
function checklock () {
# Checks for exclusive lock and wait until package managers are closed
while fuser /var/lib/dpkg/lock 2>&1 >/dev/null ; do
echo "# Waiting for other software managers to finish..." $"\n"
if [ "$(pidof synaptic)" ]; then
echo "# Waiting for other software managers to finish..." $"\nsynaptic"
fi
echo 1
sleep 1
echo 30
sleep 1
echo 60
sleep 1
if [ ! -z "$(pgrep gdebi-gtk)" ]; then
echo "# Waiting for other software managers to finish..." $"\ngdebi-gtk"
fi
echo 95
sleep 1
done | yad --progress --title="$APPNAME - close any open package managers" --percentage=20 --auto-close --auto-kill --button="Cancel:1"
if [[ $? -eq 1 ]];then
sleep 1
exit
fi
}
function showlog () {
if [[ ! -f $LOGFILE ]]; then
yad --info --title="$APPNAME Info" --text="No log file."
elif [[ -z "$(cat $LOGFILE)" ]]; then
yad --info --title="$APPNAME Info" --text="Log is empty."
else
yad --text-info --button="Open log in Medit:0" --button="Close:1" --title="$APPNAME log file -> $log" --height=600 --width=800 --filename="$LOGFILE"
if [ "${PIPESTATUS[0]}" -eq "0" ]; then
medit "$LOGFILE" &
fi
fi
return
}
function about () {
yad --info --title="About $APPNAME " --height=20 --width=300 --text="$APPNAME is a small update GUI, fork of Linux Lite Upgrade tool and very easy to use.\n\nLicence GPL v3.\n\n Milos Pavlovic 2016"
return
}
function update() {
# Temporary file for error tracking
TMPLIST=$(mktemp /tmp/repos.XXXXXX)
APTUPDATE=$(grep '^deb' -c /etc/apt/sources.list) # Total number of repositories registered, this is approximated
apt-get update 2>&1 | tee $TMPLIST | awk -v total=$APTUPDATE '/^Ign|^Get/{count++;$1=""} FNR { if (total != 0){percentage=int (100*count/total);print (percentage < 90?percentage:90),"\n#",substr($0, 0, 128) }; fflush(stdout)}' \
| yad --progress --text="Updating package lists..." --window-icon="$ic" --title="Updating Software Sources - please wait..." --percentage=0 --auto-close --width=600
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
err_msg=$(awk '/^(W:|E:)/{$1=""; print $0}' $TMPLIST | tail -n 1 ) #Get errors/warnings
log "ERROR: $err_msg"
unset APTUPDATE
rm -f $TMPLIST
unset TMPLIST
yad --error \
--title="Error" --text="$APPNAME couldn't fetch the package cache information lists.\nCheck the log for details"
return
fi
log "INFO: Software sources were updated."
unset APTUPDATE
rm -f $TMPLIST
unset TMPLIST
# Temporary list of available updates
UPDATES=$(mktemp /tmp/updateslist.XXXXXX)
# Creates a list in /tmp/updateslist
apt-get --just-print $COMMAND 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "Name: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | awk '{print NR,":\t"$0}' \
| tee $UPDATES | yad --progress --window-icon="$ic" --pulsate --title="Calculating Updates" --text="Please wait..." --auto-close
# Check if any updates are available, if there are none, script pops up dialog box saying 'No Updates Available', removes /tmp/updateslist.XXXXXX
if [ -z "$(cat $UPDATES)" ]; then
log "INFO: No updates are available."
rm -f $UPDATES
unset UPDATES
yad --info --window-icon=$ic --title="$APPNAME" \
--text="No Updates Available"
return
fi
# Log available updates
lst_upgrades=$(awk 'BEGIN { FS = "[ ]" } { print $3 }' $UPDATES)
log "INFO: Updates available: $lst_upgrades"
unset lst_upgrades
# Insert text into /tmp/updateslist.XXXXXX
sed -i -e '1 i\List of available Updates' -e '1 i\Click Update to continue or Cancel to stop the update process\n' $UPDATES
# Erase existing available info
sudo dpkg --clear-avail
# Call the yad dialog to show update list
yad --text-info --window-icon="$ic" --ok-label="Update" --cancel-label="Cancel" --title="Available Updates" --width=780 --height=300 --filename="$UPDATES"
# Continue script if no halt
if [ "$?" -eq "0" ];then
# Write log
log "INFO: Update started."
# Remove tmp file and unset variable
rm -f $UPDATES
unset UPDATES
# Begin upgrade
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" $COMMAND --show-progress -y 2>&1 | tee $UPDATELOG | awk ' BEGIN { FS=" "; total=1;end_download=0} /upgraded/ {total= $1 + $3;FS="[ :]" } /^Get:[[:digit:]]+/ {printf "#Downloading %s %s %s\n",$5,$(NF-1),$NF;print int(($2 - 1) * 100 / total); fflush(stdout)} /^\(Reading / {if (end_download==0){print 100;fflush(stdout);end_download=1}} /^(Preparing|Unpacking|Selecting|Processing|Setting|Download)/ {print "#", $0; fflush(stdout)} /^Progress/ {print match($0, /([0-9]+)/, arr); if(arr[1] != "") print arr[1] ; fflush(stdout)}' \
| ( yad --window-icon=$ic --progress --width=600 --text="Downloading package(s)...\nThis may take a while." --title="Downloading - please wait..." --percentage=0 --auto-close ; yad --progress --window-icon=$ic --width=600 --text="Installing and configuring packages...\nThis may take a while." --title="Installing - please wait..." --auto-close )
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
err_msg=$(awk '/^(W:|E:)/{$1=""; print $0}' $UPDATELOG | tail -n 1)
log "ERROR:$err_msg"
yad --error \
--title="Error" --window-icon="$ic" --text="Updates have failed.\nCheck the log for details."
return
fi
# Halt updates script if user selects Cancel
else
log "INFO: User has canceled software upgrades."
rm -f $UPDATES
unset UPDATES
return
fi
log "INFO: Updates successfully installed."
PROCEED=$(yad --question --title="$APPNAME" --text="Updates have finished installing.\n\nWould you like to view the $APPNAME log?"; echo $?)
if [ ${PROCEED} -eq 1 ]; then
yad --info --title="$APPNAME" --text="Updates Complete."
return;
else
yad --text-info --ok-label="Quit" --cancel-label="Cancel" --title="Updates Log" --width=700 --height=300 --filename="$UPDATELOG"
fi
return
}
# Start the main loop
while (true); do
selection=$(yad --list --radiolist --title="$APPNAME" --window-icon="$ic" --text="Pick a task" --height=310 --width=350 --hide-column=2 --button="Exit:1" --button="Select:0" --column="Pick" --column="Function" --column="Task" \
"TRUE" "update" "Update Packages" "FALSE" "showlog" "Show log" "FALSE" "purgecache" "Purge the old cache" "FALSE" "about" "About this application" "FALSE" "exit" "Exit" --print-column=2) || exit
selection=$(echo $selection | cut -d '|' -f 1)
case "$selection" in
update) checklock; update
;;
showlog) showlog
;;
purgecache) checklock; sudo rm -vfd /var/lib/apt/lists/* || yad --error --text="Error while purging the cache\nTry doing it manualy\nsudo rm -vfd /var/lib/apt/lists/* "
;;
about) about
;;
exit) exit 0
;;
esac
done
Have you seen this discussion? (http://www.unix.com/shell-programming-and-scripting/207705-kill-all-child-process-script.html)
Will take a look at the script and try to debug as well
What do you name it? I know I can use any, just wanting to know your naming convention
Thanks
Quote from: VastOne on January 13, 2016, 12:58:40 AM
Have you seen this discussion? (http://www.unix.com/shell-programming-and-scripting/207705-kill-all-child-process-script.html)
Will take a look at the script and try to debug as well
What do you name it? I know I can use any, just wanting to know your naming convention
Thanks
Thank you.
I haven't came up with a name. Might as well be updater.sh as I named it here. :D
I've come up with a solution. Killing all the processes with the name from basename.
Using the basename means the script name can be anything.
function checklock () {
# Checks for exclusive lock and wait until package managers are closed
while fuser /var/lib/dpkg/lock 2>&1 >/dev/null ; do
echo "# Waiting for other software managers to finish..." $"\n"
if [ "$(pidof synaptic)" ]; then
echo "# Waiting for other software managers to finish..." $"\nsynaptic"
fi
echo 1
sleep 1
echo 30
sleep 1
echo 60
sleep 1
if [ ! -z "$(pgrep gdebi-gtk)" ]; then
echo "# Waiting for other software managers to finish..." $"\ngdebi-gtk"
fi
echo 95
sleep 1
done | (if ! yad --progress --title="$APPNAME - close any open package managers" --percentage=20 --auto-close --button="Cancel:1";then killall $(basename $0); exit; fi)
}
Hmm, yad-updater.sh would be a good name. ;D
Fixed the text in the progress when downloading packages. It should display the package name when downloading, but not tested yet.
So here is the whole thing
#!/bin/bash
# Licensed under the GNU GPLv3.
#.%%...%%..%%%%%%...%%%%...%%..%%...%%%%.._.
#.%%%.%%%....%%....%%......%%.%%...%%..%%.2.
#.%%.%.%%....%%.....%%%%...%%%%....%%..%%.0.
#.%%...%%....%%........%%..%%.%%...%%..%%.8.
#.%%...%%..%%%%%%...%%%%...%%..%%...%%%%..3.
# Bash/YAD Debian Package Updater based on Linux Lite update tool
# ------- Change log ------
# Switched to YAD and adapted to Debian
# Added: a main dialog loop, log, option to purge the lists, about dialog
# Added: a check for exclusive lock
# -----------------------------------
# Note:
# -----------------------------------
# Milos Pavlovic
#
APPNAME="Update Tool"
LOGFILE=/var/log/misko-update.log
UPDATELOG=/var/log/last-update-log.log
# dist-upgrade or upgrade, change next line
COMMAND=dist-upgrade
# Yad window icon
ic=/usr/local/bin/images/vsidoorb_80.png
# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root!" 1>&2
echo "TIP: Use gksudo or a similar tool." 1>&2
exit 1
fi
function log(){
message="$@"
echo '['$(date +%D\ %H:%M:%S)'] '$message | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?m//g" | fold -sw 76 >>$LOGFILE
}
function checklock () {
# Checks for exclusive lock and wait until package managers are closed
while fuser /var/lib/dpkg/lock 2>&1 >/dev/null ; do
echo "# Waiting for other software managers to finish..." $"\n"
if [ "$(pidof synaptic)" ]; then
echo "# Waiting for other software managers to finish..." $"\nsynaptic"
fi
echo 1
sleep 1
echo 30
sleep 1
echo 60
sleep 1
if [ ! -z "$(pgrep gdebi-gtk)" ]; then
echo "# Waiting for other software managers to finish..." $"\ngdebi-gtk"
fi
echo 95
sleep 1
done | (if ! yad --progress --title="$APPNAME - close any open package managers" --percentage=20 --auto-close --button="Cancel:1";then killall $(basename $0); exit; fi)
}
function showlog () {
if [[ ! -f $LOGFILE ]]; then
yad --info --title="$APPNAME Info" --text="No log file."
elif [[ -z "$(cat $LOGFILE)" ]]; then
yad --info --title="$APPNAME Info" --text="Log is empty."
else
yad --text-info --button="Open log in Medit:0" --button="Close:1" --title="$APPNAME log file -> $log" --height=600 --width=800 --filename="$LOGFILE"
if [ "${PIPESTATUS[0]}" -eq "0" ]; then
medit "$LOGFILE" &
fi
fi
return
}
function about () {
yad --info --title="About $APPNAME " --height=20 --width=300 --text="$APPNAME is a small update GUI, fork of Linux Lite Upgrade tool and very easy to use.\n\nLicence GPL v3.\n\n Milos Pavlovic 2016"
return
}
function update() {
# Temporary file for error tracking
TMPLIST=$(mktemp /tmp/repos.XXXXXX)
APTUPDATE=$(grep '^deb' -c /etc/apt/sources.list) # Total number of repositories registered, this is approximated
apt-get update 2>&1 | tee $TMPLIST | awk -v total=$APTUPDATE '/^Ign|^Get/{count++;$1=""} FNR { if (total != 0){percentage=int (100*count/total);print (percentage < 90?percentage:90),"\n#",substr($0, 0, 128) }; fflush(stdout)}' \
| yad --progress --text="Updating package lists..." --window-icon="$ic" --title="Updating Software Sources - please wait..." --percentage=0 --auto-close --width=600
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
err_msg=$(awk '/^(W:|E:)/{$1=""; print $0}' $TMPLIST | tail -n 1 ) #Get errors/warnings
log "ERROR: $err_msg"
unset APTUPDATE
rm -f $TMPLIST
unset TMPLIST
yad --error \
--title="Error" --text="$APPNAME couldn't fetch the package cache information lists.\nCheck the log for details"
return
fi
log "INFO: Software sources were updated."
unset APTUPDATE
rm -f $TMPLIST
unset TMPLIST
# Temporary list of available updates
UPDATES=$(mktemp /tmp/updateslist.XXXXXX)
# Creates a list in /tmp/updateslist
apt-get --just-print $COMMAND 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "Name: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | awk '{print NR,":\t"$0}' \
| tee $UPDATES | yad --progress --window-icon="$ic" --pulsate --title="Calculating Updates" --text="Please wait..." --auto-close
# Check if any updates are available, if there are none, script pops up dialog box saying 'No Updates Available', removes /tmp/updateslist.XXXXXX
if [ -z "$(cat $UPDATES)" ]; then
log "INFO: No updates are available."
rm -f $UPDATES
unset UPDATES
yad --info --window-icon=$ic --title="$APPNAME" \
--text="No Updates Available"
return
fi
# Log available updates
lst_upgrades=$(awk 'BEGIN { FS = "[ ]" } { print $3 }' $UPDATES)
log "INFO: Updates available: $lst_upgrades"
unset lst_upgrades
# Insert text into /tmp/updateslist.XXXXXX
sed -i -e '1 i\List of available Updates' -e '1 i\Click Update to continue or Cancel to stop the update process\n' $UPDATES
# Erase existing available info
sudo dpkg --clear-avail
# Call the yad dialog to show update list
yad --text-info --window-icon="$ic" --button="Update:0" --button="Cancel:1" --title="Available Updates" --width=780 --height=300 --filename="$UPDATES"
# Continue script if no halt
if [ "$?" -eq "0" ];then
# Write log
log "INFO: Update started."
# Remove tmp file and unset variable
rm -f $UPDATES
unset UPDATES
# Begin upgrade
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" $COMMAND --show-progress -y 2>&1 | tee $UPDATELOG | awk ' BEGIN { FS=" "; total=1;end_download=0} /upgraded/ {total= $1 + $3;FS="[ :]" } /^Get:[[:digit:]]+/ {printf "#Downloading %s %s %s\n",$7,$(NF-1),$NF;print int(($2 - 1) * 100 / total); fflush(stdout)} /^\(Reading / {if (end_download==0){print 100;fflush(stdout);end_download=1}} /^(Preparing|Unpacking|Selecting|Processing|Setting|Download)/ {print "#", $0; fflush(stdout)} /^Progress/ {print match($0, /([0-9]+)/, arr); if(arr[1] != "") print arr[1] ; fflush(stdout)}' \
| ( yad --window-icon=$ic --progress --width=600 --text="Downloading package(s)...\nThis may take a while." --title="Downloading - please wait..." --percentage=0 --auto-close ; yad --progress --window-icon=$ic --width=600 --text="Installing and configuring packages...\nThis may take a while." --title="Installing - please wait..." --auto-close )
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
err_msg=$(awk '/^(W:|E:)/{$1=""; print $0}' $UPDATELOG | tail -n 1)
log "ERROR:$err_msg"
yad --error \
--title="Error" --window-icon="$ic" --text="Updates have failed.\nCheck the log for details."
return
fi
# Halt updates script if user selects Cancel
else
log "INFO: User has canceled software upgrades."
rm -f $UPDATES
unset UPDATES
return
fi
log "INFO: Updates successfully installed."
PROCEED=$(yad --question --title="$APPNAME" --text="Updates have finished installing.\n\nWould you like to view the $APPNAME log?"; echo $?)
if [ ${PROCEED} -eq 1 ]; then
yad --info --title="$APPNAME" --text="Updates Complete."
return;
else
yad --text-info --ok-label="Quit" --cancel-label="Cancel" --title="Updates Log" --width=700 --height=300 --filename="$UPDATELOG"
fi
return
}
# Start the main loop
while (true); do
selection=$(yad --list --radiolist --title="$APPNAME" --window-icon="$ic" --text="Pick a task" --height=310 --width=350 --hide-column=2 --button="Exit:1" --button="Select:0" --column="Pick" --column="Function" --column="Task" \
"TRUE" "update" "Update Packages" "FALSE" "showlog" "Show log" "FALSE" "purgecache" "Purge the old cache" "FALSE" "about" "About this application" "FALSE" "exit" "Exit" --print-column=2) || exit
selection=$(echo $selection | cut -d '|' -f 1)
case "$selection" in
update) checklock; update
;;
showlog) showlog
;;
purgecache) checklock; sudo rm -vfd /var/lib/apt/lists/* || yad --error --text="Error while purging the cache\nTry doing it manualy sudo rm /var/lib/apt/lists/* -vf"
;;
about) about
;;
exit) exit 0
;;
esac
done
Also fixed the button name here.
(http://imgur.com/iXKRAMPl.png)
Could be an issue here and there but it's updating packages.
Having an option to select which package to update appears too complicated right now. I'll skip that one because it look's like a dependancy hell to me. :D
.. ich hab` mir den code geschnappt und `was rumgespielt
#!/bin/bash
#
APPNAME="Update Tool"
SCRIPTPFAD=$(dirname $(readlink -f $0))
LOGFILE=/var/log/misko-update.log
UPDATELOG=/var/log/last-update-log.log
#log einrückung und format
indent_weite="sed 's/^/ |/'"
maximal_weite="70"
# dist-upgrade or upgrade, change next line
COMMAND=dist-upgrade
# Yad window icon
#ic=/usr/share/icons/oxygen/22x22/apps/system-software-update.png
#ic=/usr/share/icons/oxygen/22x22/apps/system-software-update-alpha.png
ic=/usr/local/bin/images/vsidoorb_80.png
function log_date(){
message="$@"
echo '['$(date +%d.%m.%Y\ %H:%M:%S)'] '$message | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?m//g" | fold -sw 76 >> $LOGFILE
}
function log_indent(){
message="$@"
string=$($message | sed -n -e '1h;2,$H;${x;s/\n/ /g;p}')
echo ' |'$message | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]//g" | fold -sw 76 >> $LOGFILE
}
function indent() {
string=$(echo $@ | fmt --width=$maximal_weite | eval "$indent_weite")
echo "$string" >> $LOGFILE
}
function checklock () {
# Checks for exclusive lock and wait until package managers are closed
while fuser /var/lib/dpkg/lock 2>&1 >/dev/null ; do
echo "# ! . . . . . . warte auf Beendung andere Software-Manager . . . . . . !" $"\n"
if [ "$(pidof synaptic)" ]; then
echo "# ! . . . . . . warte auf Beendung andere Software-Manager . . . . . . !" $"\nsynaptic"
fi
echo 1
sleep 1
echo 30
sleep 1
echo 60
sleep 1
if [ ! -z "$(pgrep gdebi-gtk)" ]; then
echo "# ! . . . . . . warte auf Beendung andere Software-Manager . . . . . . !" $"\ngdebi-gtk"
fi
echo 95
sleep 1
done | (if ! yad --progress \
--posx=50 \
--posy=50 \
--window-icon="$ic" \
--title="$APPNAME - schließen Sie alle geöffneten Paket-Manager !" \
--percentage=20 \
--auto-close \
--button="abbrechen:1";then killall $(basename $0); exit 0; fi)
}
function showlog () {
if [[ ! -f $LOGFILE ]]; then
yad --posx=50 \
--posy=50 \
--info \
--window-icon="$ic" \
--title="$APPNAME Info" \
--text="kein log vorhanden."
elif [[ -z "$(cat $LOGFILE)" ]]; then
yad --posx=50 \
--posy=50 \
--info \
--window-icon="$ic" \
--title="$APPNAME Info" \
--text="kein eintrag im log."
else
yad --posx=50 \
--posy=50 \
--text-info \
--wrap \
--window-icon="$ic" \
--title="$APPNAME log file -> $LOGFILE" \
--on-top \
--button="update:0" \
--button="update-log:1" \
--button="log mit Kate öffnen:2" \
--button="reverse:3" \
--button="schließen:4" \
--button="beenden:5" \
--height=600 \
--width=800 \
--filename="$LOGFILE"
BUTTON_SEL_RET=$?
echo function showlog BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" = "0" ]; then
checklock; update
elif [ "$BUTTON_SEL_RET" = "1" ]; then
last-update-log
elif [ "$BUTTON_SEL_RET" = "2" ]; then
kate "$LOGFILE" &
elif [ "$BUTTON_SEL_RET" = "3" ]; then
showreverslog
elif [ "$BUTTON_SEL_RET" = "4" ]; then
main
elif [ "$BUTTON_SEL_RET" = "5" ]; then
exit 0
fi
fi
main
}
function showreverslog () {
if [[ ! -f $LOGFILE ]]; then
yad --posx=50 --posy=50 --info --window-icon="$ic" --title="$APPNAME Info" --text="kein log vorhanden."
elif [[ -z "$(cat $LOGFILE)" ]]; then
yad --posx=50 --posy=50 --info --window-icon="$ic" --title="$APPNAME Info" --text="kein eintrag im log."
else
text=$(cat -n $LOGFILE | sort -nr | cut -b 8- )
echo "$text" | \
yad --posx=50 \
--posy=50 \
--text-info \
--wrap \
--window-icon="$ic" \
--title="$APPNAME log file -> $LOGFILE" \
--on-top \
--height=600 \
--width=800 \
--button="update:0" \
--button="update-log:1" \
--button="log mit Kate öffnen:2" \
--button="chronologisch:3" \
--button="schließen:4" \
--button="beenden:5"
BUTTON_SEL_RET=$?
echo function showreverslog BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" = "0" ]; then
checklock; update
elif [ "$BUTTON_SEL_RET" = "1" ]; then
last-update-log
elif [ "$BUTTON_SEL_RET" = "2" ]; then
kate "$LOGFILE" &
elif [ "$BUTTON_SEL_RET" = "3" ]; then
showlog
elif [ "$BUTTON_SEL_RET" = "4" ]; then
main
elif [ "$BUTTON_SEL_RET" = "5" ]; then
exit
fi
fi
main
}
function last-update-log () {
if [[ ! -f $UPDATELOG ]]; then
yad --posx=50 \
--posy=50 \
--info \
--window-icon="$ic" \
--title="$APPNAME Info" \
--text="kein log vorhanden."
elif [[ -z "$(cat $UPDATELOG)" ]]; then
yad --posx=50 \
--posy=50 \
--info \
--window-icon="$ic" \
--title="$APPNAME Info" \
--text="kein eintrag im log."
else
yad --posx=50 \
--posy=50 \
--text-info \
--wrap \
--window-icon="$ic" \
--title="$APPNAME log file -> $UPDATELOG" \
--button="update:0" \
--button="Protokoll anzeigen:1" \
--button="log mit Kate öffnen:2" \
--button="schließen:3" \
--button="beenden:4" \
--height=600 \
--width=800 \
--filename="$UPDATELOG"
BUTTON_SEL_RET=$?
echo function last-update-log BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" = "0" ]; then
checklock; update
echo function last-update-log im 0-teil nach funktionsaufruf
elif [ "$BUTTON_SEL_RET" = "1" ]; then
showreverslog
elif [ "$BUTTON_SEL_RET" = "2" ]; then
kate "$UPDATELOG" &
elif [ "$BUTTON_SEL_RET" = "3" ]; then
main
elif [ "$BUTTON_SEL_RET" = "4" ]; then
exit 0
fi
fi
main
}
function about () {
yad --posx=50 \
--posy=50 \
--info\
--window-icon="$ic"\
--title="über $APPNAME "\
--on-top \
--height=20\
--width=300\
--button="Update starten:0" \
--button="schließen:1" \
--button="beenden:2" \
--text="$APPNAME ist ein kleines Update GUI, abgeleitet vom Linux Lite Upgrade-Tool und sehr einfach zu bedienen.\n\nÜbersetzt vom <a href='http://vsido.org/index.php?topic=1118.msg12502#msg12502'>http://vsido.org</a> Thread \n\nLicence GPL v3.\n\n Milos Pavlovic 2016"
BUTTON_SEL_RET=$?
echo function about BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" -eq "0" ]; then
checklock; update
elif [ "$BUTTON_SEL_RET" -eq "1" ]; then
main
elif [ "$BUTTON_SEL_RET" -eq "2" ]; then
exit
fi
}
function update() {
# Temporary file for error tracking
TMPLIST=$(mktemp /tmp/repos.XXXXXX)
APTUPDATE=$(grep '^deb' -c /etc/apt/sources.list) # Total number of repositories registered, this is approximated
apt-get update 2>&1 | tee $TMPLIST \
| awk -v total=$APTUPDATE '/^Ign|^Get/{count++;$1=""} FNR { if (total != 0){percentage=int (100*count/total);print (percentage < 90?percentage:90),"\n#",substr($0, 0, 128) }; fflush(stdout)}' \
| yad --progress \
--posx=50 \
--posy=50 \
--window-icon="$ic" \
--title="aktualisiere Softwarequellen - bitte warten..." \
--text="Paketlisten aktualisieren..." \
--percentage=0 \
--width=650 \
--button="schließen:0" \
--auto-close
BUTTON_SEL_RET=$?
echo function update Paketlisten aktualisieren BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" -ne "0" ]; then
err_msg=$(awk '/^(W:|E:)/{$1=""; print $0}' $TMPLIST | tail -n 1 ) #Get errors/warnings
log_date "ERROR: $err_msg"
unset APTUPDATE
rm -f $TMPLIST
unset TMPLIST
yad --posx=50 \
--posy=50 \
--error \
--title="Error" \
--text="$APPNAME konnte Paket-Cache Informationslisten nicht holen.\nÜberprüfen Sie das Protokoll für Details"
main
fi
log_date "INFO: Software-Quellen wurden aktualisiert."
unset APTUPDATE
rm -f $TMPLIST
unset TMPLIST
# Temporary list of available updates
UPDATES=$(mktemp /tmp/updateslist.XXXXXX)
apt-get --just-print $COMMAND 2>&1 \
| perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "Name: $1 INSTALLED: $2 AVAILABLE: $3\n"}' \
| awk '{print NR,":\t"$0}' \
| tee $UPDATES \
| yad --progress \
--posx=50 \
--posy=50 \
--window-icon="$ic" \
--title="berechne Updates" \
--text="bitte warten..." \
--width=300 \
--pulsate \
--button="schließen:0" \
--auto-close
BUTTON_SEL_RET=$?
echo function update berechne Updates BUTTON_SEL_RET = $BUTTON_SEL_RET
# Check if any updates are available, if there are none, script pops up dialog box saying 'No Updates Available', removes /tmp/updateslist.XXXXXX
if [ -z "$(cat $UPDATES)" ]; then
log_date "INFO: keine Updates verfügbar."
rm -f $UPDATES
unset UPDATES
yad --posx=50 \
--posy=50 \
--info \
--window-icon=$ic \
--title="$APPNAME" \
--on-top \
--button="Protokoll anzeigen:0" \
--button="schließen:1" \
--button="beenden:2" \
--text="keine Updates verfügbar"
BUTTON_SEL_RET=$?
echo function update keine Updates BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" -eq "0" ]; then
showreverslog
elif [ "$BUTTON_SEL_RET" -eq "1" ]; then
echo function update keine Updates \>\> im 1-zweig schließen
main
elif [ "$BUTTON_SEL_RET" -eq "2" ]; then
exit 0
fi
fi
# Log available updates
lst_upgrades=$(awk 'BEGIN { FS = "[ ]" } { print $3 }' $UPDATES | sed ':a;N;$!ba;s/\n/ /g')
log_date "INFO: Updates verfügbar:"
indent $lst_upgrades
unset lst_upgrades
# Insert text into /tmp/updateslist.XXXXXX
sed -i -e '1 i\Liste der verfügbaren Updates' -e '1 i\Klicken Sie auf Update um fortzufahren oder Abbrechen um den Update-Vorgang zu stoppen\n' $UPDATES
# Erase existing available info
sudo dpkg --clear-avail
# Call the yad dialog to show update list
yad --posx=50 \
--posy=50 \
--text-info \
--window-icon="$ic" \
--title="Verfügbare Updates" \
--button="Update:0" \
--button="abbrechen:1" \
--width=800 \
--height=300 \
--filename="$UPDATES"
BUTTON_SEL_RET=$?
echo function update Verfügbare Updates BUTTON_SEL_RET = $BUTTON_SEL_RET
# Continue script if no halt
if [ "$BUTTON_SEL_RET" -eq "0" ];then
# Write log
log_date "INFO: Update started."
# Remove tmp file and unset variable
rm -f $UPDATES
unset UPDATES
# Begin upgrade
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" $COMMAND --show-progress -y 2>&1 \
| tee $UPDATELOG \
| awk ' BEGIN { FS=" "; total=1;end_download=0} /upgraded/ {total= $1 + $3;FS="[ :]" } /^Get:[[:digit:]]+/ {printf "#Downloading %s %s %s\n",$7,$(NF-1),$NF;print int(($2 - 1) * 100 / total); fflush(stdout)} /^\(Reading / {if (end_download==0){print 100;fflush(stdout);end_download=1}} /^(Preparing|Unpacking|Selecting|Processing|Setting|Download)/ {print "#", $0; fflush(stdout)} /^Progress/ {print match($0, /([0-9]+)/, arr); if(arr[1] != "") print arr[1] ; fflush(stdout)}' \
| ( yad --progress \
--posx=50 \
--posy=50 \
--window-icon=$ic \
--title="herunterladen - bitte warten..." \
--text="Pakete werden runtergeladen ... \nDies kann eine Weile dauern." \
--width=600 \
--percentage=0 \
--button="schließen:0" \
--auto-close ;\
yad --progress \
--posx=50 \
--posy=50 \
--window-icon=$ic \
--title="Installation - bitte warten ..." \
--text="Konfigurieren und Installieren von Paketen ... \n Dies kann eine Weile dauern." \
--width=600 \
--percentage=0 \
--button="schließen:0" \
--auto-close )
BUTTON_SEL_RET=$?
echo function update BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" -ne "0" ]; then
err_msg=$(awk '/^(W:|E:)/{$1=""; print $0}' $UPDATELOG | tail -n 1)
log_date "ERROR:$err_msg"
yad --posx=50 --posy=50 --error --title="Error" --window-icon="$ic" --text="Updates sind gescheitert.\nÜberprüfen Sie das Protokoll für Details."
main
fi
# Halt updates script if user selects Cancel
else
log_date "INFO: Software-Upgrades vom Benutzer abgebrochen."
rm -f $UPDATES
unset UPDATES
main
fi
log_date "INFO: Updates erfolgreich installiert."
yad --posx=50 \
--posy=50 \
--question \
--window-icon="$ic" \
--title="$APPNAME" \
--text="Updates wurden vollständig installiert.\n\nMöchten Sie das $APPNAME Protokoll anzuzeigen?" \
--button="ja:0" \
--button="nein:1"
BUTTON_SEL_RET=$?
echo function update Updates wurden vollständig installiert BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ $BUTTON_SEL_RET -eq 1 ]; then
yad --posx=50 \
--posy=50 \
--info \
--window-icon="$ic" \
--title="$APPNAME" \
--width=250 \
--text="Aktualisierungen abgeschlossen." \
--button="schließen:0" \
--button="beenden:1"
BUTTON_SEL_RET=$?
echo function update Aktualisierungen abgeschlossen BUTTON_SEL_RET = $BUTTON_SEL_RET
if [ "$BUTTON_SEL_RET" -eq "0" ]; then
main;
elif [ "$BUTTON_SEL_RET" -eq "1" ]; then
exit
fi
else
yad --posx=50 \
--posy=50 \
--text-info \
--wrap \
--window-icon="$ic" \
--title="$APPNAME log file -> $UPDATELOG" \
--height=600 \
--width=800 \
--on-top \
--button="autoremove:0" \
--button="Protokoll:1" \
--button="schließen:2" \
--button="beenden:3" \
--filename="$UPDATELOG"
BUTTON_SEL_RET=$?
echo function update Updates Log BUTTON_SEL_RET = $BUTTON_SEL_RET
fi
if [ "$BUTTON_SEL_RET" -eq "0" ]; then
autoremove
main
elif [ "$BUTTON_SEL_RET" -eq "1" ]; then
showreverslog
elif [ "$BUTTON_SEL_RET" -eq "2" ]; then
main
elif [ "$BUTTON_SEL_RET" -eq "3" ]; then
exit
fi
}
function autoremove() {
xterm -e 'read line <<TEXT_MARKE
apt-get autoremove
TEXT_MARKE
eval $line; bash'
main
}
function main() {
selection=$(yad --posx=50 \
--posy=50 \
--list \
--title="$APPNAME" \
--window-icon="$ic" \
--text="Option wählen --> Doppelklick" \
--height=175 \
--width=225 \
--hide-column=1 \
--no-buttons \
--no-headers \
--column="Function" \
--column="option" \
"update" "➊ Update Packages" \
"showlog" "➋ Protokoll anzeigen" \
"showreverslog" "➌ Protokoll reverse anzeigen" \
"purgecache" "➍ apt info-cach löschen" \
"autoremove" "➎ apt autoremove" \
"about" "➏ über diese Anwendung" \
"exit" "➐ beenden" \
--print-column=1) || exit
selection=$(echo $selection | cut -d '|' -f 1)
echo function main selection = $selection
case "$selection" in
update) checklock; update
;;
showlog) showlog
;;
showreverslog) showreverslog
;;
purgecache) checklock; sudo rm -vfd /var/lib/apt/lists/* || yad --posx=50 --posy=50 --error --text="! Fehler, kann cache nicht löschen.\nVersuchen Sie es manuell mittels:\nsudo rm /var/lib/apt/lists/* -vf"
;;
autoremove) autoremove
;;
about) about
;;
exit) exit 0
;;
esac
}
# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
echo
echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
echo "x Dieses Skript muss als root ausgeführt werden! x" 1>&2
echo "x Tipp: Verwenden Sie gksu oder ein ähnliches Werkzeug. x" 1>&2
echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
echo
SCRIPT=$( readlink -m $( type -p $0 ))
EXPECTPFAD=$(mktemp /tmp/expectScriptStart.XXXXXX.exp)
echo "schreibe hilfs-script"
echo
echo expect temp datei: \"$EXPECTPFAD\"
#--expect script anlegen uns schreiben--------------------------------
echo "#!/usr/bin/expect" >> $EXPECTPFAD 2>&1
echo "spawn gksu $SCRIPT" >> $EXPECTPFAD 2>&1
echo "spawn shred -u $EXPECTPFAD" >> $EXPECTPFAD 2>&1
echo "expect eof" >> $EXPECTPFAD 2>&1
#--------------------------------------------------------------------------
chmod +x $EXPECTPFAD
#--------------------------------------------------------------------------
expectScriptStart="$(cat $EXPECTPFAD)"
echo dateiinhalt:
echo .....................................................
echo "$expectScriptStart"
echo .....................................................
echo starte hilfs-script
echo
exec $EXPECTPFAD
exit 0
fi
#----------------das script an sich-----------------------------------------------------------------
SCRIPT=$( readlink -m $( type -p $0 ))
#echo \$SCRIPT: $SCRIPT
main
Hi ~RaMich~ and welcome to VSIDO Hi ~ RaMich ~ und willkommen bei VSIDO
I think the translation is something like:
I played with the code and broke it... :D
wenn du meinst?
teste es. irgendwo speichern, ausführbar machen und los gehts. .. sofern auch alle neuen Abhängigkeiten installiert sind.
Quote from: ~RaMich~ on August 27, 2017, 07:25:30 PM
wenn du meinst?
teste es. irgendwo speichern, ausführbar machen und los gehts. .. sofern auch alle neuen Abhängigkeiten installiert sind.
Quoteif you think?
try it. somewhere save, execute and go. .. as long as all new dependencies are installed.
OK I will test it
Tested and the conversion to German works perfectly...
Good work!