From e08e34c558ceffd0e4b54e1b5296d6b287ce9111 Mon Sep 17 00:00:00 2001 From: Richard Goodwin Date: Sat, 20 Oct 2018 18:25:30 -0500 Subject: [PATCH] More logging and automation --- headless-scripts/Readme.md | 41 +++++++++++++ headless-scripts/setup-piForHeadlessBuild.sh | 7 +-- headless-scripts/setup-teslausb-headless | 60 ++++++++++++++++---- 3 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 headless-scripts/Readme.md diff --git a/headless-scripts/Readme.md b/headless-scripts/Readme.md new file mode 100644 index 0000000..dd80bc8 --- /dev/null +++ b/headless-scripts/Readme.md @@ -0,0 +1,41 @@ +# Flashable image to get started more quick + +# This is a WORK IN PROGRESS, NOT CURRENTLY WORKING. + +For now the image creation work is at [rtgoodwin's fork of pi-gen](https://github.com/rtgoodwin/pi-gen) in (whatever current branch I'm working at the time). +* Assumes your Pi comes up on Wifi, with internet access. (But so does most of this guide.) USB networking still enabled for troubleshooting. +* At this point, I'm designing it to pull the setup scripts dynamically, since development is still ongoing. If/when we reach a good frozen state, we can generate an image that is ready to run. I think it'll also be pretty tricky to do some of the remounting and creating the backing files etc. on the image creation side. Open to suggestions/contributions there though! + + + +1. Flash the image +1. Mount the card again, and in the `boot` directory create a `teslausb_setup_variables.conf` file to export the same environment varibles normally needed for setup (including archive, wifi, and push notifications if desired.) +1. Run the `setup-piForHeadlessBuild.sh` (note: **not** `setup-piForHeadlessSetup.sh`) +1. If all goes well, put card into Pi and boot. + +* A `/boot/teslausb-headless-setup.log` file will be created and stages logged. This takes the place of the "STOP" commands +* Marker files will be created in `boot` like `TESLA_USB_SETUP_STARTED` and `TESLA_USB_SETUP_FINISHED` to track progress. May use a progress system so the script can pick back up if needed. (This is probably useful for the general/old way of setup too.) + + + +#### Modifications to pi-gen builder from master + +Built image on a Raspi running Stretch, for maximum Pi-ception. + +1. Add SKIP and SKIP_IMAGES files to stage3, 4, and 5 (if present). +1. Add a stage6. (There are stages0-5, but may be a stage5 in some cases. This will help keep a clean merge later.) +1. Copy the prerun.sh from `stage2`. Be SURE to mark `chmod +x` it. +1. Remove or rename the EXPORT_NOOBS files in all stages. We don't need a NOOBS image built. +1. In `stage6`, create a `00-tweaks` folder, with a `00-patches` folder and patch inside to patch `cmdline.txt` to remove the resize and add the needed modules. The build process uses `quilt` for patching. Note: the path for any patching you do at this stage is `stage6/rootfs/FILEPATH` where `rootfs` represents the Pi's `/`. So, `cmdline.txt` is `stage6/rootfs/boot/cmdline.txt`. +1. Add a patch for the `config.txt` file. +1. Add a file called `series` in the patches directory with the name of each `.diff` file in the order you want them applied. +1. Add a `files` folder in stage6 with modified `rc.local`. The modified `rc.local` will handle pulling down the `setup-teslausb-headless` file the first time. (Still working on build logic here.) Files are moved into final locations in a `00-run.sh` script and the `install` command. See the script for details. +1. (Yes at this point you could suggest that just putting the end state files in place instead of patching would be good, but why not be idiomatic? :) ) +1. Run `sudo ./build.sh` from the `pi-gen` directory. +1. If you get a failure, it's almost certainly after stage2, so you can add SKIP files in stage2-stage5 present) and rerun `sudo CLEAN=1 ./build.sh` + +### Image creation TODOs +1. TODO: Patch the hostname to teslausb +1. TODO: I still see some errors during pi-gen about locale, may need to be fixed? stage0/01-locale/debconf en_US.UTF-8 +1. Aspirational TODO: Remove more packages etc to make the boot process faster? OR start from `stage1` if we don't need all of `stage2` + diff --git a/headless-scripts/setup-piForHeadlessBuild.sh b/headless-scripts/setup-piForHeadlessBuild.sh index 2b5491a..20d03d6 100755 --- a/headless-scripts/setup-piForHeadlessBuild.sh +++ b/headless-scripts/setup-piForHeadlessBuild.sh @@ -128,7 +128,7 @@ CONFIG_TXT_PATH="$BOOT_DIR/config.txt" if ! grep -q "dtoverlay=dwc2" $CONFIG_TXT_PATH then - echo "Updating $CONFIG_TXT_PATH ..." + good_message "Updating $CONFIG_TXT_PATH ..." echo "" >> "$CONFIG_TXT_PATH" echo "dtoverlay=dwc2" >> "$CONFIG_TXT_PATH" else @@ -149,7 +149,7 @@ then touch "$BOOT_DIR/ssh" fi -# Sets up wifi credentials so wifi will be +# Sets up wifi credentials so wifi will be # auto configured on first boot WPA_SUPPLICANT_CONF_PATH="$BOOT_DIR/wpa_supplicant.conf" @@ -174,7 +174,6 @@ EOF echo "" good_message '-- Files updated and ready for headless setup --' echo '' -good_message '-- You can now insert your SD card into the Pi for headless setup' -echo '' +echo 'You can now insert your SD card into the Pi for headless setup. Plug in power to the Pi and it will boot and run.' echo "When done (this may take a vew minutes), the Pi should be available over SSH as pi@teslausb.local" echo "" diff --git a/headless-scripts/setup-teslausb-headless b/headless-scripts/setup-teslausb-headless index 23eefcd..4cc855b 100644 --- a/headless-scripts/setup-teslausb-headless +++ b/headless-scripts/setup-teslausb-headless @@ -1,9 +1,9 @@ #!/bin/bash -eu -REPO=rtgoodwin -BRANCH="headless-patch" +REPO=cimryan +BRANCH=master user_enabled_pushover=false -LOGFIlE=/boot/teslausb-headless-setup.log +LOGFILE=/boot/teslausb-headless-setup.log setup_complete=false # if ! [ $(id -u) = 0 ] @@ -13,19 +13,28 @@ setup_complete=false # fi function setup_log () { - echo "$( date )" >> "$LOGFILE" - echo "$1" >> "$LOGFILE" + echo "$( date ) : $1" >> "$LOGFILE" } -if [ ! -e /boot/TESLAUSB_SETUP_FINISHED ] +if [ ! -e /boot/TESLAUSB_SETUP_FINISHED ] then setup_log "Setting up teslausb functionality" - touch /boot/TESLA_USB_SETUP_STARTED + 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 + rm /boot/TESLAUSB_SETUP_STARTED + fi + touch /boot/TESLAUSB_SETUP_FINISHED + setup_log "Setup completed. Remounting file systems read only (may cause a reboot)." } function check_variable () { @@ -38,8 +47,29 @@ function check_variable () { fi } - - +function check_pushover_enabled () { + if [ ! -z "${pushover_enabled+x}" ] + then + if [ ! -n "${pushover_user_key+x}" ] || [ ! -n "${pushover_app_key+x}" ] + then + setup_log "ERROR: " + echo "STOP: You're trying to setup Pushover but didn't provide your User and/or App key." + echo "Define the variables like this:" + echo "export pushover_user_key=put_your_userkey_here" + echo "export pushover_app_key=put_your_appkey_here" + exit 1 + elif [ "${pushover_user_key}" = "put_your_userkey_here" ] || [ "${pushover_app_key}" = "put_your_appkey_here" ] + then + echo "STOP: You're trying to setup Pushover, but didn't replace the default User and App key values." + exit 1 + else + user_enabled_pushover=true + 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 + fi +} function check_archive_server_reachable () { echo "Verifying that the archive server $archiveserver is reachable..." @@ -187,6 +217,14 @@ function make_root_fs_readonly () { /tmp/make-root-fs-readonly.sh } +if [ ! -e /boot/teslausb_setup_variables.conf ] +then + setup_log "ERROR: teslausb_setup_variables.conf file not found. Can't continue setup." + exit 1 +fi + +source /boot/teslausb_setup_variables.conf + echo "Verifying environment variables..." check_variable "archiveserver" @@ -221,6 +259,8 @@ configure_rc_local configure_hostname +mark_setup_success + make_root_fs_readonly echo "All done."