@@ -77,51 +77,63 @@ json.dump(j, sys.stdout, indent=4)
7777# For qemu-secex we need to do a few extra things like spin up a
7878# VM to run genprotimg and save off the pubkey for Ignition.
7979postprocess_qemu_secex () {
80- if [ ! -f " ${genprotimgvm} " ]; then
81- fatal " No genprotimgvm provided at ${genprotimgvm} "
82- fi
83-
84- # Basic qemu args:
85- qemu_args=(); blk_size=" 512"
86- [[ $platform == metal4k ]] && blk_size=" 4096"
87- qemu_args+=(" -drive" " if=none,id=target,format=qcow,file=${imgpath} ,cache=unsafe" \
88- " -device" " virtio-blk,serial=target,drive=target,physical_block_size=${blk_size} ,logical_block_size=${blk_size} " )
89-
90- # SecureVM (holding Universal Key for all IBM Z Mainframes) requires scripts to execute genprotimg
91- se_script_dir=" /usr/lib/coreos-assembler/secex-genprotimgvm-scripts"
92- genprotimg_img=" ${PWD} /secex-genprotimg.img"
93- genprotimg_dir=$( mktemp -p " ${tmp_builddir} " -d)
94- cp " ${se_script_dir} /genprotimg-script.sh" " ${se_script_dir} /post-script.sh" " ${genprotimg_dir} "
95- # Extra kargs with dm-verity hashes
96- secex_kargs=" ignition.firstboot"
97- secex_kargs+=" rootfs.roothash=$( < " ${outdir} /${platform} /rootfs_hash" ) "
98- secex_kargs+=" bootfs.roothash=$( < " ${outdir} /${platform} /bootfs_hash" ) "
99- echo " ${secex_kargs} " > " ${genprotimg_dir} /parmfile"
100- virt-make-fs --format=raw --type=ext4 " ${genprotimg_dir} " " ${genprotimg_img} "
101- rm -rf " ${genprotimg_dir} "
102- qemu_args+=(" -drive" " if=none,id=genprotimg,format=raw,file=${genprotimg_img} " \
103- " -device" " virtio-blk,serial=genprotimg,drive=genprotimg" )
104-
105- # GPG keys used for protecting Ignition config
106- tmp_gpg_home=$( mktemp -p " ${tmp_builddir} " -d)
107- ignition_pubkey=$( mktemp -p " ${tmp_builddir} " )
108- ignition_prikey=$( mktemp -p " ${tmp_builddir} " )
109- gpg --homedir " ${tmp_gpg_home} " --batch --passphrase ' ' --yes --quick-gen-key " Secure Execution (secex) ${build} " rsa4096 encr none
110- gpg --homedir " ${tmp_gpg_home} " --armor --export secex > " ${ignition_pubkey} "
111- gpg --homedir " ${tmp_gpg_home} " --armor --export-secret-key secex > " ${ignition_prikey} "
112- exec 9< " ${ignition_prikey} "
113- rm -rf " ${tmp_gpg_home} " " ${ignition_prikey} "
114- qemu_args+=(" -add-fd" " fd=9,set=3" " -drive" " if=none,id=gpgkey,format=raw,file=/dev/fdset/3,readonly=on" \
115- " -device" " virtio-blk,serial=gpgkey,drive=gpgkey" )
116-
117- /usr/lib/coreos-assembler/secex-genprotimgvm-scripts/runvm.sh \
118- --genprotimgvm " ${genprotimgvm} " -- " ${qemu_args[@]} "
119- rm -f " ${genprotimg_img} "
120- exec 9>& -
121-
122- # Now store the generated ${ignition_pubkey} in the builddir and meta.json
123- gpg_key_filename=" ${name} -${build} -ignition-secex-key.gpg.pub"
124- postprocess_artifact " ignition-gpg-key" " ${ignition_pubkey} " " ${gpg_key_filename} " ' True'
80+ if [ ! -f " ${genprotimgvm} " ]; then
81+ if [ ! -f " ${hostkey} " ]; then
82+ fatal " No hostkey and no genprotimgvm provided"
83+ fi
84+ echo " Generating genprotimgvm locally"
85+ ignition=$( mktemp -p " ${tmp_builddir} " )
86+ butane -p -d " $( dirname " ${hostkey} " ) " /usr/lib/coreos-assembler/secex-genprotimgvm-scripts/genprotimg.bu -o " ${ignition} "
87+
88+ genprotimgvm=/srv/fake-secure-vm.qcow2
89+ cp " /srv/builds/latest/${basearch} /${name} -${build} -qemu.${basearch} .${image_format} " " ${genprotimgvm} "
90+ chmod +w " ${genprotimgvm} "
91+ genvm_args=(" -drive" " if=none,id=hda,file=${genprotimgvm} ,auto-read-only=off,cache=unsafe" \
92+ " -device" " virtio-blk,drive=hda,bootindex=1" )
93+ kola qemuexec -i " ${ignition} " -- " ${genvm_args[@]} "
94+ fi
95+
96+ # Basic qemu args:
97+ qemu_args=(); blk_size=" 512"
98+ [[ $platform == metal4k ]] && blk_size=" 4096"
99+ qemu_args+=(" -drive" " if=none,id=target,format=qcow,file=${imgpath} ,cache=unsafe" \
100+ " -device" " virtio-blk,serial=target,drive=target,physical_block_size=${blk_size} ,logical_block_size=${blk_size} " )
101+
102+ # SecureVM (holding Universal Key for all IBM Z Mainframes) requires scripts to execute genprotimg
103+ se_script_dir=" /usr/lib/coreos-assembler/secex-genprotimgvm-scripts"
104+ genprotimg_img=" ${PWD} /secex-genprotimg.img"
105+ genprotimg_dir=$( mktemp -p " ${tmp_builddir} " -d)
106+ cp " ${se_script_dir} /genprotimg-script.sh" " ${se_script_dir} /post-script.sh" " ${genprotimg_dir} "
107+ # Extra kargs with dm-verity hashes
108+ secex_kargs=" ignition.firstboot"
109+ secex_kargs+=" rootfs.roothash=$( < " ${outdir} /${platform} /rootfs_hash" ) "
110+ secex_kargs+=" bootfs.roothash=$( < " ${outdir} /${platform} /bootfs_hash" ) "
111+ echo " ${secex_kargs} " > " ${genprotimg_dir} /parmfile"
112+ virt-make-fs --format=raw --type=ext4 " ${genprotimg_dir} " " ${genprotimg_img} "
113+ rm -rf " ${genprotimg_dir} "
114+ qemu_args+=(" -drive" " if=none,id=genprotimg,format=raw,file=${genprotimg_img} " \
115+ " -device" " virtio-blk,serial=genprotimg,drive=genprotimg" )
116+
117+ # GPG keys used for protecting Ignition config
118+ tmp_gpg_home=$( mktemp -p " ${tmp_builddir} " -d)
119+ ignition_pubkey=$( mktemp -p " ${tmp_builddir} " )
120+ ignition_prikey=$( mktemp -p " ${tmp_builddir} " )
121+ gpg --homedir " ${tmp_gpg_home} " --batch --passphrase ' ' --yes --quick-gen-key " Secure Execution (secex) ${build} " rsa4096 encr none
122+ gpg --homedir " ${tmp_gpg_home} " --armor --export secex > " ${ignition_pubkey} "
123+ gpg --homedir " ${tmp_gpg_home} " --armor --export-secret-key secex > " ${ignition_prikey} "
124+ exec 9< " ${ignition_prikey} "
125+ rm -rf " ${tmp_gpg_home} " " ${ignition_prikey} "
126+ qemu_args+=(" -add-fd" " fd=9,set=3" " -drive" " if=none,id=gpgkey,format=raw,file=/dev/fdset/3,readonly=on" \
127+ " -device" " virtio-blk,serial=gpgkey,drive=gpgkey" )
128+
129+ /usr/lib/coreos-assembler/secex-genprotimgvm-scripts/runvm.sh \
130+ --genprotimgvm " ${genprotimgvm} " -- " ${qemu_args[@]} "
131+ rm -f " ${genprotimg_img} "
132+ exec 9>& -
133+
134+ # Now store the generated ${ignition_pubkey} in the builddir and meta.json
135+ gpg_key_filename=" ${name} -${build} -ignition-secex-key.gpg.pub"
136+ postprocess_artifact " ignition-gpg-key" " ${ignition_pubkey} " " ${gpg_key_filename} " ' True'
125137}
126138
127139# Here we generate the input JSON we pass to runvm_osbuild for all of our image builds
207219main () {
208220 # Set Some Defaults
209221 genprotimgvm=/data.secex/genprotimgvm.qcow2
222+ hostkey=/srv/secex-hostkey
210223 build=
211224 force=
212225
@@ -244,6 +257,10 @@ main() {
244257 genprotimgvm=" $2 "
245258 shift
246259 ;;
260+ --hostkey)
261+ hostkey=" $2 "
262+ shift
263+ ;;
247264 --platforms)
248265 shift # The arg is next in position args
249266 # Split the comma separated string of platforms into an array
0 commit comments