101 lines
3.4 KiB
Python
Executable File
101 lines
3.4 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
import argparse
|
|
import sys
|
|
import logging
|
|
import subprocess
|
|
from datetime import datetime
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def main() -> int:
|
|
# Handle program arguments
|
|
ap = argparse.ArgumentParser(prog='blink-check', description='Check on a running blink-fetch cron task')
|
|
ap.add_argument("hostname", help="[user@]hostname[:port] for SSH")
|
|
ap.add_argument("--image-dir", help="Remote directory containing fetched images", default="/home/ewpratten/Pictures/blink")
|
|
ap.add_argument("--camera-id", help="Camera ID", default="155295")
|
|
ap.add_argument("--show-latest", "--show", "-s", help="Download and display the latest image (if possible)", action="store_true")
|
|
ap.add_argument('-v', '--verbose', help='Enable verbose logging', action='store_true')
|
|
args = ap.parse_args()
|
|
|
|
# Configure logging
|
|
logging.basicConfig(
|
|
level=logging.DEBUG if args.verbose else logging.INFO,
|
|
format='%(levelname)s: %(message)s',
|
|
)
|
|
|
|
# List files in image directory
|
|
logger.info(f"Listing files in: {args.hostname}:{args.image_dir}")
|
|
result = subprocess.run(
|
|
[
|
|
"ssh",
|
|
args.hostname,
|
|
"ls",
|
|
"-1",
|
|
args.image_dir,
|
|
],
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
# Check for errors
|
|
if result.returncode != 0:
|
|
logger.error(f"Failed to list files in: {args.hostname}:{args.image_dir}")
|
|
logger.error(result.stderr)
|
|
return 1
|
|
|
|
# Find all frames
|
|
frames = result.stdout.splitlines()
|
|
frames = [frame for frame in frames if frame.startswith(f"camera_{args.camera_id}.")]
|
|
frames = sorted(frames)
|
|
logger.info(f"Found {len(frames)} frames")
|
|
if len(frames) > 0:
|
|
oldest_frame_time = datetime.strptime(frames[0].split('.')[1], "%Y%m%d_%H%M%S")
|
|
newest_frame_time = datetime.strptime(frames[-1].split('.')[1], "%Y%m%d_%H%M%S")
|
|
logger.info(f"Oldest frame is from: {oldest_frame_time}")
|
|
logger.info(f"Newest frame is from: {newest_frame_time}")
|
|
|
|
# Download and display the latest image
|
|
if args.show_latest:
|
|
if len(frames) > 0:
|
|
latest_frame = frames[-1]
|
|
logger.info(f"Downloading latest frame: {latest_frame}")
|
|
result = subprocess.run(
|
|
[
|
|
"scp",
|
|
f"{args.hostname}:{args.image_dir}/{latest_frame}",
|
|
"/tmp/blink-latest.jpg",
|
|
],
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
# Check for errors
|
|
if result.returncode != 0:
|
|
logger.error(f"Failed to download latest frame: {latest_frame}")
|
|
logger.error(result.stderr)
|
|
return 1
|
|
|
|
# Display image
|
|
logger.info(f"Displaying latest frame: {latest_frame}")
|
|
result = subprocess.run(
|
|
[
|
|
"xdg-open",
|
|
"/tmp/blink-latest.jpg",
|
|
],
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
# Check for errors
|
|
if result.returncode != 0:
|
|
logger.error(f"Failed to display latest frame: {latest_frame}")
|
|
logger.error(result.stderr)
|
|
return 1
|
|
else:
|
|
logger.info(f"No frames to display")
|
|
|
|
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main()) |