From d5a3d0dfac214fc433c2c0aec578de564a990dd4 Mon Sep 17 00:00:00 2001 From: Eli Bosley Date: Fri, 28 Mar 2025 16:39:15 -0400 Subject: [PATCH] fix: OEM plugin issues (#1288) ## Summary by CodeRabbit - **New Features** - The file synchronization tool now requires an explicitly defined destination and offers a new option to remove remote password files before syncing. Additionally, synchronization now omits ownership, group, and permission metadata for smoother transfers. - The activation flow has been refined, with legacy authentication modifications removed to deliver a cleaner welcome modal experience. - A new variable has been introduced to enhance server state management. - **Refactor** - Internal configuration adjustments have been made to enhance component delivery and streamline system actions. - **Bug Fixes** - Updated handling of remote user and host parameters in the synchronization script for improved functionality. - Simplified the activation code removal process by focusing solely on the `.set-password.php` file restoration. --------- Co-authored-by: Zack Spear --- .../auth-request.modification.ts | 4 +- plugin/scripts/rsync-activation-dir.sh | 64 ++++++++++--------- .../dynamix.my.servers/data/server-state.php | 1 + .../scripts/activation_code_remove | 9 +-- .../scripts/activation_code_setup | 39 ++--------- 5 files changed, 43 insertions(+), 74 deletions(-) diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/auth-request.modification.ts b/api/src/unraid-api/unraid-file-modifier/modifications/auth-request.modification.ts index 55cdd6ff0..0235b0b54 100644 --- a/api/src/unraid-api/unraid-file-modifier/modifications/auth-request.modification.ts +++ b/api/src/unraid-api/unraid-file-modifier/modifications/auth-request.modification.ts @@ -2,8 +2,6 @@ import { existsSync } from 'fs'; import { readFile } from 'fs/promises'; import { join } from 'node:path'; -import { createPatch } from 'diff'; - import { FileModification, ShouldApplyWithReason, @@ -12,7 +10,7 @@ import { export default class AuthRequestModification extends FileModification { public filePath: string = '/usr/local/emhttp/auth-request.php' as const; public webComponentsDirectory: string = - '/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components/_nuxt/' as const; + '/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components/' as const; id: string = 'auth-request'; /** diff --git a/plugin/scripts/rsync-activation-dir.sh b/plugin/scripts/rsync-activation-dir.sh index 5696eed7f..95dbc3349 100755 --- a/plugin/scripts/rsync-activation-dir.sh +++ b/plugin/scripts/rsync-activation-dir.sh @@ -2,24 +2,14 @@ # Bash script to sync local activation code directory to the correct location on the Unraid server's boot device -# Usage: ./sync_files.sh --local-directory [--remote-user ] [--remote-host ] [--remote-path ] +# Usage: ./sync_files.sh --local-directory --remote-host [--remote-path ] [--remove-password] -# Example usage 0 -# ./plugin/scripts/rsync-activation-dir.sh --local-directory /Users/zack/Downloads/activation_code_pdfs_12_19_2024_1436 - -# Path to store the last used remote host -state_file="$HOME/.deploy_state" - -# Read the last used remote host from the state file -if [[ -f "$state_file" ]]; then - LAST_REMOTE_HOST=$(cat "$state_file") -else - LAST_REMOTE_HOST="" -fi +# Example usage: +# ./plugin/scripts/rsync-activation-dir.sh --local-directory /Users/zack/Downloads/activation_code_pdfs_12_19_2024_1436 --remote-host unraid.local --remove-password # Default values -REMOTE_USER="root" REMOTE_PATH="/boot/config/activation" +REMOVE_PASSWORD=false # Parse named flag parameters while [[ $# -gt 0 ]]; do @@ -28,10 +18,6 @@ while [[ $# -gt 0 ]]; do LOCAL_DIRECTORY="$2" shift 2 ;; - --remote-user) - REMOTE_USER="$2" - shift 2 - ;; --remote-host) REMOTE_HOST="$2" shift 2 @@ -40,32 +26,29 @@ while [[ $# -gt 0 ]]; do REMOTE_PATH="$2" shift 2 ;; + --remove-password) + REMOVE_PASSWORD=true + shift + ;; *) echo "Unknown option: $1" - echo "Usage: $0 --local-directory [--remote-user ] [--remote-host ] [--remote-path ]" + echo "Usage: $0 --local-directory --remote-host [--remote-path ] [--remove-password]" exit 1 ;; esac done -# Validate required parameter +# Validate required parameters if [[ -z "$LOCAL_DIRECTORY" ]]; then echo "Error: --local-directory is required." exit 1 fi -# Use last remote host if none is provided -REMOTE_HOST=${REMOTE_HOST:-$LAST_REMOTE_HOST} - -# Check if remote host is provided if [[ -z "$REMOTE_HOST" ]]; then - echo "Please provide the remote host using --remote-host." + echo "Error: --remote-host is required." exit 1 fi -# Save the current remote host to the state file -echo "$REMOTE_HOST" > "$state_file" - # Check if local directory ends with a slash if [[ "$LOCAL_DIRECTORY" != */ ]]; then echo "The local directory does not end with a slash." @@ -75,8 +58,31 @@ if [[ "$LOCAL_DIRECTORY" != */ ]]; then fi fi +# First, remove any existing password files on the remote server +ssh "root@$REMOTE_HOST" "rm -rf $REMOTE_PATH/*" || { + echo "Error: Failed to clean remote directory" + exit 1 +} + +# Remove Unraid password file if requested +if [[ "$REMOVE_PASSWORD" == true ]]; then + read -p "Do you want to remove any existing Unraid license keys on the server? (y/n): " REMOVE_KEYS + if [[ "$REMOVE_KEYS" =~ ^[Yy]$ ]]; then + ssh "root@$REMOTE_HOST" "rm -f /boot/config/*.key" || { + echo "Error: Failed to remove Unraid license keys" + exit 1 + } + echo "Removed Unraid license keys" + fi + ssh "root@$REMOTE_HOST" "rm -f /boot/config/passwd /boot/config/shadow /boot/config/super.dat" || { + echo "Error: Failed to remove Unraid password file" + exit 1 + } + echo "Removed Unraid password file" +fi + # Execute the rsync command and capture its output -RSYNC_OUTPUT=$(rsync -av -e ssh "$LOCAL_DIRECTORY" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" 2>&1) +RSYNC_OUTPUT=$(rsync -av --no-owner --no-group --no-perms -e ssh "$LOCAL_DIRECTORY" "root@$REMOTE_HOST:$REMOTE_PATH" 2>&1) RSYNC_EXIT_CODE=$? # Output the rsync command's output diff --git a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/data/server-state.php b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/data/server-state.php index 6fd7b7872..2e0e97b2f 100644 --- a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/data/server-state.php +++ b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/data/server-state.php @@ -1,5 +1,6 @@ "${AUTH_REQUEST_FILE}.tmp" - - mv "${AUTH_REQUEST_FILE}.tmp" "$AUTH_REQUEST_FILE" - debug_echo "Default values and .js files from $WEB_COMPS_DIR added to \$arrWhitelist." - else - debug_echo "\$arrWhitelist array not found in the file." - fi + # Auth Request Modification move into the Unraid API + # @todo - Move the remaining modifications into the Unraid API # Inject the welcome modal into the .set-password.php file WELCOME_MODAL_INJECT_FILE="/usr/local/emhttp/plugins/dynamix/include/.set-password.php" # shellcheck disable=SC2016 @@ -298,6 +265,8 @@ if [[ -d "$ACTIVATION_DIR" ]]; then PARTNER_CASE_ICON=$(jq -r '.caseIcon // empty' "$ACTIVATION_JSON" 2>/dev/null || true); # for included with system icon debug_echo "Partner case model icon: $PARTNER_CASE_MODEL" if [[ -f "$PARTNER_CASE_MODEL" ]]; then + # First remove any existing symlink or file + rm -f "$WEBGUI_IMAGES_DIR/$CUSTOM_CASE_FILE_NAME" cp -f "$PARTNER_CASE_MODEL" "$WEBGUI_IMAGES_DIR/$CUSTOM_CASE_FILE_NAME" if [[ $? -ne 0 ]]; then echo "⚠️ Warning: Failed to replace the original case model icon with the custom icon."