main.py 3.0 KB

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