script-management-cloudpanel/master-gitlab.sh
hhftechnologies 230fbd0b8c update
2024-11-26 17:37:02 +05:30

217 lines
No EOL
6.4 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="HHF Script Management Tool"
BRANCH="main"
forgejo_url="git.hhf.technology"
repo_owner="hhf"
repo_name="script-management-cloudpanel"
# Colors for output formatting
COLOR_RED='\033[0;31m'
COLOR_GREEN='\033[0;32m'
COLOR_BLUE='\033[0;34m'
COLOR_RESET='\033[0m'
# Formatting functions
print_header() {
local script_name=$1
local script_url=$2
printf "\n${COLOR_GREEN}=== %s ===${COLOR_RESET}\n" "$script_name"
printf "${COLOR_BLUE}Script URL: %s${COLOR_RESET}\n\n" "$script_url"
}
format_output() {
local func=$1
local message=$2
printf "${COLOR_BLUE}%s...${COLOR_RESET}\n" "$message"
$func
printf "${COLOR_GREEN}Done!${COLOR_RESET}\n"
}
final_message() {
local script_name=$1
local success=$2
if [ $success -eq 0 ]; then
printf "\n${COLOR_GREEN}=== %s completed successfully ===${COLOR_RESET}\n" "$script_name"
else
printf "\n${COLOR_RED}=== %s failed with errors ===${COLOR_RESET}\n" "$script_name"
fi
}
# Check if the script is being run with sudo
if [ "$EUID" -eq 0 ]; then
ORIGINAL_USER=${SUDO_USER:-$(whoami)}
else
ORIGINAL_USER=$(whoami)
fi
# Function to check and install sudo if not present
install_sudo() {
if ! command which sudo &> /dev/null; then
echo "sudo is not installed. Installing sudo..."
if [ -x "$(command -v apt-get)" ]; then
apt-get update > /dev/null 2>&1 && apt-get install -y sudo > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
yum install -y sudo > /dev/null 2>&1
else
echo "Could not install sudo. Please install it manually."
exit 1
fi
fi
}
# Function to check and install curl if not present
install_curl() {
if ! command -v curl &> /dev/null; then
echo "curl is not installed. Installing curl..."
if [ -x "$(command -v apt-get)" ]; then
sudo apt-get update > /dev/null 2>&1 && sudo apt-get install -y curl > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
sudo yum install -y curl > /dev/null 2>&1
else
echo "Could not install curl. Please install it manually."
exit 1
fi
fi
}
# Function to check and install jq if not present
install_jq() {
if ! command -v jq &> /dev/null; then
echo "jq is not installed. Installing jq..."
if [ -x "$(command -v apt-get)" ]; then
sudo apt-get update > /dev/null 2>&1 && sudo apt-get install -y jq > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
sudo yum install -y jq > /dev/null 2>&1
else
echo "Could not install jq. Please install it manually."
exit 1
fi
fi
}
# Function to clean up temporary files in /tmp
cleanup_tmp_files() {
echo "Cleaning up temporary files..."
sudo rm -rf /tmp/$forgejo_url* > /dev/null 2>&1
echo "Temporary files cleaned."
}
remove_script() {
rm -- "$0" 2>/dev/null
}
# Function to fetch the list of scripts from the repository
fetch_scripts() {
# Forgejo/Gitea API endpoint for listing repository contents
scripts_recursive=$(curl -k -s "https://$forgejo_url/api/v1/repos/$repo_owner/$repo_name/contents?ref=$BRANCH" | jq -r '.[] | select(.type == "file" and .name and (.name | type == "string") and (.name | endswith(".sh"))) | .path')
echo "$scripts_recursive" | sort -u
}
# Function to download and run a selected script
run_script() {
local script_path=$1
local encoded_script_path=$(echo "$script_path" | sed 's/\//%2F/g')
local script_name=$(basename "$script_path")
local url="https://$forgejo_url/$repo_owner/$repo_name/raw/branch/$BRANCH/$script_path"
# If verbose mode, print the URL
if [[ "$verbose" == "true" ]]; then
echo "Requesting URL: $url"
fi
# Create necessary directories for the script
mkdir -p "/tmp/$(dirname "$script_path")"
# Make the request and capture the HTTP status code
http_status=$(curl -k -sL -w "%{http_code}" -o "/tmp/$script_path" "$url")
# If verbose mode, print the HTTP status code
if [[ "$verbose" == "true" ]]; then
echo "Request completed with status code: $http_status"
fi
if [[ "$http_status" == "200" ]]; then
chmod +x "/tmp/$script_path"
sudo bash "/tmp/$script_path" "$ORIGINAL_USER"
else
echo "Failed to download script: $script_name (HTTP status code: $http_status)"
fi
}
# Main function to display the script selection menu and run the selected scripts
run_scripts() {
printf "${COLOR_GREEN}Fetching list of available scripts from Forgejo repository...${COLOR_RESET}\n"
scripts=$(fetch_scripts)
if [ -z "$scripts" ]; then
printf "${COLOR_RED}No scripts found in the repository.${COLOR_RESET}\n"
exit 1
fi
while true; do
printf "${COLOR_BLUE}\nAvailable scripts:${COLOR_RESET}\n"
select script in $scripts "Quit"; do
if [ "$script" == "Quit" ]; then
break 2
elif [ -n "$script" ]; then
printf "${COLOR_BLUE}You selected $script. Running script...${COLOR_RESET}\n"
run_script "$script"
break
else
printf "${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
break
fi
done
}
# Main script logic
clear
# Check for verbose flag
verbose="false"
if [[ "$1" == "-v" ]]; then
verbose="true"
fi
# Print header
print_header "$this_script_name" "$this_script_url"
# Initialize success flag
success=0
install_sudo
install_curl
install_jq
run_scripts
# Cleanup created files
cleanup_tmp_files
# Clean up the master script
format_output remove_script "Cleaning up"
# Print final message
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 with appropriate status
exit $success