Add project sources

This commit is contained in:
2026-01-23 18:57:33 +01:00
parent b696b30a0a
commit 01749f96e8
8 changed files with 712 additions and 0 deletions

97
app.py Normal file
View File

@@ -0,0 +1,97 @@
import logging
from flask import Flask, render_template, jsonify, request
from config import DEBUG, ZEROTIER_TOKEN
from zerotier_client import ZeroTierClient
from ping_service import PingService
# Setup logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = Flask(__name__)
zt_client = ZeroTierClient()
ping_service = PingService()
# Variabile globale per network_id
current_network_id = None
@app.route('/')
def home():
"""Pagina principale - dashboard"""
return render_template('dashboard.html')
@app.route('/api/networks', methods=['GET'])
def get_networks():
"""Ritorna la lista delle reti ZeroTier connesse"""
try:
# ZeroTier API doesn't list networks directly,
# l'utente deve impostare manualmente il network_id
return jsonify({
'message': 'Use /api/nodes?network_id=<id> to get nodes',
'example': '/api/nodes?network_id=xxxxxxxxxxxxxx'
}), 200
except Exception as e:
logger.error(f'Error in get_networks: {e}')
return jsonify({'error': str(e)}), 500
@app.route('/api/nodes', methods=['GET'])
def get_nodes():
"""Ritorna lo stato di tutti i nodi della rete"""
global current_network_id
try:
network_id = request.args.get('network_id')
if not network_id:
return jsonify({'error': 'network_id parameter required'}), 400
# Se è un network_id nuovo, avvia il servizio di ping
if network_id != current_network_id:
if ping_service.running:
ping_service.stop()
current_network_id = network_id
ping_service.start(network_id)
nodes = ping_service.get_nodes_status()
return jsonify({
'network_id': network_id,
'total_nodes': len(nodes),
'online_nodes': sum(1 for n in nodes if n['online']),
'nodes': nodes
}), 200
except Exception as e:
logger.error(f'Error in get_nodes: {e}')
return jsonify({'error': str(e)}), 500
@app.route('/api/status', methods=['GET'])
def api_status():
"""Health check dell'API"""
return jsonify({
'status': 'ok',
'zerotier_connected': zt_client.get_self() is not None
}), 200
@app.before_request
def check_auth():
"""Verifica il token per le API"""
# Se necessario aggiungere autenticazione
pass
@app.errorhandler(404)
def not_found(error):
return jsonify({'error': 'Not found'}), 404
@app.errorhandler(500)
def internal_error(error):
logger.error(f'Internal error: {error}')
return jsonify({'error': 'Internal server error'}), 500
if __name__ == '__main__':
try:
logger.info('Starting ZeroCentral...')
app.run(debug=DEBUG, host='0.0.0.0', port=5000)
except KeyboardInterrupt:
logger.info('Shutting down...')
if ping_service.running:
ping_service.stop()