Moin
Das Problem ist "
programmtechnisch" gelöst.... mein Script funktioniert bestens. Es waren 2 primäre Probleme zu lösen: 1. Arbeitet das Script mit root-account (gestartet von anacron oder cron), funktionieren die grafischen Dialog-Windows zur Information des User nicht. 2. Arbeitet das Script unter User-Account, fehlen die Rechte zum dist-upgrade. Zu eins, ich habs nicht hingekriegt, einen Meldung auf den Anwenderbildschirm zu bringen, wenn das Script von/mit root maschinell gestartet wurde. Zu zwei, es war aber relativ einfach das Script als normaler User erfolgreich zu starten, wenn er entweder über die Policies zum Start als "
root" berechtigt wird oder es mit "
sudo" aufruft und er dazu in der sudoers berechtigt wurde. Folgendes war notwendig:
1. zenity oder dialog zur Anzeige der GUI-Dialoge installieren
2. Policy-Berechtigung erstellen (oder alternativ sudo installieren und Berechtigung des Users für dieses Script in der sudoers eintragen)
3. Eintrag des Scripts in den Autostart des Users.
Das Script pflegt einen eigenen 7-Tage-Zyklus und führt einen neuen Check aus, wenn der letzte Check älter als 7 Tage ist. Im Moment ist sogar noch ein User-Abgleich enthalten, bei dem ich im Sinn hatte, dass der Check nur gestartet werden soll, wenn der Hauptbenutzer angemeldet ist.... das wäre z.B. bei Start durch anacron ggf. relevant gewesen. Aber da ich das jetzt über den User-Autostart gelöst habe, ist das über.
Aber ich habe dennoch ein Problem.... und zwar die gedankliche mir im Kopp rumschwirrende Phrase
"Es muss nicht immer sinnvoll sein, tatsächlich alles zu tun, was man auch tun kann." Irgendwie so sinngemäß lautete das doch...
... also jetzt mal nicht den programmtechnischen Aspekt meines Scriptes betrachten, das funktioniert ja.... aber wie sieht es eigentlich mit den üblichen etablierten Debian-Aspekten, -Richtlinien, -Grundsätzen, -Gedanken aus? Ist so ein Script eher ein NoGo? Ist das was, was man besser nicht tun sollte? Gibts richtig gute Gründe, warum man den Anwender nicht expliziert zu diesem Script (und damit indirekt zum dist-upgrade) berechtigen sollte? Ich würde mich freuen, speziell zu diesen Punkten ein paar Fourms-Meinungen zu hören.
Für die, die es interessiert hier das Script. Ein kleine Erläuterung am Rande zu den Log's, es sind nämlich zwei im Script verwendet. Zum einen wird wird lokal ein Log geschrieben, in welchem man die apt-get-Ausgaben nachlesen kann. Und es wird ausserdem ein Eintrag in meinem zentralen von allen Maschinen genutzten "systemlog" auf dem Server geschrieben. Darin verfolge ich gewisse und verschiedene Aktivitäten mehrerer Maschinen.
Code: Alles auswählen
#!/bin/bash
#=============================================================================================================================
# Auto-Full-Upgrade by TommyLu*gmx.de
#
# Script-Name : autoupdate
# Version, Date : V.6.1, 26.12.2015
#
# Descripton : Checks every 7(+) days for new updates and install them, if given
#
# Main-Script : /usr/local/bin/autoupdate # root:root 755 RWX R-X R-X
# Companion-Files: /usr/local/bin/pkexec-autoupdate # root:root 755 RWX R-X R-X
# : /usr/local/bin/autoupdate.ctl # Weekly job-date-ctrl
# : /usr/local/bin/autoupdate[hostname][date].log # Fully local Update-Log
# : /media/var/log/system.log # Central Server-Log for Multiple-Machine updates
#
# Requirements : [zenity or dialog] [xterm or lxterminal or xfce4-terminal] Policykit, Wrapper (see next)
#
# Wrapper : The Wrapper is needed to start the script as root
# : nano /usr/local/bin/pkexec-autoupdate
# #!/bin/bash
# export XAUTHORITY=~/.Xauthority
# xhost +si:localuser:root
# pkexec /usr/local/bin/autoupdate "$@"
#
# ToDo : 1. chown -R root:root /usr/local/bin/autoupdate
# : 2. chmod 755 /usr/local/bin/autoupdate
# : 3. Customizing SystemLog-Path & Var's in the Script below, section "Init some Var's"
# : 4. Authorizing script & user in Policykit
# Usage
# in Autostart
# : bash -c "/bin/sleep 90 && pkexec /usr/local/bin/autoupdate -u $USER"
# start after 90 secs updatescript User logged in (allways the same)
# as root
#
# Manually with -u Username (always) -f (optional, = force if less 7 d )
# : pkexec /usr/local/bin/autoupdate -u $USER {-f }
# : !!! Never call with other Parms except -u -f !!!
#
# Firsttime-Init : pkexec /usr/local/bin/autoupdate -u thomas -f # Set authorized User and start cycle
#=============================================================================================================================
upgrade() {
echo $d "Updates für <"$PCName"> werden installiert" >$UpgradeLog
echo $Separator >>$UpgradeLog
sleep 3
apt-get update >>$UpgradeLog
echo $Separator >>$UpgradeLog
apt-get dist-upgrade -y >>$UpgradeLog
echo $Separator >>$UpgradeLog
apt-get autoclean >>$UpgradeLog
echo $Separator >>$UpgradeLog
d=`date --date="+1 week" +"%Y-%j"`
echo -e "nextupdate: $d\r\nuser: $RunAsUser" >/usr/local/bin/autoupdate.ctl
d=`date +%d-%m-%Y-%H-%M`
echo $d $text2": <"$PCName">" >>$SystemLog
echo $d "Job end" >>$UpgradeLog
}
trim() {
local var="$*"
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters"
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters"
echo -n "$var"
}
#=============================================================================================================================
# Init some Var's
pushd `dirname $0` >/dev/null 2>&1
ProgPath=`pwd`
ProgFullName=$ProgPath/`basename $0`
popd >/dev/null 2>&1
d=`date +"%Y-%j"`
NextUpdate="0000-000"
UserAllowed=""
PCName=$(cat /etc/hostname)
ForceUpdate=false
RunAsUser=""
UpgradeLog=""
#SystemLog=/home/thomas/DevScriptLog.txt
SystemLog="/media/var/log/system.log"
Separator="============================================================================================="
text1="Sollen verfuegbare Updates automatisch installiert werden?\n\nWaehrend des Updates kann der PC ganz normal benutzt werden. Bitte den Rechner\nnicht ausschalten, bevor die Meldung erfolgt ist, dass die Updates abgeschlossen sind."
text2="Updates wurden erfolgreich automatisch installiert"
#=============================================================================================================================
# Init App
while getopts u:l:fcQ opts; do
case ${opts} in
u) RunAsUser=${OPTARG}
;;
l) UpgradeLog=${OPTARG}
;;
f) ForceUpdate=true
;;
c) upgrade
exit 0
;;
Q) dialog --timeout 240 --yesno "$text1" 8 96 # mit -Q rekursiv aufgerufen zur Dialog-Anzeige
echo $? >$ProgFullName.response
exit 1
;;
esac
done
dialogapp="/usr/bin/zenity"
terminalapp="/usr/bin/xterm"
[ -f "$terminalapp" ] || terminalapp="/usr/bin/lxterminal"
[ -f "$terminalapp" ] || terminalapp="/usr/bin/xfce4-terminal"
[ ! -f "$terminalapp" ] && echo "Error: No Terminal-App found" && exit 1 # terminal-app not installed
[ -f "$dialogapp" ] || dialogapp="/usr/bin/dialog"
[ ! -f "$dialogapp" ] && echo "Error: No Dialog-App found" && exit 1 # zenity+dialog not installed
[ -z $RunAsUser ] && echo "Error: Missing Username" && exit 1
[ ! -f "$SystemLog" ] && echo "Error: System-Log not found" && exit 1
[ ! -f "/usr/local/bin/autoupdate.ctl" ] && echo -e "nextupdate: 0000-000\r\nuser: $RunAsUser" >/usr/local/bin/autoupdate.ctl
NextUpdate=$(grep nextupdate: /usr/local/bin/autoupdate.ctl | awk -F ': ' '{ print $2 }')
UserAllowed=$(grep user: /usr/local/bin/autoupdate.ctl | awk -F ': ' '{ print $2 }')
#UserAllowed="$(echo -e "${UserAllowed}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" # Trim-Funktionalität
UserAllowed=$(trim "$UserAllowed") # dto. via Function-Call
UpgradeDate=`date +%y%m%d`
UpgradeLog="/usr/local/bin/autoupdate_"$PCName"_"$UpgradeDate".log"
#Debug
#echo "Jetzt :" $d
#echo "Next Update :" $NextUpdate
#echo "RunAs-User : ."$RunAsUser"."
#echo "User-Allowed : ."$UserAllowed"."
#echo "User-LoggedIn: ."$USER"."
#echo "SystemLog :" $SystemLog
#echo "PCName :" $PCName
#echo "ForceUpdate :" $ForceUpdate
#echo "Dialog-App :" $dialogapp
#read -p "weiter mit beliebiger Taste"
#exit
[ $ForceUpdate == false ] && [ "$d" \< "$NextUpdate" ] && echo "Error: less 7 Days" && exit 1 # not yet 7th day or later
[ ! $UserAllowed == $RunAsUser ] && echo "Error: User does not match" && exit 1 # wrong user is logged in
#=============================================================================================================================
# Display Dialog-Message...
retcode=""
d=`date +%d-%m-%Y-%H-%M`
echo $Separator >>$SystemLog
echo $d "Jobname: autoupdate (Full-Upgrade für <"$PCName">)" >>$SystemLog
if [ "$dialogapp" == "/usr/bin/zenity" ]; then # Dialog (direkt) mit "zenity"
DISPLAY=:0 LANG=de_DE.UTF-8 zenity --title="Automatische Updates" --width=500 --cancel-label="abbrechen" --ok-label="Updates installieren" --timeout=240 --question --text "$text1"
retcode=$?
else
[[ $terminalapp =~ "/xterm" ]] && geometry="-geometry 100x11" || geometry="--geometry=100x11"
$terminalapp $geometry -e "$ProgFullName -Q" # Dialog (rekursiv start) mit "dialog"
i=0
while [ $i -lt 244 ]; do
[ -f $ProgFullName.response ] && break
i=$[$i+1]
/bin/sleep 1
done
if [ -f $ProgFullName.response ]; then
retcode=$(cat $ProgFullName.response)
rm $ProgFullName.response
fi
fi
#=============================================================================================================================
# ... and do the Job
case $retcode in
0)
echo $d "Updates für <"$PCName"> werden installiert" >$UpgradeLog
echo $Separator >>$UpgradeLog
ppid=$(ps | grep bash | awk -F ' ' '{ print $1 }')
bash -c "$ProgFullName -l '$UpgradeLog' -u $RunAsUser -c" & # rekursiv starten zur Durchführung des Upgrades
sleep 1
cpid=$(ps -aux | grep -m 1 "autoupdate -l" | awk -F ' ' '{ print $2 }')
# Debug
# echo "Parent-PID:"$ppid "Child-PID:"$cpid
# read -p "weiter mit beliebiger Taste"
[[ $terminalapp =~ "/xterm" ]] && geometry="-geometry 120x20+0+0" || geometry="--geometry=120x20+0+0"
$terminalapp $geometry -e "/usr/bin/tail $UpgradeLog --sleep-interval=5 -f --pid=$cpid"
if [ "$dialogapp" == "/usr/bin/zenity" ]; then
DISPLAY=:0 LANG=de_DE.UTF-8 zenity --title="Automatische Updates" --width=500 --timeout=120 --info --text "$text2"
else
[[ $terminalapp =~ "/xterm" ]] && geometry="-geometry 80x8" || geometry="--geometry=80x8"
$terminalapp $geometry -e "/usr/bin/dialog --timeout 120 --msgbox '$text2' 5 70"
fi
;;
1)
d=`date +%d-%m-%Y-%H-%M`
echo $d "Updates vom User abgebrochen: <"$PCName">" >>$SystemLog
;;
*)
d=`date +%d-%m-%Y-%H-%M`
echo $d "Updates wg. Fehler oder nach Timeout abgebrochen: <"$PCName">" >>$SystemLog
;;
esac
d=`date +%d-%m-%Y-%H-%M`
echo $d "Job end" >>$SystemLog
exit 0
#=============================================================================================================================