75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
|
|
import tornado.ioloop
|
|
import tornado.httpclient
|
|
import tornado.web
|
|
import json
|
|
import joblib
|
|
import sys
|
|
|
|
import pandas as pd
|
|
|
|
arguments = sys.argv
|
|
lib = arguments[1]
|
|
model = joblib.load('./models/' + lib)
|
|
head_names=["received_bytes","send_bytes","port_duration","total_duration","jitter","differents_port"]
|
|
|
|
|
|
|
|
class GenericHandler(tornado.web.RequestHandler):
|
|
|
|
TelegramBot=""
|
|
ChatTelegramId=""
|
|
message = "Alerta por escaneo. Puertos UDP escaneados desde la IP: "
|
|
|
|
def send_telegram(self,ip):
|
|
|
|
url = f"https://api.telegram.org/bot{self.TelegramBot}/sendMessage"
|
|
data = {"chat_id": self.ChatTelegramId, "text": self.message + ip}
|
|
headers = {"Content-Type": "application/json"}
|
|
body = json.dumps(data)
|
|
|
|
http_client = tornado.httpclient.AsyncHTTPClient()
|
|
try:
|
|
response = http_client.fetch(
|
|
url,
|
|
method="POST",
|
|
body=body,
|
|
headers=headers,
|
|
)
|
|
except:
|
|
pass
|
|
finally:
|
|
http_client.close()
|
|
|
|
def post(self):
|
|
|
|
plain_text = self.request.body.decode('utf-8')
|
|
metrics = plain_text.split("||")[0]
|
|
ip_src = plain_text.split("||")[1]
|
|
|
|
check_data = list(map(lambda x: float(x), metrics.split(',')))
|
|
df_predict = pd.DataFrame([check_data])
|
|
df_predict.columns = head_names
|
|
pre = model.predict(df_predict)
|
|
result = pre[0]
|
|
self.set_header("Content-Type", "text/plain")
|
|
self.write(str(result))
|
|
if round(result) == 1:
|
|
self.send_telegram(ip_src)
|
|
self.finish()
|
|
|
|
|
|
def make_app():
|
|
return tornado.web.Application([
|
|
(r"/check", GenericHandler),
|
|
])
|
|
|
|
|
|
def main():
|
|
app = make_app()
|
|
app.listen(8888)
|
|
tornado.ioloop.IOLoop.current().start()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|