403Webshell
Server IP : 193.86.120.172  /  Your IP : 216.73.216.67
Web Server : Apache/2.4.63 (Unix)
System : Linux JServices 3.10.108 #86003 SMP Wed Oct 22 13:20:46 CST 2025 x86_64
User : kubec ( 1026)
PHP Version : 8.2.28
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /usr/syno/sbin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/syno/sbin/junior_expansion_pack.sh
#!/bin/sh
# Copyright (c) 2021-2021 Synology Inc. All rights reserved.

FILENAME="$(/bin/basename "$0")"

log_it() {
	local level="$1"; shift

	[ -x /bin/logger ] && [ "$level" = "err" ] && /bin/logger -p "$level" "$*"

	# e.g. 2021-07-22T11:38:30+08:00
	local datetime
	datetime="$(date '+%Y-%m-%dT%H:%M:%S%z')"
	# manually insert a colon since busybox does not have %:z
	# shellcheck disable=SC2169  # busybox supports string indexing
	datetime="${datetime::-2}:${datetime: -2}"
	local LOGFILENAME="/var/log/juniorexpansionpack.log"
	echo "$datetime $FILENAME [$$][$level]: $*" >> "$LOGFILENAME"
}
log_err() {
	log_it "err" "$@"
}
log_info() {
	log_it "info" "$@"
}
log_fn_enter() {
	log_info "[ENTER]" "$*"
}
log_fn_exit() {
	log_info "[EXIT] " "$*"
}

show_usage() {
cat << EOT
$0 [OPTION]
	OPTIONS:
		* None: runs the main JuniorExpansionPack flow
		* --jep ARCHIVE: runs the main JuniorExpansionPack flow with the specified ARCHIVE
		* --clean: cleans up existing JuniorExpansionPack if any
		* --help: shows this help
EOT
}

main() {
	local log_desc="main"
	log_fn_enter "$log_desc" "$*"

	local opt="$1"; shift

	local default_jep_archive_path=/tmp/JEP.jep
	local dest="/tmp/JEP.extract"
	local header_file="/usr/syno/JEP.HEADER"

	if [ "$opt" = "--help" ] || [ "$opt" = "-h" ]; then
		show_usage
		return 0
	fi

	if [ "$opt" = "--clean" ]; then
		if ! junior_expansion_pack_clean "$dest" "$header_file"; then
			log_err "Failed to clean JuniorExpansionPack"
			return 1
		fi

		return 0
	fi

	local archive_path="$default_jep_archive_path"
	if [ "$opt" = "--jep" ]; then
		local existing_archive_path="$1"; shift
		if [ ! -f "$existing_archive_path" ]; then
			log_err "archive does not exist [$existing_archive_path]"
			return 1
		fi
		archive_path="$existing_archive_path"
	fi

	local is_xa=0
	if [ "$opt" = "--xa" ]; then
		is_xa=1
	fi

	if [ "$is_xa" = "0" ]; then
		start_junior_expansion_pack_main_flow "$archive_path" "$dest" "$header_file"
	else
		# On disk mode, /tmp is noexec.
		start_junior_expansion_pack_xa_flow "$archive_path" "/var/tmp/JEP.extract" "$header_file"
	fi

	log_fn_exit "$log_desc"
	return 0
}

start_junior_expansion_pack_main_flow() {
	local archive_path="$1"; shift
	local dest="$1"; shift
	local header_file="$1"; shift

	log_info "Starting JuniorExpansionPack [$archive_path] -> [$dest][$header_file]"

	if [ ! -f "$archive_path" ] && ! junior_expansion_pack_download "$archive_path"; then
		log_err "Failed to download JuniorExpansionPack"
		return 1
	fi

	if ! junior_expansion_pack_extract "$archive_path" "$dest" "$header_file"; then
		log_err "Failed to extract JuniorExpansionPack"
		return 1
	fi

	if ! junior_expansion_pack_run "$dest" "$header_file"; then
		log_err "Failed to run JuniorExpansionPack"
		return 1
	fi

	log_info "Finished JuniorExpansionPack"
}

start_junior_expansion_pack_xa_flow() {
	local archive_path="$1"; shift
	local dest="$1"; shift
	local header_file="$1"; shift

	log_info "Starting JuniorExpansionPack [$archive_path] -> [$dest][$header_file]"

	if [ ! -f "$archive_path" ] && ! junior_expansion_pack_download "$archive_path"; then
		log_err "Failed to download JuniorExpansionPack"
		return 1
	fi

	if ! junior_expansion_pack_extract_for_xa "$archive_path" "$dest" "$header_file"; then
		log_err "Failed to extract JuniorExpansionPack"
		return 1
	fi

	if ! junior_expansion_pack_run "$dest" "$header_file" "--xa"; then
		log_err "Failed to run JuniorExpansionPack"
		return 1
	fi

	log_info "Finished JuniorExpansionPack"
}

file_get_key_value() {
	if [ "$#" -ne 2 ]; then
		log_err "Bad params [$*]"
		return 1
	fi

	local file="$1"; shift
	local key="$1"; shift

	local value
	value="$(/bin/get_key_value "$file" "$key")"
	local err="$?"
	if [ "$err" -ne 1 ] || [ -z "$value" ]; then
		log_err "Failed to get key value [$err][$file][$key][$value]"
		return 1
	fi

	echo "$value"
	return 0
}
get_key_value_def() {
	if [ "$#" -ne 1 ]; then
		log_err "Bad params [$*]"
		return 1
	fi

	file_get_key_value "/etc.defaults/synoinfo.conf" "$1"
}
get_key_value_version() {
	if [ "$#" -ne 1 ]; then
		log_err "Bad params [$*]"
		return 1
	fi

	file_get_key_value "/etc.defaults/VERSION" "$1"
}

get_update_server_hostname() {
	echo "dataupdate7.synology.com"
}

determine_junior_expansion_pack_url() {
	local log_desc="JuniorExpansionPack url"
	log_fn_enter "$log_desc"

	# TODO: add querystring arguments such as buildnumber, unique, etc ...

	local unique
	if ! unique="$(get_key_value_def "unique")"; then
		log_err "Failed to get unique [$unique]"
		return 1
	fi
	local platform
	platform="$(echo "$unique" | /bin/cut -d_ -f2)"

	local buildnumber
	if ! buildnumber="$(get_key_value_version "buildnumber")"; then
		log_err "Failed to get buildnumber [$buildnumber]"
		return 1
	fi

	local update_server_hostname
	update_server_hostname="$(get_update_server_hostname)"
	local update_url="https://${update_server_hostname}/juniorexpansionpack/v1/getUpdate?platform=${platform}&buildnumber=${buildnumber}"
	echo "$update_url"

	log_fn_exit "$log_desc"
	return 0
}

download_url_to_dest() {
	local url="$1"; shift
	local dest="$1"; shift

	/bin/curl --fail --connect-timeout 80 --max-time 160 -L -s -k -o "$dest" "$url"
}

download_url_to_dest_with_retry() {
	local url="$1"; shift
	local dest="$1"; shift

	local err=0
	local current_try
	for current_try in $(seq 1 141); do
		[ "$((current_try % 10))" -eq 1 ] && log_info "Trying to obtain from ${url} [$current_try]"
		if download_url_to_dest "$url" "$dest"; then
			log_info "Successfully obtained [$url]"
			return 0
		else
			err="$?"
			[ "$((current_try % 10))" -eq 1 ] && log_err "Failed to curl [$url][$err]"
		fi

		if [ "$current_try" -le 40 ]; then
			/bin/sleep 3
		elif [ "$current_try" -le 58 ]; then
			/bin/sleep 10
		elif [ "$current_try" -le 78 ]; then
			/bin/sleep 30
		else
			/bin/sleep 60
		fi
	done

	log_err "Failed to obtain ${url} [$current_try][$err]"

	return 1
}

junior_expansion_pack_download() {
	local log_desc="JuniorExpansionPack download"
	log_fn_enter "$log_desc" "$*"

	local archive_path="$1"; shift

	local url
	if ! url="$(determine_junior_expansion_pack_url)"; then
		log_err "Failed to determine JuniorExpansionPack URL [$url]"
		return 1
	fi

	if ! download_url_to_dest_with_retry "$url" "$archive_path"; then
		log_err "Failed to download [$url]"
		return 1
	fi

	log_fn_exit "$log_desc"
	return 0
}

junior_expansion_pack_extract() {
	local log_desc="JuniorExpansionPack extract"
	log_fn_enter "$log_desc" "$*"

	local archive_path="$1"; shift
	local dest="$1"; shift
	local header_file="$1"; shift

	if [ ! -d "$dest" ] && ! /bin/mkdir -p "$dest"; then
		log_err "Failed to create JuniorExpansionPack dest dir [$dest]"
		return 1
	fi

	if ! /usr/syno/bin/syno_extract_junior_expansion_pack "$archive_path" "$dest" >"$header_file"; then
		log_err "Failed to extract JuniorExpansionPack[$archive_path][$dest]"
		return 1
	fi

	if ! /bin/rm "$archive_path"; then
		log_info "Unable to rm [$archive_path]"
	fi

	log_fn_exit "$log_desc"
	return 0
}

junior_expansion_pack_extract_for_xa() {
	local log_desc="JuniorExpansionPack extract"
	log_fn_enter "$log_desc" "$*"

	local archive_path="$1"; shift
	local dest="$1"; shift
	local header_file="$1"; shift

	if [ ! -d "$dest" ] && ! /bin/mkdir -p "$dest"; then
		log_err "Failed to create JuniorExpansionPack dest dir [$dest]"
		return 1
	fi

	if ! /usr/syno/sbin/synoextractjep "$archive_path" "$dest"; then
		log_err "Failed to extract JuniorExpansionPack[$archive_path][$dest]"
		return 1
	fi

	if ! cp "$dest/INFO" "$header_file"; then
		log_err "Failed to copy ${header_file}"
		return 1
	fi

	if ! /bin/rm "$archive_path"; then
		log_info "Unable to rm [$archive_path]"
	fi

	log_fn_exit "$log_desc"
	return 0
}

junior_expansion_pack_run() {
	local log_desc="JuniorExpansionPack run"
	log_fn_enter "$log_desc" "$*"

	local dest="$1"; shift
	local header_file="$1"; shift

	# Rest of arguments go to entry of JEP.

	local entry_script_name
	if ! entry_script_name="$(file_get_key_value "$header_file" "entry")"; then
		log_err "Failed to determine entry script name [$header_file][$entry_script_name]"
		return 1
	fi

	local script="$dest/$entry_script_name"
	if [ ! -x "$script" ]; then
		log_err "Failed to find entry script"
		return 1
	fi

	if "$script" "$@"; then :; else
		local run_err="$?"
		log_err "Failed to run JuniorExpansionPack [$run_err]"
		return "$run_err"
	fi

	log_fn_exit "$log_desc"
	return 0
}

junior_expansion_pack_stop() {
	local log_desc="junior_expansion_pack_stop"
	log_fn_enter "$log_desc" "$*"

	local dest="$1"; shift
	local header_file="$1"; shift

	local clean_script_name
	if ! clean_script_name="$(file_get_key_value "$header_file" "clean")"; then
		log_err "Failed to determine clean script name [$header_file][$clean_script_name]"
		return 1
	fi

	local script="$dest/$clean_script_name"
	if [ ! -x "$script" ]; then
		log_err "Failed to find clean script"
		return 1
	fi

	if "$script"; then :; else
		local run_err="$?"
		log_err "Failed to clean JuniorExpansionPack [$run_err]"
		return "$run_err"
	fi

	log_fn_exit "$log_desc"
	return 0
}

junior_expansion_pack_clean() {
	local log_desc="junior_expansion_pack_clean"
	log_fn_enter "$log_desc"

	local dest="$1"; shift
	local header_file="$1"; shift

	log_info "Cleaning JuniorExpansionPack"

	if ! junior_expansion_pack_stop "$dest" "$header_file"; then
		log_err "Failed to cleanly stop JuniorExpansionPack"
	fi

	local rm_err
	if rm_err="$(/bin/rm -r \
		/tmp/JEP.jep \
		/tmp/JEP.extract \
		/usr/syno/JEP.HEADER \
	)"; then :; else
		log_err "Failed to cleanly remove files [$?][$rm_err]"
	fi

	log_fn_exit "$log_desc"
	return 0
}

main "$@"

Youez - 2016 - github.com/yon3zu
LinuXploit