import sqlite3 import os from werkzeug.security import generate_password_hash DB_PATH = os.environ.get('DB_PATH', '/data/dyndns.db') def get_db(): conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row return conn def init_db(): db = get_db() db.executescript(''' CREATE TABLE IF NOT EXISTS settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL DEFAULT '' ); CREATE TABLE IF NOT EXISTS admin_users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS dyndns_users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, subdomain TEXT UNIQUE NOT NULL, current_ip TEXT, last_updated TEXT, active INTEGER NOT NULL DEFAULT 1, created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS update_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, dyndns_user_id INTEGER NOT NULL, old_ip TEXT, new_ip TEXT NOT NULL, result TEXT NOT NULL, timestamp TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (dyndns_user_id) REFERENCES dyndns_users(id) ); ''') existing = db.execute('SELECT id FROM admin_users LIMIT 1').fetchone() if not existing: db.execute( 'INSERT INTO admin_users (username, password_hash) VALUES (?, ?)', ('admin', generate_password_hash('admin')) ) db.commit() db.close() def get_setting(key, default=''): db = get_db() row = db.execute('SELECT value FROM settings WHERE key = ?', (key,)).fetchone() db.close() return row['value'] if row else default def set_setting(key, value): db = get_db() db.execute('INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)', (key, value)) db.commit() db.close()