Timeouthandling für NetFH verbessert 70 prozent für Sync-Timer

IP-Adresse prüfen und ggf. auflösen
This commit is contained in:
2018-07-27 14:15:10 +02:00
parent 03c7b7d7ea
commit 9882dc197a

View File

@@ -9,6 +9,7 @@
import socket import socket
import warnings import warnings
from json import loads as jloads from json import loads as jloads
from re import compile
from threading import Thread, Event, Lock from threading import Thread, Event, Lock
from .device import Device from .device import Device
@@ -37,7 +38,9 @@ class NetFH(Thread):
""" """
def __init__(self, address, timeout=500): def __init__(self, address, timeout=500):
"""Init NetFH-class.""" """Init NetFH-class.
@param address IP Adresse des RevPis
@param timeout Verbindungstimeout in Millisekunden"""
super().__init__() super().__init__()
self.daemon = True self.daemon = True
@@ -49,11 +52,11 @@ class NetFH(Thread):
self.__sockerr = Event() self.__sockerr = Event()
self.__sockend = False self.__sockend = False
self.__socklock = Lock() self.__socklock = Lock()
self.__timeout = timeout / 1000 self.__timeout = None
self.__trigger = False self.__trigger = False
self.__waitsync = self.__timeout / 2 self.__waitsync = None
socket.setdefaulttimeout(self.__timeout) self.__set_systimeout(timeout)
# Verbindung herstellen # Verbindung herstellen
self._address = address self._address = address
@@ -71,6 +74,20 @@ class NetFH(Thread):
"""NetworkFileHandler beenden.""" """NetworkFileHandler beenden."""
self.close() self.close()
def __set_systimeout(self, value):
"""Systemfunktion fuer Timeoutberechnung.
@param value Timeout in Millisekunden 100 - 60000"""
if isinstance(value, int) and (100 <= value <= 60000):
self.__timeout = value / 1000
socket.setdefaulttimeout(self.__timeout)
# 70 Prozent vom Timeout für Synctimer verwenden
self.__waitsync = self.__timeout / 10 * 7
else:
raise ValueError("value must between 10 and 60000 milliseconds")
def _connect(self): def _connect(self):
"""Stellt die Verbindung zu einem RevPiSlave her.""" """Stellt die Verbindung zu einem RevPiSlave her."""
# Neuen Socket aufbauen # Neuen Socket aufbauen
@@ -306,12 +323,10 @@ class NetFH(Thread):
if self.__sockend: if self.__sockend:
raise ValueError("I/O operation on closed file") raise ValueError("I/O operation on closed file")
if type(value) == int and (0 < value <= 65535): # Timeoutwert verarbeiten (könnte Exception auslösen)
self.__timeout = value / 1000 self.__set_systimeout(value)
self.__waitsync = self.__timeout / 2 - 0.05
# Timeouts in Sockets übernehmen # Timeouts in Socket setzen
socket.setdefaulttimeout(self.__timeout)
self._slavesock.settimeout(self.__timeout) self._slavesock.settimeout(self.__timeout)
with self.__socklock: with self.__socklock:
@@ -327,9 +342,6 @@ class NetFH(Thread):
self.__trigger = True self.__trigger = True
else:
raise ValueError("value must between 1 and 65535 milliseconds")
def tell(self): def tell(self):
"""Gibt aktuelle Position zurueck. """Gibt aktuelle Position zurueck.
@return int aktuelle Position""" @return int aktuelle Position"""
@@ -391,17 +403,19 @@ class RevPiNetIO(_RevPiModIO):
@param simulator Laedt das Modul als Simulator und vertauscht IOs @param simulator Laedt das Modul als Simulator und vertauscht IOs
""" """
check_ip = compile(
r"^(?P<ipn>(25[0-5]|(2[0-4]|[01]?\d|)\d))(\.(?P=ipn)){3}$"
)
# Adresse verarbeiten # Adresse verarbeiten
if type(address) == str: if isinstance(address, str):
# TODO: IP-Adresse prüfen
self._address = (address, 55234) self._address = (address, 55234)
elif type(address) == tuple: elif isinstance(address, tuple):
if len(address) == 2 \ if len(address) == 2 \
and type(address[0]) == str \ and isinstance(address[0], str) \
and type(address[1]) == int: and isinstance(address[1], int):
# Werte prüfen # Werte prüfen
# TODO: IP-Adresse prüfen
if not 0 < address[1] <= 65535: if not 0 < address[1] <= 65535:
raise ValueError("port number out of range 1 - 65535") raise ValueError("port number out of range 1 - 65535")
@@ -416,6 +430,16 @@ class RevPiNetIO(_RevPiModIO):
"like (<class 'str'>, <class 'int'>)" "like (<class 'str'>, <class 'int'>)"
) )
# IP-Adresse prüfen und ggf. auflösen
if check_ip.match(self._address[0]) is None:
try:
ipv4 = socket.gethostname(self._address[0])
self._address = (ipv4, self._address[1])
except:
raise ValueError(
"ip '{}' is no valid ip address".format(self._address[0])
)
# Vererben # Vererben
super().__init__( super().__init__(
autorefresh, autorefresh,