1
0

main.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import subprocess, os
  2. from flask import Flask, render_template, redirect, request, url_for
  3. app = Flask(__name__)
  4. @app.route("/")
  5. def main():
  6. rules = get_active_rules()
  7. return render_template('main.html', rules=rules)
  8. @app.route('/new_rule/<interface>', methods=['POST'])
  9. def new_rule(interface):
  10. delay = request.form['Delay']
  11. loss = request.form['Loss']
  12. duplicate = request.form['Duplicate']
  13. reorder = request.form['Reorder']
  14. corrupt = request.form['Corrupt']
  15. # remove old setup
  16. command = 'tc qdisc del dev %s root netem' % interface
  17. command = command.split(' ')
  18. proc = subprocess.Popen(command)
  19. proc.wait()
  20. # apply new setup
  21. command = 'tc qdisc add dev %s root netem' % interface
  22. if delay != '':
  23. command += ' delay %sms' % delay
  24. if loss != '':
  25. command += ' loss %s%%' % loss
  26. if duplicate != '':
  27. command += ' duplicate %s%%' % duplicate
  28. if reorder != '':
  29. command += ' reorder %s%%' % reorder
  30. if corrupt != '':
  31. command += ' corrupt %s%%' % corrupt
  32. print(command)
  33. command = command.split(' ')
  34. proc = subprocess.Popen(command)
  35. proc.wait()
  36. return redirect(url_for('main'))
  37. @app.route('/remove_rule/<interface>', methods=['POST'])
  38. def remove_rule(interface):
  39. # remove old setup
  40. command = 'tc qdisc del dev %s root netem' % interface
  41. command = command.split(' ')
  42. proc = subprocess.Popen(command)
  43. proc.wait()
  44. return redirect(url_for('main'))
  45. def get_active_rules():
  46. proc = subprocess.Popen(['tc', 'qdisc'], stdout=subprocess.PIPE)
  47. output = proc.communicate()[0].decode()
  48. lines = output.split('\n')[:-1]
  49. rules = []
  50. for line in lines:
  51. arguments = line.split(' ')
  52. rules.append(parse_rule(arguments))
  53. return rules
  54. def parse_rule(splitted_rule):
  55. rule = {'name': None,
  56. 'delay': None,
  57. 'loss': None,
  58. 'duplicate': None,
  59. 'reorder': None,
  60. 'corrupt': None}
  61. i = 0
  62. for argument in splitted_rule:
  63. if argument == 'dev':
  64. rule['name'] = splitted_rule[i+1]
  65. elif argument == 'delay':
  66. rule['delay'] = splitted_rule[i + 1]
  67. elif argument == 'loss':
  68. rule['loss'] = splitted_rule[i + 1]
  69. elif argument == 'duplicate':
  70. rule['duplicate'] = splitted_rule[i + 1]
  71. elif argument == 'reorder':
  72. rule['reorder'] = splitted_rule[i + 1]
  73. elif argument == 'corrupt':
  74. rule['corrupt'] = splitted_rule[i + 1]
  75. i += 1
  76. return rule
  77. if __name__ == "__main__":
  78. #if os.geteuid() != 0:
  79. # exit("You need to have root privileges to run this script.\nPlease try again, this time using 'sudo'. Exiting.")
  80. app.debug = True
  81. app.run()