Neues Script für automatisiertes Update Jameica-Framework

...macht das Leben leicht und bequem ;)

 
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 10.07.2015 - 01:47 Uhr  ·  #1
Hier ein Script-Set um Updates für die Jameica Plattform weitestgehend zu automatisieren:

- Ermittelt die installlierte Version
- Sichert eventuell vorhandene Plugins im Programm-Verzeichnis und spielt diese nach dem Update zurück
- Sichert eventuell vorhandene Dateien im cfg Verzeichnis des Programm-Verzeichnis und spielt diese nach dem Update zurück
- Legt ein komplettes Backup des Programm-Verzeichnis an
- Mit den Parametern -nightly und -stable kann man zwischen Stable und Nightly wechseln bzw. forcieren
- Für Stable Version mit SHA Check nach Download

Aufruf: jameica_updatecheck.sh

Code

#!/bin/bash

# Semi-Automatische Updates für Jameica
#
# (c) 2015 Christian B. Caldarone
#
# www.xing.com/profile/ChristianB_Caldarone 
#
# GPL V2 only



link=$(readlink -f "$0")
dir=$(dirname "$link")
cd "$dir"

jameica_home="/opt/jameica"

jameica="0.0.0"

echo
echo "   Überprüfen ob Jameica auf diesem System installiert ist und wenn ja, in welcher Version..."
echo

if [[ -e $HOME/.jameica/cfg/de.willuhn.jameica.plugin.PluginLoader.properties ]]; then

  eval $(cat $HOME/.jameica/cfg/de.willuhn.jameica.plugin.PluginLoader.properties | grep jameica=)

fi


if [[ $* == *"-nightly"* ]]; then

  jameica="0.0.0-nightly"

fi

if [[ $* == *"-stable"* ]]; then

  jameica="0.0.0"

fi


  if [ -d $jameica_home ]; then
  
    if [[ $(ls -A $jameica_home) ]] && [[ ! -e $HOME/.jameica/cfg/de.willuhn.jameica.plugin.PluginLoader.properties ]]; then

      echo "   Jameica wurde unter diesem Benutzer noch nicht gestartet, ist aber grundsätzlich auf diesem System installiert."
      echo "   Bitte ggf. Jameica mit diesem Benutzer einmal ausführen, dann dieses Script noch einmal starten."
  
    fi


    if [[ ! $(ls -A $jameica_home) ]]; then

      echo "   Das Jameica Programm-Verzeichnis existiert, ist aber leer."
      echo "   Die Anzeige der Version bezieht sich auf die vorherige Installation:"
      echo
      
    fi

  else

    echo "   Jameica ist auf diesem System noch nicht installiert, oder befindet"
    echo "   sich nicht im Standardverzeichnis $jameica_home"
    echo
    

  fi




if [[ $jameica == *"nightly"* ]]; then


  jameica_new=$(curl --silent --get http://www.willuhn.de/products/jameica/download_ext.php | grep 'nightly-linux.zip' | sed -e 's/.*jameica-\(.*\)-linux.*/\1/')

  nightly=1
  
else

  jameica_new=$(curl --silent --get http://www.willuhn.de/products/jameica/download.php | grep '<h2>Jameica' | sed -e 's/.*Jameica \(.*\) - Aktuelle Version.*/\1/')

  nightly=0
fi

  

if [[ $jameica < $jameica_new ]] || [[ $nightly -gt 0 ]]; then

  if [[ -e $jameica_home/jameica.jar ]] && [[ $nightly -gt 0 ]]; then

    if [[ $(date -r "$jameica_home/jameica.jar" +%Y-%m-%d) < $(date +%Y-%m-%d) ]]; then

      echo "   Installierte Jameica Nightly Version: $jameica vom "$(date -r "$jameica_home/jameica.jar" +%d.%m.%Y)

    fi

  else

    echo "   Installierte Jameica Version: $jameica"

  fi



  
  echo
  echo "   ==> Es ist eine neueres Jameica in der Version $jameica_new verfügbar!"
  echo
  echo "   Jameica kann jetzt automatisch aktualisiert werden!"
  do_update=1


else

  if [[ -e "$jameica_home/jameica.jar" ]]; then

    echo "   Installierte Jameica Version ist aktuell: $jameica vom "$(date -r "$jameica_home/jameica.jar" +%d.%m.%Y)
    echo
    echo "   ==> Es ist keine neuere Version vorhanden!"
    do_update=0

  else

    echo "   Neuste Version $jameica_new kann in $jameica_home installiert werden!"
    do_update=1

  fi

  



fi


if [ $do_update -gt 0 ]; then

  
  echo
  echo "   Ein Backup der aktuellen Installation wird hierbei unter $jameica_home.old gespeichert,"
  echo "   und wird erst bei der nächsten Aktualisierung wieder überschrieben."
  echo "   Wurden Plugins im Anwendungsordner $jameica_home/plugins gespechert, so werden diese in"
  echo "   die neue Installation übertragen. Das gilt auch für das $jameica_home/cfg Verzeichnis,"
  echo "   falls hier Dateien vorhanden sind."
  echo

  read -r -p "   Soll Jameica jetzt automatisch aktualisiert werden? [J/N]: " abfrage

  case $abfrage in
    [jJ]|[yY]) 
        
    echo
    echo "   Starte Update bzw. Installation...."
    echo -n "   Root-"
    su -c "./update_jameica.sh $jameica_new"


        ;;

    *)

    echo
          echo "   Beenden ohne Aktualisierung."
        ;;

  esac

fi



exit








Der Updater selbst (wird vom ersten Script aufgerufen):



Code

#!/bin/bash

# Semi-Automatische Updates für Jameica
#
# (c) 2015 Christian B. Caldarone
#
# www.xing.com/profile/ChristianB_Caldarone 
#
# GPL V2 only


if [[ $* == "" ]]; then

  echo "   Kein Parameter angegeben."
  echo "   Abbruch"
  echo
  echo "   Das Update Script ist für den Aufruf"
  echo "   durch 'Jameica_updatecheck.sh' vorgesehen"
  exit 0
fi


link=$(readlink -f "$0")
dir=$(dirname "$link")
cd "$dir" 

jameica_location="/opt"

jameica_home=$jameica_location"/jameica"

download_file="jameica-linux"

if [[ ! -w $jameica_location ]]; then

  echo "   Keine Schreibrechte in $jameica_location."
  echo "   Abbruch."
  exit 1

fi




inst_tmp=$(mktemp -d --tmpdir jameica.XXXXXXXX) || { echo "Fehler beim anlegen des Temp-Dir."; exit 1; } 

if [[ $* == *"nightly"* ]]; then

  
  download_file="jameica-$1-linux"

else

  download_file="jameica-linux"

fi







if [[ $(uname -m | grep 64) ]]; then


  download_file="$download_file"64.zip

else

  download_file="$download_file".zip

fi

echo "   Ermittle Download-Datei: $download_file"


if [[ $* == *"nightly"* ]]; then

  nightly=1

  download_url="http://www.willuhn.de/products/jameica/releases/nightly/"

  wget -q -P $inst_tmp/ $download_url$download_file

  




else

  nightly=0

  download_url="http://www.willuhn.de/products/jameica/releases/current/jameica/"

  wget -q -P $inst_tmp/ $download_url$download_file
  
  wget -q -P $inst_tmp/ $download_url$download_file.SHA 

  file_sha=$(sha1sum -b $inst_tmp/$download_file | sed -r 's/(.{40}).*/\1/') 

  test_sha=$(cat $inst_tmp/$download_file.SHA | sed -r 's/(.{40}).*/\1/') 

  if [[ "$file_sha" == "$test_sha" ]]; then

    echo "   Checksumme stimmt überein, Download erfolgreich."


  else

    echo "   Checksumme stimmt nicht, Download fehlerhaft."
    echo "   Abbruch!"
    exit 1

  fi



fi

echo "   Erstelle Backup..."  

mkdir $inst_tmp/backup

if [[ -d $jameica_home/plugins ]]; then

  
  if [[ $(ls -A $jameica_home/plugins) ]]; then

    cp -fpR $jameica_home/plugins $inst_tmp/backup

    echo "   $jameica_home/plugins gesichert"

  fi


fi


if [ -d "$jameica_home/cfg" ]; then

  
  if [[ $(ls -A $jameica_home/cfg) ]]; then

    cp -fpR $jameica_home/cfg $inst_tmp/backup

    echo "   $jameica_home/cfg gesichert"

  fi


fi

rm -rf $jameica_home".old"

if [[ -d $jameica_home ]]; then

  echo "   Aktuelle Installation nach $jameica_home.old gesichert"

  mv -f $jameica_home $jameica_home".old"

fi 

echo "   Installiere neue Version in $jameica_home"

unzip -qu $inst_tmp/$download_file -d /opt


if [[ $(ls -A $inst_tmp/backup) ]]; then

  cp -fpR $inst_tmp/backup/* $jameica_home

  echo "   Spiele plugin bzw cfg Daten zurück"

fi



rm -rf $inst_tmp

echo "   Fertig."

exit





Die Scripte auch als Anhang. Außerhalb von /opt/jameica ausführen!
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 10.07.2015 - 09:29 Uhr  ·  #2
...da das Script für den Versions-Check die Datei 'cfg/de.willuhn.jameica.plugin.PluginLoader.properties' aus dem jeweiligen Benutzerverzeichnis auswertet, muss Jameica mindestens einmal unter dem Benutzer-Account, der das Script aufruft gestartet worden sein. Grundsätzlich funktioniert es aber auch ohne, nur eben dann keine präzise Versionserkennung beim ersten mal.

Wenn man eine bestimme Version forcieren will, d.h. von Nightly zu Stable wechseln und zurück, dann ruft man das Script so auf:

./jameica_updatecheck.sh -stable

oder

./jameica_updatecheck.sh -nightly

Hat man z.B. schon die aktuelle Stable-Version installiert und das Script bietet daher kein Update mehr an, kann man mit

./jameica_updatecheck.sh -stable

dennoch eine nochmalige Installation der Stable-Version auslösen.
j
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 128
Dabei seit: 02 / 2006
Betreff:

Re: Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 10.07.2015 - 12:28 Uhr  ·  #3
Beim Wechsel zwischen Stable- und Nightly-Versionen ist zu beachten, dass die Nightly-Builds die Datenbankstruktur so ändern, dass anschließend die Stable-Version damit nicht mehr klar kommt. Ist zwar selten, kann aber vorkommen.

Heiner
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 10.07.2015 - 12:39 Uhr  ·  #4
Zitat geschrieben von j

Beim Wechsel zwischen Stable- und Nightly-Versionen ist zu beachten, dass die Nightly-Builds die Datenbankstruktur so ändern, dass anschließend die Stable-Version damit nicht mehr klar kommt. Ist zwar selten, kann aber vorkommen.

Heiner


Danke Heiner.

Stimmt natürlich und ich hätte da evtl. auch nochmal drauf hinweisen sollen, allerdings dachte ich, wer die o.g. Scripte zum laufen bekommt, der weiß ganz genau was er da tut :-)

Zumindest funktioniert der Wechsel von Stable auf Nightly oder andersherum nur, wenn man die entsprechenden Parameter angibt. Von sich aus bietet das Script dies nicht an.

Ich glaube ich baue einfach für die nächste Version einen Warnhinweis ein:

Wenn von Stable auf Nightly, dann: Datenstrukturen werden evtl. geändert: Rückkehr von Nightly auf Stable möglicherweise nicht mehr möglich.

Wenn von Nightly auf Stable, dann: Bitte vorher eventuelle Inkompatibilitäten mit den Datenbankstrukturen evaluieren.
Heart
Benutzer
Avatar
Geschlecht:
Beiträge: 349
Dabei seit: 11 / 2003
Betreff:

Re: Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 13.07.2015 - 15:08 Uhr  ·  #5
@CBC

1)Da passt noch was nicht imho... Ich habe z.B. jameica nicht in /opt sondern nur bei meinem User in ~/Programme/jameica "installiert". Also habe ich bei beiden Dateien, den Pfad angepasst (hier wäre es auch schöner, wenn man dies nur 1x setzen müsste?!) und habe aber nach dem erfolgreichen Update einen quasi leeren ~/Programme/jameica Ordner (nur die Plugins sind drin).

edit: Im update_jameica.sh Skript hast Du zwar richtig $jameica_home beschrieben, aber nutzt hart /opt ;)
Code
echo "   Installiere neue Version in $jameica_home"

unzip -qu $inst_tmp/$download_file -d /opt

Es müsste dann
Code
unzip -qu $inst_tmp/$download_file -d $jameica_location
sein denke ich?!

(Weiterhin ist es eher unschön, dass ich ein root-Passwort eingeben muss, obwohl ich wie gesagt, jameica im $HOME liegen habe und hierdurch das jameica Verzeichnis ~/Programme/jameica samt entpackten Dateien mit root:root Rechten angelegt werden....)
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 13.07.2015 - 18:30 Uhr  ·  #6
Zitat geschrieben von Heart

@CBC

1)Da passt noch was nicht imho... Ich habe z.B. jameica nicht in /opt sondern nur bei meinem User in ~/Programme/jameica "installiert". Also habe ich bei beiden Dateien, den Pfad angepasst (hier wäre es auch schöner, wenn man dies nur 1x setzen müsste?!) und habe aber nach dem erfolgreichen Update einen quasi leeren ~/Programme/jameica Ordner (nur die Plugins sind drin).

edit: Im update_jameica.sh Skript hast Du zwar richtig $jameica_home beschrieben, aber nutzt hart /opt ;)
Code
echo "   Installiere neue Version in $jameica_home"

unzip -qu $inst_tmp/$download_file -d /opt

Es müsste dann
Code
unzip -qu $inst_tmp/$download_file -d $jameica_location
sein denke ich?!


Stimmt, da habe ich doch tatsächlich vergessen/übersehen die Zeile entsprechend abzuändern. So wie Du schon richtig gedacht hast, so sollte die Anweisung eigentlich auch aussehen.


Zitat geschrieben von Heart

(Weiterhin ist es eher unschön, dass ich ein root-Passwort eingeben muss, obwohl ich wie gesagt, jameica im $HOME liegen habe und hierdurch das jameica Verzeichnis ~/Programme/jameica samt entpackten Dateien mit root:root Rechten angelegt werden....)


Also es gibt zwei Möglichkeiten, entweder, Du änderst einfach den folgenden Teil von "jameica_updatecheck.sh"

Code

echo -n "   Root-"
su -c "./update_jameica.sh $jameica_new" 



in
Code

./update_jameica.sh $jameica_new


oder gleich so, da dies die Anpassung ist, die durch eine Prüfung des Zielordners auf Schreibrechte entscheidet, ober der aktuell angemeldete User selbst kopieren kann, oder ob dazu Root-Rechte erforderlich sind.

Code

if [[ ! -w $jameica_location ]]; then

     echo "   Aktueller Benutzer hat keine Schreibrechte in $jameica_location,"
     echo "   daher sind für die weitere Ausführung Root-Rechte erforderlich."
     echo -n "   Root-"
     su -c "./update_jameica.sh $jameica_new" 

else

     ./update_jameica.sh $jameica_new

fi 



Wenn aus irgendwelchen Gründen der aktuelle Benutzer keine Rechte hat, in das Installations-Verzeichnis zu schreiben, aber das Root Passwort ist auch nicht verfügbar, dann kann man auch einen Benutzer extra dafür anlegen, z.B. "jameicainst", diesem Benutzer dann Schreibrechte für /opt (oder wo auch immer) erteilen, und dann den o.g. Part so ändern: su jameicainst -c "./update_jameica.sh $jameica_new". Um noch flexibler zu werden:

Code

jameica_inst_user="jameicainst"

su $jameica_inst_user -c "./update_jameica.sh $jameica_new"




...und Du hast natürlich auch Recht, dass es unschön ist, zweimal die Variablen anzupassen, ich werde mir dazu noch einmal etwas anderes ausdenken, um die Sache komfortabler zu gestalten ... eigentlich könnte ich die beiden Scripte ja auch zusammenführen. Ich hatte dazu schon überlegt, wie ich vielleicht noch ein paar andere Funktionen unterbringe, um so eine Art Werzeugkasten als Shell Script zu bauen. Hierzu folgende Idee:

Ein Shell-Script, in denen lediglich alle Dinge wie z.B. der Update-Check als Funktion hinterlegt sind z.B.

#!/bin/bash
check_update() {

....

}

So könnte man von einem Hautscript oder jedem beliebigen anderen Script, alle Jameica/Hibiscus Funktionen wie folgt nutzen:

Einbinden mit

source ./jameica_functions.sh

dann einfach z.B. den Check auf neuere Versionen einfach mit folgendem Aufruf realisieren:

check_update

Das ganze würde natürlich auch mit den Variablen funktionieren, die so zentral in einer einzigen Datei gespeichert und gepflegt werden könnten...

Bsp. jameica_vars.sh:

#!/bin/bash

jameica_location="/opt"

dann auch einfach in jedem beliebigen Script, in dem die Variablen genutzt werden sollen, mit

source ./jameica_vars.sh

einbinden, und schon stehen die dort zur Verfügung.


Viele Grüße

Christian
Heart
Benutzer
Avatar
Geschlecht:
Beiträge: 349
Dabei seit: 11 / 2003
Betreff:

Re: Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 16.07.2015 - 15:58 Uhr  ·  #7
Zitat geschrieben von CBC"]
Code

if [[ ! -w $jameica_location ]]; then

     echo "   Aktueller Benutzer hat keine Schreibrechte in $jameica_location,"
     echo "   daher sind für die weitere Ausführung Root-Rechte erforderlich."
     echo -n "   Root-"
     su -c "./update_jameica.sh $jameica_new" 

else

     ./update_jameica.sh $jameica_new

fi 

^^^ das ist doch perfekt so! Danke
Kleiner Typo hier wieder: $jameica_location steht in jameica_updatecheck.sh nicht zur Verfügung, sollte denke ich $jameica_home sein...

[quote="CBC
...und Du hast natürlich auch Recht, dass es unschön ist, zweimal die Variablen anzupassen, ich werde mir dazu noch einmal etwas anderes ausdenken, um die Sache komfortabler zu gestalten ... eigentlich könnte ich die beiden Scripte ja auch zusammenführen. Ich hatte dazu schon überlegt, wie ich vielleicht noch ein paar andere Funktionen unterbringe, um so eine Art Werzeugkasten als Shell Script zu bauen. Hierzu folgende Idee:

Ein Shell-Script, in denen lediglich alle Dinge wie z.B. der Update-Check als Funktion hinterlegt sind z.B.

#!/bin/bash
check_update() {

....

}

So könnte man von einem Hautscript oder jedem beliebigen anderen Script, alle Jameica/Hibiscus Funktionen wie folgt nutzen:

Einbinden mit

source ./jameica_functions.sh

dann einfach z.B. den Check auf neuere Versionen einfach mit folgendem Aufruf realisieren:

check_update

Das ganze würde natürlich auch mit den Variablen funktionieren, die so zentral in einer einzigen Datei gespeichert und gepflegt werden könnten...

Bsp. jameica_vars.sh:

#!/bin/bash

jameica_location="/opt"

dann auch einfach in jedem beliebigen Script, in dem die Variablen genutzt werden sollen, mit

source ./jameica_vars.sh

einbinden, und schon stehen die dort zur Verfügung.


Viele Grüße

Christian

Ebenfalls eine sehr gute Idee!

Ich weiß jetzt nicht in wiefern die Funktionen bereits für mehrere Skripte nützlich sind (hast Du schon was in der Hinterhand? 8-) )... hätte sonst sogar gesagt, dass alles kompakt zusammen in eine Datei rein kann?
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Neues Script für automatisiertes Update Jameica-Framework

 · 
Gepostet: 16.07.2015 - 18:21 Uhr  ·  #8
Zitat
Kleiner Typo hier wieder: $jameica_location steht in jameica_updatecheck.sh nicht zur Verfügung, sollte denke ich $jameica_home sein...


So, habe ich mir noch mal angeschaut: Die Variable müsste tatsächlich dann noch in "jameica_updatecheck.sh" definiert werden, denn sie soll ja das übergeordnete Verzeichnis repräsentieren. Das ist wahrscheinlich auch der Grund warum sich der Fehler überhaupt eingeschlichen hat, bzw. warum "/opt" hart-kodiert war. Im Update Check habe ich die Variable jameica_home ja gleich komplett mit "/opt/jameica" konfiguriert, im Update Script selbst, wird sie mit jameica_home=$jameica_location"/jameica" zusammengebaut.

In Deinem Fall wäre die Definition im Update Check dann dann $jameica_location=$HOME und jameica_home=$jameica_location"/jameica"

Im eigentlichen Update-Script sieht das ja auch so aus:

Code

jameica_location="/opt"

jameica_home=$jameica_location"/jameica" 


Auf der anderen Seite funktioniert $jameica_home zwar grundsätzlich auch, allerdings, für den Fall, dass der aktuelle Benutzer zwar Schreibrechte in z.B. /opt/jameica hat, aber nicht in /opt selbst, würde beim Versuch die eigentliche Installation durchzuführen, das Script dann scheitern.

Zitat
ich weiß jetzt nicht in wiefern die Funktionen bereits für mehrere Skripte nützlich sind (hast Du schon was in der Hinterhand? 8-) )... hätte sonst sogar gesagt, dass alles kompakt zusammen in eine Datei rein kann?


Alles in eine Datei zu packen ist irgendwie auch mein Ziel, denn dann wäre diese Datei ja so eine Art Funktionsbibliothek, und man kann einfach die Funktionen nutzen, die man gerade braucht, und die anderen beachtet man einfach nicht. Der Aufruf einer bestimmten Funktion wäre dann ja quasi wie das Ausführen eines einzelnen unabhängigen Befehls. Allerdings einen genauen Zeitplan habe ich nocht nicht wann das fertig sein könnte. Mache das ja immer mal so nebenbei oder nachts :)

Auch wenn die Funktionen selbst alle in einer Datei sind, so würde ich auf jeden Fall die Variablen, die Benutzer-spezifisch sind in eine separate .cfg Datei auslagern wollen, so dass diese nicht überschrieben werden, wenn eine Update des Funktions-Scripts ansteht. Wäre ja auch blöd, wenn man immer alles neu eingeben muss.

Wenn Du oder sonst jemand noch ein paar Ideen ha(s)t, was für Funktionen nützlich sein könnten, so denke ich gerne darüber nach, wie das umgesetzt werden könnte.
Gewählte Zitate für Mehrfachzitierung:   0