A Python port of the Invisible Internet Project (I2P)
at main 60 lines 1.6 kB view raw
1"""REST API routes — JSON endpoints for programmatic access. 2 3Provides a REST API that Java I2P lacks, enabling external tools 4and scripts to query router state and update configuration. 5""" 6 7from __future__ import annotations 8 9from flask import Blueprint, jsonify, request, current_app 10 11bp = Blueprint("api", __name__, url_prefix="/api/v1") 12 13_VALID_ACTIONS = {"restart", "shutdown", "reseed"} 14 15 16@bp.route("/status") 17def status(): 18 """Router status summary.""" 19 ctx = current_app.config["CONSOLE_CONTEXT"] 20 return jsonify({ 21 **ctx.status, 22 "network": ctx.network_status, 23 }) 24 25 26@bp.route("/peers") 27def peers(): 28 """Peer list.""" 29 return jsonify({"peers": []}) 30 31 32@bp.route("/tunnels") 33def tunnels(): 34 """Tunnel status.""" 35 return jsonify({"tunnels": []}) 36 37 38@bp.route("/config", methods=["GET"]) 39def get_config(): 40 """Get current configuration.""" 41 ctx = current_app.config["CONSOLE_CONTEXT"] 42 return jsonify(ctx.get_all_properties()) 43 44 45@bp.route("/config", methods=["POST"]) 46def set_config(): 47 """Update configuration properties.""" 48 ctx = current_app.config["CONSOLE_CONTEXT"] 49 data = request.get_json(silent=True) or {} 50 for key, value in data.items(): 51 ctx.set_property(key, str(value)) 52 return jsonify({"status": "ok", "updated": len(data)}) 53 54 55@bp.route("/router/<action>", methods=["POST"]) 56def router_action(action: str): 57 """Perform a router action (restart/shutdown/reseed).""" 58 if action not in _VALID_ACTIONS: 59 return jsonify({"error": f"Invalid action: {action}"}), 400 60 return jsonify({"status": "ok", "action": action})