PERC-CLI-Install/install_perccli.sh

171 lines
7.3 KiB
Bash

#!/bin/bash
# ------------------------------------------------------------------------------------------------
# Script to download, extract, convert, and install the Dell PERCCLI utility.
# Optimized for Debian-based systems (like Proxmox) that need to convert the RPM package.
# Note: This script assumes execution as 'root' (no 'sudo' needed).
# ------------------------------------------------------------------------------------------------
# --- Configuration ---
PERCCLI_URL="https://dl.dell.com/FOLDER13074167M/1/PERCCLI_7.3208.0_Linux_A01.tar.gz"
ARCHIVE_NAME="PERCCLI_7.3208.0_Linux_A01.tar.gz"
TEMP_DIR="perccli_install_temp"
# Default path for the executable, will be updated dynamically if necessary
EXECUTABLE_PATH="/opt/MegaRAID/perccli/perccli"
SYMLINK_PATH="/usr/local/bin/perccli"
echo "Starting PERCCLI installation script..."
echo "Target URL: $PERCCLI_URL"
# --- Clean Start Logic: Remove previous temporary files/directories if they exist ---
if [ -d "$TEMP_DIR" ]; then
echo "Found old temporary directory '$TEMP_DIR'. Removing for a clean start."
rm -rf "$TEMP_DIR"
fi
if [ -f "$ARCHIVE_NAME" ]; then
echo "Found old archive '$ARCHIVE_NAME'. Removing for a clean start."
rm -f "$ARCHIVE_NAME"
fi
# ----------------------------------------------------------------------------------
# 1. Download the archive
echo "1. Downloading $ARCHIVE_NAME..."
# Using wget with User-Agent to prevent 403 errors
wget --no-check-certificate --user-agent="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1)" "$PERCCLI_URL" -O "$ARCHIVE_NAME"
if [ $? -ne 0 ]; then
echo "ERROR: Failed to download the file. Check your network connection and ensure 'wget' is installed."
exit 1
fi
echo "Download complete."
# 2. Extract the archive
echo "2. Extracting the archive..."
mkdir -p "$TEMP_DIR"
tar -xzf "$ARCHIVE_NAME" -C "$TEMP_DIR"
if [ $? -ne 0 ]; then
echo "ERROR: Failed to extract the archive. The file may be incomplete or corrupted."
rm -rf "$TEMP_DIR"
exit 1
fi
echo "Extraction complete to $TEMP_DIR."
# 3. Locate the installation package (Prioritizing RPM since the official package is RPM)
PACKAGE_FILE=$(find "$TEMP_DIR" -type f \( -name "*.rpm" -o -name "*.deb" \) | head -n 1)
if [ -z "$PACKAGE_FILE" ]; then
echo "ERROR: Could not find any .deb or .rpm installation package within the archive."
echo "Please navigate to '$TEMP_DIR' and install the appropriate package manually."
exit 1
fi
echo "3. Found package file: $PACKAGE_FILE"
# 4. Install the package
echo "4. Attempting to install the package."
INSTALL_SUCCESS=1 # Default to failure
if [[ "$PACKAGE_FILE" == *.deb ]]; then
echo "Detected native DEB package. Trying to install with 'dpkg -i'..."
if command -v dpkg >/dev/null 2>&1; then
dpkg -i "$PACKAGE_FILE"
INSTALL_SUCCESS=$?
else
echo "ERROR: 'dpkg' command not found. Cannot proceed."
fi
elif [[ "$PACKAGE_FILE" == *.rpm ]]; then
echo "Detected RPM package. As this is a Debian-based system (Proxmox), we will use 'alien' to convert it to a DEB package."
if command -v dpkg >/dev/null 2>&1; then
if command -v alien >/dev/null 2>&1; then
echo "Attempting to convert $PACKAGE_FILE to .deb using 'alien --scripts' to ensure post-install setup runs..."
# CRITICAL FIX: Use --scripts to prevent skipping post-installation setup
alien -d --scripts "$PACKAGE_FILE"
if [ $? -eq 0 ]; then
echo "Conversion successful. Searching for generated .deb file..."
# Robustly search for the .deb file generated by alien
PACKAGE_NAME_ROOT=$(basename "$PACKAGE_FILE" | cut -d'-' -f1)
NEW_DEB_FILE=$(find . -maxdepth 1 -name "${PACKAGE_NAME_ROOT}_*.deb" | head -n 1)
if [ -f "$NEW_DEB_FILE" ]; then
echo "Found converted file: $NEW_DEB_FILE. Installing..."
# Using dpkg -i to install the generated package
dpkg -i "$NEW_DEB_FILE"
INSTALL_SUCCESS=$?
# Clean up the converted .deb file
rm -f "$NEW_DEB_FILE"
else
echo "ERROR: Conversion succeeded, but could not locate the newly created .deb file for installation."
fi
else
echo "ERROR: 'alien' conversion failed. Please check the 'alien' output above for details."
fi
else
echo "ERROR: 'alien' command not found. This tool is required to convert the RPM package for your system."
echo "Please run: apt update && apt install alien -y"
fi
else
echo "FATAL ERROR: 'dpkg' (Debian Package Manager) is not found. Cannot proceed with installation."
fi
fi
# 5. Final Setup and Cleanup
if [ $INSTALL_SUCCESS -eq 0 ]; then
echo ""
echo "5. Installation successful. Performing final setup and cleanup."
# NEW DYNAMIC PATH DISCOVERY: Try dpkg, then fall back to filesystem search
ACTUAL_EXECUTABLE_PATH=$(dpkg -L perccli 2>/dev/null | grep "/perccli$" | head -n 1)
# If dpkg failed or found path is not a file, search common installation directories
if [ -z "$ACTUAL_EXECUTABLE_PATH" ] || [ ! -f "$ACTUAL_EXECUTABLE_PATH" ]; then
echo "WARNING: dpkg path discovery failed. Performing filesystem search for 'perccli'..."
# Search common paths: /opt, /usr/local/sbin, /usr/sbin, /usr/bin
ACTUAL_EXECUTABLE_PATH=$(find /opt /usr/local/sbin /usr/sbin /usr/bin -name perccli -type f 2>/dev/null | head -n 1)
fi
# Finalize path or fail
if [ -n "$ACTUAL_EXECUTABLE_PATH" ] && [ -f "$ACTUAL_EXECUTABLE_PATH" ]; then
EXECUTABLE_PATH="$ACTUAL_EXECUTABLE_PATH"
echo "Dynamically found executable at: $EXECUTABLE_PATH"
else
echo "FATAL ERROR: Could not locate 'perccli' binary after successful package setup."
echo "Please manually run: find / -name perccli -type f"
INSTALL_SUCCESS=1 # Set installation to fail state to skip chmod/symlink
fi
# Proceed with cleanup and symlinking only if the executable was found
if [ $INSTALL_SUCCESS -eq 0 ]; then
# CRITICAL FIX: Ensure the executable has permissions (Fixes 'Permission denied')
chmod +x "$EXECUTABLE_PATH"
echo "Applied execute permission to $EXECUTABLE_PATH."
# Add symbolic link to the path (Fixes 'command not found')
if [ ! -L "$SYMLINK_PATH" ]; then
ln -s "$EXECUTABLE_PATH" "$SYMLINK_PATH"
echo "Created symbolic link at $SYMLINK_PATH."
fi
rm -f "$ARCHIVE_NAME"
rm -rf "$TEMP_DIR"
echo "PERCCLI tool is installed and configured. Cleaning up temporary files."
echo "---"
echo "Verification Command:"
echo "perccli /c0 show"
echo "---"
else
# If dynamic discovery failed, we skip cleanup and leave temporary files for debugging.
echo "Installation failed due to missing files. Temporary files retained."
fi
else
echo ""
echo "5. Installation failed. The archive '$ARCHIVE_NAME' and temporary directory '$TEMP_DIR' are retained for manual debugging."
echo "The package file is located at: $PACKAGE_FILE"
fi
# ------------------------------------------------------------------------------------------------