A Python port of the Invisible Internet Project (I2P)
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})