blob: 9eb6fea4fb1a76675f3ca3afb550eb1166c4d6ae [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
Michael Tritz8f396732017-06-09 10:55:35 -050014 `pwd`/<PNOR FILE>.pnor.squashfs.tar if unspecified.
15 (For example, "generate-squashfs my.pnor" would
16 generate `pwd`/my.pnor.squashfs.tar output.)
Gunnar Millse8221902017-02-03 15:59:06 -060017 -h, --help Display this help text and exit.
18'
19
Gunnar Millsd4908a42017-03-07 08:25:59 -060020let ffs_entry_size=128
21let miscflags_offset=112
Michael Tritz8f396732017-06-09 10:55:35 -050022outfile=""
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060023declare -a partitions=()
24tocfile="pnor.toc"
Gunnar Mills37751f92017-02-07 21:05:01 -060025
Gunnar Millse8221902017-02-03 15:59:06 -060026while [[ $# -gt 0 ]]; do
27 key="$1"
28 case $key in
Gunnar Mills37751f92017-02-07 21:05:01 -060029 -f|--file)
30 outfile="$2"
31 shift 2
32 ;;
Gunnar Millse8221902017-02-03 15:59:06 -060033 -h|--help)
34 echo "$help"
35 exit
36 ;;
37 *)
Gunnar Millsc15b02d2017-03-03 10:28:37 -060038 pnorfile="$1"
39 shift 1
Gunnar Millse8221902017-02-03 15:59:06 -060040 ;;
41 esac
42done
Gunnar Mills18f7cdb2017-02-07 16:44:19 -060043
Gunnar Millsc15b02d2017-03-03 10:28:37 -060044if [ ! -f "${pnorfile}" ]; then
45 echo "Please enter a valid PNOR file."
46 echo "$help"
47 exit 1
48fi
49
Michael Tritz8f396732017-06-09 10:55:35 -050050if [[ -z $outfile ]]; then
51 if [[ ${pnorfile##*.} == "pnor" ]]; then
52 outfile=`pwd`/${pnorfile##*/}.squashfs.tar
53 else
54 outfile=`pwd`/${pnorfile##*/}.pnor.squashfs.tar
55 fi
56else
57 if [[ $outfile != /* ]]; then
58 outfile=`pwd`/$outfile
59 fi
60fi
61
Gunnar Millsf8f11302017-03-08 13:11:33 -060062scratch_dir=`mktemp -d`
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060063
64echo "Parsing PNOR TOC..."
Gunnar Millsd4908a42017-03-07 08:25:59 -060065
66# Needed to get the READONLY and PRESERVED flags
67# TODO: Get READONLY and PRESERVED flags from pflash instead.
Gunnar Millsf8f11302017-03-08 13:11:33 -060068pflash --partition=part --read=${scratch_dir}/part -F ${pnorfile}
Gunnar Mills2f27b742017-03-20 13:46:30 -050069pflash --partition=VERSION --read=${scratch_dir}/VERSION -F ${pnorfile}
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060070{
Gunnar Mills2f27b742017-03-20 13:46:30 -050071 version=$(head -n 1 ${scratch_dir}/VERSION)
72 echo "version=$version"
Saqib Khan029b8252017-03-22 21:38:07 -050073 extended_version=$(echo $(tail -n +2 ${scratch_dir}/VERSION)|tr ' ' ',')
74 echo "extended_version=$extended_version"
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060075 while read line; do
76 if [[ $line == "ID="* ]]; then
Gunnar Millse0ed3022017-03-02 16:16:19 -060077 # This line looks like
78 # "ID=05 MVPD 000d9000..00169000 (actual=00090000) [ECC]"
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060079 read -r -a fields <<< "$line"
Gunnar Millse0ed3022017-03-02 16:16:19 -060080
81 # Get any flags attached to end (e.g. [ECC])
82 flags=""
83 for flag in "${fields[@]:4}"
84 do
85 flags+=",${flag//[\[\]]/}"
86 done
87
Gunnar Millsd4908a42017-03-07 08:25:59 -060088 id=${fields[0]##*=}
89 offset=$((${ffs_entry_size} * 10#${id} + ${miscflags_offset}))
90 miscflags=0x$(xxd -p -l 0x1 -seek ${offset} ${scratch_dir}/part)
91 if ((miscflags & 0x80)); then
92 flags+=",PRESERVED"
Adriana Kobylak9c866062017-04-13 16:12:32 -050093 elif ((miscflags & 0x40)); then
Gunnar Millsd4908a42017-03-07 08:25:59 -060094 flags+=",READONLY"
Adriana Kobylak9c866062017-04-13 16:12:32 -050095 else
96 flags+=",READWRITE"
Gunnar Millsd4908a42017-03-07 08:25:59 -060097 fi
98
Gunnar Millse0ed3022017-03-02 16:16:19 -060099 # Need the partition ID, name, start location, end location, and flags
Gunnar Millsd4908a42017-03-07 08:25:59 -0600100 echo "partition${id}=${fields[1]},${fields[2]/../,}${flags}"
101
Gunnar Mills6b5b27e2017-03-01 21:37:01 -0600102 # Save the partition name
103 partitions+=(${fields[1]})
104 fi
Gunnar Mills2f27b742017-03-20 13:46:30 -0500105 # Don't need part, version, or backup_part partitions
106 done < <(pflash --info -F ${pnorfile} | grep -v -i "part\|version")
Gunnar Mills6b5b27e2017-03-01 21:37:01 -0600107} > ${scratch_dir}/${tocfile}
Gunnar Mills37751f92017-02-07 21:05:01 -0600108
Gunnar Mills18f7cdb2017-02-07 16:44:19 -0600109for partition in "${partitions[@]}"; do
110 echo "Reading ${partition}..."
Gunnar Millsf8f11302017-03-08 13:11:33 -0600111 pflash --partition=${partition} \
112 --read=${scratch_dir}/${partition} \
113 -F ${pnorfile}
Gunnar Mills18f7cdb2017-02-07 16:44:19 -0600114done
Gunnar Mills37751f92017-02-07 21:05:01 -0600115
116echo "Creating SquashFS image..."
Gunnar Mills37751f92017-02-07 21:05:01 -0600117cd "${scratch_dir}"
Adriana Kobylak9c866062017-04-13 16:12:32 -0500118mksquashfs ${tocfile} ${partitions[*]} pnor.xz.squashfs
Gunnar Mills37751f92017-02-07 21:05:01 -0600119
Saqib Khan93433f02017-03-23 22:24:27 -0500120echo "Creating MANIFEST for the image"
Adriana Kobylak9c866062017-04-13 16:12:32 -0500121manifest_location="MANIFEST"
Leonel Gonzalezc14a3d22017-06-22 12:49:38 -0500122echo -e "purpose=xyz.openbmc_project.Software.Version.VersionPurpose.Host\nversion=$version\n\
Saqib Khan7254f0e2017-04-10 21:45:37 -0500123extended_version=$extended_version" >> $manifest_location
Saqib Khan93433f02017-03-23 22:24:27 -0500124
125echo "Generating tarball to contain the SquashFS image and its MANIFEST"
Adriana Kobylak9c866062017-04-13 16:12:32 -0500126tar -cvf $outfile $manifest_location pnor.xz.squashfs
Saqib Khan93433f02017-03-23 22:24:27 -0500127
128echo "SquashFSTarball at ${outfile}"
Gunnar Mills37751f92017-02-07 21:05:01 -0600129rm -r "${scratch_dir}"