Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - ~RaMich~

#1
Scripts / Re: apt-get upgrade and yad
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.
#2
Scripts / Re: apt-get upgrade and yad
August 27, 2017, 06:59:04 PM
.. 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