Routinen zum Neustarten von IPS bzw. Raspi mit "Intelligenz"

Da ich mir an einem vergangenen Raspi „shutdown -r“ meine Settings.json beschädigt habe, habe ich hier mal zwei Routinen gebastelt.
Als Linux Einsteiger war ich mit den Beispielen hier im Forum irgendwie nicht zufrieden…
Daher hier mal meine Skript Idee, IPS auf dem Raspi sauber zu beenden, wegzusichern, und neu zu starten.

Vielleicht kann jemand meine Routine mal prüfen (konnte sie noch nicht testen auf meinem Raspi)
Ziel war es, dass die ROutine von der Weboberfläche aus angestartet werden kann.

Dazu müsste ich noch wissen, wie ich eine „Bash_Routine“ von der Weboberfläche aus starten könnte und wo diese liegen müsste?

Variante 1:

  • Symcon beenden nachdem die Settings.json sauber geschrieben wurde (passiert glaub alle 5 Minuten):
  • symcon stoppen
  • Symcon Prozess abschiessen (sofern noch vorhanden)
  • kompletter Symcon Ordner auf verlinkte NAS Freigabe sichern mit Ordneranlage (mit DATUM)
  • Raspberry neustarten
  • Das ganze wird in ein Log weggeschrieben das ebenfalls auf der NAS liegt
#!/bin/bash
# IPS Stoppen und Raspberry neustarten in 1 Minute
# Speichern als IPS_Raspi_Restart.sh
# Variablendefinition
# -------------------
mkdir /home/pi/backup/$(date +%F)
log="/home/pi/backup/$(date +%F)/IPS.log"
PID=symcon
settings="/usr/share/symcon/settings.json"
# -------------------

if pidof $PID > /dev/null
then
    echo -e $(date)"	IP-Symcon läuft. Warte auf Aktualisierung der \"settings.json\"." >> $log
    inotifywait -q -e close_write --format %w%f $settings | while read FILE
    do
	echo -e $(date)"	Beende IP-Symcon." >> $log
	if sudo /etc/init.d/symcon stop
        cp /usr/share/symcon/* -r /home/pi/backup/$(date +%F) -a
        then
		echo -e $(date)"	IP-Symcon wurde beendet." >> $log
        killall symcon
		echo -e $(date)"	IP-Symcon wurde erfolgreich beendet." >> $log
		echo -e $(date)"	Raspberry wird neugestartet in 1 Minute" >> $log
		shutdown -r 1
	fi
        done
else
    echo -e $(date)"	IP-Symcon läuft nicht. Es gibt nichts zu tun." >> $log
    exit 1
fi
exit

Variante 2:
IPS Sauber beenden und danach wieder neustarten
Alle Schritte werden in ein Log geschrieben
IPS wird sicherheitshalber weggesichert.


#!/bin/bash 
# IPS Stoppen und Raspberry neustarten in 1 Minute 
# Speichern als IPS_Raspi_Restart.sh 
# Variablendefinition 
# ------------------- 
mkdir /home/pi/backup/$(date +%F) 
log="/home/pi/backup/$(date +%F)/IPS.log" 
PID=symcon 
settings="/usr/share/symcon/settings.json" 
# ------------------- 

if pidof $PID > /dev/null 
then 
    echo -e $(date)"	IP-Symcon läuft. Warte auf Aktualisierung der \"settings.json\"." >> $log 
    inotifywait -q -e close_write --format %w%f $settings | while read FILE 
    do 
    echo -e $(date)"	Beende IP-Symcon." >> $log 
    if sudo /etc/init.d/symcon stop 
        cp /usr/share/symcon/* -r /home/pi/backup/$(date +%F) -a 
        then 
        echo -e $(date)"	IP-Symcon wurde beendet." >> $log 
        killall symcon 
        echo -e $(date)"	IP-Symcon wurde erfolgreich beendet." >> $log 
        echo -e $(date)"	IP-Symcon wird neugestartet" >> $log 
        sudo /etc/init.d/symcon start 
    fi 
        done 
else 
    echo -e $(date)"	IP-Symcon läuft nicht." >> $log 
    exit 1 
fi 
exit 

inotify tools nachinstalliert - damit Befehl inotifywait auf das wegsichern der settings.json reagiert.

sudo apt-get inotify-tools

danach

sudo nano /etc/sysctl.conf

und folgenden eintrag hinzugefügt.

fs.inotify.max_user_watches=65536

Dann funktioniert das manuelle starten der IPS_xxx.sh Routine…

Wie kann ich diese BASH Routine nun von der Weboberfläche aus starten?

<?
IPS_Execute('home/pi/tools/IPS_RESTART.sh');
?>

oder

<?
exec('home/pi/tools/IPS_RESTART.sh');
?>

Funktionieren nicht. - Muss die Routine in einen anderen Raspberry Ordner rein?

Versuch mal hiermit



// Login RasP

$ssh = new Net_SSH2( $Raspi_IPAdresse );                // IP vom RasP

iif (!$ssh->login( $Raspi_Benutzer, $Raspi_Passwort ))  // Anmeldedaten vom RasPi   

{       

 exit('Login Failed');   

 }

$ssh->exec("xxxx");


Danke für den Tipp… nach ein bisschen Nacharbeit klappt es jetzt hervorragend.
Vielen Dank.

Fehler war noch:
„Net_SSH2 Class not found“
Daraufhin bin ich auf diesen Beitrag gestossen:
SSH möglich. - Seite 5

Die „phpseclib“ runtergeladen und testweise auf meinem Windows IPS unter „scripts\phpseclib“ rein.
Daraufhin gabs ein paar Abhängigkeiten (mit Verweisen nach C:\php…)

Dann die angepassten Dateien von hier eingefügt:

https://www.symcon.de/forum/threads/20482-SSH-per-PHP-z-B-um-AppleScript-auszuführen-mit-Siri-Beispiel-)?p=185455#post185455?p=185455#post185455)

Und mit dieser Routine kann ich mein Raspi oder mein IPS auf dem Raspi sauber neu starten inkl. BACKUP:

Problematisch könnte es sein, wenn das ganze zu lange dauert, da das abwarten der Settings.json + Symcon Ordner wegsichern schon bis zu 6 - 10 Minuten dauern könnte (bei mir).

<?
//SSH Login : Beginn
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Net/SSH2.php');

// IP vom Raspberry
$ssh = new Net_SSH2('192.168.2.3');

//Anmeldeuser und Passwort für Raspberry nach UFT8 konvertieren
//nur mit UTF8 Einstellung klappt auch ein putty login
//ohne diese Konvertierung erscheint immer "Login Failed" auch hier per ssh->login
$username = utf8_encode('USER');
$password = utf8_encode('PASSWORD');

    if (!$ssh->login($username, $password)) // Hier der echte Login
    {
        exit('Login Failed');
    }
//SSH Login: Ende
//Befehl der auf dem Raspberry ausgeführt wird um Raspi IPS neuzustarten
$ssh->exec("/home/pi/tools/IPS_RESTART.sh");

//Datum der Ausführung setzen
SetValue(45259,date("d.m.y H:i:s"));
?>

Sorry das ich include(‚Net/SSH2.php‘) vergessen hatte.

Aber schön das der Ansatz richtig war und es jetzt funkt.

Was wir jetzt noch brauchen ist ein automatiches Backup von IPS vom RasPi

Das Backup macht bei mir das einfache cp (copy) Kommando.
Und wie gesagt, ist das Verzeichnis „/home/pi/backup/“ ein Link zu meiner QNAP NAS.

Letztlich könnte man die (Bash Routine) auch als Cronjob hinterlegen.
Dazu gibt’s hier ja Beispiele (habs selber jetzt nicht im Kopf).

Hier die IPS STOP + Backup + IPS Start Routine.
Das wäre auch als Cronjob möglich.


#!/bin/bash 
# IPS Stoppen und Raspberry neustarten in 1 Minute 
# Speichern als IPS_Restart.sh 
# Variablendefinition 
# ------------------- 
mkdir /home/pi/backup/$(date +%F) 
log="/home/pi/backup/$(date +%F)/IPS.log" 
PID=symcon 
settings="/usr/share/symcon/settings.json" 
# ------------------- 

if pidof $PID > /dev/null 
then 
    echo -e $(date)"	IP-Symcon läuft. Warte auf Aktualisierung der \"settings.json\"." >> $log 
    inotifywait -q -e close_write --format %w%f $settings | while read FILE 
    do 
    echo -e $(date)"
	Beende IP-Symcon." >> $log 
    if sudo /etc/init.d/symcon stop 
        cp /usr/share/symcon/* -r /home/pi/backup/$(date +%F) -a 
        then 
        echo -e $(date)"
	IP-Symcon wurde beendet." >> $log 
        killall symcon 
        echo -e $(date)"
	IP-Symcon wurde erfolgreich beendet." >> $log 
        echo -e $(date)"
	IP-Symcon wird neugestartet" >> $log 
        sudo /etc/init.d/symcon start 
    fi 
        done 
else 
    echo -e $(date)"
	IP-Symcon läuft nicht." >> $log 
    exit 1 
fi 
exit  

Vorsicht mein Code basiert auf Pfaden von Raspbian Wheezy.
IPS hat die Pfade von IPS unter Raspbian Jessie geändert.

D.h. der Eintrag:
settings="/usr/share/symcon/settings.json"

Ist an den neuen Pfad anzupassen!
settings="/var/lib/symcon/settings.json"

–> Bitte prüfen ob der Pfad für „Jeesie“ passt - ich kanns nicht gegenprüfen, da ich mit meinem IPS 4.0 ALTSYSTEM kein Wechselbedarf habe.

Kann mir jemand auf die Sprünge helfen warum seit IPS Version 4 die folgenden Codezeilen nicht mehr abgearbeitet werden?
Die Routine hört bei „Beende IP-Symcon“ auf.
Ich habe den Verdacht das er beim kopieren mit dem Befehl:

cp /var/lib/symcon/* -r /home/pi/backup/$(date +%F) -a

sich die Routine bei Dateien mit UMLAUTEN und Sonderzeichen hängenbleibt.

er zeigt beim Aufruf an:

cp: der Aufruf von stat für „/home/pi/shares/backup/2016-09-02/\\media\	elefonbuch.xml“ ist nicht möglich: Das Argument ist ungültig
cp: reguläre Datei „/home/pi/shares/backup/2016-09-02/webfront/user/WetterFtpDWD/icons/bew\366lkt.png“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
cp: reguläre Datei „/home/pi/shares/backup/2016-09-02/webfront/user/WetterFtpDWD/icons/kr\344ftigerRegenschauer.png“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
cp: reguläre Datei „/home/pi/shares/backup/2016-09-02/webfront/user/WetterFtpDWD/icons/starkbew\366lkt.png“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden

Genau diese Zeilen werden nicht ins LOG FIle geschrieben und auch nicht ausgeführt.

echo -e $(date)"
	IP-Symcon wurde beendet." >> $log 
        killall symcon 
        echo -e $(date)"
	IP-Symcon wurde erfolgreich beendet." >> $log 
        echo -e $(date)"
	IP-Symcon wird neugestartet" >> $log 
        sudo /etc/init.d/symcon start 

Hier das gesamte Code - angepasst an der 4er IPS Version auf dem Raspi - :

#!/bin/bash
# IPS Stoppen, sichern und wieder starten
# Speichern als IPS_Restart.sh
# Variablendefinition
# -------------------
mkdir /home/pi/backup/$(date +%F)
log="/home/pi/backup/$(date +%F)/IPS.log"
PID=symcon
settings="/var/lib/symcon/settings.json"
# -------------------

if pidof $PID > /dev/null
then
    echo -e $(date)"	IP-Symcon laeuft. Warte auf Aktualisierung der \"settings.json\"." >> $log
    inotifywait -q -e close_write --format %w%f $settings | while read FILE
    do
    echo -e $(date)"
	Beende IP-Symcon." >> $log
    if sudo /etc/init.d/symcon stop
        cp /var/lib/symcon/* -r /home/pi/backup/$(date +%F) -a
        then
        echo -e $(date)"
	IP-Symcon wurde beendet." >> $log
        killall symcon
        echo -e $(date)"
	IP-Symcon Prozess wurde erfolgreich beendet." >> $log
        sudo /etc/init.d/symcon start
        echo -e $(date)"
	IP-Symcon wird neugestartet" >> $log
    fi
        done
else
    echo -e $(date)"
	IP-Symcon laeuft nicht." >> $log
    exit 1
fi
exit

Muss ich den Fehler mit dem Copy Befehl und den Sonderzeichen der Dateinamen anderstweitig umgehen??
(Z.B: Symcon Verzeichnis packen, und die gepackte Datei wegkopieren???)