Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 0 additions & 70 deletions Gopkg.lock

This file was deleted.

38 changes: 0 additions & 38 deletions Gopkg.toml

This file was deleted.

9 changes: 3 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
GOARGS=GOOS=linux GOARCH=arm CGO_ENABLED=0

.PHONY: build
build:
GOOS=linux GOARCH=arm CGO_ENABLED=0 go build -o ./root/usr/local/bin/cctv_upload ./cmd/cctv_upload

.PHONY: install
install:
go get -u github.com/golang/dep/cmd/dep
dep ensure -v
@cd ./uploader \
&& $(GOARGS) go build -o ../root/usr/local/bin/uploader .
63 changes: 28 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,26 +40,15 @@ be helpful for that.

A USB webcam is used for this project. Any USB camera should do, I'm using a [Logitech C920 Webcam](https://www.amazon.com/gp/product/B006JH8T3S).

## Golang

You'll need a working Go environment on your local machine to build the code.

* Go v1.11
* [dep](https://github.com/golang/dep)

# Device Setup

## Install dependencies


```
sudo apt-get update
ssh pi@raspberrypi.local

# usb camera support
sudo apt-get install fswebcam

# Install motion
sudo apt-get install motion
# usb camera support and motion
sudo apt-get update -y && sudo apt-get install -y fswebcam motion
```

Test the camera with `fswebcam`
Expand All @@ -77,8 +66,8 @@ Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image.jpg'.
```
Now we know our webcam is at `/dev/video0`. If you look at `image.jpg` you'll see the picture it took.

Now we know our webcam is at `/dev/video0`. If you look at `image.jpg` you'll see the picture it took.

## Configure motion

Expand Down Expand Up @@ -125,7 +114,7 @@ to AWS S3 and notifying a Slack channel.
"Version": "2012-10-17",
"Statement": [
{
"Sid": "cctv_upload",
"Sid": "securitycamera",
"Effect": "Allow",
"Action": [
"s3:PutObject",
Expand All @@ -144,36 +133,38 @@ to AWS S3 and notifying a Slack channel.

# Uploading images

Edit the `on_picture_save` script with your AWS and Slack secrets:
```
# ./root/usr/local/bin/on_picture_save
When motion is detected a new image is created and the `on_picture_save` script is invoked. This calls the `uploader` which uploads the image to S3. Download the [latest release](https://github.com/bndw/security-camera/releases/latest) of the uploader and save it in `./root/usr/local/bin/uploader`.

SLACK_WEBHOOK_URL=https://hooks.slack.com/services/your/slack/webhook
S3_BUCKET_NAME=my-bucket-name
S3_BUCKET_REGION=us-west-2
AWS_ACCESS_KEY=xxx
AWS_SECRET_KEY=xxxxx
Or, build from source if you have Go 1.13 or later:
```
make build
```

Build the [cctv_upload](./cmd/cctv_upload) program that ties the system together.
It's called by the `on_picture_save` script when a new image is created.
The program uploads the image to S3 and then sends a webhook to Slack with the image url.

Next, upload both programs to the pi
```
make install
make build
scp ./root/usr/local/bin/* pi@raspberrypi.local:/tmp/
```

Upload both programs to the pi
SSH to the pi to complete configuration
```
rsync -avz root/usr/local/bin/ pi@your_ip:/tmp
ssh pi@raspberrypi.local

cp /tmp/cctv_upload /usr/local/bin/
cp /tmp/on_picture_save /usr/local/bin/
# Copy the scripts into the PATH
sudo mv /tmp/{uploader,on_picture_save} /usr/local/bin/
```

Finally, open the motion config again and configure it to call the `on_picture_save` script everytime it creates an image.
Edit `/usr/local/bin/on_picture_save` and add your AWS and Slack secrets:
```
# /usr/local/bin/on_picture_save

SLACK_WEBHOOK_URL=https://hooks.slack.com/services/your/slack/webhook
S3_BUCKET_NAME=my-bucket-name
S3_BUCKET_REGION=us-west-2
AWS_ACCESS_KEY=xxx
AWS_SECRET_KEY=xxxxx
```

Open the motion config again and configure it to call the `on_picture_save` script everytime it creates an image.
```
# /etc/motion/motion.conf
on_picture_save /usr/local/bin/on_picture_save %f
Expand All @@ -183,3 +174,5 @@ Restart motion
```
systemctl restart motion
```

You should be good to go. Check out the motion detection settings in `/etc/motion/motion.conf` for customizing thresholds, etc.
3 changes: 1 addition & 2 deletions root/usr/local/bin/on_picture_save
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,10 @@ AWS_SECRET_KEY=xxxxx
# End configuration

IMAGE=$1
CCTV_UPLOAD=/usr/local/bin/cctv_upload

SLACK_WEBHOOK_URL="$SLACK_WEBHOOK_URL" \
S3_BUCKET_NAME="$S3_BUCKET_NAME" \
S3_BUCKET_REGION="$S3_BUCKET_REGION" \
AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY" \
AWS_SECRET_ACCESS_KEY="$AWS_SECRET_KEY" \
$CCTV_UPLOAD" "$IMAGE"
/usr/local/bin/uploader "$IMAGE"
File renamed without changes.
8 changes: 8 additions & 0 deletions uploader/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module github.com/bndw/security-camera/uploader

go 1.13

require (
github.com/aws/aws-sdk-go v1.30.29
github.com/google/uuid v1.1.1
)
25 changes: 25 additions & 0 deletions uploader/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
github.com/aws/aws-sdk-go v1.30.29 h1:NXNqBS9hjOCpDL8SyCyl38gZX3LLLunKOJc5E7vJ8P0=
github.com/aws/aws-sdk-go v1.30.29/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc=
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
File renamed without changes.
5 changes: 2 additions & 3 deletions cmd/cctv_upload/s3.go → uploader/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/satori/go.uuid"
"github.com/google/uuid"
)

func UploadToS3(region, bucket, filepath string) (string, error) {
Expand All @@ -19,15 +19,14 @@ func UploadToS3(region, bucket, filepath string) (string, error) {
}

// Change the filename to a UUID
newFilename := fmt.Sprintf("%s.jpg", uuid.Must(uuid.NewV4()))
newFilename := fmt.Sprintf("%s.jpg", uuid.New())

// Upload it
err = s3Put(s, bucket, filepath, newFilename)
if err != nil {
return "", err
}

// Return the URL
return fileURL(region, bucket, newFilename), nil
}

Expand Down
File renamed without changes.