We now have working api and simple webpages to view the data.

This commit is contained in:
Kalzu Rekku
2025-04-03 22:58:53 +03:00
parent 362d0e7b65
commit 0bee8c7fd3
9 changed files with 943 additions and 0 deletions

View File

@ -0,0 +1,81 @@
from flask import Flask
from .database.SlidingSqlite.SlidingSqlite import SlidingSQLite
import os
import configparser
import json
def load_admin_api_key(app):
"""Load admin API key from config file, env var, or database."""
admin_key = None
# 1. Try environment variable
admin_key = os.getenv('ADMIN_API_KEY')
if admin_key:
app.config['ADMIN_API_KEY'] = admin_key
return
# 2. Try config file (e.g., /app/config.ini or /app/config.json)
config_file = '/app/config.ini'
if os.path.exists(config_file):
config = configparser.ConfigParser()
config.read(config_file)
admin_key = config.get('auth', 'admin_api_key', fallback=None)
elif os.path.exists('/app/config.json'):
config_file = '/app/config.json'
with open(config_file, 'r') as f:
config = json.load(f)
admin_key = config.get('auth', {}).get('admin_api_key')
if admin_key:
app.config['ADMIN_API_KEY'] = admin_key
return
# Check database
query = "SELECT api_key FROM admin_keys LIMIT 1"
result = app.db.execute_read_sync(query)
if result.success and result.data:
app.config['ADMIN_API_KEY'] = result.data[0][0]
return
# Generate and store a new key
import secrets
default_key = secrets.token_hex(16)
app.config['ADMIN_API_KEY'] = default_key
app.db.execute_write(
"INSERT INTO admin_keys (api_key, description) VALUES (?, ?)",
(default_key, "Default admin key created on bootstrap")
)
# Log the default key (in a real app, you'd log this securely)
print(f"Generated and stored default admin API key: {default_key}")
def create_app():
app = Flask(__name__)
# Configuration
# app.config['DB_DIR'] = '/home/kalzu/src/ai-coding/node-monitor/temp_data/data/db' # Change this for container!
app.config['DB_DIR'] = '/data/db' # This is container version
app.config['RETENTION_PERIOD'] = 604800 # 7 days
app.config['ROTATION_INTERVAL'] = 3600 # 1 hour
# Load schema
with open(os.path.join(os.path.dirname(__file__), 'database', 'schema.sql'), 'r') as f:
schema = f.read()
# Initialize SlidingSQLite
app.db = SlidingSQLite(
db_dir=app.config['DB_DIR'],
schema=schema,
retention_period=app.config['RETENTION_PERIOD'],
rotation_interval=app.config['ROTATION_INTERVAL']
)
# Load admin API key
load_admin_api_key(app)
# Register blueprints
from .api import routes as api_routes
from .web import routes as web_routes
app.register_blueprint(api_routes.bp)
app.register_blueprint(web_routes.bp)
return app