Возникла необходимость упростить сбор tcpdump силами непривилегированного и неквалифицированного пользователя.
Чтобы он значит в два клика всё мог сделать не залезая в консоль.
Я подумал и надумал что для этого веб-интерфейс подойдёт.
Так как я ни разу не веб-программист, и только совсем немного умею в питон, то решил взять для этих целей bottle
Задача в общем то решена - есть страничка, поле ввода для IP и две кнопки Start и Stop, после нажатия на Stop пользователю показывается страничка с ссылкой для скачивания дампа.
Хотелось бы чуть-чуть расширить функционал в будущем, чтобы ещё и логи собирать, а так как скрипт очевидно кривой по самое не балуйся, то прошу советов как это делается по феншую и как и что тут можно улучшить.
Например, я так и не понял как сделать чтобы кнопки становились неактивными по очереди (т.е. в начале активна только Start, после нажатия она становится неактивной, а кнопка Stop активируется). При добавлении параметра disabled в одну кнопку почему то обе становились нективными. Возможно тут стоит обойтись одной кнопкой, которая будет меняться со Start на Stop.
Код
#!/usr/bin/env python
from bottle import route, run, template, error, static_file, response, request, redirect
import os
import datetime
@route('/')
def mainform():
output = template('buttons')
return output
@route('/start', method='POST')
def startaction():
ip = request.forms.get('ip')
os.system("tcpdump start " + ip)
return "Started tcpdump"
@route('/stop')
def stopaction():
os.system('tcpdump stop')
redirect('/list')
@route('/list')
def list():
return list_files("/path/to/tcpdumpfiles/")
@route('/download/<filename:path>')
def download(filename):
return static_file(filename, root="/path/to/tcpdumpfiles/", download=filename)
run(host='10.11.12.13', port=1234,reloader=True, debug=True)
Шаблон
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</h1>Collect tcpdump</h1>
<br>
<form id="data">
<p><input placeholder="IP" name="ip"></p>
</form>
<button name="start" type="submit" form="data" formaction="/start" formmethod="post">Start</button>
<button name="stop" type="submit" form="data" formaction="/stop">Stop</button>
</body>
</html>
И ещё вопрос про гиперлинки на внешние сервера, почему-то такой линк ломается при генерации
@route('/test')
def myfunc():
output = '''<html>
<head></head><body><br>
<a href="http://10.11.12.13.15:8888/">Logs on another server</a></body>
</html>'''
return output