Răsfoiți Sursa

Merge pull request #1 from maelk/master

Adding CLI and rate
Christian Sieber 8 ani în urmă
părinte
comite
a4765fc59c
2 a modificat fișierele cu 57 adăugiri și 4 ștergeri
  1. 52 4
      main.py
  2. 5 0
      templates/main.html

+ 52 - 4
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("/")
@@ -18,6 +34,7 @@ def new_rule(interface):
     duplicate = request.form['Duplicate']
     reorder = request.form['Reorder']
     corrupt = request.form['Corrupt']
+    rate = request.form['Rate']
 
     # remove old setup
     command = 'tc qdisc del dev %s root netem' % interface
@@ -27,6 +44,8 @@ def new_rule(interface):
 
     # apply new setup
     command = 'tc qdisc add dev %s root netem' % interface
+    if rate != '':
+        command += ' rate %smbit' % rate
     if delay != '':
         command += ' delay %sms' % delay
     if loss != '':
@@ -58,14 +77,19 @@ 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
 
 
 def parse_rule(splitted_rule):
     rule = {'name':      None,
+            'rate':      None,
             'delay':     None,
             'loss':      None,
             'duplicate': None,
@@ -74,7 +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('Mbit')[0]
         elif argument == 'delay':
             rule['delay'] = splitted_rule[i + 1]
         elif argument == 'loss':
@@ -92,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)

+ 5 - 0
templates/main.html

@@ -17,6 +17,11 @@
                         <th>Current Value</th>
                         <th>New Value</th>
                     </tr>
+                    <tr>
+                        <td>Rate:</td>
+                        <td>{{ rule['rate'] }}</td>
+                        <td><input type="text" name="Rate" size="5"> in Mbit</td>
+                    </tr>
                     <tr>
                         <td>Delay:</td>
                         <td>{{ rule['delay'] }}</td>