manjaro-arm-installer 14.7 KB
Newer Older
Dan Johansen's avatar
Dan Johansen committed
1 2 3
#! /bin/bash

# Set globals
4
TMPDIR=/var/tmp/manjaro-arm-installer
5
ARCH='aarch64'
6
NSPAWN='sudo systemd-nspawn -q --resolv-conf=copy-host --timezone=off -D'
Dan Johansen's avatar
Dan Johansen committed
7

8 9 10 11 12 13 14
# clearing variables
DEVICE=""
EDITION=""
USER=""
PASSWORD=""
ROOTPASSWORD=""
SDCARD=""
15 16
TIMEZONE=""
LOCALE=""
17

18
# Sanity checks for dependencies
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
if [ ! -f /usr/bin/sudo ]; then
    echo "sudo command is missing! Please install sudo!"
    exit 1
    elif [ ! -f /usr/bin/git ]; then
    echo "git command is missing! Please install git!"
    exit 1
    elif [ ! -f /usr/bin/parted ]; then
    echo "parted command is missing! Please install parted!"
    exit 1
    elif [ ! -f /usr/bin/systemd-nspawn ]; then
    echo "systemd-nspawn command is missing! Please install systemd!"
    exit 1
    elif [ ! -f /usr/bin/wget ]; then
    echo "wget command is missing! Please install wget!"
    exit 1
    elif [ ! -f /usr/bin/dialog ]; then
    echo "dialog command is missing! Please install dialog!"
    exit 1
    elif [ ! -f /usr/bin/bsdtar ]; then
    echo "bsdtar command is missing! Please install libarchive!"
    exit 1
fi
41

Dan Johansen's avatar
Dan Johansen committed
42 43

# Functions
44 45 46 47 48 49 50 51
msg() {
    ALL_OFF="\e[1;0m"
    BOLD="\e[1;1m"
    GREEN="${BOLD}\e[1;32m"
      local mesg=$1; shift
      printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
 }

Dan Johansen's avatar
Dan Johansen committed
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

usage_build_installer() {
    echo "Usage: ${0##*/} [options]"
    echo '    -h                 This help'
    echo ''
    echo ''
    exit $1
}

get_timer(){
    echo $(date +%s)
}

# $1: start timer
elapsed_time(){
    echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
}

show_elapsed_time(){
    msg "Time %s: %s minutes..." "$1" "$(elapsed_time $2)"
}

74
getarmprofiles () {
75 76 77
    if ls $TMPDIR/arm-profiles/* 1> /dev/null 2>&1; then
        cd $TMPDIR/arm-profiles
        git pull 1> /dev/null 2>&1
78
    else
79 80 81 82
        sudo mkdir -p $TMPDIR
        sudo chmod 777 $TMPDIR
        cd $TMPDIR
        git clone https://gitlab.com/Strit/arm-profiles.git 1> /dev/null 2>&1
83 84 85 86 87 88 89 90 91 92 93 94
    fi

}

create_install() {
 if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
        ARCH='armv7h'
    else
        ARCH='aarch64'
    fi

    msg "Creating install for $DEVICE..."
95 96 97 98
    
    # fetch and extract rootfs
    msg "Downloading latest $ARCH rootfs..."
    cd $TMPDIR
99
    wget -q --show-progress --progress=bar:force:noscroll https://www.strits.dk/files/Manjaro-ARM-$ARCH-latest.tar.gz
100 101
    
    msg "Extracting $ARCH rootfs..."
Dan Johansen's avatar
Dan Johansen committed
102
    sudo bsdtar -xpf $TMPDIR/Manjaro-ARM-$ARCH-latest.tar.gz -C $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
103 104
    
    msg "Setting up keyrings..."
Dan Johansen's avatar
Dan Johansen committed
105 106
    $NSPAWN $TMPDIR/root pacman-key --init 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root pacman-key --populate archlinuxarm manjaro manjaro-arm 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
107 108 109
    
    msg "Installing packages for $EDITION on $DEVICE..."
    # Install device and editions specific packages
Dan Johansen's avatar
Dan Johansen committed
110
    $NSPAWN $TMPDIR/root pacman -Syy base $PKG_DEVICE $PKG_EDITION --needed --noconfirm
Dan Johansen's avatar
Dan Johansen committed
111 112 113
    
    msg "Enabling services..."
    # Enable services
Dan Johansen's avatar
Dan Johansen committed
114 115
    $NSPAWN $TMPDIR/root systemctl enable systemd-networkd.service getty.target haveged.service dhcpcd.service 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root systemctl enable $SRV_EDITION 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
116 117

    msg "Applying overlay for $EDITION..."
118
    sudo cp -ap $TMPDIR/arm-profiles/overlays/$EDITION/* $TMPDIR/root/
Dan Johansen's avatar
Dan Johansen committed
119 120 121
    
    msg "Setting up users..."
    #setup users
122 123 124
    echo "$USER" > $TMPDIR/user
    echo "$PASSWORD" >> $TMPDIR/password
    echo "$PASSWORD" >> $TMPDIR/password
125 126
    echo "$ROOTPASSWORD" >> $TMPDIR/rootpassword
    echo "$ROOTPASSWORD" >> $TMPDIR/rootpassword
Dan Johansen's avatar
Dan Johansen committed
127 128 129
    $NSPAWN $TMPDIR/root passwd root < $TMPDIR/rootpassword 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root useradd -m -g users -G wheel,storage,network,power -s /bin/bash $(cat $TMPDIR/user) 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root passwd $(cat $TMPDIR/user) < $TMPDIR/password 1> /dev/null 2>&1
130

Dan Johansen's avatar
Dan Johansen committed
131 132 133 134 135
    
    msg "Enabling user services..."
    if [[ "$EDITION" = "minimal" ]] || [[ "$EDITION" = "server" ]]; then
        echo "No user services for $EDITION edition"
    else
Dan Johansen's avatar
Dan Johansen committed
136
        $NSPAWN $TMPDIR/root --user $(cat $TMPDIR/user) systemctl --user enable pulseaudio.service 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
137 138 139 140
    fi

    msg "Setting up system settings..."
    #system setup
Dan Johansen's avatar
Dan Johansen committed
141 142 143 144 145 146
    $NSPAWN $TMPDIR/root chmod u+s /usr/bin/ping 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root update-ca-trust 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root ln -sf /usr/share/zoneinfo/"$TIMEZONE" /etc/localtime 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root sed -i s/"#$LOCALE"/"$LOCALE"/g /etc/locale.gen 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root sed -i s/"LANG=en_US.utf8"/"LANG=$LOCALE"/g /etc/locale.conf 1> /dev/null 2>&1
    $NSPAWN $TMPDIR/root locale-gen
Dan Johansen's avatar
Dan Johansen committed
147 148 149
    
    msg "Doing device specific setups for $DEVICE..."
    if [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "rpi3" ]]; then
150 151 152 153
        echo "dtparam=audio=on" | sudo tee --append $TMPDIR/root/boot/config.txt
        echo "hdmi_drive=2" | sudo tee --append $TMPDIR/root/boot/config.txt
        echo "audio_pwm_mode=2" | sudo tee --append $TMPDIR/root/boot/config.txt
        echo "/dev/mmcblk0p1  /boot   vfat    defaults        0       0" | sudo tee --append $TMPDIR/root/etc/fstab
Dan Johansen's avatar
Dan Johansen committed
154
    elif [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "oc2" ]]; then
155
        $NSPAWN $TMPDIR/root systemctl enable amlogic.service 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
156 157 158
    elif [[ "$DEVICE" = "rock64" ]] || [[ "$DEVICE" = "rockpro64" ]]; then
        echo "No device setups for $DEVICE..."
    elif [[ "$DEVICE" = "pinebook" ]]; then
Dan Johansen's avatar
Dan Johansen committed
159 160
        $NSPAWN $TMPDIR/root systemctl enable pinebook-post-install.service 1> /dev/null 2>&1
        $NSPAWN $TMPDIR/root --user $(cat $TMPDIR/user) systemctl --user enable pinebook-user.service 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
161 162 163 164
    else
        echo ""
    fi
    
165
    msg "Cleaning install for unwanted files..."
Dan Johansen's avatar
Dan Johansen committed
166
       if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
167
        sudo rm $TMPDIR/root/usr/bin/qemu-arm-static
Dan Johansen's avatar
Dan Johansen committed
168
    else
169
        sudo rm $TMPDIR/root/usr/bin/qemu-aarch64-static
Dan Johansen's avatar
Dan Johansen committed
170
    fi
171 172 173 174
    sudo rm -rf $TMPDIR/root/var/cache/pacman/pkg/*
    sudo rm -rf $TMPDIR/root/var/log/*
    
    # Remove temp files on host
Dan Johansen's avatar
Dan Johansen committed
175
    sudo rm -rf $TMPDIR/user $TMPDIR/password $TMPDIR/rootpassword
176
    sudo rm -rf $TMPDIR/Manjaro-ARM-$ARCH-latest.tar.gz*
Dan Johansen's avatar
Dan Johansen committed
177

178
    msg "$DEVICE $EDITION install complete"
Dan Johansen's avatar
Dan Johansen committed
179 180 181
}

prepare_card () {
182
    msg "Getting $SDCARD ready for $DEVICE..."
Dan Johansen's avatar
Dan Johansen committed
183 184 185
    # For Raspberry Pi devices
    if [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "rpi3" ]]; then
        #partition with boot and root
186 187 188
        sudo parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1
        sudo parted -s $SDCARD mkpart primary fat32 0% 100M 1> /dev/null 2>&1
        START=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/start` 
Dan Johansen's avatar
Dan Johansen committed
189
        SIZE=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/size`
190
        END_SECTOR=$(expr $START + $SIZE)
191 192 193 194
        sudo parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100% 1> /dev/null 2>&1
        sudo partprobe $SDCARD 1> /dev/null 2>&1
        sudo mkfs.vfat "${SDCARD}1" 1> /dev/null 2>&1
        sudo mkfs.ext4 "${SDCARD}2" 1> /dev/null 2>&1
195 196
        
        #Mount SD card
Dan Johansen's avatar
Dan Johansen committed
197 198
        mkdir -p $TMPDIR/root
        mkdir -p $TMPDIR/boot
199 200
        sudo mount ${SDCARD}1 $TMPDIR/boot
        sudo mount ${SDCARD}2 $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
201 202 203 204

    # For Odroid devices
    elif [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "oc2" ]] || [[ "$DEVICE" = "xu4" ]]; then
        #Clear first 8mb
205
        sudo dd if=/dev/zero of=${SDCARD} bs=1M count=8 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
206 207
	
    #partition with a single root partition
208 209 210 211
        sudo parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1
        sudo parted -s $SDCARD mkpart primary ext4 0% 100% 1> /dev/null 2>&1
        sudo partprobe $SDCARD 1> /dev/null 2>&1
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1 1> /dev/null 2>&1
212 213
        
        #Mount SD card
Dan Johansen's avatar
Dan Johansen committed
214 215
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
216
        sudo mount ${SDCARD}1 $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
217

218 219
    # For pine devices
   elif [[ "$DEVICE" = "pinebook" ]] || [[ "$DEVICE" = "sopine" ]]; then
Dan Johansen's avatar
Dan Johansen committed
220 221

    #Clear first 8mb
222
        sudo dd if=/dev/zero of=${SDCARD} bs=1M count=8 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
223 224
	
    #partition with a single root partition
225 226 227 228
        sudo parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1
        sudo parted -s $SDCARD mkpart primary ext4 0% 100% 1> /dev/null 2>&1
        sudo partprobe $SDCARD 1> /dev/null 2>&1
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1 1> /dev/null 2>&1
229 230
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
231 232
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
233
        sudo mount ${SDCARD}1 $TMPDIR/root
234

Dan Johansen's avatar
Dan Johansen committed
235
    # For rockpro64 device
236
    elif [[ "$DEVICE" = "rock64" ]] || [[ "$DEVICE" = "rockpro64" ]]; then
Dan Johansen's avatar
Dan Johansen committed
237 238

    #Clear first 8mb
239
        sudo dd if=/dev/zero of=${SDCARD} bs=1M count=32 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
240 241
	
    #partition with a single root partition
242
        sudo parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1
243
        sudo parted -s $SDCARD mkpart primary ext4 32M 100% 1> /dev/null 2>&1
244 245
        sudo partprobe $SDCARD 1> /dev/null 2>&1
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1 1> /dev/null 2>&1
246 247
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
248 249
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
250
        sudo mount ${SDCARD}1 $TMPDIR/root
251 252 253 254 255 256 257 258 259 260 261 262 263 264
    fi
}

cleanup () {
    msg "Writing bootloader and cleaning up after install..."
   # For Raspberry Pi devices
    if [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "rpi3" ]]; then
       #copy rootfs contents over to the FS
        sudo mv $TMPDIR/root/boot/* $TMPDIR/boot
        
        #clean up
        sudo umount $TMPDIR/root
        sudo umount $TMPDIR/boot
        sudo rm -r $TMPDIR/root $TMPDIR/boot
265
        sudo partprobe $SDCARD 1> /dev/null 2>&1
266 267 268 269 270
        
# For Odroid devices
    elif [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "oc2" ]] || [[ "$DEVICE" = "xu4" ]]; then
    #flash bootloader
        cd $TMPDIR/root/boot/
271
        sudo ./sd_fusing.sh $SDCARD 1> /dev/null 2>&1
272 273 274 275 276
        cd ~

    #clean up
        sudo umount $TMPDIR/root
        sudo rm -r $TMPDIR/root
277
        sudo partprobe $SDCARD 1> /dev/null 2>&1
278 279
        
    # For pinebook device
280
    elif [[ "$DEVICE" = "pinebook" ]] || [[ "$DEVICE" = "sopine" ]]; then
281
    #flash bootloader
282
        sudo dd if=$TMPDIR/root/boot/u-boot-sunxi-with-spl-$DEVICE.bin of=${SDCARD} bs=8k seek=1 1> /dev/null 2>&1
283 284 285 286
        
    #clean up
        sudo umount $TMPDIR/root
        sudo rm -r $TMPDIR/root
287
        sudo partprobe $SDCARD 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
288
        
289 290
        
    # For rockpro64 device
291
    elif [[ "$DEVICE" = "rock64" ]] || [[ "$DEVICE" = "rockpro64" ]]; then
Dan Johansen's avatar
Dan Johansen committed
292
    #flash bootloader
293 294 295
        sudo dd if=$TMPDIR/root/boot/idbloader.img of=${SDCARD} seek=64 conv=notrunc 1> /dev/null 2>&1
        sudo dd if=$TMPDIR/root/boot/uboot.img of=${SDCARD} seek=16384 conv=notrunc 1> /dev/null 2>&1
        sudo dd if=$TMPDIR/root/boot/trust.img of=${SDCARD} seek=24576 conv=notrunc 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
296 297 298 299
        
    #clean up
        sudo umount $TMPDIR/root
        sudo rm -r $TMPDIR/root
300
        sudo partprobe $SDCARD 1> /dev/null 2>&1
301 302
        
fi
Dan Johansen's avatar
Dan Johansen committed
303 304
}

305 306

# Using Dialog to ask for user input for variables
307 308
DEVICE=$(dialog --clear --title "Manjaro ARM Installer" \
        --menu "Choose a device:" 20 51 6 \
309 310
        "rpi3" "Raspberry Pi 3" \
        "oc2" "Odroid C2" \
311
	"pinebook" "Pinebook" \
312 313
	"sopine" "Sopine/Pine64-LTS" \
	"rock64" "Rock64" \
314 315 316
	"rpi2" "Raspberry Pi 2 (unmaintained)" \
	"oc1" "Odroid C1/C1+ (unmaintained)" \
	"xu4" "Odroid XU4 (unmaintained)" 3>&1 1>&2 2>&3 3>&-)
317 318 319 320 321


#The if statement makes sure that the user has put in something in the previous prompt. If not (left blank or pressed cancel) the script will end
if [ ! -z "$DEVICE" ]
then
322 323
EDITION=$(dialog --clear --title "Manjaro ARM Installer" \
	--menu "Choose an edition:" 20 50 5 \
324 325
	"minimal" "Minimal Edition (Just CLI)" \
	"lxqt" "Full LXQT Desktop and apps (lightweight)" \
326
	"kde" "Full KDE/Plasma Desktop (Heavy)" \
327
	"mate" "Full MATE desktop and apps (lightweight, unmaintained)" \
328
	"i3" "Mininal i3 WM with apps (very light)" 3>&1 1>&2 2>&3 3>&-) 
329 330 331 332 333 334 335 336 337

else 
	clear
	exit 1
fi


if [ ! -z "$EDITION" ]
then
338
USER=$(dialog --clear --title "Manjaro ARM Installer" \
339 340 341 342 343 344 345 346 347 348 349 350
	--inputbox "Enter username:" 8 50 \
        3>&1 1>&2 2>&3 3>&-)
else 
	clear
	exit 1
fi




if [ ! -z "$USER" ]
then
351 352
PASSWORD=$(dialog --clear --title "Manjaro ARM Installer" \
	--passwordbox "Enter Password for $USER:" 8 50 \
353 354 355 356 357 358 359 360 361 362 363
        3>&1 1>&2 2>&3 3>&- \
	)
else 
	clear
	exit 1
fi



if [ ! -z "$PASSWORD" ]
then
364
ROOTPASSWORD=$(dialog --clear --title "Manjaro ARM Installer" \
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
	--passwordbox "Enter Root Password:" 8 50 \
        3>&1 1>&2 2>&3 3>&- \
	)
else 
	clear
	exit 1
fi




if [ ! -z "$ROOTPASSWORD" ]
then

# simple command to put the results of lsblk (just the names of the devices) into an array and make that array populate the options	
let i=0
W=()
while read -r line; do
    let i=$i+1
    W+=($line "")
385
done < <( lsblk -dn -o NAME )
386
SDCARD=$(dialog --title "Manjaro ARM Installer" \
387
	--menu "Chose your SDCard - Be sure the correct drive is selected!" 20 50 5 \
388 389 390 391 392 393 394 395 396 397
       	"${W[@]}" 3>&2 2>&1 1>&3)

# add /dev/ to the selected option above
SDCARD=/dev/$SDCARD
else 
	clear
	exit 1
fi


398 399 400 401 402 403 404 405 406 407 408 409
if [ ! -z "$SDCARD" ]
then
let i=0
W=()
while read -r line; do
    let i=$i+1
    W+=($line "")
done < <( timedatectl list-timezones )
TIMEZONE=$(dialog --clear --title "Manjaro ARM Installer" \
    --menu "Chose your timezone!" 20 50 15 \
        "${W[@]}" 3>&1 1>&2 2>&3 3>&- \
	)
410
#	--inputbox "Enter timezone (example Europe/London):" 8 50 \
411 412 413 414
else 
	clear
	exit 1
fi
415 416


417 418 419 420 421 422 423 424 425 426 427 428
if [ ! -z "$TIMEZONE" ]
then
let i=0
W=()
while read -r line; do
    let i=$i+1
    W+=($line "")
done < <( cat /etc/locale.gen | grep "UTF-8" | tail -n +2 | awk '{print $1}' | sed -e 's/^#*//' )
LOCALE=$(dialog --clear --title "Manjaro ARM Installer" \
	--menu "Chose your locale!" 20 50 15 \
        "${W[@]}" 3>&1 1>&2 2>&3 3>&- \
	)
429
#	--inputbox "Enter locale (example en_US.UTF-8):" 8 50 \
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
else 
	clear
	exit 1
fi

if [ ! -z "$LOCALE" ]
then
dialog --clear --title "Manjaro ARM Installer" \
    --yesno "Is the below information correct:
    Device = $DEVICE
    Edition = $EDITION
    Username = $USER
    Password for $USER = $PASSWORD
    Password for root = $ROOTPASSWORD
    SD/eMMC card = $SDCARD
    Timezone = $TIMEZONE
    Locale = $LOCALE" 20 50 \
    3>&1 1>&2 2>&3 3>&-
else
    clear
    exit 1
fi

response=$?
case $response in
   0) clear; msg "Proceeding....";;
   1) clear; msg "Installation aborted...."; exit 1;;
   255) clear; msg "Installation aborted..."; exit 1;;
esac

460

Dan Johansen's avatar
Dan Johansen committed
461 462 463 464 465 466
if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
    ARCH='armv7h'
else
    ARCH='aarch64'
fi

467 468
# get the profiles
getarmprofiles
Dan Johansen's avatar
Dan Johansen committed
469 470

#Package lists
471 472 473
PKG_DEVICE=$(grep "^[^#;]" $TMPDIR/arm-profiles/devices/$DEVICE | awk '{print $1}')
PKG_EDITION=$(grep "^[^#;]" $TMPDIR/arm-profiles/editions/$EDITION | awk '{print $1}')
SRV_EDITION=$(grep "^[^#;]" $TMPDIR/arm-profiles/services/$EDITION | awk '{print $1}')
Dan Johansen's avatar
Dan Johansen committed
474

475

Dan Johansen's avatar
Dan Johansen committed
476
# Commands
477
timer_start=$(get_timer)
Dan Johansen's avatar
Dan Johansen committed
478 479

prepare_card
480 481 482 483
create_install
cleanup
show_elapsed_time "${FUNCNAME}" "${timer_start}"
sync