script-management-cloudpanel/master.sh
hhftechnologies a388f4d455 update
2024-11-25 17:06:59 +05:30

227 lines
No EOL
6.9 KiB
Bash

#!/bin/bash
# Run this script with:
# wget https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/master.sh && sudo bash master.sh
# Variables for URLs and script info
this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/master.sh"
this_script_name="Script Management CloudPanel"
formatter_url="https://git.hhf.technology/hhf/TaskFormatter/raw/branch/main/bash_task_formatter/formatter_new.sh"
BRANCH="main"
forgejo_instance="git.hhf.technology"
forgejo_owner="hhf"
forgejo_repo="script-management-cloudpanel"
# Temporary file tracking and log file list
tmp_files=()
master_log_file="/tmp/${this_script_name// /_}_$(date +'%Y%m%d_%H%M%S').log"
script_log_files=()
# Trap to clean up script on exit or interruption
trap remove_script EXIT
# Function to log messages to the master log file
log() {
if [[ "$verbose" == "true" ]]; then
echo -e "$1" | tee -a "$master_log_file"
else
echo -e "$1"
fi
}
# Function to execute and log commands
exec_and_log() {
if [[ "$verbose" == "true" ]]; then
"$@" 2>&1 | tee -a "$master_log_file"
else
"$@"
fi
}
# Download and source the formatter script
exec_and_log wget $formatter_url -O task_formatter.sh > /dev/null 2>&1
source ./task_formatter.sh
# Ensure sudo is available
install_sudo() {
if ! command -v sudo &> /dev/null; then
log "${CROSS_MARK} sudo is not installed. Installing sudo..."
if [ -x "$(command -v apt-get)" ]; then
exec_and_log sudo apt-get update > /dev/null 2>&1 && exec_and_log sudo apt-get install -y sudo > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
exec_and_log sudo yum install -y sudo > /dev/null 2>&1
else
log "${CROSS_MARK} Could not install sudo. Please install it manually."
exit 1
fi
fi
}
# Ensure curl is available
install_curl() {
if ! command -v curl &> /dev/null; then
log "${CROSS_MARK} curl is not installed. Installing curl..."
if [ -x "$(command -v apt-get)" ]; then
exec_and_log sudo apt-get update > /dev/null 2>&1 && exec_and_log sudo apt-get install -y curl > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
exec_and_log sudo yum install -y curl > /dev/null 2>&1
else
log "${CROSS_MARK} Could not install curl. Please install it manually."
exit 1
fi
fi
}
# Ensure jq is available
install_jq() {
if ! command -v jq &> /dev/null; then
log "${CROSS_MARK} jq is not installed. Installing jq..."
if [ -x "$(command -v apt-get)" ]; then
exec_and_log sudo apt-get update > /dev/null 2>&1 && exec_and_log sudo apt-get install -y jq > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
exec_and_log sudo yum install -y jq > /dev/null 2>&1
else
log "${CROSS_MARK} Could not install jq. Please install it manually."
exit 1
fi
fi
}
# Clean up temporary files
cleanup_tmp_files() {
log "${CHECK_MARK} Cleaning up temporary files..."
for tmp_file in "${tmp_files[@]}"; do
exec_and_log sudo rm -rf "$tmp_file"
done
log "${CHECK_MARK} Temporary files cleaned."
}
# Remove the master script and formatter
remove_script() {
if [ -f "$0" ]; then
rm -- "$0"
fi
if [ -f "task_formatter.sh" ]; then
rm task_formatter.sh
fi
log "${CHECK_MARK} Script and formatter cleaned up."
}
# Modified fetch_scripts function for Forgejo API
fetch_scripts() {
# Forgejo API endpoint for getting repository contents
api_url="https://$forgejo_instance/api/v1/repos/$forgejo_owner/$forgejo_repo/git/trees/$BRANCH?recursive=1"
# Get all files recursively and filter for .sh files
all_scripts=$(curl -s "$api_url" | jq -r '.tree[] | select(.path | endswith(".sh")) | .path' | sort -u)
# Log silently without displaying
if [[ "$verbose" == "true" ]]; then
echo "$all_scripts" >> "$master_log_file"
fi
# Return the scripts to be displayed later
echo "$all_scripts"
}
# Download and run the selected script
run_script() {
local script_path=$1
local script_name=$(basename "$script_path")
local url="https://$forgejo_instance/$forgejo_owner/$forgejo_repo/raw/branch/$BRANCH/$script_path"
local script_log_file="/tmp/${script_name}_$(date +'%Y%m%d_%H%M%S').log"
log "Requesting URL: $url"
exec_and_log mkdir -p "/tmp/$(dirname "$script_path")"
tmp_files+=("/tmp/$(dirname "$script_path")")
http_status=$(exec_and_log curl -sL -w "%{http_code}" -o "/tmp/$script_path" "$url")
tmp_files+=("/tmp/$script_path")
log "Request completed with status code: $http_status"
if [[ "$http_status" == "200" ]]; then
exec_and_log chmod +x "/tmp/$script_path"
log "Running script: /tmp/$script_path"
sudo bash "/tmp/$script_path" "$ORIGINAL_USER" > >(tee -a "$script_log_file") 2>&1
script_log_files+=("$script_name: $script_log_file")
else
log "${CROSS_MARK} Failed to download script: $script_name (HTTP status code: $http_status)"
fi
}
# Main function to run selected scripts
run_scripts() {
log "Fetching list of available scripts from Forgejo repository...\n"
scripts=$(fetch_scripts)
if [ -z "$scripts" ]; then
log "${COLOR_RED}No scripts found in the repository.${COLOR_RESET}\n"
exit 1
fi
# Display formatted list to the user
echo -e "${COLOR_BLUE}Available scripts:${COLOR_RESET}"
select script in $scripts "Quit"; do
if [ "$script" == "Quit" ]; then
break
elif [ -n "$script" ]; then
log "You selected $script. Running script...\n"
run_script "$script"
break
else
log "${COLOR_RED}Invalid selection. Please try again.${COLOR_RESET}\n"
fi
done
printf "${COLOR_BLUE}Would you like to run more scripts? (y/n)${COLOR_RESET}\n"
read -r choice
if [[ "$choice" != "y" ]]; then
return
fi
}
# Main script logic
clear
verbose="false"
if [[ "$1" == "-v" ]]; then
verbose="true"
log "Verbose mode enabled. Logging to $master_log_file"
sleep 2
fi
print_header "$this_script_name" "$this_script_url"
success=0
install_sudo
install_curl
install_jq
run_scripts
cleanup_tmp_files
remove_script
# Print all script log file locations at the end
if [[ "${#script_log_files[@]}" -gt 0 ]]; then
echo -e "\nScript execution completed. Log files:"
for log_file in "${script_log_files[@]}"; do
echo -e "$log_file"
done | tee -a "$master_log_file"
fi
if [[ "$verbose" == "true" ]]; then
log "Master log file saved at: $master_log_file"
fi
final_message() {
local script_name=$1
local success=$2
if [[ $success -eq 0 ]]; then
log "${CHECK_MARK} $script_name completed successfully."
else
log "${CROSS_MARK} $script_name encountered errors."
fi
}
exit $success