|
@@ -1,8 +1,24 @@
|
|
|
-import subprocess, os
|
|
|
|
|
|
|
+import subprocess, os, re, argparse
|
|
|
from flask import Flask, render_template, redirect, request, url_for
|
|
from flask import Flask, render_template, redirect, request, url_for
|
|
|
|
|
|
|
|
|
|
|
|
|
app = Flask(__name__)
|
|
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("/")
|
|
@app.route("/")
|
|
@@ -61,9 +77,13 @@ def get_active_rules():
|
|
|
output = proc.communicate()[0].decode()
|
|
output = proc.communicate()[0].decode()
|
|
|
lines = output.split('\n')[:-1]
|
|
lines = output.split('\n')[:-1]
|
|
|
rules = []
|
|
rules = []
|
|
|
|
|
+ dev = set()
|
|
|
for line in lines:
|
|
for line in lines:
|
|
|
arguments = line.split(' ')
|
|
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
|
|
return rules
|
|
|
|
|
|
|
|
|
|
|
|
@@ -78,9 +98,19 @@ def parse_rule(splitted_rule):
|
|
|
i = 0
|
|
i = 0
|
|
|
for argument in splitted_rule:
|
|
for argument in splitted_rule:
|
|
|
if argument == 'dev':
|
|
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':
|
|
elif argument == 'rate':
|
|
|
- rule['rate'] = splitted_rule[i + 1].split('M')[0]
|
|
|
|
|
|
|
+ rule['rate'] = splitted_rule[i + 1].split('Mbit')[0]
|
|
|
elif argument == 'delay':
|
|
elif argument == 'delay':
|
|
|
rule['delay'] = splitted_rule[i + 1]
|
|
rule['delay'] = splitted_rule[i + 1]
|
|
|
elif argument == 'loss':
|
|
elif argument == 'loss':
|
|
@@ -98,5 +128,17 @@ def parse_rule(splitted_rule):
|
|
|
if __name__ == "__main__":
|
|
if __name__ == "__main__":
|
|
|
#if os.geteuid() != 0:
|
|
#if os.geteuid() != 0:
|
|
|
# exit("You need to have root privileges to run this script.\nPlease try again, this time using 'sudo'. Exiting.")
|
|
# 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.debug = True
|
|
|
- app.run()
|
|
|
|
|
|
|
+ app.run(**app_args)
|