From 852fdfc0d5a28abf7b369a5f577c8c7b04afdd0d Mon Sep 17 00:00:00 2001 From: ChuckPa Date: Wed, 1 May 2024 02:02:32 -0400 Subject: [PATCH] Manual mode - Initial commit --- DBRepair.sh | 150 ++++++++++++++++++++++++++++++++++++--------------- README.md | 17 ++++++ ReleaseNotes | 22 +++++++- 3 files changed, 146 insertions(+), 43 deletions(-) diff --git a/DBRepair.sh b/DBRepair.sh index c684d67..2e98af3 100755 --- a/DBRepair.sh +++ b/DBRepair.sh @@ -2,15 +2,12 @@ ######################################################################### # Plex Media Server database check and repair utility script. # # Maintainer: ChuckPa # -# Version: v1.05.02 # -# Date: 26-Mar-2024 # +# Version: v1.06.00 # +# Date: 01-May-2024 # ######################################################################### # Version for display purposes -Version="v1.05.02" - -# Flag when temp files are to be retained -Retain=0 +Version="v1.06.00" # Have the databases passed integrity checks CheckedDB=0 @@ -39,6 +36,7 @@ CPPL=com.plexapp.plugins.library TimeStamp="$(date "+%Y-%m-%d_%H.%M.%S")" # Initialize global runtime variables +ManualConfig=0 CheckedDB=0 Damaged=0 DbPageSize=0 @@ -49,6 +47,15 @@ LOG_TOOL="echo" ShowMenu=1 Exit=0 +# On all hosts except Mac +PIDOF="pidof" +STATFMT="-c" +STATBYTES="%s" +STATPERMS="%a" + +# On all hosts except QNAP +DFFLAGS="-m" + # Universal output function Output() { if [ $Scripted -gt 0 ]; then @@ -363,6 +370,15 @@ HostConfig() { # On all hosts except QNAP DFFLAGS="-m" + # Manual Config + if [ $ManualConfig -eq 1 ]; then + + CacheDir="$DBDIR/../../Cache" + Logfile="$DBDIR/DBRepair.log" + HostType="MANUAL" + return 0 + fi + # Synology (DSM 7) if [ -d /var/packages/PlexMediaServer ] && \ [ -d "/var/packages/PlexMediaServer/shares/PlexMediaServer/AppData/Plex Media Server" ]; then @@ -1095,7 +1111,6 @@ DoRepair() { Output "Repair has failed. No files changed" WriteLog "Repair - $TimeStamp - FAIL" CheckedDB=0 - Retain=1 return 1 fi } @@ -1529,16 +1544,10 @@ DoStop(){ } # Do command line switches -DoOptions() { +#DoOptions() { - for i in $@ - do - Opt="$(echo $i | cut -c1-2 | tr [A-Z] [a-z])" - [ "$Opt" = "-i" ] && IgnoreErrors=1 && WriteLog "Opt: Database error checking ignored." - [ "$Opt" = "-f" ] && IgnoreErrors=1 && WriteLog "Opt: Database error checking ignored." - [ "$Opt" = "-p" ] && RemoveDuplicates=1 && WriteLog "Opt: Remove duplidate watch history viewstates." - done -} + +#} # UpdateTimestamp DoUpdateTimestamp() { @@ -1644,16 +1653,76 @@ ScriptWorkingDirectory="$(dirname "$ScriptPath")" # Initialize LastName LastTimestamp SetLast "" "" +# Process any given command line options in the ugliest manner possible :P~~ +while [ "$(echo $1 | cut -c1)" = "-" ] && [ "$1" != "" ] +do + Opt="$(echo $1 | awk '{print $1'} | tr [A-Z] [a-z])" + [ "$Opt" = "-i" ] && shift + [ "$Opt" = "-f" ] && shift + [ "$Opt" = "-p" ] && shift + + # Manual configuration options (running outside of container) + if [ "$Opt" = "--sqlite" ]; then + + # Manually specify path to where Plex SQLite is installed. + if [ -d "$2" ] && [ -f "$2/Plex SQLite" ]; then + PLEX_SQLITE="$2/Plex SQLite" + ManualConfig=1 + else + Output "Given directory path ('$1') for Plex SQLite is invalid. Ignoring." + fi + shift 2 + fi + + + + # Manual path to databases + if [ "$Opt" = "--databases" ]; then + + # Manually specify path to where the databases reside + if [ -d "$2" ] && [ -f "$2"/com.plexapp.plugins.library.db ]; then + DBDIR="$2" + ManualConfig=1 + LOGFILE="$DBDIR/DBRepair.log" + AppSuppDir="$( dirname "$(dirname "$(dirname "$db")))")")" + + else + Output "Given directory path ('$1') for Plex databases is invalid. Ignoring." + fi + shift 2 + fi +done + +# Confirm completed manual config +if [ $ManualConfig -eq 1 ]; then + if [ "$DBDIR" = "" ] || [ "$PLEX_SQLITE" = "" ]; then + Output "Error: Both 'Plex SQLite' and Databases directory paths must be specified with Manual configuration." + WriteLog "Manual configuration incomplete. One of the required arguments was missing." + exit 2 + fi + + # Performing logging here + [ $IgnoreErrors -eq 1 ] && WriteLog "Opt: Database error checking ignored." + [ $RemoveDuplicates -eq 1 ] && WriteLog "Opt: Remove duplidate watch history viewstates." + WriteLog "Plex SQLite = '$PLEX_SQLITE'" + WriteLog "Databases = '$DBDIR'" + + # Final configuration + HostType="User Defined" +fi + + + # Are we scripted (command line args) Scripted=0 [ "$1" != "" ] && Scripted=1 # Identify this host -if ! HostConfig; then +if [ $ManualConfig -eq 0 ] && ! HostConfig; then Output 'Error: Unknown host. Current supported hosts are: QNAP, Syno, Netgear, Mac, ASUSTOR, WD (OS5), Linux wkstn/svr, SNAP' Output ' Current supported container images: Plexinc, LinuxServer, HotIO, & BINHEX' Output ' ' - Output 'Are you trying to run the tool from outside the container environment ?' + Output 'Are you trying to run the tool from outside the container environment? Manual mode is available. Please see documentation.' exit 1 fi @@ -1676,13 +1745,6 @@ echo " " WriteLog "============================================================" WriteLog "Session start: Host is $HostType" -# Command line hidden options must come before commands -while [ "$(echo $1 | cut -c1)" = "-" ] -do - DoOptions "$1" - shift -done - # Make sure we have a logfile touch "$LOGFILE" @@ -1743,6 +1805,13 @@ do echo " Version $Version" echo " " + # Print info if Manual + if [ $ManualConfig -eq 1 ]; then + WriteLog "Manual SQLite path: '$PLEX_SQLITE' + WriteLog "Manual Database path: '$DBDIR' + Output " PlexSQLite = '$PLEX_SQLITE'" + Output " Databases = '$DBDIR'" + fi Choice=0; Exit=0; NullCommands=0 @@ -1785,24 +1854,9 @@ do if [ $Scripted -eq 0 ]; then echo "" printf "Enter command # -or- command name (4 char min) : " - else - Input="$1" - # If end of line then force exit - if [ "$Input" = "" ]; then - Input="exit" - Exit=1 - Output "Unexpected EOF / End of command line options. Exiting. Keeping temp files." - fi - fi - - # Watch for null command whether scripted or not. - if [ "$1" != "" ]; then - Input="$1" - # echo "$1" - shift - else - [ $Scripted -eq 0 ] && read Input + # Read next command from user + read Input # Handle EOF/forced exit if [ "$Input" = "" ] ; then @@ -1817,6 +1871,18 @@ do else NullCommands=0 fi + else + + # Scripted + Input="$1" + + # If end of line then force exit + if [ "$Input" = "" ]; then + Input="exit" + else + shift + fi + fi # Update timestamp diff --git a/README.md b/README.md index 2cfaa81..f38a9ee 100644 --- a/README.md +++ b/README.md @@ -293,6 +293,8 @@ Attention: This executes: Stop PMS, Automatic (Check, Repair, Reindex), Start PMS, and Exit commands + Beginning with v1.06.00, the 'exit' command is optional when scripted. + ## Exiting @@ -850,6 +852,21 @@ root@lizum:/sata/plex/Plex Media Server/Plug-in Support/Databases# # ``` +# Special considerations - MANUAL CONFIGURATION + + Manual configuration is enabled by supplying two command line arguments. + These must precede all other options or commands on the command line. + + Scripted Example: + + DBRepair.sh --sqlite /usr/lib/plexmediaserver --databases /real/host/directory/...../Databases auto prune + + Interactive Example: + + DBRepair.sh --sqlite /usr/lib/plexmediaserver --databases /real/host/directory/...../Databases + + + # Special considerations - Synology DSM 7 Using DBRepair on Synology DSM 7 systems with Task Scheduler requires special handling. diff --git a/ReleaseNotes b/ReleaseNotes index 4cb97e7..64795bd 100644 --- a/ReleaseNotes +++ b/ReleaseNotes @@ -8,9 +8,29 @@ ![Maintenance](https://img.shields.io/badge/Maintained-Yes-green.svg) # Release Info: +v1.06.00 + + 1. Manual configuration - You may now run DBRepair from outside container environments. + This provides a method for running DBRepair when container healthcheck prevents it. + + The directories to both: + + a. Where Plex SQLite can be found: ( --sqlite "/real/host/path/to/plexmediaserver/Directory" ) + b. Where the databases can be found: ( --databases "/real/host/path/to/Plugin Support/Databases" ) + + If used, these options MUST precede all other command line options + + WARNING: The host MUST provide all standard commands AND support "stat -c" option. Bash commands will NOT autoconfigure. + + + 2. "Exit" when scripted: The previously annoyance which required "exit" to be specified on the command line (scripted) has been fixed. + "exit" is no longer required in this use. + + "exit" or "quit" is still required in interactive use. + v1.05.02 - 1 HOTIO image paths HOTIO images have again changed PMS executable location. This update + 1. HOTIO image paths HOTIO images have again changed PMS executable location. This update adds support for the lastest location. v1.05.01