Browse Source

Initial commit

cryobry 3 years ago
commit
f6fc1599c2

+ 159 - 0
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 $?

+ 10 - 0
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

+ 32 - 0
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 $?

+ 10 - 0
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