Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2021
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.52 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. ######################
  4. #### Mount Script ####
  5. ######################
  6. ## Version 0.96.9.2 ##
  7. ######################
  8.  
  9. ####### EDIT ONLY THESE SETTINGS #######
  10.  
  11. # INSTRUCTIONS
  12. # 1. Change the name of the rclone remote and shares to match your setup
  13. # 2. NOTE: enter RcloneRemoteName WITHOUT ':'
  14. # 3. Optional: include custom command and bind mount settings
  15. # 4. Optional: include extra folders in mergerfs mount
  16.  
  17. # REQUIRED SETTINGS
  18. RcloneRemoteName="gdrive" # Name of rclone remote mount WITHOUT ':'. NOTE: Choose your encrypted remote for sensitive data
  19. RcloneMountShare="/mnt/user/remote" # where your rclone remote will be located without trailing slash e.g. /mnt/user/mount_rclone
  20. RcloneMountDirCacheTime="720h" # rclone dir cache time
  21. LocalFilesShare="/mnt/user/local" # location of the local files and MountFolders you want to upload without trailing slash to rclone e.g. /mnt/user/local. Enter 'ignore' to disable
  22. RcloneCacheShare="/mnt/user0/mount_rclone" # location of rclone cache files without trailing slash e.g. /mnt/user0/mount_rclone
  23. RcloneCacheMaxSize="10G" # Maximum size of rclone cache
  24. RcloneCacheMaxAge="336h" # Maximum age of cache files
  25. MergerfsMountShare="/mnt/user/mergerfs" # location without trailing slash e.g. /mnt/user/mount_mergerfs. Enter 'ignore' to disable
  26. DockerStart="Plex-Media-Server sonarr sonarr4k radarr radarr4k ombi" # list of dockers, separated by space, to start once mergerfs mount verified. Remember to disable AUTOSTART for dockers added in docker settings page
  27. # MountFolders=\{"downloads/complete,downloads/intermediate,downloads/seeds,movies,tv"\} # comma separated list of folders to create within the mount
  28.  
  29. # Note: Again - remember to NOT use ':' in your remote name above
  30.  
  31. # OPTIONAL SETTINGS
  32.  
  33. # Add extra paths to mergerfs mount in addition to LocalFilesShare
  34. LocalFilesShare2="ignore" # without trailing slash e.g. /mnt/user/other__remote_mount/or_other_local_folder. Enter 'ignore' to disable
  35. LocalFilesShare3="ignore"
  36. LocalFilesShare4="ignore"
  37.  
  38. # Add extra commands or filters
  39. Command1="--rc"
  40. Command2="--rc-web-gui"
  41. Command3="--rc-user=sheldon"
  42. Command4="--rc-pass=ramona123"
  43. Command5="--rc-web-gui-no-open-browser"
  44. Command6="--rc-addr 192.168.1.3:5572"
  45. Command7=""
  46. Command8=""
  47.  
  48. CreateBindMount="N" # Y/N. Choose whether to bind traffic to a particular network adapter
  49. RCloneMountIP="192.168.1.252" # My unraid IP is 172.30.12.2 so I create another similar IP address
  50. NetworkAdapter="eth0" # choose your network adapter. eth0 recommended
  51. VirtualIPNumber="2" # creates eth0:x e.g. eth0:1. I create a unique virtual IP addresses for each mount & upload so I can monitor and traffic shape for each of them
  52.  
  53. ####### END SETTINGS #######
  54.  
  55. ###############################################################################
  56. ##### DO NOT EDIT ANYTHING BELOW UNLESS YOU KNOW WHAT YOU ARE DOING #######
  57. ###############################################################################
  58.  
  59. ####### Preparing mount location variables #######
  60. RcloneMountLocation="$RcloneMountShare/$RcloneRemoteName" # Location for rclone mount
  61. LocalFilesLocation="$LocalFilesShare/$RcloneRemoteName" # Location for local files to be merged with rclone mount
  62. MergerFSMountLocation="$MergerfsMountShare/$RcloneRemoteName" # Rclone data folder location
  63.  
  64. ####### create directories for rclone mount and mergerfs mounts #######
  65. mkdir -p /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName # for script files
  66. mkdir -p $RcloneCacheShare/cache/$RcloneRemoteName # for cache files
  67. if [[ $LocalFilesShare == 'ignore' ]]; then
  68. echo "$(date "+%d.%m.%Y %T") INFO: Not creating local folders as requested."
  69. LocalFilesLocation="/tmp/$RcloneRemoteName"
  70. eval mkdir -p $LocalFilesLocation
  71. else
  72. echo "$(date "+%d.%m.%Y %T") INFO: Creating local folders."
  73. eval mkdir -p $LocalFilesLocation/"$MountFolders"
  74. fi
  75. mkdir -p $RcloneMountLocation
  76.  
  77. if [[ $MergerfsMountShare == 'ignore' ]]; then
  78. echo "$(date "+%d.%m.%Y %T") INFO: Not creating MergerFS folders as requested."
  79. else
  80. echo "$(date "+%d.%m.%Y %T") INFO: Creating MergerFS folders."
  81. mkdir -p $MergerFSMountLocation
  82. fi
  83.  
  84.  
  85. ####### Check if script is already running #######
  86. echo "$(date "+%d.%m.%Y %T") INFO: *** Starting mount of remote ${RcloneRemoteName}"
  87. echo "$(date "+%d.%m.%Y %T") INFO: Checking if this script is already running."
  88. if [[ -f "/mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running" ]]; then
  89. echo "$(date "+%d.%m.%Y %T") INFO: Exiting script as already running."
  90. exit
  91. else
  92. echo "$(date "+%d.%m.%Y %T") INFO: Script not running - proceeding."
  93. touch /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
  94. fi
  95.  
  96. ####### Checking have connectivity #######
  97.  
  98. echo "$(date "+%d.%m.%Y %T") INFO: *** Checking if online"
  99. ping -q -c2 google.com > /dev/null # -q quiet, -c number of pings to perform
  100. if [ $? -eq 0 ]; then # ping returns exit status 0 if successful
  101. echo "$(date "+%d.%m.%Y %T") PASSED: *** Internet online"
  102. else
  103. echo "$(date "+%d.%m.%Y %T") FAIL: *** No connectivity. Will try again on next run"
  104. rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
  105. exit
  106. fi
  107.  
  108. ####### Create Rclone Mount #######
  109.  
  110. # Check If Rclone Mount Already Created
  111. if [[ -f "$RcloneMountLocation/mountcheck" ]]; then
  112. echo "$(date "+%d.%m.%Y %T") INFO: Success ${RcloneRemoteName} remote is already mounted."
  113. else
  114. echo "$(date "+%d.%m.%Y %T") INFO: Mount not running. Will now mount ${RcloneRemoteName} remote."
  115. # Creating mountcheck file in case it doesn't already exist
  116. echo "$(date "+%d.%m.%Y %T") INFO: Recreating mountcheck file for ${RcloneRemoteName} remote."
  117. touch mountcheck
  118. rclone copy mountcheck $RcloneRemoteName: -vv --no-traverse
  119. # Check bind option
  120. if [[ $CreateBindMount == 'Y' ]]; then
  121. echo "$(date "+%d.%m.%Y %T") INFO: *** Checking if IP address ${RCloneMountIP} already created for remote ${RcloneRemoteName}"
  122. ping -q -c2 $RCloneMountIP > /dev/null # -q quiet, -c number of pings to perform
  123. if [ $? -eq 0 ]; then # ping returns exit status 0 if successful
  124. echo "$(date "+%d.%m.%Y %T") INFO: *** IP address ${RCloneMountIP} already created for remote ${RcloneRemoteName}"
  125. else
  126. echo "$(date "+%d.%m.%Y %T") INFO: *** Creating IP address ${RCloneMountIP} for remote ${RcloneRemoteName}"
  127. ip addr add $RCloneMountIP/24 dev $NetworkAdapter label $NetworkAdapter:$VirtualIPNumber
  128. fi
  129. echo "$(date "+%d.%m.%Y %T") INFO: *** Created bind mount ${RCloneMountIP} for remote ${RcloneRemoteName}"
  130. else
  131. RCloneMountIP=""
  132. echo "$(date "+%d.%m.%Y %T") INFO: *** Creating mount for remote ${RcloneRemoteName}"
  133. fi
  134. # create rclone mount
  135. rclone mount \
  136. $Command1 $Command2 $Command3 $Command4 $Command5 $Command6 $Command7 $Command8 \
  137. --allow-other \
  138. --dir-cache-time $RcloneMountDirCacheTime \
  139. --log-level INFO \
  140. --poll-interval 15s \
  141. --cache-dir=$RcloneCacheShare/cache/$RcloneRemoteName \
  142. --vfs-cache-mode full \
  143. --vfs-cache-max-size $RcloneCacheMaxSize \
  144. --vfs-cache-max-age $RcloneCacheMaxAge \
  145. --bind=$RCloneMountIP \
  146. $RcloneRemoteName: $RcloneMountLocation &
  147.  
  148. # Check if Mount Successful
  149. echo "$(date "+%d.%m.%Y %T") INFO: sleeping for 5 seconds"
  150. # slight pause to give mount time to finalise
  151. sleep 5
  152. echo "$(date "+%d.%m.%Y %T") INFO: continuing..."
  153. if [[ -f "$RcloneMountLocation/mountcheck" ]]; then
  154. echo "$(date "+%d.%m.%Y %T") INFO: Successful mount of ${RcloneRemoteName} mount."
  155. else
  156. echo "$(date "+%d.%m.%Y %T") CRITICAL: ${RcloneRemoteName} mount failed - please check for problems. Stopping dockers"
  157. docker stop $DockerStart
  158. rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
  159. exit
  160. fi
  161. fi
  162.  
  163. ####### Start MergerFS Mount #######
  164.  
  165. if [[ $MergerfsMountShare == 'ignore' ]]; then
  166. echo "$(date "+%d.%m.%Y %T") INFO: Not creating mergerfs mount as requested."
  167. else
  168. if [[ -f "$MergerFSMountLocation/mountcheck" ]]; then
  169. echo "$(date "+%d.%m.%Y %T") INFO: Check successful, ${RcloneRemoteName} mergerfs mount in place."
  170. else
  171. # check if mergerfs already installed
  172. if [[ -f "/bin/mergerfs" ]]; then
  173. echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs already installed, proceeding to create mergerfs mount"
  174. else
  175. # Build mergerfs binary
  176. echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs not installed - installing now."
  177. mkdir -p /mnt/user/appdata/other/rclone/mergerfs
  178. docker run -v /mnt/user/appdata/other/rclone/mergerfs:/build --rm trapexit/mergerfs-static-build
  179. mv /mnt/user/appdata/other/rclone/mergerfs/mergerfs /bin
  180. # check if mergerfs install successful
  181. echo "$(date "+%d.%m.%Y %T") INFO: *sleeping for 5 seconds"
  182. sleep 5
  183. if [[ -f "/bin/mergerfs" ]]; then
  184. echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs installed successfully, proceeding to create mergerfs mount."
  185. else
  186. echo "$(date "+%d.%m.%Y %T") ERROR: Mergerfs not installed successfully. Please check for errors. Exiting."
  187. rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
  188. exit
  189. fi
  190. fi
  191. # Create mergerfs mount
  192. echo "$(date "+%d.%m.%Y %T") INFO: Creating ${RcloneRemoteName} mergerfs mount."
  193. # Extra Mergerfs folders
  194. if [[ $LocalFilesShare2 != 'ignore' ]]; then
  195. echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare2} to ${RcloneRemoteName} mergerfs mount."
  196. LocalFilesShare2=":$LocalFilesShare2"
  197. else
  198. LocalFilesShare2=""
  199. fi
  200. if [[ $LocalFilesShare3 != 'ignore' ]]; then
  201. echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare3} to ${RcloneRemoteName} mergerfs mount."
  202. LocalFilesShare3=":$LocalFilesShare3"
  203. else
  204. LocalFilesShare3=""
  205. fi
  206. if [[ $LocalFilesShare4 != 'ignore' ]]; then
  207. echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare4} to ${RcloneRemoteName} mergerfs mount."
  208. LocalFilesShare4=":$LocalFilesShare4"
  209. else
  210. LocalFilesShare4=""
  211. fi
  212. # make sure mergerfs mount point is empty
  213. mv $MergerFSMountLocation $LocalFilesLocation
  214. mkdir -p $MergerFSMountLocation
  215. # mergerfs mount command
  216. mergerfs $LocalFilesLocation:$RcloneMountLocation$LocalFilesShare2$LocalFilesShare3$LocalFilesShare4 $MergerFSMountLocation -o rw,async_read=false,use_ino,allow_other,func.getattr=newest,category.action=all,category.create=ff,cache.files=partial,dropcacheonclose=true
  217. # check if mergerfs mount successful
  218. echo "$(date "+%d.%m.%Y %T") INFO: Checking if ${RcloneRemoteName} mergerfs mount created."
  219. if [[ -f "$MergerFSMountLocation/mountcheck" ]]; then
  220. echo "$(date "+%d.%m.%Y %T") INFO: Check successful, ${RcloneRemoteName} mergerfs mount created."
  221. else
  222. echo "$(date "+%d.%m.%Y %T") CRITICAL: ${RcloneRemoteName} mergerfs mount failed. Stopping dockers."
  223. docker stop $DockerStart
  224. rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
  225. exit
  226. fi
  227. fi
  228. fi
  229.  
  230. ####### Starting Dockers That Need Mergerfs Mount To Work Properly #######
  231.  
  232. # only start dockers once
  233. if [[ -f "/mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/dockers_started" ]]; then
  234. echo "$(date "+%d.%m.%Y %T") INFO: dockers already started."
  235. else
  236. # Check CA Appdata plugin not backing up or restoring
  237. if [ -f "/tmp/ca.backup2/tempFiles/backupInProgress" ] || [ -f "/tmp/ca.backup2/tempFiles/restoreInProgress" ] ; then
  238. echo "$(date "+%d.%m.%Y %T") INFO: Appdata Backup plugin running - not starting dockers."
  239. else
  240. touch /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/dockers_started
  241. echo "$(date "+%d.%m.%Y %T") INFO: Starting dockers."
  242. docker restart $DockerStart
  243. fi
  244. fi
  245.  
  246. rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
  247. echo "$(date "+%d.%m.%Y %T") INFO: Script complete"
  248.  
  249. exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement