diff --git a/bbb-convert-stage-2.sh b/bbb-convert-stage-2.sh index c2be2b9..c2106b2 100755 --- a/bbb-convert-stage-2.sh +++ b/bbb-convert-stage-2.sh @@ -4,15 +4,12 @@ sdimg_boot_dir=$1 embedded_rootfs_dir=$2 uboot_backup_dir=${embedded_rootfs_dir}/opt/backup/uboot -echo $sdimg_boot_dir -echo $embedded_rootfs_dir - [ ! -d "${sdimg_boot_dir}" ] && \ - { echo "Error: boot location not mounted."; exit 1; } + { log "Error: boot location not mounted."; exit 1; } [ ! -d "${embedded_rootfs_dir}" ] && \ - { echo "Error: embedded content not mounted."; exit 1; } + { log "Error: embedded content not mounted."; exit 1; } [[ ! -f $uboot_backup_dir/MLO || ! -f $uboot_backup_dir/u-boot.img ]] && \ - { echo "Error: cannot find U-Boot related files."; exit 1; } + { log "Error: cannot find U-Boot related files."; exit 1; } set_uenv() { cat <<- 'EOF' | sudo tee --append $sdimg_boot_dir/uEnv.txt 2>&1 >/dev/null @@ -45,6 +42,6 @@ sudo cp ${uboot_backup_dir}/u-boot.img ${sdimg_boot_dir} # Create U-Boot purposed uEnv.txt file. set_uenv -echo -e "\nStage done." +log "\tDone." exit 0 diff --git a/bbb-convert-stage-3.sh b/bbb-convert-stage-3.sh index dda63ae..20ae0a2 100755 --- a/bbb-convert-stage-3.sh +++ b/bbb-convert-stage-3.sh @@ -4,9 +4,9 @@ sdimg_primary_dir=$1 embedded_rootfs_dir=$2 [ ! -d "${sdimg_primary_dir}" ] && \ - { echo "Error: rootfs location not mounted."; exit 1; } + { log "Error: rootfs location not mounted."; exit 1; } [ ! -d "${embedded_rootfs_dir}" ] && \ - { echo "Error: embedded content not mounted."; exit 1; } + { log "Error: embedded content not mounted."; exit 1; } # Copy rootfs partition. sudo cp -ar ${embedded_rootfs_dir}/* ${sdimg_primary_dir} @@ -15,6 +15,6 @@ sudo cp -ar ${embedded_rootfs_dir}/* ${sdimg_primary_dir} sudo install -d -m 755 ${sdimg_primary_dir}/boot/efi sudo install -d -m 755 ${sdimg_primary_dir}/data -echo -e "\nStage done." +log "\tDone." exit 0 diff --git a/bbb-convert-stage-5.sh b/bbb-convert-stage-5.sh index 310e827..86568c3 100755 --- a/bbb-convert-stage-5.sh +++ b/bbb-convert-stage-5.sh @@ -44,6 +44,7 @@ device_type= keep=0 efi_boot=EFI/BOOT EFI_STUB_VER="4.12.0" +build_log=$output_dir/build.log declare -a mender_disk_mappings @@ -68,13 +69,14 @@ get_kernel_version() { # # $1 - linux kernel version build_env_lock_boot_files() { + log "\tBuilding boot scripts and tools." local grubenv_repo_vc_dir=$grubenv_dir/.git local grubenv_build_dir=$grubenv_dir/build mkdir -p $grubenv_dir if [ ! -d $grubenv_repo_vc_dir ]; then - git clone https://github.com/mendersoftware/grub-mender-grubenv.git $grubenv_dir + git clone https://github.com/mendersoftware/grub-mender-grubenv.git $grubenv_dir >> "$build_log" 2>&1 fi cd $grubenv_dir @@ -90,8 +92,8 @@ build_env_lock_boot_files() { sed -i '/^kernel_imagetype/s/=.*$/='${kernel_imagetype}'/' mender_grubenv_defines sed -i '/^kernel_devicetree/s/=.*$/='${kernel_devicetree//\//\\/}'/' mender_grubenv_defines - make --quiet - make --quiet DESTDIR=$grubenv_build_dir install + make --quiet >> "$build_log" 2>&1 + make --quiet DESTDIR=$grubenv_build_dir install >> "$build_log" 2>&1 cd $output_dir } @@ -99,6 +101,8 @@ build_env_lock_boot_files() { # # $1 - linux kernel version build_grub_efi() { + log "\tBuilding GRUB efi file." + local grub_build_dir=$grub_dir/build local grub_arm_dir=$grub_build_dir/arm local host=$(uname -m) @@ -109,16 +113,16 @@ build_grub_efi() { # Build grub modules for arm platform and executables for the host. if [ ! -d $grub_repo_vc_dir ]; then - git clone git://git.savannah.gnu.org/grub.git $grub_dir + git clone git://git.savannah.gnu.org/grub.git $grub_dir >> "$build_log" 2>&1 fi cd $grub_dir - make --quiet distclean + make --quiet distclean >> "$build_log" 2>&1 if [ $(version $version) -lt $(version $EFI_STUB_VER) ]; then # To avoid error message: "plain image kernel not supported - rebuild # with CONFIG_(U)EFI_STUB enabled" - use a specific commit. - git checkout 9b37229f0 + git checkout 9b37229f0 >> "$build_log" 2>&1 fi mkdir -p $grub_arm_dir @@ -127,27 +131,27 @@ build_grub_efi() { local cores=$(nproc) # First build host tools. - ./autogen.sh > /dev/null - ./configure --quiet CC=gcc --target=${host} --with-platform=efi --prefix=$grub_host_dir - make --quiet -j$cores - make --quiet install + ./autogen.sh >> "$build_log" 2>&1 + ./configure --quiet CC=gcc --target=${host} --with-platform=efi --prefix=$grub_host_dir >> "$build_log" 2>&1 + make --quiet -j$cores >> "$build_log" 2>&1 + make --quiet install >> "$build_log" 2>&1 # Clean workspace. - make --quiet clean - make --quiet distclean + make --quiet clean >> "$build_log" 2>&1 + make --quiet distclean >> "$build_log" 2>&1 # Now build ARM modules. ./configure --quiet --host=$bootloader_toolchain --with-platform=efi \ --prefix=$grub_arm_dir CFLAGS="-Os -march=armv7-a" \ - CCASFLAGS="-march=armv7-a" --disable-werror - make --quiet -j$cores - make --quiet install + CCASFLAGS="-march=armv7-a" --disable-werror >> "$build_log" 2>&1 + make --quiet -j$cores >> "$build_log" 2>&1 + make --quiet install >> "$build_log" 2>&1 # Build GRUB EFI image. ${grub_host_dir}/bin/grub-mkimage -v -p /$efi_boot -o grub.efi --format=arm-efi \ -d $grub_arm_dir/lib/grub/arm-efi/ boot linux ext2 fat serial part_msdos \ part_gpt normal efi_gop iso9660 configfile search loadenv test cat echo \ - gcry_sha256 halt hashsum loadenv reboot &> /dev/null + gcry_sha256 halt hashsum loadenv reboot >> "$build_log" 2>&1 rc=$? @@ -179,7 +183,7 @@ set_uenv() { # $1 - boot partition mountpoint # $2 - primary partition mountpoint install_files() { - echo "Installing GRUB files..." + log "\tInstalling GRUB files." local boot_dir=$1 local rootfs_dir=$2 @@ -194,7 +198,7 @@ install_files() { # Make sure env, lock, lock.sha256sum files exists in working directory. [[ ! -d $grubenv_efi_boot_dir/mender_grubenv1 || \ ! -d $grubenv_efi_boot_dir/mender_grubenv2 ]] && \ - { echo "Error: cannot find mender grub related files."; return 1; } + { log "Error: cannot find mender grub related files."; return 1; } sudo install -d -m 755 $efi_boot_dir @@ -215,30 +219,28 @@ install_files() { } do_install_bootloader() { - echo "Setting bootloader..." - if [ -z "${mender_disk_image}" ]; then - echo "Mender raw disk image not set. Aborting." + log "Mender raw disk image not set. Aborting." exit 1 fi if [ -z "${bootloader_toolchain}" ]; then - echo "ARM GCC toolchain not set. Aborting." + log "ARM GCC toolchain not set. Aborting." exit 1 fi if [ -z "${device_type}" ]; then - echo "Target device type name not set. Aborting." + log "Target device type name not set. Aborting." exit 1 fi - if [[ $(which ${bootloader_toolchain}-gcc) = 1 ]]; then - echo "Error: ARM GCC not found in PATH. Aborting." + if ! [ -x "$(command -v ${bootloader_toolchain}-gcc)" ]; then + log "Error: ARM GCC not found in PATH. Aborting." exit 1 fi [ ! -f $mender_disk_image ] && \ - { echo "$mender_disk_image - file not found. Aborting."; exit 1; } + { log "$mender_disk_image - file not found. Aborting."; exit 1; } # Map & mount Mender compliant image. create_device_maps $mender_disk_image mender_disk_mappings @@ -257,15 +259,15 @@ do_install_bootloader() { sudo mount ${map_primary} ${path_primary} get_kernel_version ${path_primary} kernel_version - echo -e "\nKernel version: $kernel_version" + log "\tFound kernel version: $kernel_version" build_env_lock_boot_files $kernel_version build_grub_efi $kernel_version rc=$? - [[ $rc -ne 0 ]] && { echo "Error: grub.efi building failure. Aborting."; } \ - || { echo "Successful grub.efi building."; \ + [[ $rc -ne 0 ]] && { log "\tBuilding grub.efi failed. Aborting."; } \ + || { log "\tBuilding grub.efi succeeded."; \ install_files ${path_boot} ${path_primary}; } # Back to working directory. @@ -276,8 +278,7 @@ do_install_bootloader() { rm -rf $output_dir/sdimg [[ $keep -eq 0 ]] && { rm -rf $grubenv_dir $grub_dir; } - [[ $rc -ne 0 ]] && { echo -e "\nStage failure."; exit 1; } \ - || { echo -e "\nStage done."; } + [[ $rc -ne 0 ]] && { exit 1; } || { log "\tDone."; } } PARAMS="" @@ -309,7 +310,7 @@ while (( "$#" )); do break ;; -*) - echo "Error: unsupported option $1" >&2 + log "Error: unsupported option $1" exit 1 ;; *) diff --git a/convert-stage-4.sh b/convert-stage-4.sh index 1a8de07..6706200 100755 --- a/convert-stage-4.sh +++ b/convert-stage-4.sh @@ -121,7 +121,7 @@ get_mender_files_from_upstream() { mkdir -p $mender_dir - echo -e "Downloading inventory & identity scripts..." + log "\tDownloading inventory & identity scripts." wget -nc -q -O $mender_dir/mender-device-identity \ $mender_client_repo/$mender_client_revision/support/mender-device-identity @@ -152,6 +152,8 @@ install_files() { dataconfdir="mender" databootdir="u-boot" + log "\tInstalling files." + # Prepare 'data' partition sudo install -d -m 755 ${data_dir}/${dataconfdir} sudo install -d -m 755 ${data_dir}/${databootdir} @@ -163,18 +165,18 @@ install_files() { # Prepare 'primary' partition [ ! -d "$primary_dir/data" ] && \ - { echo "'data' mountpoint missing. Adding"; \ + { log "\t'data' mountpoint missing. Adding"; \ sudo install -d -m 755 ${primary_dir}/data; } case "$device_type" in "beaglebone") [ ! -d "$primary_dir/boot/efi" ] && \ - { echo "'/boot/efi' mountpoint missing. Adding"; \ + { log "\t'/boot/efi' mountpoint missing. Adding"; \ sudo install -d -m 755 ${primary_dir}/boot/efi; } ;; "raspberrypi3") [ ! -d "$primary_dir/uboot" ] && \ - { echo "'/boot/efi' mountpoint missing. Adding"; \ + { log "\t'/boot/efi' mountpoint missing. Adding"; \ sudo install -d -m 755 ${primary_dir}/uboot; } ;; esac @@ -184,7 +186,7 @@ install_files() { sudo install -d ${primary_dir}/${sysconfdir} sudo install -d ${primary_dir}/${sysconfdir}/scripts - sudo ln -s /data/${dataconfdir} ${primary_dir}/${localstatedir} + sudo ln -sf /data/${dataconfdir} ${primary_dir}/${localstatedir} sudo install -m 0755 ${mender_client} ${primary_dir}/${bindir}/mender @@ -197,7 +199,7 @@ install_files() { sudo install -m 0644 ${mender_dir}/mender.service ${primary_dir}/${systemd_unitdir} # Enable menderd service starting on boot. - sudo ln -s /lib/systemd/system/mender.service \ + sudo ln -sf /lib/systemd/system/mender.service \ ${primary_dir}/etc/systemd/system/multi-user.target.wants/mender.service sudo install -m 0644 ${mender_dir}/mender.conf ${primary_dir}/${sysconfdir} @@ -209,7 +211,7 @@ install_files() { sudo install -m 0644 ${mender_dir}/version ${primary_dir}/${sysconfdir}/scripts if [ -n "${demo_host_ip}" ]; then - echo "$demo_host_ip docker.mender.io s3.docker.mender.io" | sudo tee -a $primary_dir/etc/hosts + sudo sh -c -e "echo '$demo_host_ip docker.mender.io s3.docker.mender.io' >> $primary_dir/etc/hosts"; fi if [ -n "${server_cert}" ]; then @@ -219,33 +221,33 @@ install_files() { do_install_mender() { if [ -z "${mender_disk_image}" ]; then - echo "Mender raw disk image not set. Aborting." + log "Mender raw disk image not set. Aborting." show_help fi if [ -z "${mender_client}" ]; then - echo "Mender client binary not set. Aborting." + log "Mender client binary not set. Aborting." show_help fi if [ -z "${device_type}" ]; then - echo "Target device type name not set. Aborting." + log "Target device type name not set. Aborting." show_help fi if [ -z "${artifact_name}" ]; then - echo "Artifact info not set. Aborting." + log "Artifact info not set. Aborting." show_help fi if [ -z "${server_url}" ] && [ -z "${demo_host_ip}" ] && \ [ -z "${tenant_token}" ]; then - echo "No server type specified. Aborting." + log "No server type specified. Aborting." show_help fi if [ -n "${server_url}" ] && [ -n "${demo_host_ip}" ]; then - echo "Incompatible server type choice. Aborting." + log "Incompatible server type choice. Aborting." show_help fi @@ -260,7 +262,7 @@ do_install_mender() { fi [ ! -f $mender_disk_image ] && \ - { echo "$mender_disk_image - file not found. Aborting."; exit 1; } + { log "$mender_disk_image - file not found. Aborting."; exit 1; } # Mount rootfs partition A. create_device_maps $mender_disk_image mender_disk_mappings @@ -295,6 +297,8 @@ do_install_mender() { detach_device_maps ${mender_disk_mappings[@]} rm -rf $output_dir/sdimg [[ $keep -eq 0 ]] && { rm -rf $mender_dir; } + + log "\tDone." } PARAMS="" @@ -345,7 +349,7 @@ while (( "$#" )); do break ;; -*) - echo "Error: unsupported option $1" >&2 + log "Error: unsupported option $1" exit 1 ;; *) diff --git a/mender-convert b/mender-convert index 7bf1f37..79eaa95 100755 --- a/mender-convert +++ b/mender-convert @@ -157,10 +157,10 @@ prootfs_size= mender_disk_image= raw_disk_image= device_type= -partitions_number= +mender_disk_counts= artifact_name= rootfs_partition_id= -image_type= +raw_disk_counts= mender_client= # Mender production certificate. server_cert= @@ -171,6 +171,10 @@ demo_host_ip= # Mender hosted token. tenant_token= +# Conversion progress. +declare -i step=1 +declare -i total= + declare -a rootfs_partition_ids=("primary" "secondary") declare -a mender_disk_mappings declare -a raw_disk_mappings @@ -178,9 +182,11 @@ declare -a raw_disk_mappings declare -a supported_devices=("beaglebone" "raspberrypi3") do_raw_disk_image_shrink_rootfs() { + log "$step/$total Shrinking raw disk image root filesystem..." + ((step++)) if [ -z "${raw_disk_image}" ]; then - echo "Raw disk image not set. Aborting." - exit 1 + log "Raw disk image not set. Aborting." + return 1 fi local count= @@ -196,7 +202,7 @@ do_raw_disk_image_shrink_rootfs() { # Find first available loopback device. loopdevice=($(losetup -f)) - [ $? -ne 0 ] && { echo "Error: inaccesible loopback device"; return 1; } + [ $? -ne 0 ] && { log "Error: inaccesible loopback device"; return 1; } # Mount appropriate partition. if [[ $count -eq 1 ]]; then @@ -204,7 +210,7 @@ do_raw_disk_image_shrink_rootfs() { elif [[ $count -eq 2 ]]; then sudo losetup $loopdevice $raw_disk_image -o $(($rootfsstart * $sector_size)) else - echo "Error: invalid/unsupported embedded raw disk image. Aborting." + log "Error: invalid/unsupported embedded raw disk image. Aborting." return 1 fi @@ -214,14 +220,14 @@ do_raw_disk_image_shrink_rootfs() { new_size_sectors=$(( $min_size_blocks * $block_size / $sector_size )) align_partition_size new_size_sectors $sector_size - echo -e "Root filesystem size:" - echo -e "\nminimal: $(( $min_size_blocks * $block_size ))" - echo -e "\naligned: $(( $new_size_sectors * $sector_size ))" - echo -e "\nsectors: $new_size_sectors" + log "\tRoot filesystem size:\ + \n\tminimal: $(( $min_size_blocks * $block_size )) \ + \n\taligned: $(( $new_size_sectors * $sector_size ))\ + \n\tsectors: $new_size_sectors" - sudo e2fsck -y -f $loopdevice - sudo resize2fs -p $loopdevice ${new_size_sectors}s - sudo e2fsck -y -f $loopdevice + sudo e2fsck -y -f $loopdevice >> "$build_log" 2>&1 + sudo resize2fs -p $loopdevice ${new_size_sectors}s >> "$build_log" 2>&1 + sudo e2fsck -y -f $loopdevice >> "$build_log" 2>&1 sudo losetup -d $loopdevice sudo losetup $loopdevice $raw_disk_image @@ -229,7 +235,6 @@ do_raw_disk_image_shrink_rootfs() { if [[ $count -eq 1 ]]; then create_single_disk_partition_table $loopdevice $bootstart $new_size_sectors elif [[ $count -eq 2 ]]; then - echo create_double_disk_partition_table $loopdevice $rootfsstart $new_size_sectors fi @@ -237,29 +242,32 @@ do_raw_disk_image_shrink_rootfs() { endsector=($(sudo parted $loopdevice -ms unit s print | grep "^$count" | cut -f3 -d: | sed 's/[^0-9]*//g')) sudo losetup -d $loopdevice - echo "Image new endsector: $endsector" + log "\tRaw disk image new endsector: $endsector" truncate -s $((($endsector+1) * $sector_size)) $raw_disk_image - echo "Root filesystem size (sectors): $new_size_sectors" + log "\tNew root filesystem size (sectors): $new_size_sectors" return 0 } do_raw_disk_image_create_partitions() { + log "$step/$total Repartitioning raw disk image..." + ((step++)) + if [ -z "$raw_disk_image" ] || [ -z "$device_type" ] || \ [ -z "$artifact_name" ]; then show_help - exit 1 + return 1 fi if [[ ! -f ${raw_disk_image} ]]; then - echo "Raw disk image not found. Aborting." - exit 1 + log "Raw disk image not found. Aborting." + return 1 fi local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w) [[ $supported -eq 0 ]] && \ - { echo "Error: incorrect device type. Aborting."; return 1; } + { log "Error: incorrect device type. Aborting."; return 1; } mkdir -p $output_dir && cd $output_dir @@ -279,20 +287,22 @@ do_raw_disk_image_create_partitions() { fi analyse_raw_disk_image ${raw_disk_image} pboot_start pboot_size prootfs_size \ - sector_size image_type + sector_size raw_disk_counts [ -z "${prootfs_size}" ] && \ - { echo "root filesystem size not set. Aborting."; return 1; } + { log "root filesystem size not set. Aborting."; return 1; } + + log "\tDetected raw disk image with $raw_disk_counts partition(s)." local mender_disk_image_size= calculate_mender_disk_size $pboot_start $pboot_size \ $prootfs_size $data_part_size_mb \ $sector_size pdata_size mender_disk_image_size - echo -e "Creating Mender disk image:\ - \nimage size: ${mender_disk_image_size} bytes\ - \nroot filesystem size: ${prootfs_size} sectors\ - \ndata partition size: $pdata_size sectors\n" + log "\tCreating Mender disk image:\ + \n\t\timage size: ${mender_disk_image_size} bytes\ + \n\t\troot filesystem size: $((${prootfs_size} * $sector_size)) bytes\ + \n\t\tdata partition size: $(($pdata_size * $sector_size)) bytes" create_test_config_file $device_type $partition_alignment $vfat_storage_offset \ $pboot_size $prootfs_size $pdata_size $mender_disk_image_size \ @@ -301,9 +311,12 @@ do_raw_disk_image_create_partitions() { create_mender_disk $mender_disk_image $mender_disk_image_size format_mender_disk $mender_disk_image $mender_disk_image_size $pboot_start \ $pboot_size $prootfs_size $pdata_size $sector_size - verify_mender_disk $mender_disk_image partitions_number + verify_mender_disk $mender_disk_image mender_disk_counts create_device_maps $mender_disk_image mender_disk_mappings + + log "$step/$total Formatting repartitioned raw disk image..." + ((step++)) make_mender_disk_filesystem ${mender_disk_mappings[@]} case "$device_type" in @@ -317,7 +330,8 @@ do_raw_disk_image_create_partitions() { rc=$? - echo -e "\nCleaning..." + log "$step/$total Cleaning intermediate files..." + ((step++)) # Clean and detach. detach_device_maps ${mender_disk_mappings[@]} detach_device_maps ${raw_disk_mappings[@]} @@ -325,8 +339,7 @@ do_raw_disk_image_create_partitions() { rm -rf $embedded_base_dir rm -rf $sdimg_base_dir - [ $rc -eq 0 ] && { echo -e "\n$mender_disk_image image created."; } \ - || { echo -e "\n$mender_disk_image image composing failure."; } + [ $rc -eq 0 ] || { log "\nRepartitioning of $raw_disk_image image failed."; } return $rc } @@ -339,49 +352,57 @@ do_make_sdimg_beaglebone() { mount_mender_disk ${mender_disk_mappings[@]} mount_raw_disk ${raw_disk_mappings[@]} - echo -e "\nSetting boot partition..." + log "$step/$total Setting boot partition..." + ((step++)) stage_2_args="$sdimg_boot_dir $embedded_rootfs_dir" ${tool_dir}/bbb-convert-stage-2.sh ${stage_2_args} || ret=$? - [[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; } + [[ $ret -ne 0 ]] && { log "Aborting."; return $ret; } - echo -e "\nSetting root filesystem..." + log "$step/$total Setting root filesystem partition..." + ((step++)) stage_3_args="$sdimg_primary_dir $embedded_rootfs_dir" ${tool_dir}/bbb-convert-stage-3.sh ${stage_3_args} || ret=$? - [[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; } + [[ $ret -ne 0 ]] && { log "Aborting."; return $ret; } + log "$step/$total Setting file system table..." + ((step++)) set_fstab $device_type return $ret } do_make_sdimg_raspberrypi3() { + log "$step/$total Setting boot partition..." + ((step++)) image_boot_part=$(fdisk -l ${raw_disk_image} | grep FAT32) boot_part_start=$(echo ${image_boot_part} | awk '{print $2}') boot_part_end=$(echo ${image_boot_part} | awk '{print $3}') boot_part_size=$(echo ${image_boot_part} | awk '{print $4}') + log "\tExtracting boot partition from raw disk image." extract_file_from_image ${raw_disk_image} ${boot_part_start} \ ${boot_part_size} "boot.vfat" + stage_2_args="$output_dir ${mender_disk_mappings[0]}" + ${tool_dir}/rpi3-convert-stage-2.sh ${stage_2_args} || ret=$? + [[ $ret -ne 0 ]] && { return $ret; } + + log "$step/$total Setting root filesystem partition..." + ((step++)) image_rootfs_part=$(fdisk -l ${raw_disk_image} | grep Linux) rootfs_part_start=$(echo ${image_rootfs_part} | awk '{print $2}') rootfs_part_end=$(echo ${image_rootfs_part} | awk '{print $3}') rootfs_part_size=$(echo ${image_rootfs_part} | awk '{print $4}') + log "\tExtracting root filesystem partition from raw disk image." extract_file_from_image ${raw_disk_image} ${rootfs_part_start} \ ${rootfs_part_size} "rootfs.img" - echo -e "\nSetting boot partition..." - stage_2_args="$output_dir ${mender_disk_mappings[0]}" - ${tool_dir}/rpi3-convert-stage-2.sh ${stage_2_args} || ret=$? - [[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; } - - echo -e "\nSetting root filesystem..." stage_3_args="$output_dir ${mender_disk_mappings[1]}" ${tool_dir}/rpi3-convert-stage-3.sh ${stage_3_args} || ret=$? - [[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; } + [[ $ret -ne 0 ]] && { return $ret; } mount_mender_disk ${mender_disk_mappings[@]} @@ -389,6 +410,8 @@ do_make_sdimg_raspberrypi3() { sudo install -d -m 755 ${sdimg_primary_dir}/uboot sudo install -d -m 755 ${sdimg_primary_dir}/data + log "$step/$total Setting file system table..." + ((step++)) set_fstab $device_type [[ $keep != "-k" ]] && { rm -f $output_dir/boot.vfat\ @@ -399,17 +422,19 @@ do_make_sdimg_raspberrypi3() { } do_install_mender_to_mender_disk_image() { - # Mender executables, service and configuration files installer. + log "$step/$total Installing Mender to Mender disk image..." + ((step++)) + if [ -z "$mender_disk_image" ] || [ -z "$device_type" ] || \ [ -z "$mender_client" ] || [ -z "$artifact_name" ]; then show_help - exit 1 + return 1 fi local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w) [[ $supported -eq 0 ]] && \ - { echo "Error: incorrect device type. Aborting."; return 1; } + { log "Error: incorrect device type. Aborting."; return 1; } # mender-image-1.5.0 stage_4_args="-m $mender_disk_image -d $device_type -g ${mender_client} -a ${artifact_name}" @@ -436,10 +461,8 @@ do_install_mender_to_mender_disk_image() { eval set -- " ${stage_4_args}" - export -f create_device_maps - export -f detach_device_maps - - ${tool_dir}/convert-stage-4.sh ${stage_4_args} + ${tool_dir}/convert-stage-4.sh ${stage_4_args} || ret=$? + [[ $ret -ne 0 ]] && { log "\nInstalling Mender to Mender disk image failed."; return $ret; } # Update test configuration file update_test_config_file $device_type artifact-name $artifact_name @@ -448,24 +471,26 @@ do_install_mender_to_mender_disk_image() { } do_install_bootloader_to_mender_disk_image() { + log "$step/$total Installing Bootloader to Mender disk image..." + ((step++)) + if [ -z "$mender_disk_image" ] || [ -z "$device_type" ] || \ [ -z "$bootloader_toolchain" ]; then show_help - exit 1 + return 1 fi local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w) [[ $supported -eq 0 ]] && \ - { echo "Error: incorrect device type. Aborting."; return 1; } + { log "Error: incorrect device type. Aborting."; return 1; } case "$device_type" in "beaglebone") stage_5_args="-m $mender_disk_image -d $device_type -b ${bootloader_toolchain} $keep" eval set -- " ${stage_5_args}" - export -f create_device_maps - export -f detach_device_maps - ${tool_dir}/bbb-convert-stage-5.sh ${stage_5_args} + ${tool_dir}/bbb-convert-stage-5.sh ${stage_5_args}|| ret=$? + [[ $ret -ne 0 ]] && { log "\nInstalling Bootloader failed."; return $ret; } # Update test configuration file update_test_config_file $device_type distro-feature "mender-grub" \ @@ -474,10 +499,8 @@ do_install_bootloader_to_mender_disk_image() { "raspberrypi3") stage_5_args="-m $mender_disk_image -d $device_type -b ${bootloader_toolchain} $keep" eval set -- " ${stage_5_args}" - export -f create_device_maps - export -f detach_device_maps - export -f mount_mender_disk - ${tool_dir}/rpi3-convert-stage-5.sh ${stage_5_args} + ${tool_dir}/rpi3-convert-stage-5.sh ${stage_5_args}|| ret=$? + [[ $ret -ne 0 ]] && { log "\nInstalling Bootloader failed."; return $ret; } # Update test configuration file update_test_config_file $device_type mount-location "\/uboot" @@ -488,35 +511,38 @@ do_install_bootloader_to_mender_disk_image() { } do_mender_disk_image_to_artifact() { + log "$step/$total Creating Mender Artifact..." + ((step++)) + if [ -z "${mender_disk_image}" ]; then - echo "Mender disk image not set. Aborting." - exit 1 + log "Mender disk image not set. Aborting." + return 1 fi if [ -z "${device_type}" ]; then - echo "Target device_type name not set. Aborting." - exit 1 + log "Target device_type name not set. Aborting." + return 1 fi if [ -z "${artifact_name}" ]; then - echo "Artifact name not set. Aborting." - exit 1 + log "Artifact name not set. Aborting." + return 1 fi if [ -z "${rootfs_partition_id}" ]; then - echo "Rootfs partition id not set - 'primary' will be used by default." + log "\tRootfs partition id not set - 'primary' will be used by default." rootfs_partition_id="primary" fi local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w) [[ $supported -eq 0 ]] && \ - { echo "Error: incorrect device type. Aborting."; return 1; } + { log "Error: incorrect device type. Aborting."; return 1; } inarray=$(echo ${rootfs_partition_ids[@]} | grep -o $rootfs_partition_id | wc -w) [[ $inarray -eq 0 ]] && \ - { echo "Error: invalid rootfs partition id provided. Aborting."; return 1; } + { log "Error: invalid rootfs partition id provided. Aborting."; return 1; } local count= local bootstart= @@ -531,7 +557,7 @@ do_mender_disk_image_to_artifact() { rootfs_a_size rootfs_b_start rootfs_b_size ret=$? [[ $ret -ne 0 ]] && \ - { echo "Error: cannot validate Mender disk image. Aborting."; return 1; } + { log "Error: cannot validate Mender disk image. Aborting."; return 1; } # Check if device type matches. create_device_maps $mender_disk_image mender_disk_mappings @@ -541,12 +567,12 @@ do_mender_disk_image_to_artifact() { mender_device_type=$( cat $sdimg_data_dir/mender/device_type | sed 's/[^=].*=//' ) if [ "$mender_device_type" != "$device_type" ]; then - echo "Error: device types of Mender artifact & Mender not matching. Aborting." + log "Error: device types of Mender artifact & Mender not matching. Aborting." ret=1 fi if ! [ -x "$(command -v mender-artifact)" ]; then - echo "Error: mender-artifact not found in PATH. Aborting." + log "Error: mender-artifact not found in PATH. Aborting." ret=1 fi @@ -571,14 +597,16 @@ do_mender_disk_image_to_artifact() { extract_file_from_image $mender_disk_image $prootfs_start \ $prootfs_size $mender_rootfs_basename - fsck.ext4 -fp $mender_rootfs_image + fsck.ext4 -fp $mender_rootfs_image &> /dev/null || ret=$? + [[ $ret -ne 0 ]] && \ + { log "Error: checking $mender_rootfs_basename file system failed. Aborting."; } # Find first available loopback device. loopdevice=($(sudo losetup -f || ret=$?)) + [[ $ret -ne 0 ]] && \ + { log "Error: cannot find an unused loop device. Aborting."; } - if [ $ret -ne 0 ]; then - echo "Error: cannot find an unused loop device. Aborting." - else + if [ $ret -eq 0 ]; then #Mount extracted ext4 partition to verify 'artifact_info' file content. sudo losetup $loopdevice ${mender_rootfs_image} rootfs_mountpoint=${output_dir}/mnt/${rootfs_partition_id} @@ -595,7 +623,7 @@ do_mender_disk_image_to_artifact() { # Note: expected Mender Artifact name follows the scheme: # mender--.mender. mender_artifact=${output_dir}/${mender_disk_filename}.mender - echo "Writing Mender artifact to: ${mender_artifact}" + log "\tWriting Mender artifact to: ${mender_artifact}" #Create Mender artifact mender-artifact write rootfs-image \ @@ -606,8 +634,8 @@ do_mender_disk_image_to_artifact() { ret=$? [[ $ret -eq 0 ]] && \ - { echo "Writing Mender artifact to ${mender_artifact} succeeded."; } || \ - { echo "Writing Mender artifact to ${mender_artifact} failed."; } + { log "\tCreating Mender Artifact succeeded."; } || \ + { log "\tCreating Mender Artifact failed."; } fi fi @@ -649,6 +677,14 @@ PARAMS="" # Load necessary functions. source ${tool_dir}/mender-convert-functions.sh +export -f create_device_maps +export -f detach_device_maps +export -f mount_mender_disk +export -f log +export -f logsetup + +logsetup + while (( "$#" )); do case "$1" in -p | --rootfs-partition-id) @@ -712,7 +748,7 @@ while (( "$#" )); do break ;; -*) - echo "Error: unsupported option $1" >&2 + log "Error: unsupported option $1" exit 1 ;; *) @@ -723,7 +759,7 @@ while (( "$#" )); do done [ -z "${data_part_size_mb}" ] && \ - { echo "Default 'data' partition size set to 128MB"; data_part_size_mb=128; } + { log "Default 'data' partition size set to 128MB"; data_part_size_mb=128; } eval set -- "$PARAMS" @@ -732,42 +768,51 @@ sudo true case "$1" in raw-disk-image-shrink-rootfs) + total=1 do_raw_disk_image_shrink_rootfs || rc=$? - [[ $rc -ne 0 ]] && { exit 1; } - echo "The rootfs partition in the raw disk image has been shrinked successfully!" - echo "You can now convert the output raw disk image ($raw_disk_image) to a Mender disk image." + [[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; } + log "The rootfs partition in the raw disk image has been shrinked successfully!" + log "You can now convert the output raw disk image\n\t$raw_disk_image\ + \nto a Mender disk image." ;; raw-disk-image-create-partitions) + total=6 do_raw_disk_image_create_partitions || rc=$? - [[ $rc -ne 0 ]] && { exit 1; } - echo "A new Mender disk image with partition layout to support Mender has been successfully created!" - echo "You can find the output Mender disk image at ${mender_disk_image}." + [[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; } + log "A new Mender disk image with partition layout to support Mender has been successfully created!" + log "You can find the output Mender disk image at:\n\t${mender_disk_image}." ;; install-mender-to-mender-disk-image) + total=1 do_install_mender_to_mender_disk_image || rc=$? - [[ $rc -ne 0 ]] && { exit 1; } - echo "The Mender client has been successfully installed to the Mender disk image." - echo "You can find the output Mender disk image at ${mender_disk_image}." + [[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; } + log "The Mender client has been successfully installed to the Mender disk image." + log "You can find the output Mender disk image at:\n\t${mender_disk_image}." ;; install-bootloader-to-mender-disk-image) + total=1 do_install_bootloader_to_mender_disk_image || rc=$? - [[ $rc -ne 0 ]] && { exit 1; } - echo "A bootloader configuration supporting dual A/B rootfs updates has been installed to the Mender disk image!" - echo "You can find the output Mender disk image at ${mender_disk_image}." + [[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; } + log "A bootloader configuration supporting dual A/B rootfs updates has been installed to the Mender disk image!" + log "You can find the output Mender disk image at:\n\t${mender_disk_image}." ;; mender-disk-image-to-artifact) + total=1 do_mender_disk_image_to_artifact || rc=$? - [[ $rc -ne 0 ]] && { exit 1; } - echo "A Mender Artifact has been successfully extracted from your Mender disk image!" - echo "You can find the Mender Artifact at $mender_artifact and use it to deploy updates." + [[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; } + log "A Mender Artifact has been successfully extracted from your Mender disk image!" + log "You can find the Mender Artifact at:\n\t$mender_artifact\nand use it to deploy updates." ;; from-raw-disk-image) + total=9 do_from_raw_disk_image || rc=$? - [[ $rc -ne 0 ]] && { exit 1; } - echo "Conversion complete!" - echo "The Mender disk image you can provision your device storage with is at ${mender_disk_image}." - echo "The Mender root file system partition is at ${mender_rootfs_image}." - echo "The Mender Artifact you can upload to your Mender server to deploy to your devices is at ${mender_artifact}." + [[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; } + log "Conversion complete!" + log "The Mender disk image you can provision your device storage with is at:\ + \n\t${mender_disk_image}." + log "The Mender root file system partition is at:\n\t${mender_rootfs_image}." + log "The Mender Artifact you can upload to your Mender server to deploy to your devices is at:\ + \n\t${mender_artifact}." ;; *) show_help diff --git a/mender-convert-functions.sh b/mender-convert-functions.sh index a39fa2c..1b84470 100755 --- a/mender-convert-functions.sh +++ b/mender-convert-functions.sh @@ -15,6 +15,7 @@ declare -a raw_disk_partitions=("boot" "rootfs") tool_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" files_dir=${tool_dir}/files output_dir=${tool_dir}/output +build_log=${output_dir}/build.log embedded_base_dir=$output_dir/embedded sdimg_base_dir=$output_dir/sdimg @@ -26,6 +27,16 @@ sdimg_primary_dir=$sdimg_base_dir/primary sdimg_secondary_dir=$sdimg_base_dir/secondary sdimg_data_dir=$sdimg_base_dir/data +logsetup() { + echo -n "" > $build_log + exec > >(tee -a $build_log) + exec 2>&1 +} + +log() { + echo -e "$*" +} + # Takes following arguments: # # $1 -relative file path @@ -51,7 +62,7 @@ get_part_number_from_device() { echo ${1##*[0-9]p} ;; *) - echo "Could not determine partition number from $1" + log "Could not determine partition number from $1" exit 1 ;; esac @@ -67,7 +78,7 @@ create_single_disk_partition_table() { local bootstart=$2 local stopsector=$(( $3 - 1 )) - sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device + sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device &> /dev/null d # delete partition n # new partition p # primary partition @@ -90,7 +101,7 @@ create_double_disk_partition_table() { local rootfsstart=$2 local rootfsstop=$(( $3 - 1 )) - sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device + sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device &> /dev/null d # delete partition 2 n @@ -164,7 +175,7 @@ get_image_info() { eval $rvar_rootfssize="'$lsecondpartsize'" [[ $lcount -gt 2 ]] && \ - { echo "Unsupported type of source image. Aborting."; return 1; } || \ + { log "Unsupported type of source image. Aborting."; return 1; } || \ { return 0; } } @@ -196,7 +207,7 @@ get_mender_disk_info() { local lcount=${#lparts[@]} if [[ $lcount -ne 4 ]]; then - echo "Error: invalid Mender disk image. Aborting." + log "Error: invalid Mender disk image. Aborting." return 1 else local lsectorsize=($(echo "${lfdisk}" | grep '^Sector' | cut -d' ' -f4)) @@ -255,7 +266,7 @@ align_partition_size() { # $3 - boot partition size (in sectors) # $4 - root filesystem partition size (in sectors) # $5 - sector size (in bytes) -# $6 - image type +# $6 - number of detected partitions analyse_raw_disk_image() { local image=$1 local count= @@ -270,21 +281,18 @@ analyse_raw_disk_image() { local rvar_bootsize=$3 local rvar_rootfssize=$4 local rvar_sectorsize=$5 - local rvar_imagetype=$6 + local rvar_partitions=$6 get_image_info $image count sectorsize bootstart bootsize \ rootfsstart rootfssize bootflag [[ $? -ne 0 ]] && \ - { echo "Error: invalid/unsupported raw_disk image. Aborting."; exit 1; } + { log "Error: invalid/unsupported raw disk image. Aborting."; exit 1; } if [[ $count -eq 1 ]]; then - echo -e "\nDetected single partition raw_disk image." rootfssize=$bootsize # Default size of the boot partition: 16MiB. bootsize=$(( ($partition_alignment * 2) / $sectorsize )) - elif [[ $count -eq 2 ]]; then - echo -e "\nDetected multipartition ($count) raw_disk image." fi # Boot partition storage offset is defined from the top down. @@ -297,13 +305,7 @@ analyse_raw_disk_image() { eval $rvar_bootsize="'$bootsize'" eval $rvar_rootfssize="'$rootfssize'" eval $rvar_sectorsize="'$sectorsize'" - eval $rvar_imagetype="'$count'" - - echo -e "\nEmbedded image processing summary:\ - \nboot part start sector: ${bootstart}\ - \nboot part size (sectors): ${bootsize}\ - \nrootfs part size (sectors): ${rootfssize}\ - \nsector size (bytes): ${sectorsize}\n" + eval $rvar_partitions="'$count'" } # Takes following arguments: @@ -336,7 +338,7 @@ calculate_mender_disk_size() { # # $1 - raw disk image unmount_partitions() { - echo "1. Check if device is mounted..." + log "Check if device is mounted..." is_mounted=`grep ${1} /proc/self/mounts | wc -l` if [ ${is_mounted} -ne 0 ]; then sudo umount ${1}?* @@ -347,7 +349,7 @@ unmount_partitions() { # # $1 - raw disk image erase_filesystem() { - echo "2. Erase filesystem..." + log "Erase filesystem..." sudo wipefs --all --force ${1}?* sudo dd if=/dev/zero of=${1} bs=1M count=100 } @@ -362,8 +364,7 @@ create_mender_disk() { local bs=$(( 1024*1024 )) local count=$(( ${lsize} / ${bs} )) - echo -e "\nWriting $lsize bytes to Mender disk image..." - dd if=/dev/zero of=${lfile} bs=${bs} count=${count} + dd if=/dev/zero of=${lfile} bs=${bs} count=${count}>> "$build_log" 2>&1 } # Takes following arguments: @@ -398,11 +399,7 @@ format_mender_disk() { data_start=$(( ${secondary_start} + ${rootfs_size} + 1 )) data_offset=$(( ${6} - 1 )) - echo $3 ${pboot_offset} $primary_start $secondary_start $data_start $data_offset - - echo -e "\nFormatting Mender disk image..." - - sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk ${lfile} + sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk ${lfile} &> /dev/null o # clear the in memory partition table x h @@ -438,6 +435,7 @@ format_mender_disk() { w # write the partition table q # and we're done EOF + log "\tChanges in partition table applied." } # Takes following arguments: @@ -457,7 +455,7 @@ verify_mender_disk() { local no_of_parts=${#partitions[@]} [[ $no_of_parts -eq 4 ]] || \ - { echo "Error: incorrect number of partitions: $no_of_parts. Aborting."; return 1; } + { log "Error: incorrect number of partitions: $no_of_parts. Aborting."; return 1; } eval $rvar_no_of_parts=="'$no_of_parts='" @@ -474,16 +472,13 @@ create_device_maps() { if [[ -n "$1" ]]; then mapfile -t mappings < <( sudo kpartx -v -a $1 | grep 'loop' | cut -d' ' -f3 ) [[ ${#mappings[@]} -eq 0 ]] \ - && { echo "Error: partition mappings failed. Aborting."; exit 1; } \ - || { echo "Mapped ${#mappings[@]} partition(s)."; } + && { log "Error: partition mappings failed. Aborting."; exit 1; } else - echo "Error: no device passed. Aborting." + log "Error: no device passed. Aborting." exit 1 fi sudo partprobe /dev/${mappings[0]%p*} - - echo "Mapper device: ${mappings[0]%p*}" } # Takes following arguments: @@ -492,7 +487,7 @@ create_device_maps() { detach_device_maps() { local mappings=($@) - [ ${#mappings[@]} -eq 0 ] && { echo "Nothing to detach."; return; } + [ ${#mappings[@]} -eq 0 ] && { log "\tPartition mappings cleaned."; return; } local mapper=${mappings[0]%p*} @@ -515,19 +510,20 @@ detach_device_maps() { # $1 - partition mappings holder make_mender_disk_filesystem() { local mappings=($@) - echo -e "\nCreating filesystem for ${#mappings[@]} partitions..." for mapping in ${mappings[@]} do map_dev=/dev/mapper/"$mapping" part_no=$(get_part_number_from_device $map_dev) - echo -e "\nFormatting partition: ${part_no}..." + label=${mender_disk_partitions[${part_no} - 1]} if [[ part_no -eq 1 ]]; then - sudo mkfs.vfat -n ${mender_disk_partitions[${part_no} - 1]} $map_dev + log "\tCreating MS-DOS filesystem for '$label' partition." + sudo mkfs.vfat -n ${label} $map_dev >> "$build_log" 2>&1 else - sudo mkfs.ext4 -L ${mender_disk_partitions[${part_no} - 1]} $map_dev + log "\tCreating ext4 filesystem for '$label' partition." + sudo mkfs.ext4 -L ${label} $map_dev >> "$build_log" 2>&1 fi done } @@ -573,12 +569,11 @@ mount_mender_disk() { # # $1 - device type set_fstab() { - echo -e "\nSetting fstab..." local mountpoint= local device_type=$1 local sysconfdir="$sdimg_primary_dir/etc" - [ ! -d "${sysconfdir}" ] && { echo "Error: cannot find rootfs config dir."; exit 1; } + [ ! -d "${sysconfdir}" ] && { log "Error: cannot find rootfs config dir."; exit 1; } # Erase/create the fstab file. sudo install -b -m 644 /dev/null ${sysconfdir}/fstab @@ -609,6 +604,8 @@ set_fstab() { /dev/mmcblk0p1 $mountpoint auto defaults,sync 0 0 /dev/mmcblk0p4 /data auto defaults 0 0 EOF" + + log "\tDone." } # Takes following arguments @@ -618,11 +615,11 @@ set_fstab() { # $3 - size (in 512 blocks) extract_file_from_image() { - local cmd="dd if=$1 of=${output_dir}/$4 skip=$2 bs=512 count=$3 status=progress" + local cmd="dd if=$1 of=${output_dir}/$4 skip=$2 bs=512 count=$3" - echo "Running command:" - echo " ${cmd}" - $(${cmd}) + [ "${4##*.}" == "ext4" ] && { log "\tStoring data in $4 root file system image."; } \ + || { log "\tStoring data in $4 disk image."; } + $(${cmd}>> "$build_log" 2>&1) } # Takes following arguments @@ -666,7 +663,7 @@ update_test_config_file() { local device_type=$1 [ ! -f "${files_dir}/${device_type}_variables.cfg" ] && \ - { echo "Error: test configuration file '${device_type}_variables.cfg' not found. Aborting."; return 1; } + { log "Error: test configuration file '${device_type}_variables.cfg' not found. Aborting."; return 1; } shift diff --git a/rpi3-convert-stage-2.sh b/rpi3-convert-stage-2.sh index d6a2078..57f5f4f 100755 --- a/rpi3-convert-stage-2.sh +++ b/rpi3-convert-stage-2.sh @@ -2,23 +2,24 @@ output_dir=$1 boot_mapping=$2 +build_log=$output_dir/build.log [ ! -f $output_dir/boot.vfat ] && \ - { echo "Error: extracted boot partition not found. Aborting."; exit 1; } + { log "Error: extracted boot partition not found. Aborting."; exit 1; } # Make a copy of Linux kernel arguments and modify. -mcopy -o -i ${output_dir}/boot.vfat -s ::cmdline.txt ${output_dir}/cmdline.txt +mcopy -on -i ${output_dir}/boot.vfat -s ::cmdline.txt ${output_dir}/cmdline.txt sed -i 's/\b[ ]root=[^ ]*/ root=\/dev\/mmcblk0p2/' ${output_dir}/cmdline.txt sed -i 's/\b[ ]console=tty1//' ${output_dir}/cmdline.txt # Update Linux kernel command arguments with our custom configuration mcopy -o -i ${output_dir}/boot.vfat -s ${output_dir}/cmdline.txt ::cmdline.txt -mcopy -i ${output_dir}/boot.vfat -s ::config.txt ${output_dir}/config.txt +mcopy -on -i ${output_dir}/boot.vfat -s ::config.txt ${output_dir}/config.txt echo -e '\nenable_uart=1\n' >> ${output_dir}/config.txt mcopy -o -i ${output_dir}/boot.vfat -s ${output_dir}/config.txt ::config.txt -sudo dd if=${output_dir}/boot.vfat of=/dev/mapper/${boot_mapping} bs=1M +sudo dd if=${output_dir}/boot.vfat of=/dev/mapper/${boot_mapping} bs=1M >> "$build_log" 2>&1 -echo -e "\nStage done." +log "\tDone." exit 0 diff --git a/rpi3-convert-stage-3.sh b/rpi3-convert-stage-3.sh index b3044f0..763be39 100755 --- a/rpi3-convert-stage-3.sh +++ b/rpi3-convert-stage-3.sh @@ -2,15 +2,16 @@ output_dir=$1 rootfs_mapping=$2 +build_log=$output_dir/build.log [ ! -f ${output_dir}/rootfs.img ] && \ - { echo "Error: extracted rootfs partition not found. Aborting."; exit 1; } + { log "Error: extracted rootfs partition not found. Aborting."; exit 1; } -sudo dd if=${output_dir}/rootfs.img of=/dev/mapper/${rootfs_mapping} bs=8M +sudo dd if=${output_dir}/rootfs.img of=/dev/mapper/${rootfs_mapping} bs=8M >> "$build_log" 2>&1 # dd sets the original label, make sure label follows Mender naming convention. sudo e2label /dev/mapper/${rootfs_mapping} "primary" -echo -e "\nStage done." +log "\tDone." exit 0 diff --git a/rpi3-convert-stage-5.sh b/rpi3-convert-stage-5.sh index 57b5e3b..d393716 100755 --- a/rpi3-convert-stage-5.sh +++ b/rpi3-convert-stage-5.sh @@ -23,7 +23,6 @@ bin_dir_pi=${bin_base_dir}/raspberrypi sdimg_base_dir=$output_dir/sdimg GCC_VERSION="6.3.1" -echo "Running: $(basename $0)" declare -a mender_disk_mappings declare -a mender_disk_partitions=("boot" "primary" "secondary" "data") @@ -46,19 +45,20 @@ build_uboot_files() { mkdir -p $bin_dir_pi - echo -e "Building U-Boot related files..." + log "\tBuilding U-Boot related files." if [ ! -d $uboot_repo_vc_dir ]; then - git clone https://github.com/mendersoftware/uboot-mender.git -b $branch + git clone https://github.com/mendersoftware/uboot-mender.git -b $branch >> "$build_log" 2>&1 fi cd $uboot_dir - git checkout $commit + git checkout $commit >> "$build_log" 2>&1 - make --quiet distclean - make --quiet rpi_3_32b_defconfig && make --quiet - make envtools + make --quiet distclean >> "$build_log" + make --quiet rpi_3_32b_defconfig >> "$build_log" 2>&1 + make --quiet >> "$build_log" 2>&1 + make --quiet envtools >> "$build_log" 2>&1 cat<<-'EOF' >boot.cmd fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs @@ -70,11 +70,11 @@ build_uboot_files() { EOF if [ ! -e $uboot_dir/tools/mkimage ]; then - echo "Error: cannot build U-Boot. Aborting" + log "Error: cannot build U-Boot. Aborting" return 1 fi - $uboot_dir/tools/mkimage -A arm -T script -C none -n "Boot script" -d "boot.cmd" boot.scr + $uboot_dir/tools/mkimage -A arm -T script -C none -n "Boot script" -d "boot.cmd" boot.scr >> "$build_log" 2>&1 cp -t $bin_dir_pi $uboot_dir/boot.scr $uboot_dir/tools/env/fw_printenv $uboot_dir/u-boot.bin return 0 @@ -88,6 +88,8 @@ install_files() { local boot_dir=$1 local rootfs_dir=$2 + log "\tInstalling U-Boot related files." + # Make a copy of Linux kernel arguments and modify. sudo cp ${boot_dir}/cmdline.txt ${output_dir}/cmdline.txt @@ -98,9 +100,9 @@ install_files() { # # But we want it to run on our image as well to resize our data part so in # case it is missing, add it back to cmdline.txt - if ! grep "init=/usr/lib/raspi-config/init_resize.sh" ${output_dir}/cmdline.txt; then + if ! grep -q "init=/usr/lib/raspi-config/init_resize.sh" ${output_dir}/cmdline.txt; then cmdline=$(cat ${output_dir}/cmdline.txt) - echo "${cmdline} init=/usr/lib/raspi-config/init_resize.sh" > ${output_dir}/cmdline.txt + sh -c -e "echo '${cmdline} init=/usr/lib/raspi-config/init_resize.sh' >> ${output_dir}/cmdline.txt"; fi # Update Linux kernel command arguments with our custom configuration @@ -146,32 +148,30 @@ install_files() { } do_install_bootloader() { - echo "Setting bootloader..." - if [ -z "${mender_disk_image}" ]; then - echo "Mender raw disk image file not set. Aborting." + log "Mender raw disk image file not set. Aborting." exit 1 fi if [ -z "${bootloader_toolchain}" ]; then - echo "ARM GCC toolchain not set. Aborting." + log "ARM GCC toolchain not set. Aborting." exit 1 fi - if [[ $(which ${bootloader_toolchain}-gcc) = 1 ]]; then - echo "Error: ARM GCC not found in PATH. Aborting." + if ! [ -x "$(command -v ${bootloader_toolchain}-gcc)" ]; then + log "Error: ARM GCC not found in PATH. Aborting." exit 1 fi local gcc_version=$(${bootloader_toolchain}-gcc -dumpversion) if [ $(version $gcc_version) -ne $(version $GCC_VERSION) ]; then - echo "Error: Invalid ARM GCC version ($gcc_version). Expected $GCC_VERSION. Aborting." + log "Error: Invalid ARM GCC version ($gcc_version). Expected $GCC_VERSION. Aborting." exit 1 fi [ ! -f $mender_disk_image ] && \ - { echo "$mender_disk_image - file not found. Aborting."; exit 1; } + { log "$mender_disk_image - file not found. Aborting."; exit 1; } # Map & mount Mender compliant image. create_device_maps $mender_disk_image mender_disk_mappings @@ -189,11 +189,12 @@ do_install_bootloader() { fi detach_device_maps ${mender_disk_mappings[@]} + rm -rf $sdimg_base_dir [[ $keep -eq 0 ]] && { rm -f ${output_dir}/config.txt ${output_dir}/cmdline.txt; - rm -rf $uboot_dir $bin_base_dir $sdimg_base_dir; } + rm -rf $uboot_dir $bin_base_dir; } - [[ "$rc" -ne 0 ]] && { echo -e "\nStage failure."; exit 1; } || { echo -e "\nStage done."; } + [[ "$rc" -ne 0 ]] && { exit 1; } || { log "\tDone."; } } # Conditional once we support other boards @@ -226,7 +227,7 @@ while (( "$#" )); do break ;; -*) - echo "Error: unsupported option $1" >&2 + log "Error: unsupported option $1" exit 1 ;; *)