summaryrefslogtreecommitdiff
path: root/package/fwinstall/src/fwinstall
blob: ed8b357f73e725da19db5f0c8fbed58283a1967f (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#!/bin/mksh
# This file is part of the OpenADK project.
# install OpenADK to a block/flash device

if [ $(id -u) -ne 0 ]; then
  print installation is only possible as root
  exit 1
fi

# get architecture
arch=$(uname -m)
# get adk target system
target=$(cat /etc/.adktarget)
if [ -z $target ]; then
  print autodetection of target failed
  exit 1
fi

function help {
	cat >&2 <<EOF
Syntax: fwinstall <archive> <device>
EOF
	exit 1
}

if [ -z $1 ]; then
  print no archive given
  help 
fi

if [ -z $2 ]; then
  print no device given
  help 
fi

archive=$1
device=$2
fs=ext4
cfgfssize=16384
tools="parted partprobe sfdisk mkfs.ext2"

f=0
for tool in $tools;do
  if ! which $tool >/dev/null; then
    echo "checking if $tool is installed... failed"
    f=1
  fi
done
if [ $f -eq 1 ]; then 
  exit 1
fi

# create empty partition table
function create_label {
  print "creating empty partition table"
  parted -s $1 mklabel msdos > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "creating empty partition failed!"
    exit 1
  fi
}

# get max size of disk in sectors
function get_max_size {
  maxsize=$(env LC_ALL=C parted $1 -s unit s print |awk '/^Disk/ { print $3 }'|sed -e 's/s//')
  rootsize=$(($maxsize-$cfgfssize))
  print device has $maxsize sectors. using $rootsize for root.
}

# create partition, with fstype start and end in sectors
function create_partition {
  print creating partition on $1
  parted -s $1 unit s mkpart primary $2 $3 $4 > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "creating primary partition failed!"
    exit 1
  fi
}

function set_boot_flag {
  print setting bootflag on $1 partition $2
  parted -s $1 set $2 boot on > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "setting bootflag failed!"
    exit 1
  fi
}

function change_part_type {
  print setting partition type on $1 partition $2 to $3
  sfdisk --change-id $1 $2 $3 >/dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "changing partition type failed!"
    exit 1
  fi
}

function create_filesystem {
  print creating filesystem $2 on $1 partition $3
  mkfs.ext2 -j -F -q ${1}${3} >/dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "creating filesystem on partition failed!"
    exit 1
  fi
}

function mount_fs {
  print mounting ${1}${2} to $4 with filesystem $3
  mount -t $3 ${1}${2} $4
  if [ $? -ne 0 ]; then
    echo "mounting filesystem failed!"
    exit 1
  fi
}

function extract_archive {
  print extracting archive $1 onto $2
  tar -C $2 -xpf $1
  if [ $? -ne 0 ]; then
    echo "archive extraction failed!"
    exit 1
  fi
}

function grub_install {
  print installing bootloader grub
(
  print set default=0
  print set timeout=1
  print serial --unit=0 --speed=115200
  print terminal_output serial
  print terminal_input serial
  consargs="console=ttyS0,115200"
  print
  print 'menuentry "GNU/Linux (OpenADK)" {'
  print "\tlinux /boot/kernel root=${device}1"
  print '}'
) >/mnt/boot/grub/grub.cfg
  grub-install $1 --root-directory /mnt
  if [ $? -ne 0 ]; then
    echo "grub install failed!"
    exit 1
  fi
}

function fix_perm {
  print fixing permissions
  chmod 1777 ${1}/tmp
  [[ -f ${1}/usr/bin/sudo ]] && chmod 4755 ${1}/usr/bin/sudo
  [[ -f ${1}/usr/bin/Xorg ]] && chmod 4755 ${1}/usr/bin/Xorg
}

case $arch {
  (x86|x86_64)
    get_max_size $device
    create_label $device
    create_partition $device ext2 16385 $rootsize
    create_partition $device ext2 $(($rootsize+1)) $(($maxsize-1))
    set_boot_flag $device 1
    change_part_type $device 2 88
    partprobe $device
    sync
    create_filesystem $device $fs 1
    [[ -x /sbin/mdev ]] && mdev -s
    mount_fs $device 1 $fs /mnt
    extract_archive $archive /mnt
    grub_install $device
    fix_perm /mnt
    umount /mnt
    ;;
}

echo "successfully installed OpenADK on $target."
exit 0