#! /bin/bash # ***************************** # Version 1.2.3 # ***************************** # Set globals TMPDIR=/var/tmp/manjaro-arm-installer ARCH='aarch64' NSPAWN='systemd-nspawn -q --resolv-conf=copy-host --timezone=off -D' # clearing variables DEVICE="" EDITION="" USER="" USERGROUPS="" FULLNAME="" PASSWORD="" CONFIRMPASSWORD="" CONFIRMROOTPASSWORD="" ROOTPASSWORD="" SDCARD="" SDTYP="" SDDEV="" DEV_NAME="" TIMEZONE="" LOCALE="" # check if root if [ "$EUID" -ne 0 ]; then echo "*******************************************************************************************" echo "* *" echo "* This script requires root permissions to run. Please run as root or with sudo! *" echo "* *" echo "*******************************************************************************************" exit fi # Sanity checks for dependencies if [ ! -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 elif [ ! -f /usr/bin/mkpasswd ]; then echo "mkpasswd command is missing! Please install debian-whois-mkpasswd!" exit 1 elif [ ! -f /usr/bin/awk ]; then echo "awk command is missing! Please install gawk!" exit 1 fi # Functions 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 } info() { ALL_OFF="\e[1;0m" BOLD="\e[1;1m" BLUE="${BOLD}\e[1;34m" local mesg=$1; shift printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 } 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)" } getarmprofiles () { info "Getting package lists ready for $DEVICE $EDITION edition..." if ls $TMPDIR/arm-profiles/* 1> /dev/null 2>&1; then cd $TMPDIR/arm-profiles git pull 1> /dev/null 2>&1 else mkdir -p $TMPDIR chmod 777 $TMPDIR cd $TMPDIR git clone https://gitlab.com/Strit/arm-profiles.git 1> /dev/null 2>&1 fi } create_install() { msg "Creating install for $DEVICE..." msg "Used device is ${SDCARD}${SDDEV}x" # fetch and extract rootfs info "Downloading latest $ARCH rootfs..." cd $TMPDIR wget -q --show-progress --progress=bar:force:noscroll https://osdn.net/projects/manjaro-arm/storage/.rootfs/Manjaro-ARM-$ARCH-latest.tar.gz info "Extracting $ARCH rootfs..." bsdtar -xpf $TMPDIR/Manjaro-ARM-$ARCH-latest.tar.gz -C $TMPDIR/root info "Setting up keyrings..." $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 info "Installing packages for $EDITION on $DEVICE..." # Install device and editions specific packages $NSPAWN $TMPDIR/root pacman -Syyu base $PKG_DEVICE $PKG_EDITION --noconfirm if [[ "$DEVICE" = "on2" ]] || [[ "$DEVICE" = "rpi4" ]] || [[ "$DEVICE" = "vim3" ]]; then if [[ "$EDITION" = "kde" ]] || [[ "$EDITION" = "cubocore" ]]; then $NSPAWN $TMPDIR/root pacman -R sddm sddm-kcm matcha-dynamic-theme --noconfirm $NSPAWN $TMPDIR/root pacman -S sddm-compat sddm-kcm matcha-dynamic-theme --noconfirm elif [[ "$EDITION" = "lxqt" ]]; then $NSPAWN $TMPDIR/root pacman -R sddm matcha-dynamic-theme --noconfirm $NSPAWN $TMPDIR/root pacman -S sddm-compat matcha-dynamic-theme --noconfirm fi fi info "Enabling services..." # Enable services $NSPAWN $TMPDIR/root systemctl enable getty.target haveged.service 1> /dev/null 2>&1 $NSPAWN $TMPDIR/root systemctl enable $SRV_EDITION 1> /dev/null 2>&1 if [ -f $TMPDIR/root/usr/bin/xdg-user-dirs-update ]; then $NSPAWN $TMPDIR/root systemctl --global enable xdg-user-dirs-update.service 1> /dev/null 2>&1 fi info "Applying overlay for $EDITION..." cp -ap $TMPDIR/arm-profiles/overlays/$EDITION/* $TMPDIR/root/ info "Setting up users..." #setup users echo "$USER" > $TMPDIR/user echo "$PASSWORD" > $TMPDIR/password echo "$ROOTPASSWORD" > $TMPDIR/rootpassword info "setting password for root ..." $NSPAWN $TMPDIR/root awk -i inplace -F: "BEGIN {OFS=FS;} \$1 == \"root\" {\$2=\"$(mkpasswd --hash=SHA-512 $(cat $TMPDIR/rootpassword))\"} 1" /etc/shadow 1> /dev/null 2>&1 info "Adding user..." $NSPAWN $TMPDIR/root useradd -m -g users -G wheel,storage,lp,network,power -p $(mkpasswd --hash=SHA-512 $(cat $TMPDIR/password)) -s /bin/bash $(cat $TMPDIR/user) 1> /dev/null 2>&1 $NSPAWN $TMPDIR/root usermod -aG $USERGROUPS $(cat $TMPDIR/user) 1> /dev/null 2>&1 $NSPAWN $TMPDIR/root chfn -f "$FULLNAME" $(cat $TMPDIR/user) 1> /dev/null 2>&1 info "Enabling user services..." if [[ "$EDITION" = "minimal" ]] || [[ "$EDITION" = "server" ]]; then msg "No user services for $EDITION edition" else $NSPAWN $TMPDIR/root --user $(cat $TMPDIR/user) systemctl --user enable pulseaudio.service 1> /dev/null 2>&1 fi info "Setting up system settings..." #system setup $NSPAWN $TMPDIR/root chmod u+s /usr/bin/ping 1> /dev/null 2>&1 rm -f $TMPDIR/root/etc/ssl/certs/ca-certificates.crt rm -f $TMPDIR/root/etc/ca-certificates/extracted/tls-ca-bundle.pem cp -a /etc/ssl/certs/ca-certificates.crt $TMPDIR/root/etc/ssl/certs/ cp -a /etc/ca-certificates/extracted/tls-ca-bundle.pem $TMPDIR/root/etc/ca-certificates/extracted/ $NSPAWN $TMPDIR/root timedatectl set-timezone $TIMEZONE 1> /dev/null 2>&1 $NSPAWN $TMPDIR/root timedatectl set-ntp true 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 locale-gen 1> /dev/null 2>&1 $NSPAWN $TMPDIR/root localectl set-locale $LOCALE 1> /dev/null 2>&1 if [[ "$SYSTEM" != "Pinebook" ]]; then $NSPAWN $TMPDIR/root localectl set-keymap $KEYMAP 1> /dev/null 2>&1 fi $NSPAWN $TMPDIR/root hostnamectl set-hostname $HOSTNAME 1> /dev/null 2>&1 chown -R root:root $TMPDIR/root/etc 1> /dev/null 2>&1 if [[ "$EDITION" != "minimal" && "$EDITION" != "server" ]]; then chown root:polkitd $TMPDIR/root/etc/polkit-1/rules.d 1> /dev/null 2>&1 fi info "Doing device specific setups for $DEVICE..." if [[ "$DEVICE" = "rpi3" ]]; then echo "dtparam=audio=on" | tee --append $TMPDIR/root/boot/config.txt 1> /dev/null 2>&1 echo "blacklist vchiq" | tee --append $TMPDIR/root/etc/modprobe.d/blacklist-vchiq.conf 1> /dev/null 2>&1 echo "blacklist snd_bcm2835" | tee --append $TMPDIR/root/etc/modprobe.d/blacklist-vchiq.conf 1> /dev/null 2>&1 echo "LABEL=BOOT /boot vfat defaults 0 0" | tee --append $TMPDIR/root/etc/fstab 1> /dev/null 2>&1 elif [[ "$DEVICE" = "rpi4" ]]; then echo "LABEL=BOOT /boot vfat defaults 0 0" | tee --append $TMPDIR/root/etc/fstab 1> /dev/null 2>&1 $NSPAWN $TMPDIR/root systemctl enable attach-bluetooth.service 1> /dev/null 2>&1 # fix wifi sed -i s/'boardflags3=0x48200100'/'boardflags3=0x44200100'/ $TMPDIR/root/usr/lib/firmware/updates/brcm/brcmfmac43455-sdio.txt 1> /dev/null 2>&1 elif [[ "$DEVICE" = "oc2" ]]; then $NSPAWN $TMPDIR/root systemctl enable amlogic.service 1> /dev/null 2>&1 elif [[ "$DEVICE" = "on2" ]]; then $NSPAWN $TMPDIR/root systemctl disable dhcpcd.service 1> /dev/null 2>&1 echo "LABEL=BOOT /boot vfat defaults 0 0" | tee --append $TMPDIR/root/etc/fstab 1> /dev/null 2>&1 elif [[ "$DEVICE" = "vim3" ]]; then echo "LABEL=BOOT /boot vfat defaults 0 0" | tee --append $TMPDIR/root/etc/fstab 1> /dev/null 2>&1 $NSPAWN $TMPDIR/root systemctl enable bluetooth-khadas.service 1> /dev/null 2>&1 elif [[ "$DEVICE" = "pinebook" ]] || [[ "$DEVICE" = "sopine" ]] || [[ "$DEVICE" = "pine64" ]]; then $NSPAWN $TMPDIR/root systemctl enable pinebook-post-install.service 1> /dev/null 2>&1 else echo "No device specific setting needed for $DEVICE" fi info "Cleaning install for unwanted files..." rm $TMPDIR/root/usr/bin/qemu-aarch64-static rm -rf $TMPDIR/root/var/cache/pacman/pkg/* rm -rf $TMPDIR/root/var/log/* rm -rf $TMPDIR/root/usr/lib/systemd/system/systemd-firstboot.service rm -rf $TMPDIR/root/etc/machine-id # Remove temp files on host rm -rf $TMPDIR/user $TMPDIR/password $TMPDIR/rootpassword rm -rf $TMPDIR/Manjaro-ARM-$ARCH-latest.tar.gz* msg "$DEVICE $EDITION install complete" } prepare_card () { msg "Getting $SDCARD ready for $DEVICE..." # For Raspberry Pi devices if [[ "$DEVICE" = "rpi3" ]] || [[ "$DEVICE" = "rpi4" ]]; then # umount SD card umount ${SDCARD}${SDDEV}1 1> /dev/null 2>&1 umount ${SDCARD}${SDDEV}2 1> /dev/null 2>&1 #partition with boot and root parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1 parted -s $SDCARD mkpart primary fat32 0% 100M 1> /dev/null 2>&1 START=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/start` SIZE=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/size` END_SECTOR=$(expr $START + $SIZE) parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100% 1> /dev/null 2>&1 partprobe $SDCARD 1> /dev/null 2>&1 mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT 1> /dev/null 2>&1 mkfs.ext4 "${SDCARD}${SDDEV}2" -L ROOT 1> /dev/null 2>&1 #Mount SD card mkdir -p $TMPDIR/root mkdir -p $TMPDIR/boot mount ${SDCARD}${SDDEV}1 $TMPDIR/boot mount ${SDCARD}${SDDEV}2 $TMPDIR/root # For Odroid devices elif [[ "$DEVICE" = "oc2" ]]; then # umount SD card umount ${SDCARD}${SDDEV}1 1> /dev/null 2>&1 umount ${SDCARD}${SDDEV}2 1> /dev/null 2>&1 #Clear first 8mb dd if=/dev/zero of=${SDCARD} bs=1M count=8 1> /dev/null 2>&1 #partition with a single root partition parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1 parted -s $SDCARD mkpart primary ext4 0% 100% 1> /dev/null 2>&1 partprobe $SDCARD 1> /dev/null 2>&1 mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}${SDDEV}1 -L ROOT 1> /dev/null 2>&1 #Mount SD card mkdir -p $TMPDIR/root chmod 777 -R $TMPDIR/root mount ${SDCARD}${SDDEV}1 $TMPDIR/root elif [[ "$DEVICE" = "on2" ]]; then # umount SD card umount ${SDCARD}${SDDEV}1 1> /dev/null 2>&1 umount ${SDCARD}${SDDEV}2 1> /dev/null 2>&1 #Clear first 8 mb dd if=/dev/zero of=${SDCARD} bs=1M count=8 1> /dev/null 2>&1 #partition with 2 partitions parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1 parted -s $SDCARD mkpart primary fat32 0% 256M 1> /dev/null 2>&1 START=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/start` SIZE=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/size` END_SECTOR=$(expr $START + $SIZE) parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100% 1> /dev/null 2>&1 partprobe $SDCARD 1> /dev/null 2>&1 mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT 1> /dev/null 2>&1 mkfs.ext4 "${SDCARD}${SDDEV}2" -L ROOT 1> /dev/null 2>&1 #copy rootfs contents over to the FS mkdir -p $TMPDIR/root mkdir -p $TMPDIR/boot mount ${SDCARD}${SDDEV}1 $TMPDIR/boot mount ${SDCARD}${SDDEV}2 $TMPDIR/root # For Khadas devices elif [[ "$DEVICE" = "vim3" ]]; then # umount SD card umount ${SDCARD}${SDDEV}1 1> /dev/null 2>&1 umount ${SDCARD}${SDDEV}2 1> /dev/null 2>&1 #Clear first 8 mb dd if=/dev/zero of=${SDCARD} bs=1M count=8 1> /dev/null 2>&1 #partition with 2 partitions parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1 parted -s $SDCARD mkpart primary fat32 32M 256M 1> /dev/null 2>&1 START=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/start` SIZE=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/size` END_SECTOR=$(expr $START + $SIZE) parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100% 1> /dev/null 2>&1 partprobe $SDCARD 1> /dev/null 2>&1 mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT 1>/dev/null 2>&1 mkfs.ext4 "${SDCARD}${SDDEV}2" -L ROOT 1> /dev/null 2>&1 #copy rootfs contents over to the FS mkdir -p $TMPDIR/root mkdir -p $TMPDIR/boot mount ${SDCARD}${SDDEV}1 $TMPDIR/boot mount ${SDCARD}${SDDEV}2 $TMPDIR/root # For pine devices elif [[ "$DEVICE" = "pinebook" ]] || [[ "$DEVICE" = "sopine" ]] || [[ "$DEVICE" = "pine64" ]]; then # umount SD card umount ${SDCARD}${SDDEV}1 1> /dev/null 2>&1 umount ${SDCARD}${SDDEV}2 1> /dev/null 2>&1 #Clear first 8mb dd if=/dev/zero of=${SDCARD} bs=1M count=8 1> /dev/null 2>&1 #partition with a single root partition parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1 parted -s $SDCARD mkpart primary ext4 0% 100% 1> /dev/null 2>&1 partprobe $SDCARD 1> /dev/null 2>&1 mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}${SDDEV}1 -L ROOT 1> /dev/null 2>&1 # Mount SD card mkdir -p $TMPDIR/root chmod 777 -R $TMPDIR/root mount ${SDCARD}${SDDEV}1 $TMPDIR/root # For rockpro64 device elif [[ "$DEVICE" = "rock64" ]] || [[ "$DEVICE" = "rockpro64" ]] || [[ "$DEVICE" = "rockpi4" ]]; then # umount SD card umount ${SDCARD}${SDDEV}1 1> /dev/null 2>&1 umount ${SDCARD}${SDDEV}2 1> /dev/null 2>&1 #Clear first 8mb dd if=/dev/zero of=${SDCARD} bs=1M count=32 1> /dev/null 2>&1 #partition with a single root partition parted -s $SDCARD mklabel msdos 1> /dev/null 2>&1 parted -s $SDCARD mkpart primary ext4 32M 100% 1> /dev/null 2>&1 partprobe $SDCARD 1> /dev/null 2>&1 mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}${SDDEV}1 -L ROOT 1> /dev/null 2>&1 # Mount SD card mkdir -p $TMPDIR/root chmod 777 -R $TMPDIR/root mount ${SDCARD}${SDDEV}1 $TMPDIR/root fi } cleanup () { msg "Writing bootloader and cleaning up after install..." # For Raspberry Pi devices if [[ "$DEVICE" = "rpi3" ]] || [[ "$DEVICE" = "rpi4" ]]; then #move boot files mv $TMPDIR/root/boot/* $TMPDIR/boot #clean up umount $TMPDIR/root umount $TMPDIR/boot rm -r $TMPDIR/root $TMPDIR/boot partprobe $SDCARD 1> /dev/null 2>&1 # For Odroid devices elif [[ "$DEVICE" = "oc2" ]]; then #flash bootloader cd $TMPDIR/root/boot/ ./sd_fusing.sh $SDCARD 1> /dev/null 2>&1 cd ~ #clean up umount $TMPDIR/root rm -r $TMPDIR/root partprobe $SDCARD 1> /dev/null 2>&1 elif [[ "$DEVICE" = "on2" ]]; then # move boot files mv $TMPDIR/root/boot/* $TMPDIR/boot #flash bootloader dd if=$TMPDIR/boot/u-boot.bin of=${SDCARD} conv=fsync,notrunc bs=512 seek=1 1> /dev/null 2>&1 #clean up umount $TMPDIR/root umount $TMPDIR/boot losetup -d $LDEV 1> /dev/null 2>&1 rm -r $TMPDIR/root $TMPDIR/boot partprobe $SDCARD 1> /dev/null 2>&1 # For Khadas devices elif [[ "$DEVICE" = "vim3" ]]; then #clean up umount $TMPDIR/root umount $TMPDIR/boot losetup -d $LDEV 1> /dev/null 2>&1 rm -r $TMPDIR/root $TMPDIR/boot partprobe $SDCARD 1> /dev/null 2>&1 # For pinebook device elif [[ "$DEVICE" = "pinebook" ]] || [[ "$DEVICE" = "sopine" ]] || [[ "$DEVICE" = "pine64" ]]; then #flash bootloader dd if=$TMPDIR/root/boot/u-boot-sunxi-with-spl-$DEVICE.bin of=${SDCARD} bs=8k seek=1 1> /dev/null 2>&1 #clean up umount $TMPDIR/root rm -r $TMPDIR/root partprobe $SDCARD 1> /dev/null 2>&1 # For rockpro64 device elif [[ "$DEVICE" = "rock64" ]] || [[ "$DEVICE" = "rockpro64" ]] || [[ "$DEVICE" = "rockpi4" ]]; then #flash bootloader dd if=$TMPDIR/root/boot/idbloader.img of=${SDCARD} seek=64 conv=notrunc 1> /dev/null 2>&1 dd if=$TMPDIR/root/boot/uboot.img of=${SDCARD} seek=16384 conv=notrunc 1> /dev/null 2>&1 dd if=$TMPDIR/root/boot/trust.img of=${SDCARD} seek=24576 conv=notrunc 1> /dev/null 2>&1 #clean up umount $TMPDIR/root rm -r $TMPDIR/root partprobe $SDCARD 1> /dev/null 2>&1 fi } # Using Dialog to ask for user input for variables DEVICE=$(dialog --clear --title "Manjaro ARM Installer" \ --menu "Choose a device:" 20 75 10 \ "rpi4" "Rapsberry Pi 4" \ "pinebook" "Pinebook" \ "rock64" "ROCK64" \ "rockpro64" "ROCKPro64" \ "sopine" "SOPINE / PINE A64-LTS" \ "pine64" "Pine64+" \ "oc2" "Odroid C2" \ "on2" "Odroid N2" \ "vim3" "Khadas Vim 3" \ "rockpi4" "Rock Pi 4" \ "rpi3" "Raspberry Pi 3" \ 3>&1 1>&2 2>&3 3>&-) #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 EDITION=$(dialog --clear --title "Manjaro ARM Installer" \ --menu "Choose an edition:" 20 75 10 \ "minimal" "Minimal Edition (only CLI)" \ "kde" "Full KDE/Plasma Desktop (full featured)" \ "xfce" "Full XFCE desktop and apps (full featured)" \ "mate" "Full MATE desktop and apps (lightweight)" \ "lxqt" "Full LXQT Desktop and apps (lightweight)" \ "i3" "Mininal i3 WM with apps (very light)" \ "cubocore" "QT based Desktop (lightweight)" \ 3>&1 1>&2 2>&3 3>&-) else clear exit 1 fi if [ ! -z "$EDITION" ]; then USER=$(dialog --clear --title "Manjaro ARM Installer" \ --inputbox "Enter username: (usernames most be all lowercase)" 8 50 \ 3>&1 1>&2 2>&3 3>&-) if [[ "$USER" =~ [A-Z] ]] || [[ "$USER" == *['!'@#\$%^\&*()_+]* ]]; then clear msg "Configuration aborted! Username contained invalid characters." exit 1 fi else clear exit 1 fi if [ ! -z "$USER" ] then USERGROUPS=$(dialog --clear --title "Manjaro ARM Installer" \ --inputbox "Enter additional groups for $USER in a comma seperated list: (empty if none) (default groups: wheel,sys,storage,lp,network,users,power)" 8 50 \ 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [ ! -z "$USER" ] then FULLNAME=$(dialog --clear --title "Manjaro ARM Installer" \ --inputbox "Enter Full Name for $USER:" 8 50 \ 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [ ! -z "$FULLNAME" ]; then PASSWORD=$(dialog --clear --title "Manjaro ARM Installer" \ --insecure --passwordbox "Enter Password for $USER:" 8 50 \ 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [ ! -z "$PASSWORD" ]; then CONFIRMPASSWORD=$(dialog --clear --title "Manjaro ARM Installer" \ --insecure --passwordbox "Confirm Password for $USER:" 8 50 \ 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [[ "$PASSWORD" != "$CONFIRMPASSWORD" ]]; then clear msg "User passwords do not match! Please restart the installer and try again." exit 1 fi if [ ! -z "$CONFIRMPASSWORD" ]; then ROOTPASSWORD=$(dialog --clear --title "Manjaro ARM Installer" \ --insecure --passwordbox "Enter Root Password:" 8 50 \ 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [ ! -z "$ROOTPASSWORD" ]; then CONFIRMROOTPASSWORD=$(dialog --clear --title "Manjaro ARM Installer" \ --insecure --passwordbox "Confirm Root Password:" 8 50 \ 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [[ "$ROOTPASSWORD" != "$CONFIRMROOTPASSWORD" ]]; then clear msg "Root passwords do not match! Please restart the installer and try again." exit 1 fi if [ ! -z "$CONFIRMROOTPASSWORD" ] 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 "") done < <( lsblk -dn -o NAME ) SDCARD=$(dialog --title "Manjaro ARM Installer" \ --menu "Choose your SDCard - Be sure the correct drive is selected!" 20 50 10 \ "${W[@]}" 3>&2 2>&1 1>&3) # add /dev/ to the selected option above DEV_NAME=$SDCARD SDCARD=/dev/$SDCARD SDTYP=${SDCARD:5:2} else clear exit 1 fi if [[ "$SDTYP" = "sd" ]]; then SDDEV="" elif [[ "$SDTYP" = "mm" ]]; then SDDEV="p" else clear exit 1 fi 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 "Choose your timezone!" 20 50 15 \ "${W[@]}" 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi 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 "Choose your locale!" 20 50 15 \ "${W[@]}" 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [ ! -z "$LOCALE" ]; then let i=0 W=() while read -r line; do let i=$i+1 W+=($line "") done < <( localectl list-keymaps ) KEYMAP=$(dialog --clear --title "Manjaro ARM Installer" \ --menu "Choose your keyboard layout:" 20 50 15 \ "${W[@]}" 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [ ! -z "$KEYMAP" ]; then HOSTNAME=$(dialog --clear --title "Manjaro ARM Installer" \ --inputbox "Enter desired hostname for this system:" 8 50 \ 3>&1 1>&2 2>&3 3>&- \ ) else clear exit 1 fi if [ ! -z "$HOSTNAME" ]; then dialog --clear --title "Manjaro ARM Installer" \ --yesno "Is the below information correct: Username = $USER Additional usergroups = $USERGROUPS Password for $USER = $PASSWORD Password for root = $ROOTPASSWORD SD Card = $SDCARD Timezone = $TIMEZONE Locale = $LOCALE Keyboard layout = $KEYMAP Hostname = $HOSTNAME" 20 70 \ 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 # get the profiles getarmprofiles #Package lists 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}') # Commands timer_start=$(get_timer) prepare_card create_install cleanup show_elapsed_time "${FUNCNAME}" "${timer_start}" sync