| 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 : |
#!/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 "$@"