Browse Source

Release b2cd74413a; Logging + Restructuring

master
Dirk Alders 4 years ago
parent
commit
54ff073143

+ 46
- 33
__init__.py View File

94
 """Status for 'checksum error'"""
94
 """Status for 'checksum error'"""
95
 STATUS_OPERATION_NOT_PERMITTED = 6
95
 STATUS_OPERATION_NOT_PERMITTED = 6
96
 """Status for 'operation not permitted'"""
96
 """Status for 'operation not permitted'"""
97
+STATUS_LOG_LVL = {
98
+    STATUS_OKAY: logging.INFO,
99
+    STATUS_BUFFERING_UNHANDLED_REQUEST: logging.WARNING,
100
+    STATUS_CALLBACK_ERROR: logging.ERROR,
101
+    STATUS_AUTH_REQUIRED: logging.WARNING,
102
+    STATUS_SERVICE_OR_DATA_UNKNOWN: logging.ERROR,
103
+    STATUS_CHECKSUM_ERROR: logging.ERROR,
104
+    STATUS_OPERATION_NOT_PERMITTED: logging.WARNING,
105
+}
106
+"""Status depending log level for messages"""
97
 
107
 
98
 AUTH_STATE_UNTRUSTED_CONNECTION = 0
108
 AUTH_STATE_UNTRUSTED_CONNECTION = 0
99
 """Authentification Status for an 'Untrusted Connection'"""
109
 """Authentification Status for an 'Untrusted Connection'"""
271
         #
281
         #
272
         self.__status_name_dict = {}
282
         self.__status_name_dict = {}
273
         self.add_status(STATUS_OKAY, 'okay')
283
         self.add_status(STATUS_OKAY, 'okay')
274
-        self.add_status(STATUS_BUFFERING_UNHANDLED_REQUEST, 'no callback for service, data buffered.')
275
-        self.add_status(STATUS_CALLBACK_ERROR, 'callback error.')
284
+        self.add_status(STATUS_BUFFERING_UNHANDLED_REQUEST, 'no callback for service, data buffered')
285
+        self.add_status(STATUS_CALLBACK_ERROR, 'callback error')
276
         self.add_status(STATUS_AUTH_REQUIRED, 'authentification required')
286
         self.add_status(STATUS_AUTH_REQUIRED, 'authentification required')
277
         self.add_status(STATUS_SERVICE_OR_DATA_UNKNOWN, 'service or data unknown')
287
         self.add_status(STATUS_SERVICE_OR_DATA_UNKNOWN, 'service or data unknown')
278
         self.add_status(STATUS_CHECKSUM_ERROR, 'checksum error')
288
         self.add_status(STATUS_CHECKSUM_ERROR, 'checksum error')
374
         self.__msg_buffer__[msg.get_service_id()][msg.get_data_id()].append(msg)
384
         self.__msg_buffer__[msg.get_service_id()][msg.get_data_id()].append(msg)
375
         self.logger.debug("%s Message data is stored in buffer and is now ready to be retrieved by receive method", self.__log_prefix__())
385
         self.logger.debug("%s Message data is stored in buffer and is now ready to be retrieved by receive method", self.__log_prefix__())
376
 
386
 
377
-    def __build_frame__(self, service_id, data_id, data, status=STATUS_OKAY):
378
-        data_frame = json.dumps(self.__mk_msg__(status, service_id, data_id, data))
387
+    def __build_frame__(self, msg):
388
+        data_frame = json.dumps(self.__mk_msg__(msg.get_status(), msg.get_service_id(), msg.get_data_id(), msg.get_data()))
379
         if sys.version_info >= (3, 0):
389
         if sys.version_info >= (3, 0):
380
             data_frame = bytes(data_frame, 'utf-8')
390
             data_frame = bytes(data_frame, 'utf-8')
381
         checksum = self.__calc_chksum__(data_frame)
391
         checksum = self.__calc_chksum__(data_frame)
424
         if self.__auto_auth__ and self.__comm_inst__.IS_CLIENT and self.__secret__ is not None:
434
         if self.__auto_auth__ and self.__comm_inst__.IS_CLIENT and self.__secret__ is not None:
425
             self.authentificate()
435
             self.authentificate()
426
 
436
 
437
+    def __log_msg__(self, msg, rx_tx_prefix):
438
+        self.logger.log(
439
+            self.__status_log_lvl__(msg.get_status()),
440
+            '%s %s %s, %s, data: "%s"',
441
+            self.__log_prefix__(),
442
+            rx_tx_prefix,
443
+            self.__get_message_name__(msg.get_service_id(), msg.get_data_id()),
444
+            self.__get_status_name__(msg.get_status()),
445
+            repr(msg.get_data())
446
+        )
447
+
427
     def __data_available_callback__(self, comm_inst):
448
     def __data_available_callback__(self, comm_inst):
428
         frame = comm_inst.receive()
449
         frame = comm_inst.receive()
429
         msg = self.__analyse_frame__(frame)
450
         msg = self.__analyse_frame__(frame)
430
         if not self.__check_frame_checksum__(frame):
451
         if not self.__check_frame_checksum__(frame):
431
             # Wrong Checksum
452
             # Wrong Checksum
432
-            self.logger.warning("%s RX <- Received message has a wrong checksum. Message will be ignored.", self.__log_prefix__())
453
+            self.logger.log(self.__status_log_lvl__(STATUS_CHECKSUM_ERROR), "%s Received message has an invalid checksum. Message will be ignored.", self.__log_prefix__())
433
             return  # No response needed
454
             return  # No response needed
434
         elif not self.check_authentification_state() and self.__authentification_required__(msg.get_service_id(), msg.get_data_id()):
455
         elif not self.check_authentification_state() and self.__authentification_required__(msg.get_service_id(), msg.get_data_id()):
435
             # Authentification required
456
             # Authentification required
457
+            self.__log_msg__(msg, 'RX <-')
436
             if msg.get_service_id() in self.__sid_response_dict__.keys():
458
             if msg.get_service_id() in self.__sid_response_dict__.keys():
437
-                self.logger.warning("%s RX <- Authentification is required. Just sending negative response.", self.__log_prefix__())
459
+                self.logger.log(self.__status_log_lvl__(STATUS_AUTH_REQUIRED), "%s Authentification is required. Just sending negative response.", self.__log_prefix__())
438
                 status = STATUS_AUTH_REQUIRED
460
                 status = STATUS_AUTH_REQUIRED
439
                 data = None
461
                 data = None
440
             else:
462
             else:
441
-                self.logger.warning("%s RX <- Authentification is required. Message will be ignored.", self.__log_prefix__())
463
+                self.logger.log(self.__status_log_lvl__(STATUS_AUTH_REQUIRED), "%s Authentification is required. Incomming message will be ignored.", self.__log_prefix__())
442
                 return  # No response needed
464
                 return  # No response needed
443
         else:
465
         else:
444
             # Valid message
466
             # Valid message
445
-            self.logger.info(
446
-                '%s RX <- %s, %s, data: "%s"',
447
-                self.__log_prefix__(),
448
-                self.__get_message_name__(msg.get_service_id(), msg.get_data_id()),
449
-                self.__get_status_name__(msg.get_status()),
450
-                repr(msg.get_data())
451
-            )
452
-            if msg.get_status() not in [STATUS_OKAY]:
453
-                self.logger.warning("%s RX <- Message has a peculiar status: %s", self.__log_prefix__(), self.__get_status_name__(msg.get_status()))
467
+            self.__log_msg__(msg, 'RX <-')
454
             callback, args, kwargs = self.__callbacks__.get(msg.get_service_id(), msg.get_data_id())
468
             callback, args, kwargs = self.__callbacks__.get(msg.get_service_id(), msg.get_data_id())
455
             if msg.get_service_id() in self.__sid_response_dict__.keys():
469
             if msg.get_service_id() in self.__sid_response_dict__.keys():
456
                 #
470
                 #
457
                 # REQUEST RECEIVED
471
                 # REQUEST RECEIVED
458
                 #
472
                 #
459
                 if callback is None:
473
                 if callback is None:
460
-                    self.logger.warning("%s RX <- Message with no registered callback. Sending negative response.", self.__log_prefix__())
474
+                    self.logger.warning("%s Incomming message with no registered callback. Sending negative response.", self.__log_prefix__())
461
                     status = STATUS_BUFFERING_UNHANDLED_REQUEST
475
                     status = STATUS_BUFFERING_UNHANDLED_REQUEST
462
                     data = None
476
                     data = None
463
                 else:
477
                 else:
464
                     try:
478
                     try:
465
-                        self.logger.debug("%s RX <- Executing callback %s to process received data", self.__log_prefix__(), callback.__name__)
479
+                        self.logger.debug("%s Executing callback %s to process received data", self.__log_prefix__(), callback.__name__)
466
                         status, data = callback(msg, *args, **kwargs)
480
                         status, data = callback(msg, *args, **kwargs)
467
                     except Exception:
481
                     except Exception:
468
-                        logger.error('{lp} RX <- Exception raised. Check callback {callback_name} and it\'s return values for service_id  {service_id} and data_id {data_id}'.format(lp=self.__log_prefix__(), callback_name=callback.__name__, service_id=repr(msg.get_service_id()), data_id=repr(msg.get_data_id())))
482
+                        logger.error('{lp} Exception raised. Check callback {callback_name} and it\'s return values for service_id  {service_id} and data_id {data_id}'.format(lp=self.__log_prefix__(), callback_name=callback.__name__, service_id=repr(msg.get_service_id()), data_id=repr(msg.get_data_id())))
469
                         status = STATUS_CALLBACK_ERROR
483
                         status = STATUS_CALLBACK_ERROR
470
                         data = None
484
                         data = None
471
             else:
485
             else:
498
             self.logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__ + '.' + channel_name)
512
             self.logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__ + '.' + channel_name)
499
 
513
 
500
     def __log_prefix__(self):
514
     def __log_prefix__(self):
501
-        return 'SP client:' if self.__comm_inst__.IS_CLIENT else 'SP server:'
515
+        return 'prot-client:' if self.__comm_inst__.IS_CLIENT else 'prot-server:'
502
 
516
 
503
     def __mk_msg__(self, status, service_id, data_id, data):
517
     def __mk_msg__(self, status, service_id, data_id, data):
504
         return data_storage({data_storage.KEY_DATA_ID: data_id, data_storage.KEY_SERVICE_ID: service_id, data_storage.KEY_STATUS: status, data_storage.KEY_DATA: data})
518
         return data_storage({data_storage.KEY_DATA_ID: data_id, data_storage.KEY_SERVICE_ID: service_id, data_storage.KEY_STATUS: status, data_storage.KEY_DATA: data})
505
 
519
 
520
+    def __status_log_lvl__(self, status):
521
+        return STATUS_LOG_LVL.get(status, logging.CRITICAL)
522
+
506
     def add_data(self, service_id, data_id, name):
523
     def add_data(self, service_id, data_id, name):
507
         """
524
         """
508
         Method to add a name for a specific message.
525
         Method to add a name for a specific message.
711
         :rtype: bool
728
         :rtype: bool
712
         """
729
         """
713
         if (self.check_authentification_state() or not self.__authentification_required__(service_id, data_id)) or (service_id in self.__sid_response_dict__.values() and status == STATUS_AUTH_REQUIRED and data is None):
730
         if (self.check_authentification_state() or not self.__authentification_required__(service_id, data_id)) or (service_id in self.__sid_response_dict__.values() and status == STATUS_AUTH_REQUIRED and data is None):
714
-            self.logger.info(
715
-                '%s TX <- %s, %s, data: "%s"',
716
-                self.__log_prefix__(),
717
-                self.__get_message_name__(service_id, data_id),
718
-                self.__get_status_name__(status),
719
-                repr(data)
720
-            )
721
-            return self.__comm_inst__.send(self.__build_frame__(service_id, data_id, data, status), timeout=timeout, log_lvl=logging.DEBUG)
731
+            msg = data_storage(service_id=service_id, data_id=data_id, data=data, status=status)
732
+            self.__log_msg__(msg, 'TX ->')
733
+            return self.__comm_inst__.send(self.__build_frame__(msg), timeout=timeout)
722
         else:
734
         else:
723
             # Authentification required
735
             # Authentification required
724
-            self.logger.warning("%s TX -> Authentification is required. Message %s, %s, data: %s will be ignored.", self.__log_prefix__(), self.__get_message_name__(service_id, data_id), self.__get_status_name__(status), repr(data))
736
+            self.logger.warning("%s Authentification is required. TX-Message %s, %s, data: %s will be ignored.", self.__log_prefix__(), self.__get_message_name__(service_id, data_id), self.__get_status_name__(status), repr(data))
725
             return False
737
             return False
726
 
738
 
727
 
739
 
728
 class struct_json_protocol(pure_json_protocol):
740
 class struct_json_protocol(pure_json_protocol):
729
     """
741
     """
730
     This Class has the same functionality like :class:`pure_json_protocol`. The message length is less than for :class:`pure_json_protocol`, but the functionality and compatibility is reduced.
742
     This Class has the same functionality like :class:`pure_json_protocol`. The message length is less than for :class:`pure_json_protocol`, but the functionality and compatibility is reduced.
743
+    See also parent :py:class:`pure_json_protocol`.
731
 
744
 
732
     .. note::
745
     .. note::
733
         This class is depreceated and here for compatibility reasons (to support old clients or servers). Usage of :class:`pure_json_protocol` is recommended.
746
         This class is depreceated and here for compatibility reasons (to support old clients or servers). Usage of :class:`pure_json_protocol` is recommended.
743
             data = json.loads(frame[12:-1])
756
             data = json.loads(frame[12:-1])
744
         return self.__mk_msg__(status, service_id, data_id, data)
757
         return self.__mk_msg__(status, service_id, data_id, data)
745
 
758
 
746
-    def __build_frame__(self, service_id, data_id, data, status=STATUS_OKAY):
747
-        frame = struct.pack('>III', status, service_id, data_id)
759
+    def __build_frame__(self, msg):
760
+        frame = struct.pack('>III', msg.get_status(), msg.get_service_id(), msg.get_data_id())
748
         if sys.version_info >= (3, 0):
761
         if sys.version_info >= (3, 0):
749
-            frame += bytes(json.dumps(data), 'utf-8')
762
+            frame += bytes(json.dumps(msg.get_data()), 'utf-8')
750
             frame += self.__calc_chksum__(frame)
763
             frame += self.__calc_chksum__(frame)
751
         else:
764
         else:
752
-            frame += json.dumps(data)
765
+            frame += json.dumps(msg.get_data())
753
             frame += self.__calc_chksum__(frame)
766
             frame += self.__calc_chksum__(frame)
754
         return frame
767
         return frame
755
 
768
 

BIN
_docs_/_downloads/37503cb17b21b2c78bb8b07730976f24/unittest.pdf View File


+ 2
- 0
_docs_/genindex.html View File

302
       <li><a href="index.html#socket_protocol.STATUS_CALLBACK_ERROR">STATUS_CALLBACK_ERROR (in module socket_protocol)</a>
302
       <li><a href="index.html#socket_protocol.STATUS_CALLBACK_ERROR">STATUS_CALLBACK_ERROR (in module socket_protocol)</a>
303
 </li>
303
 </li>
304
       <li><a href="index.html#socket_protocol.STATUS_CHECKSUM_ERROR">STATUS_CHECKSUM_ERROR (in module socket_protocol)</a>
304
       <li><a href="index.html#socket_protocol.STATUS_CHECKSUM_ERROR">STATUS_CHECKSUM_ERROR (in module socket_protocol)</a>
305
+</li>
306
+      <li><a href="index.html#socket_protocol.STATUS_LOG_LVL">STATUS_LOG_LVL (in module socket_protocol)</a>
305
 </li>
307
 </li>
306
       <li><a href="index.html#socket_protocol.STATUS_OKAY">STATUS_OKAY (in module socket_protocol)</a>
308
       <li><a href="index.html#socket_protocol.STATUS_OKAY">STATUS_OKAY (in module socket_protocol)</a>
307
 </li>
309
 </li>

+ 8
- 1
_docs_/index.html View File

321
 <dd><p>Status for ‘checksum error’</p>
321
 <dd><p>Status for ‘checksum error’</p>
322
 </dd></dl>
322
 </dd></dl>
323
 
323
 
324
+<dl class="data">
325
+<dt id="socket_protocol.STATUS_LOG_LVL">
326
+<code class="descclassname">socket_protocol.</code><code class="descname">STATUS_LOG_LVL</code><em class="property"> = {0: 20, 1: 30, 2: 40, 3: 30, 4: 40, 5: 40, 6: 30}</em><a class="headerlink" href="#socket_protocol.STATUS_LOG_LVL" title="Permalink to this definition">¶</a></dt>
327
+<dd><p>Status depending log level for messages</p>
328
+</dd></dl>
329
+
324
 <dl class="data">
330
 <dl class="data">
325
 <dt id="socket_protocol.STATUS_OKAY">
331
 <dt id="socket_protocol.STATUS_OKAY">
326
 <code class="descclassname">socket_protocol.</code><code class="descname">STATUS_OKAY</code><em class="property"> = 0</em><a class="headerlink" href="#socket_protocol.STATUS_OKAY" title="Permalink to this definition">¶</a></dt>
332
 <code class="descclassname">socket_protocol.</code><code class="descname">STATUS_OKAY</code><em class="property"> = 0</em><a class="headerlink" href="#socket_protocol.STATUS_OKAY" title="Permalink to this definition">¶</a></dt>
724
 <dl class="class">
730
 <dl class="class">
725
 <dt id="socket_protocol.struct_json_protocol">
731
 <dt id="socket_protocol.struct_json_protocol">
726
 <em class="property">class </em><code class="descclassname">socket_protocol.</code><code class="descname">struct_json_protocol</code><span class="sig-paren">(</span><em>*args</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="headerlink" href="#socket_protocol.struct_json_protocol" title="Permalink to this definition">¶</a></dt>
732
 <em class="property">class </em><code class="descclassname">socket_protocol.</code><code class="descname">struct_json_protocol</code><span class="sig-paren">(</span><em>*args</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="headerlink" href="#socket_protocol.struct_json_protocol" title="Permalink to this definition">¶</a></dt>
727
-<dd><p>This Class has the same functionality like <a class="reference internal" href="#socket_protocol.pure_json_protocol" title="socket_protocol.pure_json_protocol"><code class="xref py py-class docutils literal notranslate"><span class="pre">pure_json_protocol</span></code></a>. The message length is less than for <a class="reference internal" href="#socket_protocol.pure_json_protocol" title="socket_protocol.pure_json_protocol"><code class="xref py py-class docutils literal notranslate"><span class="pre">pure_json_protocol</span></code></a>, but the functionality and compatibility is reduced.</p>
733
+<dd><p>This Class has the same functionality like <a class="reference internal" href="#socket_protocol.pure_json_protocol" title="socket_protocol.pure_json_protocol"><code class="xref py py-class docutils literal notranslate"><span class="pre">pure_json_protocol</span></code></a>. The message length is less than for <a class="reference internal" href="#socket_protocol.pure_json_protocol" title="socket_protocol.pure_json_protocol"><code class="xref py py-class docutils literal notranslate"><span class="pre">pure_json_protocol</span></code></a>, but the functionality and compatibility is reduced.
734
+See also parent <a class="reference internal" href="#socket_protocol.pure_json_protocol" title="socket_protocol.pure_json_protocol"><code class="xref py py-class docutils literal notranslate"><span class="pre">pure_json_protocol</span></code></a>.</p>
728
 <div class="admonition note">
735
 <div class="admonition note">
729
 <p class="first admonition-title">Note</p>
736
 <p class="first admonition-title">Note</p>
730
 <p class="last">This class is depreceated and here for compatibility reasons (to support old clients or servers). Usage of <a class="reference internal" href="#socket_protocol.pure_json_protocol" title="socket_protocol.pure_json_protocol"><code class="xref py py-class docutils literal notranslate"><span class="pre">pure_json_protocol</span></code></a> is recommended.</p>
737
 <p class="last">This class is depreceated and here for compatibility reasons (to support old clients or servers). Usage of <a class="reference internal" href="#socket_protocol.pure_json_protocol" title="socket_protocol.pure_json_protocol"><code class="xref py py-class docutils literal notranslate"><span class="pre">pure_json_protocol</span></code></a> is recommended.</p>

BIN
_docs_/objects.inv View File


+ 1
- 1
_docs_/searchindex.js
File diff suppressed because it is too large
View File


+ 164133
- 54894
_testresults_/unittest.json
File diff suppressed because it is too large
View File


BIN
_testresults_/unittest.pdf View File


Loading…
Cancel
Save