[gelöst] Auto-dist-upgrade?

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
TomL

[gelöst] Auto-dist-upgrade?

Beitrag von TomL » 28.09.2015 11:21:49

Moin

Das upgrade-Thema beschäftigt mich immer wieder aufs neue :? und immer wieder aufs neue suche ich nach Lösungen, die es mir vereinfachen. Jetzt suche ich gerade nach Möglichkeiten, nicht immer selber an das regelmäßige "update" und "dist-upgrade" unserer Maschinen denken zu müssen. Dabei gehts mir um die nicht ganz so wichtigen Workstations unseres Netzes und vielleicht sogar meine VMs. Ich hätte gerne, dass das einmal wöchentlich nach dem Einschalten automatisch passiert, egal welcher Anwender sich anmeldet.... das heisst, der Anwender hat keine root-Rechte und dennoch soll das durchlaufen.

Dabei habe ich diese Lösungsvorschläge gefunden, aus denen ich einfach dieses Script für anacron

Code: Alles auswählen

 #!/bin/bash
apt-get update
apt-get dist-upgrade -y
apt-get autoclean
geringfügig abgewandelt nach Cron.Weekly kopieren würde. Mir ist jetzt nur noch nicht so richtig klar, wie ich das am besten mit dem root-Pwd lösen muss. Die Abfrage "root-Pwd eingeben" kann der Anwender ja nicht erfüllen. Vielleicht wäre es eine Möglichkeit dieses Script mit dem "Hauptbenutzer" in die sudoers einzutragen.

Was denkt Ihr über diese Ideen?
Zuletzt geändert von TomL am 04.10.2015 21:41:17, insgesamt 1-mal geändert.

Benutzeravatar
hikaru
Moderator
Beiträge: 13958
Registriert: 09.04.2008 12:48:59

Re: Auto-dist-upgrade?

Beitrag von hikaru » 28.09.2015 11:24:46

TomL hat geschrieben:Was denkt Ihr über diese Ideen?
Dass du dir vielleicht mal Debianunattended-upgrades anschauen solltest. ;)

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Auto-dist-upgrade?

Beitrag von cronoik » 28.09.2015 17:52:48

Debianunattended-upgrades macht aber kein dist-upgrade. Um das Passwort musst du dich nicht weiter kümmern, den anacron läuft als root. Alternativ kannst du auch Debiancron-apt benutzen. Um wieviele Systeme geht es denn?
Hilf mit unser Wiki zu verbessern!

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: Auto-dist-upgrade?

Beitrag von dufty2 » 28.09.2015 18:37:51

Das Paket resp, der Befehl "upgrade-system" macht ein dist-upgrade, evtl. den in den cron-job stecken.

TomL

Re: Auto-dist-upgrade?

Beitrag von TomL » 28.09.2015 22:02:08

Moin

"unattended-upgrades" habe ich gesehen.... und wie ich das verstanden habe, werden wohl nur Security-Patches eingespielt - mir schwebt aber ein "full-upgrade" vor. Um wieviel Systeme gehts.... ?.... will ich gar nicht sagen :D denn so viele sinds wirklich nicht, als das das nicht von Hand möglich wäre. Ist doch nur unser Familien-Netzwerk. Ich habe da auch eher sportlichen Ehrgeiz und die Hoffnung, eine weitere Facette des Betriebssystems zu lernen und zu verstehen.

Ich habe mir jetzt ein Script gebastelt, welches den Upgrade durchführt und hatte gedacht, dass ich das via anacron starten würde. Mir ist jetzt nur nicht klar, ob ich den Job in "/etc/anacrontab" eintragen muss, oder ob es reicht, einen Link anzulegen, z.B.:

Code: Alles auswählen

ln -s /usr/local/bin/autoupdate /etc/cron.daily
Irgendwo habe ich gelesen, die anacrontab braucht man nur, wenn man ausserhalb Tag, Woche, Monat planen will. Ansonsten reicht der Link in eins der 3 Verzeichnisse /etc/cron.* Unklar ist mir dabei aber dieser Job-Identifier. In der anacrontab würde ich den ja vorgeben, aber wo definiere ich den, wenn ich nur das Script nach /etc/cron.* verlinke? Und was mir auch nicht ganz klar ist, wenn ich nur verlinke, habe ich vermutlich nicht die Möglichkeit eines "Job-Delays" nach Systemstart... oder ist das an anderer Stelle vorzugeben?

@dufty2
Die crontab funktioniert nicht, weil es keine festen Einschalt- bzw. Betriebszeiten gibt. Es soll stattdessen einmal täglich geprüft werden, und zwar dann, wenn der Rechner verfügbar ist.

pferdefreund
Beiträge: 3799
Registriert: 26.02.2009 14:35:56

Re: Auto-dist-upgrade?

Beitrag von pferdefreund » 29.09.2015 05:42:10

Wenn der Rechner täglich neu gestartet wird, tuts doch der Eintrag der Befehle in die /etc/init.d/rc.local oder werden die nicht täglich neu gestartet ?

TomL

Re: AW: Auto-dist-upgrade?

Beitrag von TomL » 29.09.2015 10:27:40

pferdefreund hat geschrieben:Wenn der Rechner täglich neu gestartet wird, tuts doch der Eintrag der Befehle in die /etc/init.d/rc.local oder werden die nicht täglich neu gestartet ?
Ja, da habe ich noch gar nicht dran gedacht, das wäre auch ne Lösung. Ein Job-Ctrl-File, welches gewährleistet, dass der Job nur einmal täglich gestartet wird, ist auch eher einfach zu realisieren.

Ich habe aber dabei jetzt 2 Konfliktsituationen, wo ich abwarten muss, wie sich das darstellt.
1. Mit anacron habe ich den Vorteil "root", weiss aber nicht, ob ich das "angemeldete-User-Display" verwenden kann. Das werde ich hoffentlich beim nächsten Start sehen.

2. Über "Autstart" oder rc.local muss ich ausserdem die root-Berechtigung lösen .... das geht vermutlich über die sudoers, wenn ich dem User dieses Script als root erlaube

uname
Beiträge: 12474
Registriert: 03.06.2008 09:33:02

Re: Auto-dist-upgrade?

Beitrag von uname » 29.09.2015 10:34:15

cronoik hat geschrieben:unattended-upgrades macht aber kein dist-upgrade.
Ich habe ein paar Stable-Systeme mit Debianunattended-upgrades. Wo sind denn nun die konkreten Probleme bei Stable? Worauf hat es tatsächlich Auswirkungen? Bitte Beispiele wie z.B. Iceweasel oder Kernel nennen. Danke. Hatte gedacht, dass Upgrade vs. Dist-Upgrade bei Stable kaum oder keine Auswirkungen hat.

niesommer
Beiträge: 2493
Registriert: 01.10.2006 13:19:37
Lizenz eigener Beiträge: GNU General Public License

Re: Auto-dist-upgrade?

Beitrag von niesommer » 29.09.2015 10:37:27

@cronoik hat ja schon Debiancron-apt vorgeschlagen, hier noch mal eine Anleitung dazu:
https://www.tim-bormann.de/update-debia ... -cron-apt/
Das habe ich eine Zeitlang mit meinem PowerPc gemacht das hat immer zuverlässig funktioniert, der zeit ist der Rechner wieder eingemottet. :D
Weitere Infos gibst hier:
https://wiki.ubuntuusers.de/cron-apt
http://blog.doenselmann.com/debian-linu ... alisieren/
http://www.huschi.net/16_202_de-debian- ... n-apt.html
Gruß niesommer

inne
Beiträge: 3293
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Auto-dist-upgrade?

Beitrag von inne » 29.09.2015 10:41:07

TomL hat geschrieben: "unattended-upgrades" habe ich gesehen.... und wie ich das verstanden habe, werden wohl nur Security-Patches eingespielt - mir schwebt aber ein "full-upgrade" vor.
Wenn du die Konfig entsprechend erweiterst, sollte auch ein full-upgrade gehen. Im Default ist glaub nur security eingetragen...

Code: Alles auswählen

$ apt-config dump Unattended-Upgrade::Origins-Pattern
Unattended-Upgrade::Origins-Pattern "";
Unattended-Upgrade::Origins-Pattern:: "origin=Debian,archive=${distro_codename},label=Debian";
Unattended-Upgrade::Origins-Pattern:: "origin=Debian,archive=${distro_codename},label=Debian-Security";

KP97
Beiträge: 3760
Registriert: 01.02.2013 15:07:36

Re: Auto-dist-upgrade?

Beitrag von KP97 » 29.09.2015 18:08:52

Das Script /etc/rc.local wird immer vom root ausgeführt, daher erübrigt sich eine weitere Paßworteingabe.

TomL

Re: Auto-dist-upgrade?

Beitrag von TomL » 29.09.2015 20:58:11

Moin

Leider funktioniert das alles nicht.... :( .... zumindest nicht so, wie ich mir das gedacht habe. Anacron klappt natürlich, und natürlich auch rc.local... aber alles so, dass niemand was mitkriegt. Ich hatte mir ein Script geschrieben, was via Terminal wunderbar klappt und welches einen eigenen 7-Tage-Rhythmus hat. Das heisst, die nächste Prüfung auf verfügbare dist-upgrades findet frühenstens 7 Tage nach der letzten Prüfung statt. Ganz wichtig waren mir dabei die beiden folgenden Meldungen:
http://www.directupload.net/file/d/4125/girhkhxp_png
und
http://www.directupload.net/file/d/4125/l7gevgxi_png

Damit wollte ich sicherstellen, dass der Anwender weiss, was jetzt im Hintergrund passiert und das er auf die Fertig-Meldung warten muss, bevor er den Rechner ausschaltet.Nur leider bricht der Job mit dem Log-Eintrag "Abbruch durch User" sofort ab und ich bekomme die Dialoge über diese root-Hintergrundaktivität nicht auf den Anwender-Bildschirm. Das heisst, die Cancel- und Start-Abfrage im (nichtangezeigten) Dialog wird unmittelbar mit Cancel beantwortet.

Jetzt habe ich das Script einfach mal in meinen Autostart mit 5 Minuten Verzögerung reingenommen, da wird der Job gestartet, die Dialoge kommen und es scheint zu funktionieren. Lediglich die Berechtigungen fehlen noch.... aber das müsste ja die sudoers regeln können. Aber hier ist wieder das Dilemma, das ich den 5-Min-Delay nicht bei unseren Xfce-Desktops vorgeben kann. Bei denen ploppt die Frage sofort hoch, sobald der Desktop da ist..... ich finde das zumindest unschön. Und dabei kann ich nicht einschätzen, ob im Job ein Sleep 300 nicht irgendwie was anderes lahmlegt.

Hat jemand vielleicht ne Idee?

TomL

Re: Auto-dist-upgrade?

Beitrag von TomL » 01.10.2015 18:25:31

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

#=============================================================================================================================

Antworten