From bbc56ca960354b11bc7cb49879fd7779d7c82d8d Mon Sep 17 00:00:00 2001 From: alegarsan11 Date: Mon, 27 May 2024 23:39:28 +0200 Subject: [PATCH] fix: build --- build.sh | 85 ++++++------------ nftables-frontend/app.py | 63 +++++++------ nftables-frontend/instance/nftables.db | Bin 0 -> 49152 bytes nftables-frontend/nftables-config.conf | 24 +++++ nftables-frontend/run.wsgi | 13 +++ .../static/img/nftables_info.png | Bin 0 -> 16745 bytes .../templates/chains/chains.html | 2 +- nftables-frontend/views.py | 8 +- 8 files changed, 102 insertions(+), 93 deletions(-) mode change 100644 => 100755 build.sh create mode 100644 nftables-frontend/instance/nftables.db create mode 100644 nftables-frontend/nftables-config.conf create mode 100644 nftables-frontend/run.wsgi create mode 100644 nftables-frontend/static/img/nftables_info.png diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 index 54e3f16..625147a --- a/build.sh +++ b/build.sh @@ -1,66 +1,37 @@ -#! /bin/bash +#!/bin/bash -sudo git clone https://github.com/alegarsan11/nftables-gui.git /var/www/flask +# Configuración de Matplotlib +export MPLCONFIGDIR=/tmp/matplotlib +sudo mkdir -p $MPLCONFIGDIR +sudo chown www-data:www-data $MPLCONFIGDIR +sudo chmod 777 $MPLCONFIGDIR -# Variables -PROJECT_DIR=/var/www/flask/nftables-frontend -PROJECT_NAME=nftables-gui -WSGI_FILE=wsgi.py -VENV_DIR=$PROJECT_DIR/venv -PYTHON_VERSION=python3.8 +# Instalación de dependencias +sudo apt-get install -y libfreetype6-dev libxft-dev -# Actualizar los repositorios de paquetes -sudo apt update +# Copiar la aplicación +sudo cp -r nftables-frontend /usr/share -# Instalar Apache y el módulo mod_wsgi para Python 3 si no están instalados -sudo apt install -y apache2 libapache2-mod-wsgi-py3 - -# Crear un archivo WSGI para que Apache pueda interactuar con la aplicación Flask -cat < $PROJECT_DIR/$WSGI_FILE -import sys -import logging - -# Configurar el logging -logging.basicConfig(stream=sys.stderr) - -# Añadir el directorio del proyecto al path -sys.path.insert(0, "$PROJECT_DIR") - -from app import app as application # Ajusta según tu archivo principal de Flask -EOT - -# Configurar Apache para servir la aplicación Flask -sudo tee /etc/apache2/sites-available/$PROJECT_NAME.conf > /dev/null < - ServerName localhost - - WSGIDaemonProcess $PROJECT_NAME python-path=$VENV_DIR/lib/$PYTHON_VERSION/site-packages - WSGIScriptAlias / $PROJECT_DIR/$WSGI_FILE - - - Require all granted - - - Alias /static $PROJECT_DIR/static - - Require all granted - - - ErrorLog \${APACHE_LOG_DIR}/$PROJECT_NAME_error.log - CustomLog \${APACHE_LOG_DIR}/$PROJECT_NAME_access.log combined - -EOT +# Instalación y configuración de Apache con WSGI +sudo apt-get install -y libapache2-mod-wsgi-py3 +sudo a2enmod wsgi -# Actualizar los repositorios de paquetes -sudo apt update +# Configuración del sitio de Apache +sudo cp nftables-frontend/nftables-config.conf /etc/apache2/sites-available/nftables-config.conf +sudo a2ensite nftables-config.conf -# Instalar Apache y el módulo mod_wsgi para Python 3 si no están instalados -sudo apt install -y apache2 libapache2-mod-wsgi-py3 +# Ajuste de permisos +sudo chmod 664 /usr/share/nftables-frontend/instance/nftables.db +sudo chown www-data:www-data /usr/share/nftables-frontend/instance/nftables.db +sudo chown -R www-data:www-data /usr/share/nftables-frontend +sudo chmod -R 775 /usr/share/nftables-frontend +sudo chmod -R 775 /usr/share/nftables-frontend/instance +sudo chmod -R 775 /usr/share/nftables-frontend/static +sudo chown -R www-data:www-data /usr/share/nftables-frontend/static -# Habilitar el sitio y el módulo wsgi -sudo a2ensite $PROJECT_NAME.conf -sudo a2enmod wsgi -#Reiniciar Apache para aplicar los cambios +# Reiniciar Apache sudo systemctl restart apache2 -echo "La aplicación Flask ahora debería estar disponible en http://localhost" \ No newline at end of file +# Iniciar el parser de nftables +cd nftables-parser +sudo hug -f main.py diff --git a/nftables-frontend/app.py b/nftables-frontend/app.py index 2c353fa..6957632 100644 --- a/nftables-frontend/app.py +++ b/nftables-frontend/app.py @@ -6,39 +6,36 @@ import os from service import create_default_user, login_manager -def create_app(): - app = Flask(__name__) - app.register_blueprint(visualization_bp) - app.register_blueprint(creation_bp) - dir_path = os.path.dirname(os.path.realpath(__file__)) - app.config['SECRET_KEY'] = 'hfds732klejds90ahg' - app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{dir_path}/instance/nftables.db' - app.config['SESSION_COOKIE_SAMESITE'] = 'Strict' - app.config['SESSION_COOKIE_SECURE'] = True - login_manager.init_app(app) - db.init_app(app) - - with app.app_context(): - db.create_all() - create_default_user() - - migrate = Migrate(app, db) - Bootstrap(app) - - @app.errorhandler(404) - def page_not_found(e): - return render_template('error.html', message='Page not found'), 404 - - @app.errorhandler(500) - def internal_error(e): - return render_template('error.html', message="Internal server error"), 500 - - @app.route('/favicon.ico') - def favicon(): - return app.send_static_file('favicon.ico') - - return app +app = Flask(__name__) +app.register_blueprint(visualization_bp) +app.register_blueprint(creation_bp) +dir_path = os.path.dirname(os.path.realpath(__file__)) +app.config['SECRET_KEY'] = 'hfds732klejds90ahg' +app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{dir_path}/instance/nftables.db' +app.config['SESSION_COOKIE_SAMESITE'] = 'Strict' +app.config['SESSION_COOKIE_SECURE'] = True +login_manager.init_app(app) +db.init_app(app) + +with app.app_context(): + db.create_all() + create_default_user() + +migrate = Migrate(app, db) +Bootstrap(app) + +@app.errorhandler(404) +def page_not_found(e): + return render_template('error.html', message='Page not found'), 404 + +@app.errorhandler(500) +def internal_error(e): + return render_template('error.html', message="Internal server error"), 500 + +@app.route('/favicon.ico') +def favicon(): + return app.send_static_file('favicon.ico') + if __name__ == '__main__': - app = create_app() app.run(debug=False) \ No newline at end of file diff --git a/nftables-frontend/instance/nftables.db b/nftables-frontend/instance/nftables.db new file mode 100644 index 0000000000000000000000000000000000000000..575338966fd7d3d6f0df5bc30438afb1f7c3fda6 GIT binary patch literal 49152 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 + ServerName www.example.com + ServerAlias example.com + DocumentRoot /usr/share/nftables-frontend + WSGIDaemonProcess nftables-frontend user=www-data group=www-data threads=5 + WSGIScriptAlias / /usr/share/nftables-frontend/run.wsgi + + WSGIProcessGroup nftables-frontend + WSGIApplicationGroup %{GLOBAL} + Options Indexes FollowSymLinks MultiViews + AllowOverride All + Require all granted + + Alias /static /usr/share/nftables-frontend/static + + Require all granted + + Alias /templates /usr/share/nftables-frontend/templates + + Require all granted + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + diff --git a/nftables-frontend/run.wsgi b/nftables-frontend/run.wsgi new file mode 100644 index 0000000..9e5bf17 --- /dev/null +++ b/nftables-frontend/run.wsgi @@ -0,0 +1,13 @@ +import os +import sys +import matplotlib +matplotlib.use('Agg') # Configurar el backend de Matplotlib + +# Establece la variable de entorno MPLCONFIGDIR +os.environ['MPLCONFIGDIR'] = '/tmp/matplotlib' + +# Añade tu aplicación al path de Python +sys.path.insert(0,'/usr/share/nftables-frontend') + +# Importa tu aplicación +from app import app as application \ No newline at end of file diff --git a/nftables-frontend/static/img/nftables_info.png b/nftables-frontend/static/img/nftables_info.png new file mode 100644 index 0000000000000000000000000000000000000000..d490f16dddeb2e2da4ce4a3ff91826a2d949f006 GIT binary patch literal 16745 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 literal 0 HcmV?d00001 diff --git a/nftables-frontend/templates/chains/chains.html b/nftables-frontend/templates/chains/chains.html index 7c762cc..b81114a 100644 --- a/nftables-frontend/templates/chains/chains.html +++ b/nftables-frontend/templates/chains/chains.html @@ -34,7 +34,7 @@

Chains:

{{ chain.policy }} {% endif %} - Delete + Delete {% endfor %} diff --git a/nftables-frontend/views.py b/nftables-frontend/views.py index 5e725e9..0cfff47 100644 --- a/nftables-frontend/views.py +++ b/nftables-frontend/views.py @@ -36,7 +36,11 @@ def main_view(): categories = ['Rules', 'Chains', 'Tables'] # Get the number of rules, chains and tables values = service.load_data(False) - image_path = 'static/img/nftables_info.png' + # Obtén la ruta del directorio actual + dir_path = os.path.dirname(os.path.realpath(__file__)) + + # Construye la ruta absoluta al archivo + image_path = os.path.join(dir_path, 'static/img/nftables_info.png') plt.figure(figsize=(8, 6)) plt.bar(categories, values, color=['blue', 'green', 'orange']) plt.xlabel('nftables elements') @@ -605,7 +609,7 @@ def add_list_post(): form = AddListForm() lista = request.files['list'].read().decode('utf-8').split("\n") form.element.data = lista - if 'txt' not in request.files['list'].filename: + if '.txt' not in request.files['list'].filename: flash('Error adding list.') tables = service.get_tables()