Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[solved] Automatisierter eMail-Versand / LogFiles
#1
Edit:
Download Logmailer-Plugin:
https://github.com/harryberlin/repositor....logmailer

[August 2016]
Nach der Installation des Plugins könnt ihr die default.py wie folgt bearbeiten, damit die Logfiles an die von Euch festgelegte Adresse gesendet werden:

Spoiler!

Code:
nano /home/osmc/.kodi/addons/plugin.script.logmailer/default.py


unter # eMail-Adressen (Sender/Empfaenger) [Zeile 65 ff]
Code:
Hostname = "BMWRaspControl"
mailReceiver = 'net@net.net'
full_file_path = ''
bei mailReceiver die eMail-Adresse eintragen, an die das Logfile gesendet werden soll.
Und unter full_file_path tragt ihr /home/osmc/.kodi/temp/kodi.log ein.
Mit STRG + X, Y, ENTER alles abspeichern, fertig. Jetzt funktionieren die unter der Kodi-GUI gesetzten Settings für Mode 0 "BMWRaspControl".


Hallo,

Idee:
Zusendung einer eMail mit für den User relevanten Informationen (in diesem Beispiel die CPU Temperatur bei Überschreitung eines selbst festgelegten Werts).
Zukünftig denkbar wäre bspw. die Zusendung der Log-Dateien oder ähnliche Dinge in regelmäßigen Abständen. --> erledigt (s. Logmailer-Plugin)

Verwendetes Setup:
Raspberry Pi 2 (Modell B), Image v1.8
Internetverbindung über mobilen Hotspot/Tethering (HUAWEI mobile WiFi / Verwendung des Smartphones)

Umsetzung (ein möglicher Weg):
Per SSH auf Pi aufschalten und nachfolgende Codes nacheinander im Terminal abarbeiten:

Spoiler!
Code:
sudo apt-get update && sudo apt-get upgrade -y

sudo apt-get install cron -y

sudo reboot -n

Erneut via SSH aufschalten
Code:
cd /home/osmc

nano cpu-temp-warning.py

Im nun geöffneten leeren Dokument nachfolgenden Quellcode einfügen. Dazu den Code vollständig markieren, kopieren und mit einem Rechtsklick im SSH-Fenster einfügen (Vorgang ist etwas verzögert, also einen kurzen Moment warten).

Spoiler!
Code:
#!/usr/bin/python

# Skript zum Versenden einer eMail bei Ueberschreitung einer selbstbestimmten max. Temperatur der CPU
# unter Verwendung von "/sys/class/thermal/thermal_zone0/temp"
# In Anlehnung an das Skript von Jan Karres, einsehbar unter:
# https://jankarres.de/2013/12/raspberry-pi-ueberwachen-mit-monitoring/
# angepasst von @Soheyl - http://www.bmwraspcontrol.de/board

# Um das Skript alle 5 Minuten ausfuehren zulassen, nachfolgende Zeile in die User-Crontab mit Aufruf von "crontab -e" eintragen:
# */5 * * * * /usr/bin/python /home/osmc/cpu-temp-warning.py >/dev/null 2>&1
# Die letzte Zeile der Crontab MUSS mit einer Leerzeile oder einem # enden!

# Falls eMails nicht gesendet werden, dann Hinweis in Zeile fuer TLS beachten!

# cpu-temp-warning.py

import os
import smtplib
import time
from email.mime.text import MIMEText

# Main-Settings
Hostname = "BMWRaspControl"

# eMail-Adressen (Sender/Empfaenger)
mailSender = "Sender@Provider.de"
mailReceiver = "Empfaenger@Provider.de"

# SMTP-Ausgangsserver (Sender)
smtpUser = "Sender@Provider.de"
smtpPassword = "AccountPasswort"
smtpHost = "smtp.provider.de"
smtpPort = 587
   
# Warning
criticalTemp = 55 # in degree celsius/centigrade

###############################################################################
# Time/Date Recording
date = "%02i.%02i.%04i" % (int(time.localtime()[2]), int(time.localtime()[1]), int(time.localtime()[0]))
time = "%02i:%02i:%02i" % (int(time.localtime()[3]), int(time.localtime()[4]), int(time.localtime()[5]))

def getCPUtemp():
   #res = os.popen('vcgencmd measure_temp').readline() # Befehl ist auskommentiert und wird hier nicht genutzt, da dabei zu hohe CPU-Last verursacht wird!
   #return(res.replace("temp=","").replace("'C\n","")) # bezieht sich auf vorherige Zeile, daher ebenfalls auskommentiert!
   with open("/sys/class/thermal/thermal_zone0/temp", 'r') as f:
       content = f.read().splitlines()
       return round(float(content[0]) / 1000.0, 2)
tempFloat = float(getCPUtemp())

def getCPUfreq():
   with open('/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq', 'r') as f:
       content = f.read().splitlines()
       return float(content[0]) / 1000.0
freqFloat = float(getCPUfreq())

if (tempFloat > criticalTemp):
   server = smtplib.SMTP(smtpHost, smtpPort)
   server.starttls() # If TLS authentication is not required, set a hash at the beginning of this line
   server.login(smtpUser, smtpPassword)

   value = "Hallo, " + "\n" + "\n" + "die aktuelle Temperatur des Raspberry Pi liegt bei " + str(tempFloat) + " Grad Celsius" + "\n" + "bei einer eingestellten CPU-Frequenz von " + str(freqFloat) + " MHz." + "\n" + "\n" + "Diese Werte wurden am " + date + " um " + time + " Uhr ermittelt." + "\n" + "\n" + "Kuehlen Sie das Geraet aktiv herunter oder schalten Sie es aus, um eventuelle Schaeden zu vermeiden!" + "\n" + "\n" + "__________________________" + "\n" + "Es handelt sich hierbei um eine automatisch generierte E-Mail, die von Ihrem Raspberry Pi (" + Hostname + ") gesendet worden ist."
   msg = MIMEText(value)
   msg['Subject'] = "[WARNUNG] RPi Temperatur zu hoch!!" # + str(tempFloat) + " Grad!"
   msg['From'] = mailSender
   msg['To'] = mailReceiver
   server.sendmail(mailSender, mailReceiver, msg.as_string())
   server.quit()


Anschließend die notwendigen Eintragungen im Skript unter # eMail-Adressen und # SMTP-Ausgangsserver machen. 
Habe dafür eine neue eMail-Adresse extra für den Pi angelegt. Bei Verwendung einer vorhandenen eMail-Adresse bedenken, dass das AccountPasswort im Klartext eingegeben und abgespeichert wird!!
 
Danach mit STRG + X, Y, ENTER abspeichern.

Damit das Skript alle 5 Minuten ausgeführt wird, die Temperatur überwacht und bei Überschreitung der eingestellten kritischen Temperatur (hier 55°C) eine eMail versendet, wird nachfolgender Eintrag in die User-Crontab getätigt:

Spoiler!
User-Crontab aufrufen:
Code:
crontab -e

Cronjob eintragen:
Code:
*/5 * * * * /usr/bin/python /home/osmc/cpu-temp-warning.py >/dev/null 2>&1

Bitte unbedingt darauf achten, dass sich am Ende der Crontab noch eine Leerzeile oder ein # befindet! Ansonsten arbeitet die Crontab nicht!
Mit STRG + X, Y, ENTER abspeichern und beenden.

Um zu testen, ob das Skript funktioniert criticalTemp = 20 setzen. 
Dann python cpu-temp-warning.py im Terminal ausführen. Jetzt solltet ihr eine eMail vom Pi bekommen haben.

Möchtet ihr feststellen, ob die Crontab korrekt arbeitet, dann die Temperatur bei 20°C beibehalten, entweder 5 Minuten warten und sehen, ob eine eMail ankommt. Alternativ innerhalb der Crontab das    /5   entfernen und abspeichern. Jetzt sollte Euch jede Minute eine eMail zugeschickt werden.


Bezüglich der LogFiles könnte man den Inhalt derer in eine Datei schreiben lassen und diese (oder vllt auch die LogDateien direkt?) dann bei Reboot, einmal wöchentlich oder auch bei Bedarf manuell (wie auch immer man möchte) via eMail an sich selbst senden. Das war zumindest mein Gedanke. Falls Euch etwas anderes/sinnvolleres einfallen sollte, dann meldet Euch.

Beste Grüße
Soheyl

P.s.:
Verwandtes Thema:
http://www.bmwraspcontrol.de/board/showt...php?tid=13

@b3m3
Könnte man beim nächsten Image die Crontab vllt direkt integrieren? Dann könnte man Cronjobs für regelmäßige Updates einfügen und entsprechende Skripte schreiben, die diese Updates im Hintergrund ausführen.
Falls es (aktuell) keine Verwendung dafür gibt, dann ist das auch nicht tragisch - die Installation von Cron ist ja schnell gemacht Wink
Danke
_________________
RPi 2 - Modell B -- Image v1.8 + IBusCommunicator-Addon
Zitieren
#2
Die Idee hatte ich auch schon.
Nur würde ich da gern eine separate Mailadresse dafür anlegen.

Ich sehe da nur noch ein weiteres Problem, die User sind nicht immer online.
Wenn man es im Addon laufen lässt, braucht man eigentlich keine Änderungen an users vornehmen. Und man könnte sogar für Mail Username und passwort als settings machen.
IBusCommunicator:
Image  <>  Kodi Addon

[Bild: usersignaturpic-14941mspx.jpg]
Zitieren
#3
(12.08.2016, 18:32)Soheyl schrieb: [...]
Habe dafür eine neue eMail-Adresse extra für den Pi angelegt. Bei Verwendung einer vorhandenen eMail-Adresse bedenken, dass das AccountPasswort im Klartext eingegeben und abgespeichert wird!!
[...]

Genau so hab ich es gemacht - eine separate eMail Adresse für den Pi angelegt Wink
Der Pi sendet mir über diese separate Mail eine Mail an eine von mir festgelegte Adresse, wenn die höchst Temperatur erreicht ist. Und diese Mail kann ich dann abrufen.

Was meinst Du mit "die User sind nicht immer online"? Jeder kriegt seine LogFiles an seinen Mail-Account gesendet und kann die Dateien dann direkt am Rechner einsehen.
Voraussetzung ist eben, dass man im Auto nur einen mobilen Hotspot braucht bzw. den Pi via Tethering mit seinem Handy verbindet und somit auf das mobile Netz zugreift. Dann kann der Pi die Mail versenden.
_________________
RPi 2 - Modell B -- Image v1.8 + IBusCommunicator-Addon
Zitieren
#4
nein, ich meinte, dass die logs an eine eigene mailadresse gehen. aber ist ähnlich, wie deine vorgehensweise.

genau das war damit gemeint. wlan oder mobile datenverbindung haben vermutlich die wenigsten im auto.
IBusCommunicator:
Image  <>  Kodi Addon

[Bild: usersignaturpic-14941mspx.jpg]
Zitieren
#5
Ja, okay. Hauptsache an eine Mailadresse, auf die man jederzeit zugreifen kann. 

Prinzipiell stimmt das, aber (fast) jeder hat zumindest sein Handy dabei und könnte dann den Pi (wenn dieser mit einem WLAN-Stick ausgestattet oder der Pi 3 eingebaut ist) via Tethering ans Internet hängen. Smile

http://mobil.teltarif.de/tag/tethering/
_________________
RPi 2 - Modell B -- Image v1.8 + IBusCommunicator-Addon
Zitieren
#6
Hallo,

hab hier jetzt mal ein Skript gebastelt, was die Logfiles (hier das Kodi-Log) einliest und als eMail-Anhang versendet.

LF-Kodi-Export.py - Download --> Edit: Änderungen (nächster Post) von @harryberlin eingefügt

Prinzipiell ähnliches Vorgehen wie im ersten Posting beschrieben:
Skript herunterladen und als User osmc in /home/osmc kopieren.
Dann mit nano LF-Kodi-Export.py öffnen und #eMail-Adressen und #SMTP-Ausgangsserver eintragen, mit STRG + X, Y, ENTER abspeichern. 
Anschließend python LF-Kodi-Export.py ausführen.

Beste Grüße
Soheyl
_________________
RPi 2 - Modell B -- Image v1.8 + IBusCommunicator-Addon
Zitieren
#7
Habs mal bissl umgeschrieben, dass man den dateiname an die funktion übergibt:
Aufruf ist nun in der main()
user und server daten könnte man später als dictonary auch übergeben, um es noch individueller zu machen.


Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Skript zum Exportieren der Kodi-LogFiles von BMWRaspControl an eine selbst festgelegte eMail-Adresse.
# Die Kodi-LogFiles befinden sich in /home/osmc/.kodi/temp/kodi.log

# Falls eMails nicht gesendet werden, dann Hinweis in Zeile fuer TLS beachten!

# LF-Kodi-Export.py

import os
import smtplib
import time
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email import encoders


def send_log_file(full_file_path):
   # Main-Settings
   Hostname = "BMWRaspControl"

   # eMail-Adressen (Sender/Empfaenger)
   mailSender = "Sender@Provider.de"
   mailReceiver = "Empfaenger@Provider.de"

   # SMTP-Ausgangsserver (Sender)
   smtpUser = "Sender@Provider.de"
   smtpPassword = "AccountPasswort"
   smtpHost = "smtp.provider.de"
   smtpPort = 587

   ###############################################################################
   # Time/Date Recording for Filename
   fndate = "%04i%02i%02i" % (int(time.localtime()[0]), int(time.localtime()[1]), int(time.localtime()[2]))
   fntime = "%02i%02i%02i" % (int(time.localtime()[3]), int(time.localtime()[4]), int(time.localtime()[5]))

   sendMail = 1  # set value to 1 = active, 0 = inactive

   if (sendMail > 0):
       server = smtplib.SMTP(smtpHost, smtpPort)
       server.starttls()  # If TLS authentication is not required set a hash at the beginning of this line
       server.login(smtpUser, smtpPassword)

       msg = MIMEMultipart()
       msg['Subject'] = "RPi LogFile-Export"
       msg['From'] = mailSender
       msg['To'] = mailReceiver

       MailContent = "Die exportierten Kodi-LogFiles befinden sich im Anhang dieser eMail. " + "\n" + "\n" + "__________________________" + "\n" + "Es handelt sich hierbei um eine automatisch generierte E-Mail, die von Ihrem Raspberry Pi (" + Hostname + ") gesendet worden ist."
       msg.attach(MIMEText(MailContent, 'plain'))

       filename = "Log-Export_Kodi_" + Hostname + "_" + fndate + "_" + fntime + ".txt"
       attachment = open(full_file_path, "rb")

       part = MIMEBase('application', 'octet-stream')
       part.set_payload(attachment.read())
       encoders.encode_base64(part)
       part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

       msg.attach(part)

       server.sendmail(mailSender, mailReceiver, msg.as_string())
       server.quit()


def main():
   send_log_file('/home/osmc/.kodi/temp/kodi.log')

if __name__ == '__main__':
   main()
IBusCommunicator:
Image  <>  Kodi Addon

[Bild: usersignaturpic-14941mspx.jpg]
Zitieren
#8
Perfekt! Danke Smile

Habe den Download-Link mit Deinen Code-Veränderungen aktualisiert.
_________________
RPi 2 - Modell B -- Image v1.8 + IBusCommunicator-Addon
Zitieren
#9
Hab mal ein Addon angefangen (siehe Anhang)
[attachment=236]
IBusCommunicator:
Image  <>  Kodi Addon

[Bild: usersignaturpic-14941mspx.jpg]
Zitieren
#10
Das sieht gut aus *THUMBS UP*
Willst Du es derart in der GUI gestalten, dass man dann dort direkt eMail-Adresse/User/PW/SMTP-Daten eingeben kann?

Hab nur festgestellt, dass das Vorgehen bei Verwendung einer eMail-Adresse von Google (gMail) anders ist, als ich es im Skript gemacht habe. 
Weiß nicht, was davon letztlich für Dich relevant ist und wieviel Du von dem Skript übernimmst.
Kann morgen nochmal nachschauen, was genau der Unterschied ist und es hier posten.
_________________
RPi 2 - Modell B -- Image v1.8 + IBusCommunicator-Addon
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste