#!/bin/bash # ============================================================================= # SAP HANA Monitoring Scripts Installer # Downloads and installs HANA monitoring scripts to /root/hana-scripts/ # Preserves existing configuration if hana.conf already exists # ============================================================================= set -e # Configuration INSTALL_DIR="/root/hana-scripts" REPO_URL="https://git.technopunk.space/tomi/hana-scripts/raw/branch/main" BACKUP_DIR="/root/hana-scripts-backup-$(date +%Y%m%d_%H%M%S)" # List of files to install FILES=( "hana.conf" "hana_lib.sh" "hana_disk.sh" "hana_backup.sh" "hana_log_segments.sh" "hana_processes.sh" "hana_queue.sh" "sld_watchdog.sh" ) # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Logging functions log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Check if running as root check_root() { if [ "$EUID" -ne 0 ]; then log_error "This script must be run as root" exit 1 fi } # Check if curl is available check_curl() { if ! command -v curl &> /dev/null; then log_error "curl is required but not installed. Please install curl first." exit 1 fi log_info "curl is available" } # Create backup of existing installation backup_existing() { if [ -d "$INSTALL_DIR" ]; then log_info "Existing installation found at $INSTALL_DIR" log_info "Creating backup at $BACKUP_DIR..." mkdir -p "$BACKUP_DIR" cp -r "$INSTALL_DIR"/* "$BACKUP_DIR"/ 2>/dev/null || true # Save the existing hana.conf separately for easy access if [ -f "$INSTALL_DIR/hana.conf" ]; then cp "$INSTALL_DIR/hana.conf" "$BACKUP_DIR/hana.conf.preserved" log_success "Existing hana.conf backed up to $BACKUP_DIR/hana.conf.preserved" fi log_success "Backup completed" fi } # Create installation directory create_install_dir() { log_info "Creating installation directory: $INSTALL_DIR" mkdir -p "$INSTALL_DIR" } # Download a file from the repository download_file() { local filename="$1" local url="${REPO_URL}/${filename}" local dest="${INSTALL_DIR}/${filename}" log_info "Downloading ${filename}..." if curl -sSf -o "$dest" "$url"; then log_success "Downloaded ${filename}" return 0 else log_error "Failed to download ${filename}" return 1 fi } # Restore preserved configuration restore_config() { local preserved_config="$BACKUP_DIR/hana.conf.preserved" if [ -f "$preserved_config" ]; then log_info "Preserving existing hana.conf..." # Download the new config to a temp location local temp_config="${INSTALL_DIR}/hana.conf.new" if curl -sSf -o "$temp_config" "${REPO_URL}/hana.conf"; then # Compare configs to check for new settings if ! diff -q "$preserved_config" "$temp_config" > /dev/null 2>&1; then log_warning "Configuration file has updates. Merging changes..." # Keep the old config but add any new settings from the new config # First, copy the preserved config cp "$preserved_config" "$dest" # Extract new settings from the new config (settings not in old config) # This is a simple merge - new variables are appended if not present while IFS= read -r line; do # Skip comments and empty lines if [[ "$line" =~ ^[[:space:]]*# ]] || [[ -z "${line// }" ]]; then continue fi # Extract variable name var_name="${line%%=*}" var_name="${var_name// /}" # Check if variable exists in preserved config if ! grep -q "^${var_name}=" "$preserved_config" 2>/dev/null; then log_info "Adding new configuration: ${var_name}" echo "" >> "$dest" echo "$line" >> "$dest" fi done < "$temp_config" log_success "Configuration merged successfully" else log_info "No configuration changes detected, keeping existing config" cp "$preserved_config" "$dest" fi # Clean up temp file rm -f "$temp_config" else log_warning "Could not download new hana.conf, keeping existing config" cp "$preserved_config" "$dest" fi return 0 fi return 1 } # Set executable permissions set_permissions() { log_info "Setting executable permissions..." chmod +x "${INSTALL_DIR}"/*.sh 2>/dev/null || true log_success "Permissions set" } # Verify installation verify_installation() { log_info "Verifying installation..." local errors=0 for file in "${FILES[@]}"; do if [ ! -f "${INSTALL_DIR}/${file}" ]; then log_error "Missing file: ${file}" errors=$((errors + 1)) fi done if [ $errors -eq 0 ]; then log_success "Installation verified successfully" return 0 else log_error "Verification failed with ${errors} errors" return 1 fi } # Print summary print_summary() { echo "" echo "==============================================" echo " Installation Complete!" echo "==============================================" echo "" echo "Installation directory: ${INSTALL_DIR}" echo "" if [ -d "$BACKUP_DIR" ]; then echo "Backup location: ${BACKUP_DIR}" echo "" fi echo "Next steps:" echo " 1. Review and update ${INSTALL_DIR}/hana.conf with your settings" echo " 2. Make scripts executable: chmod +x ${INSTALL_DIR}/*.sh" echo " 3. Test individual scripts manually" echo " 4. Set up cron jobs for automated monitoring" echo "" echo "Example cron entries (run crontab -e):" echo " */5 * * * * ${INSTALL_DIR}/hana_disk.sh" echo " */5 * * * * ${INSTALL_DIR}/hana_processes.sh" echo " */10 * * * * ${INSTALL_DIR}/hana_backup.sh" echo " */5 * * * * ${INSTALL_DIR}/hana_queue.sh" echo " */5 * * * * ${INSTALL_DIR}/hana_log_segments.sh" echo " */5 * * * * ${INSTALL_DIR}/sld_watchdog.sh" echo "" } # Main installation function main() { echo "" echo "==============================================" echo " SAP HANA Monitoring Scripts Installer" echo "==============================================" echo "" # Pre-flight checks check_root check_curl # Backup existing installation backup_existing # Create installation directory create_install_dir # Download all files local download_errors=0 for file in "${FILES[@]}"; do if [ "$file" == "hana.conf" ]; then # Handle config file specially if ! restore_config; then # No existing config, download fresh download_file "$file" || download_errors=$((download_errors + 1)) fi else download_file "$file" || download_errors=$((download_errors + 1)) fi done if [ $download_errors -gt 0 ]; then log_error "Failed to download ${download_errors} files" exit 1 fi # Set permissions set_permissions # Verify installation if ! verify_installation; then exit 1 fi # Print summary print_summary } # Run main function main "$@"