317 lines
10 KiB
Bash
Executable File
317 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Business Central Backup System - Setup Script
|
|
# Installs dependencies and configures the backup environment
|
|
#
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CONFIG_FILE="${SCRIPT_DIR}/bc-backup.conf"
|
|
TEMPLATE_FILE="${SCRIPT_DIR}/bc-backup.conf.template"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $*"
|
|
}
|
|
|
|
echo_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $*"
|
|
}
|
|
|
|
echo_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $*"
|
|
}
|
|
|
|
echo_error() {
|
|
echo -e "${RED}[ERROR]${NC} $*"
|
|
}
|
|
|
|
check_command() {
|
|
if command -v "$1" &> /dev/null; then
|
|
echo_success "$1 is installed"
|
|
return 0
|
|
else
|
|
echo_warn "$1 is NOT installed"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
echo_info "========================================="
|
|
echo_info "Business Central Backup System Setup"
|
|
echo_info "========================================="
|
|
echo ""
|
|
|
|
# Detect OS
|
|
if [[ -f /etc/os-release ]]; then
|
|
. /etc/os-release
|
|
OS=$ID
|
|
VER=$VERSION_ID
|
|
echo_info "Detected OS: $PRETTY_NAME"
|
|
else
|
|
echo_error "Cannot detect OS"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if running as root
|
|
if [[ $EUID -eq 0 ]]; then
|
|
echo_warn "Running as root. Dependencies will be installed system-wide."
|
|
SUDO=""
|
|
else
|
|
echo_info "Running as regular user. May prompt for sudo password."
|
|
SUDO="sudo"
|
|
fi
|
|
|
|
echo ""
|
|
echo_info "=== Checking Dependencies ==="
|
|
echo ""
|
|
|
|
# Track what needs to be installed
|
|
MISSING_DEPS=()
|
|
|
|
# Check PowerShell
|
|
echo_info "Checking PowerShell..."
|
|
if ! check_command pwsh; then
|
|
MISSING_DEPS+=("pwsh")
|
|
fi
|
|
|
|
# Check GPG
|
|
echo_info "Checking GPG..."
|
|
if ! check_command gpg; then
|
|
MISSING_DEPS+=("gpg")
|
|
fi
|
|
|
|
# Check AWS CLI
|
|
echo_info "Checking AWS CLI..."
|
|
if ! check_command aws; then
|
|
MISSING_DEPS+=("awscli")
|
|
fi
|
|
|
|
# Check curl and wget
|
|
echo_info "Checking curl..."
|
|
check_command curl || MISSING_DEPS+=("curl")
|
|
|
|
echo_info "Checking wget..."
|
|
check_command wget || MISSING_DEPS+=("wget")
|
|
|
|
# Check jq (useful for debugging)
|
|
echo_info "Checking jq (optional)..."
|
|
check_command jq || echo_warn "jq not installed (optional, useful for JSON parsing)"
|
|
|
|
# Install missing dependencies
|
|
if [[ ${#MISSING_DEPS[@]} -gt 0 ]]; then
|
|
echo ""
|
|
echo_warn "Missing dependencies: ${MISSING_DEPS[*]}"
|
|
echo ""
|
|
read -p "Install missing dependencies? (y/n) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
for dep in "${MISSING_DEPS[@]}"; do
|
|
echo_info "Installing $dep..."
|
|
|
|
case $dep in
|
|
pwsh)
|
|
# Install PowerShell
|
|
case $OS in
|
|
ubuntu|debian)
|
|
# Download Microsoft repository GPG keys
|
|
wget -q "https://packages.microsoft.com/config/$OS/$VER/packages-microsoft-prod.deb" -O /tmp/packages-microsoft-prod.deb
|
|
$SUDO dpkg -i /tmp/packages-microsoft-prod.deb
|
|
rm /tmp/packages-microsoft-prod.deb
|
|
$SUDO apt-get update
|
|
$SUDO apt-get install -y powershell
|
|
;;
|
|
centos|rhel|fedora)
|
|
$SUDO rpm --import https://packages.microsoft.com/keys/microsoft.asc
|
|
curl -o /tmp/packages-microsoft-prod.rpm "https://packages.microsoft.com/config/$OS/$VER/packages-microsoft-prod.rpm"
|
|
$SUDO rpm -i /tmp/packages-microsoft-prod.rpm
|
|
rm /tmp/packages-microsoft-prod.rpm
|
|
$SUDO yum install -y powershell
|
|
;;
|
|
*)
|
|
echo_error "Unsupported OS for automatic PowerShell installation"
|
|
echo_info "Please install PowerShell manually: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux"
|
|
;;
|
|
esac
|
|
;;
|
|
gpg)
|
|
# Install GPG
|
|
case $OS in
|
|
ubuntu|debian)
|
|
$SUDO apt-get update
|
|
$SUDO apt-get install -y gnupg
|
|
;;
|
|
centos|rhel|fedora)
|
|
$SUDO yum install -y gnupg2
|
|
;;
|
|
*)
|
|
echo_error "Unsupported OS for automatic GPG installation"
|
|
;;
|
|
esac
|
|
;;
|
|
awscli)
|
|
# Install AWS CLI v2
|
|
echo_info "Installing AWS CLI v2..."
|
|
case $(uname -m) in
|
|
x86_64)
|
|
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "/tmp/awscliv2.zip"
|
|
;;
|
|
aarch64)
|
|
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "/tmp/awscliv2.zip"
|
|
;;
|
|
*)
|
|
echo_error "Unsupported architecture for AWS CLI"
|
|
continue
|
|
;;
|
|
esac
|
|
unzip -q /tmp/awscliv2.zip -d /tmp
|
|
$SUDO /tmp/aws/install
|
|
rm -rf /tmp/aws /tmp/awscliv2.zip
|
|
;;
|
|
curl)
|
|
case $OS in
|
|
ubuntu|debian)
|
|
$SUDO apt-get update
|
|
$SUDO apt-get install -y curl
|
|
;;
|
|
centos|rhel|fedora)
|
|
$SUDO yum install -y curl
|
|
;;
|
|
esac
|
|
;;
|
|
wget)
|
|
case $OS in
|
|
ubuntu|debian)
|
|
$SUDO apt-get update
|
|
$SUDO apt-get install -y wget
|
|
;;
|
|
centos|rhel|fedora)
|
|
$SUDO yum install -y wget
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
done
|
|
else
|
|
echo_error "Cannot proceed without required dependencies"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo_success "All required dependencies are installed"
|
|
echo ""
|
|
|
|
# Create directory structure
|
|
echo_info "=== Setting up directory structure ==="
|
|
mkdir -p "${SCRIPT_DIR}/logs"
|
|
mkdir -p "${SCRIPT_DIR}/temp"
|
|
echo_success "Created logs/ and temp/ directories"
|
|
|
|
# Set up configuration file
|
|
echo ""
|
|
echo_info "=== Configuration Setup ==="
|
|
|
|
if [[ -f "${CONFIG_FILE}" ]]; then
|
|
echo_warn "Configuration file already exists: ${CONFIG_FILE}"
|
|
read -p "Overwrite with template? (y/n) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
cp "${TEMPLATE_FILE}" "${CONFIG_FILE}"
|
|
echo_success "Configuration template copied to bc-backup.conf"
|
|
fi
|
|
else
|
|
cp "${TEMPLATE_FILE}" "${CONFIG_FILE}"
|
|
echo_success "Configuration template copied to bc-backup.conf"
|
|
fi
|
|
|
|
# Make scripts executable
|
|
echo ""
|
|
echo_info "=== Setting permissions ==="
|
|
chmod +x "${SCRIPT_DIR}/bc-backup.sh"
|
|
chmod +x "${SCRIPT_DIR}/bc-export.ps1"
|
|
chmod 600 "${CONFIG_FILE}" # Restrict config file permissions
|
|
echo_success "Scripts are now executable"
|
|
echo_success "Config file permissions set to 600 (owner read/write only)"
|
|
|
|
# Test AWS CLI configuration
|
|
echo ""
|
|
echo_info "=== Testing AWS CLI ==="
|
|
if [[ -f "${CONFIG_FILE}" ]]; then
|
|
# Source config to test
|
|
if grep -q 'AWS_ACCESS_KEY_ID=""' "${CONFIG_FILE}"; then
|
|
echo_warn "AWS credentials not yet configured in bc-backup.conf"
|
|
else
|
|
echo_info "AWS CLI appears to be configured in bc-backup.conf"
|
|
fi
|
|
fi
|
|
|
|
# S3 bucket object lock check
|
|
echo ""
|
|
echo_info "=== Important: S3 Object Lock Configuration ==="
|
|
echo_warn "Your S3 bucket MUST have Object Lock enabled for immutability"
|
|
echo_info "Object Lock can only be enabled when creating a bucket"
|
|
echo ""
|
|
echo_info "To create an S3 bucket with Object Lock (AWS example):"
|
|
echo " aws s3api create-bucket --bucket YOUR-BUCKET-NAME \\"
|
|
echo " --region YOUR-REGION \\"
|
|
echo " --create-bucket-configuration LocationConstraint=YOUR-REGION \\"
|
|
echo " --object-lock-enabled-for-bucket"
|
|
echo ""
|
|
echo_info "Then configure default retention:"
|
|
echo " aws s3api put-object-lock-configuration --bucket YOUR-BUCKET-NAME \\"
|
|
echo " --object-lock-configuration '{\"ObjectLockEnabled\":\"Enabled\",\"Rule\":{\"DefaultRetention\":{\"Mode\":\"COMPLIANCE\",\"Days\":30}}}'"
|
|
echo ""
|
|
|
|
# Setup cron job
|
|
echo ""
|
|
echo_info "=== Cron Job Setup ==="
|
|
echo_info "To run backups hourly, add this to your crontab:"
|
|
echo ""
|
|
echo " 0 * * * * ${SCRIPT_DIR}/bc-backup.sh >> ${SCRIPT_DIR}/logs/cron.log 2>&1"
|
|
echo ""
|
|
read -p "Add this cron job now? (y/n) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
CRON_CMD="0 * * * * ${SCRIPT_DIR}/bc-backup.sh >> ${SCRIPT_DIR}/logs/cron.log 2>&1"
|
|
(crontab -l 2>/dev/null | grep -v "${SCRIPT_DIR}/bc-backup.sh"; echo "$CRON_CMD") | crontab -
|
|
echo_success "Cron job added successfully"
|
|
echo_info "View your crontab with: crontab -l"
|
|
else
|
|
echo_info "Skipped cron job setup. You can add it manually later."
|
|
fi
|
|
|
|
# Final instructions
|
|
echo ""
|
|
echo_info "========================================="
|
|
echo_success "Setup completed successfully!"
|
|
echo_info "========================================="
|
|
echo ""
|
|
echo_info "Next steps:"
|
|
echo ""
|
|
echo "1. Edit configuration file:"
|
|
echo " nano ${CONFIG_FILE}"
|
|
echo ""
|
|
echo "2. Fill in the following required values:"
|
|
echo " - AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET"
|
|
echo " - BC_ENVIRONMENT_NAME"
|
|
echo " - ENCRYPTION_PASSPHRASE (generate with: openssl rand -base64 32)"
|
|
echo " - S3_BUCKET, S3_ENDPOINT"
|
|
echo " - AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY"
|
|
echo ""
|
|
echo "3. Test the backup manually:"
|
|
echo " ${SCRIPT_DIR}/bc-backup.sh"
|
|
echo ""
|
|
echo "4. Check logs for any issues:"
|
|
echo " tail -f ${SCRIPT_DIR}/logs/backup.log"
|
|
echo ""
|
|
echo_warn "IMPORTANT: Store your ENCRYPTION_PASSPHRASE securely!"
|
|
echo_warn "Without it, you cannot decrypt your backups."
|
|
echo ""
|