blob: 6b146180b1bea87fa7545254cf564e2c060d06c8 [file] [log] [blame]
Gunnar Mills6b5b27e2017-03-01 21:37:01 -06001#!/bin/bash
Gunnar Millsf8f11302017-03-08 13:11:33 -06002set -eo pipefail
Gunnar Millse8221902017-02-03 15:59:06 -06003
Saqib Khan93433f02017-03-23 22:24:27 -05004help=$'Generate Tarball with SquashFS image and MANIFEST Script
Gunnar Millse8221902017-02-03 15:59:06 -06005
6Generates a SquashFS image from the PNOR image
Saqib Khan93433f02017-03-23 22:24:27 -05007Creates a MANIFEST for image verification
8Packages the SquashFS image and MANIFEST together in a tarball
Gunnar Millse8221902017-02-03 15:59:06 -06009
Gunnar Millsc15b02d2017-03-03 10:28:37 -060010usage: generate-squashfs [OPTION] <PNOR FILE>...
Gunnar Millse8221902017-02-03 15:59:06 -060011
12Options:
Gunnar Mills37751f92017-02-07 21:05:01 -060013 -f, --file <file> Specify destination file. Defaults to
Saqib Khan93433f02017-03-23 22:24:27 -050014 `pwd`/pnor.squashfs.tar if unspecified.
Gunnar Millse8221902017-02-03 15:59:06 -060015 -h, --help Display this help text and exit.
16'
17
Gunnar Millsd4908a42017-03-07 08:25:59 -060018let ffs_entry_size=128
19let miscflags_offset=112
Saqib Khan93433f02017-03-23 22:24:27 -050020outfile=`pwd`"/pnor.squashfs.tar"
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060021declare -a partitions=()
22tocfile="pnor.toc"
Gunnar Mills37751f92017-02-07 21:05:01 -060023
Gunnar Millse8221902017-02-03 15:59:06 -060024while [[ $# -gt 0 ]]; do
25 key="$1"
26 case $key in
Gunnar Mills37751f92017-02-07 21:05:01 -060027 -f|--file)
28 outfile="$2"
29 shift 2
30 ;;
Gunnar Millse8221902017-02-03 15:59:06 -060031 -h|--help)
32 echo "$help"
33 exit
34 ;;
35 *)
Gunnar Millsc15b02d2017-03-03 10:28:37 -060036 pnorfile="$1"
37 shift 1
Gunnar Millse8221902017-02-03 15:59:06 -060038 ;;
39 esac
40done
Gunnar Mills18f7cdb2017-02-07 16:44:19 -060041
Gunnar Millsc15b02d2017-03-03 10:28:37 -060042if [ ! -f "${pnorfile}" ]; then
43 echo "Please enter a valid PNOR file."
44 echo "$help"
45 exit 1
46fi
47
Gunnar Millsf8f11302017-03-08 13:11:33 -060048scratch_dir=`mktemp -d`
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060049
50echo "Parsing PNOR TOC..."
Gunnar Millsd4908a42017-03-07 08:25:59 -060051
52# Needed to get the READONLY and PRESERVED flags
53# TODO: Get READONLY and PRESERVED flags from pflash instead.
Gunnar Millsf8f11302017-03-08 13:11:33 -060054pflash --partition=part --read=${scratch_dir}/part -F ${pnorfile}
Gunnar Mills2f27b742017-03-20 13:46:30 -050055pflash --partition=VERSION --read=${scratch_dir}/VERSION -F ${pnorfile}
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060056{
Gunnar Mills2f27b742017-03-20 13:46:30 -050057 version=$(head -n 1 ${scratch_dir}/VERSION)
58 echo "version=$version"
Saqib Khan029b8252017-03-22 21:38:07 -050059 extended_version=$(echo $(tail -n +2 ${scratch_dir}/VERSION)|tr ' ' ',')
60 echo "extended_version=$extended_version"
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060061 while read line; do
62 if [[ $line == "ID="* ]]; then
Gunnar Millse0ed3022017-03-02 16:16:19 -060063 # This line looks like
64 # "ID=05 MVPD 000d9000..00169000 (actual=00090000) [ECC]"
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060065 read -r -a fields <<< "$line"
Gunnar Millse0ed3022017-03-02 16:16:19 -060066
67 # Get any flags attached to end (e.g. [ECC])
68 flags=""
69 for flag in "${fields[@]:4}"
70 do
71 flags+=",${flag//[\[\]]/}"
72 done
73
Gunnar Millsd4908a42017-03-07 08:25:59 -060074 id=${fields[0]##*=}
75 offset=$((${ffs_entry_size} * 10#${id} + ${miscflags_offset}))
76 miscflags=0x$(xxd -p -l 0x1 -seek ${offset} ${scratch_dir}/part)
77 if ((miscflags & 0x80)); then
78 flags+=",PRESERVED"
79 fi
80 if ((miscflags & 0x40)); then
81 flags+=",READONLY"
82 fi
83
Gunnar Millse0ed3022017-03-02 16:16:19 -060084 # Need the partition ID, name, start location, end location, and flags
Gunnar Millsd4908a42017-03-07 08:25:59 -060085 echo "partition${id}=${fields[1]},${fields[2]/../,}${flags}"
86
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060087 # Save the partition name
88 partitions+=(${fields[1]})
89 fi
Gunnar Mills2f27b742017-03-20 13:46:30 -050090 # Don't need part, version, or backup_part partitions
91 done < <(pflash --info -F ${pnorfile} | grep -v -i "part\|version")
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060092} > ${scratch_dir}/${tocfile}
Gunnar Mills37751f92017-02-07 21:05:01 -060093
Gunnar Mills18f7cdb2017-02-07 16:44:19 -060094for partition in "${partitions[@]}"; do
95 echo "Reading ${partition}..."
Gunnar Millsf8f11302017-03-08 13:11:33 -060096 pflash --partition=${partition} \
97 --read=${scratch_dir}/${partition} \
98 -F ${pnorfile}
Gunnar Mills18f7cdb2017-02-07 16:44:19 -060099done
Gunnar Mills37751f92017-02-07 21:05:01 -0600100
101echo "Creating SquashFS image..."
Gunnar Mills37751f92017-02-07 21:05:01 -0600102cd "${scratch_dir}"
Saqib Khan93433f02017-03-23 22:24:27 -0500103mksquashfs ${tocfile} ${partitions[*]} ${scratch_dir}/pnor.xz.squashfs
Gunnar Mills37751f92017-02-07 21:05:01 -0600104
Saqib Khan93433f02017-03-23 22:24:27 -0500105echo "Creating MANIFEST for the image"
106manifest_location="${scratch_dir}/MANIFEST"
Saqib Khan7254f0e2017-04-10 21:45:37 -0500107echo -e "purpose=host\nversion=$version\n\
108extended_version=$extended_version" >> $manifest_location
Saqib Khan93433f02017-03-23 22:24:27 -0500109
110echo "Generating tarball to contain the SquashFS image and its MANIFEST"
111tar -cvf $outfile $manifest_location ${scratch_dir}/pnor.xz.squashfs
112
113echo "SquashFSTarball at ${outfile}"
Gunnar Mills37751f92017-02-07 21:05:01 -0600114rm -r "${scratch_dir}"