From e41b15452941bc4b66c4aed21b4c158bde758e7c Mon Sep 17 00:00:00 2001 From: cimryan Date: Wed, 10 Oct 2018 06:30:50 -0700 Subject: [PATCH 01/28] Relocate and reformat notes. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a66fd21..1ee2937 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ Required: * A Micro SD card, at least 8 GB in size, and an adapter (if necessary) to connect the card to your computer. * A USB A/Micro B cable: [Adafruit](https://www.adafruit.com/product/898) or [Amazon](https://www.amazon.com/gp/product/B013G4EAEI/) + > Note: Of the many varieties of Raspberry Pi only the Raspberry Pi Zero and Raspberry Pi Zero W can be used as simulated USB drives. It may be possible to use a Pi Zero with a USB Wifi adapter to achieve the same result as the Pi Zero W, but this hasn't been confirmed. + Recommended: These will allow you to set up the Raspberry Pi without following the steps for a "headless" setup, which are a little more complicated. * Mini HDMI to HDMI cable [Adafruit](https://www.adafruit.com/product/2775) or [Amazon](https://www.amazon.com/AmazonBasics-High-Speed-Mini-HDMI-HDMI-Cable/dp/B014I8UEGY) * A USB keyboard. @@ -48,8 +50,6 @@ Optional: * A case. Don't want unprotected circuits hanging about! Official case at [Adafruit](https://www.adafruit.com/product/2885) or [Amazon](https://www.amazon.com/gp/product/B06Y593MHV). There are many others to choose from. Note that the official case won't work with the USB A Add on board. * USB Splitter if you don't want to lose a front USB port. [The Onvian Splitter](https://www.amazon.com/gp/product/B01KX4TKH6) has been reported working by multiple people on reddit. -> Note: Of the many varieties of Raspberry Pi only the Raspberry Pi Zero and Raspberry Pi Zero W can be used as simulated USB drives. It may be possible to use a Pi Zero with a USB Wifi adapter to achieve the same result as the Pi Zero W, but this hasn't been confirmed. - ### Software Download [Raspbian Stretch Lite](https://www.raspberrypi.org/downloads/raspbian/) * Note: Bittorrent is dramatically faster than direct download. @@ -77,7 +77,7 @@ There are four phases to setting up the Pi: [These instructions](https://www.raspberrypi.org/documentation/installation/installing-images/README.md) tell you how to get Raspbian onto your MicroSD card. Basically: 1. Connect your SD card to your computer. 2. Use Etcher to write the zip file you downloaded to the SD card. Etcher works well and is multi-platform. -> Note: you don't need to uncompress the zip file you downloaded. + > Note: you don't need to uncompress the zip file you downloaded. 3. Plug the micro sd card into the Pi. ### Get a shell on the Pi From 1de5a9fa1fec695b4ded82d01bba047a8d5b7cab Mon Sep 17 00:00:00 2001 From: cimryan Date: Thu, 11 Oct 2018 00:28:18 -0700 Subject: [PATCH 02/28] Automate the setup and split out the steps for headless setup into separate documents. --- GetShellWithoutMonitorOnWindows.md | 31 +++++ GetShellWitoutMonitorOnLinux.md | 8 ++ README.md | 180 ++++------------------------- windows_archive/setup-teslausb | 91 +++++++++++++++ 4 files changed, 153 insertions(+), 157 deletions(-) create mode 100644 GetShellWithoutMonitorOnWindows.md create mode 100644 GetShellWitoutMonitorOnLinux.md create mode 100644 windows_archive/setup-teslausb diff --git a/GetShellWithoutMonitorOnWindows.md b/GetShellWithoutMonitorOnWindows.md new file mode 100644 index 0000000..314f902 --- /dev/null +++ b/GetShellWithoutMonitorOnWindows.md @@ -0,0 +1,31 @@ +# Seting up the Pi without a monitor using Windows +1. Download and install: + * [Notepad++](https://notepad-plus-plus.org/) Alternatively, any other text editor which is capable of editing files with Unix-style line endings. + * [Putty]( https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) Note: You can paste into Putty by right-clicking. No matter where you right-click, the content will be inserted at the position of the cursor, as if you had typed it in. +1. Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) The instructions from the video are recreated below, with some changes. +1. Open the config.txt file on the sd card with Notepad++ +1. Add this line to the end of the file + ``` + dtoverlay=dwc2 + ``` +1. Add a blank line to the end of the file. +1. Open cmdline.txt with Notepad++ +1. Find the word "rootwait", add this text, separated by spaces, between rootwait and the word following it: + ``` + modules-load=dwc2,g_ether + ``` +1. Create a file named ssh (with no extension) at the root +1. Eject the sd card +1. Move the sd card to the Pi. +1. Connect a micro usb cable to the port labeled "USB" on the Raspberry Pi, and to the PC. +1. On the PC, press your Windows key, type Control Panel. +1. Open "Network and Sharing Center" +1. Click "Change adapter settings" +1. Wait for something labeled "USB Ethernet/RNDIS Gadget" to appear. +1. Launch Putty +1. In the Host Name box enter + ``` + pi@raspberrypi.local + ``` +1. If you get an "unknown host" error message install Bonjour: https://support.apple.com/kb/DL999 and go back to step 17. +1. Password is raspberry diff --git a/GetShellWitoutMonitorOnLinux.md b/GetShellWitoutMonitorOnLinux.md new file mode 100644 index 0000000..faefa01 --- /dev/null +++ b/GetShellWitoutMonitorOnLinux.md @@ -0,0 +1,8 @@ +# Seting up the Pi without a monitor using a Mac or Linux +Basically what you're doing is using the Pi's capability to emulate a network connection over USB. So you need to get the Pi (the guest) set up to load the proper modules to do so, and then connect from your machine (the host) using a shell (like iTerm+SSH on macOS). + +Here are a few ways to accomplish this +* [Gist (text file) showing example steps and discussion thread about issues, etc](https://gist.github.com/gbaman/975e2db164b3ca2b51ae11e45e8fd40a) +* [Script to setup the Pi for connecting over USB](https://github.com/BigNate1234/rpi-USBSSH) + * (I.e. First write the OS image to the SD card, then this script will make the changes to the card so you can boot it and access it over the USB cable. + * **Assumes the SD card for the Pi is mounted at /Volumes/boot , and that you can use `sh`/`bash`**. This _should_ be the default for a Mac; if using something else, modify the script accordingly. diff --git a/README.md b/README.md index 1ee2937..1a5a160 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,11 @@ Disclaimer: It hasn't been confirmed that this solution will work with v9 of the Required: * [Raspberry Pi Zero W](https://www.raspberrypi.org/products/raspberry-pi-zero-w/): [Adafruit](https://www.adafruit.com/product/3400) or [Amazon](https://www.amazon.com/Raspberry-Pi-Zero-Wireless-model/dp/B06XFZC3BX/) + > Note: Of the many varieties of Raspberry Pi only the Raspberry Pi Zero and Raspberry Pi Zero W can be used as simulated USB drives. It may be possible to use a Pi Zero with a USB Wifi adapter to achieve the same result as the Pi Zero W, but this hasn't been confirmed. + * A Micro SD card, at least 8 GB in size, and an adapter (if necessary) to connect the card to your computer. * A USB A/Micro B cable: [Adafruit](https://www.adafruit.com/product/898) or [Amazon](https://www.amazon.com/gp/product/B013G4EAEI/) - > Note: Of the many varieties of Raspberry Pi only the Raspberry Pi Zero and Raspberry Pi Zero W can be used as simulated USB drives. It may be possible to use a Pi Zero with a USB Wifi adapter to achieve the same result as the Pi Zero W, but this hasn't been confirmed. - Recommended: These will allow you to set up the Raspberry Pi without following the steps for a "headless" setup, which are a little more complicated. * Mini HDMI to HDMI cable [Adafruit](https://www.adafruit.com/product/2775) or [Amazon](https://www.amazon.com/AmazonBasics-High-Speed-Mini-HDMI-HDMI-Cable/dp/B014I8UEGY) * A USB keyboard. @@ -60,7 +60,7 @@ Download and install: ## Create your archive ### Hosting on Windows -Set up a share on a Windows machine to host the archive. These instructions assume that you created a share named "SailfishCam". It is recommended that you create a new user. Grant the user you'll be using read/write access to the share. These instructions will assume that the user you've created is named "sailfish" and that the password for this user is "pa$$w0rd". +Set up a share on a Windows machine to host the archive. These instructions assume that you created a share named "SailfishCam" on the server "Nautilus". It is recommended that you create a new user. Grant the user you'll be using read/write access to the share. These instructions will assume that the user you've created is named "sailfish" and that the password for this user is "pa$$w0rd". Get the IP address of the archive machine. You'll need this later, so write it down, somewhere. You can do this by opening a command prompt on the archive machine and typing ipconfig. Get the IP address from the line labeled "IPv4 Address". ### TODO Other hosting solutions @@ -83,189 +83,55 @@ There are four phases to setting up the Pi: ### Get a shell on the Pi If you have a monitor with an hdmi input, a mini hdmi to hdmi cable, a usb keyboard and a micro usb power cable you can hook up the devices to the Pi and configure it directly. Plug it in and turn it on. When you're prompted for the password for the user "pi" use "raspberry" without the quotes. Now skip to section below titled "Get the scripts onto the Pi". -If you don't have a keyboard/HDMI setup to boot the Pi and edit/transfer files directly, you'll probably want to connect to it over USB. See the sections below for instructions. +If you don't have a keyboard/HDMI setup to boot the Pi and edit/transfer files directly, you'll probably want to connect to it over USB. -#### Seting up the Pi without a monitor using Windows -1. Download and install: - * [Notepad++](https://notepad-plus-plus.org/) Alternatively, any other text editor which is capable of editing files with Unix-style line endings. - * [Putty]( https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) Note: You can paste into Putty by right-clicking. No matter where you right-click, the content will be inserted at the position of the cursor, as if you had typed it in. -1. Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) The instructions from the video are recreated below, with some changes. -1. Open the config.txt file on the sd card with Notepad++ -1. Add this line to the end of the file - ``` - dtoverlay=dwc2 - ``` -1. Add a blank line to the end of the file. -1. Open cmdline.txt with Notepad++ -1. Find the word "rootwait", add this text, separated by spaces, between rootwait and the word following it: - ``` - modules-load=dwc2,g_ether - ``` -1. Create a file named ssh (with no extension) at the root -1. Eject the sd card -1. Move the sd card to the Pi. -1. Connect a micro usb cable to the port labeled "USB" on the Raspberry Pi, and to the PC. -1. On the PC, press your Windows key, type Control Panel. -1. Open "Network and Sharing Center" -1. Click "Change adapter settings" -1. Wait for something labeled "USB Ethernet/RNDIS Gadget" to appear. -1. Launch Putty -1. In the Host Name box enter - ``` - pi@raspberrypi.local - ``` -1. If you get an "unknown host" error message install Bonjour: https://support.apple.com/kb/DL999 and go back to step 17. -1. Password is raspberry -1. Skip down to the section titled "Get the scripts onto the Pi" +If you're using Windows, follow [these instructions](GetShellWithoutMonitorOnWindows.md), then skip down to the section titled "Get the scripts onto the Pi". -#### Seting up the Pi without a monitor using a Mac or Linux -Basically what you're doing is using the Pi's capability to emulate a network connection over USB. So you need to get the Pi (the guest) set up to load the proper modules to do so, and then connect from your machine (the host) using a shell (like iTerm+SSH on macOS). - -Here are a few ways to accomplish this -* [Gist (text file) showing example steps and discussion thread about issues, etc](https://gist.github.com/gbaman/975e2db164b3ca2b51ae11e45e8fd40a) -* [Script to setup the Pi for connecting over USB](https://github.com/BigNate1234/rpi-USBSSH) - * (I.e. First write the OS image to the SD card, then this script will make the changes to the card so you can boot it and access it over the USB cable. - * **Assumes the SD card for the Pi is mounted at /Volumes/boot , and that you can use `sh`/`bash`**. This _should_ be the default for a Mac; if using something else, modify the script accordingly. +If you're using Linux or a Mac, follow [these instructions](GetShellWitoutMonitorOnLinux.md), then proceed to the next section. ### Get the scripts onto the Pi Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. 1. Enter the following command. ``` + sudo -i sudo nano /etc/wpa_supplicant/wpa_supplicant.conf ``` 1. Add this block to the bottom of the file specifying the actual SSID of your network and your actual PSK, keeping the quotes around both values. ``` network={ - ssid="NETWORK" - psk="PASSWORD" + ssid="NETWORK" + psk="PASSWORD" } ``` -1. Configure the wifi to ensure that your Pi has access to your network. Note that this command differs from what's described in the video above. +1. Configure the wifi to ensure that your Pi has access to your network. Note that this command differs from what's described in the video for how to set up the pi without a monitor using Windows. ``` - sudo wpa_cli -i wlan0 reconfigure + wpa_cli -i wlan0 reconfigure ``` 1. Run this command ``` ifconfig wlan0 ``` 1. Verify that there's an IP address on your subnet assigned. -1. Run: - ``` - sudo nano /boot/cmdline.txt - ``` -1. Remove the g_ether parameter and the comma preceding it, so you have +1. Run these commands, subsituting your values: ``` - modules-load=dwc2 + export archiveserver=Nautilus + export sharename=SailfishCam + export shareuser=sailfish + export sharepassword=pa$$w0rd ``` -1. Figure out how much space to allocate for your usb drive. First run these command: +1. Run these commands: ``` - size="$(($(df --output=avail / | tail -1) - 1000000))" - echo $size + wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/setup-teslausb + chmod +x setup-teslausb + ./setup-teslausb ``` -1. If the number is negative, stop; you're using a MicroSD card that's too small. Otherwise: +1. Run this command: ``` - sudo fallocate -l "$size"K /piusb.bin + reboot ``` -1. Create a filesystem for the drive: - ``` - sudo mkdosfs /piusb.bin -F 32 -I - ``` -1. Create the mount point from which the scripts will copy the clips: - ``` - sudo mkdir /mnt/usb_share - ``` -1. Create the mount point for the network share to which the clips will be copied: - ``` - sudo mkdir /mnt/cam_archive - ``` -1. Tell the system how to connect the mount points to actual data: - ``` - sudo nano /etc/fstab - ``` -1. Add this line to the end of the file. - ``` - /piusb.bin /mnt/usb_share vfat noauto,users,umask=000 0 0 - ``` -1. Add this line to the end of the file. Change the IP address here (192.168.0.41) to the actual IP address of the machine hosting your archive. Change the name of the share "SailfishCam" to the actual name of the share you created. Note: This is a single line. - ``` - //192.168.0.41/SailfishCam /mnt/cam_archive cifs vers=3,credentials=/root/.teslaCamArchiveCredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0 - ``` -1. Create the credential file: - ``` - sudo nano /root/.teslaCamArchiveCredentials - ``` -1. Enter this content, specifying the actual user name and password for the user you created on the archive machine: - ``` - username=sailfish - password=pa$$w0rd - ``` -1. Get the script which will archive the clips. - ``` - sudo mkdir /root/bin - sudo -i - cd /root/bin - wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archive-teslacam-clips - chmod +x archive-teslacam-clips - exit - ``` -1. Verify that the archive server is reachable by name. Replace "archiveserver" with the actual name of your archive server. - ``` - ping archiveserver - ``` -1. If the name isn't resolvable, try its IP address. - ``` - ping 192.168.0.41 - ``` -1. Get the script which will continually check for access to the archive server and trigger the archival: - ``` - sudo -i - cd /root/bin - wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archiveloop - chmod +x archiveloop - exit - ``` -1. Edit the script and replace archiveserver on line 4 with the name or IP address of your archive server. -1. Make the scripts run at startup: - ``` - sudo nano /etc/rc.local - ``` -1. Change the very first line in the file to - ``` - #!/bin/bash -eu - ``` -1. Add this content before the last line (exit 0): - ``` - LOGFILE=/tmp/rc.local.log - - function log () { - echo "$( date )" >> "$LOGFILE" - echo "$1" >> "$LOGFILE" - } - - log "Running fsck..." - /sbin/fsck /mnt/usb_share -- -a >> "$LOGFILE" 2>&1 || echo "" - log "Running modprobe..." - /sbin/modprobe g_mass_storage >> "$LOGFILE" 2>&1 - log "Launching archival script..." - /root/bin/archiveloop & - log "All done" -1. Set the configuration for the g_mass_storage module: - ``` - sudo -i - cd /etc/modprobe.d - wget https://raw.githubusercontent.com/cimryan/teslausb/master/g_mass_storage.conf - - exit - ``` -1. Reboot the Pi: - ``` - sudo reboot - ``` - ### Get the Pi set up for your Tesla. -If you set up the Pi with a keyboard and a monitor disconnect it and connect it to a PC. If you're using a cable be sure to use the cable labeled "usb" on the circuitboard. +If you set up the Pi with a keyboard and a monitor disconnect it and connect it to a PC. If you're using a cable be sure to use the port labeled "usb" on the circuitboard. 1. Wait for the Pi to show up on the PC as a USB drive. 1. Create a directory named TeslaCam at the root of the drive. 1. Eject the drive. 1. Plug the Drive into your Tesla. - diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb new file mode 100644 index 0000000..a075daf --- /dev/null +++ b/windows_archive/setup-teslausb @@ -0,0 +1,91 @@ +#!/bin/bash -eu + +if [ "$(whoami)" != "root" ] +then + echo "STOP: Run sudo -i." + exit 1 +fi + +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" + exit 1 + fi +} + +check_variable "archiveserver" +check_variable "sharename" +check_variable "shareuser" +check_variable "sharepassword" + +serverunreachable=false +ping -c 1 -w 1 "$archiveserver" 1>/dev/null 2>&1 || serverunreachable=true + +if [ "$serverunreachable" = true ] +then + echo "STOP: The archive server $archiveserver is unreachable. Try specifying its IP address instead." + exit 1 +fi + +archiveserverip="$(getent hosts $archiveserver | cut -d' ' -f1)" + +size="$(($(df --output=avail / | tail -1) - 1000000))" +if [ "$size" -lt 0 ] +then + echo "STOP: The MicroSD card is too small." + exit 1 +fi + +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 + +fallocate -l "$size"K /piusb.bin +mkdosfs /piusb.bin -F 32 -I +mkdir /mnt/usb_share +mkdir /mnt/cam_archive + +echo "" >> /etc/fstab +echo "/piusb.bin /mnt/usb_share vfat noauto,users,umask=000 0 0" >> /etc/fstab +echo "//$archiveserverip/$sharename /mnt/cam_archive cifs vers=3,credentials=/root/.teslaCamArchiveCredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0$ + +echo "username=$shareuser" > /root/.teslaCamArchiveCredentials +echo "password=$sharepassword" >> /root/.teslaCamArchiveCredentials + +mkdir /root/bin + +pushd /root/bin +wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archive-teslacam-clips +chmod +x archive-teslacam-clips +wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archiveloop +chmod +x archiveloop +popd + +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 "Running fsck..." +/sbin/fsck /mnt/usb_share -- -a >> "$LOGFILE" 2>&1 || echo "" +log "Running modprobe..." +/sbin/modprobe g_mass_storage >> "$LOGFILE" 2>&1 +log "Launching archival script..." +/root/bin/archiveloop & +log "All done" +exit 0 +EOF + +cat ~/rc.local > /etc/rc.local +rm ~/rc.local + +pushd /etc/modprobe.d +wget https://raw.githubusercontent.com/cimryan/teslausb/master/g_mass_storage.conf +popd From 71695020a74608a74284e605cb5ed0b407794842 Mon Sep 17 00:00:00 2001 From: cimryan Date: Thu, 11 Oct 2018 20:10:39 -0700 Subject: [PATCH 03/28] Remove unnecessary sudo invocation. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a5a160..e028edb 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. 1. Enter the following command. ``` sudo -i - sudo nano /etc/wpa_supplicant/wpa_supplicant.conf + nano /etc/wpa_supplicant/wpa_supplicant.conf ``` 1. Add this block to the bottom of the file specifying the actual SSID of your network and your actual PSK, keeping the quotes around both values. ``` From 258aa20cb549016256a16468c4e3d45354efde6d Mon Sep 17 00:00:00 2001 From: cimryan Date: Thu, 11 Oct 2018 20:11:28 -0700 Subject: [PATCH 04/28] Fix the addition of the archive server to /etc/fstab. --- windows_archive/setup-teslausb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index a075daf..b604986 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -49,7 +49,7 @@ mkdir /mnt/cam_archive echo "" >> /etc/fstab echo "/piusb.bin /mnt/usb_share vfat noauto,users,umask=000 0 0" >> /etc/fstab -echo "//$archiveserverip/$sharename /mnt/cam_archive cifs vers=3,credentials=/root/.teslaCamArchiveCredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0$ +echo "//$archiveserverip/$sharename /mnt/cam_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 From f2b61ef53568a80e0e209192e39826f50c18bde4 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 07:41:11 -0700 Subject: [PATCH 05/28] Add setup-piForHeadlessConfig.ps1 Script to automate the process of preparing the Pi to listen for SSH connections over USB. --- windows_archive/setup-piForHeadlessConfig.ps1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 windows_archive/setup-piForHeadlessConfig.ps1 diff --git a/windows_archive/setup-piForHeadlessConfig.ps1 b/windows_archive/setup-piForHeadlessConfig.ps1 new file mode 100644 index 0000000..d5c682f --- /dev/null +++ b/windows_archive/setup-piForHeadlessConfig.ps1 @@ -0,0 +1,31 @@ +[CmdletBinding()] +Param +( + [Parameter(Mandatory=$True,Position=1)] + [string]$driveLetter +) + +$drivePath="${driveLetter}:" +$configPath = "$drivePath\config.txt" +$cmdlinePath = "$drivePath\cmdline.txt" +$sshPath = "$drivePath\ssh" + +if ((![System.IO.File]::Exists($configPath) -or + (![System.IO.File]::Exists($cmdlinePath)))) { + Write-Error "Didn't find cmdline.txt and config.txt on drive $drivePath." + exit 1 +} + +Write-Verbose "Updating $configPath ..." + +"" | Out-File -FilePath $configPath -Append -Encoding utf8 +"dtoverlay=dwc2" | Out-File -FilePath $configPath -Append -Encoding utf8 + +Write-Verbose "Updating $cmdlinePath ..." +$cmdlinetxtContent = gc -Raw $cmdlinePath +$cmdlinetxtContent.Replace("rootwait", "rootwait modules-load=dwc2,g_ether") | Out-File -FilePath $cmdlinePath -Encoding utf8 + +Write-Verbose "Enabling SSH ..." +[System.IO.File]::CreateText($sshPath).Dispose() + +Write-Verbose "All done." \ No newline at end of file From 3a3d5179ab1ad18176917dfb46a51b7a7792c413 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 07:53:46 -0700 Subject: [PATCH 06/28] Update the headless setup instructions for Windows to use the automated script. --- GetShellWithoutMonitorOnWindows.md | 31 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/GetShellWithoutMonitorOnWindows.md b/GetShellWithoutMonitorOnWindows.md index 314f902..7c919ad 100644 --- a/GetShellWithoutMonitorOnWindows.md +++ b/GetShellWithoutMonitorOnWindows.md @@ -2,19 +2,23 @@ 1. Download and install: * [Notepad++](https://notepad-plus-plus.org/) Alternatively, any other text editor which is capable of editing files with Unix-style line endings. * [Putty]( https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) Note: You can paste into Putty by right-clicking. No matter where you right-click, the content will be inserted at the position of the cursor, as if you had typed it in. -1. Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) The instructions from the video are recreated below, with some changes. -1. Open the config.txt file on the sd card with Notepad++ -1. Add this line to the end of the file - ``` - dtoverlay=dwc2 + +Optional: Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) to get an idea of the process. The steps from the video are partially automated, below. +1. Remove the MicroSD card from your computer and reinsert it. Do not at any point during the setup of the USB drive allow Windows to format any partition on any drive. +1. Note that a new drive labeled "boot" has appeared on your computer. Note the drive letter of that drive. +1. Right-click on your Start menu icon and select "Windows PowerShell (Admin)". +1. Run the following command: ``` -1. Add a blank line to the end of the file. -1. Open cmdline.txt with Notepad++ -1. Find the word "rootwait", add this text, separated by spaces, between rootwait and the word following it: + Set-ExecutionPolicy -Scope CurrentUser Unrestricted ``` - modules-load=dwc2,g_ether +1. Enter Y when prompted, and press Enter. +1. Run the following commands: ``` -1. Create a file named ssh (with no extension) at the root + cd ~ + wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/setup-piForHeadlessConfig.ps1 -OutFile setup-piForHeadlessConfig.ps1 + ./setup-piForHeadlessConfig.ps1 -Verbose + ``` +1. Enter the single letter of the "boot" drive and press Enter. 1. Eject the sd card 1. Move the sd card to the Pi. 1. Connect a micro usb cable to the port labeled "USB" on the Raspberry Pi, and to the PC. @@ -27,5 +31,8 @@ ``` pi@raspberrypi.local ``` -1. If you get an "unknown host" error message install Bonjour: https://support.apple.com/kb/DL999 and go back to step 17. -1. Password is raspberry +1. If you get an "unknown host" error message install Bonjour: https://support.apple.com/kb/DL999 and go back to step 15. +1. You should be prompted for the password for the user "pi". Enter + ``` + raspberry + ``` From 9f35db7646102ed0b4d0c2348ec5c7be0f6b9ec0 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 07:54:14 -0700 Subject: [PATCH 07/28] More explicit instructions for the use of nano. --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e028edb..e50b86a 100644 --- a/README.md +++ b/README.md @@ -78,16 +78,18 @@ There are four phases to setting up the Pi: 1. Connect your SD card to your computer. 2. Use Etcher to write the zip file you downloaded to the SD card. Etcher works well and is multi-platform. > Note: you don't need to uncompress the zip file you downloaded. -3. Plug the micro sd card into the Pi. ### Get a shell on the Pi -If you have a monitor with an hdmi input, a mini hdmi to hdmi cable, a usb keyboard and a micro usb power cable you can hook up the devices to the Pi and configure it directly. Plug it in and turn it on. When you're prompted for the password for the user "pi" use "raspberry" without the quotes. Now skip to section below titled "Get the scripts onto the Pi". +If you have a monitor with an hdmi input, a mini hdmi to hdmi cable, a usb keyboard and a micro usb power cable you can hook up the devices to the Pi and configure it directly. +1. Insert the MicroSD card into the Pi. +1. Connect the keyboard, and monitor to the Pi. +1. Connect the power supply to the Pi using the port labeld "PWR" on the circuitboard. +1. When you're prompted for the password for the user "pi" use "raspberry" without the quotes. +1. Now skip to section below titled "Get the scripts onto the Pi". -If you don't have a keyboard/HDMI setup to boot the Pi and edit/transfer files directly, you'll probably want to connect to it over USB. - -If you're using Windows, follow [these instructions](GetShellWithoutMonitorOnWindows.md), then skip down to the section titled "Get the scripts onto the Pi". - -If you're using Linux or a Mac, follow [these instructions](GetShellWitoutMonitorOnLinux.md), then proceed to the next section. +If you don't have a keyboard/HDMI setup to boot the Pi and edit/transfer files directly, you'll probably want to connect to the Pi over USB. +* If you're using Windows, follow [these instructions](GetShellWithoutMonitorOnWindows.md), then skip down to the section titled "Get the scripts onto the Pi". +* If you're using Linux or a Mac, follow [these instructions](GetShellWitoutMonitorOnLinux.md), then proceed to the next section. ### Get the scripts onto the Pi Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. @@ -103,6 +105,7 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. psk="PASSWORD" } ``` +1. Press Control-O then Contr-X to save the file and exit nano. 1. Configure the wifi to ensure that your Pi has access to your network. Note that this command differs from what's described in the video for how to set up the pi without a monitor using Windows. ``` wpa_cli -i wlan0 reconfigure From 7fd130eaef8e15246fc496e9709a6cbdb546903a Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 07:57:42 -0700 Subject: [PATCH 08/28] Even more explicit instructions for nano. --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e50b86a..47b3e07 100644 --- a/README.md +++ b/README.md @@ -105,8 +105,9 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. psk="PASSWORD" } ``` -1. Press Control-O then Contr-X to save the file and exit nano. -1. Configure the wifi to ensure that your Pi has access to your network. Note that this command differs from what's described in the video for how to set up the pi without a monitor using Windows. +1. Press Control-O, Enter to save the file. +1. Press Control-X to return to the command line. +1. Configure the wifi to ensure that your Pi has access to your network. ``` wpa_cli -i wlan0 reconfigure ``` @@ -114,7 +115,7 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. ``` ifconfig wlan0 ``` -1. Verify that there's an IP address on your subnet assigned. +1. Verify that there's an IP address on your subnet assigned. If you don't see the IP address wait for a couple of seconds and re-run the command. 1. Run these commands, subsituting your values: ``` export archiveserver=Nautilus From 24d662276ecf3701aca64acd97b3bf6fb65da299 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 08:11:57 -0700 Subject: [PATCH 09/28] Change instructions to use built-in ssh instead of Putty. --- GetShellWithoutMonitorOnWindows.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/GetShellWithoutMonitorOnWindows.md b/GetShellWithoutMonitorOnWindows.md index 7c919ad..7208ceb 100644 --- a/GetShellWithoutMonitorOnWindows.md +++ b/GetShellWithoutMonitorOnWindows.md @@ -7,7 +7,9 @@ Optional: Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) to get 1. Remove the MicroSD card from your computer and reinsert it. Do not at any point during the setup of the USB drive allow Windows to format any partition on any drive. 1. Note that a new drive labeled "boot" has appeared on your computer. Note the drive letter of that drive. 1. Right-click on your Start menu icon and select "Windows PowerShell (Admin)". +1. Right-click the title bar of the window and select "Properties". Ensure that the "Use legacy console" checkbox is unchecked and activate the OK button. If it was checked before you unchecked it, close te PowerShell window and go back to step 3. If it wasn't, proceed onto the next step. 1. Run the following command: + > Note: You can paste into the PowerShell window by right-clicking. The text will appear at the position of the cursor, not necessarily at the position where you click. ``` Set-ExecutionPolicy -Scope CurrentUser Unrestricted ``` @@ -19,17 +21,16 @@ Optional: Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) to get ./setup-piForHeadlessConfig.ps1 -Verbose ``` 1. Enter the single letter of the "boot" drive and press Enter. -1. Eject the sd card +1. Eject the sd card. 1. Move the sd card to the Pi. 1. Connect a micro usb cable to the port labeled "USB" on the Raspberry Pi, and to the PC. 1. On the PC, press your Windows key, type Control Panel. 1. Open "Network and Sharing Center" 1. Click "Change adapter settings" 1. Wait for something labeled "USB Ethernet/RNDIS Gadget" to appear. -1. Launch Putty -1. In the Host Name box enter +1. Enter this command in your PowerShell window: ``` - pi@raspberrypi.local + ssh pi@raspberrypi.local ``` 1. If you get an "unknown host" error message install Bonjour: https://support.apple.com/kb/DL999 and go back to step 15. 1. You should be prompted for the password for the user "pi". Enter From 1aac431c0658a2e5650ce144b7742df4b1da2b59 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 13:44:18 -0700 Subject: [PATCH 10/28] Avoid connecting the USB drive if it'll just immediately be disconnected. --- windows_archive/archive-teslacam-clips | 18 +++++++++-------- windows_archive/archiveloop | 27 +++++++++++++++++--------- windows_archive/setup-teslausb | 4 ---- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/windows_archive/archive-teslacam-clips b/windows_archive/archive-teslacam-clips index ccf192b..69d4dde 100644 --- a/windows_archive/archive-teslacam-clips +++ b/windows_archive/archive-teslacam-clips @@ -44,7 +44,7 @@ function move_clips_to_archive () { for file_name in /mnt/usb_share/TeslaCam/saved*; do [ -e "$file_name" ] || continue log "Moving $file_name ..." - mv -- "$file_name" /mnt/cam_archive >> "$LOGFILE" 2>&1 + mv -- "$file_name" /mnt/cam_archive >> "$LOGFILE" 2>&1 || echo "" log "Moved $file_name." done log "Finished moving clips to archive." @@ -56,6 +56,12 @@ function disconnect_usb_from_host () { log "Disconnected usb from host." } +function fix_errors_on_drive () { + log "Running fsck..." + /sbin/fsck /mnt/usb_share -- -a >> "$LOGFILE" 2>&1 || echo "" + log "Finished running fsck." +} + function mount_usb_drive_locally () { log "Mounting usb locally..." mount /mnt/usb_share @@ -80,22 +86,18 @@ function unmount_usb_share () { log "Unmounted usb share." } -function connect_usb_to_host() { - log "Connecting usb to host..." - modprobe g_mass_storage - log "Connected usb to host." -} - log "Starting..." ensure_cam_archive_is_mounted disconnect_usb_from_host +fix_errors_on_drive + ensure_usb_share_is_mounted move_clips_to_archive unmount_usb_share -connect_usb_to_host +connect_usb_to_host \ No newline at end of file diff --git a/windows_archive/archiveloop b/windows_archive/archiveloop index b6d5fc6..bee6e98 100644 --- a/windows_archive/archiveloop +++ b/windows_archive/archiveloop @@ -4,16 +4,12 @@ ARCHIVE_HOST_NAME=archiveserver LOGFILE=/tmp/archiveloop.log -function clear_log () { - rm "$LOGFILE" > /dev/null 2>&1 || echo "" -} - function log () { echo "$( date )" >> "$LOGFILE" echo "$1" >> "$LOGFILE" } -function check_archive_reachability () { +function archive_is_reachable () { local reachable=true ping -q -w 1 -c 1 "$ARCHIVE_HOST_NAME" > /dev/null 2>&1 || reachable=false if [ "$reachable" = false ] @@ -24,11 +20,17 @@ function check_archive_reachability () { true } +function connect_usb_to_host() { + log "Connecting usb to host..." + modprobe g_mass_storage + log "Connected usb to host." +} + function wait_for_archive_to_be_reachable () { log "Waiting for archive to be reachable..." while [ true ] do - if check_archive_reachability + if archive_is_reachable then log "Archive is reachable." break @@ -47,7 +49,7 @@ function wait_for_archive_to_be_unreachable () { log "Waiting for archive to be unreachable..." while [ true ] do - if ! check_archive_reachability + if ! archive_is_reachable then log "Archive is unreachable." break @@ -56,10 +58,17 @@ function wait_for_archive_to_be_unreachable () { done } -clear_log +export -f connect_usb_to_host log "Starting..." +if archive_is_reachable +then + archive_clips +else + connect_usb_to_host +fi + while [ true ] do wait_for_archive_to_be_reachable @@ -67,4 +76,4 @@ do archive_clips wait_for_archive_to_be_unreachable -done +done \ No newline at end of file diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index b604986..9e210a1 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -73,10 +73,6 @@ function log () { echo "$1" >> "$LOGFILE" } -log "Running fsck..." -/sbin/fsck /mnt/usb_share -- -a >> "$LOGFILE" 2>&1 || echo "" -log "Running modprobe..." -/sbin/modprobe g_mass_storage >> "$LOGFILE" 2>&1 log "Launching archival script..." /root/bin/archiveloop & log "All done" From 1d19ac5c2f6ced75f34c6fd7f700d453bc2a5578 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 14:07:20 -0700 Subject: [PATCH 11/28] Make the network name of the Pi "teslausb". --- windows_archive/setup-teslausb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index 9e210a1..516a119 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -85,3 +85,9 @@ rm ~/rc.local pushd /etc/modprobe.d wget https://raw.githubusercontent.com/cimryan/teslausb/master/g_mass_storage.conf popd + +cp /etc/hosts ~ +sed s/raspberrypi/teslausb/g ~/hosts > /etc/hosts + +cp /etc/hostname ~ +sed s/raspberrypi/teslausb/g ~/hosts > /etc/hostname \ No newline at end of file From 71e8ba0339abb8b3f06a01faeefcf0735ab6a193 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 14:33:47 -0700 Subject: [PATCH 12/28] Give the volume a label and don't overwrite hostname with hosts. --- windows_archive/setup-teslausb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index 516a119..3093a33 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -43,7 +43,7 @@ cat ~/cmdline.txt | sed 's/[[:space:]]\+modules-load=[^ [:space:]]\+//' | sed 's rm ~/cmdline.txt fallocate -l "$size"K /piusb.bin -mkdosfs /piusb.bin -F 32 -I +mkdosfs /piusb.bin -F 32 -I -n TESLAUSB mkdir /mnt/usb_share mkdir /mnt/cam_archive @@ -90,4 +90,4 @@ cp /etc/hosts ~ sed s/raspberrypi/teslausb/g ~/hosts > /etc/hosts cp /etc/hostname ~ -sed s/raspberrypi/teslausb/g ~/hosts > /etc/hostname \ No newline at end of file +sed s/raspberrypi/teslausb/g ~/hostname > /etc/hostname \ No newline at end of file From b386bcc610d3d85befb35db19ccf4013947f2f2c Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 15:45:45 -0700 Subject: [PATCH 13/28] The setup script updates archiveloop with the name of the archive server --- windows_archive/setup-teslausb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index 3093a33..ec14c70 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -38,6 +38,8 @@ then exit 1 fi +pushd ~ + 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 @@ -56,11 +58,14 @@ echo "password=$sharepassword" >> /root/.teslaCamArchiveCredentials mkdir /root/bin +wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archiveloop +sed s/ARCHIVE_HOST_NAME=archiveserver/ARCHIVE_HOST_NAME=$archiveserver/ ~/archiveloop > /root/bin/archiveloop +rm ~/archiveloop +chmod +x /root/bin/archiveloop + pushd /root/bin wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archive-teslacam-clips chmod +x archive-teslacam-clips -wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archiveloop -chmod +x archiveloop popd echo "#!/bin/bash -eu" > ~/rc.local @@ -90,4 +95,4 @@ cp /etc/hosts ~ sed s/raspberrypi/teslausb/g ~/hosts > /etc/hosts cp /etc/hostname ~ -sed s/raspberrypi/teslausb/g ~/hostname > /etc/hostname \ No newline at end of file +sed s/raspberrypi/teslausb/g ~/hostname > /etc/hostname From f28ec27935c33b4120a959e330f0fe2d43981723 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 15:52:54 -0700 Subject: [PATCH 14/28] More explicit instructions for the scenario in which the archive server isn't reachable by name but is by IP address --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 47b3e07..28513cf 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,8 @@ Download and install: ### Hosting on Windows Set up a share on a Windows machine to host the archive. These instructions assume that you created a share named "SailfishCam" on the server "Nautilus". It is recommended that you create a new user. Grant the user you'll be using read/write access to the share. These instructions will assume that the user you've created is named "sailfish" and that the password for this user is "pa$$w0rd". -Get the IP address of the archive machine. You'll need this later, so write it down, somewhere. You can do this by opening a command prompt on the archive machine and typing ipconfig. Get the IP address from the line labeled "IPv4 Address". +Get the IP address of the archive machine. You'll need this later, so write it down, somewhere. You can do this by opening a command prompt on the archive machine and typing ipconfig. Get the IP address from the line labeled "IPv4 Address". These instructions will assume that the IP address of the archive server is 192.168.0.41. + ### TODO Other hosting solutions ## Set up the Raspberry Pi @@ -116,6 +117,15 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. ifconfig wlan0 ``` 1. Verify that there's an IP address on your subnet assigned. If you don't see the IP address wait for a couple of seconds and re-run the command. +1. Try to ping your archive server from the Pi. + ``` + ping nautilus + ``` +1. If the server can't be reached, ping it's IP address: + ``` + ping 192.168.0.41 + ``` +1. If you can't ping the archive server by IP address from the Pi you should go do whatever you need to on your network to fix that. If you can't reach the archive server by name from the Pi but you can by IP address then use its IP address, below, in place of its name. 1. Run these commands, subsituting your values: ``` export archiveserver=Nautilus From 799ed9caedd120059705c7e4e6f70c86412ee0ef Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 15:53:34 -0700 Subject: [PATCH 15/28] Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 28513cf..609427e 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. ``` ping nautilus ``` -1. If the server can't be reached, ping it's IP address: +1. If the server can't be reached, ping its IP address: ``` ping 192.168.0.41 ``` From d635f62de0e482b231f8dc586c92fa5e8199e393 Mon Sep 17 00:00:00 2001 From: cimryan Date: Fri, 12 Oct 2018 18:58:56 -0700 Subject: [PATCH 16/28] Remove instruction to install Putty The later instructions reference the ssh built-in to Windows. --- GetShellWithoutMonitorOnWindows.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/GetShellWithoutMonitorOnWindows.md b/GetShellWithoutMonitorOnWindows.md index 7208ceb..d696876 100644 --- a/GetShellWithoutMonitorOnWindows.md +++ b/GetShellWithoutMonitorOnWindows.md @@ -1,9 +1,6 @@ # Seting up the Pi without a monitor using Windows -1. Download and install: - * [Notepad++](https://notepad-plus-plus.org/) Alternatively, any other text editor which is capable of editing files with Unix-style line endings. - * [Putty]( https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) Note: You can paste into Putty by right-clicking. No matter where you right-click, the content will be inserted at the position of the cursor, as if you had typed it in. - -Optional: Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) to get an idea of the process. The steps from the video are partially automated, below. +1. Download and install: [Notepad++](https://notepad-plus-plus.org/) Alternatively, any other text editor which is capable of editing files with Unix-style line endings. +1. Optional: Watch [this video](https://www.youtube.com/watch?v=xj3MPmJhAPU) to get an idea of the process. The steps from the video are partially automated, below. 1. Remove the MicroSD card from your computer and reinsert it. Do not at any point during the setup of the USB drive allow Windows to format any partition on any drive. 1. Note that a new drive labeled "boot" has appeared on your computer. Note the drive letter of that drive. 1. Right-click on your Start menu icon and select "Windows PowerShell (Admin)". From 64b323eb76466e664c8972365215387982d09a41 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 08:06:55 -0700 Subject: [PATCH 17/28] If the archive is initially reachable wait for it to be unreachable after archiving the clips before archiving the clips, again. --- windows_archive/archiveloop | 2 ++ 1 file changed, 2 insertions(+) diff --git a/windows_archive/archiveloop b/windows_archive/archiveloop index bee6e98..a860a97 100644 --- a/windows_archive/archiveloop +++ b/windows_archive/archiveloop @@ -65,6 +65,8 @@ log "Starting..." if archive_is_reachable then archive_clips + + wait_for_archive_to_be_unreachable else connect_usb_to_host fi From 499d23cb36462d1d96b8190b64603ad82389903d Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 08:11:02 -0700 Subject: [PATCH 18/28] Retry mounting the shares up to 10 times. There's a race between the system mounting the share and the findmnt invocation in the script to determine if the share is already mounted. When findmnt wins the race the script would previously operate as if the share definitely needed to be mounted, and would fail to mount it. Now the script will notice that the share has already been mounted. --- windows_archive/archive-teslacam-clips | 32 ++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/windows_archive/archive-teslacam-clips b/windows_archive/archive-teslacam-clips index 69d4dde..fa83ef8 100644 --- a/windows_archive/archive-teslacam-clips +++ b/windows_archive/archive-teslacam-clips @@ -7,6 +7,30 @@ function log () { echo "$1" >> "$LOGFILE" } +function retry () { + local attempts=0 + while [ true ] + do + if eval "$@" + then + true + return + fi + if [ "$attempts" -ge 10 ] + then + log "Attempts exhausted." + false + return + fi + log "Sleeping before retry..." + /bin/sleep 1 + attempts=$((attempts + 1)) + log "Retrying..." + done + false + return +} + function mount_mountpoint () { local mount_point="$1" log "Mounting $mount_point..." @@ -39,6 +63,10 @@ function ensure_mountpoint_is_mounted () { fi } +function ensure_mountpoint_is_mounted_with_retry () { + retry ensure_mountpoint_is_mounted "$1" +} + function move_clips_to_archive () { log "Moving clips to archive..." for file_name in /mnt/usb_share/TeslaCam/saved*; do @@ -70,13 +98,13 @@ function mount_usb_drive_locally () { function ensure_cam_archive_is_mounted () { log "Ensuring cam archive is mounted..." - ensure_mountpoint_is_mounted /mnt/cam_archive + ensure_mountpoint_is_mounted_with_retry /mnt/cam_archive log "Ensured cam archive is mounted." } function ensure_usb_share_is_mounted () { log "Ensuring usb share is mounted..." - ensure_mountpoint_is_mounted /mnt/usb_share + ensure_mountpoint_is_mounted_with_retry /mnt/usb_share log "Ensured usb share is mounted." } From 0d998bcd1869415843cf9eae7529ba6d79bc35b6 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 08:33:25 -0700 Subject: [PATCH 19/28] Limit the ping count --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 609427e..c07c5af 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. 1. Verify that there's an IP address on your subnet assigned. If you don't see the IP address wait for a couple of seconds and re-run the command. 1. Try to ping your archive server from the Pi. ``` - ping nautilus + ping -c 3 nautilus ``` 1. If the server can't be reached, ping its IP address: ``` From 641779c1a2482f979ceee617330cec06669fa424 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 17:06:30 -0700 Subject: [PATCH 20/28] Add closing done for loop. --- windows_archive/archiveloop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_archive/archiveloop b/windows_archive/archiveloop index a860a97..708d893 100644 --- a/windows_archive/archiveloop +++ b/windows_archive/archiveloop @@ -78,4 +78,4 @@ do archive_clips wait_for_archive_to_be_unreachable -done \ No newline at end of file +done From 9cfce11bd44df2726127eed4e6c9250bd1fa40f8 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 17:26:58 -0700 Subject: [PATCH 21/28] Move moutpoints: usb_share -> cam, cam_archive -> archive --- windows_archive/archive-teslacam-clips | 56 ++++++++++++-------------- windows_archive/archiveloop | 6 +-- windows_archive/setup-teslausb | 10 ++--- 3 files changed, 34 insertions(+), 38 deletions(-) diff --git a/windows_archive/archive-teslacam-clips b/windows_archive/archive-teslacam-clips index fa83ef8..eadfb38 100644 --- a/windows_archive/archive-teslacam-clips +++ b/windows_archive/archive-teslacam-clips @@ -1,10 +1,12 @@ #!/bin/bash -eu -LOGFILE=/tmp/archive-teslacam-clips.log +LOG_FILE=/tmp/archive-teslacam-clips.log +CAM_MOUNT=/mnt/cam +ARCHIVE_MOUNT=/mnt/archive function log () { - echo "$( date )" >> "$LOGFILE" - echo "$1" >> "$LOGFILE" + echo "$( date )" >> "$LOG_FILE" + echo "$1" >> "$LOG_FILE" } function retry () { @@ -36,7 +38,7 @@ function mount_mountpoint () { log "Mounting $mount_point..." local mounted=true - mount "$mount_point" >> "$LOGFILE" 2>&1 || mounted=false + mount "$mount_point" >> "$LOG_FILE" 2>&1 || mounted=false if [ "$mounted" = true ] then log "Mounted $mount_point." @@ -69,63 +71,57 @@ function ensure_mountpoint_is_mounted_with_retry () { function move_clips_to_archive () { log "Moving clips to archive..." - for file_name in /mnt/usb_share/TeslaCam/saved*; do + for file_name in "$CAM_MOUNT"/TeslaCam/saved*; do [ -e "$file_name" ] || continue log "Moving $file_name ..." - mv -- "$file_name" /mnt/cam_archive >> "$LOGFILE" 2>&1 || echo "" + mv -- "$file_name" "$CAM_MOUNT" >> "$LOG_FILE" 2>&1 || echo "" log "Moved $file_name." done log "Finished moving clips to archive." } -function disconnect_usb_from_host () { +function disconnect_usb_drives_from_host () { log "Disconnecting usb from host..." modprobe -r g_mass_storage log "Disconnected usb from host." } -function fix_errors_on_drive () { +function fix_errors_on_cam_drive () { log "Running fsck..." - /sbin/fsck /mnt/usb_share -- -a >> "$LOGFILE" 2>&1 || echo "" + /sbin/fsck "$CAM_MOUNT" -- -a >> "$LOG_FILE" 2>&1 || echo "" log "Finished running fsck." } -function mount_usb_drive_locally () { - log "Mounting usb locally..." - mount /mnt/usb_share - log "Mounted usb locally." -} - -function ensure_cam_archive_is_mounted () { +function ensure_archive_is_mounted () { log "Ensuring cam archive is mounted..." - ensure_mountpoint_is_mounted_with_retry /mnt/cam_archive + ensure_mountpoint_is_mounted_with_retry "$CAM_MOUNT" log "Ensured cam archive is mounted." } -function ensure_usb_share_is_mounted () { - log "Ensuring usb share is mounted..." - ensure_mountpoint_is_mounted_with_retry /mnt/usb_share - log "Ensured usb share is mounted." +function ensure_cam_drive_is_mounted () { + log "Ensuring cam drive is mounted..." + ensure_mountpoint_is_mounted_with_retry "$CAM_MOUNT" + log "Ensured cam drive is mounted." } -function unmount_usb_share () { - log "Unmounting usb share..." - umount /mnt/usb_share - log "Unmounted usb share." +function unmount_cam_drive () { + log "Unmounting cam drive..." + umount "$CAM_MOUNT" + log "Unmounted cam drive." } log "Starting..." -ensure_cam_archive_is_mounted +ensure_archive_is_mounted -disconnect_usb_from_host +disconnect_usb_drives_from_host -fix_errors_on_drive +fix_errors_on_cam_drive -ensure_usb_share_is_mounted +ensure_cam_drive_is_mounted move_clips_to_archive -unmount_usb_share +unmount_cam_drive connect_usb_to_host \ No newline at end of file diff --git a/windows_archive/archiveloop b/windows_archive/archiveloop index 708d893..09f276d 100644 --- a/windows_archive/archiveloop +++ b/windows_archive/archiveloop @@ -20,7 +20,7 @@ function archive_is_reachable () { true } -function connect_usb_to_host() { +function connect_usb_drives_to_host() { log "Connecting usb to host..." modprobe g_mass_storage log "Connected usb to host." @@ -58,7 +58,7 @@ function wait_for_archive_to_be_unreachable () { done } -export -f connect_usb_to_host +export -f connect_usb_drives_to_host log "Starting..." @@ -68,7 +68,7 @@ then wait_for_archive_to_be_unreachable else - connect_usb_to_host + connect_usb_drives_to_host fi while [ true ] diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index ec14c70..648fa88 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -45,13 +45,13 @@ cat ~/cmdline.txt | sed 's/[[:space:]]\+modules-load=[^ [:space:]]\+//' | sed 's rm ~/cmdline.txt fallocate -l "$size"K /piusb.bin -mkdosfs /piusb.bin -F 32 -I -n TESLAUSB -mkdir /mnt/usb_share -mkdir /mnt/cam_archive +mkfs.vfat /piusb.bin -F 32 -n CAM +mkdir /mnt/cam +mkdir /mnt/archive echo "" >> /etc/fstab -echo "/piusb.bin /mnt/usb_share vfat noauto,users,umask=000 0 0" >> /etc/fstab -echo "//$archiveserverip/$sharename /mnt/cam_archive cifs vers=3,credentials=/root/.teslaCamArchiveCredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0" >> /etc/fstab +echo "/piusb.bin /mnt/cam vfat noauto,users,umask=000,debug 0 0" >> /etc/fstab +echo "//$archiveserverip/$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 From a03c322c01684bbb44a2c851248ffa0bd6134853 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 18:18:00 -0700 Subject: [PATCH 22/28] Support for music in addition to dashcam clip storage. --- README.md | 5 +-- g_mass_storage.conf | 1 - windows_archive/archive-teslacam-clips | 2 +- windows_archive/setup-teslausb | 46 ++++++++++++++++++++------ 4 files changed, 39 insertions(+), 15 deletions(-) delete mode 100644 g_mass_storage.conf diff --git a/README.md b/README.md index c07c5af..1d749f5 100644 --- a/README.md +++ b/README.md @@ -126,16 +126,17 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. ping 192.168.0.41 ``` 1. If you can't ping the archive server by IP address from the Pi you should go do whatever you need to on your network to fix that. If you can't reach the archive server by name from the Pi but you can by IP address then use its IP address, below, in place of its name. -1. Run these commands, subsituting your values: +1. Run these commands, subsituting your values. The last line is the percent of the drive you want to allocate for dashcam storage. The remaining percentage will be allocated for music. ``` export archiveserver=Nautilus export sharename=SailfishCam export shareuser=sailfish export sharepassword=pa$$w0rd + epxort campercent=100 ``` 1. Run these commands: ``` - wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/setup-teslausb + wget https://raw.githubusercontent.com/cimryan/teslausb/u/cimryan/music/windows_archive/setup-teslausb chmod +x setup-teslausb ./setup-teslausb ``` diff --git a/g_mass_storage.conf b/g_mass_storage.conf deleted file mode 100644 index 6ed888e..0000000 --- a/g_mass_storage.conf +++ /dev/null @@ -1 +0,0 @@ -options g_mass_storage file=/piusb.bin removable=1 ro=0 stall=0 iSerialNumber=123456 diff --git a/windows_archive/archive-teslacam-clips b/windows_archive/archive-teslacam-clips index eadfb38..1df2f9c 100644 --- a/windows_archive/archive-teslacam-clips +++ b/windows_archive/archive-teslacam-clips @@ -124,4 +124,4 @@ move_clips_to_archive unmount_cam_drive -connect_usb_to_host \ No newline at end of file +connect_usb_drives_to_host \ No newline at end of file diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index 648fa88..80ce1eb 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -19,6 +19,7 @@ check_variable "archiveserver" check_variable "sharename" check_variable "shareuser" check_variable "sharepassword" +check_variable "campercent" serverunreachable=false ping -c 1 -w 1 "$archiveserver" 1>/dev/null 2>&1 || serverunreachable=true @@ -31,26 +32,38 @@ fi archiveserverip="$(getent hosts $archiveserver | cut -d' ' -f1)" -size="$(($(df --output=avail / | tail -1) - 1000000))" -if [ "$size" -lt 0 ] +available_space="$(($(df --output=avail / | tail -1) - 1000000))" + +if [ "$available_space" -lt 0 ] then echo "STOP: The MicroSD card is too small." exit 1 fi +function add_drive () { + local name="$1" + local label="$2" + local size="$3" + + local filename="$4" + fallocate -l "$size"K "$filename" + mkfs.vfat "$filename" -F 32 -n "$label" + + local mountpoint=/mnt/"$name" + + mkdir "$mountpoint" + echo "$filename $mountpoint vfat noauto,users,umask=000 0 0" >> /etc/fstab +} + pushd ~ 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 -fallocate -l "$size"K /piusb.bin -mkfs.vfat /piusb.bin -F 32 -n CAM -mkdir /mnt/cam mkdir /mnt/archive echo "" >> /etc/fstab -echo "/piusb.bin /mnt/cam vfat noauto,users,umask=000,debug 0 0" >> /etc/fstab echo "//$archiveserverip/$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 @@ -58,13 +71,13 @@ echo "password=$sharepassword" >> /root/.teslaCamArchiveCredentials mkdir /root/bin -wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archiveloop +wget https://raw.githubusercontent.com/cimryan/teslausb/u/cimryan/music/windows_archive/archiveloop sed s/ARCHIVE_HOST_NAME=archiveserver/ARCHIVE_HOST_NAME=$archiveserver/ ~/archiveloop > /root/bin/archiveloop rm ~/archiveloop chmod +x /root/bin/archiveloop pushd /root/bin -wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archive-teslacam-clips +wget https://raw.githubusercontent.com/cimryan/teslausb/u/cimryan/music/windows_archive/archive-teslacam-clips chmod +x archive-teslacam-clips popd @@ -87,9 +100,20 @@ EOF cat ~/rc.local > /etc/rc.local rm ~/rc.local -pushd /etc/modprobe.d -wget https://raw.githubusercontent.com/cimryan/teslausb/master/g_mass_storage.conf -popd +cam_disk_size="$(( $available_space * $campercent / 100 ))" +cam_disk_file_name="/cam_disk.bin" +add_drive "cam" "CAM" "$cam_disk_size" "$cam_disk_file_name" + +if [ "$campercent" -lt 100 ] +then + musicpercent=$$(( 100 - $campercent )) + music_disk_size="$(( $available_space * $musicpercent / 100 ))" + music_disk_file_name="/music_disk.bin" + add_drive "music" "MUSIC" "$music_disk_size" "$music_disk_file_name" + echo "options g_mass_storage file=$cam_disk_file_name,$music_disk_file_name removable=1,1 ro=0,0 stall=0 iSerialNumber=123456" > /etc/modprobe.d/g_mass_storage.conf +else + echo "options g_mass_storage file=$cam_disk_file_name removable=1 ro=0 stall=0 iSerialNumber=123456" > /etc/modprobe.d/g_mass_storage.conf +fi cp /etc/hosts ~ sed s/raspberrypi/teslausb/g ~/hosts > /etc/hosts From d0a1212ca6219a4312cc8a82cbf8ef3e515192db Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 19:04:09 -0700 Subject: [PATCH 23/28] Fix syntax error in the calculation of musicpercent. --- windows_archive/setup-teslausb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index 80ce1eb..bd7c93e 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -44,13 +44,13 @@ function add_drive () { local name="$1" local label="$2" local size="$3" - + local filename="$4" fallocate -l "$size"K "$filename" mkfs.vfat "$filename" -F 32 -n "$label" local mountpoint=/mnt/"$name" - + mkdir "$mountpoint" echo "$filename $mountpoint vfat noauto,users,umask=000 0 0" >> /etc/fstab } @@ -106,7 +106,7 @@ add_drive "cam" "CAM" "$cam_disk_size" "$cam_disk_file_name" if [ "$campercent" -lt 100 ] then - musicpercent=$$(( 100 - $campercent )) + musicpercent="$(( 100 - $campercent ))" music_disk_size="$(( $available_space * $musicpercent / 100 ))" music_disk_file_name="/music_disk.bin" add_drive "music" "MUSIC" "$music_disk_size" "$music_disk_file_name" @@ -119,4 +119,4 @@ cp /etc/hosts ~ sed s/raspberrypi/teslausb/g ~/hosts > /etc/hosts cp /etc/hostname ~ -sed s/raspberrypi/teslausb/g ~/hostname > /etc/hostname +sed s/raspberrypi/teslausb/g ~/hostname > /etc/hostname \ No newline at end of file From 10dfaa439ebd80512571c6841d23ed810a41cf17 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 19:04:50 -0700 Subject: [PATCH 24/28] Fix typo for campercent and add note about case-sensitivity in SSID. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1d749f5..5707d25 100644 --- a/README.md +++ b/README.md @@ -94,15 +94,15 @@ If you don't have a keyboard/HDMI setup to boot the Pi and edit/transfer files d ### Get the scripts onto the Pi Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. -1. Enter the following command. +1. Enter the following commands: ``` sudo -i nano /etc/wpa_supplicant/wpa_supplicant.conf ``` -1. Add this block to the bottom of the file specifying the actual SSID of your network and your actual PSK, keeping the quotes around both values. +1. Add this block to the bottom of the file specifying the actual SSID of your network and your actual PSK, keeping the quotes around both values. Note that the SSID may be case-sensitive on your network. ``` network={ - ssid="NETWORK" + ssid="SSID" psk="PASSWORD" } ``` @@ -132,7 +132,7 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. export sharename=SailfishCam export shareuser=sailfish export sharepassword=pa$$w0rd - epxort campercent=100 + export campercent=100 ``` 1. Run these commands: ``` From d39d08a738a16911184735b38a82b1c3d47d98a2 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 20:50:34 -0700 Subject: [PATCH 25/28] Mount the archive and move the files into it. --- windows_archive/archive-teslacam-clips | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows_archive/archive-teslacam-clips b/windows_archive/archive-teslacam-clips index 1df2f9c..063c7d0 100644 --- a/windows_archive/archive-teslacam-clips +++ b/windows_archive/archive-teslacam-clips @@ -74,7 +74,7 @@ function move_clips_to_archive () { for file_name in "$CAM_MOUNT"/TeslaCam/saved*; do [ -e "$file_name" ] || continue log "Moving $file_name ..." - mv -- "$file_name" "$CAM_MOUNT" >> "$LOG_FILE" 2>&1 || echo "" + mv -- "$file_name" "$ARCHIVE_MOUNT" >> "$LOG_FILE" 2>&1 || echo "" log "Moved $file_name." done log "Finished moving clips to archive." @@ -94,7 +94,7 @@ function fix_errors_on_cam_drive () { function ensure_archive_is_mounted () { log "Ensuring cam archive is mounted..." - ensure_mountpoint_is_mounted_with_retry "$CAM_MOUNT" + ensure_mountpoint_is_mounted_with_retry "$ARCHIVE_MOUNT" log "Ensured cam archive is mounted." } From 98cecb4cbfa0692495a742b3bb4b74bbf7c90622 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 20:55:18 -0700 Subject: [PATCH 26/28] Reference master after merge. --- README.md | 2 +- windows_archive/setup-teslausb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5707d25..c105a54 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. ``` 1. Run these commands: ``` - wget https://raw.githubusercontent.com/cimryan/teslausb/u/cimryan/music/windows_archive/setup-teslausb + wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/setup-teslausb chmod +x setup-teslausb ./setup-teslausb ``` diff --git a/windows_archive/setup-teslausb b/windows_archive/setup-teslausb index bd7c93e..4e40a1b 100644 --- a/windows_archive/setup-teslausb +++ b/windows_archive/setup-teslausb @@ -71,13 +71,13 @@ echo "password=$sharepassword" >> /root/.teslaCamArchiveCredentials mkdir /root/bin -wget https://raw.githubusercontent.com/cimryan/teslausb/u/cimryan/music/windows_archive/archiveloop +wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archiveloop sed s/ARCHIVE_HOST_NAME=archiveserver/ARCHIVE_HOST_NAME=$archiveserver/ ~/archiveloop > /root/bin/archiveloop rm ~/archiveloop chmod +x /root/bin/archiveloop pushd /root/bin -wget https://raw.githubusercontent.com/cimryan/teslausb/u/cimryan/music/windows_archive/archive-teslacam-clips +wget https://raw.githubusercontent.com/cimryan/teslausb/master/windows_archive/archive-teslacam-clips chmod +x archive-teslacam-clips popd From 0b8bafeb764596fa0afc3c52685d6a83421e9871 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 22:44:18 -0700 Subject: [PATCH 27/28] Removed disclaimer, added notes about music support --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c105a54..43f3f43 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Meta This repo contains steps and scripts originally from [this thread on Reddit]( https://www.reddit.com/r/teslamotors/comments/9m9gyk/build_a_smart_usb_drive_for_your_tesla_dash_cam/) - Many people in that thread suggested that the scripts be hosted on Github but the author didn't seem interested in making that happen. I've hosted the scripts here with his/her permission. +Many people in that thread suggested that the scripts be hosted on Github but the author didn't seem interested in making that happen. I've hosted the scripts here with his/her permission. The original post on Reddit assumed that the archive would be hosted on Windows and that the Pi would be set up using a Windows machine but this Git repo welcomes the contribution of instructions for other platforms. @@ -21,7 +21,7 @@ You can configure a Raspberry Pi Zero W so that your Tesla thinks it's a USB dri 1. Wait until it can't connect to the archive server 1. GOTO 1. -Disclaimer: It hasn't been confirmed that this solution will work with v9 of the Tesla software. It has been verified that when files are present in the TeslaCam directory they are archived to a server when the car gets back on the wireless network. +The scripts in this repo will also allow you to use the Pi to store music that the Tesla can read through the USB interface. ## Prerequisites @@ -147,6 +147,8 @@ Now that you have a shell on the Pi you can turn the Pi into a smart USB drive. ### Get the Pi set up for your Tesla. If you set up the Pi with a keyboard and a monitor disconnect it and connect it to a PC. If you're using a cable be sure to use the port labeled "usb" on the circuitboard. 1. Wait for the Pi to show up on the PC as a USB drive. -1. Create a directory named TeslaCam at the root of the drive. -1. Eject the drive. -1. Plug the Drive into your Tesla. +1. Create a directory named TeslaCam at the root of the drive labeled CAM. +1. Copy any music you'd like to the drive labeled MUSIC. +1. Eject the drives. +1. Unplug the Pi from the PC. +1. Plug the Pi into your Tesla. From 78128464ab03f49ab9e004d2f379d8a9816fc144 Mon Sep 17 00:00:00 2001 From: cimryan Date: Sat, 13 Oct 2018 22:47:44 -0700 Subject: [PATCH 28/28] Moved TODO/Asks items to issues --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 43f3f43..b88d08b 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,6 @@ Many people in that thread suggested that the scripts be hosted on Github but th The original post on Reddit assumed that the archive would be hosted on Windows and that the Pi would be set up using a Windows machine but this Git repo welcomes the contribution of instructions for other platforms. -TODO/Asks - -* Script to make this easy to get going. Ideally supports multiple targets (see further TODO/Asks) -* Copy to AWS S3 / Google Drive / Etc -* Copy to SSH/SFTP - ## Intro You can configure a Raspberry Pi Zero W so that your Tesla thinks it's a USB drive and will write dashcam footage to it. Since it's a computer, you can run scripts on the Pi to automatically copy the clips to an archive server when you get home. The Pi is going to continually: