blob: 4a5fc5fe503ea4cef9f7a9f8a59678d00e7c208c [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
Gunnar Mills29414352017-10-25 11:07:43 -05004help=$'Generate Tarball with PNOR SquashFS image and MANIFEST Script
Gunnar Millse8221902017-02-03 15:59:06 -06005
Gunnar Mills29414352017-10-25 11:07:43 -05006Generates a PNOR SquashFS image from the PNOR image
7Creates a MANIFEST for image verification and recreation
Saqib Khan93433f02017-03-23 22:24:27 -05008Packages 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'
Adriana Kobylak1e4a7f22017-07-09 16:12:36 -050019# Reference the ffs structures at:
20# https://github.com/open-power/hostboot/blob/master/src/usr/pnor/common/ffs_hb.H
21# https://github.com/open-power/hostboot/blob/master/src/usr/pnor/ffs.h
Gunnar Millsd4908a42017-03-07 08:25:59 -060022let ffs_entry_size=128
Adriana Kobylak1e4a7f22017-07-09 16:12:36 -050023let vercheck_offset=112
Michael Tritz8f396732017-06-09 10:55:35 -050024outfile=""
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060025declare -a partitions=()
26tocfile="pnor.toc"
Gunnar Mills37751f92017-02-07 21:05:01 -060027
Gunnar Millse8221902017-02-03 15:59:06 -060028while [[ $# -gt 0 ]]; do
29 key="$1"
30 case $key in
Gunnar Mills37751f92017-02-07 21:05:01 -060031 -f|--file)
32 outfile="$2"
33 shift 2
34 ;;
Gunnar Millse8221902017-02-03 15:59:06 -060035 -h|--help)
36 echo "$help"
37 exit
38 ;;
39 *)
Gunnar Millsc15b02d2017-03-03 10:28:37 -060040 pnorfile="$1"
41 shift 1
Gunnar Millse8221902017-02-03 15:59:06 -060042 ;;
43 esac
44done
Gunnar Mills18f7cdb2017-02-07 16:44:19 -060045
Gunnar Millsc15b02d2017-03-03 10:28:37 -060046if [ ! -f "${pnorfile}" ]; then
47 echo "Please enter a valid PNOR file."
48 echo "$help"
49 exit 1
50fi
51
Michael Tritz8f396732017-06-09 10:55:35 -050052if [[ -z $outfile ]]; then
53 if [[ ${pnorfile##*.} == "pnor" ]]; then
54 outfile=`pwd`/${pnorfile##*/}.squashfs.tar
55 else
56 outfile=`pwd`/${pnorfile##*/}.pnor.squashfs.tar
57 fi
58else
59 if [[ $outfile != /* ]]; then
60 outfile=`pwd`/$outfile
61 fi
62fi
63
Gunnar Millsf8f11302017-03-08 13:11:33 -060064scratch_dir=`mktemp -d`
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060065
66echo "Parsing PNOR TOC..."
Gunnar Millsd4908a42017-03-07 08:25:59 -060067
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
Gunnar Millsd4908a42017-03-07 08:25:59 -060081 id=${fields[0]##*=}
Adriana Kobylak1e4a7f22017-07-09 16:12:36 -050082 offset=$((${ffs_entry_size} * 10#${id} + ${vercheck_offset}))
83 vercheck=$(xxd -p -l 0x1 -seek ${offset} ${scratch_dir}/part)
Michael Tritz1bd65ac2017-05-07 17:40:14 -050084 export flags=$(pflash --detail=$((10#$id)) -F ${pnorfile} | grep "\[" |
85 sed 's/....$//' | tr '\n' ',' | sed 's/.$//')
86 if [[ $flags != "" ]]; then
87 flags=,$flags
88 fi
89
90 if [[ $(echo $flags | grep "READONLY") == "" &&
91 $(echo $flags | grep "PRESERVED") == "" ]]; then
92 flags=$flags,READWRITE
Gunnar Millsd4908a42017-03-07 08:25:59 -060093 fi
94
Gunnar Millse0ed3022017-03-02 16:16:19 -060095 # Need the partition ID, name, start location, end location, and flags
Adriana Kobylak1e4a7f22017-07-09 16:12:36 -050096 echo "partition${id}=${fields[1]},${fields[2]/../,},${vercheck}${flags}"
Gunnar Millsd4908a42017-03-07 08:25:59 -060097
Gunnar Mills6b5b27e2017-03-01 21:37:01 -060098 # Save the partition name
99 partitions+=(${fields[1]})
100 fi
Adriana Kobylak1e4a7f22017-07-09 16:12:36 -0500101 # Don't need the BACKUP_PART partition
102 done < <(pflash --info -F ${pnorfile} | grep -v "BACKUP")
Gunnar Mills6b5b27e2017-03-01 21:37:01 -0600103} > ${scratch_dir}/${tocfile}
Gunnar Mills37751f92017-02-07 21:05:01 -0600104
Gunnar Mills18f7cdb2017-02-07 16:44:19 -0600105for partition in "${partitions[@]}"; do
106 echo "Reading ${partition}..."
Gunnar Millsf8f11302017-03-08 13:11:33 -0600107 pflash --partition=${partition} \
108 --read=${scratch_dir}/${partition} \
109 -F ${pnorfile}
Gunnar Mills18f7cdb2017-02-07 16:44:19 -0600110done
Gunnar Mills37751f92017-02-07 21:05:01 -0600111
112echo "Creating SquashFS image..."
Gunnar Mills37751f92017-02-07 21:05:01 -0600113cd "${scratch_dir}"
Adriana Kobylak9c866062017-04-13 16:12:32 -0500114mksquashfs ${tocfile} ${partitions[*]} pnor.xz.squashfs
Gunnar Mills37751f92017-02-07 21:05:01 -0600115
Saqib Khan93433f02017-03-23 22:24:27 -0500116echo "Creating MANIFEST for the image"
Adriana Kobylak9c866062017-04-13 16:12:32 -0500117manifest_location="MANIFEST"
Leonel Gonzalezc14a3d22017-06-22 12:49:38 -0500118echo -e "purpose=xyz.openbmc_project.Software.Version.VersionPurpose.Host\nversion=$version\n\
Saqib Khan7254f0e2017-04-10 21:45:37 -0500119extended_version=$extended_version" >> $manifest_location
Saqib Khan93433f02017-03-23 22:24:27 -0500120
121echo "Generating tarball to contain the SquashFS image and its MANIFEST"
Adriana Kobylak9c866062017-04-13 16:12:32 -0500122tar -cvf $outfile $manifest_location pnor.xz.squashfs
Saqib Khan93433f02017-03-23 22:24:27 -0500123
124echo "SquashFSTarball at ${outfile}"
Gunnar Mills37751f92017-02-07 21:05:01 -0600125rm -r "${scratch_dir}"