From d08a82e3118d9d482a14969ff8bdc03644fec980 Mon Sep 17 00:00:00 2001 From: oscar0urselli Date: Sun, 12 Jun 2022 19:16:25 +0200 Subject: [PATCH] backend fixes --- backend/app.py | 274 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 272 insertions(+), 2 deletions(-) diff --git a/backend/app.py b/backend/app.py index 1393116..2260225 100644 --- a/backend/app.py +++ b/backend/app.py @@ -32,10 +32,279 @@ class SQLite(): if len(self.cur.fetchall()) == 0: self.cur.execute(f'CREATE TABLE main.{t}({"".join([(c + " " + tables[t][c] + ", ") for c in tables[t]])[:-2]});') + def query(self, query, values = ()): + self.cur.execute(query, values)import sqlite3 +from flask import Flask, jsonify, request +import random +import string +import subprocess + +class SQLite(): + def __init__(self, db_name) -> None: + self.conn = None + self.cur = None + self.db_name = db_name + + def connect(self) -> None: + try: + self.conn = sqlite3.connect(self.db_name + '.db', check_same_thread = False) + except: + with open(self.db_name + '.db', 'x') as f: + pass + + self.conn = sqlite3.connect(self.db_name + '.db', check_same_thread = False) + + self.cur = self.conn.cursor() + + def disconnect(self) -> None: + self.conn.close() + + def check_integrity(self, tables = {}) -> None: + for t in tables: + self.cur.execute(''' + SELECT name FROM sqlite_master WHERE type='table' AND name='{}'; + '''.format(t)) + + if len(self.cur.fetchall()) == 0: + self.cur.execute('''CREATE TABLE main.{}({});'''.format(t, ''.join([(c + ' ' + tables[t][c] + ', ') for c in tables[t]])[:-2])) + def query(self, query, values = ()): self.cur.execute(query, values) return self.cur.fetchall() +# DB init +db = SQLite('firegex') +db.connect() + + +app = Flask(__name__) + +@app.route('/api/general-stats') +def get_general_stats(): + n_services = db.query(''' + SELECT COUNT (*) FROM services; + ''')[0][0] + n_regexes = db.query(''' + SELECT COUNT (*) FROM regexes; + ''')[0][0] + n_packets = db.query(''' + SELECT SUM(blocked_packets) FROM regexes; + ''')[0][0] + + res = { + 'services': n_services, + 'regexes': n_regexes, + 'closed': n_packets if n_packets else 0 + } + + return res + + +@app.route('/api/services') +def get_services(): + res = [] + for i in db.query('SELECT * FROM services;'): + n_regex = db.query('SELECT COUNT (*) FROM regexes WHERE service_id = ?;', (i[1],))[0][0] + n_pacchetti = db.query('SELECT SUM(blocked_packets) FROM regexes WHERE service_id = ?;', (i[1],))[0][0] + + res.append({ + 'id': i[1], + 'status': i[0], + 'public_port': i[3], + 'internal_port': i[2], + 'n_regex': n_regex, + 'n_pacchetti': n_pacchetti if n_pacchetti else 0, + 'name': i[4] + }) + + return jsonify(res) + + +@app.route('/api/service/') +def get_service(serv): + q = db.query('SELECT * FROM services WHERE service_id = ?;', (serv,)) + + res = {} + if len(q) != 0: + n_regex = db.query('SELECT COUNT (*) FROM regexes WHERE service_id = ?;', (serv,))[0][0] + n_pacchetti = db.query('SELECT SUM(blocked_packets) FROM regexes WHERE service_id = ?;', (serv,))[0][0] + + print(q[0]) + res = { + 'id': q[0][1], + 'status': q[0][0], + 'public_port': q[0][3], + 'internal_port': q[0][2], + 'n_packets': n_pacchetti if n_pacchetti else 0, + 'n_regex': n_regex, + 'name': q[0][4] + } + + return res + + +@app.route('/api/service//stop') +def get_service_stop(serv): + db.query(''' + UPDATE services SET status = 'stop' WHERE service_id = ?; + ''', (serv,)) + + res = { + 'status': 'ok' + } + + return res + + +@app.route('/api/service//start') +def get_service_start(serv): + db.query(''' + UPDATE services SET status = 'active' WHERE service_id = ?; + ''', (serv,)) + + res = { + 'status': 'ok' + } + + return res + + +@app.route('/api/service//delete') +def get_service_delete(serv): + db.query(''' + DELETE FROM services WHERE service_id = ?; + ''', (serv,)) + + res = { + 'status': 'ok' + } + + return res + + +@app.route('/api/service//terminate') +def get_service_termite(serv): + db.query(''' + UPDATE services SET status = 'stop' WHERE service_id = ?; + ''', (serv,)) + + res = { + 'status': 'ok' + } + + return res + + +@app.route('/api/service//regen-port') +def get_regen_port(serv): + db.query('UPDATE services SET public_port = ? WHERE service_id = ?;', (random.randint(30000, 45000), serv)) + + res = { + 'status': 'ok' + } + + return res + + +@app.route('/api/service//regexes') +def get_service_regexes(serv): + res = [] + for i in db.query('SELECT * FROM regexes WHERE service_id = ?;', (serv,)): + res.append({ + 'id': i[5], + 'service_id': i[2], + 'regex': i[0], + 'is_blacklist': i[3], + 'mode': i[1] + }) + + return jsonify(res) + + +@app.route('/api/regex/') +def get_regex_id(regex_id): + q = db.query('SELECT * FROM regexes WHERE regex_id = ?;', (regex_id,)) + + res = {} + if len(q) != 0: + res = { + 'id': regex_id, + 'service_id': q[0][2], + 'regex': q[0][0], + 'is_blacklist': q[0][3], + 'mode': q[0][1] + } + + return res + + +@app.route('/api/regex//delete') +def get_regex_delete(regex_id): + db.query('DELETE FROM regexes WHERE regex_id = ?;', (regex_id,)) + + res = { + 'status': 'ok' + } + + return res + + +@app.route('/api/regexes/add', methods = ['POST']) +def post_regexes_add(): + req = request.get_json(force = True) + + db.query(''' + INSERT INTO regexes (regex_id, service_id, regex, is_blacklist, mode) VALUES (?, ?, ?, ?, ?); + ''', (random.randint(1, 1 << 32), req['service_id'], req['regex'], req['is_blacklist'], req['mode'])) + + res = { + 'status': 'ok' + } + + return res + + +@app.route('/api/services/add', methods = ['POST']) +def post_services_add(): + req = request.get_json(force = True) + + serv_id = req['name'].strip().replace(" ","-") + serv_id = "".join([c for c in serv_id if c in (string.ascii_uppercase + string.ascii_lowercase + string.digits + "-")]) + serv_id = serv_id.lower() + + db.query(''' + INSERT INTO services (name, service_id, internal_port, public_port, status) VALUES (?, ?, ?, ?, ?) + ''', (req['name'], serv_id, req['port'], random.randint(30000, 45000), 'stop')) + + res = { + 'status': 'ok' + } + + return res + +if __name__ == '__main__': + db.check_integrity({ + 'regexes': { + 'regex': 'TEXT NOT NULL', + 'mode': 'CHAR(1)', + 'service_id': 'TEXT NOT NULL', + 'is_blacklist': 'CHAR(50) NOT NULL', + 'blocked_packets': 'INTEGER DEFAULT 0', + 'regex_id': 'INTEGER NOT NULL' + }, + 'services': { + 'status': 'CHAR(50)', + 'service_id': 'TEXT NOT NULL', + 'internal_port': 'INT NOT NULL', + 'public_port': 'INT NOT NULL', + 'name': 'TEXT NOT NULL' + } + }) + + #uwsgi + subprocess.run(["uwsgi","--http","127.0.0.1:8080","--master","--module","app:app"]) + return self.cur.fetchall() + db = SQLite('firegex') db.connect() @@ -75,7 +344,7 @@ def get_services(): 'public_port': i[3], 'internal_port': i[2], 'n_regex': n_regex, - 'n_packets': n_pacchetti if n_pacchetti else 0 + 'n_packets': n_pacchetti if n_pacchetti else 0, }) return jsonify(res) @@ -255,7 +524,8 @@ if __name__ == "__main__": 'status': 'CHAR(50)', 'service_id': 'TEXT NOT NULL', 'internal_port': 'INT NOT NULL', - 'public_port': 'INT NOT NULL' + 'public_port': 'INT NOT NULL', + 'name': 'TEXT NOT NULL' } }) #uwsgi