#!/bin/bash -eu REPO=${REPO:-cimryan} BRANCH=${BRANCH:-master} HEADLESS_SETUP=${HEADLESS_SETUP:-false} USE_LED_FOR_SETUP_PROGRESS=true CONFIGURE_ARCHIVING=${CONFIGURE_ARCHIVING:-true} UPGRADE_PACKAGES=${UPGRADE_PACKAGES:-true} export campercent=${campercent:-90} function setup_progress () { local setup_logfile=/boot/teslausb-headless-setup.log if [ $HEADLESS_SETUP = "true" ] then echo "$( date ) : $1" >> "$setup_logfile" fi echo $1 } if ! [ $(id -u) = 0 ] then setup_progress "STOP: Run sudo -i." exit 1 fi function headless_setup_populate_variables () { # Pull in the conf file variables to make avail to this script and subscripts if [ -e /boot/teslausb_setup_variables.conf ] && [ $HEADLESS_SETUP = "true" ] then source /boot/teslausb_setup_variables.conf fi } function headless_setup_mark_setup_failed () { if [ $HEADLESS_SETUP = "true" ] then setup_progress "ERROR: Setup Failed." touch /boot/TESLAUSB_SETUP_FAILED fi } function headless_setup_mark_setup_success () { if [ $HEADLESS_SETUP = "true" ] then if [ -e /boot/TESLAUSB_SETUP_FAILED ] then rm /boot/TESLAUSB_SETUP_FAILED fi rm /boot/TESLAUSB_SETUP_STARTED touch /boot/TESLAUSB_SETUP_FINISHED # This sed shouldn't be needed, but double checking just to be sure. sed -i'.bak' -e "s/TEMPARCHIVESERVER/$archiveserver/g" /etc/rc.local setup_progress "Main setup completed. Remounting file systems read only." fi } function headless_setup_progress_flash () { if [ $USE_LED_FOR_SETUP_PROGRESS = "true" ] && [ $HEADLESS_SETUP = "true" ] then /etc/stage_flash $1 fi } function setup_led_off () { if [ $USE_LED_FOR_SETUP_PROGRESS = "true" ] && [ $HEADLESS_SETUP = "true" ] then echo "none" | sudo tee /sys/class/leds/led0/trigger > /dev/null echo 1 | sudo tee /sys/class/leds/led0/brightness > /dev/null fi } function setup_led_on () { if [ $USE_LED_FOR_SETUP_PROGRESS = "true" ] && [ $HEADLESS_SETUP = "true" ] then echo 0 | sudo tee /sys/class/leds/led0/brightness > /dev/null fi } function check_variable () { local var_name="$1" if [ -z "${!var_name+x}" ] then setup_progress "STOP: Define the variable $var_name like this: export $var_name=value" exit 1 fi } function check_available_space () { setup_progress "Verifying that there is sufficient space available on the MicroSD card..." local available_space="$( parted -m /dev/mmcblk0 u b print free | tail -1 | cut -d ":" -f 4 | sed 's/B//g' )" if [ "$available_space" -lt 4294967296 ] then setup_progress "STOP: The MicroSD card is too small." exit 1 fi setup_progress "There is sufficient space available." } function verify_configuration () { get_script /tmp verify-configuration.sh setup/pi /tmp/verify-configuration.sh } function get_script () { local local_path="$1" local name="$2" local remote_path="${3:-}" curl --fail -o "$local_path/$name" https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/"$remote_path"/"$name" # wget -O "$local_path/$name" https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/"$remote_path"/"$name" chmod +x "$local_path/$name" setup_progress "Downloaded $local_path/$name ..." } function get_ancillary_setup_scripts () { get_script /tmp create-backingfiles-partition.sh setup/pi get_script /tmp create-backingfiles.sh setup/pi get_script /tmp make-root-fs-readonly.sh setup/pi get_script /root configure.sh setup/pi } function fix_cmdline_txt_modules_load () { setup_progress "Fixing the modules-load parameter in /boot/cmdline.txt..." cp /boot/cmdline.txt ~ cat ~/cmdline.txt | sed 's/ modules-load=dwc2,g_ether/ modules-load=dwc2/' > /boot/cmdline.txt rm ~/cmdline.txt setup_progress "Fixed cmdline.txt." } BACKINGFILES_MOUNTPOINT=/backingfiles MUTABLE_MOUNTPOINT=/mutable function create_usb_drive_backing_files () { if [ ! -e "$BACKINGFILES_MOUNTPOINT" ] then mkdir "$BACKINGFILES_MOUNTPOINT" fi if [ ! -e "$MUTABLE_MOUNTPOINT" ] then mkdir "$MUTABLE_MOUNTPOINT" fi if [ ! -e /dev/mmcblk0p3 ] then setup_progress "Starting to create backing files partition..." /tmp/create-backingfiles-partition.sh "$BACKINGFILES_MOUNTPOINT" "$MUTABLE_MOUNTPOINT" fi if ! findmnt --mountpoint $BACKINGFILES_MOUNTPOINT then setup_progress "Mounting the partition for the backing files..." mount $BACKINGFILES_MOUNTPOINT setup_progress "Mounted the partition for the backing files." fi if [ ! -e $BACKINGFILES_MOUNTPOINT/*.bin ] then setup_progress "Creating backing disk files." /tmp/create-backingfiles.sh "$campercent" "$BACKINGFILES_MOUNTPOINT" fi } function configure_hostname () { # Headless image already has hostname set if [ ! $HEADLESS_SETUP = "true" ] then setup_progress "Configuring the hostname..." local new_host_name="teslausb" cp /etc/hosts ~ sed "s/raspberrypi/$new_host_name/g" ~/hosts > /etc/hosts rm ~/hosts cp /etc/hostname ~ sed "s/raspberrypi/$new_host_name/g" ~/hostname > /etc/hostname setup_progress "Configured the hostname." rm ~/hostname fi } function make_root_fs_readonly () { /tmp/make-root-fs-readonly.sh } function update_package_index () { setup_progress "Updating package index files..." apt-get update } function upgrade_packages () { if [ "$UPGRADE_PACKAGES" = true ] then setup_progress "Upgrading installed packages..." apt-get --assume-yes upgrade else setup_progress "Skipping package upgrade." fi } export -f setup_progress export HEADLESS_SETUP update_package_index headless_setup_populate_variables # If USE_LED_FOR_SETUP_PROGRESS = true. setup_led_off # Flash for stage 2 headless (verify requested configuration) headless_setup_progress_flash 1 setup_progress "Verifying that the requested configuration is valid..." verify_configuration # Flash for Stage 3 headless (grab scripts) headless_setup_progress_flash 2 setup_progress "Downloading additional setup scripts." get_ancillary_setup_scripts pushd ~ fix_cmdline_txt_modules_load echo "" >> /etc/fstab # Flash for stage 4 headless (Create backing files) headless_setup_progress_flash 3 create_usb_drive_backing_files configure_hostname # Flash for stage 5 headless (Mark success, FS readonly) headless_setup_progress_flash 4 headless_setup_mark_setup_success if [ "$CONFIGURE_ARCHIVING" = true ] then /root/configure.sh fi make_root_fs_readonly upgrade_packages # If USE_LED_FOR_SETUP_PROGRESS = true. setup_led_on setup_progress "All done."