SOFTWARE WATCHDOG FUER DIE CCU DIENSTE MIT MAIL BENACHRICHTIGUNG
Ich habe hier im Forum einen Software Watchdog veröffentlicht welcher jede Minute Überprüft ob alle Dienste Laufen und wenn nicht ein Mail sendet und die
RCU neu startet, dies musste ich für die
RCU unter Raspian anpassen und Erweitern. Auch haben wir hier nun die Möglichkeit die Mail und SMS Sende Funktion direkt mit dem Raspberry PI zu machen.
Der Neustart aus der chroot Umgebung heraus ist aber gelinde gesagt "Kompliziert" aber es geht so:
SSH ZUGRIFF VON CCU FIRMWARE HERAUS AUF RASPIAN
Es muss in der CCU Konsole ein RSA Key wie folgt erstellt werden:
Code: Alles auswählen
~/.ssh # ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
*****************************************
The key's randomart image is:
+--[ RSA 2048]----+
~/.ssh #
Dann gibt es einen ssh key für den Benutzer root
Code: Alles auswählen
/ # cd /root/.ssh/
~/.ssh # ls -lah
total 20
drwx------ 2 root root 4.0K Feb 9 16:14 .
drwxr-xr-x 3 root root 4.0K Feb 9 16:13 ..
-rw------- 1 root root 1.6K Feb 9 16:14 id_rsa
-rw-r--r-- 1 root root 390 Feb 9 16:14 id_rsa.pub
-rw-r--r-- 1 root root 176 Feb 9 16:13 known_hosts
~/.ssh #
Dann muss auch noch in der Raspian Konsole ein SSH Key erstellt werden:
Code: Alles auswählen
root@rpi-rcu:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
***********************
The key's randomart image is:
+--[ RSA 2048]----+
+-----------------+
root@rpi-rcu:~#
Nun wird der in der CCU Firmware erstellte Public Key in die authorized_hosts des RASPIAN kopiert damit der root benutzer der CCU Firmware in Laufzeit ohne Kenwortabfrage ssh Befehle auf dem Darunter Liegenten Raspian Ausführen kann.
Code: Alles auswählen
root@rcu:/# cd root/
root@rcu:~# ls -lah
insgesamt 36K
drwx------ 4 root root 4,0K Feb 9 17:19 .
drwxr-xr-x 23 root root 4,0K Feb 9 14:28 ..
drwx------ 2 root root 4,0K Feb 9 12:44 .aptitude
-rw------- 1 root root 218 Feb 9 15:09 .bash_history
-rw-r--r-- 1 root root 570 Jan 31 2010 .bashrc
-rw-r--r-- 1 root root 390 Feb 9 17:18 id_rsa.pub
-rw-r--r-- 1 root root 140 Nov 19 2007 .profile
drwx------ 2 root root 4,0K Feb 9 17:19 .ssh
-rw------- 1 root root 742 Feb 9 13:01 .viminfo
root@rcu:~# cat id_rsa.pub >> .ssh/authorized_keys
root@rcu:~# cat .ssh/authorized_keys
ssh-rsa ******************************
Nun können wir in der chroot Umgebung alle Befehle auf dem Zugrundeliegenden Rasbian Ausführen und so z.B. den Raspberry PI neu starten mit:
Der Vorteil von diesem Weg ist das wir nun aus der CCU Firmware Konsole heraus jeden Befehl im Raspian darüber ausführen können indem wir einfach
Ausführen.
Damit der Software Watchdog nicht schon beim Starten der
RCU zuschlägt weil die Java **** so lange zum Starten braucht habe ich dies wie folgt umgesetzt:
in der Datei /etc/init.d/S99eQ3SystemStarted habe ich im Start Bereich folgende Zeile hinzugefügt:
start() {
echo -n "System started"
init
if [ ! -e /etc/config/safemode ] ; then
# meine-homematic.de starten
/opt/mh/startup.sh
# Zusatzsoftware starten
run-parts /etc/config/rc.d
else
rm -f /etc/config/safemode
fi
touch /var/status/check_sh
echo "OK"
}
Und hier der Aktuelle Software Watchdog mit einem eigenen Konfig Bereich:
Code: Alles auswählen
#!/bin/sh
#### KONFIGURATION #### START
# Durch setzen von 0 = Aus oder 1 = Ein kann jeder Dienst einzeln Aktiviert / Deaktiviert werden
rfd_daemon=0
rs485_daemon=0
cux_daemon=0
send_mail=0
mail_to="max@mustermann.com"
reboot_command="ssh <ip oder hostname> reboot"
#### KONFIGURATION #### ENDE
#Prüfe ob der Start schon abgeschlossen wurde sonst Abbruch!
if [ ! -f "/var/status/check_sh" ]; then
echo "Nicht freigegeben..."
exit 0
fi
msg="X"
rega=$(ps aux|grep '/bin/ReGaHss'|grep -v grep|wc -l)
if [ $rega -lt 1 ]; then
msg="no ReGaHss process running"
echo $msg
fi
if [ $rfd_daemon -eq 1 ]; then
rfd=$(ps aux|grep 'bin/rfd '|grep -v grep|wc -l)
if [ $rfd -lt 1 ]; then
msg="no rfd process running"
echo $msg
fi
fi
if [ $rs485_daemon -eq 1 ]; then
rs485=$(ps aux|grep 'bin/hs485d '|grep -v grep|wc -l)
if [ $rs485 -lt 1 ]; then
msg="no rs485 process running"
echo $msg
fi
fi
if [ $cux_daemon -eq 1 ]; then
cuxd=$(ps aux|grep '/usr/local/addons/cuxd/cuxd'|grep -v grep|wc -l)
if [ $cuxd -lt 1 ]; then
msg="no cuxd process running"
echo $msg
fi
fi
if [ $msg == "X" ]; then
echo rfd: $rfd, rs485: $rs485, ReGaHss: $rega, CUxD: $cuxd daemons running, all fine...
else
if [ $send_mail -eq 1 ]; then
#Bereitet den Sting auf und wandelt alle Leerzeichen und Sonderzeichen in HTML Zeichen um
url=$(echo "$msg" | sed -e 's/%/%25/g' -e 's/ /%20/g' -e 's/!/%21/g' -e 's/"/%22/g' -e 's/#/%23/g' -e 's/\$/%24/g' -e 's/\&/%26/g' -e 's/'\''/%27/g' -e 's/(/%28/g' -e 's/)/%29/g' -e 's/\*/%2a/g' -e 's/+/%2b/g' -e 's/,/%2c/g' -e 's/-/%2d/g' -e 's/\./%2e/g' -e 's/\//%2f/g' -e 's/:/%3a/g' -e 's/;/%3b/g' -e 's//%3e/g' -e 's/?/%3f/g' -e 's/@/%40/g' -e 's/\[/%5b/g' -e 's/\\/%5c/g' -e 's/\]/%5d/g' -e 's/\^/%5e/g' -e 's/_/%5f/g' -e 's/`/%60/g' -e 's/{/%7b/g' -e 's/|/%7c/g' -e 's/}/%7d/g' -e 's/~/%7e/g')
wget -q -O - 'http://<IP oder HOSTNAME>:81/mail.php?rec=$mail_to&sub=rcu%20reboot&mes='$url
]
$($reboot_command)
fi
VERSENDEN VON MAILS ÜBER RASPIAN AUS DER CCU KONSOLE
Zum Versenden von Mails müssen wir auf der RASPIAN Konsole nun folgende Abhängigen Dienste Installieren:
Nachdem das Port 80 schon vom CCU Webinterface genutzt wird stellen wir den Apache auf Port 81 um indem wir folgende Dateien Ändern und Port 80 durch 81 ersetzen:
vi /etc/apache2/ports.conf
vi /etc/apache2/sites-enabled/000-default
Dann den Apache2 neu starten mit
Hier nun die /var/www/mail.php die direkt im RASPIAN Apache2 Webroot abgelegt werden kann:
Code: Alles auswählen
<?php
# Folgende Pakete müssen unter Debian Installiert sein
# aptitude install php5 libphp-phpmailer
error_reporting(E_ALL);
# Wenn die Standardwerte nicht gesetzt wird wird kein Mail versendet wenn die Parameter beim Aufruf nicht übergeben wurden.
if (isset($_GET["rec"])){ $rec = urldecode($_GET["rec"]); } else { $rec = "Standard_Empfaenger@domain.com"; }
if (isset($_GET["sub"])){ $sub = urldecode($_GET["sub"]); } else { $sub = "Standard_betreff"; }
if (isset($_GET["mes"])){ $mes = urldecode($_GET["mes"]); } else { $mes = "Standard_Nachricht!"; }
# Voreinstellungen:
// Mail Parameter
$smtp_host = "mail.domain.com"; # Mailserver fqdn oder IP
$smtp_port = "25"; # Maileserver Port
$smtp_sec = "tls"; # Oder leer bei keiner Verschlüsselung
$smtp_user = "haus@domain.com"; # Empfänger
$smtp_pwd = "******"; # Kennwort des Mailkontos
$smtp_from = "haus@domain.com"; # Absender Mailadresse
if (strlen($rec) > 0 and strlen($sub) > 0 or strlen($rec) > 0 and strlen($mes) > 0) {
require_once("libphp-phpmailer/class.phpmailer.php");
$body = "<html><body bgcolor=\"#ffffff\">\n";
$body .= "<p>".$mes."</p>\n";
$body .= "</body></html>\n";
$mail = new PHPMailer(true);
$body = $body;
$body = eregi_replace("[\]",'',$body);
$mail->IsSMTP();
$mail->Host = $smtp_host;
$mail->Port = $smtp_port;
$mail->SMTPSecure = $smtp_sec;
$mail->Username = $smtp_user;
$mail->Password = $smtp_pwd;
$mail->SetFrom($smtp_from, '');
$mail->AddReplyTo($smtp_from);
$mail->Subject = $sub;
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);
$mail->AddAddress($rec);
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "<p><b>Message sent!</b></p><br>";
}
} else {
echo "Es muss der Empfänger und der betreff angegeben werden";
}
?>
Nun kann auch aus einem HM Script heraus ein Mail mit dem RASBIAN auf der
RCU Gesendet werden:
Code: Alles auswählen
var rec = "empfänger@domain.com";
var sub = "Betreff";
var text = "Testmail";
string stdout;
string stderr;
string cmd = "wget -q -O - 'http://<IP oder HOSTNAME>:81/mail.php?rec=" + rec + "&sub=" + sub + "&mes=" + text +"'";
system.Exec(cmd, &stdout, &stderr);
Und ja ich weiß das man system.Exec nicht Nutzen soll und auf meinem Produktiv System habe ich den CUxD Installiert und mache es dort mit dem CUxD.exec wie es sich gehört!
LG
Paul