mirror of
https://github.com/caiwx86/small-packages.git
synced 2026-11-01 15:13:56 +08:00
update 2026-05-10 09:48:30
This commit is contained in:
1 parent
95ac96413e
commit
0b362674f1
6244 files changed
+2992248
No files matched your search
@@ -0,0 +1,299 @@
|
||||
#!/bin/bash
|
||||
#==================================================================
|
||||
# This file is licensed under the terms of the GNU General Public
|
||||
# License version 2. This program is licensed "as is" without any
|
||||
# warranty of any kind, whether express or implied.
|
||||
#
|
||||
# This file is a part of the luci-app-amlogic plugin
|
||||
# https://github.com/ophub/luci-app-amlogic
|
||||
#
|
||||
# Description: Check and update OpenWrt firmware
|
||||
# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit
|
||||
# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic
|
||||
#==================================================================
|
||||
|
||||
# Set a fixed value
|
||||
check_option="${1}"
|
||||
download_version="${2}"
|
||||
TMP_CHECK_DIR="/tmp/amlogic"
|
||||
AMLOGIC_SOC_FILE="/etc/flippy-openwrt-release"
|
||||
START_LOG="${TMP_CHECK_DIR}/amlogic_check_firmware.log"
|
||||
RUNNING_LOG="${TMP_CHECK_DIR}/amlogic_running_script.log"
|
||||
LOG_FILE="${TMP_CHECK_DIR}/amlogic.log"
|
||||
support_platform=("allwinner" "rockchip" "amlogic" "qemu-aarch64")
|
||||
LOGTIME="$(date "+%Y-%m-%d %H:%M:%S")"
|
||||
[[ -d ${TMP_CHECK_DIR} ]] || mkdir -p ${TMP_CHECK_DIR}
|
||||
|
||||
# Clean the running log
|
||||
clean_running() {
|
||||
echo -e '' >${RUNNING_LOG} 2>/dev/null && sync
|
||||
}
|
||||
|
||||
# Add log
|
||||
tolog() {
|
||||
echo -e "${1}" >${START_LOG}
|
||||
echo -e "${LOGTIME} ${1}" >>${LOG_FILE}
|
||||
[[ -n "${2}" && "${2}" -eq "1" ]] && clean_running && exit 1
|
||||
}
|
||||
|
||||
# Get the partition name of the root file system
|
||||
get_root_partition_name() {
|
||||
local paths=("/" "/overlay" "/rom")
|
||||
local partition_name
|
||||
|
||||
for path in "${paths[@]}"; do
|
||||
partition_name=$(df "${path}" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')
|
||||
[[ -n "${partition_name}" ]] && break
|
||||
done
|
||||
|
||||
[[ -z "${partition_name}" ]] && tolog "Cannot find the root partition!" "1"
|
||||
echo "${partition_name}"
|
||||
}
|
||||
|
||||
# Check running scripts, prohibit running concurrently
|
||||
this_running_log="3@OpenWrt update in progress, try again later!"
|
||||
running_script="$(cat ${RUNNING_LOG} 2>/dev/null | xargs)"
|
||||
if [[ -n "${running_script}" ]]; then
|
||||
run_num="$(echo "${running_script}" | awk -F "@" '{print $1}')"
|
||||
run_log="$(echo "${running_script}" | awk -F "@" '{print $2}')"
|
||||
fi
|
||||
if [[ -n "${run_log}" && "${run_num}" -ne "3" ]]; then
|
||||
echo -e "${run_log}" >${START_LOG} 2>/dev/null && sync && exit 1
|
||||
else
|
||||
echo -e "${this_running_log}" >${RUNNING_LOG} 2>/dev/null && sync
|
||||
fi
|
||||
|
||||
# Find the partition where root is located
|
||||
ROOT_PTNAME="$(get_root_partition_name)"
|
||||
|
||||
# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats
|
||||
case "${ROOT_PTNAME}" in
|
||||
mmcblk?p[1-4])
|
||||
EMMC_NAME="$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')"
|
||||
PARTITION_NAME="p"
|
||||
;;
|
||||
[hsv]d[a-z][1-4])
|
||||
EMMC_NAME="$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')"
|
||||
PARTITION_NAME=""
|
||||
;;
|
||||
nvme?n?p[1-4])
|
||||
EMMC_NAME="$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')"
|
||||
PARTITION_NAME="p"
|
||||
;;
|
||||
*)
|
||||
tolog "Unable to recognize the disk type of ${ROOT_PTNAME}!" "1"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Set the default download path
|
||||
FIRMWARE_DOWNLOAD_PATH="/mnt/${EMMC_NAME}${PARTITION_NAME}4"
|
||||
[ -d "${FIRMWARE_DOWNLOAD_PATH}/.luci-app-amlogic" ] || mkdir -p "${FIRMWARE_DOWNLOAD_PATH}/.luci-app-amlogic"
|
||||
|
||||
# Check release file
|
||||
if [[ -s "${AMLOGIC_SOC_FILE}" ]]; then
|
||||
source "${AMLOGIC_SOC_FILE}" 2>/dev/null
|
||||
PLATFORM="${PLATFORM}"
|
||||
BOARD="${BOARD}"
|
||||
else
|
||||
tolog "${AMLOGIC_SOC_FILE} file is missing!" "1"
|
||||
fi
|
||||
if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" || -z "${BOARD}" ]]; then
|
||||
tolog "Missing [ PLATFORM / BOARD ] value in ${AMLOGIC_SOC_FILE} file." "1"
|
||||
fi
|
||||
|
||||
tolog "PLATFORM: [ ${PLATFORM} ], BOARD: [ ${BOARD} ], Use in [ ${EMMC_NAME} ]"
|
||||
sleep 2
|
||||
|
||||
# 01. Query local version information
|
||||
tolog "01. Query version information..."
|
||||
# 01.01 Query the current version
|
||||
current_kernel_v="$(uname -r 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}.[0-9]+')"
|
||||
tolog "01.01 current version: ${current_kernel_v}"
|
||||
sleep 2
|
||||
|
||||
# 01.01 Version comparison
|
||||
main_line_version="$(echo ${current_kernel_v} | awk -F '.' '{print $1"."$2}')"
|
||||
|
||||
# 01.02. Query the selected branch in the settings
|
||||
server_kernel_branch="$(uci get amlogic.config.amlogic_kernel_branch 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}')"
|
||||
if [[ -z "${server_kernel_branch}" ]]; then
|
||||
server_kernel_branch="${main_line_version}"
|
||||
uci set amlogic.config.amlogic_kernel_branch="${main_line_version}" 2>/dev/null
|
||||
uci commit amlogic 2>/dev/null
|
||||
fi
|
||||
if [[ "${server_kernel_branch}" != "${main_line_version}" ]]; then
|
||||
main_line_version="${server_kernel_branch}"
|
||||
tolog "01.02 Select branch: ${main_line_version}"
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
# 01.03. Download server version documentation
|
||||
server_firmware_url="$(uci get amlogic.config.amlogic_firmware_repo 2>/dev/null)"
|
||||
[[ ! -z "${server_firmware_url}" ]] || tolog "01.03 The custom firmware download repo is invalid." "1"
|
||||
releases_tag_keywords="$(uci get amlogic.config.amlogic_firmware_tag 2>/dev/null)"
|
||||
[[ ! -z "${releases_tag_keywords}" ]] || tolog "01.04 The custom firmware tag keywords is invalid." "1"
|
||||
firmware_suffix="$(uci get amlogic.config.amlogic_firmware_suffix 2>/dev/null)"
|
||||
[[ ! -z "${firmware_suffix}" ]] || tolog "01.05 The custom firmware suffix is invalid." "1"
|
||||
|
||||
if [[ "${server_firmware_url}" == http* ]]; then
|
||||
server_firmware_url="${server_firmware_url#*com\/}"
|
||||
fi
|
||||
|
||||
# 02. Check Updated
|
||||
check_updated() {
|
||||
tolog "02.01 Search for tags in the first 5 pages of releases..."
|
||||
|
||||
# Get the tags list
|
||||
firmware_tags_array=()
|
||||
for i in {1..5}; do
|
||||
while IFS= read -r firmware_tags_name; do
|
||||
firmware_tags_name="$(echo "${firmware_tags_name}" | sed 's/releases\/tag\///g')"
|
||||
if [[ -n "${firmware_tags_name}" ]]; then
|
||||
firmware_tags_array+=("${firmware_tags_name}")
|
||||
fi
|
||||
done < <(
|
||||
curl -fsSL -m 10 \
|
||||
https://github.com/${server_firmware_url}/releases?page=${i} |
|
||||
grep -oE 'releases/tag/([^" ]+)'
|
||||
)
|
||||
done
|
||||
|
||||
if [[ "${#firmware_tags_array[*]}" -eq "0" ]]; then
|
||||
tolog "02.01.01 Unable to retrieve a list of firmware tags." "1"
|
||||
fi
|
||||
|
||||
tolog "02.02 Search for tags containing the keyword..."
|
||||
|
||||
# Search for tags containing the keyword
|
||||
for i in "${firmware_tags_array[@]}"; do
|
||||
if [[ "${i}" == *"${releases_tag_keywords}"* ]]; then
|
||||
firmware_releases_tag="${i}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ -n "${firmware_releases_tag}" ]]; then
|
||||
tolog "02.02.01 Tags: ${firmware_releases_tag}"
|
||||
sleep 2
|
||||
else
|
||||
tolog "02.02.01 No matching tags found." "1"
|
||||
fi
|
||||
|
||||
tolog "02.03 Start searching for firmware download links..."
|
||||
|
||||
# Retrieve the HTML code of the tags list page
|
||||
html_code="$(
|
||||
curl -fsSL -m 10 \
|
||||
https://github.com/${server_firmware_url}/releases/expanded_assets/${firmware_releases_tag}
|
||||
)"
|
||||
|
||||
# Set the regular expression for the OpenWrt filename
|
||||
op_file_pattern=".*_${BOARD}_.*k${main_line_version}\.[0-9]+.*${firmware_suffix}"
|
||||
# Find the <li> list item where the OpenWrt file is located
|
||||
li_block=$(awk -v pattern="${op_file_pattern}" -v RS='</li>' '$0 ~ pattern { print $0 "</li>"; exit }' <<<"${html_code}")
|
||||
[[ -z "${li_block}" ]] && tolog "02.03.01 No matching download links found." "1"
|
||||
|
||||
# Find the OpenWrt filename
|
||||
latest_url=$(echo "${li_block}" | grep -oE "/[^\"]*_${BOARD}_.*k${main_line_version}\.[0-9]+[^\"]*${firmware_suffix}" | sort -urV | head -n 1 | xargs basename 2>/dev/null)
|
||||
tolog "02.03.02 OpenWrt file: ${latest_url}"
|
||||
|
||||
# Find the date of the latest update
|
||||
latest_updated_at=$(echo "${li_block}" | grep -o 'datetime="[^"]*"' | sed 's/datetime="//; s/"//')
|
||||
tolog "02.03.03 Latest updated at: ${latest_updated_at}"
|
||||
# Format the date for display
|
||||
date_display_format="$(echo ${latest_updated_at} | tr 'T' '(' | tr 'Z' ')')"
|
||||
[[ -z "${latest_url}" || -z "${latest_updated_at}" ]] && tolog "02.03.04 The download URL or date is invalid." "1"
|
||||
|
||||
# Find the firmware sha256 value
|
||||
latest_firmware_sha256="$(echo "${li_block}" | grep -o 'value="sha256:[^"]*' | sed 's/value="sha256://')"
|
||||
tolog "02.03.05 OpenWrt sha256: ${latest_firmware_sha256}"
|
||||
|
||||
# Check the firmware update code
|
||||
down_check_code="${latest_updated_at}.${main_line_version}"
|
||||
op_release_code="${FIRMWARE_DOWNLOAD_PATH}/.luci-app-amlogic/op_release_code"
|
||||
if [[ -s "${op_release_code}" ]]; then
|
||||
update_check_code="$(cat ${op_release_code} | xargs)"
|
||||
if [[ -n "${update_check_code}" && "${update_check_code}" == "${down_check_code}" ]]; then
|
||||
tolog "02.04 Already the latest version, no need to update." "1"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Prompt to update
|
||||
if [[ -n "${latest_url}" ]]; then
|
||||
tolog '<input type="button" class="cbi-button cbi-button-reload" value="Download" onclick="return b_check_firmware(this, '"'download_${latest_updated_at}@${firmware_releases_tag}/${latest_url}@${latest_firmware_sha256}'"')"/> Latest updated: '${date_display_format}'' "1"
|
||||
else
|
||||
tolog "02.05 No OpenWrt available, please use another kernel branch." "1"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
# 03. Download Openwrt
|
||||
download_firmware() {
|
||||
tolog "03. Start download the Openwrt..."
|
||||
|
||||
# Get the openwrt firmware download path
|
||||
if [[ "${download_version}" == "download_"* ]]; then
|
||||
tolog "03.01 Start downloading..."
|
||||
else
|
||||
tolog "03.01 Invalid parameter." "1"
|
||||
fi
|
||||
|
||||
# Delete other residual firmware files
|
||||
rm -f ${FIRMWARE_DOWNLOAD_PATH}/*${firmware_suffix} 2>/dev/null && sync
|
||||
rm -f ${FIRMWARE_DOWNLOAD_PATH}/*.img 2>/dev/null && sync
|
||||
rm -f ${FIRMWARE_DOWNLOAD_PATH}/sha256sums 2>/dev/null && sync
|
||||
|
||||
# OpenWrt make data
|
||||
latest_updated_at="$(echo ${download_version} | awk -F'@' '{print $1}' | sed -e s'|download_||'g)"
|
||||
down_check_code="${latest_updated_at}.${main_line_version}"
|
||||
|
||||
# Download firmware
|
||||
opfile_path="$(echo ${download_version} | awk -F'@' '{print $2}')"
|
||||
# Restore converted characters in file names(%2B to +)
|
||||
firmware_download_oldname="${opfile_path//%2B/+}"
|
||||
latest_url="https://github.com/${server_firmware_url}/releases/download/${firmware_download_oldname}"
|
||||
|
||||
# Find the firmware sha256 value
|
||||
releases_firmware_sha256sums="$(echo ${download_version} | awk -F'@' '{print $3}')"
|
||||
|
||||
# Download to OpenWrt file
|
||||
firmware_download_name="openwrt_${BOARD}_k${main_line_version}_github${firmware_suffix}"
|
||||
curl -fsSL "${latest_url}" -o "${FIRMWARE_DOWNLOAD_PATH}/${firmware_download_name}"
|
||||
if [[ "$?" -eq "0" && -s "${FIRMWARE_DOWNLOAD_PATH}/${firmware_download_name}" ]]; then
|
||||
tolog "03.02 OpenWrt downloaded successfully."
|
||||
else
|
||||
tolog "03.02 OpenWrt download failed." "1"
|
||||
fi
|
||||
|
||||
# Verify sha256sums if available
|
||||
if [[ -n "${releases_firmware_sha256sums}" ]]; then
|
||||
tolog "03.03 Perform sha256 checksum verification."
|
||||
|
||||
# If there is a sha256sum file, compare it
|
||||
download_firmware_sha256sums="$(sha256sum ${FIRMWARE_DOWNLOAD_PATH}/${firmware_download_name} | awk '{print $1}')"
|
||||
if [[ "${releases_firmware_sha256sums}" != "${download_firmware_sha256sums}" ]]; then
|
||||
tolog "03.03.01 sha256sum verification mismatched." "1"
|
||||
else
|
||||
tolog "03.03.02 sha256sum verification succeeded."
|
||||
fi
|
||||
fi
|
||||
|
||||
sync && sleep 3
|
||||
|
||||
tolog "You can update."
|
||||
|
||||
tolog '<input type="button" class="cbi-button cbi-button-reload" value="Update" onclick="return amlogic_update(this, '"'${firmware_download_name}@${down_check_code}@${FIRMWARE_DOWNLOAD_PATH}'"')"/>' "1"
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
getopts 'cd' opts
|
||||
case "${opts}" in
|
||||
c | check)
|
||||
check_updated
|
||||
;;
|
||||
* | download)
|
||||
download_firmware
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,277 @@
|
||||
#!/bin/bash
|
||||
#==================================================================
|
||||
# This file is licensed under the terms of the GNU General Public
|
||||
# License version 2. This program is licensed "as is" without any
|
||||
# warranty of any kind, whether express or implied.
|
||||
#
|
||||
# This file is a part of the luci-app-amlogic plugin
|
||||
# https://github.com/ophub/luci-app-amlogic
|
||||
#
|
||||
# Description: Check and update OpenWrt Kernel
|
||||
# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit
|
||||
# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic
|
||||
#==================================================================
|
||||
|
||||
# Set a fixed value
|
||||
check_option="${1}"
|
||||
download_version="${2}"
|
||||
TMP_CHECK_DIR="/tmp/amlogic"
|
||||
AMLOGIC_SOC_FILE="/etc/flippy-openwrt-release"
|
||||
START_LOG="${TMP_CHECK_DIR}/amlogic_check_kernel.log"
|
||||
RUNNING_LOG="${TMP_CHECK_DIR}/amlogic_running_script.log"
|
||||
LOG_FILE="${TMP_CHECK_DIR}/amlogic.log"
|
||||
support_platform=("allwinner" "rockchip" "amlogic" "qemu-aarch64")
|
||||
LOGTIME="$(date "+%Y-%m-%d %H:%M:%S")"
|
||||
[[ -d ${TMP_CHECK_DIR} ]] || mkdir -p ${TMP_CHECK_DIR}
|
||||
|
||||
# Clean the running log
|
||||
clean_running() {
|
||||
echo -e '' >${RUNNING_LOG} 2>/dev/null && sync
|
||||
}
|
||||
|
||||
# Add log
|
||||
tolog() {
|
||||
echo -e "${1}" >${START_LOG}
|
||||
echo -e "${LOGTIME} ${1}" >>${LOG_FILE}
|
||||
[[ -n "${2}" && "${2}" -eq "1" ]] && clean_running && exit 1
|
||||
}
|
||||
|
||||
# Get the partition name of the root file system
|
||||
get_root_partition_name() {
|
||||
local paths=("/" "/overlay" "/rom")
|
||||
local partition_name
|
||||
|
||||
for path in "${paths[@]}"; do
|
||||
partition_name=$(df "${path}" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')
|
||||
[[ -n "${partition_name}" ]] && break
|
||||
done
|
||||
|
||||
[[ -z "${partition_name}" ]] && tolog "Cannot find the root partition!" "1"
|
||||
echo "${partition_name}"
|
||||
}
|
||||
|
||||
# Check running scripts, prohibit running concurrently
|
||||
this_running_log="2@Kernel update in progress, try again later!"
|
||||
running_script="$(cat ${RUNNING_LOG} 2>/dev/null | xargs)"
|
||||
if [[ -n "${running_script}" ]]; then
|
||||
run_num="$(echo "${running_script}" | awk -F "@" '{print $1}')"
|
||||
run_log="$(echo "${running_script}" | awk -F "@" '{print $2}')"
|
||||
fi
|
||||
if [[ -n "${run_log}" && "${run_num}" -ne "2" ]]; then
|
||||
echo -e "${run_log}" >${START_LOG} 2>/dev/null && sync && exit 1
|
||||
else
|
||||
echo -e "${this_running_log}" >${RUNNING_LOG} 2>/dev/null && sync
|
||||
fi
|
||||
|
||||
# Find the partition where root is located
|
||||
ROOT_PTNAME="$(get_root_partition_name)"
|
||||
|
||||
# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats
|
||||
case "${ROOT_PTNAME}" in
|
||||
mmcblk?p[1-4])
|
||||
EMMC_NAME="$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')"
|
||||
PARTITION_NAME="p"
|
||||
;;
|
||||
[hsv]d[a-z][1-4])
|
||||
EMMC_NAME="$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')"
|
||||
PARTITION_NAME=""
|
||||
;;
|
||||
nvme?n?p[1-4])
|
||||
EMMC_NAME="$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')"
|
||||
PARTITION_NAME="p"
|
||||
;;
|
||||
*)
|
||||
tolog "Unable to recognize the disk type of ${ROOT_PTNAME}!" "1"
|
||||
;;
|
||||
esac
|
||||
# Set the default download path
|
||||
KERNEL_DOWNLOAD_PATH="/mnt/${EMMC_NAME}${PARTITION_NAME}4"
|
||||
|
||||
# Check release file
|
||||
if [[ -s "${AMLOGIC_SOC_FILE}" ]]; then
|
||||
source "${AMLOGIC_SOC_FILE}" 2>/dev/null
|
||||
PLATFORM="${PLATFORM}"
|
||||
else
|
||||
tolog "${AMLOGIC_SOC_FILE} file is missing!" "1"
|
||||
fi
|
||||
if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" ]]; then
|
||||
tolog "Missing [ PLATFORM ] value in ${AMLOGIC_SOC_FILE} file." "1"
|
||||
fi
|
||||
|
||||
tolog "PLATFORM: [ ${PLATFORM} ], Use in [ ${EMMC_NAME} ]"
|
||||
sleep 2
|
||||
|
||||
# Step 1. Set the kernel query api
|
||||
tolog "01. Start checking the kernel repository."
|
||||
firmware_repo="$(uci get amlogic.config.amlogic_firmware_repo 2>/dev/null)"
|
||||
[[ -n "${firmware_repo}" ]] || tolog "01.01 The custom kernel download repo is invalid." "1"
|
||||
kernel_repo="$(uci get amlogic.config.amlogic_kernel_path 2>/dev/null)"
|
||||
[[ -n "${kernel_repo}" ]] || tolog "01.02 The custom kernel download repo is invalid." "1"
|
||||
|
||||
if [[ "${kernel_repo}" == "opt/kernel" ]]; then
|
||||
uci set amlogic.config.amlogic_kernel_path="${firmware_repo}" 2>/dev/null
|
||||
uci commit amlogic 2>/dev/null
|
||||
kernel_repo="${firmware_repo}"
|
||||
fi
|
||||
|
||||
# Convert kernel repo to api format
|
||||
[[ "${kernel_repo}" =~ ^https: ]] && kernel_repo="$(echo ${kernel_repo} | awk -F'/' '{print $4"/"$5}')"
|
||||
kernel_api="https://github.com/${kernel_repo}"
|
||||
tolog "01.03 Kernel repo: ${kernel_repo}"
|
||||
# Get the current kernel uname
|
||||
kernel_uname="$(uname -r 2>/dev/null)"
|
||||
tolog "01.04 Current kernel uname: ${kernel_uname}"
|
||||
|
||||
# Get the kernel tag from uci config
|
||||
op_kernel_tags="$(uci get amlogic.config.amlogic_kernel_tags 2>/dev/null)"
|
||||
# Determine the kernel tag
|
||||
if [[ -n "${op_kernel_tags}" ]]; then
|
||||
kernel_tag="${op_kernel_tags/kernel_/}"
|
||||
else
|
||||
# Determine the kernel tag based on the current kernel uname
|
||||
if [[ "${kernel_uname}" =~ -rk3588 ]]; then
|
||||
kernel_tag="rk3588"
|
||||
elif [[ "${kernel_uname}" =~ -rk35xx ]]; then
|
||||
kernel_tag="rk35xx"
|
||||
elif [[ "${kernel_uname}" =~ -flippy ]]; then
|
||||
kernel_tag="flippy"
|
||||
elif [[ "${kernel_uname}" =~ -h6|-zicai ]]; then
|
||||
kernel_tag="h6"
|
||||
else
|
||||
kernel_tag="stable"
|
||||
fi
|
||||
|
||||
# Save the kernel tag to uci config
|
||||
uci set amlogic.config.amlogic_kernel_tags="kernel_${kernel_tag}" 2>/dev/null
|
||||
uci commit amlogic 2>/dev/null
|
||||
fi
|
||||
tolog "01.05 Kernel tag: kernel_${kernel_tag}"
|
||||
sleep 2
|
||||
|
||||
# Step 2: Check if there is the latest kernel version
|
||||
check_kernel() {
|
||||
# 02. Query local version information
|
||||
tolog "02. Start checking the kernel version."
|
||||
|
||||
# 02.01 Get current kernel version
|
||||
[[ ! "${kernel_tag}" =~ ^(rk3588|rk35xx)$ ]] && kernel_uname="$(echo "${kernel_uname}" | cut -d'-' -f1)"
|
||||
[[ -n "${kernel_uname}" ]] || tolog "02.01 The current kernel version is not detected." "1"
|
||||
tolog "02.01 current version: ${kernel_uname}"
|
||||
sleep 2
|
||||
|
||||
# 02.02 Version comparison
|
||||
main_line_version="$(echo ${kernel_uname} | awk -F '.' '{print $1"."$2}')"
|
||||
|
||||
# 02.03 Query the selected branch in the settings
|
||||
server_kernel_branch="$(uci get amlogic.config.amlogic_kernel_branch 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}')"
|
||||
if [[ -z "${server_kernel_branch}" ]]; then
|
||||
server_kernel_branch="${main_line_version}"
|
||||
uci set amlogic.config.amlogic_kernel_branch="${main_line_version}" 2>/dev/null
|
||||
uci commit amlogic 2>/dev/null
|
||||
fi
|
||||
|
||||
if [[ "${server_kernel_branch}" != "${main_line_version}" ]]; then
|
||||
main_line_version="${server_kernel_branch}"
|
||||
main_line_now="0"
|
||||
tolog "02.02 Select branch: ${main_line_version}"
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
# Check the version on the server
|
||||
latest_version="$(
|
||||
curl -fsSL -m 10 \
|
||||
${kernel_api}/releases/expanded_assets/kernel_${kernel_tag} |
|
||||
grep -oE "${main_line_version}\.[0-9]+[^\"]*\.tar\.gz" | sed 's/.tar.gz//' |
|
||||
sort -urV | head -n 1
|
||||
)"
|
||||
[[ -n "${latest_version}" ]] || tolog "02.03 No kernel available, please use another kernel branch." "1"
|
||||
|
||||
tolog "02.04 current version: ${kernel_uname}, Latest version: ${latest_version}"
|
||||
sleep 2
|
||||
|
||||
# Get the sha256 value of the latest version
|
||||
latest_kernel_sha256="$(
|
||||
curl -fsSL -m 10 \
|
||||
${kernel_api}/releases/expanded_assets/kernel_${kernel_tag} |
|
||||
awk -v pattern="${latest_version}\.tar\.gz" -v RS='</li>' '$0 ~ pattern { print $0 "</li>"; exit }' |
|
||||
grep -o 'value="sha256:[^"]*' | sed 's/value="sha256://'
|
||||
)"
|
||||
[[ -n "${latest_kernel_sha256}" ]] && tolog "02.05 Kernel sha256: ${latest_kernel_sha256}"
|
||||
|
||||
if [[ "${latest_version}" == "${kernel_uname}" ]]; then
|
||||
tolog "02.06 Already the latest version, no need to update." "1"
|
||||
sleep 2
|
||||
else
|
||||
tolog '<input type="button" class="cbi-button cbi-button-reload" value="Download" onclick="return b_check_kernel(this, '"'download_${latest_version}_${latest_kernel_sha256}'"')"/> Latest version: '${latest_version}'' "1"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Step 3: Download the latest kernel version
|
||||
download_kernel() {
|
||||
tolog "03. Start download the kernel file."
|
||||
if [[ "${download_version}" == "download_"* ]]; then
|
||||
tolog "03.01 Start downloading..."
|
||||
else
|
||||
tolog "03.01 Invalid parameter" "1"
|
||||
fi
|
||||
|
||||
# Get the kernel file name
|
||||
kernel_file_name="$(echo "${download_version}" | cut -d '_' -f2)"
|
||||
# Restore converted characters in file names(%2B to +)
|
||||
kernel_file_name="${kernel_file_name//%2B/+}"
|
||||
# Get the sha256 value
|
||||
kernel_file_sha256="$(echo "${download_version}" | cut -d '_' -f3)"
|
||||
|
||||
# Delete other residual kernel files
|
||||
rm -f ${KERNEL_DOWNLOAD_PATH}/*.tar.gz
|
||||
rm -f ${KERNEL_DOWNLOAD_PATH}/sha256sums
|
||||
rm -rf ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}*
|
||||
|
||||
kernel_down_from="https://github.com/${kernel_repo}/releases/download/kernel_${kernel_tag}/${kernel_file_name}.tar.gz"
|
||||
|
||||
curl -fsSL "${kernel_down_from}" -o ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz
|
||||
[[ "${?}" -ne "0" ]] && tolog "03.02 The kernel download failed." "1"
|
||||
|
||||
# Verify sha256
|
||||
if [[ -n "${kernel_file_sha256}" ]]; then
|
||||
tolog "03.03 Perform sha256 checksum verification."
|
||||
|
||||
download_kernel_sha256sums="$(sha256sum ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz | awk '{print $1}')"
|
||||
if [[ "${kernel_file_sha256}" != "${download_kernel_sha256sums}" ]]; then
|
||||
tolog "03.03.01 sha256sum verification mismatched." "1"
|
||||
else
|
||||
tolog "03.03.02 sha256sum verification succeeded."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Decompress the kernel package
|
||||
tolog "03.04 Start decompressing the kernel package..."
|
||||
tar -xf ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz -C ${KERNEL_DOWNLOAD_PATH}
|
||||
[[ "${?}" -ne "0" ]] && tolog "03.05 Kernel decompression failed." "1"
|
||||
mv -f ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}/* ${KERNEL_DOWNLOAD_PATH}/
|
||||
|
||||
sync && sleep 3
|
||||
# Delete the downloaded kernel file
|
||||
rm -f ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz
|
||||
rm -rf ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}
|
||||
|
||||
tolog "03.06 The kernel is ready, you can update."
|
||||
sleep 2
|
||||
|
||||
#echo '<a href="javascript:;" onclick="return amlogic_kernel(this)">Update</a>' >$START_LOG
|
||||
tolog '<input type="button" class="cbi-button cbi-button-reload" value="Update" onclick="return amlogic_kernel(this)"/>' "1"
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
getopts 'cd' opts
|
||||
case "${opts}" in
|
||||
c | check)
|
||||
check_kernel
|
||||
;;
|
||||
* | download)
|
||||
download_kernel
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,227 @@
|
||||
#!/bin/bash
|
||||
#==================================================================
|
||||
# This file is licensed under the terms of the GNU General Public
|
||||
# License version 2. This program is licensed "as is" without any
|
||||
# warranty of any kind, whether express or implied.
|
||||
#
|
||||
# This file is a part of the luci-app-amlogic plugin
|
||||
# https://github.com/ophub/luci-app-amlogic
|
||||
#
|
||||
# Description: Check and update luci-app-amlogic plugin
|
||||
# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit
|
||||
# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic
|
||||
#==================================================================
|
||||
|
||||
# Set a fixed value
|
||||
check_option="${1}"
|
||||
download_version="${2}"
|
||||
TMP_CHECK_DIR="/tmp/amlogic"
|
||||
AMLOGIC_SOC_FILE="/etc/flippy-openwrt-release"
|
||||
AMLOGIC_CONFIG_FILE="/etc/config/amlogic"
|
||||
START_LOG="${TMP_CHECK_DIR}/amlogic_check_plugin.log"
|
||||
RUNNING_LOG="${TMP_CHECK_DIR}/amlogic_running_script.log"
|
||||
LOG_FILE="${TMP_CHECK_DIR}/amlogic.log"
|
||||
support_platform=("allwinner" "rockchip" "amlogic" "qemu-aarch64")
|
||||
LOGTIME="$(date "+%Y-%m-%d %H:%M:%S")"
|
||||
[[ -d ${TMP_CHECK_DIR} ]] || mkdir -p ${TMP_CHECK_DIR}
|
||||
|
||||
# Clean the running log
|
||||
clean_running() {
|
||||
echo -e '' >${RUNNING_LOG} 2>/dev/null && sync
|
||||
}
|
||||
|
||||
# Add log
|
||||
tolog() {
|
||||
echo -e "${1}" >${START_LOG}
|
||||
echo -e "${LOGTIME} ${1}" >>${LOG_FILE}
|
||||
[[ -n "${2}" && "${2}" -eq "1" ]] && clean_running && exit 1
|
||||
}
|
||||
|
||||
# Check running scripts, prohibit running concurrently
|
||||
this_running_log="1@Plugin update in progress, try again later!"
|
||||
running_script="$(cat ${RUNNING_LOG} 2>/dev/null | xargs)"
|
||||
if [[ -n "${running_script}" ]]; then
|
||||
run_num="$(echo "${running_script}" | awk -F "@" '{print $1}')"
|
||||
run_log="$(echo "${running_script}" | awk -F "@" '{print $2}')"
|
||||
fi
|
||||
if [[ -n "${run_log}" && "${run_num}" -ne "1" ]]; then
|
||||
echo -e "${run_log}" >${START_LOG} 2>/dev/null && sync && exit 1
|
||||
else
|
||||
echo -e "${this_running_log}" >${RUNNING_LOG} 2>/dev/null && sync
|
||||
fi
|
||||
|
||||
# Check release file
|
||||
if [[ -s "${AMLOGIC_SOC_FILE}" ]]; then
|
||||
source "${AMLOGIC_SOC_FILE}" 2>/dev/null
|
||||
PLATFORM="${PLATFORM}"
|
||||
else
|
||||
tolog "${AMLOGIC_SOC_FILE} file is missing!" "1"
|
||||
fi
|
||||
if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" ]]; then
|
||||
tolog "Missing [ PLATFORM ] value in ${AMLOGIC_SOC_FILE} file." "1"
|
||||
fi
|
||||
|
||||
tolog "PLATFORM: [ ${PLATFORM} ]"
|
||||
sleep 2
|
||||
|
||||
# Read plugin branch from UCI config; default to "" (main-lua) when missing or empty
|
||||
# When amlogic_plugin_branch is missing, add it with empty value (main-lua default)
|
||||
if [[ -f "${AMLOGIC_CONFIG_FILE}" ]]; then
|
||||
plugin_branch="$(uci get amlogic.config.amlogic_plugin_branch 2>/dev/null | xargs)"
|
||||
if ! grep -q "amlogic_plugin_branch" "${AMLOGIC_CONFIG_FILE}" 2>/dev/null; then
|
||||
uci set amlogic.config.amlogic_plugin_branch='' 2>/dev/null
|
||||
uci commit amlogic 2>/dev/null
|
||||
plugin_branch=""
|
||||
fi
|
||||
else
|
||||
plugin_branch=""
|
||||
fi
|
||||
tolog "Plugin branch: [ ${plugin_branch:-main-lua} ]"
|
||||
sleep 1
|
||||
get_plugin_info() {
|
||||
package_manager=""
|
||||
current_plugin_v=""
|
||||
if command -v opkg >/dev/null 2>&1; then
|
||||
package_manager="ipk"
|
||||
current_plugin_v="$(opkg list-installed | grep '^luci-app-amlogic ' | awk '{print $3}' | cut -d'-' -f1)"
|
||||
elif command -v apk >/dev/null 2>&1; then
|
||||
package_manager="apk"
|
||||
current_plugin_v="$(apk list --installed | grep '^luci-app-amlogic-' | awk '{print $1}' | cut -d'-' -f4)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Step 2: Check if there is the latest plugin version
|
||||
check_plugin() {
|
||||
tolog "01. Query current version information."
|
||||
get_plugin_info
|
||||
if [[ -z "${package_manager}" || -z "${current_plugin_v}" ]]; then
|
||||
tolog "01.01 Plugin 'luci-app-amlogic' not found or package manager unknown." "1"
|
||||
else
|
||||
tolog "01.01 Using [${package_manager}]. Current version: ${current_plugin_v}"
|
||||
fi
|
||||
sleep 2
|
||||
|
||||
tolog "02. Start querying plugin version..."
|
||||
if [[ "${plugin_branch}" == "js" ]]; then
|
||||
latest_version="$(
|
||||
curl -fsSL -m 10 \
|
||||
https://github.com/ophub/luci-app-amlogic/releases |
|
||||
grep -oE 'expanded_assets/[0-9]+\.[0-9]+\.[0-9]+-js' | sed 's|expanded_assets/||g' |
|
||||
sort -urV | head -n 1
|
||||
)"
|
||||
else
|
||||
latest_version="$(
|
||||
curl -fsSL -m 10 \
|
||||
https://github.com/ophub/luci-app-amlogic/releases |
|
||||
grep -oE 'expanded_assets/[0-9]+\.[0-9]+\.[0-9]+' | sed 's|expanded_assets/||g' |
|
||||
grep -v '\-js' |
|
||||
sort -urV | head -n 1
|
||||
)"
|
||||
fi
|
||||
if [[ -z "${latest_version}" ]]; then
|
||||
tolog "02.01 Query failed, please try again." "1"
|
||||
fi
|
||||
|
||||
tolog "02.01 Current version: ${current_plugin_v}, Latest version: ${latest_version}"
|
||||
sleep 2
|
||||
|
||||
if [[ "${current_plugin_v}" == "${latest_version}" ]]; then
|
||||
tolog "02.02 Already the latest version, no need to update." "1"
|
||||
else
|
||||
tolog '<input type="button" class="cbi-button cbi-button-reload" value="Download" onclick="return b_check_plugin(this, '"'download_${latest_version}'"')"/> Latest version: '${latest_version}'' "1"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Step 3: Download the latest plugin version
|
||||
download_plugin() {
|
||||
tolog "03. Start downloading the plugin file."
|
||||
if [[ "${download_version}" == "download_"* ]]; then
|
||||
tolog "03.01 Start downloading..."
|
||||
else
|
||||
tolog "03.01 Invalid parameter." "1"
|
||||
fi
|
||||
|
||||
# Extract version from parameter (e.g. "download_3.1.290" -> "3.1.290")
|
||||
latest_version="$(echo "${download_version}" | cut -d '_' -f2-)"
|
||||
|
||||
get_plugin_info
|
||||
if [[ -z "${package_manager}" ]]; then
|
||||
tolog "03.02 Package manager not found." "1"
|
||||
fi
|
||||
|
||||
tolog "03.02 Package manager: ${package_manager}, Version to download: ${latest_version}"
|
||||
|
||||
# Clean up previous downloads
|
||||
rm -f ${TMP_CHECK_DIR}/*.ipk 2>/dev/null
|
||||
rm -f ${TMP_CHECK_DIR}/*.apk 2>/dev/null
|
||||
rm -f ${TMP_CHECK_DIR}/sha256sums 2>/dev/null
|
||||
sync
|
||||
|
||||
download_repo="https://github.com/ophub/luci-app-amlogic/releases/download"
|
||||
|
||||
# Use GitHub API to find exact filenames
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
tolog "03.03 jq not found, cannot query GitHub API." "1"
|
||||
fi
|
||||
|
||||
tolog "03.03 Querying GitHub API for release assets..."
|
||||
api_url="https://api.github.com/repos/ophub/luci-app-amlogic/releases/tags/${latest_version}"
|
||||
asset_list="$(curl -fsSL -m 15 "${api_url}" | jq -r '.assets[].name' | xargs)"
|
||||
if [[ -z "${asset_list}" ]]; then
|
||||
tolog "03.03 Failed to fetch release assets from GitHub API." "1"
|
||||
fi
|
||||
|
||||
plugin_file_name="$(echo "${asset_list}" | tr ' ' '\n' | grep -oE "^luci-app-amlogic.*${package_manager}$" | head -n 1)"
|
||||
lang_file_list=($(echo "${asset_list}" | tr ' ' '\n' | grep -oE "^luci-i18n-amlogic.*${package_manager}$"))
|
||||
|
||||
if [[ -z "${plugin_file_name}" ]]; then
|
||||
tolog "03.04 Could not find plugin file (.${package_manager}) in release assets." "1"
|
||||
fi
|
||||
|
||||
tolog "03.04 Plugin file: ${plugin_file_name}"
|
||||
|
||||
# Download the main plugin file
|
||||
plugin_full_url="${download_repo}/${latest_version}/${plugin_file_name}"
|
||||
tolog "03.05 Downloading main plugin..."
|
||||
curl -fsSL "${plugin_full_url}" -o "${TMP_CHECK_DIR}/${plugin_file_name}"
|
||||
[[ "${?}" -ne "0" ]] && tolog "03.05 Plugin [ ${plugin_file_name} ] download failed." "1"
|
||||
|
||||
# Download language packs
|
||||
for langfile in "${lang_file_list[@]}"; do
|
||||
lang_full_url="${download_repo}/${latest_version}/${langfile}"
|
||||
tolog "03.06 Downloading language pack [ ${langfile} ]..."
|
||||
curl -fsSL "${lang_full_url}" -o "${TMP_CHECK_DIR}/${langfile}"
|
||||
[[ "${?}" -ne "0" ]] && tolog "03.06 Language pack [ ${langfile} ] download failed." "1"
|
||||
done
|
||||
|
||||
# The .apk filename uses tilde (~) instead of dot before the hash suffix
|
||||
for file in ${TMP_CHECK_DIR}/*.apk; do
|
||||
[[ -f "${file}" ]] || continue
|
||||
base_name="$(basename "${file}")"
|
||||
new_name="$(echo "${base_name}" | sed -E 's/\.([a-f0-9]{7}\.apk)/~\1/')"
|
||||
if [[ "${base_name}" != "${new_name}" ]]; then
|
||||
mv -f "${file}" "${TMP_CHECK_DIR}/${new_name}" || true
|
||||
fi
|
||||
done
|
||||
|
||||
sync && sleep 2
|
||||
|
||||
tolog "03.07 The plugin is ready, you can update."
|
||||
sleep 2
|
||||
|
||||
tolog '<input type="button" class="cbi-button cbi-button-reload" value="Update" onclick="return amlogic_plugin(this)"/> Latest version: '${latest_version}'' "1"
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
getopts 'cd' opts
|
||||
case "${opts}" in
|
||||
c | check)
|
||||
check_plugin
|
||||
;;
|
||||
* | download)
|
||||
download_plugin
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"luci-app-amlogic": {
|
||||
"description": "Grant UCI access for luci-app-amlogic",
|
||||
"read": {
|
||||
"uci": [ "amlogic" ]
|
||||
},
|
||||
"write": {
|
||||
"uci": [ "amlogic" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user