update.sh - Update AMXX to latest version

Update AMXX to the latest version from terminal
For more information and examples
See https://forums.alliedmods.net/showthread.php?t=325181
This commit is contained in:
CrXane 2020-06-18 23:52:24 -04:00 committed by GitHub
parent ed1ab00faf
commit 1ed7f47352
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

572
plugins/update.sh Normal file
View File

@ -0,0 +1,572 @@
#!/bin/bash
# AMX Mod X
#
# by the AMX Mod X Development Team
# originally developed by OLO
#
# This file is part of AMX Mod X.
#####################
# REQUIRED PACKAGES #
#####################
# wget
# tar if linux
# unzip if mac
#####################
# GENERAL FUNCTIONS #
#####################
# Quit script
quit_script () {
if (( $# != 0 )); then
echo "$@"; fi
echo "Exiting..."
exit 1
}
# Get network status
network_status () {
echo -ne "Please wait\r"
connection=$(wget -qO- google.com)
if [ $? -eq 0 ]; then
return 0;
else quit_script "Internet connection is required"; fi
}
# Checks if folder exists
exists () {
test -e $1
}
# Returns OS' name
get_os_name () {
script_path="$(dirname $(readlink -f $0))"
cd $script_path
os="$(uname -s)"
case "$os" in
"Linux" ) os="linux" ;;
"Darwin" ) os="mac" ;;
*) quit_script "Unsupported OS" ;;
esac
}
# Checks if app is installed
check_for_app () {
if [ $(which $1) ]; then
return 0;
else quit_script "Script requires $1 package"; fi
}
# Checks if variable is number
is_number () {
if ! [[ $1 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
return 1
else return 0; fi
}
#####################
# ARGUMENT CHECKING #
#####################
# Checks if exists any argument
check_for_arguments () {
if [ $# != 0 ]; then
return 0; # Argument exist
else return 1; fi # Argument doesn't exist
}
# Check if argument is a command
check_for_commands () {
if [[ $1 == -* && $1 != *.* ]]; then
return 0; # Argument is command
else return 1; fi
}
#####################
# SETUP AUTOUPDATER #
#####################
# Data saving
__setup_save_le_data () {
echo "game=$1" > .save_data
echo "amxx=$2" >> .save_data
echo "build=$3" >> .save_data
echo "configs=$4" >> .save_data
}
# Save confiuration file
__setup_save_data () {
if [ "$setup_amxx" == "1.9" ]; then configs="0000000100000000"
else configs="000000000000000"; fi
__setup_save_le_data "$game" "$setup_amxx" "$setup_build" "$configs"
echo -e "\nConfigs: $configs"
echo -e "\nConfiguration file saved in" && echo "$script_path/.save_data"
}
# Get amxx verison
__setup_get_amxx_version () {
setup_amxx=$(./amxxpc -q | head -n 1 | grep -o -P '(?<=Compiler ).{3}(?=.*)')
if [ "${setup_amxx: -1}" == "1" ]; then setup_amxx="1.10"; fi
setup_build=$(./amxxpc -q | head -n 1 | tail -c 5)
echo "AMX MOD X Version: $setup_amxx $setup_build"
}
# Check if amxxpc exists
__setup_check_for_amxxpc () {
if ! exists amxxpc; then
quit_script "amxxpc does not exists"; fi
}
# Autoupdater setup
__setup () {
__setup_check_for_amxxpc
__update_list_games 2
__update_game 1
__setup_get_amxx_version
__setup_save_data
}
#####################
# AUTOMATED UPDATE #
#####################
# Check for new release
__auto_check_if_new_version () {
latestbuild=$(wget -qO- https://www.amxmodx.org/amxxdrop/$saved_amxx/amxmodx-latest-base-$os | grep -o -P '(?<=git).*(?=-base)')
if [ "$latestbuild" == "$saved_build" ]; then
echo "You are already running the latest version of AMXX"
quit_script "AMX MOD X $saved_amxx $latestbuild"
else
echo "You are currently running AMXX $saved_amxx $saved_build"
echo "Newest version of AMXX $saved_amxx $latestbuild"
echo "Running autoupdater"
fi
}
# Check if configuration is valid
__auto_check_if_valid_data () {
case "$saved_game" in
"cstrike" | "dod" | "cstrike" | "esf" | "halflife" | "ns" | "tfc" | "ts" ) : ;;
*)
echo "Could not autoupdate"
echo "Game mod is not valid, please modify .save_data or"
quit_script "run $0 --upgrade to fix this issue"
esac
if [ "$saved_amxx" != "1.9" -a "$saved_amxx" != "1.10" ]; then
echo "Could not autoupdate"
echo "AMXX version is not valid, please modify .save_data or"
quit_script "run $0 --upgrade to fix this issue"; fi
if (( ${#saved_configs[@]} > 16 )) || (( ${#saved_configs[@]} < 15 )); then
echo "Could not autoupdate"
echo "Configs configuration is not formated correctly, please modify .save_data or"
quit_script "run $0 --upgrade to fix this issue"
fi
}
# Load saved configuration
__auto_load_saved_data () {
if exists .save_data; then
saved_game=$( head -1 .save_data | sed 's/^.\{5\}//')
saved_amxx=$( head -2 .save_data | tail -1 | sed 's/^.\{5\}//')
saved_build=$( head -3 .save_data | tail -1 | sed 's/^.\{6\}//')
saved_configs=$(head -4 .save_data | tail -1 | sed 's/^.\{8\}//')
if [ "$saved_game" == "" -o "$saved_amxx" == "" -o "$saved_build" == "" -o "$saved_configs" == "" ]; then
echo "Could not autoupdate"
echo ".save_data configuration is not formated correctly, please modify the file or"
quit_script "run $0 --upgrade to fix this issue"
else
__update_files_to_array
for (( f = 0; f < ${#saved_configs}; f++ )); do
modify[i]=$(echo "${saved_configs:$i:1}")
done
fi
else
echo ".save_data file does not exist"
quit_script "Please use $0 --update or see $0 --help for more information"
fi
}
# Automatic updater
__auto () {
__auto_load_saved_data
__auto_check_if_valid_data
__auto_check_if_new_version
__update_get_base 1 && game=$saved_game
__update_game_files $game
__update_finish 1
}
#####################
# UPDATE FUNCTIONS #
#####################
# END
__update_finish () {
path="update_files/addons/amxmodx"
if check_for_arguments "$@"; then
if (( ver != 2 )); then
cp $path/configs/hamdata.ini ../configs
configs+="0000000100000000"
else configs+="000000000000000"; fi
rm -rf $path/configs
else
for ((i = 0; i < length; i++)); do
if [ "${modify[i]}" == "0" ]; then
file_del="${dir}/${files[i]}"
rm -f $file_del
else
if exists ../configs/${files[i]}; then
test -e ../configs/backup || mkdir ../configs/backup
cp ../configs/${files[i]} ../configs/backup
fi
fi
configs+=${modify[i]}
done
fi
rm -rf $path/logs
cp -r $path/* ../
rm -rf update_files
while IFS= read -r id; do
rm -f $id
done< <(ls | grep index.html)
echo -ne "#################### (100%)\r"
echo -e "\nSuccessfully installed"
echo $(wget -qO- https://www.neobox.net/stats/) "successful updates to date."
le_build=$(wget -qO- https://www.amxmodx.org/amxxdrop/$version/amxmodx-latest-base-$os | grep -o -P '(?<=git).*(?=-base)')
__setup_save_le_data "$game" "$version" "$le_build" "$configs"
exit 1
}
# Reload table
__update_configs_reload_table () {
for ((i = 0; i < length; i++)); do
current=${#files[i]}
file_num=$((i+1))
if (( file_num < 10)); then
echo -n " $file_num) ${files[i]}"
else echo -n "$file_num) ${files[i]}"; fi
for ((j = 0; j < $(($largest-$current+1)); j++)); do
echo -n " "; done
if [ "${modify[i]}" -eq "1" ]; then
echo "[replace]"
else echo "[x]"; fi
done
if (($# == 0)); then __update_config_key_select; fi
}
# Multiselect modification
__update_configs_select_type () {
for ((i = 0; i < length; i++)); do
modify[i]=$1;
done
echo && __update_configs_reload_table
}
# Single file modification
__update_configs_file () {
if (( $1 < 1 )) || (( $1 > length )); then
echo -e "\n Number out of boundaries\n";
else
arr=$(($1-1))
if [ "${modify[arr]}" == "1" ]; then
modify[arr]=0
else modify[arr]=1; fi
echo -e "\n Modified ${files[arr]} ${modify[arr]}\n"
fi
__update_configs_reload_table
}
# Read key
__update_config_key_select () {
echo -e "\nPlease select which files you want to replace or not"
echo -n "00) Continue | 88) Deselect All | 99) Select All | Number: "; read -n 2 fileedit
case $fileedit in
00 ) echo && __update_finish ;;
88 ) __update_configs_select_type 0 ;;
99 ) __update_configs_select_type 1 ;;
* ) if (( fileedit > 0 )) || (( fileedit < length )) && [ "$fileedit" != "" ]; then
__update_configs_file $fileedit
else __update_configs_reload_table; fi
;; esac
}
# Push files into array
__update_files_to_array () {
files=()
modify=()
while IFS= read -r line; do
files+=("$line")
done< <(ls $dir)
length=${#files[@]}
}
# Get largest number
__update_get_largest_number () {
dir="update_files/addons/amxmodx/configs"
largest=0
__update_files_to_array
for ((i = 0; i < length; i++)); do
current=${#files[i]}
if [[ "${files[i]}" == "hamdata.ini" ]]; then
modify[i]=1
else modify[i]=0; fi
if (( $current > $largest )); then
largest=$current; fi
done
}
# configs folder Settings
__update_configs_table () {
__update_get_largest_number
__update_configs_reload_table 1
__update_config_key_select
}
# Replace specific files in configs directory
__update_configs () {
echo -ne "\nReplace specific files in configs folder ? "
read -p "[Y/n] (default: n) : " -n 1 configsedit
case "$configsedit" in
"Y" | "y" ) echo && __update_configs_table ;;
"" | "N" | "n" ) echo && __update_finish 1 ;;
* ) echo -e "\n\n Please type a valid character" && __update_configs
;; esac
}
# Install Game package
__update_game_files () {
if [ -n "$1" -a "$1" != "halflife" ] ; then
echo -ne "############ (60%)\r"
latest=$(wget -qO- https://www.amxmodx.org/amxxdrop/$version/amxmodx-latest-$1-$os)
test -e $latest && rm -f $latest
echo -ne "############## (70%)\r"
wget -q https://www.amxmodx.org/amxxdrop/$version/$latest
echo -ne "################ (80%)\r"
if [ "$os" == "linux" ]; then tar -xzf $latest -C update_files
else unzip $latest -d update_files; fi
rm -f $latest
echo -ne "################## (90%)\r"
fi
}
# Install Base package
__update_get_base () {
if [ "$os" == "linux" ]; then check_for_app tar
else check_for_app unzip; fi
exists update_files && rm -rf update_files
mkdir update_files
if check_for_arguments "$@"; then version=$saved_amxx; fi
latest=$(wget -qO- https://www.amxmodx.org/amxxdrop/$version/amxmodx-latest-base-$os)
test -e $latest && rm -f $latest
echo -ne "#### (20%)\r"
wget -q https://www.amxmodx.org/amxxdrop/$version/$latest
echo -ne "######## (40%)\r"
if [ "$os" == "linux" ]; then tar -xzf $latest -C update_files
else unzip $latest -d update_files; fi
echo -ne "########## (50%)\r"
rm -f $latest
}
# Update Game files
__update_game () {
if ! check_for_arguments "$@"; then
echo -ne "\nUpdating AMXX $version "; else echo -ne "\n\nGame Selected: "; fi
case $game in
1 ) echo -e "Counter-Strike\n"; game="cstrike" ;;
2 ) echo -e "Day of Defeat\n"; game="dod" ;;
3 ) echo -e "Earth's Special Forces\n"; game="esf" ;;
4 ) echo -e "Half-Life\n"; game="halflife" ;;
5 ) echo -e "Natural Selection\n"; game="ns" ;;
6 ) echo -e "Team Fortress Classic\n"; game="tfc" ;;
7 ) echo -e "The Specialists\n"; game="ts" ;;
*) esac
if ! check_for_arguments "$@"; then
echo -ne "## (10%)\r"; fi
}
# Lists Notes before updating
__update_list_notes () {
if ! check_for_arguments "$@"; then echo; fi
echo -e "\nBefore updating files, note that all modifications"
echo " of default files will be reset"
echo -e "Default files are shown below\r"
if (( ver != 2 )); then
echo " configs / hamdata.ini"; fi
echo " data / all default files"
echo " dlls / all default files"
echo " modules / all default files"
echo " plugins / all default files"
echo -e " scripting / all default files\n"
read -p "Continue ? [Y/n] (default: Y) : " -n 1 answer
if [ "$answer" == "Y" -o "$answer" == "y" -o "$answer" == "" ]; then return 0;
elif [ "$answer" == "N" -o "$answer" == "n" ]; then quit_script ""
else
echo -e "\n\n Please select a valid character"
__update_list_notes 1
fi
}
# Lists AMX MOD X Versions
__update_amxx_version () {
echo -e "\nAMX MOD X Version"
echo " 1) 1.9"
echo " 2) 1.10"
echo " 0) Exit"
read -p "Number (default: 1) : " -n 1 ver
if ! is_number $ver; then
if [ "$ver" == "" ]; then ver=1
else echo -e "\n\n Please select a valid number" && __update_amxx_version; fi
elif (( ver == 0 )); then quit_script ""
elif (( ver < 0 )) || (( ver > 2 )); then
echo -e "\n\n Please select a valid number" && __update_amxx_version; fi
case $ver in
1 ) version="1.9" ;;
2 ) version="1.10" ;;
*) esac
}
# Lists all Games
__update_list_games () {
if ! check_for_arguments "$@"; then
if [ "$1" == "1" ]; then
check_for_app wget
network_status
repeat=1
else repeat=2; fi
else repeat=1; fi
echo "Please select the Game"
echo " 1) Counter-Strike"
echo " 2) Day of Defeat"
echo " 3) Earth's Special Forces"
echo " 4) Half-Life"
echo " 5) Natural Selection"
echo " 6) Team Fortress Classic"
echo " 7) The Specialists"
echo " 0) Exit"
read -p "Number: (default: 1) : " -n 1 game
if ! is_number $game; then
if [ "$game" == "" ]; then game=1;
else echo -e "\n\n Please select a valid number\n" && __update_list_games $repeat; fi
elif (( game == 0 )); then quit_script ""
elif (( game < 0 )) || (( game > 7 )); then
echo -e "\n\n Please select a valid number\n" && __update_list_games $repeat; fi
}
# Check if directories exists
__update_check_if_gameserver () {
if ! exists "../configs" && ! exists "../data" -a ! exists "../dlls" -a ! exists "../modules" -a ! exists "../plugins"; then
echo "Make sure that folders configs, data, dlls, modules and plugins"
quit_script " exist and run the script again"
fi
}
# UPDATE
__update () {
__update_check_if_gameserver
__update_list_games
__update_amxx_version
__update_list_notes
__update_game
__update_get_base
__update_game_files $game
__update_configs
}
#####################
# COMMAND FUNCTIONS #
#####################
# HELP
__help () {
echo " Usage:"
echo "--help (-h) : This menu"
echo "--latest (-l) : Latest AMX MOD X version"
echo "--update (-u) : Update files"
echo "--auto (-a) : Autoupdates AMXX"
echo "--setup (-s) : Set up autoupdater"
}
# LATEST
__latest () {
network_status
echo -e "Latest AMX MOD X version"
echo -n "1.9 Build: "
echo $(wget -qO- https://www.amxmodx.org/amxxdrop/1.9/amxmodx-latest-base-$os | grep -o -P '(?<=git).*(?=-base)')
echo -n "1.10 Build: "
echo $(wget -qO- https://www.amxmodx.org/amxxdrop/1.10/amxmodx-latest-base-$os | grep -o -P '(?<=git).*(?=-base)')
}
# Execute command
execute_command () {
case "$1" in
"--help" | "-h" ) __help ;;
"--latest" | "-l" ) __latest ;;
"--update" | "-u" ) __update ;;
"--auto" | "-a" ) __auto ;;
"--setup" | "-s" ) __setup ;;
*)
echo " $1 is not a valid command"
echo " Type \"$0 --help\" to see more information"
esac
}
#####################
# MAIN FUNCTION #
#####################
# Main function
main () {
get_os_name
if check_for_arguments "$@"; then
if check_for_commands "$1"; then
execute_command $1
exit
else
echo " $1 not a valid argument"
echo " Type \"$0 --help\" to see more information"
fi
else __help; fi
}
#####################
# EXECUTE MAIN FUNC #
#####################
main "$@"
#####################