summaryrefslogtreecommitdiffstats
path: root/external/meta-updater-raspberrypi/scripts/flash-image.sh
blob: ef59eb37d7f3456b00c5a842e230d306dc781ed9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/bin/bash

ask() {
    # http://djm.me/ask
    local prompt default REPLY

    while true; do

        if [ "${2:-}" = "Y" ]; then
            prompt="Y/n"
            default=Y
        elif [ "${2:-}" = "N" ]; then
            prompt="y/N"
            default=N
        else
            prompt="y/n"
            default=
        fi

        # Ask the question (not using "read -p" as it uses stderr not stdout)
        echo -n "$1 [$prompt] "

        # Read the answer (use /dev/tty in case stdin is redirected from somewhere else)
        read -r REPLY </dev/tty

        # Default?
        if [ -z "$REPLY" ]; then
            REPLY=$default
        fi

        # Check if the reply is valid
        case "$REPLY" in
            Y*|y*) return 0 ;;
            N*|n*) return 1 ;;
        esac

    done
}

if [[ $EUID -ne 0 ]]; then
  echo ""
  echo "  This script must be run as root" 1>&2
  echo ""
  exit 1
fi

if [ -z "$1" ]; then
  echo ""
  echo "   Flash a built image with a HERE OTA Connect device config file baked in."
  echo ""
  echo "   Usage: ./flash-configured-image.sh device [imagefile [force]]"
  echo ""
  echo ""
  echo "    device     : The device name to flash. Must be a removable device."
  echo "      Example: sdb"
  echo ""
  echo "    imagefile  : An image file generated by bitbake (optional)."
  echo "      Default: ./tmp/deploy/images/raspberrypi3/core-image-minimal-raspberrypi3.wic"
  echo ""
  echo "    force      : 1 to skip the check if device is removeable."
  echo "      Default: 0"
  echo ""
  echo "   The following utilities are prerequisites:"
  echo ""
  echo "    dd"
  echo "    parted"
  echo "    e2fsck"
  echo "    fdisk"
  echo "    resize2fs"
  echo ""
  exit 1
fi

set -euo pipefail

DEVICE_TO_FLASH=$1
IMAGE_TO_FLASH="${2-./tmp/deploy/images/raspberrypi3/core-image-minimal-raspberrypi3.wic}"
FORCE_WRITE=${3-0}
DEVICE_IS_REMOVABLE=$(cat "/sys/block/$DEVICE_TO_FLASH/removable")

if [[ $FORCE_WRITE != "1" && $DEVICE_IS_REMOVABLE != "1" ]]; then
  echo ""
  echo "  For safety, this script will only flash removable block devices."
  echo ""
  echo "  This check is implemented by reading /sys/block/$DEVICE_TO_FLASH/removable."
  echo ""
  exit 1
fi

echo " "
echo "   Writing image file: $IMAGE_TO_FLASH "
echo "   to device         : $DEVICE_TO_FLASH "
echo " "
if ask "Do you want to continue?" N; then
    echo " "
else
    exit 1
fi

if [ ! -f "$IMAGE_TO_FLASH" ]; then
  echo " "
  echo "  Error: $IMAGE_TO_FLASH doesn't exist"
  echo ""
  exit 1
fi

echo "Unmounting all partitions on $DEVICE_TO_FLASH"
umount "/dev/$DEVICE_TO_FLASH"* || true
sleep 2

echo "Writing image to $DEVICE_TO_FLASH..."
dd if="$IMAGE_TO_FLASH" of="/dev/$DEVICE_TO_FLASH" bs=32M && sync
sleep 2

# It turns out there are card readers that give their partitions funny names, like
# "/dev/mmcblk0" will be the device, but the partitions are called "/dev/mmcblk0p1"
# for example. Better to just get the name of the partition after we flash it.
SECOND_PARTITION=$(fdisk -l "/dev/$DEVICE_TO_FLASH" | tail -n 1 | awk '{print $1}')

# Check if there is a problem with the boot partition, and fix it if there is.
# parted can identify the problem but apparently can't fix it without user
# interaction.
MISMATCH=$(fdisk -l "/dev/$DEVICE_TO_FLASH" 2>&1 >/dev/null | grep "GPT PMBR size mismatch" || true)
if [ -n "$MISMATCH" ]; then
  echo "Fixing GPT PMBR size mismatch."
  sgdisk -e "/dev/$DEVICE_TO_FLASH"
fi

echo "Resizing rootfs partition to fill all of $DEVICE_TO_FLASH..."
parted -s "/dev/$DEVICE_TO_FLASH" resizepart 2 '100%'
sleep 2
e2fsck -f "$SECOND_PARTITION" || true
sleep 2

echo "Resizing filesystem on $SECOND_PARTITION to match partition size..."
resize2fs -p "$SECOND_PARTITION"
sleep 2

echo "Done!"