commit f6fc1599c236ef1df9031cee762f557cbeb43b79 Author: cryobry <38270216+cryobry@users.noreply.github.com> Date: Mon Jul 13 12:54:13 2020 -0400 Initial commit diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..05e7f44 --- /dev/null +++ b/install.sh @@ -0,0 +1,159 @@ +#!/usr/bin/env bash +debug="off" # turn "on" for debugging +# IMPORTANT OPTIONS # +frame_address="192.168.1.100:2221" # you can find this on the frame, best to make static +source_dir="$HOME/Pictures/picture_frame" # source pictures directory + +# Less important options +user="$(whoami)" # default run as current user +user_id="$(id -u)" +group_id="$(id -g)" +script_dir="$PWD" # where to copy the script to, default is $PWD +dest_dir="/media/picture_frame_ftp" # the ftp mount path +temp_dir="/tmp/picture_frame_ftp" # ftp does not support rsync temp files +# Service settings +service_dir="$HOME/.config/systemd/user" +service_name="rsync-to-picture-frame" +on_calendar="hourly" +# END USER OPTIONS # + +# if debug is on, echo additional output +debug() { [[ $debug == "on" ]] && echo "debug: $*"; } + +check_and_install() { + if ! command -v "$1" > /dev/null 2>&1; then + echo "Installing $1" + [[ -f /etc/os-release ]] && source /etc/os-release + if [[ "${NAME,,}" =~ (fedora|centos) ]]; then + debug "sudo dnf install -y $1" + if ! sudo dnf install -y "$1"; then + echo "Could not install $1, exiting" + exit 1 + fi + elif [[ "${NAME,,}" =~ (debian|ubuntu) ]]; then + debug "sudo apt install -y $1" + if ! sudo apt install -y "$1"; then + echo "Could not install $1, exiting" + exit 1 + fi + else + echo "$1 must be installed" + exit 1 + fi + fi + return $? +} + +# Happily make directories +mk_dir() { + for DIR in "$@"; do + if [[ ! -d "$DIR" ]]; then + debug "mkdir -p $DIR" + if ! mkdir -p "$DIR"; then + debug "sudo mkdir -p $DIR" + if ! sudo mkdir -p "$DIR"; then + echo "sudo mkdir $DIR failed, exiting" + exit 1 + fi + fi + fi + done +} + +# Happily chown directories as $user +chown_dir() { + for DIR in "$@"; do + debug "chown $user:$user -R $DIR" + if ! chown "$user":"$user" -R "$DIR"; then + debug "sudo chown $user:$user -R $DIR" + if ! sudo chown "$user":"$user" -R "$DIR"; then + echo "sudo chown on $DIR failed, exiting" + exit 1 + fi + fi + done + return $? +} + +# Happily make files executable +make_exec() { + for FILE in "$@"; do + debug "chmod a+x $FILE" + if ! chmod a+x "$FILE"; then + debug "sudo chmod a+x $FILE" + if ! sudo chmod a+x "$FILE"; then + echo "sudo chmod on $FILE failed, exiting" + exit 1 + fi + fi + done + return $? +} + +# Happily copy files +cp_file() { + if [[ ! -f "$1" ]]; then + echo "$1 is missing" + exit 1 + elif ! cp -af "$1" "$2"; then + echo "failed, retrying with sudo" + debug "sudo cp -f $1 $2" + if ! sudo cp -af "$1" "$2"; then + echo "Copying script failed, exiting" + exit 1 + fi + fi +} + +# Use sed to find ($1) and replace ($2) a string in a file ($3) +f_and_r() { + debug "s#$1#$2#" "$3" + if ! sed -i "s#$1#$2#g" "$3"; then + exit 1 + fi +} + +main() { + + # Install curlftps + debug "check_and_install curlftpfs" + check_and_install "curlftpfs" + + # Disable existing timer + debug "systemctl --user disable --now $service_name.timer" + systemctl --user disable --now "$service_name.timer" &> /dev/null + + # Unmount existing ftp share + mountpoint -q -- "$dest_dir" && fusermount -u "$dest_dir" + + # Create directories + mk_dir "$source_dir" "$dest_dir" "$service_dir" "$script_dir" + chown_dir "$source_dir" "$dest_dir" "$service_dir" "$script_dir" + + # Copy script file + cp_file "$service_name.sh.original" "$script_dir/$service_name.sh" + make_exec "$script_dir/$service_name.sh" + f_and_r "{{ftp_mount_path}}" "$dest_dir" "$script_dir/$service_name.sh" + f_and_r "{{source_dir}}" "$source_dir" "$script_dir/$service_name.sh" + f_and_r "{{frame_address}}" "$frame_address" "$script_dir/$service_name.sh" + f_and_r "{{user_id}}" "$user_id" "$script_dir/$service_name.sh" + f_and_r "{{group_id}}" "$group_id" "$script_dir/$service_name.sh" + f_and_r "{{temp_dir}}" "$temp_dir" "$script_dir/$service_name.sh" + + # Copy service file + cp_file "$service_name.service.original" "$service_dir/$service_name.service" + f_and_r "{{path_to_script}}" "$script_dir/$service_name.sh" "$service_dir/$service_name.service" + + # Copy timer file + cp_file "$service_name.timer.original" "$service_dir/$service_name.timer" + f_and_r "{{on_calendar}}" "$on_calendar" "$service_dir/$service_name.timer" + + # Enable timer + debug "systemctl --user daemon-reload" + systemctl --user daemon-reload + debug "systemctl --user enable --now $service_name.timer" + systemctl --user enable --now "$service_name.timer" +} + +main "$@" +exit $? diff --git a/rsync-to-picture-frame.service.original b/rsync-to-picture-frame.service.original new file mode 100644 index 0000000..0be12fa --- /dev/null +++ b/rsync-to-picture-frame.service.original @@ -0,0 +1,10 @@ +[Unit] +Description="Mount picture frame ftp and rsync photo directory" +After=network-online.target +Wants=network-online.target + +[Service] +ExecStart={{path_to_script}} + +[Install] +WantedBy=multi-user.target diff --git a/rsync-to-picture-frame.sh.original b/rsync-to-picture-frame.sh.original new file mode 100644 index 0000000..a8aab21 --- /dev/null +++ b/rsync-to-picture-frame.sh.original @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +# This script will mount mom's photo frame ftp share locally +# Use install.sh to change settings + +# if the mount already exists, unmount it +mountpoint -q -- "{{ftp_mount_path}}" && fusermount -u "{{ftp_mount_path}}" + +# make temp directory (ftp does not support rsync temp files) +[[ ! -d "{{temp_dir}}" ]] && mkdir -p "{{temp_dir}}" + +# Mount it and rsync over the photos +if curlftpfs -o uid={{user_id}},gid={{group_id}} "{{frame_address}}" "{{ftp_mount_path}}"; then + if ! rsync -r --delete --quiet --temp-dir="{{temp_dir}}" "{{source_dir}}/" "{{ftp_mount_path}}"; then + echo "rsync -r --delete --quiet {{source_dir}}/ {{ftp_mount_path}} failed!" + exit 1 + fi + if ! fusermount -u "{{ftp_mount_path}}"; then + echo "Could not unmount {{ftp_mount_path}}" + exit 1 + fi +else + echo "Could not mount Mom's picture frame" + if ping -c 1 "{{frame_address}}"; then + echo "Ping OK, check the photo frame settings or the filesystem" + exit 1 + else + echo "Could not ping the photo frame, is it on?" + exit 1 + fi +fi + +exit $? diff --git a/rsync-to-picture-frame.timer.original b/rsync-to-picture-frame.timer.original new file mode 100644 index 0000000..e26c5f0 --- /dev/null +++ b/rsync-to-picture-frame.timer.original @@ -0,0 +1,10 @@ +[Unit] +Description="Transfer photos to picture frame hourly" + +[Timer] +OnBootSec=1min +OnCalendar={{on_calendar}} +Persistent=true + +[Install] +WantedBy=timers.target