forked from ccrisan/motionpie
-
Notifications
You must be signed in to change notification settings - Fork 0
/
writeimage.sh
executable file
·141 lines (120 loc) · 3.41 KB
/
writeimage.sh
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 -e
function usage() {
echo "Usage: $0 [options...]" 1>&2
echo ""
echo "Available options:"
echo " <-i image_file> - indicates the path to the image file (e.g. -i /home/user/Download/motionPie.img)"
echo " <-d sdcard_dev> - indicates the path to the sdcard block device (e.g. -d /dev/mmcblk0)"
echo " [-n ssid:psk] - sets the wireless network name and key (e.g. -n mynet:mykey1234)"
echo " [-s ip/cidr:gw:dns] - sets a static IP configuration instead of DHCP (e.g. -s 192.168.1.101/24:192.168.1.1:8.8.8.8)"
exit 1
}
if [ -z "$1" ]; then
usage
fi
test "root" != "$USER" && exec sudo $0 "$@"
function msg() {
echo ":: $1"
}
while getopts "a:d:f:h:i:ln:o:p:s:w" o; do
case "$o" in
d)
SDCARD_DEV=$OPTARG
;;
i)
DISK_IMG=$OPTARG
;;
n)
IFS=":" NETWORK=($OPTARG)
SSID=${NETWORK[0]}
PSK=${NETWORK[1]}
;;
s)
IFS=":" S_IP=($OPTARG)
IP=${S_IP[0]}
GW=${S_IP[1]}
DNS=${S_IP[2]}
;;
*)
usage
;;
esac
done
if [ -z "$SDCARD_DEV" ] || [ -z "$DISK_IMG" ]; then
usage
fi
function cleanup {
set +e
# unmount sdcard
umount ${SDCARD_DEV}* >/dev/null 2>&1
}
trap cleanup EXIT
BOOT=$(dirname $0)/.boot
ROOT=$(dirname $0)/.root
if ! [ -f $DISK_IMG ]; then
echo "could not find image file $DISK_IMG"
exit 1
fi
umount ${SDCARD_DEV}* 2>/dev/null || true
msg "writing disk image to sdcard"
dd if=$DISK_IMG of=$SDCARD_DEV bs=1048576
sync
if which partprobe > /dev/null 2>&1; then
msg "re-reading sdcard partition table"
partprobe ${SDCARD_DEV}
fi
msg "mounting sdcard"
mkdir -p $BOOT
mkdir -p $ROOT
if [ `uname` == "Darwin" ]; then
if ! [ -x /sbin/mount_fuse-ext2 ]; then
echo "Missing mount_fuse-ext2 for EXT4 mounting! Further configuration stopped."
echo ""
echo "See http://osxdaily.com/2014/03/20/mount-ext-linux-file-system-mac/"
echo "how to install ext4 mount support, please include 'Enabling EXT Write Support'."
echo ""
exit 1
fi
BOOT_DEV=${SDCARD_DEV}s1 # e.g. /dev/disk4s1
ROOT_DEV=${SDCARD_DEV}s2 # e.g. /dev/disk4s2
mount_msdos $BOOT_DEV $BOOT
mount_fuse-ext2 $ROOT_DEV $ROOT
else # assuming Linux
BOOT_DEV=${SDCARD_DEV}p1 # e.g. /dev/mmcblk0p1
ROOT_DEV=${SDCARD_DEV}p2 # e.g. /dev/mmcblk0p2
if ! [ -e ${SDCARD_DEV}p1 ]; then
BOOT_DEV=${SDCARD_DEV}1 # e.g. /dev/sdc1
ROOT_DEV=${SDCARD_DEV}2 # e.g. /dev/sdc2
fi
mount $BOOT_DEV $BOOT
mount $ROOT_DEV $ROOT
fi
# wifi
if [ -n "$SSID" ]; then
msg "creating wireless configuration"
conf=$ROOT/etc/wpa_supplicant.conf
echo "update_config=1" > $conf
echo "ctrl_interface=/var/run/wpa_supplicant" >> $conf
echo "network={" >> $conf
echo " scan_ssid=1" >> $conf
echo " ssid=\"$SSID\"" >> $conf
if [ -n "$PSK" ]; then
echo " psk=\"$PSK\"" >> $conf
fi
echo -e "}\n" >> $conf
fi
# static ip
if [ -n "$IP" ] && [ -n "$GW" ] && [ -n "$DNS" ]; then
msg "setting static IP configuration"
conf=$ROOT/etc/static_ip.conf
echo "static_ip=\"$IP\"" > $conf
echo "static_gw=\"$GW\"" >> $conf
echo "static_dns=\"$DNS\"" >> $conf
fi
msg "unmounting sdcard"
sync
umount $BOOT
umount $ROOT
rmdir $BOOT
rmdir $ROOT
msg "you can now remove the sdcard"