From 7a693b0fcb407b49e90b99cbe68ede73f2c24046 Mon Sep 17 00:00:00 2001 From: TomiEckert Date: Thu, 16 Apr 2026 15:09:50 +0200 Subject: [PATCH] add hanamgr --- hanamgr.sh | 279 ++++++++++++++++++++++++++++++++++++++++++++++++++ packages.conf | 1 + 2 files changed, 280 insertions(+) create mode 100755 hanamgr.sh diff --git a/hanamgr.sh b/hanamgr.sh new file mode 100755 index 0000000..0a04740 --- /dev/null +++ b/hanamgr.sh @@ -0,0 +1,279 @@ +#!/bin/bash +# Version: 1.0.0 +# Author: Tomi Eckert +# ============================================================================== +# HANA Database Manager Menu (hanamgr.sh) +# +# An interactive command-line menu for managing SAP HANA schemas. +# Provides functionality to Export, Import, Import-Rename, Drop schemas, +# and Rename the B1 company name within a database. +# ============================================================================== + +# --- Configuration --- +# Assuming hdbsql is in the environment PATH +HDBSQL_CMD="hdbsql" + +# --- Helper Functions --- + +# Function to print a separator +print_separator() { + echo "--------------------------------------------------------" +} + +# Function to check if hdbsql is available +check_hdbsql() { + if ! command -v "$HDBSQL_CMD" &> /dev/null; then + echo -e "\033[31m[❌] Error: '$HDBSQL_CMD' command not found. Ensure it is in your PATH.\033[0m" + exit 1 + fi +} + +# Function to execute a SQL query and capture the exit code +execute_sql() { + local key="$1" + local query="$2" + local output + + output=$("$HDBSQL_CMD" -U "$key" "$query" 2>&1) + local exit_code=$? + + if [ $exit_code -eq 0 ]; then + return 0 + else + echo "$output" + return $exit_code + fi +} + +# --- Operation Functions --- + +do_export() { + echo -e "\n\033[1m=== Export Schema ===\033[0m" + read -p "Enter HDBUSERSTORE Key: " user_key + read -p "Enter Schema Name to export: " schema_name + read -p "Enter Target Directory Path: " target_path + read -p "Number of threads (default: 1): " threads + threads=${threads:-1} + read -p "Compress output as tar.gz? (y/N): " compress + + if [[ -z "$user_key" || -z "$schema_name" || -z "$target_path" ]]; then + echo -e "\033[31m[❌] Error: Key, Schema, and Path are required.\033[0m" + return + fi + + echo -e "\n[⬇️] Starting export of schema '${schema_name}'..." + local export_dir="$target_path" + + if [[ "$compress" =~ ^[Yy]$ ]]; then + export_dir=$(mktemp -d "${target_path}/export_${schema_name}_XXXXXXXX") + echo "[ℹ️] Using temporary export directory: ${export_dir}" + else + mkdir -p "$export_dir" + fi + + local query="EXPORT \"${schema_name}\".\"*\" AS BINARY INTO '${export_dir}' WITH REPLACE THREADS ${threads} NO DEPENDENCIES;" + + if execute_sql "$user_key" "$query"; then + echo -e "\033[32m[✅] Successfully exported schema '${schema_name}'.\033[0m" + + if [[ "$compress" =~ ^[Yy]$ ]]; then + local archive_file="${target_path}/${schema_name}_export_$(date +%Y%m%d_%H%M%S).tar.gz" + echo "[📦] Compressing export to ${archive_file}..." + + if command -v pigz &> /dev/null; then + tar -I "pigz -p $threads" -cf "$archive_file" -C "$(dirname "$export_dir")" "$(basename "$export_dir")" + else + tar -czf "$archive_file" -C "$(dirname "$export_dir")" "$(basename "$export_dir")" + fi + + if [ $? -eq 0 ]; then + echo -e "\033[32m[✅] Compression successful.\033[0m" + rm -rf "$export_dir" + else + echo -e "\033[31m[❌] Error: Compression failed.\033[0m" + fi + fi + else + echo -e "\033[31m[❌] Error: Export failed.\033[0m" + if [[ "$compress" =~ ^[Yy]$ ]]; then rm -rf "$export_dir"; fi + fi +} + +do_import() { + local rename_mode="$1" + + if [[ "$rename_mode" == "true" ]]; then + echo -e "\n\033[1m=== Import & Rename Schema ===\033[0m" + else + echo -e "\n\033[1m=== Import Schema ===\033[0m" + fi + + read -p "Enter HDBUSERSTORE Key: " user_key + read -p "Enter Source Schema Name (as it was exported): " schema_name + + local new_schema_name="" + if [[ "$rename_mode" == "true" ]]; then + read -p "Enter NEW Target Schema Name: " new_schema_name + if [[ -z "$new_schema_name" ]]; then + echo -e "\033[31m[❌] Error: New Schema Name is required for renaming.\033[0m" + return + fi + fi + + read -p "Enter Source Path (Directory or .tar.gz): " source_path + read -p "Number of threads (default: 1): " threads + threads=${threads:-1} + read -p "Replace existing objects? (y/N): " replace_opt + + if [[ -z "$user_key" || -z "$schema_name" || -z "$source_path" ]]; then + echo -e "\033[31m[❌] Error: Key, Schema, and Path are required.\033[0m" + return + fi + + echo -e "\n[⬆️] Starting schema import..." + local import_dir="$source_path" + local cleanup_temp=false + + # Handle compressed archives + if [[ -f "$source_path" && "$source_path" == *.tar.gz ]]; then + import_dir=$(mktemp -d "/tmp/import_${schema_name}_XXXXXXXX") + cleanup_temp=true + echo "[ℹ️] Decompressing archive to ${import_dir}..." + + if command -v pigz &> /dev/null; then + tar -I "pigz -p $threads" -xf "$source_path" -C "$import_dir" --strip-components=1 + else + tar -xzf "$source_path" -C "$import_dir" --strip-components=1 + fi + + if [ $? -ne 0 ]; then + echo -e "\033[31m[❌] Error: Failed to decompress archive.\033[0m" + rm -rf "$import_dir" + return + fi + elif [[ ! -d "$import_dir" ]]; then + echo -e "\033[31m[❌] Error: Path is neither a directory nor a valid .tar.gz archive.\033[0m" + return + fi + + local import_options="IGNORE EXISTING" + if [[ "$replace_opt" =~ ^[Yy]$ ]]; then + import_options="REPLACE" + fi + + if [[ "$rename_mode" == "true" ]]; then + import_options="${import_options} RENAME SCHEMA \"${schema_name}\" TO \"${new_schema_name}\"" + fi + + local query="IMPORT \"${schema_name}\".\"*\" AS BINARY FROM '${import_dir}' WITH ${import_options} THREADS ${threads};" + + if execute_sql "$user_key" "$query"; then + echo -e "\033[32m[✅] Successfully imported schema.\033[0m" + else + echo -e "\033[31m[❌] Error: Import failed.\033[0m" + fi + + if [[ "$cleanup_temp" == "true" ]]; then + echo "[🧹] Cleaning up temporary files..." + rm -rf "$import_dir" + fi +} + +do_drop() { + echo -e "\n\033[1m=== Drop Schema ===\033[0m" + read -p "Enter HDBUSERSTORE Key: " user_key + read -p "Enter Schema Name to DROP: " schema_name + + if [[ -z "$user_key" || -z "$schema_name" ]]; then + echo -e "\033[31m[❌] Error: Key and Schema Name are required.\033[0m" + return + fi + + echo -e "\033[31m[⚠️] WARNING: You are about to completely drop the schema '${schema_name}'.\033[0m" + read -p "Are you absolutely sure? Type 'YES' to confirm: " confirm + + if [[ "$confirm" == "YES" ]]; then + echo "[🗑️] Dropping schema '${schema_name}'..." + local query="DROP SCHEMA \"${schema_name}\" CASCADE" + if execute_sql "$user_key" "$query"; then + echo -e "\033[32m[✅] Schema successfully dropped.\033[0m" + else + echo -e "\033[31m[❌] Error: Failed to drop schema.\033[0m" + fi + else + echo "[🤷] Operation cancelled." + fi +} + +do_rename_db() { + echo -e "\n\033[1m=== Rename Database (Company Name) ===\033[0m" + read -p "Enter HDBUSERSTORE Key: " user_key + read -p "Enter Schema Name to update: " schema_name + read -p "Enter NEW Company Name: " new_compny_name + + if [[ -z "$user_key" || -z "$schema_name" || -z "$new_compny_name" ]]; then + echo -e "\033[31m[❌] Error: Key, Schema Name, and New Company Name are required.\033[0m" + return + fi + + echo -e "\n[✍️] Updating company name for '${schema_name}' to '${new_compny_name}'..." + + # Update CINF + echo " -> Updating CINF table..." + local q_cinf="UPDATE \"${schema_name}\".CINF SET \"CompnyName\" = '${new_compny_name}';" + execute_sql "$user_key" "$q_cinf" > /dev/null + + # Update OADM + echo " -> Updating OADM table..." + local q_oadm="UPDATE \"${schema_name}\".OADM SET \"CompnyName\" = '${new_compny_name}', \"PrintHeadr\" = '${new_compny_name}';" + execute_sql "$user_key" "$q_oadm" > /dev/null + + echo -e "\033[32m[✅] Database renamed successfully.\033[0m" +} + +# --- Main Menu Loop --- + +check_hdbsql + +while true; do + echo + echo "========================================================" + echo " HANA Database Manager Menu " + echo "========================================================" + echo "1) Export Schema" + echo "2) Import Schema" + echo "3) Import-Rename Schema" + echo "4) Drop Schema" + echo "5) Rename Database (Update Company Name)" + echo "6) Quit" + echo + read -p "Please select an option (1-6): " choice + + case $choice in + 1) + do_export + ;; + 2) + do_import "false" + ;; + 3) + do_import "true" + ;; + 4) + do_drop + ;; + 5) + do_rename_db + ;; + 6) + echo "[👋] Exiting." + exit 0 + ;; + *) + echo -e "\033[31m[⚠️] Invalid option. Please try again.\033[0m" + ;; + esac + + echo + read -n 1 -s -r -p "Press any key to continue..." +done diff --git a/packages.conf b/packages.conf index 20cbd89..335579d 100644 --- a/packages.conf +++ b/packages.conf @@ -16,3 +16,4 @@ SCRIPT_PACKAGES["monitor"]="Monitor Suite|1.3.1|Scripts for monitoring system he SCRIPT_PACKAGES["keymanager"]="Key Manager|1.2.3|A utility for managing HDB user keys for SAP HANA.|https://git.technopunk.space/tomi/Scripts/raw/branch/main/keymanager.sh" SCRIPT_PACKAGES["cleaner"]="File Cleaner|1.1.0|A simple script to clean up temporary files and logs.|https://git.technopunk.space/tomi/Scripts/raw/branch/main/cleaner.sh" SCRIPT_PACKAGES["hanatool"]="HANA Tool|1.6.0|A command-line tool for various SAP HANA administration tasks.|https://git.technopunk.space/tomi/Scripts/raw/branch/main/hanatool.sh" +SCRIPT_PACKAGES["hanamgr"]="HANA Manager UI|1.0.0|An interactive command-line menu for managing SAP HANA schemas and databases.|https://git.technopunk.space/tomi/Scripts/raw/branch/main/hanamgr.sh"