diff --git a/master-forgejo.sh b/master-forgejo.sh new file mode 100644 index 0000000..1fae718 --- /dev/null +++ b/master-forgejo.sh @@ -0,0 +1,217 @@ +#!/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 \ No newline at end of file