fix: pre-liberation review — frames dir, wigle config GET, debug redis-keys endpoint

CRITICAL:
- frames.py: FRAMES_DIR corrected to /tmp/adacam/pics
- frames.py: graceful handling when capture not started

IMPORTANT:
- wigle.py: added GET /api/1/wigle/config endpoint for Varroa
- app.py: added GET /api/1/debug/redis-keys endpoint for GPS troubleshooting
- install.sh: removed python validation that runs from wrong directory
This commit is contained in:
Kayos 2026-03-14 17:59:08 -07:00
parent 064378870b
commit 174de0637e
4 changed files with 57 additions and 8 deletions

View file

@ -110,6 +110,18 @@ def create_app():
)
return jsonify({'ok': True, 'ssh_enabled': enable})
# ── DEBUG ENDPOINTS ────────────────────────────────────────────────────
@app.route('/api/1/debug/redis-keys')
def redis_keys():
"""Debug endpoint — list Redis keys for GPS/IMU troubleshooting."""
try:
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
keys = r.keys('*')
return jsonify({'keys': sorted(keys)})
except Exception as e:
return jsonify({'error': str(e)}), 503
# Start background forwarder thread
forwarder.start_retry_thread()

View file

@ -5,18 +5,36 @@ from flask import Blueprint, jsonify
bp = Blueprint("frames", __name__, url_prefix="/api/1/recording")
FRAMES_DIR = "/tmp/recording/pics"
FRAMES_DIR = "/tmp/adacam/pics"
@bp.route("/frames/latest", methods=["GET"])
def latest_frame():
"""Get path to most recent frame file."""
# Handle case where capture hasn't started yet
if not os.path.exists(FRAMES_DIR):
return jsonify({'frames': [], 'message': 'capture not started'}), 200
if not os.path.isdir(FRAMES_DIR):
return jsonify({"error": "No frames directory"}), 404
return jsonify({"error": "Frames directory invalid"}), 500
files = glob.glob(os.path.join(FRAMES_DIR, "*"))
if not files:
return jsonify({"error": "No frames available"}), 404
return jsonify({'frames': [], 'message': 'no frames captured yet'}), 200
latest = max(files, key=os.path.getmtime)
return jsonify({"path": latest})
@bp.route("/frames", methods=["GET"])
def list_frames():
"""List all available frames."""
if not os.path.exists(FRAMES_DIR):
return jsonify({'frames': [], 'message': 'capture not started'})
files = glob.glob(os.path.join(FRAMES_DIR, "*"))
files.sort(key=os.path.getmtime, reverse=True)
return jsonify({
'frames': files[:100], # limit to 100 most recent
'total': len(files)
})

View file

@ -91,9 +91,28 @@ def wigle_stats():
return jsonify({'error': str(e), 'total_networks': 0, 'uploaded_networks': 0, 'pending_upload': 0, 'scans_today': 0})
@bp.route('/config', methods=['GET'])
def get_wigle_config():
"""Get WiGLE configuration (unauthenticated, tokens masked)."""
try:
conn = _get_db()
cfg = _get_config(conn)
conn.close()
return jsonify({
'enabled': cfg.get('enabled', '0') == '1',
'api_name': cfg.get('api_name', ''),
'api_token_set': bool(cfg.get('api_token')),
'scan_interval_seconds': int(cfg.get('scan_interval_seconds', '30')),
'upload_interval_seconds': int(cfg.get('upload_interval_seconds', '300')),
})
except Exception as e:
return jsonify({'error': str(e)}), 500
@bp.route('/config', methods=['POST'])
@require_auth
def wigle_config():
def set_wigle_config():
"""Set WiGLE configuration (authenticated)."""
data = request.get_json() or {}

View file

@ -21,14 +21,14 @@ cp systemd/adacam-api.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable adacam-api
# Generate device ID if not present
# Note: Config is generated by liberate.sh or on first API start
# We don't validate Python imports here as the working directory matters
if [ ! -f "$DATA_DIR/config.json" ]; then
python3 -c "from adacam_api import config; config.load()"
echo "[*] Generated new device ID"
echo "[*] Config will be generated on first API start"
fi
echo "[*] Starting adacam-api..."
systemctl restart adacam-api
systemctl status adacam-api --no-pager
systemctl status adacam-api --no-pager || true
echo "[+] Installation complete. API running on port 5000"