From ede9ef58773335c33799c15d3e0203fe2cca1947 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Sat, 8 Jul 2023 19:06:29 +0100 Subject: [PATCH] Include nightly build addons --- frigate_fa_nightly/.devcontainer/Dockerfile | 46 ++++++ .../.devcontainer/devcontainer.json | 18 +++ .../.devcontainer/supervisor.sh | 145 ++++++++++++++++++ frigate_fa_nightly/.gitattributes | 1 + frigate_fa_nightly/.vscode/tasks.json | 31 ++++ frigate_fa_nightly/DOCS.md | 13 ++ frigate_fa_nightly/README.md | 17 ++ frigate_fa_nightly/config.yaml | 53 +++++++ frigate_fa_nightly/icon.png | Bin 0 -> 5084 bytes frigate_fa_nightly/logo.png | Bin 0 -> 17738 bytes .../.devcontainer/devcontainer.json | 18 +++ frigate_nightly/.devcontainer/supervisor.sh | 145 ++++++++++++++++++ frigate_nightly/.gitattributes | 1 + frigate_nightly/.vscode/tasks.json | 31 ++++ frigate_nightly/DOCS.md | 13 ++ frigate_nightly/README.md | 15 ++ frigate_nightly/config.yaml | 63 ++++++++ frigate_nightly/icon.png | Bin 0 -> 5801 bytes frigate_nightly/logo.png | Bin 0 -> 12157 bytes 19 files changed, 610 insertions(+) create mode 100644 frigate_fa_nightly/.devcontainer/Dockerfile create mode 100644 frigate_fa_nightly/.devcontainer/devcontainer.json create mode 100755 frigate_fa_nightly/.devcontainer/supervisor.sh create mode 100644 frigate_fa_nightly/.gitattributes create mode 100644 frigate_fa_nightly/.vscode/tasks.json create mode 100644 frigate_fa_nightly/DOCS.md create mode 100644 frigate_fa_nightly/README.md create mode 100644 frigate_fa_nightly/config.yaml create mode 100644 frigate_fa_nightly/icon.png create mode 100644 frigate_fa_nightly/logo.png create mode 100644 frigate_nightly/.devcontainer/devcontainer.json create mode 100755 frigate_nightly/.devcontainer/supervisor.sh create mode 100644 frigate_nightly/.gitattributes create mode 100644 frigate_nightly/.vscode/tasks.json create mode 100644 frigate_nightly/DOCS.md create mode 100644 frigate_nightly/README.md create mode 100644 frigate_nightly/config.yaml create mode 100644 frigate_nightly/icon.png create mode 100644 frigate_nightly/logo.png diff --git a/frigate_fa_nightly/.devcontainer/Dockerfile b/frigate_fa_nightly/.devcontainer/Dockerfile new file mode 100644 index 0000000..5985892 --- /dev/null +++ b/frigate_fa_nightly/.devcontainer/Dockerfile @@ -0,0 +1,46 @@ +FROM mcr.microsoft.com/vscode/devcontainers/base:debian + +WORKDIR /workspaces + +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Set Docker daemon config +RUN \ + mkdir -p /etc/docker \ + && echo '{"storage-driver": "vfs"}' > /etc/docker/daemon.json + +# Installa aditional tools +RUN \ + apt-get update \ + && apt-get install -y --no-install-recommends \ + dbus \ + network-manager \ + libpulse0 \ + xz-utils + +# Install docker +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + software-properties-common \ + gpg-agent \ + && curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - \ + && add-apt-repository "deb https://download.docker.com/linux/debian $(lsb_release -cs) stable" \ + && apt-get update && apt-get install -y --no-install-recommends \ + docker-ce \ + docker-ce-cli \ + containerd.io \ + && rm -rf /var/lib/apt/lists/* + +# Install shellcheck +RUN \ + curl -fLs \ + "https://github.com/koalaman/shellcheck/releases/download/stable/shellcheck-stable.linux.x86_64.tar.xz" \ + | tar -xJ \ + \ + && mv -f "./shellcheck-stable/shellcheck" "/usr/bin/shellcheck" \ + && rm -rf "./shellcheck-stable" + +# Generate a machine-id for this container +RUN rm /etc/machine-id && dbus-uuidgen --ensure=/etc/machine-id \ No newline at end of file diff --git a/frigate_fa_nightly/.devcontainer/devcontainer.json b/frigate_fa_nightly/.devcontainer/devcontainer.json new file mode 100644 index 0000000..8082a4d --- /dev/null +++ b/frigate_fa_nightly/.devcontainer/devcontainer.json @@ -0,0 +1,18 @@ +{ + "name": "Home Assistant Add-Ons", + "context": "..", + "dockerFile": "Dockerfile", + "appPort": ["7123:8123", "7357:4357"], + "postStartCommand": "service docker start", + "runArgs": ["-e", "GIT_EDITOR=code --wait", "--privileged"], + "containerEnv": { + "WORKSPACE_DIRECTORY": "${containerWorkspaceFolder}" + }, + "extensions": [ + "timonwong.shellcheck", + "esbenp.prettier-vscode" + ], + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + } +} \ No newline at end of file diff --git a/frigate_fa_nightly/.devcontainer/supervisor.sh b/frigate_fa_nightly/.devcontainer/supervisor.sh new file mode 100755 index 0000000..d578370 --- /dev/null +++ b/frigate_fa_nightly/.devcontainer/supervisor.sh @@ -0,0 +1,145 @@ +#!/bin/bash +set -eE + +SUPERVISOR_VERSON="$(curl -s https://version.home-assistant.io/stable.json | jq -e -r '.supervisor')" +DOCKER_TIMEOUT=30 +DOCKER_PID=0 + +function start_docker() { + local starttime + local endtime + + if grep -q 'Alpine|standard-WSL' /proc/version; then + # The docker daemon does not start when running WSL2 without adjusting iptables + update-alternatives --set iptables /usr/sbin/iptables-legacy || echo "Fails adjust iptables" + update-alternatives --set ip6tables /usr/sbin/iptables-legacy || echo "Fails adjust ip6tables" + fi + + echo "Starting docker." + dockerd 2> /dev/null & + DOCKER_PID=$! + + echo "Waiting for docker to initialize..." + starttime="$(date +%s)" + endtime="$(date +%s)" + until docker info >/dev/null 2>&1; do + if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then + sleep 1 + endtime=$(date +%s) + else + echo "Timeout while waiting for docker to come up" + exit 1 + fi + done + echo "Docker was initialized" +} + +function stop_docker() { + local starttime + local endtime + + echo "Stopping in container docker..." + if [ "$DOCKER_PID" -gt 0 ] && kill -0 "$DOCKER_PID" 2> /dev/null; then + starttime="$(date +%s)" + endtime="$(date +%s)" + + # Now wait for it to die + kill "$DOCKER_PID" + while kill -0 "$DOCKER_PID" 2> /dev/null; do + if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then + sleep 1 + endtime=$(date +%s) + else + echo "Timeout while waiting for container docker to die" + exit 1 + fi + done + else + echo "Your host might have been left with unreleased resources" + fi +} + + +function cleanup_lastboot() { + if [[ -f /tmp/supervisor_data/config.json ]]; then + echo "Cleaning up last boot" + cp /tmp/supervisor_data/config.json /tmp/config.json + jq -rM 'del(.last_boot)' /tmp/config.json > /tmp/supervisor_data/config.json + rm /tmp/config.json + fi +} + + +function cleanup_docker() { + echo "Cleaning up stopped containers..." + docker rm "$(docker ps -a -q)" || true +} + +function run_supervisor() { + mkdir -p /tmp/supervisor_data + docker run --rm --privileged \ + --name hassio_supervisor \ + --privileged \ + --security-opt seccomp=unconfined \ + --security-opt apparmor:unconfined \ + -v /run/docker.sock:/run/docker.sock:rw \ + -v /run/dbus:/run/dbus:ro \ + -v /run/udev:/run/udev:ro \ + -v /tmp/supervisor_data:/data:rw \ + -v "$WORKSPACE_DIRECTORY":/data/addons/local:rw \ + -v /etc/machine-id:/etc/machine-id:ro \ + -e SUPERVISOR_SHARE="/tmp/supervisor_data" \ + -e SUPERVISOR_NAME=hassio_supervisor \ + -e SUPERVISOR_DEV=1 \ + -e SUPERVISOR_MACHINE="qemux86-64" \ + "homeassistant/amd64-hassio-supervisor:${SUPERVISOR_VERSON}" +} + +function init_dbus() { + if pgrep dbus-daemon; then + echo "Dbus is running" + return 0 + fi + + echo "Startup dbus" + mkdir -p /var/lib/dbus + cp -f /etc/machine-id /var/lib/dbus/machine-id + + # cleanups + mkdir -p /run/dbus + rm -f /run/dbus/pid + + # run + dbus-daemon --system --print-address +} + +function init_udev() { + if pgrep systemd-udevd; then + echo "udev is running" + return 0 + fi + + echo "Startup udev" + + # cleanups + mkdir -p /run/udev + + # run + /lib/systemd/systemd-udevd --daemon + sleep 3 + udevadm trigger && udevadm settle +} + +echo "Start Test-Env" + +start_docker +trap "stop_docker" ERR + +docker system prune -f + +cleanup_lastboot +cleanup_docker +init_dbus +init_udev +run_supervisor +stop_docker \ No newline at end of file diff --git a/frigate_fa_nightly/.gitattributes b/frigate_fa_nightly/.gitattributes new file mode 100644 index 0000000..526c8a3 --- /dev/null +++ b/frigate_fa_nightly/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf \ No newline at end of file diff --git a/frigate_fa_nightly/.vscode/tasks.json b/frigate_fa_nightly/.vscode/tasks.json new file mode 100644 index 0000000..81384a1 --- /dev/null +++ b/frigate_fa_nightly/.vscode/tasks.json @@ -0,0 +1,31 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Start Home Assistant", + "type": "shell", + "command": "./.devcontainer/supervisor.sh", + "group": { + "kind": "test", + "isDefault": true, + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + },{ + "label": "Run Home Assistant CLI", + "type": "shell", + "command": "docker exec -ti hassio_cli /usr/bin/cli.sh", + "group": "test", + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/frigate_fa_nightly/DOCS.md b/frigate_fa_nightly/DOCS.md new file mode 100644 index 0000000..9445a0a --- /dev/null +++ b/frigate_fa_nightly/DOCS.md @@ -0,0 +1,13 @@ +:warning: **This is an unsupported nightly build**: You probably don't want this version. + +You must create a config file as `frigate.yml` in the root of your Home Assistant configuration directory. + +Frigate brings realtime object detection to any camera video feed supported by ffmpeg. More detailed docs are maintained [here](https://docs.frigate.video). + +## Required Dependencies + +- MQTT: Frigate communicates via MQTT + +## Support + +Please [open an issue](https://github.com/blakeblackshear/frigate/issues/new/choose) if you need support. diff --git a/frigate_fa_nightly/README.md b/frigate_fa_nightly/README.md new file mode 100644 index 0000000..adef6fa --- /dev/null +++ b/frigate_fa_nightly/README.md @@ -0,0 +1,17 @@ +# Home Assistant Add-on: Frigate (Full Access) Beta (0.12.0) + +Please reference the [release notes](https://github.com/blakeblackshear/frigate/releases) for breaking changes. + +![Supports aarch64 Architecture][aarch64-shield] ![Supports amd64 Architecture][amd64-shield] ![Supports armv7 Architecture][armv7-shield] + +NVR with realtime local object detection for IP cameras. + +You must create a config file as `frigate.yml` in the root of your Home Assistant configuration directory. + +This version of the add-on requests full device access in order to turn off protection mode for those devices which don't work with protection mode enabled. + +[Documentation](https://docs.frigate.video) + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg diff --git a/frigate_fa_nightly/config.yaml b/frigate_fa_nightly/config.yaml new file mode 100644 index 0000000..f08a9b9 --- /dev/null +++ b/frigate_fa_nightly/config.yaml @@ -0,0 +1,53 @@ +name: Frigate (Full Access) Nightly +version: nightly +panel_icon: "mdi:cctv" +panel_title: Frigate +slug: frigate-fa-nightly +description: NVR with realtime local object detection for IP cameras +url: "https://github.com/blakeblackshear/frigate" +image: ghcr.io/blakeblackshear/frigate +startup: application +boot: auto +init: false +webui: "http://[HOST]:[PORT:5000]/" +watchdog: "http://[HOST]:[PORT:5000]/" +ingress: true +ingress_port: 5000 +ingress_entry: / +panel_admin: false +homeassistant_api: true +hassio_api: true +ports: + 8555/tcp: 8555 + 8555/udp: 8555 + 8554/tcp: null + 5000/tcp: null + 1984/tcp: null + 1935/tcp: null +ports_description: + 8555/tcp: WebRTC over tcp + 8555/udp: WebRTC over udp + 8554/tcp: RTSP Restream + 5000/tcp: Web interface (Not required for Hass.io Ingress) + 1984/tcp: go2rtc API + 1935/tcp: RTMP streams +host_network: false +tmpfs: true +usb: true +video: true +full_access: true +privileged: + - SYS_ADMIN +environment: + CONFIG_FILE: /config/frigate.yml +schema: + plus_api_key: password? +services: + - "mqtt:want" +arch: + - amd64 + - aarch64 + - armv7 +map: + - "media:rw" + - "config:rw" diff --git a/frigate_fa_nightly/icon.png b/frigate_fa_nightly/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef2f480114370272beeea776c6e426b207b4a8e GIT binary patch literal 5084 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 literal 0 HcmV?d00001 diff --git a/frigate_fa_nightly/logo.png b/frigate_fa_nightly/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3131f8f2e2b1420a510789fa524908b7f22df822 GIT binary patch literal 17738 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 /dev/null & + DOCKER_PID=$! + + echo "Waiting for docker to initialize..." + starttime="$(date +%s)" + endtime="$(date +%s)" + until docker info >/dev/null 2>&1; do + if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then + sleep 1 + endtime=$(date +%s) + else + echo "Timeout while waiting for docker to come up" + exit 1 + fi + done + echo "Docker was initialized" +} + +function stop_docker() { + local starttime + local endtime + + echo "Stopping in container docker..." + if [ "$DOCKER_PID" -gt 0 ] && kill -0 "$DOCKER_PID" 2> /dev/null; then + starttime="$(date +%s)" + endtime="$(date +%s)" + + # Now wait for it to die + kill "$DOCKER_PID" + while kill -0 "$DOCKER_PID" 2> /dev/null; do + if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then + sleep 1 + endtime=$(date +%s) + else + echo "Timeout while waiting for container docker to die" + exit 1 + fi + done + else + echo "Your host might have been left with unreleased resources" + fi +} + + +function cleanup_lastboot() { + if [[ -f /tmp/supervisor_data/config.json ]]; then + echo "Cleaning up last boot" + cp /tmp/supervisor_data/config.json /tmp/config.json + jq -rM 'del(.last_boot)' /tmp/config.json > /tmp/supervisor_data/config.json + rm /tmp/config.json + fi +} + + +function cleanup_docker() { + echo "Cleaning up stopped containers..." + docker rm "$(docker ps -a -q)" || true +} + +function run_supervisor() { + mkdir -p /tmp/supervisor_data + docker run --rm --privileged \ + --name hassio_supervisor \ + --privileged \ + --security-opt seccomp=unconfined \ + --security-opt apparmor:unconfined \ + -v /run/docker.sock:/run/docker.sock:rw \ + -v /run/dbus:/run/dbus:ro \ + -v /run/udev:/run/udev:ro \ + -v /tmp/supervisor_data:/data:rw \ + -v "$WORKSPACE_DIRECTORY":/data/addons/local:rw \ + -v /etc/machine-id:/etc/machine-id:ro \ + -e SUPERVISOR_SHARE="/tmp/supervisor_data" \ + -e SUPERVISOR_NAME=hassio_supervisor \ + -e SUPERVISOR_DEV=1 \ + -e SUPERVISOR_MACHINE="qemux86-64" \ + "homeassistant/amd64-hassio-supervisor:${SUPERVISOR_VERSON}" +} + +function init_dbus() { + if pgrep dbus-daemon; then + echo "Dbus is running" + return 0 + fi + + echo "Startup dbus" + mkdir -p /var/lib/dbus + cp -f /etc/machine-id /var/lib/dbus/machine-id + + # cleanups + mkdir -p /run/dbus + rm -f /run/dbus/pid + + # run + dbus-daemon --system --print-address +} + +function init_udev() { + if pgrep systemd-udevd; then + echo "udev is running" + return 0 + fi + + echo "Startup udev" + + # cleanups + mkdir -p /run/udev + + # run + /lib/systemd/systemd-udevd --daemon + sleep 3 + udevadm trigger && udevadm settle +} + +echo "Start Test-Env" + +start_docker +trap "stop_docker" ERR + +docker system prune -f + +cleanup_lastboot +cleanup_docker +init_dbus +init_udev +run_supervisor +stop_docker \ No newline at end of file diff --git a/frigate_nightly/.gitattributes b/frigate_nightly/.gitattributes new file mode 100644 index 0000000..526c8a3 --- /dev/null +++ b/frigate_nightly/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf \ No newline at end of file diff --git a/frigate_nightly/.vscode/tasks.json b/frigate_nightly/.vscode/tasks.json new file mode 100644 index 0000000..81384a1 --- /dev/null +++ b/frigate_nightly/.vscode/tasks.json @@ -0,0 +1,31 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Start Home Assistant", + "type": "shell", + "command": "./.devcontainer/supervisor.sh", + "group": { + "kind": "test", + "isDefault": true, + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + },{ + "label": "Run Home Assistant CLI", + "type": "shell", + "command": "docker exec -ti hassio_cli /usr/bin/cli.sh", + "group": "test", + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/frigate_nightly/DOCS.md b/frigate_nightly/DOCS.md new file mode 100644 index 0000000..9445a0a --- /dev/null +++ b/frigate_nightly/DOCS.md @@ -0,0 +1,13 @@ +:warning: **This is an unsupported nightly build**: You probably don't want this version. + +You must create a config file as `frigate.yml` in the root of your Home Assistant configuration directory. + +Frigate brings realtime object detection to any camera video feed supported by ffmpeg. More detailed docs are maintained [here](https://docs.frigate.video). + +## Required Dependencies + +- MQTT: Frigate communicates via MQTT + +## Support + +Please [open an issue](https://github.com/blakeblackshear/frigate/issues/new/choose) if you need support. diff --git a/frigate_nightly/README.md b/frigate_nightly/README.md new file mode 100644 index 0000000..05dc409 --- /dev/null +++ b/frigate_nightly/README.md @@ -0,0 +1,15 @@ +# Home Assistant Add-on: Frigate + +Please reference the [release notes](https://github.com/blakeblackshear/frigate/releases) for breaking changes. + +![Supports aarch64 Architecture][aarch64-shield] ![Supports amd64 Architecture][amd64-shield] ![Supports armv7 Architecture][armv7-shield] + +NVR with realtime local object detection for IP cameras. + +You must create a config file as `frigate.yml` in the root of your Home Assistant configuration directory. + +[Documentation](https://docs.frigate.video) + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg diff --git a/frigate_nightly/config.yaml b/frigate_nightly/config.yaml new file mode 100644 index 0000000..029a10e --- /dev/null +++ b/frigate_nightly/config.yaml @@ -0,0 +1,63 @@ +name: Frigate Nightly +version: nightly +panel_icon: "mdi:cctv" +panel_title: Frigate +slug: frigate-nightly +description: NVR with realtime local object detection for IP cameras +url: "https://github.com/blakeblackshear/frigate" +image: ghcr.io/blakeblackshear/frigate +startup: application +boot: auto +init: false +webui: "http://[HOST]:[PORT:5000]/" +watchdog: "http://[HOST]:[PORT:5000]/" +ingress: true +ingress_port: 5000 +ingress_entry: / +panel_admin: false +homeassistant_api: true +hassio_api: true +ports: + 8555/tcp: 8555 + 8555/udp: 8555 + 8554/tcp: null + 5000/tcp: null + 1984/tcp: null + 1935/tcp: null +ports_description: + 8555/tcp: WebRTC over tcp + 8555/udp: WebRTC over udp + 8554/tcp: RTSP Restream + 5000/tcp: Web interface (Not required for Hass.io Ingress) + 1984/tcp: go2rtc API + 1935/tcp: RTMP streams +host_network: false +devices: + - /dev/dri/renderD128 + - /dev/apex_0 + - /dev/apex_1 + - /dev/apex_2 + - /dev/apex_3 + - /dev/dri/card0 + - /dev/vchiq + - /dev/video10 + - /dev/video0 +usb: true +video: true +tmpfs: true +full_access: false +privileged: + - SYS_ADMIN +environment: + CONFIG_FILE: /config/frigate.yml +schema: + plus_api_key: password? +services: + - "mqtt:want" +arch: + - amd64 + - aarch64 + - armv7 +map: + - "media:rw" + - "config:rw" diff --git a/frigate_nightly/icon.png b/frigate_nightly/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..405411a10e5e69ea7fef7e58685df8baae45efb7 GIT binary patch literal 5801 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 literal 0 HcmV?d00001