<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12185">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit: use generic logging module instead of print()<br><br>There are multiple advantages of using Python's logging module:<br><br>  - advanced message formatting (file name, line number, etc.),<br>  - multiple logging targets (e.g. stderr, file, socket),<br>  - logging levels (e.g. DEBUG, INFO, ERROR),<br>  - the pythonic way ;)<br><br>so, let's replace multiple print() calls by logging calls,<br>add use the following logging message format by default:<br><br>  [%(levelname)s] %(filename)s:%(lineno)d %(message)s<br><br>Examples:<br><br>  [INFO] ctrl_if_bts.py:57 Starting transceiver...<br>  [DEBUG] clck_gen.py:87 IND CLOCK 26826<br>  [DEBUG] ctrl_if_bts.py:71 Recv POWEROFF cmd<br>  [INFO] ctrl_if_bts.py:73 Stopping transceiver...<br>  [INFO] fake_trx.py:127 Shutting down...<br><br>Please note that there is no way to filter messages by logging<br>level yet. This is to be introduced soon, together with argparse.<br><br>Change-Id: I7fcafabafe8323b58990997a47afdd48b6d1f357<br>---<br>M src/target/trx_toolkit/burst_fwd.py<br>M src/target/trx_toolkit/burst_gen.py<br>M src/target/trx_toolkit/burst_send.py<br>M src/target/trx_toolkit/clck_gen.py<br>M src/target/trx_toolkit/ctrl_cmd.py<br>M src/target/trx_toolkit/ctrl_if.py<br>M src/target/trx_toolkit/ctrl_if_bb.py<br>M src/target/trx_toolkit/ctrl_if_bts.py<br>M src/target/trx_toolkit/data_dump.py<br>M src/target/trx_toolkit/data_msg.py<br>M src/target/trx_toolkit/fake_trx.py<br>M src/target/trx_toolkit/trx_sniff.py<br>12 files changed, 145 insertions(+), 95 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/85/12185/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/burst_fwd.py b/src/target/trx_toolkit/burst_fwd.py</span><br><span>index 31f882e..3cb6acd 100644</span><br><span>--- a/src/target/trx_toolkit/burst_fwd.py</span><br><span>+++ b/src/target/trx_toolkit/burst_fwd.py</span><br><span>@@ -22,6 +22,7 @@</span><br><span> # with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import random</span><br><span> </span><br><span> from data_msg import *</span><br><span>@@ -214,7 +215,7 @@</span><br><span>                 # Burst dropping</span><br><span>             if self.burst_dl_drop_amount > 0:</span><br><span>                         if msg.fn % self.burst_dl_drop_period == 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                             print("[~] Simulation: dropping DL burst (fn=%u %% %u == 0)"</span><br><span style="color: hsl(120, 100%, 40%);">+                                log.info("Simulation: dropping DL burst (fn=%u %% %u == 0)"</span><br><span>                                        % (msg.fn, self.burst_dl_drop_period))</span><br><span>                               self.burst_dl_drop_amount -= 1</span><br><span>                               return None</span><br><span>@@ -226,7 +227,7 @@</span><br><span>            # Burst dropping</span><br><span>             if self.burst_ul_drop_amount > 0:</span><br><span>                         if msg.fn % self.burst_ul_drop_period == 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                             print("[~] Simulation: dropping UL burst (fn=%u %% %u == 0)"</span><br><span style="color: hsl(120, 100%, 40%);">+                                log.info("Simulation: dropping UL burst (fn=%u %% %u == 0)"</span><br><span>                                        % (msg.fn, self.burst_ul_drop_period))</span><br><span>                               self.burst_ul_drop_amount -= 1</span><br><span>                               return None</span><br><span>@@ -254,7 +255,7 @@</span><br><span>                    msg_l12trx = DATAMSG_L12TRX()</span><br><span>                        msg_l12trx.parse_msg(bytearray(msg_raw))</span><br><span>             except:</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[!] Dropping unhandled DL message...")</span><br><span style="color: hsl(120, 100%, 40%);">+                       log.error("Dropping unhandled DL message...")</span><br><span>                      return None</span><br><span> </span><br><span>              # Compose a new message for L1</span><br><span>@@ -320,7 +321,7 @@</span><br><span> </span><br><span>             # Timeslot filter</span><br><span>            if msg.tn not in self.ts_pass_list:</span><br><span style="color: hsl(0, 100%, 40%);">-                     print("[!] TS %u is not configured, dropping UL burst..." % msg.tn)</span><br><span style="color: hsl(120, 100%, 40%);">+                 log.warning("TS %u is not configured, dropping UL burst..." % msg.tn)</span><br><span>                      return None</span><br><span> </span><br><span>              # Path loss simulation</span><br><span>diff --git a/src/target/trx_toolkit/burst_gen.py b/src/target/trx_toolkit/burst_gen.py</span><br><span>index d83f137..9a17ffa 100755</span><br><span>--- a/src/target/trx_toolkit/burst_gen.py</span><br><span>+++ b/src/target/trx_toolkit/burst_gen.py</span><br><span>@@ -26,6 +26,7 @@</span><br><span> from copyright import print_copyright</span><br><span> CR_HOLDERS = [("2017-2018", "Vadim Yanitskiy <axilirator@gmail.com>")]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import signal</span><br><span> import getopt</span><br><span> import sys</span><br><span>@@ -64,6 +65,10 @@</span><br><span>             # Set up signal handlers</span><br><span>             signal.signal(signal.SIGINT, self.sig_handler)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+           log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          # Open requested capture file</span><br><span>                if self.output_file is not None:</span><br><span>                     self.ddf = DATADumpFile(self.output_file)</span><br><span>@@ -130,7 +135,7 @@</span><br><span>                      # Set burst</span><br><span>                  msg.burst = burst</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[i] Sending %d/%d %s burst %s to %s..."</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.info("Sending %d/%d %s burst %s to %s..."</span><br><span>                              % (i + 1, self.burst_count, self.burst_type,</span><br><span>                                         msg.desc_hdr(), self.conn_mode))</span><br><span> </span><br><span>@@ -239,7 +244,7 @@</span><br><span>                   sys.exit(2)</span><br><span> </span><br><span>      def sig_handler(self, signum, frame):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("Signal %d received" % signum)</span><br><span style="color: hsl(120, 100%, 40%);">+                log.info("Signal %d received" % signum)</span><br><span>            if signum is signal.SIGINT:</span><br><span>                  sys.exit(0)</span><br><span> </span><br><span>diff --git a/src/target/trx_toolkit/burst_send.py b/src/target/trx_toolkit/burst_send.py</span><br><span>index f6c85ba..787e0fc 100755</span><br><span>--- a/src/target/trx_toolkit/burst_send.py</span><br><span>+++ b/src/target/trx_toolkit/burst_send.py</span><br><span>@@ -25,6 +25,7 @@</span><br><span> from copyright import print_copyright</span><br><span> CR_HOLDERS = [("2017-2018", "Vadim Yanitskiy <axilirator@gmail.com>")]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import signal</span><br><span> import getopt</span><br><span> import sys</span><br><span>@@ -60,6 +61,10 @@</span><br><span>                # Set up signal handlers</span><br><span>             signal.signal(signal.SIGINT, self.sig_handler)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+           log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          # Open requested capture file</span><br><span>                self.ddf = DATADumpFile(self.capture_file)</span><br><span> </span><br><span>@@ -88,7 +93,7 @@</span><br><span>                   if not self.msg_pass_filter(l12trx, msg):</span><br><span>                            continue</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Sending a burst %s to %s..."</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.info("Sending a burst %s to %s..."</span><br><span>                             % (msg.desc_hdr(), self.conn_mode))</span><br><span> </span><br><span>                      # Send message</span><br><span>@@ -209,7 +214,7 @@</span><br><span>                         sys.exit(2)</span><br><span> </span><br><span>      def sig_handler(self, signum, frame):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("Signal %d received" % signum)</span><br><span style="color: hsl(120, 100%, 40%);">+                log.info("Signal %d received" % signum)</span><br><span>            if signum is signal.SIGINT:</span><br><span>                  sys.exit(0)</span><br><span> </span><br><span>diff --git a/src/target/trx_toolkit/clck_gen.py b/src/target/trx_toolkit/clck_gen.py</span><br><span>index b488770..56207f4 100755</span><br><span>--- a/src/target/trx_toolkit/clck_gen.py</span><br><span>+++ b/src/target/trx_toolkit/clck_gen.py</span><br><span>@@ -25,6 +25,7 @@</span><br><span> from copyright import print_copyright</span><br><span> CR_HOLDERS = [("2017-2018", "Vadim Yanitskiy <axilirator@gmail.com>")]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import signal</span><br><span> import time</span><br><span> import sys</span><br><span>@@ -83,7 +84,7 @@</span><br><span>                           link.send(payload)</span><br><span> </span><br><span>                       # Debug print</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[T] %s" % payload)</span><br><span style="color: hsl(120, 100%, 40%);">+                   log.debug(payload)</span><br><span> </span><br><span>               # Increase frame count</span><br><span>               self.clck_src += self.ind_period</span><br><span>@@ -101,13 +102,17 @@</span><br><span>             # Set up signal handlers</span><br><span>             signal.signal(signal.SIGINT, self.sig_handler)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+           log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  def run(self):</span><br><span>               self.link = UDPLink("127.0.0.1", 5800, "0.0.0.0", 5700)</span><br><span>          self.clck = CLCKGen([self.link], ind_period = 51)</span><br><span>            self.clck.start()</span><br><span> </span><br><span>        def sig_handler(self, signum, frame):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("Signal %d received" % signum)</span><br><span style="color: hsl(120, 100%, 40%);">+                log.info("Signal %d received" % signum)</span><br><span>            if signum is signal.SIGINT:</span><br><span>                  self.clck.stop()</span><br><span> </span><br><span>diff --git a/src/target/trx_toolkit/ctrl_cmd.py b/src/target/trx_toolkit/ctrl_cmd.py</span><br><span>index e56105a..ec683be 100755</span><br><span>--- a/src/target/trx_toolkit/ctrl_cmd.py</span><br><span>+++ b/src/target/trx_toolkit/ctrl_cmd.py</span><br><span>@@ -26,6 +26,7 @@</span><br><span> from copyright import print_copyright</span><br><span> CR_HOLDERS = [("2017-2018", "Vadim Yanitskiy <axilirator@gmail.com>")]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import signal</span><br><span> import getopt</span><br><span> import select</span><br><span>@@ -48,12 +49,16 @@</span><br><span>               # Set up signal handlers</span><br><span>             signal.signal(signal.SIGINT, self.sig_handler)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+           log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          # Init UDP connection</span><br><span>                self.ctrl_link = UDPLink(self.remote_addr, self.base_port + 1,</span><br><span>                       self.bind_addr, self.bind_port)</span><br><span> </span><br><span>          # Debug print</span><br><span style="color: hsl(0, 100%, 40%);">-           print("[i] Init CTRL interface (%s)" \</span><br><span style="color: hsl(120, 100%, 40%);">+              log.info("Init CTRL interface (%s)" \</span><br><span>                      % self.ctrl_link.desc_link())</span><br><span> </span><br><span>    def print_help(self, msg = None):</span><br><span>@@ -138,7 +143,7 @@</span><br><span>              sys.stdout.flush()</span><br><span> </span><br><span>       def sig_handler(self, signum, frame):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("\n\nSignal %d received" % signum)</span><br><span style="color: hsl(120, 100%, 40%);">+            log.info("Signal %d received" % signum)</span><br><span>            if signum is signal.SIGINT:</span><br><span>                  sys.exit(0)</span><br><span> </span><br><span>diff --git a/src/target/trx_toolkit/ctrl_if.py b/src/target/trx_toolkit/ctrl_if.py</span><br><span>index 1e569a6..b533746 100644</span><br><span>--- a/src/target/trx_toolkit/ctrl_if.py</span><br><span>+++ b/src/target/trx_toolkit/ctrl_if.py</span><br><span>@@ -22,12 +22,14 @@</span><br><span> # with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> from udp_link import UDPLink</span><br><span> </span><br><span> class CTRLInterface(UDPLink):</span><br><span>       def handle_rx(self, data, remote):</span><br><span>           if not self.verify_req(data):</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[!] Wrong data on CTRL interface")</span><br><span style="color: hsl(120, 100%, 40%);">+                   log.error("Wrong data on CTRL interface")</span><br><span>                  return</span><br><span> </span><br><span>           # Attempt to parse a command</span><br><span>diff --git a/src/target/trx_toolkit/ctrl_if_bb.py b/src/target/trx_toolkit/ctrl_if_bb.py</span><br><span>index 97a3d9d..aaa12f1 100644</span><br><span>--- a/src/target/trx_toolkit/ctrl_if_bb.py</span><br><span>+++ b/src/target/trx_toolkit/ctrl_if_bb.py</span><br><span>@@ -22,6 +22,8 @@</span><br><span> # with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> from ctrl_if import CTRLInterface</span><br><span> </span><br><span> class CTRLInterfaceBB(CTRLInterface):</span><br><span>@@ -34,37 +36,37 @@</span><br><span> </span><br><span>         def __init__(self, remote_addr, remote_port, bind_addr, bind_port):</span><br><span>          CTRLInterface.__init__(self, remote_addr, remote_port, bind_addr, bind_port)</span><br><span style="color: hsl(0, 100%, 40%);">-            print("[i] Init CTRL interface for BB (%s)" % self.desc_link())</span><br><span style="color: hsl(120, 100%, 40%);">+             log.info("Init CTRL interface for BB (%s)" % self.desc_link())</span><br><span> </span><br><span>         def parse_cmd(self, request):</span><br><span>                # Power control</span><br><span>              if self.verify_cmd(request, "POWERON", 0):</span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Recv POWERON CMD")</span><br><span style="color: hsl(120, 100%, 40%);">+                       log.debug("Recv POWERON CMD")</span><br><span> </span><br><span>                  # Ensure transceiver isn't working</span><br><span>                       if self.trx_started:</span><br><span style="color: hsl(0, 100%, 40%);">-                            print("[!] Transceiver already started")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.error("Transceiver already started")</span><br><span>                           return -1</span><br><span> </span><br><span>                        # Ensure RX / TX freq. are set</span><br><span>                       if (self.rx_freq is None) or (self.tx_freq is None):</span><br><span style="color: hsl(0, 100%, 40%);">-                            print("[!] RX / TX freq. are not set")</span><br><span style="color: hsl(120, 100%, 40%);">+                              log.error("RX / TX freq. are not set")</span><br><span>                             return -1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[i] Starting transceiver...")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.info("Starting transceiver...")</span><br><span>                        self.trx_started = True</span><br><span>                      return 0</span><br><span> </span><br><span>                 elif self.verify_cmd(request, "POWEROFF", 0):</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[i] Recv POWEROFF cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.debug("Recv POWEROFF cmd")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Stopping transceiver...")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.info("Stopping transceiver...")</span><br><span>                        self.trx_started = False</span><br><span>                     return 0</span><br><span> </span><br><span>                 # Tuning Control</span><br><span>             elif self.verify_cmd(request, "RXTUNE", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[i] Recv RXTUNE cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.debug("Recv RXTUNE cmd")</span><br><span> </span><br><span>                   # TODO: check freq range</span><br><span>                     self.rx_freq = int(request[1]) * 1000</span><br><span>@@ -72,7 +74,7 @@</span><br><span>                    return 0</span><br><span> </span><br><span>                 elif self.verify_cmd(request, "TXTUNE", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[i] Recv TXTUNE cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.debug("Recv TXTUNE cmd")</span><br><span> </span><br><span>                   # TODO: check freq range</span><br><span>                     self.tx_freq = int(request[1]) * 1000</span><br><span>@@ -80,7 +82,7 @@</span><br><span> </span><br><span>                # Power measurement</span><br><span>          elif self.verify_cmd(request, "MEASURE", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                  print("[i] Recv MEASURE cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                       log.debug("Recv MEASURE cmd")</span><br><span> </span><br><span>                  if self.pm is None:</span><br><span>                          return -1</span><br><span>@@ -92,7 +94,7 @@</span><br><span>                        return (0, [meas_dbm])</span><br><span> </span><br><span>           elif self.verify_cmd(request, "SETSLOT", 2):</span><br><span style="color: hsl(0, 100%, 40%);">-                  print("[i] Recv SETSLOT cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                       log.debug("Recv SETSLOT cmd")</span><br><span> </span><br><span>                  if self.burst_fwd is None:</span><br><span>                           return -1</span><br><span>@@ -100,7 +102,7 @@</span><br><span>                      # Obtain TS index</span><br><span>                    ts = int(request[1])</span><br><span>                         if ts not in range(0, 8):</span><br><span style="color: hsl(0, 100%, 40%);">-                               print("[!] TS index should be in range: 0..7")</span><br><span style="color: hsl(120, 100%, 40%);">+                              log.error("TS index should be in range: 0..7")</span><br><span>                             return -1</span><br><span> </span><br><span>                        # Parse TS type</span><br><span>@@ -113,7 +115,7 @@</span><br><span>                                if ts in self.burst_fwd.ts_pass_list:</span><br><span>                                        self.burst_fwd.ts_pass_list.remove(ts)</span><br><span>                               else:</span><br><span style="color: hsl(0, 100%, 40%);">-                                   print("[!] TS %u was not activated before" % ts)</span><br><span style="color: hsl(120, 100%, 40%);">+                                    log.warning("TS %u was not activated before" % ts)</span><br><span>                                         # TODO: uncomment as soon as RESET is introduced</span><br><span>                                     # return -1</span><br><span>                  else:</span><br><span>@@ -121,7 +123,7 @@</span><br><span>                          if ts not in self.burst_fwd.ts_pass_list:</span><br><span>                                    self.burst_fwd.ts_pass_list.append(ts)</span><br><span>                               else:</span><br><span style="color: hsl(0, 100%, 40%);">-                                   print("[!] TS %u was already activated before" % ts)</span><br><span style="color: hsl(120, 100%, 40%);">+                                        log.warning("TS %u was already activated before" % ts)</span><br><span>                                     # TODO: uncomment as soon as RESET is introduced</span><br><span>                                     # return -1</span><br><span> </span><br><span>@@ -129,7 +131,7 @@</span><br><span> </span><br><span>            # Timing Advance</span><br><span>             elif self.verify_cmd(request, "SETTA", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Recv SETTA cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                 log.debug("Recv SETTA cmd")</span><br><span> </span><br><span>                    # Save to the BurstForwarder instance</span><br><span>                        self.burst_fwd.ta = ta</span><br><span>@@ -138,7 +140,7 @@</span><br><span>                 # Timing of Arrival simulation for Uplink</span><br><span>            # Absolute form: CMD FAKE_TOA <BASE> <THRESH></span><br><span>            elif self.verify_cmd(request, "FAKE_TOA", 2):</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[i] Recv FAKE_TOA cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.debug("Recv FAKE_TOA cmd")</span><br><span> </span><br><span>                         # Parse and apply both base and threshold</span><br><span>                    self.burst_fwd.toa256_ul_base = int(request[1])</span><br><span>@@ -149,7 +151,7 @@</span><br><span>                # Timing of Arrival simulation for Uplink</span><br><span>            # Relative form: CMD FAKE_TOA <+-BASE_DELTA></span><br><span>           elif self.verify_cmd(request, "FAKE_TOA", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[i] Recv FAKE_TOA cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.debug("Recv FAKE_TOA cmd")</span><br><span> </span><br><span>                         # Parse and apply delta</span><br><span>                      self.burst_fwd.toa256_ul_base += int(request[1])</span><br><span>@@ -159,7 +161,7 @@</span><br><span>               # RSSI simulation for Uplink</span><br><span>                 # Absolute form: CMD FAKE_RSSI <BASE> <THRESH></span><br><span>           elif self.verify_cmd(request, "FAKE_RSSI", 2):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_RSSI cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_RSSI cmd")</span><br><span> </span><br><span>                        # Parse and apply both base and threshold</span><br><span>                    self.burst_fwd.rssi_ul_base = int(request[1])</span><br><span>@@ -170,7 +172,7 @@</span><br><span>          # RSSI simulation for Uplink</span><br><span>                 # Relative form: CMD FAKE_RSSI <+-BASE_DELTA></span><br><span>          elif self.verify_cmd(request, "FAKE_RSSI", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_RSSI cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_RSSI cmd")</span><br><span> </span><br><span>                        # Parse and apply delta</span><br><span>                      self.burst_fwd.rssi_ul_base += int(request[1])</span><br><span>@@ -181,12 +183,12 @@</span><br><span>               # Syntax: CMD FAKE_DROP <AMOUNT></span><br><span>               # Dropping pattern: fn % 1 == 0</span><br><span>              elif self.verify_cmd(request, "FAKE_DROP", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_DROP cmd")</span><br><span> </span><br><span>                        # Parse / validate amount of bursts</span><br><span>                  num = int(request[1])</span><br><span>                        if num < 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                          print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         log.error("FAKE_DROP amount shall not be negative")</span><br><span>                                return -1</span><br><span> </span><br><span>                        self.burst_fwd.burst_ul_drop_amount = num</span><br><span>@@ -198,18 +200,18 @@</span><br><span>            # Syntax: CMD FAKE_DROP <AMOUNT> <FN_PERIOD></span><br><span>             # Dropping pattern: fn % period == 0</span><br><span>                 elif self.verify_cmd(request, "FAKE_DROP", 2):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_DROP cmd")</span><br><span> </span><br><span>                        # Parse / validate amount of bursts</span><br><span>                  num = int(request[1])</span><br><span>                        if num < 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                          print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         log.error("FAKE_DROP amount shall not be negative")</span><br><span>                                return -1</span><br><span> </span><br><span>                        # Parse / validate period</span><br><span>                    period = int(request[2])</span><br><span>                     if period <= 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                              print("[!] FAKE_DROP period shall be greater than zero")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.error("FAKE_DROP period shall be greater than zero")</span><br><span>                           return -1</span><br><span> </span><br><span>                        self.burst_fwd.burst_ul_drop_amount = num</span><br><span>@@ -221,5 +223,5 @@</span><br><span>              else:</span><br><span>                        # We don't care about other commands,</span><br><span>                    # so let's merely ignore them ;)</span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Ignore CMD %s" % request[0])</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Ignore CMD %s" % request[0])</span><br><span>                    return 0</span><br><span>diff --git a/src/target/trx_toolkit/ctrl_if_bts.py b/src/target/trx_toolkit/ctrl_if_bts.py</span><br><span>index 6ac8ffb..2dde3e3 100644</span><br><span>--- a/src/target/trx_toolkit/ctrl_if_bts.py</span><br><span>+++ b/src/target/trx_toolkit/ctrl_if_bts.py</span><br><span>@@ -22,6 +22,8 @@</span><br><span> # with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> from ctrl_if import CTRLInterface</span><br><span> </span><br><span> class CTRLInterfaceBTS(CTRLInterface):</span><br><span>@@ -35,24 +37,24 @@</span><br><span> </span><br><span>        def __init__(self, remote_addr, remote_port, bind_addr, bind_port):</span><br><span>          CTRLInterface.__init__(self, remote_addr, remote_port, bind_addr, bind_port)</span><br><span style="color: hsl(0, 100%, 40%);">-            print("[i] Init CTRL interface for BTS (%s)" % self.desc_link())</span><br><span style="color: hsl(120, 100%, 40%);">+            log.info("Init CTRL interface for BTS (%s)" % self.desc_link())</span><br><span> </span><br><span>        def parse_cmd(self, request):</span><br><span>                # Power control</span><br><span>              if self.verify_cmd(request, "POWERON", 0):</span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Recv POWERON CMD")</span><br><span style="color: hsl(120, 100%, 40%);">+                       log.debug("Recv POWERON CMD")</span><br><span> </span><br><span>                  # Ensure transceiver isn't working</span><br><span>                       if self.trx_started:</span><br><span style="color: hsl(0, 100%, 40%);">-                            print("[!] Transceiver already started")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.error("Transceiver already started")</span><br><span>                           return -1</span><br><span> </span><br><span>                        # Ensure RX / TX freq. are set</span><br><span>                       if (self.rx_freq is None) or (self.tx_freq is None):</span><br><span style="color: hsl(0, 100%, 40%);">-                            print("[!] RX / TX freq. are not set")</span><br><span style="color: hsl(120, 100%, 40%);">+                              log.error("RX / TX freq. are not set")</span><br><span>                             return -1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[i] Starting transceiver...")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.info("Starting transceiver...")</span><br><span>                        self.trx_started = True</span><br><span> </span><br><span>                  # Power emulation</span><br><span>@@ -66,9 +68,9 @@</span><br><span>                        return 0</span><br><span> </span><br><span>                 elif self.verify_cmd(request, "POWEROFF", 0):</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[i] Recv POWEROFF cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.debug("Recv POWEROFF cmd")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Stopping transceiver...")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.info("Stopping transceiver...")</span><br><span>                        self.trx_started = False</span><br><span> </span><br><span>                         # Power emulation</span><br><span>@@ -83,14 +85,14 @@</span><br><span> </span><br><span>          # Tuning Control</span><br><span>             elif self.verify_cmd(request, "RXTUNE", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[i] Recv RXTUNE cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.debug("Recv RXTUNE cmd")</span><br><span> </span><br><span>                   # TODO: check freq range</span><br><span>                     self.rx_freq = int(request[1]) * 1000</span><br><span>                        return 0</span><br><span> </span><br><span>                 elif self.verify_cmd(request, "TXTUNE", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("[i] Recv TXTUNE cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.debug("Recv TXTUNE cmd")</span><br><span> </span><br><span>                   # TODO: check freq range</span><br><span>                     self.tx_freq = int(request[1]) * 1000</span><br><span>@@ -100,7 +102,7 @@</span><br><span>          # Timing of Arrival simulation for Downlink</span><br><span>          # Absolute form: CMD FAKE_TOA <BASE> <THRESH></span><br><span>            elif self.verify_cmd(request, "FAKE_TOA", 2):</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[i] Recv FAKE_TOA cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.debug("Recv FAKE_TOA cmd")</span><br><span> </span><br><span>                         # Parse and apply both base and threshold</span><br><span>                    self.burst_fwd.toa256_dl_base = int(request[1])</span><br><span>@@ -111,7 +113,7 @@</span><br><span>                # Timing of Arrival simulation for Downlink</span><br><span>          # Relative form: CMD FAKE_TOA <+-BASE_DELTA></span><br><span>           elif self.verify_cmd(request, "FAKE_TOA", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[i] Recv FAKE_TOA cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.debug("Recv FAKE_TOA cmd")</span><br><span> </span><br><span>                         # Parse and apply delta</span><br><span>                      self.burst_fwd.toa256_dl_base += int(request[1])</span><br><span>@@ -121,7 +123,7 @@</span><br><span>               # RSSI simulation for Downlink</span><br><span>               # Absolute form: CMD FAKE_RSSI <BASE> <THRESH></span><br><span>           elif self.verify_cmd(request, "FAKE_RSSI", 2):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_RSSI cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_RSSI cmd")</span><br><span> </span><br><span>                        # Parse and apply both base and threshold</span><br><span>                    self.burst_fwd.rssi_dl_base = int(request[1])</span><br><span>@@ -132,7 +134,7 @@</span><br><span>          # RSSI simulation for Downlink</span><br><span>               # Relative form: CMD FAKE_RSSI <+-BASE_DELTA></span><br><span>          elif self.verify_cmd(request, "FAKE_RSSI", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_RSSI cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_RSSI cmd")</span><br><span> </span><br><span>                        # Parse and apply delta</span><br><span>                      self.burst_fwd.rssi_dl_base += int(request[1])</span><br><span>@@ -143,12 +145,12 @@</span><br><span>               # Syntax: CMD FAKE_DROP <AMOUNT></span><br><span>               # Dropping pattern: fn % 1 == 0</span><br><span>              elif self.verify_cmd(request, "FAKE_DROP", 1):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_DROP cmd")</span><br><span> </span><br><span>                        # Parse / validate amount of bursts</span><br><span>                  num = int(request[1])</span><br><span>                        if num < 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                          print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         log.error("FAKE_DROP amount shall not be negative")</span><br><span>                                return -1</span><br><span> </span><br><span>                        self.burst_fwd.burst_dl_drop_amount = num</span><br><span>@@ -160,18 +162,18 @@</span><br><span>            # Syntax: CMD FAKE_DROP <AMOUNT> <FN_PERIOD></span><br><span>             # Dropping pattern: fn % period == 0</span><br><span>                 elif self.verify_cmd(request, "FAKE_DROP", 2):</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Recv FAKE_DROP cmd")</span><br><span> </span><br><span>                        # Parse / validate amount of bursts</span><br><span>                  num = int(request[1])</span><br><span>                        if num < 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                          print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         log.error("FAKE_DROP amount shall not be negative")</span><br><span>                                return -1</span><br><span> </span><br><span>                        # Parse / validate period</span><br><span>                    period = int(request[2])</span><br><span>                     if period <= 0:</span><br><span style="color: hsl(0, 100%, 40%);">-                              print("[!] FAKE_DROP period shall be greater than zero")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.error("FAKE_DROP period shall be greater than zero")</span><br><span>                           return -1</span><br><span> </span><br><span>                        self.burst_fwd.burst_dl_drop_amount = num</span><br><span>@@ -183,5 +185,5 @@</span><br><span>              else:</span><br><span>                        # We don't care about other commands,</span><br><span>                    # so let's merely ignore them ;)</span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Ignore CMD %s" % request[0])</span><br><span style="color: hsl(120, 100%, 40%);">+                     log.debug("Ignore CMD %s" % request[0])</span><br><span>                    return 0</span><br><span>diff --git a/src/target/trx_toolkit/data_dump.py b/src/target/trx_toolkit/data_dump.py</span><br><span>index 1d7805e..71e1261 100644</span><br><span>--- a/src/target/trx_toolkit/data_dump.py</span><br><span>+++ b/src/target/trx_toolkit/data_dump.py</span><br><span>@@ -22,6 +22,7 @@</span><br><span> # with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import struct</span><br><span> </span><br><span> from data_msg import *</span><br><span>@@ -77,13 +78,15 @@</span><br><span>  def __init__(self, capture):</span><br><span>                 # Check if capture file is already opened</span><br><span>            if isinstance(capture, str):</span><br><span style="color: hsl(0, 100%, 40%);">-                    print("[i] Opening capture file '%s'..." % capture)</span><br><span style="color: hsl(120, 100%, 40%);">+                 log.info("Opening capture file '%s'..." % capture)</span><br><span>                         self.f = open(capture, "a+b")</span><br><span>              else:</span><br><span>                        self.f = capture</span><br><span> </span><br><span>         def __del__(self):</span><br><span style="color: hsl(0, 100%, 40%);">-              print("[i] Closing the capture file")</span><br><span style="color: hsl(120, 100%, 40%);">+               # FIXME: this causes an Exception in Python 2 (but not in Python 3)</span><br><span style="color: hsl(120, 100%, 40%);">+           # AttributeError: 'NoneType' object has no attribute 'info'</span><br><span style="color: hsl(120, 100%, 40%);">+           log.info("Closing the capture file")</span><br><span>               self.f.close()</span><br><span> </span><br><span>   # Moves the file descriptor before a specified message</span><br><span>@@ -104,7 +107,7 @@</span><br><span>                         # Attempt to parse it</span><br><span>                        rc = self.parse_hdr(hdr_raw)</span><br><span>                         if rc is False:</span><br><span style="color: hsl(0, 100%, 40%);">-                         print("[!] Couldn't parse a message header")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.error("Couldn't parse a message header")</span><br><span>                           return False</span><br><span> </span><br><span>                     # Expand the header</span><br><span>@@ -129,7 +132,7 @@</span><br><span>            # Attempt to parse it</span><br><span>                rc = self.parse_hdr(hdr_raw)</span><br><span>                 if rc is False:</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[!] Couldn't parse a message header")</span><br><span style="color: hsl(120, 100%, 40%);">+                    log.error("Couldn't parse a message header")</span><br><span>                   return None</span><br><span> </span><br><span>              # Expand the header</span><br><span>@@ -138,7 +141,7 @@</span><br><span>            # Attempt to read a message</span><br><span>          msg_raw = self.f.read(msg_len)</span><br><span>               if len(msg_raw) != msg_len:</span><br><span style="color: hsl(0, 100%, 40%);">-                     print("[!] Message length mismatch")</span><br><span style="color: hsl(120, 100%, 40%);">+                        log.error("Message length mismatch")</span><br><span>                       return None</span><br><span> </span><br><span>              # Attempt to parse a message</span><br><span>@@ -146,7 +149,7 @@</span><br><span>                   msg_raw = bytearray(msg_raw)</span><br><span>                         msg.parse_msg(msg_raw)</span><br><span>               except:</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[!] Couldn't parse a message, skipping...")</span><br><span style="color: hsl(120, 100%, 40%);">+                      log.error("Couldn't parse a message, skipping...")</span><br><span>                     return False</span><br><span> </span><br><span>             # Success</span><br><span>@@ -161,7 +164,7 @@</span><br><span>              # Move descriptor to the begining of requested message</span><br><span>               rc = self._seek2msg(idx)</span><br><span>             if not rc:</span><br><span style="color: hsl(0, 100%, 40%);">-                      print("[!] Couldn't find requested message")</span><br><span style="color: hsl(120, 100%, 40%);">+                    log.error("Couldn't find requested message")</span><br><span>                   return False</span><br><span> </span><br><span>             # Attempt to parse a message</span><br><span>@@ -181,7 +184,7 @@</span><br><span>           else:</span><br><span>                        rc = self._seek2msg(skip)</span><br><span>                    if not rc:</span><br><span style="color: hsl(0, 100%, 40%);">-                              print("[!] Couldn't find requested message")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.error("Couldn't find requested message")</span><br><span>                           return False</span><br><span> </span><br><span>             # Read the capture in loop...</span><br><span>@@ -224,6 +227,10 @@</span><br><span>         from gsm_shared import *</span><br><span>     import random</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+   log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+            format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  # Create a temporary file</span><br><span>    tf = TemporaryFile()</span><br><span> </span><br><span>@@ -242,7 +249,7 @@</span><br><span>               burst_trx2l1.append(sbit)</span><br><span> </span><br><span>        # Generate a basic list of random messages</span><br><span style="color: hsl(0, 100%, 40%);">-      print("[i] Generating the reference messages")</span><br><span style="color: hsl(120, 100%, 40%);">+      log.info("Generating the reference messages")</span><br><span>      messages_ref = []</span><br><span> </span><br><span>        for i in range(100):</span><br><span>@@ -260,9 +267,9 @@</span><br><span>           # Append</span><br><span>             messages_ref.append(msg)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    print("[i] Adding the following messages to the capture:")</span><br><span style="color: hsl(120, 100%, 40%);">+  log.info("Adding the following messages to the capture:")</span><br><span>  for msg in messages_ref[:3]:</span><br><span style="color: hsl(0, 100%, 40%);">-            print("    %s: burst_len=%d"</span><br><span style="color: hsl(120, 100%, 40%);">+                log.info("%s: burst_len=%d"</span><br><span>                        % (msg.desc_hdr(), len(msg.burst)))</span><br><span> </span><br><span>      # Check single message appending</span><br><span>@@ -273,9 +280,9 @@</span><br><span>       # Read the written messages back</span><br><span>     messages_check = ddf.parse_all()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    print("[i] Read the following messages back:")</span><br><span style="color: hsl(120, 100%, 40%);">+      log.info("Read the following messages back:")</span><br><span>      for msg in messages_check:</span><br><span style="color: hsl(0, 100%, 40%);">-              print("    %s: burst_len=%d"</span><br><span style="color: hsl(120, 100%, 40%);">+                log.info("%s: burst_len=%d"</span><br><span>                        % (msg.desc_hdr(), len(msg.burst)))</span><br><span> </span><br><span>      # Expecting three messages</span><br><span>@@ -291,7 +298,7 @@</span><br><span>             # Validate a message</span><br><span>                 assert(messages_check[i].validate())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        print("[?] Check append_msg(): OK")</span><br><span style="color: hsl(120, 100%, 40%);">+ log.info("Check append_msg(): OK")</span><br><span> </span><br><span> </span><br><span>         # Append the pending reference messages</span><br><span>@@ -313,7 +320,7 @@</span><br><span>                # Validate a message</span><br><span>                 assert(messages_check[i].validate())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        print("[?] Check append_all(): OK")</span><br><span style="color: hsl(120, 100%, 40%);">+ log.info("Check append_all(): OK")</span><br><span> </span><br><span> </span><br><span>         # Check parse_msg()</span><br><span>@@ -336,7 +343,7 @@</span><br><span>    assert(msg0.validate())</span><br><span>      assert(msg10.validate())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    print("[?] Check parse_msg(): OK")</span><br><span style="color: hsl(120, 100%, 40%);">+  log.info("Check parse_msg(): OK")</span><br><span> </span><br><span> </span><br><span>  # Check parse_all() with range</span><br><span>@@ -357,4 +364,4 @@</span><br><span>                 # Validate a message</span><br><span>                 assert(messages_check[i].validate())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        print("[?] Check parse_all(): OK")</span><br><span style="color: hsl(120, 100%, 40%);">+  log.info("Check parse_all(): OK")</span><br><span>diff --git a/src/target/trx_toolkit/data_msg.py b/src/target/trx_toolkit/data_msg.py</span><br><span>index ea415ab..95ec9dc 100644</span><br><span>--- a/src/target/trx_toolkit/data_msg.py</span><br><span>+++ b/src/target/trx_toolkit/data_msg.py</span><br><span>@@ -431,6 +431,12 @@</span><br><span> </span><br><span> # Regression test</span><br><span> if __name__ == '__main__':</span><br><span style="color: hsl(120, 100%, 40%);">+        import logging as log</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+   log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+            format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  # Common reference data</span><br><span>      fn = 1024</span><br><span>    tn = 0</span><br><span>@@ -446,7 +452,7 @@</span><br><span>                 sbit = random.randint(-127, 127)</span><br><span>             burst_trx2l1_ref.append(sbit)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       print("[i] Generating the reference messages")</span><br><span style="color: hsl(120, 100%, 40%);">+      log.info("Generating the reference messages")</span><br><span> </span><br><span>  # Create messages of both types</span><br><span>      msg_l12trx_ref = DATAMSG_L12TRX(fn = fn, tn = tn)</span><br><span>@@ -461,13 +467,13 @@</span><br><span>    msg_l12trx_ref.burst = burst_l12trx_ref</span><br><span>      msg_trx2l1_ref.burst = burst_trx2l1_ref</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     print("[i] Encoding the reference messages")</span><br><span style="color: hsl(120, 100%, 40%);">+        log.info("Encoding the reference messages")</span><br><span> </span><br><span>    # Encode DATA messages</span><br><span>       l12trx_raw = msg_l12trx_ref.gen_msg()</span><br><span>        trx2l1_raw = msg_trx2l1_ref.gen_msg()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       print("[i] Parsing generated messages back")</span><br><span style="color: hsl(120, 100%, 40%);">+        log.info("Parsing generated messages back")</span><br><span> </span><br><span>    # Parse generated DATA messages</span><br><span>      msg_l12trx_dec = DATAMSG_L12TRX()</span><br><span>@@ -475,13 +481,13 @@</span><br><span>    msg_l12trx_dec.parse_msg(l12trx_raw)</span><br><span>         msg_trx2l1_dec.parse_msg(trx2l1_raw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        print("[i] Comparing decoded messages with the reference")</span><br><span style="color: hsl(120, 100%, 40%);">+  log.info("Comparing decoded messages with the reference")</span><br><span> </span><br><span>      # Compare bursts</span><br><span>     assert(msg_l12trx_dec.burst == burst_l12trx_ref)</span><br><span>     assert(msg_trx2l1_dec.burst == burst_trx2l1_ref)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    print("[?] Compare bursts: OK")</span><br><span style="color: hsl(120, 100%, 40%);">+     log.info("Compare bursts: OK")</span><br><span> </span><br><span>         # Compare both parsed messages with the reference data</span><br><span>       assert(msg_l12trx_dec.fn == fn)</span><br><span>@@ -489,14 +495,14 @@</span><br><span>      assert(msg_l12trx_dec.tn == tn)</span><br><span>      assert(msg_trx2l1_dec.tn == tn)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     print("[?] Compare FN / TN: OK")</span><br><span style="color: hsl(120, 100%, 40%);">+    log.info("Compare FN / TN: OK")</span><br><span> </span><br><span>        # Compare message specific parts</span><br><span>     assert(msg_trx2l1_dec.rssi == msg_trx2l1_ref.rssi)</span><br><span>   assert(msg_l12trx_dec.pwr == msg_l12trx_ref.pwr)</span><br><span>     assert(msg_trx2l1_dec.toa256 == msg_trx2l1_ref.toa256)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      print("[?] Compare message specific data: OK")</span><br><span style="color: hsl(120, 100%, 40%);">+      log.info("Compare message specific data: OK")</span><br><span> </span><br><span>  # Validate header randomization</span><br><span>      for i in range(0, 100):</span><br><span>@@ -506,7 +512,7 @@</span><br><span>                assert(msg_l12trx_ref.validate())</span><br><span>            assert(msg_trx2l1_ref.validate())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   print("[?] Validate header randomization: OK")</span><br><span style="color: hsl(120, 100%, 40%);">+      log.info("Validate header randomization: OK")</span><br><span> </span><br><span>  # Bit conversation test</span><br><span>      usbits_ref = list(range(0, 256))</span><br><span>@@ -518,7 +524,7 @@</span><br><span>       assert(usbits[:255] == usbits_ref[:255])</span><br><span>     assert(usbits[255] == 254)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  print("[?] Check both usbit2sbit() and sbit2usbit(): OK")</span><br><span style="color: hsl(120, 100%, 40%);">+   log.info("Check both usbit2sbit() and sbit2usbit(): OK")</span><br><span> </span><br><span>       # Test both sbit2ubit() and ubit2sbit()</span><br><span>      ubits = msg_trx2l1_ref.sbit2ubit(sbits_ref)</span><br><span>@@ -527,7 +533,7 @@</span><br><span>    sbits = msg_trx2l1_ref.ubit2sbit(ubits)</span><br><span>      assert(sbits == ([-127] * 127 + [127] * 128))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       print("[?] Check both sbit2ubit() and ubit2sbit(): OK")</span><br><span style="color: hsl(120, 100%, 40%);">+     log.info("Check both sbit2ubit() and ubit2sbit(): OK")</span><br><span> </span><br><span>         # Test message transformation</span><br><span>        msg_l12trx_dec = msg_trx2l1_ref.gen_l12trx()</span><br><span>@@ -542,4 +548,4 @@</span><br><span>   assert(msg_l12trx_dec.burst == msg_l12trx_dec.sbit2ubit(burst_trx2l1_ref))</span><br><span>   assert(msg_trx2l1_dec.burst == msg_trx2l1_dec.ubit2sbit(burst_l12trx_ref))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  print("[?] Check L12TRX <-> TRX2L1 type transformations: OK")</span><br><span style="color: hsl(120, 100%, 40%);">+ log.info("Check L12TRX <-> TRX2L1 type transformations: OK")</span><br><span>diff --git a/src/target/trx_toolkit/fake_trx.py b/src/target/trx_toolkit/fake_trx.py</span><br><span>index d99186b..ced1238 100755</span><br><span>--- a/src/target/trx_toolkit/fake_trx.py</span><br><span>+++ b/src/target/trx_toolkit/fake_trx.py</span><br><span>@@ -25,6 +25,7 @@</span><br><span> from copyright import print_copyright</span><br><span> CR_HOLDERS = [("2017-2018", "Vadim Yanitskiy <axilirator@gmail.com>")]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import signal</span><br><span> import getopt</span><br><span> import select</span><br><span>@@ -53,6 +54,10 @@</span><br><span>                # Set up signal handlers</span><br><span>             signal.signal(signal.SIGINT, self.sig_handler)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+           log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  def run(self):</span><br><span>               # Init TRX CTRL interface for BTS</span><br><span>            self.bts_ctrl = CTRLInterfaceBTS(self.bts_addr, self.bts_base_port + 101,</span><br><span>@@ -90,7 +95,7 @@</span><br><span>                self.clck_gen = CLCKGen([self.bts_clck])</span><br><span>             self.bts_ctrl.clck_gen = self.clck_gen</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              print("[i] Init complete")</span><br><span style="color: hsl(120, 100%, 40%);">+          log.info("Init complete")</span><br><span> </span><br><span>              # Enter main loop</span><br><span>            while True:</span><br><span>@@ -119,7 +124,7 @@</span><br><span>                            self.bb_ctrl.handle_rx(data.decode(), addr)</span><br><span> </span><br><span>      def shutdown(self):</span><br><span style="color: hsl(0, 100%, 40%);">-             print("[i] Shutting down...")</span><br><span style="color: hsl(120, 100%, 40%);">+               log.info("Shutting down...")</span><br><span> </span><br><span>           # Stop clock generator</span><br><span>               self.clck_gen.stop()</span><br><span>@@ -198,7 +203,7 @@</span><br><span>                           sys.exit(2)</span><br><span> </span><br><span>      def sig_handler(self, signum, frame):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("Signal %d received" % signum)</span><br><span style="color: hsl(120, 100%, 40%);">+                log.info("Signal %d received" % signum)</span><br><span>            if signum is signal.SIGINT:</span><br><span>                  self.shutdown()</span><br><span>                      sys.exit(0)</span><br><span>diff --git a/src/target/trx_toolkit/trx_sniff.py b/src/target/trx_toolkit/trx_sniff.py</span><br><span>index 535bb3f..9850983 100755</span><br><span>--- a/src/target/trx_toolkit/trx_sniff.py</span><br><span>+++ b/src/target/trx_toolkit/trx_sniff.py</span><br><span>@@ -25,6 +25,7 @@</span><br><span> from copyright import print_copyright</span><br><span> CR_HOLDERS = [("2018", "Vadim Yanitskiy <axilirator@gmail.com>")]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import logging as log</span><br><span> import signal</span><br><span> import getopt</span><br><span> import sys</span><br><span>@@ -67,6 +68,10 @@</span><br><span>             print_copyright(CR_HOLDERS)</span><br><span>          self.parse_argv()</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         # Configure logging</span><br><span style="color: hsl(120, 100%, 40%);">+           log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          # Open requested capture file</span><br><span>                if self.output_file is not None:</span><br><span>                     self.ddf = DATADumpFile(self.output_file)</span><br><span>@@ -76,7 +81,7 @@</span><br><span>                pkt_filter = "udp and (port %d or port %d)" \</span><br><span>                      % (self.sniff_base_port + 2, self.sniff_base_port + 102)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            print("[i] Listening on interface '%s'..." % self.sniff_interface)</span><br><span style="color: hsl(120, 100%, 40%);">+          log.info("Listening on interface '%s'..." % self.sniff_interface)</span><br><span> </span><br><span>              # Start sniffing...</span><br><span>          scapy.all.sniff(iface = self.sniff_interface, store = 0,</span><br><span>@@ -110,7 +115,7 @@</span><br><span>               try:</span><br><span>                         msg.parse_msg(msg_raw)</span><br><span>               except:</span><br><span style="color: hsl(0, 100%, 40%);">-                 print("[!] Failed to parse message, dropping...")</span><br><span style="color: hsl(120, 100%, 40%);">+                   log.warning("Failed to parse message, dropping...")</span><br><span>                        self.cnt_burst_dropped_num += 1</span><br><span>                      return</span><br><span> </span><br><span>@@ -121,7 +126,7 @@</span><br><span>                     return</span><br><span> </span><br><span>           # Debug print</span><br><span style="color: hsl(0, 100%, 40%);">-           print("[i] %s burst: %s" \</span><br><span style="color: hsl(120, 100%, 40%);">+          log.debug("%s burst: %s" \</span><br><span>                         % ("L1 -> TRX" if l12trx else "TRX -> L1", msg.desc_hdr()))</span><br><span> </span><br><span>            # Poke message handler</span><br><span>@@ -177,22 +182,22 @@</span><br><span>               # Stop sniffing after N bursts</span><br><span>               if self.cnt_burst_break is not None:</span><br><span>                         if self.cnt_burst_num == self.cnt_burst_break:</span><br><span style="color: hsl(0, 100%, 40%);">-                          print("[i] Collected required amount of bursts")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.info("Collected required amount of bursts")</span><br><span>                            return True</span><br><span> </span><br><span>              # Stop sniffing after N frames</span><br><span>               if self.cnt_frame_break is not None:</span><br><span>                         if self.cnt_frame_num == self.cnt_frame_break:</span><br><span style="color: hsl(0, 100%, 40%);">-                          print("[i] Collected required amount of frames")</span><br><span style="color: hsl(120, 100%, 40%);">+                            log.info("Collected required amount of frames")</span><br><span>                            return True</span><br><span> </span><br><span>              return False</span><br><span> </span><br><span>     def shutdown(self):</span><br><span style="color: hsl(0, 100%, 40%);">-             print("[i] Shutting down...")</span><br><span style="color: hsl(120, 100%, 40%);">+               log.info("Shutting down...")</span><br><span> </span><br><span>           # Print statistics</span><br><span style="color: hsl(0, 100%, 40%);">-              print("[i] %u bursts handled, %u dropped" \</span><br><span style="color: hsl(120, 100%, 40%);">+         log.info("%u bursts handled, %u dropped" \</span><br><span>                         % (self.cnt_burst_num, self.cnt_burst_dropped_num))</span><br><span> </span><br><span>              # Exit</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12185">change 12185</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12185"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I7fcafabafe8323b58990997a47afdd48b6d1f357 </div>
<div style="display:none"> Gerrit-Change-Number: 12185 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>