Files
NetAlertX/server/graphql_server/graphql_server_start.py
2024-11-23 09:28:40 +11:00

67 lines
2.1 KiB
Python
Executable File

import threading
from flask import Flask, request, jsonify
from .graphql_schema import devicesSchema
from graphene import Schema
import sys
# Register NetAlertX directories
INSTALL_PATH = "/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
from logger import mylog
from helper import get_setting_value, timeNowTZ, updateState
from notification import write_notification
# Flask application
app = Flask(__name__)
# Retrieve API token and port
graphql_port_value = get_setting_value("GRAPHQL_PORT")
# Endpoint used when accessed via browser
@app.route("/graphql", methods=["GET"])
def graphql_debug():
# Handles GET requests
return "NetAlertX GraphQL server running."
# Endpoint for GraphQL queries
@app.route("/graphql", methods=["POST"])
def graphql_endpoint():
# Check for API token in headers
incoming_header_token = request.headers.get("Authorization")
api_token_value = get_setting_value("API_TOKEN")
if incoming_header_token != f"Bearer {api_token_value}":
mylog('verbose', [f'[graphql_server] Unauthorized access attempt'])
return jsonify({"error": "Unauthorized"}), 401
# Retrieve and log request data
data = request.get_json()
mylog('verbose', [f'[graphql_server] data: {data}'])
# Execute the GraphQL query
result = devicesSchema.execute(data.get("query"), variables=data.get("variables"))
# Return the result as JSON
return jsonify(result.data)
def start_server(graphql_port, app_state):
"""Start the GraphQL server in a background thread."""
if app_state.graphQLServerStarted == 0:
mylog('verbose', [f'[graphql_server] Starting on port: {graphql_port}'])
# Start Flask app in a separate thread
thread = threading.Thread(
target=lambda: app.run(
host="0.0.0.0",
port=graphql_port,
debug=True,
use_reloader=False
)
)
thread.start()
# Update the state to indicate the server has started
app_state = updateState("Process: Wait", None, None, None, 1)