Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
docs:guide-user:advanced:sysupgrade_extras [2022/10/31 00:17] – [Instructions] reorder functions vgaeteradocs:guide-user:advanced:sysupgrade_extras [2023/12/01 01:36] – [Instructions] minimize write operations vgaetera
Line 1: Line 1:
 ====== Sysupgrade extras ====== ====== Sysupgrade extras ======
-{{section>meta:infobox:howto_links#cli_skills&noheader&nofooter&noeditbutton}}+{{section>meta:infobox:howto_links#basic_skills&noheader&nofooter&noeditbutton}}
  
 ===== Introduction ===== ===== Introduction =====
Line 7: Line 7:
  
 ===== Features ===== ===== Features =====
-  * Automate upgrading to the latest firmware release. +  * Check the latest firmware release available
-  * Automate expanding the root partition and filesystem.+  * Download the firmware image and verify its checksum. 
 +  * Allow to force/skip upgrade matching the current release. 
 +  * Save/restore the state of enabled/disabled services.
  
 ===== Options ===== ===== Options =====
 ^ Option ^ Description ^ ^ Option ^ Description ^
-| ''**-I**''Initialize Opkg profiles. | +| ''**-A**''Download and upgrade firmware if a newer stable release is available. | 
-| ''**-A**''Upgrade firmware if a new version is available. | +| ''**-U**''Download and upgrade firmware for the latest stable release. | 
-| ''**-U**''Force firmware upgrade. |+| ''**-S**''Save the current state of enabled/disabled services to UCI. | 
 +| ''**-R**'' | Restore the state of enabled/disabled services. |
  
 ===== Instructions ===== ===== Instructions =====
Line 24: Line 27:
 local SYSUP_CMD="${1}" local SYSUP_CMD="${1}"
 case "${SYSUP_CMD}" in case "${SYSUP_CMD}" in
-(-Iopkg save +(-A|-Usysupgrade_proc "${@}" ;; 
-sysupgrade_init ;; +(-Sservice_save ;; 
-(-A. /etc/openwrt_release +(-Rservice_restore ;;
-sysupgrade_auto ;; +
-(-U) +
-sysupgrade_force ;;+
 (*) command sysupgrade "${@}" ;; (*) command sysupgrade "${@}" ;;
 esac esac
 } }
  
-sysupgrade_init() { +sysupgrade_proc() { 
-uci -q batch << EOI +. /etc/os-release
-set opkg.init='opkg' +
-add_list opkg.init.ipkg='losetup' +
-add_list opkg.init.ipkg='parted' +
-add_list opkg.init.ipkg='resize2fs' +
-commit opkg +
-EOI +
-+
- +
-sysupgrade_auto() {+
 local SYSUP_VER="$(sysupgrade_ver)" local SYSUP_VER="$(sysupgrade_ver)"
 local SYSUP_URL="$(sysupgrade_url)" local SYSUP_URL="$(sysupgrade_url)"
 local SYSUP_REV="$(sysupgrade_rev)" local SYSUP_REV="$(sysupgrade_rev)"
-if [ "${SYSUP_REV}" != "${DISTRIB_REVISION}" ] \ +if [ "${SYSUP_REV}" != "${BUILD_ID}" ] \ 
-|| [ -n "${SYSUP_FORCE}" ] +|| [ "${SYSUP_CMD}" = "-U" ] 
-then+then shift
 local SYSUP_DEV="$(sysupgrade_dev)" local SYSUP_DEV="$(sysupgrade_dev)"
 local SYSUP_PROF="$(sysupgrade_prof)" local SYSUP_PROF="$(sysupgrade_prof)"
 local SYSUP_FS="$(sysupgrade_fs)" local SYSUP_FS="$(sysupgrade_fs)"
 local SYSUP_TYPE="$(sysupgrade_type)" local SYSUP_TYPE="$(sysupgrade_type)"
 +local SYSUP_EFI="$(sysupgrade_efi)"
 local SYSUP_IMG="$(sysupgrade_img)" local SYSUP_IMG="$(sysupgrade_img)"
-uclient-fetch -P /tmp "${SYSUP_URL}/${SYSUP_IMG}" +sysupgrade "${@}" "${SYSUP_URL}/${SYSUP_IMG}"
-case "${SYSUP_IMG}" in +
-(*.gz) gunzip -k /tmp/"${SYSUP_IMG}" ;; +
-esac +
-sysupgrade -i /tmp/"${SYSUP_IMG%.gz}"+
 fi fi
-} 
- 
-sysupgrade_force() { 
-local SYSUP_FORCE="1" 
-sysupgrade -A 
 } }
  
 sysupgrade_ver() { sysupgrade_ver() {
-case "${DISTRIB_RELEASE}" in +case "${VERSION_ID}" in 
-(SNAPSHOT) echo "../snapshots" ;; +(snapshot) echo "../snapshots" ;; 
-(*) uclient-fetch -O - \+(*) wget -O - \
 "https://api.github.com/repos/openwrt/openwrt/tags" \ "https://api.github.com/repos/openwrt/openwrt/tags" \
 | jsonfilter -e "$[*]['name']" \ | jsonfilter -e "$[*]['name']" \
Line 81: Line 64:
 sysupgrade_url() { sysupgrade_url() {
 echo "https://downloads.openwrt.org/\ echo "https://downloads.openwrt.org/\
-releases/${SYSUP_VER}/targets/${DISTRIB_TARGET}"+releases/${SYSUP_VER}/targets/${OPENWRT_BOARD}"
 } }
  
 sysupgrade_rev() { sysupgrade_rev() {
-uclient-fetch -O - +wget -O - "${SYSUP_URL}/version.buildinfo"
-"${SYSUP_URL}/version.buildinfo"+
 } }
  
Line 95: Line 77:
  
 sysupgrade_prof() { sysupgrade_prof() {
-case "${DISTRIB_TARGET}" in +case "${OPENWRT_BOARD}" in 
-(x86*) echo "generic" ;;+(x86/*) echo "generic" ;;
 (*) echo "${SYSUP_DEV//,/_}" ;; (*) echo "${SYSUP_DEV//,/_}" ;;
 esac esac
Line 107: Line 89:
  
 sysupgrade_type() { sysupgrade_type() {
-case "${DISTRIB_TARGET}" in +case "${OPENWRT_BOARD}" in 
-(x86*) echo "combined" ;;+(x86/*) echo "combined" ;;
 (*) echo "sysupgrade" ;; (*) echo "sysupgrade" ;;
 esac esac
 +}
 +
 +sysupgrade_efi() {
 +if [ -d /sys/firmware/efi ]
 +then echo "-efi"
 +fi
 } }
  
 sysupgrade_img() { sysupgrade_img() {
-uclient-fetch -O - "${SYSUP_URL}/profiles.json"+wget -O - "${SYSUP_URL}/profiles.json"
-| jsonfilter -e "$['profiles']['${SYSUP_PROF}']['images']+| jsonfilter -e "$['profiles']['${SYSUP_PROF}'] 
-[@['type']='${SYSUP_TYPE}'&&@['filesystem']='${SYSUP_FS}']+['images'][@['type']='${SYSUP_TYPE}${SYSUP_EFI}' 
-['name']"+&&@['filesystem']='${SYSUP_FS}']['name']" 
 +
 + 
 +service_save() { 
 +local SVC_NAME="$(ls /etc/init.d)" 
 +local SVC_STATE 
 +for SVC_NAME in ${SVC_NAME} 
 +do if command service "${SVC_NAME}" enabled 
 +then SVC_STATE="enable" 
 +else SVC_STATE="disable" 
 +fi 
 +uci -q batch << EOI 
 +set system.service='service' 
 +del_list system.service.enable='${SVC_NAME}' 
 +del_list system.service.disable='${SVC_NAME}' 
 +add_list system.service.'${SVC_STATE}'='${SVC_NAME}' 
 +EOI 
 +done 
 +uci commit system 
 +
 + 
 +service_restore() { 
 +local SVC_NAME 
 +local SVC_STATE="enable disable" 
 +for SVC_STATE in ${SVC_STATE} 
 +do SVC_NAME="$(uci -q get system.service."${SVC_STATE}")" 
 +for SVC_NAME in ${SVC_NAME} 
 +do command service "${SVC_NAME}" "${SVC_STATE}" 
 +done 
 +done
 } }
 EOF EOF
 . /etc/profile.d/sysupgrade.sh . /etc/profile.d/sysupgrade.sh
  
-# Configure uci-defaults +# Configure startup scripts 
-cat << "EOF" > /etc/uci-defaults/70-root-resize +cat << "EOF" > /etc/uci-defaults/60-service-restore 
-if [ ! -e /etc/root-resize ] \ +if [ ! -e /etc/service-restore ]
-&& lock -n /var/lock/root-resize \ +
-&& [ -e /etc/opkg-restore-init ]+
 then . /etc/profile.d/sysupgrade.sh then . /etc/profile.d/sysupgrade.sh
-BOOT="$(sed -n -e "\|\s/boot\s.*$|{s///p;q}" /etc/mtab)" +sysupgrade -R 
-DISK="${BOOT%%[0-9]*}" +touch /etc/service-restore
-PART="$((${BOOT##*[^0-9]}+1))" +
-ROOT="${DISK}${PART}" +
-parted "${DISK}" resizepart "${PART}" 100% +
-case "$(sysupgrade_fs)" in +
-(ext4) LOOP="$(losetup -f)" +
-losetup "${LOOP}" "${ROOT}" ;; +
-(squashfs) LOOP="$(losetup -n -l \ +
-| sed -n -e "\|\s.*\s${ROOT#/dev}\s.*$|{s///p;q}")" ;; +
-esac +
-resize2fs -f "${LOOP}" +
-touch /etc/root-resize +
-lock -u /var/lock/root-resize+
 fi fi
 exit 1 exit 1
 EOF EOF
 cat << "EOF" >> /etc/sysupgrade.conf cat << "EOF" >> /etc/sysupgrade.conf
-/etc/uci-defaults+/etc/uci-defaults/60-service-restore
 EOF EOF
 </code> </code>
Line 152: Line 155:
 ===== Examples ===== ===== Examples =====
 <code bash> <code bash>
-# Automated Sysupgrade +# Automated interactive Sysupgrade 
-sysupgrade -I +sysupgrade -A -i 
-sysupgrade -A+ 
 +# Forced interactive Sysupgrade 
 +sysupgrade -U -i
 </code> </code>
  
 ===== Automated ===== ===== Automated =====
 <code bash> <code bash>
-uclient-fetch -O sysupgrade-extras.sh "https://openwrt.org/_export/code/docs/guide-user/advanced/sysupgrade_extras?codeblock=0"+wget -U "" -O sysupgrade-extras.sh "https://openwrt.org/_export/code/docs/guide-user/advanced/sysupgrade_extras?codeblock=0"
 . ./sysupgrade-extras.sh . ./sysupgrade-extras.sh
 </code> </code>
  
  • Last modified: 2024/06/12 13:16
  • by vgaetera