Jelajahi Sumber

add command line arguments and choice of interfaces via regex or interfaces list

mael 8 tahun lalu
induk
melakukan
1407172ef2
2 mengubah file dengan 49 tambahan dan 7 penghapusan
  1. 47 5
      main.py
  2. 2 2
      templates/main.html

+ 47 - 5
main.py

@@ -1,8 +1,24 @@
-import subprocess, os
+import subprocess, os, re, argparse
 from flask import Flask, render_template, redirect, request, url_for
 
 
 app = Flask(__name__)
+pattern = None
+dev_list = None
+
+def parse_arguments():
+    parser = argparse.ArgumentParser(description='TC web GUI')
+    parser.add_argument('--ip', type=str, required=False,
+                        help='The IP where the server is listening')
+    parser.add_argument('--port', type=str, required=False,
+                        help='The port where the server is listening')
+    parser.add_argument('--dev', type=str, nargs='*', required=False,
+                        help='The interfaces to restrict to')
+    parser.add_argument('--regex',type=str, required=False,
+                        help='A regex to match interfaces')
+    parser.add_argument('--debug',action='store_true',
+                        help='Run Flask in debug mode')
+    return parser.parse_args()
 
 
 @app.route("/")
@@ -61,9 +77,13 @@ def get_active_rules():
     output = proc.communicate()[0].decode()
     lines = output.split('\n')[:-1]
     rules = []
+    dev = set()
     for line in lines:
         arguments = line.split(' ')
-        rules.append(parse_rule(arguments))
+        rule = parse_rule(arguments)
+        if rule['name'] and rule['name'] not in dev:
+            rules.append(rule)
+            dev.add(rule['name'])
     return rules
 
 
@@ -78,9 +98,19 @@ def parse_rule(splitted_rule):
     i = 0
     for argument in splitted_rule:
         if argument == 'dev':
-            rule['name'] = splitted_rule[i+1]
+            # Both regex pattern and dev name can be given
+            # An interface could match the pattern and/or 
+            # be in the interface list
+            if pattern is None and dev_list is None:
+                rule['name'] = splitted_rule[i+1]
+            if pattern:
+                if pattern.match(splitted_rule[i+1]) :
+                    rule['name'] = splitted_rule[i+1]
+            if dev_list:
+                if splitted_rule[i+1] in dev_list:
+                    rule['name'] = splitted_rule[i+1]
         elif argument == 'rate':
-            rule['rate'] = splitted_rule[i + 1].split('M')[0]
+            rule['rate'] = splitted_rule[i + 1].split('Mbit')[0]
         elif argument == 'delay':
             rule['delay'] = splitted_rule[i + 1]
         elif argument == 'loss':
@@ -98,5 +128,17 @@ def parse_rule(splitted_rule):
 if __name__ == "__main__":
     #if os.geteuid() != 0:
     #    exit("You need to have root privileges to run this script.\nPlease try again, this time using 'sudo'. Exiting.")
+    args = parse_arguments()
+    if args.regex:
+        pattern = re.compile(args.regex)
+    if args.dev:
+        dev_list = args.dev
+    app_args={}
+    if args.ip:
+        app_args['host'] = args.ip
+    if args.port:
+        app_args['port'] = args.port
+    if not args.debug:
+        app_args['debug'] = False
     app.debug = True
-    app.run()
+    app.run(**app_args)

+ 2 - 2
templates/main.html

@@ -18,9 +18,9 @@
                         <th>New Value</th>
                     </tr>
                     <tr>
-                        <td>Throughput:</td>
+                        <td>Rate:</td>
                         <td>{{ rule['rate'] }}</td>
-                        <td><input type="text" name="Rate" size="5"> in Mbps</td>
+                        <td><input type="text" name="Rate" size="5"> in Mbit</td>
                     </tr>
                     <tr>
                         <td>Delay:</td>