Organize project: Move old code and documentation to oldcode folder, add comprehensive README
This commit is contained in:
95
api_routes_module.py
Normal file
95
api_routes_module.py
Normal file
@@ -0,0 +1,95 @@
|
||||
"""
|
||||
Flask API routes for command execution, device status, and auto-update
|
||||
"""
|
||||
|
||||
from flask import Flask, request, jsonify
|
||||
import logging
|
||||
from commands_module import execute_system_command
|
||||
from autoupdate_module import perform_auto_update
|
||||
from logger_module import log_with_server, read_masa_name
|
||||
import subprocess
|
||||
|
||||
|
||||
def create_api_routes(app, hostname, device_ip, local_app_path, local_repo_path):
|
||||
"""
|
||||
Create and register API routes on the Flask app
|
||||
|
||||
Args:
|
||||
app: Flask application instance
|
||||
hostname: Device hostname
|
||||
device_ip: Device IP
|
||||
local_app_path: Path to local app.py file
|
||||
local_repo_path: Path to local repository
|
||||
"""
|
||||
|
||||
@app.route('/execute_command', methods=['POST'])
|
||||
def handle_command_execution():
|
||||
"""
|
||||
Endpoint to receive and execute system commands
|
||||
"""
|
||||
try:
|
||||
data = request.json
|
||||
if not data or 'command' not in data:
|
||||
return jsonify({"error": "Invalid request. 'command' field is required"}), 400
|
||||
|
||||
command = data.get('command')
|
||||
result = execute_system_command(command, hostname, device_ip)
|
||||
|
||||
return jsonify(result), 200 if result['status'] == 'success' else 400
|
||||
|
||||
except Exception as e:
|
||||
log_with_server(f"Error handling command execution request: {str(e)}", hostname, device_ip)
|
||||
return jsonify({"error": f"Server error: {str(e)}"}), 500
|
||||
|
||||
@app.route('/status', methods=['GET'])
|
||||
def get_device_status():
|
||||
"""
|
||||
Endpoint to get device status information
|
||||
"""
|
||||
try:
|
||||
n_masa = read_masa_name()
|
||||
|
||||
# Get system information
|
||||
uptime_result = subprocess.run(['uptime'], capture_output=True, text=True)
|
||||
df_result = subprocess.run(['df', '-h', '/'], capture_output=True, text=True)
|
||||
free_result = subprocess.run(['free', '-m'], capture_output=True, text=True)
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
status_info = {
|
||||
"hostname": hostname,
|
||||
"device_ip": device_ip,
|
||||
"nume_masa": n_masa,
|
||||
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
|
||||
"uptime": uptime_result.stdout.strip() if uptime_result.returncode == 0 else "N/A",
|
||||
"disk_usage": df_result.stdout.strip() if df_result.returncode == 0 else "N/A",
|
||||
"memory_usage": free_result.stdout.strip() if free_result.returncode == 0 else "N/A"
|
||||
}
|
||||
|
||||
return jsonify(status_info), 200
|
||||
|
||||
except Exception as e:
|
||||
log_with_server(f"Error getting device status: {str(e)}", hostname, device_ip)
|
||||
return jsonify({"error": f"Error getting status: {str(e)}"}), 500
|
||||
|
||||
@app.route('/auto_update', methods=['POST'])
|
||||
def auto_update_app():
|
||||
"""
|
||||
Auto-update the application from the central server
|
||||
Checks version, downloads newer files if available, and restarts the device
|
||||
"""
|
||||
try:
|
||||
result = perform_auto_update(local_app_path, local_repo_path, hostname, device_ip)
|
||||
|
||||
if result.get('status') == 'success':
|
||||
return jsonify(result), 200
|
||||
elif result.get('status') == 'no_update_needed':
|
||||
return jsonify(result), 200
|
||||
else:
|
||||
return jsonify(result), 500
|
||||
|
||||
except Exception as e:
|
||||
log_with_server(f"Auto-update endpoint error: {str(e)}", hostname, device_ip)
|
||||
return jsonify({"error": f"Auto-update failed: {str(e)}"}), 500
|
||||
|
||||
return app
|
||||
Reference in New Issue
Block a user