| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- #!/bin/bash
- # LinuxGSM command_fastdl.sh module
- # Author: Daniel Gibbs
- # Contributors: http://linuxgsm.com/contrib
- # Website: https://linuxgsm.com
- # Description: Creates a FastDL directory.
- commandname="FASTDL"
- commandaction="Fastdl"
- functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
- fn_firstcommand_set
- check.sh
- # Directories.
- if [ -z "${webdir}" ]; then
- webdir="${rootdir}/public_html"
- fi
- fastdldir="${webdir}/fastdl"
- addonsdir="${systemdir}/addons"
- # Server lua autorun dir, used to autorun lua on client connect to the server.
- luasvautorundir="${systemdir}/lua/autorun/server"
- luafastdlfile="lgsm_cl_force_fastdl.lua"
- luafastdlfullpath="${luasvautorundir}/${luafastdlfile}"
- # Check if bzip2 is installed.
- if [ ! "$(command -v bzip2 2> /dev/null)" ]; then
- fn_print_fail "bzip2 is not installed"
- fn_script_log_fatal "bzip2 is not installed"
- core_exit.sh
- fi
- # Header
- fn_print_header
- echo -e "More info: https://docs.linuxgsm.com/commands/fastdl"
- echo -e ""
- # Prompts user for FastDL creation settings.
- echo -e "${commandaction} setup"
- echo -e "================================="
- # Prompt for clearing old files if directory was already here.
- if [ -d "${fastdldir}" ]; then
- fn_print_warning_nl "FastDL directory already exists."
- echo -e "${fastdldir}"
- echo -e ""
- if fn_prompt_yn "Overwrite existing directory?" Y; then
- fn_script_log_info "Overwrite existing directory: YES"
- else
- core_exit.sh
- fi
- fi
- # Garry's Mod Specific.
- if [ "${shortname}" == "gmod" ]; then
- # Prompt for download enforcer, which is using a .lua addfile resource generator.
- if fn_prompt_yn "Force clients to download files?" Y; then
- luaresource="on"
- fn_script_log_info "Force clients to download files: YES"
- else
- luaresource="off"
- fn_script_log_info "Force clients to download filesr: NO"
- fi
- fi
- # Clears any fastdl directory content.
- fn_clear_old_fastdl() {
- # Clearing old FastDL.
- if [ -d "${fastdldir}" ]; then
- echo -en "clearing existing FastDL directory ${fastdldir}..."
- rm -fR "${fastdldir:?}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}"
- fi
- fi
- }
- fn_fastdl_dirs() {
- # Check and create directories.
- if [ ! -d "${webdir}" ]; then
- echo -en "creating web directory ${webdir}..."
- mkdir -p "${webdir}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Creating web directory ${webdir}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Creating web directory ${webdir}"
- fi
- fi
- if [ ! -d "${fastdldir}" ]; then
- echo -en "creating fastdl directory ${fastdldir}..."
- mkdir -p "${fastdldir}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Creating fastdl directory ${fastdldir}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Creating fastdl directory ${fastdldir}"
- fi
- fi
- }
- # Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906
- fn_human_readable_file_size() {
- local abbrevs=(
- $((1 << 60)):ZB
- $((1 << 50)):EB
- $((1 << 40)):TB
- $((1 << 30)):GB
- $((1 << 20)):MB
- $((1 << 10)):KB
- $((1)):bytes
- )
- local bytes="${1}"
- local precision="${2}"
- if [[ "${bytes}" == "1" ]]; then
- echo -e "1 byte"
- else
- for item in "${abbrevs[@]}"; do
- local factor="${item%:*}"
- local abbrev="${item#*:}"
- if [[ "${bytes}" -ge "${factor}" ]]; then
- size=$(bc -l <<< "${bytes} / ${factor}")
- printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}"
- break
- fi
- done
- fi
- }
- # Provides info about the fastdl directory content and prompts for confirmation.
- fn_fastdl_preview() {
- # Remove any file list.
- if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
- rm -f "${tmpdir:?}/fastdl_files_to_compress.txt"
- fi
- echo -e "analysing required files"
- fn_script_log_info "Analysing required files"
- # Garry's Mod
- if [ "${shortname}" == "gmod" ]; then
- cd "${systemdir}" || exit
- allowed_extentions_array=("*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.svg" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav")
- for allowed_extention in "${allowed_extentions_array[@]}"; do
- fileswc=0
- tput sc
- while read -r ext; do
- ((fileswc++))
- tput rc
- tput el
- echo -e "gathering ${allowed_extention} : ${fileswc}..."
- echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt"
- done < <(find . -type f -iname "${allowed_extention}")
- if [ ${fileswc} != 0 ]; then
- fn_print_ok_eol_nl
- else
- fn_print_info_eol_nl
- fi
- done
- # Source engine
- else
- fastdl_directories_array=("maps" "materials" "models" "particles" "sound" "resources")
- for directory in "${fastdl_directories_array[@]}"; do
- if [ -d "${systemdir}/${directory}" ]; then
- if [ "${directory}" == "maps" ]; then
- local allowed_extentions_array=("*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt")
- elif [ "${directory}" == "materials" ]; then
- local allowed_extentions_array=("*.vtf" "*.vmt" "*.vbf" "*.png" "*.svg")
- elif [ "${directory}" == "models" ]; then
- local allowed_extentions_array=("*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" "*.vmt" "*.vtf")
- elif [ "${directory}" == "particles" ]; then
- local allowed_extentions_array=("*.pcf")
- elif [ "${directory}" == "sound" ]; then
- local allowed_extentions_array=("*.wav" "*.mp3" "*.ogg")
- fi
- for allowed_extention in "${allowed_extentions_array[@]}"; do
- fileswc=0
- tput sc
- while read -r ext; do
- ((fileswc++))
- tput rc
- tput el
- echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..."
- echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt"
- done < <(find "${systemdir}/${directory}" -type f -iname "${allowed_extention}")
- tput rc
- tput el
- echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..."
- if [ ${fileswc} != 0 ]; then
- fn_print_ok_eol_nl
- else
- fn_print_info_eol_nl
- fi
- done
- fi
- done
- fi
- if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
- echo -e "calculating total file size..."
- fn_sleep_time
- totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt")
- # Calculates total file size.
- while read -r dufile; do
- filesize=$(stat -c %s "${dufile}")
- filesizetotal=$((filesizetotal + filesize))
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Calculating total file size."
- core_exit.sh
- fi
- done < "${tmpdir}/fastdl_files_to_compress.txt"
- else
- fn_print_fail_eol_nl "generating file list"
- fn_script_log_fatal "Generating file list."
- core_exit.sh
- fi
- echo -e "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)"
- fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)"
- rm -f "${tmpdir:?}/fastdl_files_to_compress.txt"
- if ! fn_prompt_yn "Continue?" Y; then
- fn_script_log "User exited"
- core_exit.sh
- fi
- }
- # Builds Garry's Mod fastdl directory content.
- fn_fastdl_gmod() {
- cd "${systemdir}" || exit
- for allowed_extention in "${allowed_extentions_array[@]}"; do
- fileswc=0
- tput sc
- while read -r fastdlfile; do
- ((fileswc++))
- tput rc
- tput el
- echo -e "copying ${allowed_extention} : ${fileswc}..."
- cp --parents "${fastdlfile}" "${fastdldir}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}"
- core_exit.sh
- else
- fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}"
- fi
- done < <(find . -type f -iname "${allowed_extention}")
- if [ ${fileswc} != 0 ]; then
- fn_print_ok_eol_nl
- fi
- done
- # Correct addons directory structure for FastDL.
- if [ -d "${fastdldir}/addons" ]; then
- echo -en "updating addons file structure..."
- cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Updating addons file structure"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Updating addons file structure"
- fi
- # Clear addons directory in fastdl.
- echo -en "clearing addons dir from fastdl dir..."
- fn_sleep_time
- rm -fR "${fastdldir:?}/addons"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Clearing addons dir from fastdl dir"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Clearing addons dir from fastdl dir"
- fi
- fi
- # Correct content that may be into a lua directory by mistake like some darkrpmodification addons.
- if [ -d "${fastdldir}/lua" ]; then
- echo -en "correcting DarkRP files..."
- fn_sleep_time
- cp -Rf "${fastdldir}/lua/"* "${fastdldir}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Correcting DarkRP files"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Correcting DarkRP files"
- fi
- fi
- if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
- totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt")
- # Calculates total file size.
- while read -r dufile; do
- filesize=$(du -b "${dufile}" | awk '{ print $1 }')
- filesizetotal=$((filesizetotal + filesize))
- done < "${tmpdir}/fastdl_files_to_compress.txt"
- fi
- }
- fn_fastdl_source() {
- for directory in "${fastdl_directories_array[@]}"; do
- if [ -d "${systemdir}/${directory}" ]; then
- if [ "${directory}" == "maps" ]; then
- local allowed_extentions_array=("*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt")
- elif [ "${directory}" == "materials" ]; then
- local allowed_extentions_array=("*.vtf" "*.vmt" "*.vbf" "*.png" "*.svg")
- elif [ "${directory}" == "models" ]; then
- local allowed_extentions_array=("*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png")
- elif [ "${directory}" == "particles" ]; then
- local allowed_extentions_array=("*.pcf")
- elif [ "${directory}" == "sound" ]; then
- local allowed_extentions_array=("*.wav" "*.mp3" "*.ogg")
- fi
- for allowed_extention in "${allowed_extentions_array[@]}"; do
- fileswc=0
- tput sc
- while read -r fastdlfile; do
- ((fileswc++))
- tput rc
- tput el
- echo -e "copying ${directory} ${allowed_extention} : ${fileswc}..."
- fn_sleep_time
- # get relative path of file in the dir
- tmprelfilepath="${fastdlfile#"${systemdir}/"}"
- copytodir="${tmprelfilepath%/*}"
- # create relative path for fastdl
- if [ ! -d "${fastdldir}/${copytodir}" ]; then
- mkdir -p "${fastdldir}/${copytodir}"
- fi
- cp "${fastdlfile}" "${fastdldir}/${copytodir}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${copytodir}"
- core_exit.sh
- else
- fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${copytodir}"
- fi
- done < <(find "${systemdir}/${directory}" -type f -iname "${allowed_extention}")
- if [ ${fileswc} != 0 ]; then
- fn_print_ok_eol_nl
- fi
- done
- fi
- done
- }
- # Builds the fastdl directory content.
- fn_fastdl_build() {
- # Copy all needed files for FastDL.
- echo -e "copying files to ${fastdldir}"
- fn_script_log_info "Copying files to ${fastdldir}"
- if [ "${shortname}" == "gmod" ]; then
- fn_fastdl_gmod
- fn_fastdl_gmod_dl_enforcer
- else
- fn_fastdl_source
- fi
- }
- # Generate lua file that will force download any file into the FastDL directory.
- fn_fastdl_gmod_dl_enforcer() {
- # Clear old lua file.
- if [ -f "${luafastdlfullpath}" ]; then
- echo -en "removing existing download enforcer: ${luafastdlfile}..."
- rm -f "${luafastdlfullpath:?}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Removing existing download enforcer ${luafastdlfullpath}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Removing existing download enforcer ${luafastdlfullpath}"
- fi
- fi
- # Generate new one if user said yes.
- if [ "${luaresource}" == "on" ]; then
- echo -en "creating new download enforcer: ${luafastdlfile}..."
- touch "${luafastdlfullpath}"
- # Read all filenames and put them into a lua file at the right path.
- while read -r line; do
- echo -e "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}"
- done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n')
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Creating new download enforcer ${luafastdlfullpath}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Creating new download enforcer ${luafastdlfullpath}"
- fi
- fi
- }
- # Compresses FastDL files using bzip2.
- fn_fastdl_bzip2() {
- while read -r filetocompress; do
- echo -en "\r\033[Kcompressing ${filetocompress}..."
- bzip2 -f "${filetocompress}"
- exitcode=$?
- if [ "${exitcode}" != 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fatal "Compressing ${filetocompress}"
- core_exit.sh
- else
- fn_script_log_pass "Compressing ${filetocompress}"
- fi
- done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \))
- fn_print_ok_eol_nl
- }
- # Run functions.
- fn_fastdl_preview
- fn_clear_old_fastdl
- fn_fastdl_dirs
- fn_fastdl_build
- fn_fastdl_bzip2
- # Finished message.
- echo -e "FastDL files are located in:"
- echo -e "${fastdldir}"
- echo -e "FastDL completed"
- fn_script_log_info "FastDL completed"
- core_exit.sh
|