Python Script starten wenn Netzwerkvorhanden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo und guten Morgen,

    so nach unendlichen Stunden der Suche schreibe ich jetzt hier und bitte um Hilfe.

    Ich möchte das mein Raspi mir wenn eine Netzwerkverbindung zustande kommt eine E-Mail sendet mit der aktuellen IP Nummer. Dazu habe ich ein Python Script.

    E-Mail senden mit Python aus der Shell mit Anhang funktioniert.
    Nur wenn ich es per ifupdown auslösen will startet das Python Script nicht.

    Ich verstehe aber nicht warum nicht.....

    Der Ablauf ist ifupdown ruft ein Bash Script auf in dem wird die IP in eine Dateigeschrieben.
    Das funktioniert auch also ifupdown ruft mein Bash Script auf.

    Aber das Anschließende Python Script wird nicht abgearbeiet.

    Wenn ich in die nano /var/log/syslog schau dann bekomme ich folgendes raus


    Aug 1 10:30:06 raspcam1 kernel: [39113.114073] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
    Aug 1 10:30:06 raspcam1 dhcpcd[2264]: eth0: carrier acquired
    Aug 1 10:30:06 raspcam1 dhcpcd[2264]: all: IPv6 kernel autoconf disabled
    Aug 1 10:30:06 raspcam1 dhcpcd[2264]: eth0: IAID eb:7d:08:15
    Aug 1 10:30:06 raspcam1 dhcpcd[2264]: eth0: rebinding lease of 192.168.2.18
    Aug 1 10:30:06 raspcam1 ifplugd(eth0)[1605]: Link beat detected.
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: Executing '/etc/ifplugd/ifplugd.action eth0 up'.
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: Traceback (most recent call last):
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: File "/home/pi/scripte/email/mail.py", line 63, in <module>
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: server.send(sys.argv[1:])
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: File "/home/pi/scripte/email/mail.py", line 33, in send
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: server = smtplib.SMTP(self.smtpserver)
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: File "/usr/lib/python2.7/smtplib.py", line 249, in __init__
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: (code, msg) = self.connect(host, port)
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: File "/usr/lib/python2.7/smtplib.py", line 309, in connect
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: self.sock = self._get_socket(host, port, self.timeout)
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: File "/usr/lib/python2.7/smtplib.py", line 284, in _get_socket
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: return socket.create_connection((port, host), timeout)
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: File "/usr/lib/python2.7/socket.py", line 553, in create_connection
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: for res in getaddrinfo(host, port, 0, SOCK_STREAM):
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: socket.gaierror: [Errno -2] Name or service not known
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: run-parts: /etc/ifplugd/action.d//ifupdown exited with return code 1
    Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: Program execution failed, return value is 1.


    Leider werde ich daraus nicht schlau (bin noch nicht so erfahren)

    Hier mal mein Python Script und das Bash Script. Wie schon geschrieben das Bash Script s.sh wird aufgerufen sobald eine IP Adresse vom Raspberry bezogen wurde.



    Bash Script s.sh welches durch ifupdown aufgerufen wird.


    Python Scrip zum senden der E-Mail mit Anhang


    Ich danke euch allen schon mal für eure Mühe.


    Gruß
    Michael

  • Hallo,


    der Stacktrace von Python ist schon recht ausführlich und i.d.R. kann man daraus "lesen", warum was schief gegangen ist.

    Bei dir entsteht der Fehler in Zeile 63 des Skripts:

    > Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: File "/home/pi/scripte/email/mail.py", line 63, in <module>
    > Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: server.send(sys.argv[1:])


    Und zwar beim Aufruf von `server.send(sys.argv[1:])`

    Dann hangelst du dich durch die Kette der Python aufrufe und endest bei

    > Aug 1 10:30:07 raspcam1 ifplugd(eth0)[1605]: client: socket.gaierror: [Errno -2] Name or service not known

    Heißt IMHO: der Mailserver ist nicht verfügbar.

    Kann es sein, dass der Mailserver noch nicht läuft, wenn das Skript ausgeführt wird? Oder läuft der Mailserver auf einem anderen Rechner?

    Gruß, noisefloor

  • Vielen Dank für deine Antwort.

    Das war es der Raspberry war einfach noch nicht so weit.
    Ich habe in das Bash Scrip einfach ein Sleep 10s eingebaut und


    ES GEHT


    VIELEN, VIELEN DANK....

    Einmal editiert, zuletzt von RaspPiHF (1. August 2015 um 11:54)

  • Fein dass es jetzt funktioniert. So ein sleep ist ja schnell eingebaut.

    Aber ich empfehle in solchen Fällen immer explizit zu warten und zu testen dass das Ereignis eingetreten ist. In Deinem Falle dass der eMailServer erreichbar ist. Denn es kann durch irgendwelche Randbedingungen mal sein dass der sleep nicht ausreicht und dann blöde Fehler bekommt die man dann anfängt zu suchen.


  • Fein dass es jetzt funktioniert. So ein sleep ist ja schnell eingebaut.

    Aber ich empfehle in solchen Fällen immer explizit zu warten und zu testen dass das Ereignis eingetreten ist. In Deinem Falle dass der eMailServer erreichbar ist. Denn es kann durch irgendwelche Randbedingungen mal sein dass der sleep nicht ausreicht und dann blöde Fehler bekommt die man dann anfängt zu suchen.

    Ja da gebe ich dir recht das werde ich auch mal machen.
    Leider weiß ich nicht wie ich das machen soll aber da finde ich bestimmt mal eine Lösung.

    Die Frage welche sich mit spontan stellt nach welchem Dienst muss ich schauen?


    Wir gesagt habe erst mit Raspi und Python angefangen.

    Gruß
    Michael

    Einmal editiert, zuletzt von RaspPiHF (1. August 2015 um 14:03)

  • Am universllsten ist wohl einfach abzufragen ober der eMail smtp Port offen ist. Wenn Du den Funktionsaufruf bei Deinem bash einbaust wird dieses getan.
    [code=php]#!/bin/bash
    #
    # Wait until a port is open
    #
    # 2015 - framp
    #
    HOST=192.168.0.6 # host/ip
    PORT=25 # port to check
    SLEEP=3 # seconds
    RETRIES=3 # number of retries
    DEBUG=0 # set to 1 for debug messages

    # $1 $2 $3 $4 $5
    function checkIfPortOpen() { # host, port, sleep, retries, debug

    local portOpen=0
    local retries=$4

    while (( ! $portOpen )); do
    nc -v -z -w 3 $1 $2 &>/dev/null
    [[ $? == 0 ]] && portOpen=1
    if (( ! $portOpen )); then
    (( $5 )) && echo "DBG: Port $2 on $1 not open"
    (( $5 )) && echo "DBG: Retrycount: $retries"
    if (( $retries == 0 )); then
    return 1
    fi
    (( $5 )) && echo "DBG: Sleeping for $3 seconds"
    sleep $3
    : $(( retries-- ))
    else
    return 0
    fi
    done
       
    return 1
    }

    if checkIfPortOpen $HOST $PORT $SLEEP $RETRIES $DEBUG; then
    echo "Port $PORT on $HOST is open"
    else
    echo "Port $PORT on $HOST is closed"
    fi
    [/php]


  • Huiii

    Vielen dank ich schaue es mir morgen gleich mal....

    Ich berichte dann.


    Update 02.08.2015

    Ich habe das jetzt mal getestet. Es funktioniert SUPER

    Vielen Dank an noisefloor und framp für eure Hilfe

    Einmal editiert, zuletzt von RaspPiHF (2. August 2015 um 15:22)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!