Add manual refresh buttons for all servers and individual servers
This commit is contained in:
57
app/app.py
57
app/app.py
@@ -248,6 +248,12 @@ def collect_all():
|
||||
logger.info("Collection complete, updated %d servers", len(results))
|
||||
|
||||
|
||||
_collect_event = threading.Event()
|
||||
|
||||
def trigger_collect():
|
||||
"""Wake up the collector loop to run immediately."""
|
||||
_collect_event.set()
|
||||
|
||||
def collector_loop():
|
||||
time.sleep(2) # Brief pause to let Flask start
|
||||
while True:
|
||||
@@ -255,7 +261,8 @@ def collector_loop():
|
||||
collect_all()
|
||||
except Exception as e:
|
||||
logger.error("Collection loop error: %s", e)
|
||||
time.sleep(COLLECTION_INTERVAL)
|
||||
_collect_event.wait(timeout=COLLECTION_INTERVAL)
|
||||
_collect_event.clear()
|
||||
|
||||
|
||||
# --- Web Routes ---
|
||||
@@ -297,6 +304,54 @@ def api_servers():
|
||||
return jsonify(result)
|
||||
|
||||
|
||||
@app.route('/api/refresh', methods=['POST'])
|
||||
def api_refresh():
|
||||
trigger_collect()
|
||||
return jsonify({'ok': True, 'message': 'Collection triggered'})
|
||||
|
||||
|
||||
@app.route('/api/servers/<int:server_id>/refresh', methods=['POST'])
|
||||
def api_refresh_one(server_id):
|
||||
server = Server.query.get_or_404(server_id)
|
||||
try:
|
||||
ssh_key = load_ssh_key()
|
||||
except Exception as e:
|
||||
return jsonify({'ok': False, 'error': str(e)}), 500
|
||||
|
||||
entry = {
|
||||
'group': server.group_name,
|
||||
'username': server.username,
|
||||
'hostname': server.hostname,
|
||||
'url': server.url,
|
||||
}
|
||||
result = collect_one(entry, ssh_key)
|
||||
|
||||
server.is_online = result.get('is_online', False)
|
||||
server.last_collected = datetime.now(timezone.utc)
|
||||
server.details = result
|
||||
|
||||
# Extract primary IP
|
||||
default_iface = ''
|
||||
routing = result.get('routing', {})
|
||||
if isinstance(routing, dict):
|
||||
default_iface = routing.get('interface', '')
|
||||
primary_ip = ''
|
||||
for iface in result.get('net', []):
|
||||
ipv4 = iface.get('ipv4', '')
|
||||
if not ipv4 or ipv4.startswith('127.'):
|
||||
continue
|
||||
iface_name = iface.get('name', '') or iface.get('_name', '')
|
||||
if iface_name == default_iface:
|
||||
primary_ip = ipv4
|
||||
break
|
||||
if not primary_ip:
|
||||
primary_ip = ipv4
|
||||
server.primary_ip = primary_ip
|
||||
|
||||
db.session.commit()
|
||||
return jsonify({'ok': True})
|
||||
|
||||
|
||||
@app.route('/api/servers/<int:server_id>/notes', methods=['PUT'])
|
||||
def api_update_notes(server_id):
|
||||
from flask import request
|
||||
|
||||
Reference in New Issue
Block a user