From f0eecb89308553d06a2a59606bab5ed1f4bc8748 Mon Sep 17 00:00:00 2001 From: NaruX Date: Tue, 25 Jul 2017 17:10:59 +0200 Subject: [PATCH] =?UTF-8?q?Sicherheitsbytes,=20die=20bei=20unsauberer=20Tr?= =?UTF-8?q?ennung=20geschrieben=20werden=20sollen=20Mehrere=20Bytebl=C3=B6?= =?UTF-8?q?cke=20mit=20Startpositionen=20definierbar=20Einzelne=20oder=20a?= =?UTF-8?q?lle=20Sicherheitsbytes=20l=C3=B6schbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- revpipyload/revpipyload.py | 73 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index 98dc476..28da3a0 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -598,6 +598,9 @@ class RevPiSlaveDev(Thread): self._devcon, self._addr = devcon self._evt_exit = Event() + # Sicherheitsbytes + self.ey_dict = {} + def run(self): """Verarbeitet Anfragen von Remoteteilnehmer.""" proginit.logger.debug("enter RevPiSlaveDev.run()") @@ -610,6 +613,7 @@ class RevPiSlaveDev(Thread): # Prozessabbild öffnen fh_proc = open(procimg, "r+b", 0) + dirty = True while not self._evt_exit.is_set(): # Laufzeitberechnung starten ot = default_timer() @@ -683,6 +687,57 @@ class RevPiSlaveDev(Thread): # Record seperator character self._devcon.send(b'\x1e') + elif cmd == b'EY': + # Bytes bei Verbindungsabbruch schreiben + # bCMiiiix0000000b = 16 + + position = int.from_bytes( + netcmd[3:5], byteorder="little" + ) + length = int.from_bytes( + netcmd[5:7], byteorder="little" + ) + if netcmd[7:8] == b'\xFF': + # Dirtybytes löschen + if position in self.ey_dict: + del self.ey_dict[position] + + # Record seperator character + self._devcon.send(b'\x1e') + proginit.logger.info( + "cleared dirty bytes on position {}" + "".format(position) + ) + + else: + # Dirtybytes hinzufügen + bytesbuff = bytearray() + try: + while not self._evt_exit.is_set() \ + and len(bytesbuff) < length: + block = self._devcon.recv(1024) + bytesbuff += block + if block == b'': + break + + except: + proginit.logger.error("error while recv dirty bytes") + break + + # Länge der Daten prüfen + if len(bytesbuff) == length: + self.ey_dict[position] = bytesbuff + else: + proginit.logger.error("got wrong length to write") + break + + # Record seperator character + self._devcon.send(b'\x1e') + proginit.logger.info( + "got dirty bytes to write on error on position {}" + "".format(position) + ) + elif cmd == b'PI': # piCtory Konfiguration senden proginit.logger.debug( @@ -701,6 +756,12 @@ class RevPiSlaveDev(Thread): self._devcon.send(b'\x04') continue + elif cmd == b'EX': + # Sauber Verbindung verlassen + dirty = False + self._evt_exit.set() + continue + else: # Kein gültiges CMD gefunden, abbruch! break @@ -716,6 +777,16 @@ class RevPiSlaveDev(Thread): ) # TODO: Soll ein Fehler ausgelöst werden? + # Dirty verlassen + if dirty: + for pos in self.ey_dict: + fh_proc.seek(pos) + fh_proc.write(self.ey_dict[pos]) + + proginit.logger.error( + "dirty shutdown of connection" + ) + fh_proc.close() self._devcon.close() self._devcon = None @@ -1090,6 +1161,8 @@ class RevPiPyLoad(): while not self._exit \ and not self.evt_loadconfig.is_set(): + # TODO: Soll hier der PLC Server Thread geprüft werden? + # piCtory auf Veränderung prüfen if self.pictorymtime != os.path.getmtime(configrsc): proginit.logger.warning("piCtory configuration was changed")