141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # Default status for variables
 | |
| PROGRAM_NAME=$(basename "$0")
 | |
| remote_sync=false # --remote
 | |
| root_only=false # --root
 | |
| output_dir="/tmp" # -o
 | |
| remote_dir="/tmp" # --sync-dir
 | |
| device="/dev/video0" # fswebcam -d
 | |
| frames=1 # fswebcam -F
 | |
| skips=5 # fswebcam -S
 | |
| 
 | |
| # Generate the date for the filename
 | |
| current_date=$(date +"%Y-%m-%d_%H-%M")
 | |
| # Form the filename
 | |
| out_filename="TL-$current_date.jpg"
 | |
| # Concat the file path parts into one variable
 | |
| output_path="${output_dir}/${out_filename}"
 | |
| 
 | |
| 
 | |
| usage() {
 | |
|     echo -e "usage: $PROGRAM_NAME -r resolution [-o output_dir] [-d device] [-F frames] [-S skips] [--root] [--remote --sync-dir remote_dir]"
 | |
|     echo -e "  -r resolution            Image resolution, e.g. 1920x1080"
 | |
|     echo -e "  -o output_dir            Path to image storage directory, default /tmp"
 | |
|     echo -e "  -d device                Device path to webcam, default /dev/video0"
 | |
|     echo -e "  -F frames                Number of image frames to capture, default 1"
 | |
|     echo -e "  -S skips                 Number of frames to skip before capturing, default 5"
 | |
|     echo -e "  --root                   Checks if the script is running as root"
 | |
|     echo -e "  --remote                 Enable remote syncing of images, must specify --sync-dir as well"
 | |
|     echo -e "  --sync-dir remote_dir    Path to remote sync destination"
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| # Parse arguments
 | |
| while [[ "$#" -gt 0 ]]; do
 | |
|     case "$1" in
 | |
|         -r)
 | |
|             resolution="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
|         -o)
 | |
|             output_dir="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
|         -d)
 | |
|             device="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
|         -F)
 | |
|             frames="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
|         -S)
 | |
|             skips="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
|         --root)
 | |
|             root_only=true
 | |
|             shift
 | |
|             ;;
 | |
|         --remote)
 | |
|             remote_sync=true
 | |
|             shift
 | |
|             ;;
 | |
|         --sync-dir)
 | |
|             remote_dir="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
|         -h|--help)
 | |
|             usage
 | |
|             ;;
 | |
|         *)
 | |
|             echo "Unknown option: $1"
 | |
|             usage
 | |
|             ;;
 | |
|     esac
 | |
| done
 | |
| 
 | |
| # Check for required arguments
 | |
| if [ -z "$resolution" ]; then
 | |
|     echo "Error: resolution is required"
 | |
|     usage
 | |
| fi
 | |
| 
 | |
| # Implement the behavior based on the flags and options
 | |
| echo "Resolution: $resolution"
 | |
| echo "Output Directory: $output_dir"
 | |
| echo "Device: $device"
 | |
| echo "Frames: $frames"
 | |
| echo "Skips: $skips"
 | |
| echo "Running as Root: $root_only"
 | |
| echo "Remote Sync: $remote_sync"
 | |
| if [ "$remote_sync" = true ]; then
 | |
|     if [ -z "$sync_dir" ]; then
 | |
|         echo "Error: --sync-dir must be specified when --remote is used"
 | |
|         usage
 | |
|     else
 | |
|         echo "Sync Directory: $sync_dir"
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| ##################################################
 | |
| # Functions
 | |
| ##################################################
 | |
| check_for_root() {
 | |
|     # Check for root/sudo
 | |
|     if [ "$EUID" -ne 0 ]; then
 | |
|         echo "This script must be run as root or with sudo."
 | |
|         exit 1
 | |
|     else
 | |
|         echo "Running as root or with sudo."
 | |
|     fi
 | |
| }
 | |
| 
 | |
| capture() {
 | |
|     echo -e "Capturing image and saving it to $output_path"
 | |
|     fswebcam -r "$resolution" -d "$device" "$output_path" -F $frames -S $skips
 | |
| }
 | |
| 
 | |
| sync() {
 | |
|     echo "Syncing $output_dir to $remote_dir..."
 | |
|     rsync -av --progress --remove-source-files "$output_path" "$remote_dir/" $1
 | |
|     if [[ $? -eq 0 ]]; then
 | |
|         echo -e "Success"
 | |
|     else
 | |
|         echo -e "Unable to complete sync. Exiting"
 | |
|         exit 1
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Calling functions
 | |
| # If needed, check for root
 | |
| if [[ $root_only == true ]]; then
 | |
|     check_for_root
 | |
| fi
 | |
| 
 | |
| capture
 | |
| 
 | |
| # If needed, sync the image to remote storage
 | |
| if [[ $remote_sync == true ]]; then
 | |
|     sync
 | |
| fi |