# -----------------------------
# Initialize Aliases DB Table
# -----------------------------
-@register_init
+@register_init("create_aliases_table")
def init_db_aliases_table(cur: sqlite3.Cursor) -> None:
# ALIASES TABLE
_connection = None
_db_path: Path | None = None
-_init_functions = []
+INIT_REGISTRY = {}
+
+# ---------------------------------------------------------
+# Internal: resolve init order based on dependencies
+# ---------------------------------------------------------
+def _resolve_init_order():
+ visited = set()
+ visiting = set()
+ order = []
+
+ def visit(name):
+ if name in visited:
+ return
+ if name in visiting:
+ raise RuntimeError(f"Circular dependency detected: {name}")
+
+ visiting.add(name)
+
+ for dep in INIT_REGISTRY[name]["depends_on"]:
+ if dep not in INIT_REGISTRY:
+ raise RuntimeError(f"Missing dependency: {dep}")
+ visit(dep)
+
+ visiting.remove(name)
+ visited.add(name)
+ order.append(name)
+
+ for name in INIT_REGISTRY:
+ visit(name)
+
+ return order
# -----------------------------
# Register DB Init Function
# -----------------------------
-def register_init(func):
- _init_functions.append(func)
- return func
+def register_init(name, depends_on=None):
+ if depends_on is None:
+ depends_on = []
+
+ def decorator(func):
+ INIT_REGISTRY[name] = {
+ "func": func,
+ "depends_on": depends_on
+ }
+ return func
+
+ return decorator
# -----------------------------
# Configure database (path)
conn = get_db()
cur = conn.cursor()
- for func in sorted(_init_functions, key=lambda f: f.__name__):
+ ordered_names = _resolve_init_order()
+
+ for name in ordered_names:
+ func = INIT_REGISTRY[name]["func"]
func(cur)
conn.commit()
# -----------------------------
# Initialize Hosts DB Table
# -----------------------------
-@register_init
+@register_init("create_hosts_table")
def init_db_hosts_table(cur: sqlite3.Cursor) -> None:
# HOSTS TABLE
# ---------------------------------------------------------
# Create Config DB Tables
# ---------------------------------------------------------
-@register_init
+@register_init("create_settings_table")
def init_db_config_table(cur):
# CONFIG TABLE
# ---------------------------------------------------------
# Initialize Config DB Tables
# ---------------------------------------------------------
-@register_init
+@register_init("init_settings_table", depends_on=["create_settings_table"])
def init_db_config_defaults(cur):
# Add configuration parameters
# -----------------------------
# Create Users Table
# -----------------------------
-@register_init
+@register_init("create_users_table")
def init_db_users_table(cur):
# USERS TABLE
# -----------------------------
# Populate Users Tables
# -----------------------------
-@register_init
+@register_init("init_users_table", depends_on=["create_users_table"])
def init_db_users_defaults(cur):
# Insert default admin user
if settings.ADMIN_PASSWORD_HASH:
}
// -----------------------------
-// Delete Hosts
+// Delete DHCP Lease
// -----------------------------
export async function serviceDeleteDHCPLease(id) {
const data = await apiRequest(