#!/bin/sh
#
# File mover for all cases (big & small, local & nationwide)
#

# Path to this script
ScriptDir="$(dirname "$0")"

# Message text handler function
# Simple function to keep code clean and pass mneumonic code and arguments to message-text script
MessageText(){
  "$ScriptDir/message-text" "$1" "$2" "$3" "$4"
}

# Where is the shared folder and other variables?
PlexPkgShare="/var/packages/PlexMediaServer/shares/PlexMediaServer"
PlexPkgHome="$PlexPkgShare/AppData"

# In event not provided
[ "$SYNOPKG_PKGHOME" = "" ] && SYNOPKG_PKGHOME=/var/packages/PlexMediaServer/home
[ "$SYNOPKG_PKGDEST" = "" ] && SYNOPKG_PKGDEST=/var/packages/PlexMediaServer/target
[ "$SYNOPKG_PKGTMP"  = "" ] && SYNOPKG_PKGTMP=/var/packages/PlexMediaServer/tmp
[ "$SYNOPKG_TEMP_LOGFILE" = "" ] && SYNOPKG_TEMP_LOGFILE=/dev/tty

# Make certain destination writeable
if [ ! -w "$PlexPkgShare" ]; then
  # Brief message - Cannot write to shared folder
  {
    echo "<br><STRONG>ERROR: <strong>System Internal User PlexMediaServer cannot write to shared folder PlexMediaServer</strong>.<br>"
    echo "<br><STRONG>El usuario interno del sistema PlexMediaServer no puede escribir en la carpeta compartida PlexMediaServer</strong>.<br>"
    echo "<br><STRONG>L'utilisateur interne du système PlexMediaServer ne peut pas écrire dans le dossier partagé PlexMediaServer</strong>.<br>"
    echo "<br><STRONG>Systeminterner Benutzer PlexMediaServer kann nicht in den freigegebenen Ordner PlexMediaServer schreiben</strong>.<br>"
    echo "<br><STRONG>システム内部ユーザーPlexMediaServerは共有フォルダーPlexMediaServerrに書き込めません</strong>.<br>"
    echo "<br><STRONG>시스템 내부 사용자 PlexMediaServer는 공유 폴더 PlexMediaServer에 쓸 수 없습니다.</strong>.<br>"
    echo "<br><STRONG>系统内部用户 PlexMediaServer 无法写入共享文件夹 PlexMediaServer</strong>.</p><br>"
  } >> "$SYNOPKG_TEMP_LOGFILE"
  exit 150
fi

# Create AppData (and tmp)
[ ! -d "$PlexPkgHome" ] && rm -f "$PlexPkgHome"
mkdir -p "$PlexPkgHome/tmp"
if [ ! -d "$PlexPkgHome" ]; then

  # Brief message - Cannot write to shared folder
  {
    echo "<br><STRONG>ERROR: <strong>System Internal User PlexMediaServer cannot write to shared folder PlexMediaServer</strong>.</p><br>"
    echo "<br><STRONG><strong>El usuario interno del sistema PlexMediaServer no puede escribir en la carpeta compartida PlexMediaServer</strong>.</p><br>"
    echo "<br><STRONG><strong>L'utilisateur interne du système PlexMediaServer ne peut pas écrire dans le dossier partagé PlexMediaServer</strong>.</p><br>"
    echo "<br><STRONG><strong>Systeminterner Benutzer PlexMediaServer kann nicht in den freigegebenen Ordner PlexMediaServer schreiben</strong>.</p><br>"
    echo "<br><STRONG><strong>システム内部ユーザーPlexMediaServerは共有フォルダーPlexMediaServerに書き込めません</strong>.</p><br>"
    echo "<br><STRONG><strong>시스템 내부 사용자 PlexMediaServer는 공유 폴더 PlexMediaServer에 쓸 수 없습니다.</strong>.</p><br>"
    echo "<br><STRONG><strong>系统内部用户 PlexMediaServer 无法写入共享文件夹 PlexMediaServer</strong>.</p><br>"
  } >>$SYNOPKG_TEMP_LOGFILE
  exit 150
fi

# if no existing server in AppData then look around
if [ ! -e "$PlexPkgHome/Plex Media Server" ] || [ "$(ls "$PlexPkgHome/Plex Media Server")" = "" ]; then

  # Is there an existing DSM 7 installation to relocate?
  if [ -e "$SYNOPKG_PKGHOME/Plex Media Server" ] && [ "$(ls "$SYNOPKG_PKGHOME/Plex Media Server")" != "" ]; then

    # Avoid junk
    [ -e "$PlexPkgHome/Plex Media Server" ] && \
      mv "$PlexPkgHome/Plex Media Server" "$PlexPkgHome/Plex Media Server".$$ && \
      rm -rf "$PlexPkgHome/Plex Media Server".$$ &

    # Make the move
    mv "$SYNOPKG_PKGHOME/Plex Media Server" "$PlexPkgHome"

    # Errors?
    Errors=$?
    if [ $Errors -ne 0 ]; then
      {
        echo "<br><STRONG><STRONG>DSM ERROR $Errors: $SYNOPKG_PKGHOME -> $PlexPkgHome </p></STRONG><br>"
      } >> $SYNOPKG_TEMP_LOGFILE
      exit $Errors
    fi

  # No existing DSM 7 installation.  Look for a DSM 6 installation.
  elif [ ! -e "$PlexPkgHome/Plex Media Server" ]; then

    # And if there appears to be a DSM 6-based Plex installation
    # Use first-found directory. "Plex" is default for all DSM 6+ installations.  Users might have moved and used wrong case.

    SourceShare=""
    [ "$(echo /volume[1-9]*/[Pp][Ll][Ee][Xx]]/Library/Application\ Support/Plex\ Media\ Server)" != "/volume[1-9]*/[Pp][Ll][Ee][Xx]/Library/Application Support/Plex Media Server" ] && \
      SourceShare="$(echo /volume[1-9]*/[Pp][Ll][Ee][Xx] | awk '{print $1}')"

    if [ "$SourceShare" != "" ] && [ -d "$SourceShare/Library/Application Support/Plex Media Server" ]; then

      # Test for Plex share access
      if [ "$(synoacltool -get "$SourceShare" | grep "user:PlexMediaServer:allow:rwxpdDaARWcCo:fd--")" = "" ]; then
        MessageText M-ACL-Failure-Plex-Share
        MessageText M-ACL-Procedure
        exit 150
      fi

      # Verify contents are not still in Linux mode but are owned by admin
      if [ "$(synoacltool -get "$SourceShare/Library"                                       | grep Linux)" != "" ] || \
         [ "$(synoacltool -get "$SourceShare/Library/Application Support"                   | grep Linux)" != "" ] || \
         [ "$(synoacltool -get "$SourceShare/Library/Application Support/Plex Media Server" | grep Linux)" != "" ]; then

        MessageText M-ACL-Failure-Plex-Subdirs
        MessageText M-ACL-Procedure
        exit 150
      fi

      # Final check to confirm we have ACL control of subdirectories before continuing.
      Errors=0

      find "$SourceShare/Library/Application Support" -maxdepth 5 -type d | while read Dir
      do
        [ "$(synoacltool -get "$Dir" | grep "user:PlexMediaServer:allow:rwxpdDaARWcCo:fd--")" = "" ] && Errors=$((Errors + 1))
      done

      # If any errors,  do the above again.
      if [ $Errors -gt 0 ]; then

        MessageText M-Cannot-Migrate-ACL-Incomplete
        MessageText M-ACL-Procedure
        exit 150
      fi

      # Perform normal migration of existing Plex server data
      "$ScriptDir/dsm7-migration-tool" "$SourceShare" "$PlexPkgHome"
      [ $? -ne 0 ] && exit $?
    fi
  fi
fi

# All done, pay the man
exit 0
