diff --git a/arcroft/build-arcroft.sh b/arcroft/build-arcroft.sh new file mode 100755 index 0000000..8990574 --- /dev/null +++ b/arcroft/build-arcroft.sh @@ -0,0 +1,179 @@ +#! /bin/bash +# +# Copyright 2020, Stormux, +# +# This is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free +# Software Foundation; either version 3, or (at your option) any later +# version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this package; see the file COPYING. If not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# + +# keep track of mounted status for exit function +mounted=1 + +set -e # Don't want to destroy stuff if this goes majorly wrong. +trap cleanup EXIT # make sure the script cleans up after itself before closing. + + +cleanup() { + if [[ $mounted -eq 0 ]]; then + umount -R /mnt + partx -d "${loopdev}" + losetup --detach "${loopdev}" + fi + exit 0 +} + +help() { + echo -e "Usage:\n" + echo "With no arguments, build with default parameters." + for i in "${!command[@]}" ; do + echo "-${i/:/ }: ${command[${i}]}" + done | sort + exit 0 +} + +# Array of command line arguments +declare -A command=( + [h]="This help screen." + [l:]="Language default is en_US." + [s:]="image size in GB, default is 4." + [v:]="Version of the Raspberry Pi for which you are building. (3|4 default)" +) + +# Convert the keys of the associative array to a format usable by getopts +args="${!command[*]}" +args="${args//[[:space:]]/}" +while getopts "${args}" i ; do + case "$i" in + h) help;; + l) + imageLanguage="${OPTARG}.UTF-8" + ;; + s) + if [[ "${OPTARG}" =~ ^[[:digit:]]+$ ]]; then + imageSize="${OPTARG}G" + else + echo "Image size must be numeric." + exit 1 + fi + ;; + v) + if [[ "${OPTARG}" =~ ^[34]$ ]]; then + imageVersion="${OPTARG}" + else + echo "Image version must be 3 for the Raspberry Pi 3, or 4 for the Raspberry Pi 4 (default)." + exit 1 + fi + ;; + *) + exit 1 + ;; + esac +done + +# make sure variables are set, or use defaults. +export imageVersion="${imageVersion:-4}" +export imageSize="${imageSize:-4G}" +export imageName="arcroft.img" +export imageLanguage="${imageLanguage:-en_US.UTF-8}" + +# Make sure the image file doesn't exist. +if [[ -e "$imageName" ]]; then + echo "${imageName} exists, please remove or move it for this script to continue." + exit 1 +fi + +# Make sure this script is ran as root. +if [ "$(whoami)" != "root" ] ; then + echo "Error: This script must be run as root." + exit 1 +fi + +# make sure the needed tools are installed +if [[ "$(uname -m)" == "x86_64" ]]; then + if ! pacman -Q qemu-user-static &> /dev/null ; then + echo "Please install pacman -Q qemu-user-static before continuing." + exit 1 + fi +fi +for i in parted wget ; do + if ! pacman -Q $i &> /dev/null ; then + echo "Please install $i before continuing." + exit 1 + fi +done + + +# Url for the image to be downloaded. +#url[3]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz" +url[3]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz" +#url[4]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz" +url[4]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-4-latest.tar.gz" + +fallocate -l "$imageSize" "$imageName" +loopdev="$(losetup --find --show "${imageName}")" +parted --script "${loopdev}" mklabel msdos mkpart primary fat32 0% 100M mkpart primary ext4 100M 100% +mkfs.vfat -F32 "${loopdev}p1" +mkfs.ext4 -F "${loopdev}p2" +mount "${loopdev}p2" /mnt +mkdir /mnt/boot +mount "${loopdev}p1" /mnt/boot +# Things are mounted now, so set mounted to 0 (bash true) +mounted=0 +wget "${url[$imageVersion]}" -O- | bsdtar -xpf - -C /mnt +arch-chroot /mnt << EOF +# set up pacman +pacman-key --init +pacman-key --populate archlinuxarm +pacman -Syu --needed --noconfirm base base-devel bash-completion espeak git +# set the language +sed -i "s/#$imageLanguage/$imageLanguage/" /etc/locale.gen +echo "LANG=$imageLanguage" > /etc/locale.conf +locale-gen +# Set the distribution name. +echo 'Arcroft \r (\l)' > /etc/issue +echo >> /etc/issue +# Change the alarm user to be mycroft +usermod -a -g users -G wheel,audio,video -m -d /home/mycroft -l mycroft alarm +# Grant sudo privileges to the mycroft user for package installation. +echo 'mycroft ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/wheel +# Set the password for the root user +echo -e "root\nroot" | passwd "root" +# Set the password for the stormux user +echo -e "mycroft\nmycroft" | passwd "mycroft" +# Change to the mycroft user and install some packages +sudo su - mycroft +git clone https://aur.archlinux.org/yay.git +cd yay +makepkg -si --noconfirm +cd ~ +rm -rf yay +yay -S --noconfirm magic-wormhole +exit +# Configure sudo for group wheel, remove nopasswd for the mycroft user +sed '/mycroft/d' /etc/sudoers.d/wheel +sed 's/^# %wheel ALL=(ALL) ALL$/%wheel ALL=(ALL) ALL/' /etc/sudoers.d/wheel +# Set the hostname +echo mycroft > /etc/hostname +# Enable services +#systemctl enable +# Update fstab for Raspberry Pi 4. +#[[ $imageVersion -eq 4 ]] && sed -i 's/mmcblk0/mmcblk1/g' /etc/fstab +EOF + +# Copy override files into place. +cp -rv ../files/etc/* /mnt/etc + +# Exiting calls the cleanup function to unmount. +exit 0