mirror of
https://github.com/cimryan/teslausb.git
synced 2026-03-01 04:30:33 +00:00
Merge branch 'u/rtgoodwin/headless-patch' into headless-patch
This commit is contained in:
84
README.md
84
README.md
@@ -5,17 +5,12 @@ This repo contains steps and scripts originally from [this thread on Reddit]( ht
|
|||||||
|
|
||||||
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 (or a Mac using File Sharing, or Linux using Samba) but this Git repo welcomes the contribution of instructions for other platforms.
|
|
||||||
|
|
||||||
## Intro
|
## 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:
|
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:
|
||||||
1. Wait until it can connect to the archive server
|
* Scripts running on the Pi can automatically copy the clips to an archive server when you get home.
|
||||||
1. Archive the clips
|
* The Pi can hold both dashcam clips and music files.
|
||||||
1. Wait until it can't connect to the archive server
|
* The Pi can automatically repair filesystem corruption produced by the Tesla's current failure to properly dismount the USB drives before cutting power to the USB ports.
|
||||||
1. GOTO 1.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Archiving the clips can take from seconds to hours depending on how many clips you've saved and how strong the WiFi signal is in your Tesla. If you find that the clips aren't getting completely transferred before the car powers down after you park or before you leave you can use the Tesla app to turn on the Climate control. This will send power to the Raspberry Pi, allowing it to complete the archival operation.
|
Archiving the clips can take from seconds to hours depending on how many clips you've saved and how strong the WiFi signal is in your Tesla. If you find that the clips aren't getting completely transferred before the car powers down after you park or before you leave you can use the Tesla app to turn on the Climate control. This will send power to the Raspberry Pi, allowing it to complete the archival operation.
|
||||||
|
|
||||||
@@ -24,14 +19,12 @@ Archiving the clips can take from seconds to hours depending on how many clips y
|
|||||||
### Assumptions
|
### Assumptions
|
||||||
* You park in range of your wireless network.
|
* You park in range of your wireless network.
|
||||||
* Your wireless network is configured with WPA2 PSK access.
|
* Your wireless network is configured with WPA2 PSK access.
|
||||||
* You'll be archiving your dashcam clips to a Windows machine (or a Mac using File Sharing, or Linux using Samba), and the Windows machine has a stable IP address on your home network.
|
|
||||||
* You'll be setting up the Raspberry Pi using a Windows machine, or Mac/Linux (a script is provided in the setup/macos_linux dir), or [the experimental flashable base image](https://github.com/cimryan/teslausb/tree/master/setup/headless_setup).
|
|
||||||
|
|
||||||
### Hardware
|
### Hardware
|
||||||
|
|
||||||
Required:
|
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/)
|
* [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.
|
> Note: Of the many varieties of Raspberry Pi avaiable 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 Micro SD card, at least 8 GB in size, and an adapter (if necessary) to connect the card to your computer.
|
||||||
* A mechanism to connect the Pi to the Tesla. Either:
|
* A mechanism to connect the Pi to the Tesla. Either:
|
||||||
@@ -44,74 +37,41 @@ Optional:
|
|||||||
|
|
||||||
### Software
|
### Software
|
||||||
Download [Raspbian Stretch Lite](https://www.raspberrypi.org/downloads/raspbian/)
|
Download [Raspbian Stretch Lite](https://www.raspberrypi.org/downloads/raspbian/)
|
||||||
* Note: Bittorrent is dramatically faster than direct download.
|
|
||||||
|
|
||||||
Download and install:
|
Download and install:
|
||||||
* [Etcher](http://etcher.io)
|
* [Etcher](http://etcher.io)
|
||||||
|
|
||||||
## Create your archive
|
|
||||||
### Hosting on Windows File Shares, macOS Sharing, or Samba on Linux
|
|
||||||
Set up a share 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.
|
|
||||||
* On Windows 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.
|
|
||||||
* On MacOS or Linux open a terminal and type ifconfig.
|
|
||||||
|
|
||||||
### Hosting via SFTP/rsync
|
|
||||||
**EXPERIMENTAL - Hosting the archive on SFTP hasn't been thoroughly tested**
|
|
||||||
|
|
||||||
Since sftp/rsync is accessing a computer through SSH, the only requirement for hosting an SFTP/rsync server is to have a box running Linux. An example can be another Raspberry Pi connected to your local network with a USB storage drive plugged in. The official Raspberry Pi site has a good example on [how to mount an external drive](https://www.raspberrypi.org/documentation/configuration/external-storage.md). You will need the username and host/IP of the storage server, as well as the path for the files to go in, and the storage server will need to allow SSH.
|
|
||||||
|
|
||||||
### ***TODO: Other hosting solutions***
|
|
||||||
|
|
||||||
## Set up the Raspberry Pi
|
## Set up the Raspberry Pi
|
||||||
There are three phases to setting up the Pi:
|
There are four phases to setting up the Pi:
|
||||||
1. Get the OS onto the micro sd card.
|
1. Get the OS onto the micro sd card.
|
||||||
1. Get a shell on the Pi.
|
1. Get a shell on the Pi.
|
||||||
|
1. Set up the archive for dashcam clips.
|
||||||
1. Set up the USB storage functionality.
|
1. Set up the USB storage functionality.
|
||||||
|
|
||||||
### Get the OS onto the micro SD card
|
### Get the OS onto the MicroSD card
|
||||||
|
|
||||||
[These instructions](https://www.raspberrypi.org/documentation/installation/installing-images/README.md) tell you how to get Raspbian onto your MicroSD card. Basically:
|
[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.
|
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.
|
2. Use Etcher to write the zip file you downloaded to the SD card.
|
||||||
> Note: you don't need to uncompress the zip file you downloaded.
|
> Note: you don't need to uncompress the zip file you downloaded.
|
||||||
|
|
||||||
### Get a shell on the Pi
|
### Get a shell on the Pi
|
||||||
If you used a Windows computer to flash the OS onto the MicroSD card, follow these [Instructions](doc/GetShellWithoutMonitorOnWindows.md).
|
Follow the instructions corresponding to the OS you used to flash the OS onto the MicroSD card:
|
||||||
|
* Windows: [Instructions](doc/GetShellWithoutMonitorOnWindows.md).
|
||||||
|
* MacOS or Linux: [Instructions](doc/GetShellWithoutMonitorOnLinux.md).
|
||||||
|
|
||||||
If you used a Mac or a Linux computer, follow these [Instructions](doc/GetShellWithoutMonitorOnLinux.md).
|
Whichever instructions you followed above will leave you in a command shell on the Pi. Use this shell for the rest of the steps in these instructions.
|
||||||
|
|
||||||
|
### Set up the archive for dashcam clips
|
||||||
|
Follow the instructions corresponding to the technology you'd like to use to host the archive for your dashcam clips. You must choose just one of these technoloies; don't follow more than one of these sets of instructions:
|
||||||
|
* Windows file share, MacOS Sharing, or Samba on Linux: [Instructions](doc/SetupShare.md).
|
||||||
|
* SFTP/rsync: [Instructions](doc/SetupRsync.md)
|
||||||
|
* **Experimental:** Google Drive, Amazon S3, DropBox, Microsoft OneDrive: [Instructions](doc/SetupRClone.md)
|
||||||
|
|
||||||
### Set up the USB storage functionality
|
### Set up the USB storage functionality
|
||||||
|
1. Indicate how much, as a percentage, of the drive you want to allocate to recording dashcam footage by running this command:
|
||||||
Now that you have Wifi up and running, it's time to set up the USB storage and scripts that will manage the dashcam and (optionally) music storage.
|
|
||||||
|
|
||||||
1. SSH to the Pi and run
|
|
||||||
```
|
|
||||||
sudo -i
|
|
||||||
```
|
|
||||||
1. Try to ping your archive server from the Pi. In this example the server is named `nautilus`.
|
|
||||||
```
|
|
||||||
ping -c 3 nautilus
|
|
||||||
```
|
|
||||||
1. If the server can't be reached, ping its 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. Determine how much, as a percentage, of the drive you want to allocate to recording dashcam footage by using:
|
|
||||||
```
|
```
|
||||||
export campercent=<number>
|
export campercent=<number>
|
||||||
```
|
```
|
||||||
For example, using `export campercent=100` would allocate 100% of the space to recording footage from your car, and would not create a separate music partition. `export campercent=50` would be only allocate half of the space for a dashcam footage drive, and allocates the other half to be a music storage drive.
|
For example, using `export campercent=100` would allocate 100% of the space to recording footage from your car, and would not create a separate music partition. `export campercent=50` would allocate half of the space for a dashcam footage drive and allocates the other half to for a music storage drive.
|
||||||
1. If you are trying to archive on an SFTP/rsync server, then follow these [instructions](doc/SetupRSync.md) and skip step 7. Otherwise, skip this step.
|
|
||||||
1. If you are trying to archive on a shared drive, run these commands, subsituting your values for your shared drive:
|
|
||||||
```
|
|
||||||
export archiveserver=Nautilus
|
|
||||||
export sharename=SailfishCam
|
|
||||||
export shareuser=sailfish
|
|
||||||
export sharepassword=pa$$w0rd
|
|
||||||
```
|
|
||||||
1. If you'd like to receive a text message when your Pi finishes archiving clips follow these [Instructions](doc/ConfigureNotificationsForArchive.md).
|
1. If you'd like to receive a text message when your Pi finishes archiving clips follow these [Instructions](doc/ConfigureNotificationsForArchive.md).
|
||||||
1. Run these commands:
|
1. Run these commands:
|
||||||
```
|
```
|
||||||
@@ -134,7 +94,7 @@ Connect the Pi to a computer. If you're using a cable be sure to use the port la
|
|||||||
1. Wait for the Pi to show up on the computer as a USB drive.
|
1. Wait for the Pi to show up on the computer as a USB drive.
|
||||||
1. Copy any music you'd like to the drive labeled MUSIC.
|
1. Copy any music you'd like to the drive labeled MUSIC.
|
||||||
1. Eject the drives.
|
1. Eject the drives.
|
||||||
1. Unplug the Pi from the PC.
|
1. Unplug the Pi from the computer.
|
||||||
1. Plug the Pi into your Tesla.
|
1. Plug the Pi into your Tesla.
|
||||||
|
|
||||||
## Making changes to the system after setup
|
## Making changes to the system after setup
|
||||||
|
|||||||
93
doc/SetupRClone.md
Normal file
93
doc/SetupRClone.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Introduction
|
||||||
|
|
||||||
|
This guide will show you how to install and configure [rclone4pi](https://github.com/pageauc/rclone4pi/wiki) (based off [rclone](https://rclone.org/)) to archive your saved TeslaCam footage on one of a number of different remote storage services including Google Drive, S3 and Dropbox.
|
||||||
|
|
||||||
|
You must perform these steps **after** getting a shell on the Pi and **before** running the `setup-teslacam` script on the Pi.
|
||||||
|
|
||||||
|
**Make sure to run all commands in these instructions in a single command shell as root. When you return to the [Main Instructions](/README.md) continue running the commands there in this same shell.** This is necessary because:
|
||||||
|
* The `archiveloop` script runs as root and the rclone config is bound to the user running the config.
|
||||||
|
* These commands define environment variables that the main setup scripts need.
|
||||||
|
|
||||||
|
# Quick guide
|
||||||
|
These instructions will speed you through the process with good defaults. If you encounter an error, or you want to use a different config name than `gdrive` or a different folder name than `TeslaCam`, follow the detailed instuctions, below.
|
||||||
|
|
||||||
|
1. Run these commands. Specify the config name `gdrive` when prompted for the config name.
|
||||||
|
```
|
||||||
|
sudo -i
|
||||||
|
curl -L https://raw.github.com/pageauc/rclone4pi/master/rclone-install.sh | bash
|
||||||
|
rclone config
|
||||||
|
```
|
||||||
|
1. Run these commands:
|
||||||
|
```
|
||||||
|
export RCLONE_ENABLE=true
|
||||||
|
export RCLONE_DRIVE=gdrive
|
||||||
|
export RCLONE_PATH=TeslaCam
|
||||||
|
|
||||||
|
rclone mkdir "$RCLONE_DRIVE:$RCLONE_PATH"
|
||||||
|
rclone lsd "$RCLONE_DRIVE":
|
||||||
|
```
|
||||||
|
1. If you didn't encounter any error messages and you see the `TeslaCam` directory listed return to the [Main Instructions](../README.md).
|
||||||
|
|
||||||
|
# Detailed instructions
|
||||||
|
## Step 1: Install rclone4pi
|
||||||
|
1. Run this command to enter a command shell for the root user.
|
||||||
|
```
|
||||||
|
sudo -i
|
||||||
|
```
|
||||||
|
2. Run the following command to install rclone4pi:
|
||||||
|
```
|
||||||
|
curl -L https://raw.github.com/pageauc/rclone4pi/master/rclone-install.sh | bash
|
||||||
|
```
|
||||||
|
Alternatively, you can install rclone4pi manually by following these [instructions] (https://github.com/pageauc/rclone4pi/wiki#manual-install).
|
||||||
|
|
||||||
|
# Step 2: Configure the archive
|
||||||
|
1. Run this command to configure an archive:
|
||||||
|
```
|
||||||
|
rclone config
|
||||||
|
```
|
||||||
|
This will launch an interactive setup with a series of questions. It is recommended that you look at the documentation for your storage system by going to [rclone](https://rclone.org/) and selecting your storage system from the pull down menu at the stop.
|
||||||
|
|
||||||
|
It has been confirmed that this process works with Google Drive using these [instructions](https://rclone.org/drive/). If you are using another storage system, please feel encouraged to create an "Issue" describing your challenges and/or your success.
|
||||||
|
|
||||||
|
If you are using Google Drive it is important to set the correct [scope](https://rclone.org/drive/#scopes). Carefully read the documentation on [scopes on rclone](https://rclone.org/drive/#scopes) as well as [Google Drive](https://developers.google.com/drive/api/v3/about-auth). The `drive.file` scope is recommended.
|
||||||
|
|
||||||
|
**Important:** During the `rclone config` process you will sepcify a name for the configuration. The rest of the document will assume the use of the name `gdrive`; replace this with your chosen configuration name.
|
||||||
|
|
||||||
|
1. Run this command:
|
||||||
|
```
|
||||||
|
export RCLONE_DRIVE="gdrive"
|
||||||
|
```
|
||||||
|
# Step 3: Verify and create storage directory
|
||||||
|
|
||||||
|
1. Run the following command to see the name of the remote drive you just created.
|
||||||
|
```
|
||||||
|
rclone listremotes
|
||||||
|
```
|
||||||
|
If you don't see the name there, something went wrong. Go back through the `rclone config` process.
|
||||||
|
1. Run this command:
|
||||||
|
```
|
||||||
|
rclone lsd "$RCLONE_DRIVE":
|
||||||
|
```
|
||||||
|
You should not see any files listed. If you do then you did not set your scope correctly during the `rclone config` process.
|
||||||
|
1. Choose the name of a folder to hold the archived clips. These instructions will assume you chose the name `TeslaCam`. Substitute the name you chose for this name. Run this command:
|
||||||
|
```
|
||||||
|
export RCLONE_PATH="TeslaCam"
|
||||||
|
```
|
||||||
|
1. Run the following command to create a folder which will hold the archived clips.
|
||||||
|
```
|
||||||
|
rclone mkdir "$RCLONE_DRIVE:TeslaCam"
|
||||||
|
```
|
||||||
|
1. Run this command again:
|
||||||
|
```
|
||||||
|
rclone lsd "RCLONE_DRIVE":
|
||||||
|
```
|
||||||
|
Confirm that the directory `TeslaCam` is present. If not, start over.
|
||||||
|
|
||||||
|
# Step 4: Exports
|
||||||
|
Run this command to cause the setup processes which you'll resume in the main instructions to use rclone4pi:
|
||||||
|
```
|
||||||
|
export RCLONE_ENABLE=true
|
||||||
|
```
|
||||||
|
**Note:** `RCLONE_ENABLE=true` is going to disable the default archive server. It also will **not** play nicely with `RSYNC_ENABLE=true` Perhaps future releases will allow both to be defined and function at the same time, for redundancy, but for now just pick one that you'll want the most.
|
||||||
|
|
||||||
|
Now return to the section "Set up the USB storage functionality" in the [main instructions](../README.md).
|
||||||
@@ -1,21 +1,33 @@
|
|||||||
# Introduction
|
# Introduction
|
||||||
This guide will show you how to utilize [rsync](https://rsync.samba.org/) to archive your saved TeslaCam footage on a remote storage server. In my case, I use this for a networked pi storage server.
|
This guide will show you how to use [rsync](https://rsync.samba.org/) to archive your saved TeslaCam footage on a remote storage server.
|
||||||
|
|
||||||
|
Since sftp/rsync accesses a computer through SSH the only requirement for hosting an SFTP/rsync server is to have a box running SSH. For example, you could use another Raspberry Pi connected to your local network with a USB storage drive plugged in. The official Raspberry Pi site has a good example on [how to mount an external drive](https://www.raspberrypi.org/documentation/configuration/external-storage.md).
|
||||||
|
|
||||||
|
You will need the username and host/IP of the storage server, as well as the path for the files to go in, and the storage server will need to allow SSH.
|
||||||
|
|
||||||
This guide makes the following assumptions:
|
This guide makes the following assumptions:
|
||||||
1. You are running your own ftp/rsync server that you have admin rights to, or can at least add a public key to its `~/.ssh/authorized_keys` file
|
* You are running your own ftp/rsync server that you have admin rights to, or can at least add a public key to its `~/.ssh/authorized_keys` file.
|
||||||
1. The ftp/rsync server has rsync installed (raspbian automatically does)
|
* The ftp/rsync server has rsync installed (raspbian automatically does)
|
||||||
2. You have **NOT** run the `setup-teslacam` script yet
|
|
||||||
# Step 1: Authentication
|
# Step 1: Authentication
|
||||||
Similar to sftp, rsync by default utilizes ssh to connect to a remote server and transfer files. This guide will use a generated ssh keypair, hence the first assumption above.
|
Similar to sftp, rsync by default uses ssh to connect to a remote server and transfer files. This guide will use a generated ssh keypair, hence the first assumption above.
|
||||||
|
|
||||||
1. On your teslausb pi, run `ssh-keygen` to generate an ssh key **for the ROOT user!** If you followed the previous steps, you should have already ran `sudo -i` to become the root user on the telsausb pi. If you didn't, run `sudo -i` and re-run `ssh-keygen`. You can be sure that it is generating for root if it asks to store the key in `/root/.ssh/` (versus something like `/home/pi/.ssh`).
|
1. Run these commands to to generate an ssh key for the `root` user:
|
||||||
|
```
|
||||||
|
sudo -i
|
||||||
|
ssh-keygen
|
||||||
|
```
|
||||||
|
|
||||||
1. Add the contents of the newly generated `/root/.ssh/id_rsa.pub` file from your teslausb pi to the storage server's `~/.ssh/authorized_keys` file. This will allow a nice and easy connection through rsync, no passwords needed!
|
1. Add the contents of the newly generated `/root/.ssh/id_rsa.pub` file from your teslausb pi to the storage server's `~/.ssh/authorized_keys` file. You can do this by connectin via ssh to the archive server from the computer you're using to set up the Pi, editing the `~/.ssh/authorized_keys` in nano, and pasting in the content of the `/root/.ssh/id_rsa.pub` file from the teslausb Pi.
|
||||||
|
|
||||||
1. Lastly, you will need to authorize the connection to the FTP/Rsync server and test that the key works, so try connecting to the server (through ssh), and **if it asks if you wish to continue connecting, make sure to type `yes`!** If you do not do this, rsync will fail to connect and thus fail to archive your clips.
|
1. Lastly, you will need to authorize the connection to the FTP/Rsync server and test that the key works, so try connecting to the server (through ssh), and **when you are asked if you wish to continue connecting type `yes`**
|
||||||
|
```
|
||||||
|
ssh user@archiveserver
|
||||||
|
```
|
||||||
|
If you do not do this then rsync will fail to connect and thus fail to archive your clips.
|
||||||
|
|
||||||
# Step 2: Exports
|
# Step 2: Exports
|
||||||
To be able to configure the teslausb pi use rsync, you'll need to export a few things. On your teslausb pi, run:
|
Run this command to cause the setup processes which you'll resume in the main instructions to use rsync:
|
||||||
|
|
||||||
```
|
```
|
||||||
export RSYNC_ENABLE=true
|
export RSYNC_ENABLE=true
|
||||||
@@ -23,21 +35,17 @@ export RSYNC_USER=<ftp username>
|
|||||||
export RSYNC_SERVER=<ftp IP/host>
|
export RSYNC_SERVER=<ftp IP/host>
|
||||||
export RSYNC_PATH=<destination path to save in>
|
export RSYNC_PATH=<destination path to save in>
|
||||||
```
|
```
|
||||||
|
|
||||||
Explanations for each:
|
Explanations for each:
|
||||||
* `RSYNC_ENABLE`: `true` for enabling rsync
|
* `RSYNC_ENABLE`: `true` for enabling rsync
|
||||||
* `RSYNC_USER`: The user on the FTP server
|
* `RSYNC_USER`: The user on the FTP server
|
||||||
* `RSYNC_SERVER`: The IP address/hostname of the destination machine
|
* `RSYNC_SERVER`: The IP address/hostname of the destination machine
|
||||||
* `RSYNC_PATH`: The path on the destination machine where the files will be saved
|
* `RSYNC_PATH`: The path on the destination machine where the files will be saved
|
||||||
|
|
||||||
An example (of my) config is listed below:
|
An example config is below:
|
||||||
|
|
||||||
```
|
```
|
||||||
export RSYNC_ENABLE=true
|
export RSYNC_ENABLE=true
|
||||||
export RSYNC_USER=pi
|
export RSYNC_USER=pi
|
||||||
export RSYNC_SERVER=192.168.1.254
|
export RSYNC_SERVER=192.168.1.254
|
||||||
export RSYNC_PATH=/mnt/PIHDD/TeslaCam/
|
export RSYNC_PATH=/mnt/PIHDD/TeslaCam/
|
||||||
```
|
```
|
||||||
***Note: RSYNC_ENABLE=true is going to disable the default archive server. Perhaps future releases will allow both to be defined and function at the same time, for redundancy, but for now just pick one that you'll want the most.***
|
Now return to the section "Set up the USB storage functionality" in the [main instructions](../README.md).
|
||||||
|
|
||||||
You should be ready to run the setup script now, so return back to step 8 of the [Main Instructions](README.md).
|
|
||||||
32
doc/SetupShare.md
Normal file
32
doc/SetupShare.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Hosting the archive on Windows File Shares, MacOS Sharing, or Samba on Linux
|
||||||
|
Set up a share to host the archive on a computer on your home network. 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".
|
||||||
|
|
||||||
|
Now, on the Pi:
|
||||||
|
1. Try to ping your archive server from the Pi. In this example the server is named `nautilus`.
|
||||||
|
```
|
||||||
|
ping -c 3 nautilus
|
||||||
|
```
|
||||||
|
1. If the server can't be reached, ping its IP address (These instructions will assume that the IP address of the archive server is `192.168.0.41`.):
|
||||||
|
```
|
||||||
|
ping 192.168.0.41
|
||||||
|
```
|
||||||
|
To get the IP address of the archive machine:
|
||||||
|
* On Windows: Open a PowerShell session and type `ipconfig`. Get the IP address from the line labeled "IPv4 Address".
|
||||||
|
* On MacOS or Linux open a terminal and type ifconfig.
|
||||||
|
|
||||||
|
If you can't ping the archive server by IP address from the Pi, go do whatever you need to on your network to fix that.
|
||||||
|
|
||||||
|
If you can't reach the archive server by name but you can by IP address then use its IP address, below, for the `archiveserver` variable.
|
||||||
|
|
||||||
|
1. Run these commands, subsituting your values:
|
||||||
|
```
|
||||||
|
sudo -i
|
||||||
|
export archiveserver="Nautilus"
|
||||||
|
export sharename="SailfishCam"
|
||||||
|
export shareuser="sailfish"
|
||||||
|
export sharepassword="pa$$w0rd"
|
||||||
|
```
|
||||||
|
|
||||||
|
Now return to the section "Set up the USB storage functionality" in the [main instructions](/README.md).
|
||||||
20
run/rclone_archive/archive-clips.sh
Normal file
20
run/rclone_archive/archive-clips.sh
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash -eu
|
||||||
|
|
||||||
|
log "Moving clips to rclone archive..."
|
||||||
|
|
||||||
|
source /root/.teslaCamRcloneConfig
|
||||||
|
|
||||||
|
NUM_FILES_MOVED=0
|
||||||
|
|
||||||
|
for file_name in "$CAM_MOUNT"/TeslaCam/saved*; do
|
||||||
|
[ -e "$file_name" ] || continue
|
||||||
|
log "Moving $file_name ..."
|
||||||
|
rclone --config /root/.config/rclone/rclone.conf move "$file_name" "$drive:$path" >> "$LOG_FILE" 2>&1 || echo ""
|
||||||
|
log "Moved $file_name."
|
||||||
|
NUM_FILES_MOVED=$((NUM_FILES_MOVED + 1))
|
||||||
|
done
|
||||||
|
log "Moved $NUM_FILES_MOVED file(s)."
|
||||||
|
|
||||||
|
/root/bin/send-pushover "$NUM_FILES_MOVED"
|
||||||
|
|
||||||
|
log "Finished moving clips to rclone archive"
|
||||||
10
run/rclone_archive/configure-archive.sh
Normal file
10
run/rclone_archive/configure-archive.sh
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash -eu
|
||||||
|
|
||||||
|
function configure_archive () {
|
||||||
|
echo "Configuring the archive for Rclone..."
|
||||||
|
|
||||||
|
echo "drive=$RCLONE_DRIVE" > /root/.teslaCamRcloneConfig
|
||||||
|
echo "path=$RCLONE_PATH" >> /root/.teslaCamRcloneConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_archive
|
||||||
2
run/rclone_archive/connect-archive.sh
Normal file
2
run/rclone_archive/connect-archive.sh
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash -eu
|
||||||
|
# Nothing to do.
|
||||||
2
run/rclone_archive/disconnect-archive.sh
Normal file
2
run/rclone_archive/disconnect-archive.sh
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash -eu
|
||||||
|
# Nothing to do.
|
||||||
1
run/rclone_archive/verify-archive-configuration.sh
Normal file
1
run/rclone_archive/verify-archive-configuration.sh
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#!/bin/bash -eu
|
||||||
@@ -1,16 +1,27 @@
|
|||||||
#!/bin/bash -eu
|
#!/bin/bash -eu
|
||||||
|
|
||||||
BACKINGFILES_MOUNTPOINT="$1"
|
BACKINGFILES_MOUNTPOINT="$1"
|
||||||
|
MUTABLE_MOUNTPOINT="$2"
|
||||||
PARTITION_TABLE=$(parted -m /dev/mmcblk0 unit s print)
|
|
||||||
ROOT_PARTITION_LINE=$(echo "$PARTITION_TABLE" | grep -e "^2:")
|
|
||||||
LAST_ROOT_PARTITION_SECTOR=$(echo "$ROOT_PARTITION_LINE" | sed 's/s//g' | cut -d ":" -f 3)
|
|
||||||
|
|
||||||
FIRST_BACKINGFILES_PARTITION_SECTOR=$(( $LAST_ROOT_PARTITION_SECTOR + 1 ))
|
PARTITION_TABLE=$(parted -m /dev/mmcblk0 unit B print)
|
||||||
|
DISK_LINE=$(echo "$PARTITION_TABLE" | grep -e "^/dev/mmcblk0:")
|
||||||
|
DISK_SIZE=$(echo "$DISK_LINE" | cut -d ":" -f 2 | sed 's/B//' )
|
||||||
|
|
||||||
|
ROOT_PARTITION_LINE=$(echo "$PARTITION_TABLE" | grep -e "^2:")
|
||||||
|
LAST_ROOT_PARTITION_BYTE=$(echo "$ROOT_PARTITION_LINE" | sed 's/B//g' | cut -d ":" -f 3)
|
||||||
|
|
||||||
|
FIRST_BACKINGFILES_PARTITION_BYTE="$(( $LAST_ROOT_PARTITION_BYTE + 1 ))"
|
||||||
|
LAST_BACKINGFILES_PARTITION_DESIRED_BYTE="$(( $DISK_SIZE - (100 * (2 ** 20)) - 1))"
|
||||||
|
|
||||||
ORIGINAL_DISK_IDENTIFIER=$( fdisk -l /dev/mmcblk0 | grep -e "^Disk identifier" | sed "s/Disk identifier: 0x//" )
|
ORIGINAL_DISK_IDENTIFIER=$( fdisk -l /dev/mmcblk0 | grep -e "^Disk identifier" | sed "s/Disk identifier: 0x//" )
|
||||||
|
|
||||||
parted -m /dev/mmcblk0 u s mkpart primary ext4 "$FIRST_BACKINGFILES_PARTITION_SECTOR" 100%
|
BACKINGFILES_PARTITION_END_SPEC="$(( $LAST_BACKINGFILES_PARTITION_DESIRED_BYTE / 1000000 ))M"
|
||||||
|
parted -a optimal -m /dev/mmcblk0 unit B mkpart primary ext4 "$FIRST_BACKINGFILES_PARTITION_BYTE" "$BACKINGFILES_PARTITION_END_SPEC"
|
||||||
|
|
||||||
|
LAST_BACKINGFILES_PARTITION_BYTE=$(parted -m /dev/mmcblk0 unit B print | grep -e "^3:" | cut -d ":" -f 3 | sed 's/B//g' )
|
||||||
|
|
||||||
|
MUTABLE_PARTITION_START_SPEC="$(( $LAST_BACKINGFILES_PARTITION_BYTE / 1000000 ))M"
|
||||||
|
parted -a optimal -m /dev/mmcblk0 unit B mkpart primary ext4 "$MUTABLE_PARTITION_START_SPEC" 100%
|
||||||
|
|
||||||
NEW_DISK_IDENTIFIER=$( fdisk -l /dev/mmcblk0 | grep -e "^Disk identifier" | sed "s/Disk identifier: 0x//" )
|
NEW_DISK_IDENTIFIER=$( fdisk -l /dev/mmcblk0 | grep -e "^Disk identifier" | sed "s/Disk identifier: 0x//" )
|
||||||
|
|
||||||
@@ -18,5 +29,7 @@ sed -i "s/${ORIGINAL_DISK_IDENTIFIER}/${NEW_DISK_IDENTIFIER}/g" /etc/fstab
|
|||||||
sed -i "s/${ORIGINAL_DISK_IDENTIFIER}/${NEW_DISK_IDENTIFIER}/" /boot/cmdline.txt
|
sed -i "s/${ORIGINAL_DISK_IDENTIFIER}/${NEW_DISK_IDENTIFIER}/" /boot/cmdline.txt
|
||||||
|
|
||||||
mkfs.ext4 -F /dev/mmcblk0p3
|
mkfs.ext4 -F /dev/mmcblk0p3
|
||||||
|
mkfs.ext4 -F /dev/mmcblk0p4
|
||||||
|
|
||||||
echo "/dev/mmcblk0p3 $BACKINGFILES_MOUNTPOINT ext4 auto,rw,noatime 0 2" >> /etc/fstab
|
echo "/dev/mmcblk0p3 $BACKINGFILES_MOUNTPOINT ext4 auto,rw,noatime 0 2" >> /etc/fstab
|
||||||
|
echo "/dev/mmcblk0p4 $MUTABLE_MOUNTPOINT ext4 auto,rw 0 2" >> /etc/fstab
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ then
|
|||||||
MUSIC_DISK_SIZE="$(df --output=avail --block-size=1K $BACKINGFILES_MOUNTPOINT/ | tail -n 1)"
|
MUSIC_DISK_SIZE="$(df --output=avail --block-size=1K $BACKINGFILES_MOUNTPOINT/ | tail -n 1)"
|
||||||
MUSIC_DISK_FILE_NAME="$BACKINGFILES_MOUNTPOINT/music_disk.bin"
|
MUSIC_DISK_FILE_NAME="$BACKINGFILES_MOUNTPOINT/music_disk.bin"
|
||||||
add_drive "music" "MUSIC" "$MUSIC_DISK_SIZE" "$MUSIC_DISK_FILE_NAME"
|
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" > "$G_MASS_STORAGE_CONF_FILE_NAME"
|
echo "options g_mass_storage file=$MUSIC_DISK_FILE_NAME,$CAM_DISK_FILE_NAME removable=1,1 ro=0,0 stall=0 iSerialNumber=123456" > "$G_MASS_STORAGE_CONF_FILE_NAME"
|
||||||
else
|
else
|
||||||
echo "options g_mass_storage file=$CAM_DISK_FILE_NAME removable=1 ro=0 stall=0 iSerialNumber=123456" > "$G_MASS_STORAGE_CONF_FILE_NAME"
|
echo "options g_mass_storage file=$CAM_DISK_FILE_NAME removable=1 ro=0 stall=0 iSerialNumber=123456" > "$G_MASS_STORAGE_CONF_FILE_NAME"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ function append_cmdline_txt_param() {
|
|||||||
echo "Updating package index files..."
|
echo "Updating package index files..."
|
||||||
apt-get update
|
apt-get update
|
||||||
echo "Removing unwanted packages..."
|
echo "Removing unwanted packages..."
|
||||||
apt-get remove -y --force-yes --purge triggerhappy logrotate dphys-swapfile fake-hwclock
|
apt-get remove -y --force-yes --purge triggerhappy logrotate dphys-swapfile
|
||||||
apt-get -y --force-yes autoremove --purge
|
apt-get -y --force-yes autoremove --purge
|
||||||
# Replace log management with busybox (use logread if needed)
|
# Replace log management with busybox (use logread if needed)
|
||||||
echo "Installing ntp and busybox-syslogd..."
|
echo "Installing ntp and busybox-syslogd..."
|
||||||
@@ -22,6 +22,37 @@ append_cmdline_txt_param fastboot
|
|||||||
append_cmdline_txt_param noswap
|
append_cmdline_txt_param noswap
|
||||||
append_cmdline_txt_param ro
|
append_cmdline_txt_param ro
|
||||||
|
|
||||||
|
# Move fake-hwclock.data to /mutable directory so it can be updated
|
||||||
|
if ! findmnt --mountpoint /mutable
|
||||||
|
then
|
||||||
|
echo "Mounting the multable partition..."
|
||||||
|
mount /mutable
|
||||||
|
echo "Mounted."
|
||||||
|
fi
|
||||||
|
if [ ! -e "/mutable/etc" ]
|
||||||
|
then
|
||||||
|
mkdir -p /mutable/etc
|
||||||
|
fi
|
||||||
|
if [ -e "/etc/fake-hwclock.data" ]
|
||||||
|
then
|
||||||
|
echo "Moving fake-hwclock data"
|
||||||
|
cp /etc/fake-hwclock.data /mutable/etc/fake-hwclock.data
|
||||||
|
rm /etc/fake-hwclock.data
|
||||||
|
ln -s /mutable/etc/fake-hwclock.data /etc/fake-hwclock.data
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Move rclone configs if it exists so we can write to it
|
||||||
|
if [ ! -e "/mutable/configs" ]
|
||||||
|
then
|
||||||
|
mkdir -p /mutable/configs
|
||||||
|
fi
|
||||||
|
if [ -e "/root/.config/rclone/rclone.conf" ]
|
||||||
|
then
|
||||||
|
echo "Moving rclone configs"
|
||||||
|
mv /root/.config/rclone /mutable/configs
|
||||||
|
ln -s /mutable/configs/rclone /root/.config/rclone
|
||||||
|
fi
|
||||||
|
|
||||||
# Move /var/spool to /tmp
|
# Move /var/spool to /tmp
|
||||||
rm -rf /var/spool
|
rm -rf /var/spool
|
||||||
ln -s /tmp /var/spool
|
ln -s /tmp /var/spool
|
||||||
|
|||||||
@@ -154,6 +154,7 @@ function fix_cmdline_txt_modules_load ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
BACKINGFILES_MOUNTPOINT=/backingfiles
|
BACKINGFILES_MOUNTPOINT=/backingfiles
|
||||||
|
MUTABLE_MOUNTPOINT=/mutable
|
||||||
|
|
||||||
function create_usb_drive_backing_files () {
|
function create_usb_drive_backing_files () {
|
||||||
if [ ! -e "$BACKINGFILES_MOUNTPOINT" ]
|
if [ ! -e "$BACKINGFILES_MOUNTPOINT" ]
|
||||||
@@ -161,9 +162,14 @@ function create_usb_drive_backing_files () {
|
|||||||
mkdir "$BACKINGFILES_MOUNTPOINT"
|
mkdir "$BACKINGFILES_MOUNTPOINT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -e "$MUTABLE_MOUNTPOINT" ]
|
||||||
|
then
|
||||||
|
mkdir "$MUTABLE_MOUNTPOINT"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -e /dev/mmcblk0p3 ]
|
if [ ! -e /dev/mmcblk0p3 ]
|
||||||
then
|
then
|
||||||
/tmp/create-backingfiles-partition.sh "$BACKINGFILES_MOUNTPOINT"
|
/tmp/create-backingfiles-partition.sh "$BACKINGFILES_MOUNTPOINT" "$MUTABLE_MOUNTPOINT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! findmnt --mountpoint $BACKINGFILES_MOUNTPOINT
|
if ! findmnt --mountpoint $BACKINGFILES_MOUNTPOINT
|
||||||
@@ -190,6 +196,11 @@ function configure_archive_scripts () {
|
|||||||
get_script /root/bin archive-clips.sh run/rsync_archive
|
get_script /root/bin archive-clips.sh run/rsync_archive
|
||||||
get_script /root/bin connect-archive.sh run/rsync_archive
|
get_script /root/bin connect-archive.sh run/rsync_archive
|
||||||
get_script /root/bin disconnect-archive.sh run/rsync_archive
|
get_script /root/bin disconnect-archive.sh run/rsync_archive
|
||||||
|
elif [ $RCLONE_ENABLE = true ]
|
||||||
|
then
|
||||||
|
get_script /root/bin archive-clips.sh run/rclone_archive
|
||||||
|
get_script /root/bin connect-archive.sh run/rclone_archive
|
||||||
|
get_script /root/bin disconnect-archive.sh run/rclone_archive
|
||||||
else
|
else
|
||||||
get_script /root/bin archive-clips.sh run/cifs_archive
|
get_script /root/bin archive-clips.sh run/cifs_archive
|
||||||
get_script /root/bin connect-archive.sh run/cifs_archive
|
get_script /root/bin connect-archive.sh run/cifs_archive
|
||||||
@@ -264,6 +275,7 @@ headless_setup_progress_flash 1
|
|||||||
setup_progress "Verifying environment variables..."
|
setup_progress "Verifying environment variables..."
|
||||||
|
|
||||||
RSYNC_ENABLE="${RSYNC_ENABLE:-false}"
|
RSYNC_ENABLE="${RSYNC_ENABLE:-false}"
|
||||||
|
RCLONE_ENABLE="${RCLONE_ENABLE:-false}"
|
||||||
|
|
||||||
if [ "$RSYNC_ENABLE" = true ]
|
if [ "$RSYNC_ENABLE" = true ]
|
||||||
then
|
then
|
||||||
@@ -271,6 +283,12 @@ then
|
|||||||
check_variable "RSYNC_SERVER"
|
check_variable "RSYNC_SERVER"
|
||||||
export archiveserver="$RSYNC_SERVER"
|
export archiveserver="$RSYNC_SERVER"
|
||||||
check_variable "RSYNC_PATH"
|
check_variable "RSYNC_PATH"
|
||||||
|
elif [ "$RCLONE_ENABLE" = true ]
|
||||||
|
then
|
||||||
|
check_variable "RCLONE_DRIVE"
|
||||||
|
check_variable "RCLONE_PATH"
|
||||||
|
# since it's a cloud hosted drive we'll just set this to google dns
|
||||||
|
export archiveserver="8.8.8.8"
|
||||||
else # Else for now, TODO allow both for more redundancy?
|
else # Else for now, TODO allow both for more redundancy?
|
||||||
check_variable "sharename"
|
check_variable "sharename"
|
||||||
check_variable "shareuser"
|
check_variable "shareuser"
|
||||||
@@ -298,6 +316,10 @@ if [ "$RSYNC_ENABLE" = true ]
|
|||||||
then
|
then
|
||||||
get_script /root/bin verify-archive-configuration.sh run/rsync_archive
|
get_script /root/bin verify-archive-configuration.sh run/rsync_archive
|
||||||
get_script /root/bin configure-archive.sh run/rsync_archive
|
get_script /root/bin configure-archive.sh run/rsync_archive
|
||||||
|
elif [ "$RCLONE_ENABLE" = true ]
|
||||||
|
then
|
||||||
|
get_script /root/bin verify-archive-configuration.sh run/rclone_archive
|
||||||
|
get_script /root/bin configure-archive.sh run/rclone_archive
|
||||||
else
|
else
|
||||||
get_script /root/bin verify-archive-configuration.sh run/cifs_archive
|
get_script /root/bin verify-archive-configuration.sh run/cifs_archive
|
||||||
get_script /root/bin configure-archive.sh run/cifs_archive
|
get_script /root/bin configure-archive.sh run/cifs_archive
|
||||||
|
|||||||
Reference in New Issue
Block a user