Von 212+ auf 918+ mit ActivePerl (ohne Syno-Perl)

Begonnen von Dirk070, 28 Dezember 2017, 11:17:59

Vorheriges Thema - Nächstes Thema

Dirk070

Hallo zusammen,

dieses Forum hat mir schon so oft geholfen, dass ich zwischendurch meine Erfahrungen teilen möchte.
Hoffentlich hilft es dem ein oder anderen.

Ich habe meine Syno 212+ durch eine 918+ ersetzt.
Von der 212+ habe ich auf einer USB-Platte laufende HyperBackups gemacht. Diese habe ich auf der 918+ wiederhergestellt.
Ausser der Photo-Station wurden keine Pakete übernommen.

So, nun zum Wesentlichen:
Mein Ziel war, eine möglichst schlanke Installation aufzusetzen. Auf der 212+ hatte ich den Bootstrap, das Syno Perl und per CPAN JSON für das FritzBox-Modul. Gab es eine  neue Syno-Perl-Version, war i.d.R. JSON weg. Die ständige Bastelei soll nun aufhören (zumindest an dieser Stelle  ;))

1.) ActivePerl heruntergeladen und per Script installiert. Ist gut beschrieben: http://docs.activestate.com/activeperl/5.24/get/linux/
Zuerst hatte ich die neueste Version 5.26 installiert, aber dort gibt es (noch) kein PPM-Repository. Dazu gleich mehr.....

2.) JSON-XS installiert. ActiveState biete mit PPM kompilierte Binaries an. Damit braucht man kein Make und damit keinen Bootstrap auf der Syno (zumindest nicht für die Perl-Module). Schön beschrieben hier: https://www.activestate.com/blog/2016/01/installing-cpan-modules-activeperl-518-and-later Das PPM-Verzeichnis kann man hier durchsuchen: http://code.activestate.com/ppm/search:json/

3.) Nun sollte FHEM per Paket von Martin Fischer auf die Syno. Dazu hier mal einen herzlichen Dank, das sich jemand die Mühe macht, dieses Paket zur Verfügung zu stellen!!! Super!
Hier der Link: https://www.fischer-net.de/hausautomation/downloads/file/72-fhem_noarch-all_5-7-mfr-20160330-spk.html

4.) Problem: Das Paket hat eine Abhängigkeit zum Syno-Perl, prüft also auf Mindest-Versionen. Das ist hier schon in anderen Threads thematisiert worden und oft wurde Syno-Perl parallel installiert. Der Ansatz widerstrebte mir.
Also habe ich die Installationsdatei (SPK) mit 7-ZIP geöffnet und im Ordner ,,conf" die Datei ,,PKG_DEPS" gelöscht. 7-ZIP kann die Änderung direkt im Archiv vornehmen. Ich habe dazu auf meinem Mac ein 7-ZIP in einer Windows10-VM genutzt. Wenn jemand einen Tipp für ein Mac-Tool hat, welches diese Funktionen wie 7-ZIP bietet: Bitte her damit!

5.) Ergebnis: FHEM als Paket installiert. Nun auf der 212+ den Befehl "Backup" im FHEM ausführen. Danach die erzeugte tar.gz auf die 918+ kopieren. Nun die gesicherte Installation im neuen Verzeichnis entpacken: tar -xvzf /volume1/Backups/FHEM/FHEM-20171227_105813.tar.gz -C /volume1/@appstore/fhem/opt

6.) Soweit so gut, nur kennt FHEM den Pfad zum ActivePerl noch nicht. Im Pfad /volume1/@appstore/fhem/app/scripts liegt die fhem.sh. Hier habe ich den Pfad auf das Perl gesetzt, dies aber dynamisch per "which perl". Der Befehl liefert das Verzeichnis der Perl-Installation zurück. Sollte ich also später mal auf 5.26 wechseln und das Verzeichnis ändert sich, ist im FHEM-Script keine Anpassung notwendig.

So sieht die fhem.sh bei mir nun aus (die Änderungen sind per Kommentar markiert):
#!/bin/sh
#
#
HOME=/usr/local/fhem/opt
PATH=$HOME:$PATH
export PATH
cd ${HOME}

# Befehl Which Perl eingefuegt
fhem_BIN=${HOME}/fhem.pl
perl_BIN=`which perl`

test -x ${fhem_BIN} || { echo "${fhem_BIN} not installed";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 5; fi; }

# Check for existence of needed config file and read it
fhem_CONFIG=${HOME}/fhem.cfg
test -r ${fhem_CONFIG} || { echo "${fhem_CONFIG} not existing";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 6; fi; }

fhem_LOG=${HOME}/log/fhem-`date +"%Y-%m"`.log

#
case "$1" in
    start)
        echo "Starting fhem "
# Aufruf geaendert
        ${perl_BIN} $fhem_BIN $fhem_CONFIG
        ;;
    stop)
        echo "Shutting down fhem "
# Aufruf geaendert
        ${perl_BIN} $fhem_BIN 7072 shutdown
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    status)
        echo -n "Checking for service fhem "
        ps|grep fhem.pl
        ;;
    log)
        test -r $fhem_LOG || { echo "$fhem_LOG not existing"; exit 0; }
        echo $fhem_LOG
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|log}"
        exit 1
        ;;
esac
exit 0


ToDo:
Start und Stop funktioniert über das Terminal ohne Probleme "./fhem.sh start".
Aber noch nicht über das Paketzentrum. Daran arbeite ich noch.

Schöne Grüße,
Dirk

Dirk070

Tja schade, "which perl" funktioniert leider nicht aus der Oberfläche der Syno. >:(
Zudem startet der Service auch nicht automatisch, wenn die Syno bootet.

Im Moment habe ich die Variable perl_BIN fix mit dem Pfad /opt/ActivePerl-5.24/bin/perl belegt.
Mal schauen, ob es eine ähnlich flexible Möglichkeit wie which perl gibt, die auch komplett funktioniert....

Dirk070

Auch mit "command -v" bekomme ich das Script nur bei direktem Aufruf ans Laufen:

perl_BIN=$(command -v perl)
$perl_BIN $fhem_BIN $fhem_CONFIG


Über die Oberfläche findet der Aufruf über /var/packages/fhem/scripts/start-stop_status statt:

PACKAGE="fhem"
PACKAGE_DIR="/usr/local/${PACKAGE}"
PKG_APP_PATH="${PACKAGE_DIR}/target/app"
PKG_DESKTOP="/usr/syno/synoman/webman/3rdparty/${PACKAGE}"

StartDaemon() {
    ${PACKAGE_DIR}/bin/${PACKAGE}.sh start

Damit funktionert das Starten oder Stoppen des Services nicht, obwohl das fhem.sh direkt sauber läuft.

Setze ich den Pfad wieder direkt, klappt es auch über die Oberfläche:
perl_BIN=/opt/ActivePerl-5.24/bin/perl

Warum das dynamische Befüllen der Variablen beim verketteten Aufruf nicht funktioniert, ist mir ein Rätsel.
Kann jemand helfen?

Dirk070

Mit 2 Testscripts habe ich versucht, die Situation nachzustellen.
Das Stoppen der FHEM-Instanz über die Testscripts (start_test.sh ruft test.sh auf) funktioniert.
Also warum klappt es nicht über die Oberfläche der Syno mit dem start-stop-status?

start_test.sh:
#!/bin/sh
#
#
echo "Start Test"
#
PACKAGE="fhem"
TEST="test"
PACKAGE_DIR="/volume1/@appstore/${PACKAGE}"
${PACKAGE_DIR}/bin/${TEST}.sh


test.sh:
#!/bin/sh
#
#
echo "Test"
#
HOME=/usr/local/fhem/opt
perl_BIN=$(command -v perl)
fhem_BIN=${HOME}/fhem.pl
#
$perl_BIN $fhem_BIN 7072 shutdown