09138fbc18
Extract 9 route groups out of app.py into routes/ blueprints:
- routes/network.py — DNS, DHCP, NTP, network info/test (10 routes)
- routes/wireguard.py — WireGuard keys, peers, config, enforcement (18 routes)
- routes/cells.py — cell-to-cell connections (5 routes)
- routes/peers.py — peer CRUD + IP update + _next_peer_ip helper (10 routes)
- routes/routing.py — NAT, peer routes, firewall, iptables (17 routes)
- routes/vault.py — certs, trust, secrets (19 routes)
- routes/containers.py — containers, images, volumes (14 routes)
- routes/services.py — service bus, logs, services status/connectivity (18 routes)
- routes/peer_dashboard.py — peer-scoped dashboard/services (2 routes)
All blueprints use lazy `from app import X` inside route bodies to preserve
test patch compatibility (patch('app.email_manager', mock) still works).
Also included in this commit:
- A1 fix: backup/restore now includes email/calendar user files
- A2 fix: apply_config sets applying=True flag via helper container
- A3 fix: add_peer rolls back firewall on DNS failure
app.py reduced: 3011 → 1294 lines. 1021 tests passing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
110 lines
3.9 KiB
Python
110 lines
3.9 KiB
Python
import logging
|
|
from flask import Blueprint, request, jsonify
|
|
logger = logging.getLogger('picell')
|
|
bp = Blueprint('network', __name__)
|
|
|
|
@bp.route('/api/dns/records', methods=['GET'])
|
|
def get_dns_records():
|
|
try:
|
|
from app import network_manager
|
|
return jsonify(network_manager.get_dns_records())
|
|
except Exception as e:
|
|
logger.error(f"Error getting DNS records: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/dns/records', methods=['POST'])
|
|
def add_dns_record():
|
|
try:
|
|
from app import network_manager
|
|
data = request.get_json(silent=True)
|
|
if data is None:
|
|
return jsonify({"error": "No data provided"}), 400
|
|
return jsonify(network_manager.add_dns_record(**data))
|
|
except Exception as e:
|
|
logger.error(f"Error adding DNS record: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/dns/records', methods=['DELETE'])
|
|
def remove_dns_record():
|
|
try:
|
|
from app import network_manager
|
|
data = request.get_json(silent=True)
|
|
return jsonify(network_manager.remove_dns_record(**data))
|
|
except Exception as e:
|
|
logger.error(f"Error removing DNS record: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/dhcp/leases', methods=['GET'])
|
|
def get_dhcp_leases():
|
|
try:
|
|
from app import network_manager
|
|
return jsonify(network_manager.get_dhcp_leases())
|
|
except Exception as e:
|
|
logger.error(f"Error getting DHCP leases: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/dhcp/reservations', methods=['POST'])
|
|
def add_dhcp_reservation():
|
|
try:
|
|
from app import network_manager
|
|
data = request.get_json(silent=True)
|
|
if not data:
|
|
return jsonify({"error": "No data provided"}), 400
|
|
for field in ('mac', 'ip'):
|
|
if field not in data:
|
|
return jsonify({"error": f"Missing required field: {field}"}), 400
|
|
result = network_manager.add_dhcp_reservation(data['mac'], data['ip'], data.get('hostname', ''))
|
|
return jsonify({"success": result})
|
|
except Exception as e:
|
|
logger.error(f"Error adding DHCP reservation: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/dhcp/reservations', methods=['DELETE'])
|
|
def remove_dhcp_reservation():
|
|
try:
|
|
from app import network_manager
|
|
data = request.get_json(silent=True)
|
|
if not data or 'mac' not in data:
|
|
return jsonify({"error": "Missing required field: mac"}), 400
|
|
result = network_manager.remove_dhcp_reservation(data['mac'])
|
|
return jsonify({"success": result})
|
|
except Exception as e:
|
|
logger.error(f"Error removing DHCP reservation: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/ntp/status', methods=['GET'])
|
|
def get_ntp_status():
|
|
try:
|
|
from app import network_manager
|
|
return jsonify(network_manager.get_ntp_status())
|
|
except Exception as e:
|
|
logger.error(f"Error getting NTP status: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/network/info', methods=['GET'])
|
|
def get_network_info():
|
|
try:
|
|
from app import network_manager
|
|
return jsonify(network_manager.get_network_info())
|
|
except Exception as e:
|
|
logger.error(f"Error getting network info: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/dns/status', methods=['GET'])
|
|
def get_dns_status():
|
|
try:
|
|
from app import network_manager
|
|
return jsonify(network_manager.get_dns_status())
|
|
except Exception as e:
|
|
logger.error(f"Error getting DNS status: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/network/test', methods=['POST'])
|
|
def test_network():
|
|
try:
|
|
from app import network_manager
|
|
return jsonify(network_manager.test_connectivity())
|
|
except Exception as e:
|
|
logger.error(f"Error testing network: {e}")
|
|
return jsonify({"error": str(e)}), 500
|