Khadas Docs

Amazing Khadas, always amazes you!

User Tools

Site Tools


scripts:xze

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
scripts:xze [2024/08/21 22:40]
hyphop
scripts:xze [2026/05/21 22:13] (current)
hyphop
Line 25: Line 25:
     -c | -C              # check is krescue ready     -c | -C              # check is krescue ready
  
-    -mn | --meta-remove  # remove meta +    -mn | --meta-remove      # remove meta 
-    -MM | --meta         # krescue meta +    -MM | --meta             # krescue meta (replace all tags) 
-    tag=value            # meta tags+    --meta-update | -MU      # update/replace existing meta tags only 
 +    tag=value                # meta tags
  
     -p                   # add padding     -p                   # add padding
Line 39: Line 40:
     IN=FreeBSD-aarch64-13.0-Khadas-EDGE-V-361468M-20200528.img     IN=FreeBSD-aarch64-13.0-Khadas-EDGE-V-361468M-20200528.img
     ./xze "$IN" \     ./xze "$IN" \
- --meta \ +--meta \ 
- label=FreeBSD \ +label=FreeBSD \ 
- builder=Serega \ +builder=Serega \ 
- date="$(LANG=C TZ= date)" \ +date="$(LANG=C TZ= date)" \ 
- match=BOARD=Edge \ +match=BOARD=Edge \ 
- link=http://dev.kubsu.ru/images/+link=http://dev.kubsu.ru/images/
- duration=60 \ +duration=60 \ 
- desc="FreeBSD 13.0 for Khadas EDGE board aarch64...." \+desc="FreeBSD 13.0 for Khadas EDGE board aarch64...." \
  
-# META minimal +# META minimal
  
     ./xze Manjaro-ARM-xfce-vim1-20.08.img.xz -p -MM LABEL=manjaro BOARD=VIM1     ./xze Manjaro-ARM-xfce-vim1-20.08.img.xz -p -MM LABEL=manjaro BOARD=VIM1
Line 56: Line 57:
     ./xze *.xz     ./xze *.xz
  
-# UPDATE/REPLACE META +# UPDATE/REPLACE META (replace all tags)
- +
-all prev meta will be replaced by new values+
  
     ./xze *.xz -M newvar=NEWVALUE     ./xze *.xz -M newvar=NEWVALUE
 +
 +# UPDATE ONLY SOME META TAGS (keep others intact)
 +
 +    ./xze *.xz --meta-update label="New label" duration=120
  
 # READ META alternative ways # READ META alternative ways
  
     tail -c4096 FILE.xz | xz -dc     tail -c4096 FILE.xz | xz -dc
-    # or +    # or
     curl -s -jkLf -r-4096 https://dl.khadas.com/Firmware/Krescue/images/Edge-FreeBSD-aarch64-13.0-CURRENT-20200620.img.xz | xz -dc     curl -s -jkLf -r-4096 https://dl.khadas.com/Firmware/Krescue/images/Edge-FreeBSD-aarch64-13.0-CURRENT-20200620.img.xz | xz -dc
  
Line 128: Line 131:
 SHOW_PROGRESS=1 SHOW_PROGRESS=1
  
 +META_UPDATE= 
 +META_LOW_CASE= 
 +META_PRE= 
 +META_POST=
  
 for a in $@; do for a in $@; do
Line 134: Line 140:
     shift     shift
     case $a in     case $a in
- -m) +-m) 
- META=1 +META=1 
- break +break 
- ;; +;; 
- -M) +-M) 
- META=2 +META=2 
- break +break 
- ;; +;; 
- -MM|--meta) +-MM|--meta) 
- META=2 +META=2 
- META_LOW_CASE=1 +META_LOW_CASE=1 
- META_PRE="##KRESCUE_META## type:xz " +META_PRE="##KRESCUE_META## type:xz " 
- META_POST="##KRESCUE-META## ##KRESCUE##END" +META_POST="##KRESCUE-META## ##KRESCUE##END" 
- break +break 
- ;; +;; 
- -mn|--meta--remove|--remove-meta) +--meta-update|-MU) 
- META_REMOVE=1 +META=2 
- ;; +META_UPDATE=1 
- -p) +META_LOW_CASE=1 
- ADD_PAD=1 +META_PRE="##KRESCUE_META## type:xz " 
- ;; +META_POST="##KRESCUE-META## ##KRESCUE##END" 
- -c) +break 
- KRESCUE_CHK_END=1 +;; 
- ;; +-mn|--meta--remove|--remove-meta) 
- -C) +META_REMOVE=1 
- KRESCUE_CHK_END=1 +;; 
- KRESCUE_CHK_MT=1 +-p) 
- ;; +ADD_PAD=1 
- -f) +;; 
- FORCE=1 +-c) 
- OPTS="$OPTS $a" +KRESCUE_CHK_END=1 
- continue +;; 
- ;; +-C) 
- -T*) +KRESCUE_CHK_END=1 
- T=${a#-T} +KRESCUE_CHK_MT=1 
- continue +;; 
- ;; +-f) 
- -B*) +FORCE=1 
- B=${a#-B} +OPTS="$OPTS $a" 
- continue +continue 
- ;; +;; 
- -h|--help) +-T*) 
- USAGE FULL +T=${a#-T} 
- ;; +continue 
- *.xz) +;; 
- [ -f "$a" ] || FAIL not found "$a" +-B*) 
- CIN="$a" +B=${a#-B} 
- continue +continue 
- ;; +;; 
- *) +-h|--help) 
- [ -f "$a" ] && { +USAGE FULL 
-     [ "$IN" ] || IN="$a" +;; 
-     continue +*.xz) 
-+[ -f "$a" ] || FAIL not found "$a" 
- OPTS="$OPTS $a" +CIN="$a" 
- ;;+continue 
 +;; 
 +*) 
 +[ -f "$a" ] && { 
 +    [ "$IN" ] || IN="$a" 
 +    continue 
 +
 +OPTS="$OPTS $a" 
 +;;
     esac     esac
 done done
Line 196: Line 210:
 [ "$T" = 0 ] && T=$(nproc) [ "$T" = 0 ] && T=$(nproc)
 [ "$T" = "" ] && T=4 [ "$T" = "" ] && T=4
-[ "$T" -gt 7 ] && T=8 # 8 cores can get too much memory+[ "$T" -gt 7 ] && T=8 # 8 cores can get too much memory
  
 meta="/tmp/xze.meta.$$" meta="/tmp/xze.meta.$$"
Line 280: Line 294:
     (     (
     [ "$S1" ] || {     [ "$S1" ] || {
- pixz=$(which pixz || which xz) +pixz=$(which pixz || which xz) 
- echo "[i] calculating uncompressed size ...">&+echo "[i] calculating uncompressed size ...">&
- S1=$($pixz -dc < "$OUT" | wc --bytes)+S1=$($pixz -dc < "$OUT" | wc --bytes)
     }     }
     echo "##META_FILE##"     echo "##META_FILE##"
Line 295: Line 309:
  
     for m in $META_PRE  ; do     for m in $META_PRE  ; do
- echo "$m" >> $meta+echo "$m" >> $meta
     done     done
  
Line 301: Line 315:
     M="$m"     M="$m"
     [ "$META" = "2" ] && {     [ "$META" = "2" ] && {
-# echo "$m" | grep -q ^\# || { +#echo "$m" | grep -q ^\# || { 
- M=$(echo "$m" | sed s/=/:\ /) +M=$(echo "$m" | sed s/=/:\ /) 
- m1=$(echo "${M%%:*}" | tr '[:upper:]' '[:lower:]'+m1=$(echo "${M%%:*}" | tr '[:upper:]' '[:lower:]'
- m2=$(echo ${M#*:}) +m2=$(echo ${M#*:}) 
-# echo "[=] '$m1' : '$m2'">&+#echo "[=] '$m1' : '$m2'">&
- case $m1 in +case $m1 in 
-     label) +    label) 
-     REQ_label="$m2" +    REQ_label="$m2" 
-     ;; +    ;; 
-     date) +    date) 
-     ADD_date="$m2" +    ADD_date="$m2" 
-     ;; +    ;; 
-     image) +    image) 
-     ADD_image="$m2" +    ADD_image="$m2" 
-     ;; +    ;; 
-     builder) +    builder) 
-     ADD_builder="$m2" +    ADD_builder="$m2" 
-     ;; +    ;; 
-     desc) +    desc) 
-     ADD_desc="$m2" +    ADD_desc="$m2" 
-     ;; +    ;; 
-     duration) +    duration) 
-     ADD_duration="$m2" +    ADD_duration="$m2" 
-     ;; +    ;; 
-     match) +    match) 
-     REQ_match="$m2" +    REQ_match="$m2" 
-     META_POST=" $META_POST" +    META_POST=" $META_POST" 
-     ;; +    ;; 
-     board) +    board) 
-     m1=match +    m1=match 
-     m2="BOARD=$m2" +    m2="BOARD=$m2" 
-     REQ_match="$m2" +    REQ_match="$m2" 
- esac+esac
  
- M="$m1: $m2" +M="$m1: $m2" 
- echo "$M" >> $meta +echo "$M" >> $meta 
-# }+#}
     }     }
-    +
 #   echo "[i] add meta $M">&2 #   echo "[i] add meta $M">&2
     done     done
Line 349: Line 363:
     [ "$ADD_duration" ] || echo "duration: 60" >> $meta     [ "$ADD_duration" ] || echo "duration: 60" >> $meta
     [ "$ADD_builder" ] || echo "builder: $(uname -n)" >> $meta     [ "$ADD_builder" ] || echo "builder: $(uname -n)" >> $meta
-    [ "$ADD_date" ] || echo "date: $(TZ= date)" >> $meta+    [ "$ADD_date" ] || echo "date: $(LANG=C TZ= date)" >> $meta
     [ "$ADD_image" ] || echo "image: $(basename ${OUT%.*})" >> $meta     [ "$ADD_image" ] || echo "image: $(basename ${OUT%.*})" >> $meta
  
     for m in $META_POST  ; do     for m in $META_POST  ; do
- echo "$m" >> $meta+echo "$m" >> $meta
     done     done
  
Line 368: Line 382:
     CLEAN     CLEAN
 #   echo "[i] DONE">&2 #   echo "[i] DONE">&2
 +    exit 0
 +}
 +
 +META_UPDATE_ONLY(){
 +    echo "
 +[i] update meta block
 +">&2
 +
 +    [ -s "$meta" ] || FAIL meta empty
 +
 +    tmp="$meta.upd"
 +    cp "$meta" "$tmp" || exit 1
 +
 +    for m in "$@"; do
 +        [ "$m" ] || continue
 +        case "$m" in
 +        *=*)
 +            key=${m%%=*}
 +            val=${m#*=}
 +
 +            # normalize key to lower-case
 +            key_lc=$(printf '%s\n' "$key" | tr '[:upper:]' '[:lower:]')
 +
 +            # escape value for sed replacement
 +            esc_val=$(printf '%s\n' "$val" | sed 's/[&/\\]/\\&/g')
 +
 +            if grep -q "^$key_lc:" "$tmp"; then
 +                # replace existing line
 +                sed "s/^$key_lc:[[:space:]].*/$key_lc: $esc_val/" "$tmp" > "$tmp.1"
 +            else
 +                # insert before krescue marker if exists, else append
 +                if grep -q "^##KRESCUE-META##" "$tmp"; then
 +                    sed "/^##KRESCUE-META##/i$key_lc: $esc_val" "$tmp" > "$tmp.1"
 +                else
 +                    sed '$a\'"$key_lc: $esc_val" "$tmp" > "$tmp.1"
 +                fi
 +            fi
 +
 +            mv "$tmp.1" "$tmp"
 +            ;;
 +        *)
 +            echo "[w] skip wrong meta-update arg '$m' (need key=value)" >&2
 +            ;;
 +        esac
 +    done
 +
 +    mv "$tmp" "$meta"
 +
 +    # show new meta
 +    cat "$meta" >&2
 +
 +    $xz "$meta" || exit 1
 +    PAD "$meta.xz" || exit 2
 +    cat "$meta.xz" >> "$OUT" || exit 3
 +    rm "$meta.xz"
 +
 +    CLEAN
     exit 0     exit 0
 } }
Line 393: Line 464:
  
     for v in ${XZS#*Filename}; do     for v in ${XZS#*Filename}; do
- case $i in +case $i in 
-     0) streams=$v;; +    0) streams=$v;; 
-     1) blocks=$v;; +    1) blocks=$v;; 
-     2) cmp1=$v;; +    2) cmp1=$v;; 
-     3) cmp2=$v;; +    3) cmp2=$v;; 
-     4) unc1=$v;; +    4) unc1=$v;; 
-     5) unc2=$v;; +    5) unc2=$v;; 
- esac +esac 
- i=$((i+1))+i=$((i+1))
     done     done
  
Line 407: Line 478:
  
     [ "$blocks" -lt 2 ] && {     [ "$blocks" -lt 2 ] && {
- echo "[w] its not mt xz">&+echo "[w] its not mt xz">&
- #[ "$KRESCUE_CHK_END" ] || FAIL not ready for krescue mt usage+#[ "$KRESCUE_CHK_END" ] || FAIL not ready for krescue mt usage
     }     }
  
Line 414: Line 485:
     CSCHK=$((CS/BS*BS))     CSCHK=$((CS/BS*BS))
  
-    [ "$ADD_PADD" ] && +    [ "$ADD_PADD" ] &&
     [ "$CSCHK" = "$CS" ] || {     [ "$CSCHK" = "$CS" ] || {
- PAD "$CIN" +PAD "$CIN" 
- CS=$(fsize "$CIN"+CS=$(fsize "$CIN"
- CSCHK=$((CS/BS*BS))+CSCHK=$((CS/BS*BS))
     }     }
     [ "$CSCHK" = "$CS" ] || FAIL xz size $CS not padded by $BS     [ "$CSCHK" = "$CS" ] || FAIL xz size $CS not padded by $BS
Line 425: Line 496:
  
     [ -s "$meta" ] || {     [ -s "$meta" ] || {
- [ "$META" ] && { +[ "$META" ] && { 
- OUT="$CIN" +OUT="$CIN" 
- #echo "[w] empty meta">&+#echo "[w] empty meta">&
- META "$@" +META "$@" 
- #CLEAN +#CLEAN 
- exit +exit 
-+
- FAIL empty meta+FAIL empty meta
     }     }
  
     [ "$META_REMOVE" ] && {     [ "$META_REMOVE" ] && {
- echo "[i] remove meta">&+echo "[i] remove meta">&
- truncate -s-4096 "$CIN" +truncate -s-4096 "$CIN" 
- exit+exit
     }     }
     grep -A99 "##META_FILE" $meta \     grep -A99 "##META_FILE" $meta \
Line 449: Line 520:
     [ "$META" ] && {     [ "$META" ] && {
     OUT="$CIN"     OUT="$CIN"
-    mv $meta.2 $meta+ 
 +    # for full replace, keep old behaviour (use only META_FILE block) 
 +    if [ "$META_UPDATE" ]; then 
 +        # keep full $meta (META_FILE + tags) for in-place update 
 +        : 
 +    else 
 +        mv $meta.2 $meta 
 +    fi 
     [ "$S1" ] || {     [ "$S1" ] || {
 #    echo "[i] get size" #    echo "[i] get size"
-    for S1 in $(grep UNPACKED_SIZE $meta) ; do +    for S1 in $(grep UNPACKED_SIZE $meta.2); do 
- echo $S1 >/dev/null+echo $S1 >/dev/null
     done     done
     }     }
 +
     truncate -s-$BS "$OUT"     truncate -s-$BS "$OUT"
-    META "$@"+ 
 +    if [ "$META_UPDATE" ]; then 
 +        META_UPDATE_ONLY "$@" 
 +    else 
 +        META "$@" 
 +    fi
     }     }
     CLEAN     CLEAN
Line 523: Line 608:
 [ "$META" ] && { [ "$META" ] && {
 META "$@" META "$@"
-exit +exit
 } }
  
 exit 0 exit 0
 ``` ```
Last modified: 2026/05/21 22:13 by hyphop