<p>Vadim Yanitskiy <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12188">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Pau Espin Pedrol: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit/burst_send.py: migrate from getopt to argparse<br><br>Change-Id: I1be66aa022a79aa1683f0e6cfebaed568b1736b1<br>---<br>M src/target/trx_toolkit/burst_send.py<br>1 file changed, 59 insertions(+), 127 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/burst_send.py b/src/target/trx_toolkit/burst_send.py</span><br><span>index 787e0fc..499e929 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>@@ -27,7 +27,7 @@</span><br><span> </span><br><span> import logging as log</span><br><span> import signal</span><br><span style="color: hsl(0, 100%, 40%);">-import getopt</span><br><span style="color: hsl(120, 100%, 40%);">+import argparse</span><br><span> import sys</span><br><span> </span><br><span> from data_dump import DATADumpFile</span><br><span>@@ -36,27 +36,9 @@</span><br><span> from data_msg import *</span><br><span> </span><br><span> class Application:</span><br><span style="color: hsl(0, 100%, 40%);">-      # Application variables</span><br><span style="color: hsl(0, 100%, 40%);">- remote_addr = "127.0.0.1"</span><br><span style="color: hsl(0, 100%, 40%);">-     bind_addr = "0.0.0.0"</span><br><span style="color: hsl(0, 100%, 40%);">- base_port = 5700</span><br><span style="color: hsl(0, 100%, 40%);">-        conn_mode = "TRX"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Burst source</span><br><span style="color: hsl(0, 100%, 40%);">-  capture_file = None</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Count limitations</span><br><span style="color: hsl(0, 100%, 40%);">-     msg_skip = None</span><br><span style="color: hsl(0, 100%, 40%);">- msg_count = None</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # Pass filtering</span><br><span style="color: hsl(0, 100%, 40%);">-        pf_fn_lt = None</span><br><span style="color: hsl(0, 100%, 40%);">- pf_fn_gt = None</span><br><span style="color: hsl(0, 100%, 40%);">- pf_tn = None</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         def __init__(self):</span><br><span>          print_copyright(CR_HOLDERS)</span><br><span style="color: hsl(0, 100%, 40%);">-             self.parse_argv()</span><br><span style="color: hsl(120, 100%, 40%);">+             self.argv = self.parse_argv()</span><br><span> </span><br><span>            # Set up signal handlers</span><br><span>             signal.signal(signal.SIGINT, self.sig_handler)</span><br><span>@@ -66,152 +48,102 @@</span><br><span>                       format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span> </span><br><span>                # Open requested capture file</span><br><span style="color: hsl(0, 100%, 40%);">-           self.ddf = DATADumpFile(self.capture_file)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.ddf = DATADumpFile(self.argv.capture_file)</span><br><span> </span><br><span>  def run(self):</span><br><span>               # Init DATA interface with TRX or L1</span><br><span style="color: hsl(0, 100%, 40%);">-            if self.conn_mode == "TRX":</span><br><span style="color: hsl(0, 100%, 40%);">-                   self.data_if = DATAInterface(self.remote_addr, self.base_port + 2,</span><br><span style="color: hsl(0, 100%, 40%);">-                              self.bind_addr, self.base_port + 102)</span><br><span style="color: hsl(0, 100%, 40%);">-                   l12trx = True</span><br><span style="color: hsl(0, 100%, 40%);">-           elif self.conn_mode == "L1":</span><br><span style="color: hsl(0, 100%, 40%);">-                  self.data_if = DATAInterface(self.remote_addr, self.base_port + 102,</span><br><span style="color: hsl(0, 100%, 40%);">-                            self.bind_addr, self.base_port + 2)</span><br><span style="color: hsl(0, 100%, 40%);">-                     l12trx = False</span><br><span style="color: hsl(0, 100%, 40%);">-          else:</span><br><span style="color: hsl(0, 100%, 40%);">-                   self.print_help("[!] Unknown connection type")</span><br><span style="color: hsl(0, 100%, 40%);">-                        sys.exit(2)</span><br><span style="color: hsl(120, 100%, 40%);">+           if self.argv.conn_mode == "TRX":</span><br><span style="color: hsl(120, 100%, 40%);">+                    self.data_if = DATAInterface(</span><br><span style="color: hsl(120, 100%, 40%);">+                         self.argv.remote_addr, self.argv.base_port + 2,</span><br><span style="color: hsl(120, 100%, 40%);">+                               self.argv.bind_addr, self.argv.base_port + 102)</span><br><span style="color: hsl(120, 100%, 40%);">+               elif self.argv.conn_mode == "L1":</span><br><span style="color: hsl(120, 100%, 40%);">+                   self.data_if = DATAInterface(</span><br><span style="color: hsl(120, 100%, 40%);">+                         self.argv.remote_addr, self.argv.base_port + 102,</span><br><span style="color: hsl(120, 100%, 40%);">+                             self.argv.bind_addr, self.argv.base_port + 2)</span><br><span> </span><br><span>            # Read messages from the capture</span><br><span>             messages = self.ddf.parse_all(</span><br><span style="color: hsl(0, 100%, 40%);">-                  skip = self.msg_skip, count = self.msg_count)</span><br><span style="color: hsl(120, 100%, 40%);">+                 skip = self.argv.cnt_skip, count = self.argv.cnt_count)</span><br><span>              if messages is False:</span><br><span>                        pass # FIXME!!!</span><br><span> </span><br><span>          for msg in messages:</span><br><span>                         # Pass filter</span><br><span style="color: hsl(0, 100%, 40%);">-                   if not self.msg_pass_filter(l12trx, msg):</span><br><span style="color: hsl(120, 100%, 40%);">+                     if not self.msg_pass_filter(msg):</span><br><span>                            continue</span><br><span> </span><br><span>                         log.info("Sending a burst %s to %s..."</span><br><span style="color: hsl(0, 100%, 40%);">-                                % (msg.desc_hdr(), self.conn_mode))</span><br><span style="color: hsl(120, 100%, 40%);">+                           % (msg.desc_hdr(), self.argv.conn_mode))</span><br><span> </span><br><span>                         # Send message</span><br><span>                       self.data_if.send_msg(msg)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  def msg_pass_filter(self, l12trx, msg):</span><br><span style="color: hsl(120, 100%, 40%);">+       def msg_pass_filter(self, msg):</span><br><span>              # Direction filter</span><br><span style="color: hsl(120, 100%, 40%);">+            l12trx = self.argv.conn_mode == "TRX"</span><br><span>              if isinstance(msg, DATAMSG_L12TRX) and not l12trx:</span><br><span>                   return False</span><br><span>                 elif isinstance(msg, DATAMSG_TRX2L1) and l12trx:</span><br><span>                     return False</span><br><span> </span><br><span>             # Timeslot filter</span><br><span style="color: hsl(0, 100%, 40%);">-               if self.pf_tn is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                      if msg.tn != self.pf_tn:</span><br><span style="color: hsl(120, 100%, 40%);">+              if self.argv.pf_tn is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                       if msg.tn != self.argv.pf_tn:</span><br><span>                                return False</span><br><span> </span><br><span>             # Frame number filter</span><br><span style="color: hsl(0, 100%, 40%);">-           if self.pf_fn_lt is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                   if msg.fn > self.pf_fn_lt:</span><br><span style="color: hsl(120, 100%, 40%);">+         if self.argv.pf_fn_lt is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                    if msg.fn > self.argv.pf_fn_lt:</span><br><span>                           return False</span><br><span style="color: hsl(0, 100%, 40%);">-            if self.pf_fn_gt is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                   if msg.fn < self.pf_fn_gt:</span><br><span style="color: hsl(120, 100%, 40%);">+         if self.argv.pf_fn_gt is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                    if msg.fn < self.argv.pf_fn_gt:</span><br><span>                           return False</span><br><span> </span><br><span>             # Burst passed ;)</span><br><span>            return True</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- def print_help(self, msg = None):</span><br><span style="color: hsl(0, 100%, 40%);">-               s  = " Usage: " + sys.argv[0] + " [options]\n\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                   " Some help...\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                   "  -h --help              this text\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             s += " TRX interface specific\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                     "  -m --conn-mode         Send bursts to: TRX (default) / L1\n"    \</span><br><span style="color: hsl(0, 100%, 40%);">-                  "  -r --remote-addr       Set remote address (default %s)\n"       \</span><br><span style="color: hsl(0, 100%, 40%);">-                  "  -b --bind-addr         Set bind address (default %s)\n"         \</span><br><span style="color: hsl(0, 100%, 40%);">-                  "  -p --base-port         Set base port number (default %d)\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             s += " Burst source\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                       "  -i --capture-file      Read bursts from capture file\n\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               s += " Count limitations (disabled by default)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                    "  --msg-skip      NUM    Skip NUM messages before sending\n"   \</span><br><span style="color: hsl(0, 100%, 40%);">-                     "  --msg-count     NUM    Stop after sending NUM messages\n\n"  \</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            s += " Filtering (disabled by default)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                    "  --timeslot      NUM    TDMA timeslot number [0..7]\n"        \</span><br><span style="color: hsl(0, 100%, 40%);">-                     "  --frame-num-lt  NUM    TDMA frame number lower than NUM\n"   \</span><br><span style="color: hsl(0, 100%, 40%);">-                     "  --frame-num-gt  NUM    TDMA frame number greater than NUM\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              print(s % (self.remote_addr, self.bind_addr, self.base_port))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           if msg is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                     print(msg)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   def parse_argv(self):</span><br><span style="color: hsl(0, 100%, 40%);">-           try:</span><br><span style="color: hsl(0, 100%, 40%);">-                    opts, args = getopt.getopt(sys.argv[1:],</span><br><span style="color: hsl(0, 100%, 40%);">-                                "m:r:b:p:i:h",</span><br><span style="color: hsl(0, 100%, 40%);">-                                [</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "help",</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "conn-mode=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "remote-addr=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "bind-addr=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "base-port=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "capture-file=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      "msg-skip=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "msg-count=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "timeslot=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "frame-num-lt=",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      "frame-num-gt=",</span><br><span style="color: hsl(0, 100%, 40%);">-                              ])</span><br><span style="color: hsl(0, 100%, 40%);">-              except getopt.GetoptError as err:</span><br><span style="color: hsl(0, 100%, 40%);">-                       self.print_help("[!] " + str(err))</span><br><span style="color: hsl(0, 100%, 40%);">-                    sys.exit(2)</span><br><span style="color: hsl(120, 100%, 40%);">+           parser = argparse.ArgumentParser(prog = "burst_send",</span><br><span style="color: hsl(120, 100%, 40%);">+                       description = "Auxiliary tool to send (reply) captured bursts")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           for o, v in opts:</span><br><span style="color: hsl(0, 100%, 40%);">-                       if o in ("-h", "--help"):</span><br><span style="color: hsl(0, 100%, 40%);">-                           self.print_help()</span><br><span style="color: hsl(0, 100%, 40%);">-                               sys.exit(2)</span><br><span style="color: hsl(120, 100%, 40%);">+           trx_group = parser.add_argument_group("TRX interface")</span><br><span style="color: hsl(120, 100%, 40%);">+              trx_group.add_argument("-r", "--remote-addr",</span><br><span style="color: hsl(120, 100%, 40%);">+                     dest = "remote_addr", type = str, default = "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                  help = "Set remote address (default %(default)s)")</span><br><span style="color: hsl(120, 100%, 40%);">+          trx_group.add_argument("-b", "--bind-addr",</span><br><span style="color: hsl(120, 100%, 40%);">+                       dest = "bind_addr", type = str, default = "0.0.0.0",</span><br><span style="color: hsl(120, 100%, 40%);">+                      help = "Set bind address (default %(default)s)")</span><br><span style="color: hsl(120, 100%, 40%);">+            trx_group.add_argument("-p", "--base-port",</span><br><span style="color: hsl(120, 100%, 40%);">+                       dest = "base_port", type = int, default = 6700,</span><br><span style="color: hsl(120, 100%, 40%);">+                     help = "Set base port number (default %(default)s)")</span><br><span style="color: hsl(120, 100%, 40%);">+                trx_group.add_argument("-m", "--conn-mode",</span><br><span style="color: hsl(120, 100%, 40%);">+                       dest = "conn_mode", type = str,</span><br><span style="color: hsl(120, 100%, 40%);">+                     choices = ["TRX", "L1"], default = "TRX",</span><br><span style="color: hsl(120, 100%, 40%);">+                       help = "Where to send bursts (default %(default)s)")</span><br><span style="color: hsl(120, 100%, 40%);">+                trx_group.add_argument("-i", "--capture-file", metavar = "FILE",</span><br><span style="color: hsl(120, 100%, 40%);">+                        dest = "capture_file", type = str, required = True,</span><br><span style="color: hsl(120, 100%, 40%);">+                 help = "Capture file to read bursts from")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                        # Capture file</span><br><span style="color: hsl(0, 100%, 40%);">-                  elif o in ("-i", "--capture-file"):</span><br><span style="color: hsl(0, 100%, 40%);">-                         self.capture_file = v</span><br><span style="color: hsl(120, 100%, 40%);">+         cnt_group = parser.add_argument_group("Count limitations (optional)")</span><br><span style="color: hsl(120, 100%, 40%);">+               cnt_group.add_argument("--skip", metavar = "N",</span><br><span style="color: hsl(120, 100%, 40%);">+                   dest = "cnt_skip", type = int,</span><br><span style="color: hsl(120, 100%, 40%);">+                      help = "Skip N messages before sending")</span><br><span style="color: hsl(120, 100%, 40%);">+            cnt_group.add_argument("--count", metavar = "N",</span><br><span style="color: hsl(120, 100%, 40%);">+                  dest = "cnt_count", type = int,</span><br><span style="color: hsl(120, 100%, 40%);">+                     help = "Stop after sending N messages")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   # TRX interface specific</span><br><span style="color: hsl(0, 100%, 40%);">-                        elif o in ("-m", "--conn-mode"):</span><br><span style="color: hsl(0, 100%, 40%);">-                            self.conn_mode = v</span><br><span style="color: hsl(0, 100%, 40%);">-                      elif o in ("-r", "--remote-addr"):</span><br><span style="color: hsl(0, 100%, 40%);">-                          self.remote_addr = v</span><br><span style="color: hsl(0, 100%, 40%);">-                    elif o in ("-b", "--bind-addr"):</span><br><span style="color: hsl(0, 100%, 40%);">-                            self.bind_addr = v</span><br><span style="color: hsl(0, 100%, 40%);">-                      elif o in ("-p", "--base-port"):</span><br><span style="color: hsl(0, 100%, 40%);">-                            self.base_port = int(v)</span><br><span style="color: hsl(120, 100%, 40%);">+               pf_group = parser.add_argument_group("Filtering (optional)")</span><br><span style="color: hsl(120, 100%, 40%);">+                cnt_group.add_argument("--timeslot", metavar = "TN",</span><br><span style="color: hsl(120, 100%, 40%);">+                      dest = "pf_tn", type = int, choices = range(0, 8),</span><br><span style="color: hsl(120, 100%, 40%);">+                  help = "TDMA timeslot number (equal TN)")</span><br><span style="color: hsl(120, 100%, 40%);">+           cnt_group.add_argument("--frame-num-lt", metavar = "FN",</span><br><span style="color: hsl(120, 100%, 40%);">+                  dest = "pf_fn_lt", type = int,</span><br><span style="color: hsl(120, 100%, 40%);">+                      help = "TDMA frame number (lower than FN)")</span><br><span style="color: hsl(120, 100%, 40%);">+         cnt_group.add_argument("--frame-num-gt", metavar = "FN",</span><br><span style="color: hsl(120, 100%, 40%);">+                  dest = "pf_fn_gt", type = int,</span><br><span style="color: hsl(120, 100%, 40%);">+                      help = "TDMA frame number (greater than FN)")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                     # Count limitations</span><br><span style="color: hsl(0, 100%, 40%);">-                     elif o == "--msg-skip":</span><br><span style="color: hsl(0, 100%, 40%);">-                               self.msg_skip = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                  elif o == "--msg-count":</span><br><span style="color: hsl(0, 100%, 40%);">-                              self.msg_count = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                 # Timeslot pass filter</span><br><span style="color: hsl(0, 100%, 40%);">-                  elif o == "--timeslot":</span><br><span style="color: hsl(0, 100%, 40%);">-                               self.pf_tn = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                             if self.pf_tn < 0 or self.pf_tn > 7:</span><br><span style="color: hsl(0, 100%, 40%);">-                                      self.print_help("[!] Wrong timeslot value")</span><br><span style="color: hsl(0, 100%, 40%);">-                                   sys.exit(2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     # Frame number pass filter</span><br><span style="color: hsl(0, 100%, 40%);">-                      elif o == "--frame-num-lt":</span><br><span style="color: hsl(0, 100%, 40%);">-                           self.pf_fn_lt = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                  elif o == "--frame-num-gt":</span><br><span style="color: hsl(0, 100%, 40%);">-                           self.pf_fn_gt = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if self.capture_file is None:</span><br><span style="color: hsl(0, 100%, 40%);">-                   self.print_help("[!] Please specify a capture file")</span><br><span style="color: hsl(0, 100%, 40%);">-                  sys.exit(2)</span><br><span style="color: hsl(120, 100%, 40%);">+           return parser.parse_args()</span><br><span> </span><br><span>       def sig_handler(self, signum, frame):</span><br><span>                log.info("Signal %d received" % signum)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12188">change 12188</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/12188"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: I1be66aa022a79aa1683f0e6cfebaed568b1736b1 </div>
<div style="display:none"> Gerrit-Change-Number: 12188 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>