add hanamgr
This commit is contained in:
Executable
+279
@@ -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
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user