Files
teslausb/headless-scripts/setup-teslausb-headless
Richard Goodwin 1335be2a1c Change branch for testing
Also in prev commit always download pushover script as it doesn't hurt (user can set it up later) and removes some conditional logic.
2018-10-21 11:05:35 -05:00

283 lines
7.9 KiB
Bash

#!/bin/bash -eu
REPO=rtgoodwin
BRANCH="headless-patch"
user_enabled_pushover=false
LOGFILE=/boot/teslausb-headless-setup.log
setup_complete=false
# if ! [ $(id -u) = 0 ]
# then
# echo "STOP: Run sudo -i."
# exit 1
# fi
function setup_log () {
echo "$( date ) : $1" >> "$LOGFILE"
}
if [ ! -e /boot/TESLAUSB_SETUP_FINISHED ]
then
setup_log "Setting up teslausb functionality"
touch /boot/TESLAUSB_SETUP_STARTED
fi
function mark_setup_failed () {
setup_log "ERROR: Setup Failed."
touch /boot/TESLAUSB_SETUP_FAILED
}
function mark_setup_success () {
if [ -e /boot/TESLAUSB_SETUP_FAILED ]
then
rm /boot/TESLAUSB_SETUP_FAILED
fi
rm /boot/TESLAUSB_SETUP_STARTED
touch /boot/TESLAUSB_SETUP_FINISHED
setup_log "Main setup completed. Remounting file systems read only."
}
function check_variable () {
local var_name="$1"
if [ -z "${!var_name+x}" ]
then
echo "STOP: Define the variable $var_name like this: export $var_name=value"
setup_log "SETUP FAILED: Define the variable $var_name as export $var_name=value in /boot/teslausb_setup_variables.conf"
/tmp/stage_flash 10 &>/dev/null
exit 1
fi
}
function check_pushover_enabled () {
if [ ! -z "${pushover_enabled+x}" ]
then
setup_log "Adding Pushover variables into /root/.teslaCamPushoverCredentials"
echo "export pushover_enabled=true" > /root/.teslaCamPushoverCredentials
echo "export pushover_user_key=$pushover_user_key" >> /root/.teslaCamPushoverCredentials
echo "export pushover_app_key=$pushover_app_key" >> /root/.teslaCamPushoverCredentials
fi
}
function check_archive_server_reachable () {
setup_log "Verifying that the archive server $archiveserver is reachable..."
local serverunreachable=false
ping -c 1 -w 1 "$archiveserver" 1>/dev/null 2>&1 || serverunreachable=true
if [ "$serverunreachable" = true ]
then
setup_log "WARNING: The archive server $archiveserver is unreachable. Try specifying its IP address instead."
setup_log "Continuing setup, but you may need to edit /etc/fstab to verify your archive mount entry is correct"
fi
# echo "The archive server is reachable."
}
function check_available_space () {
setup_log "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_log "ERROR: The MicroSD card is too small. Stopping setup."
/tmp/stage_flash 10 &>/dev/null
exit 1
fi
setup_log "There is sufficient space available."
}
# function get_ancillary_setup_scripts () {
# pushd /tmp
# wget https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/windows_archive/create-backingfiles-partition.sh
# chmod +x ./create-backingfiles-partition.sh
# wget https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/windows_archive/create-backingfiles.sh
# chmod +x ./create-backingfiles.sh
# wget https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/windows_archive/make-root-fs-readonly.sh
# chmod +x ./make-root-fs-readonly.sh
# popd
# }
function fix_cmdline_txt_modules_load ()
{
setup_log "Fixing the modules-load parameter in /boot/cmdline.txt..."
cp /boot/cmdline.txt ~
cat ~/cmdline.txt | sed 's/[[:space:]]\+modules-load=[^ [:space:]]\+//' | sed 's/rootwait/rootwait modules-load=dwc2/' > /boot/cmdline.txt
rm ~/cmdline.txt
setup_log "Fixed cmdline.txt."
}
BACKINGFILES_MOUNTPOINT=/backingfiles
function create_usb_drive_backing_files () {
mkdir "$BACKINGFILES_MOUNTPOINT"
/tmp/create-backingfiles-partition.sh "$BACKINGFILES_MOUNTPOINT"
setup_log "Mounting the partition for the backing files..."
mount /backingfiles
setup_log "Mounted the partition for the backing files."
/tmp/create-backingfiles.sh "$campercent" "$BACKINGFILES_MOUNTPOINT"
}
function configure_archive () {
setup_log "Configuring the archive..."
mkdir /mnt/archive
local archive_server_ip_address="$(ping -c 1 -w 1 $archiveserver 2>/dev/null | head -n 1 | grep -o -e "(\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\})" | tr -d '()')"
echo "//$archive_server_ip_address/$sharename /mnt/archive cifs vers=3,credentials=/root/.teslaCamArchiveCredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0" >> /etc/fstab
echo "username=$shareuser" > /root/.teslaCamArchiveCredentials
echo "password=$sharepassword" >> /root/.teslaCamArchiveCredentials
setup_log "Configured the archive."
}
# function configure_archive_scripts () {
# echo "Configuring the archive scripts..."
# mkdir /root/bin
# pushd ~
# wget https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/windows_archive/archiveloop
# sed s/ARCHIVE_HOST_NAME=archiveserver/ARCHIVE_HOST_NAME=$archiveserver/ ~/archiveloop > /root/bin/archiveloop
# rm ~/archiveloop
# chmod +x /root/bin/archiveloop
# popd
# pushd /root/bin
# wget https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/windows_archive/archive-teslacam-clips
# chmod +x archive-teslacam-clips
# popd
# echo "Configured the archive scripts."
# pushd /root
# wget https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/windows_archive/remountfs_rw
# chmod +x remountfs_rw
# popd
# echo "Downloaded script to remount filesystems read/write if needed (/root/remountfs_rw)."
# }
# function configure_pushover_scripts() {
# if [ ${user_enabled_pushover} = "true" ]
# then
# pushd /root/bin
# wget https://raw.githubusercontent.com/"$REPO"/teslausb/"$BRANCH"/windows_archive/send-pushover
# chmod +x send-pushover
# popd
# fi
# }
function configure_rc_local () {
setup_log "Configuring /etc/rc.local to run the archive scripts at startup..."
echo "#!/bin/bash -eu" > ~/rc.local
tail -n +2 /etc/rc.local | sed '$d' >> ~/rc.local
cat << 'EOF' >> ~/rc.local
LOGFILE=/tmp/rc.local.log
function log () {
echo "$( date )" >> "$LOGFILE"
echo "$1" >> "$LOGFILE"
}
log "Launching archival script..."
/root/bin/archiveloop &
log "All done"
exit 0
EOF
cat ~/rc.local > /etc/rc.local
rm ~/rc.local
setup_log "Configured rc.local."
}
function configure_hostname () {
setup_log "Configuring the hostname..."
local new_host_name="teslausb"
cp /etc/hosts ~
sed "s/raspberrypi/$new_host_name/g" ~/hosts > /etc/hosts
cp /etc/hostname ~
sed "s/raspberrypi/$new_host_name/g" ~/hostname > /etc/hostname
setup_log "Configured the hostname."
}
function make_root_fs_readonly () {
/tmp/make-root-fs-readonly.sh
}
# TURN OFF LED so we can start watching progress
echo 1 | sudo tee /sys/class/leds/led0/brightness
sleep 5
# SETUP STAGE 1 - Check variables file
/tmp/stage_flash 1 &>/dev/null
setup_log "SETUP STAGE 1: Check variables file."
if [ ! -e /boot/teslausb_setup_variables.conf ]
then
setup_log "ERROR: teslausb_setup_variables.conf file not found. Can't continue setup."
/tmp/stage_flash 10 &>/dev/null
exit 1
fi
source /boot/teslausb_setup_variables.conf
# SETUP STAGE 2 - Validate variables. This should never fail but just in case.
/tmp/stage_flash 2 &>/dev/null
setup_log "SETUP STAGE 2: Verifying environment variables..."
check_variable "archiveserver"
check_variable "sharename"
check_variable "shareuser"
check_variable "sharepassword"
check_variable "campercent"
check_pushover_enabled
check_archive_server_reachable
# SETUP STAGE 3
setup_log "SETUP STAGE 3: Check available space."
/tmp/stage_flash 3 &>/dev/null
check_available_space
# get_ancillary_setup_scripts
# pushd ~
# configure_archive_scripts
# configure_pushover_scripts
fix_cmdline_txt_modules_load
echo "" >> /etc/fstab
# SETUP STAGE 4
setup_log "SETUP STAGE 4: Create backing files and final config changes."
/tmp/stage_flash 4 &>/dev/null
create_usb_drive_backing_files
configure_archive
configure_rc_local
configure_hostname
# SETUP STAGE 5 and reboot
# If you see 5 flashes we are probably good!
/tmp/stage_flash 5 &>/dev/null
mark_setup_success
make_root_fs_readonly
setup_log "Filesystems made read-only. Rebooting."
reboot