From 345130998f4abe45bd6fcc1b93cefdfed2079bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 28 Aug 2018 20:20:02 +0200 Subject: [PATCH] Initial introduction of Tautulli (#1) * initial * Add .gitlab-ci.yml * Remove NGINX config and move SSL and auth to Tautulli * Update License * added deps cleanup * Add config as RO to support !secret * Minor text update * Removed TODO --- .gitlab-ci.yml | 428 ++++++++++++++++++ LICENSE.md | 2 +- README.md | 275 +++++++++++ tautulli/.README.j2 | 67 +++ tautulli/Dockerfile | 64 +++ tautulli/build.json | 9 + tautulli/config.json | 47 ++ tautulli/icon.png | Bin 0 -> 27742 bytes tautulli/logo.png | Bin 0 -> 49397 bytes .../rootfs/etc/cont-init.d/10-requirements.sh | 51 +++ .../rootfs/etc/cont-init.d/20-preparations.sh | 56 +++ .../rootfs/etc/services.d/tautulli/finish | 9 + tautulli/rootfs/etc/services.d/tautulli/run | 15 + 13 files changed, 1022 insertions(+), 1 deletion(-) create mode 100644 .gitlab-ci.yml create mode 100644 README.md create mode 100644 tautulli/.README.j2 create mode 100644 tautulli/Dockerfile create mode 100644 tautulli/build.json create mode 100644 tautulli/config.json create mode 100644 tautulli/icon.png create mode 100644 tautulli/logo.png create mode 100644 tautulli/rootfs/etc/cont-init.d/10-requirements.sh create mode 100644 tautulli/rootfs/etc/cont-init.d/20-preparations.sh create mode 100644 tautulli/rootfs/etc/services.d/tautulli/finish create mode 100644 tautulli/rootfs/etc/services.d/tautulli/run diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..b31b446 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,428 @@ +--- +image: docker:latest + +variables: + ADDON_GITHUB_REPO: hassio-addons/addon-tautulli + ADDON_SLUG: tautulli + ADDON_TARGET: tautulli + DOCKER_DRIVER: overlay2 + DOCKER_HUB_ORG: hassioaddons + +stages: + - preflight + - build + - scan + - deploy + - manifest + - publish + +# Generic DIND template +.dind: &dind + before_script: + - docker info + services: + - name: docker:dind + command: ["--experimental"] + +# Generic preflight template +.preflight: &preflight + stage: preflight + tags: + - preflight + +# Generic build template +.build: &build + <<: *dind + stage: build + before_script: + - docker info + - | + if [ "$(apk --print-arch)" = "amd64" ]; then + docker run --rm --privileged hassioaddons/qemu-user-static:latest + fi + - | + echo "${CI_JOB_TOKEN}" | docker login \ + --username gitlab-ci-token \ + --password-stdin \ + registry.gitlab.com + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" || true + script: + - | + docker build \ + --build-arg "BUILD_FROM=${FROM}" \ + --build-arg "BUILD_DATE=$(date +"%Y-%m-%dT%H:%M:%SZ")" \ + --build-arg "BUILD_ARCH=${ADDON_ARCH}" \ + --build-arg "BUILD_REF=${CI_COMMIT_SHA}" \ + --build-arg "BUILD_VERSION=${CI_COMMIT_TAG:-${CI_COMMIT_SHA:0:7}}" \ + --cache-from "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" \ + --tag \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" \ + "${ADDON_TARGET}" + - | + docker push \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" +# Generic scan template +.scan: &scan + <<: *dind + stage: scan + allow_failure: true + before_script: + - docker info + - docker run -d --name db arminc/clair-db:latest + - docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:v2.0.1 + - apk add -U curl ca-certificates + - | + curl \ + --silent \ + --show-error \ + --location \ + --fail \ + --retry 3 \ + --output /usr/bin/clair-scanner \ + https://github.com/arminc/clair-scanner/releases/download/v8/clair-scanner_linux_amd64 + - chmod +x /usr/bin/clair-scanner + - touch clair-whitelist.yml + - echo "Waiting for Clair to start" + - | + while ! nc -z docker 6060; do + sleep 1 + WAIT=$((${WAIT} + 1)) + if [ "${WAIT}" -gt 30 ]; then + echo "Error > Timeout waiting for Clair to start" + exit 1 + fi + done + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + script: + - | + clair-scanner \ + -c http://docker:6060 \ + --ip $(hostname -i) \ + -w clair-whitelist.yml \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + tags: + - scan + +# Generic deploy template +.deploy: &deploy + <<: *dind + stage: deploy + before_script: + - docker info + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + - | + echo "${CI_JOB_TOKEN}" | docker login \ + --username gitlab-ci-token \ + --password-stdin \ + registry.gitlab.com + - | + echo "${DOCKER_PASSWORD}" | docker login \ + --username "${DOCKER_LOGIN}" \ + --password-stdin + script: + - | + docker tag \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" + - docker push "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" + - TAG="${CI_COMMIT_TAG#v}" + - TAG="${TAG:-${CI_COMMIT_SHA:0:7}}" + - | + docker tag \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${ADDON_ARCH}-${TAG}" + - | + docker push \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${ADDON_ARCH}-${TAG}" + tags: + - deploy + only: + - master + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + except: + - /^(?!master).+@/ + +# Generic manifest template +.manifest: &manifest + <<: *dind + stage: manifest + before_script: + - mkdir -p ~/.docker + - echo '{"experimental":"enabled"}' > ~/.docker/config.json + - docker info + - | + echo "${DOCKER_PASSWORD}" | docker login \ + --username "${DOCKER_LOGIN}" \ + --password-stdin + script: + - TAG="${TAG#v}" + - TAG="${TAG:-${CI_COMMIT_SHA:0:7}}" + - REF="${CI_COMMIT_TAG#v}" + - REF="${REF:-${CI_COMMIT_SHA:0:7}}" + - | + docker manifest create \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:aarch64-${REF}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:amd64-${REF}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:armhf-${REF}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:i386-${REF}" + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:aarch64-${REF}" \ + --os=linux \ + --arch=arm64 \ + --variant=v8 + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:amd64-${REF}" \ + --os=linux \ + --arch=amd64 + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:armhf-${REF}" \ + --os=linux \ + --arch=arm \ + --variant=v6 + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:i386-${REF}" \ + --os=linux \ + --arch=386 + - | + docker manifest push \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" + tags: + - manifest + except: + - /^(?!master).+@/ + +# Generic publish template +.publish: &publish + stage: publish + image: + name: hassioaddons/repository-updater:latest + entrypoint: [""] + script: + - | + repository-updater \ + --token "${GITHUB_TOKEN}" \ + --repository "${REPOSITORY}" \ + --addon "${ADDON_GITHUB_REPO}" + tags: + - publish + except: + - /^(?!master).+@/ + +# Preflight jobs +hadolint: + <<: *preflight + image: hadolint/hadolint:latest-debian + before_script: + - hadolint --version + script: + - hadolint "${ADDON_TARGET}/Dockerfile" + +shellcheck: + <<: *preflight + image: + name: koalaman/shellcheck-alpine:stable + entrypoint: [""] + before_script: + - shellcheck --version + - apk --no-cache add grep + - | + find . -type f -print0 | \ + xargs -0 sed -i 's:#!/usr/bin/with-contenv bash:#!/bin/bash:g' + script: + - | + for file in $(grep -IRl "#\!\(/usr/bin/env \|/bin/\)" --exclude-dir ".git" "${ADDON_TARGET}"); do + if ! shellcheck $file; then + export FAILED=1 + else + echo "$file OK" + fi + done + if [ "${FAILED}" = "1" ]; then + exit 1 + fi + +yamllint: + <<: *preflight + image: sdesbure/yamllint + before_script: + - yamllint --version + script: + - yamllint . + +jsonlint: + <<: *preflight + image: sahsu/docker-jsonlint + before_script: + - jsonlint --version || true + script: + - | + for file in $(find . -type f -name "*.json"); do + if ! jsonlint -q $file; then + export FAILED=1 + else + echo "$file OK" + fi + done + if [ "${FAILED}" = "1" ]; then + exit 1 + fi +markdownlint: + <<: *preflight + image: + name: ruby:alpine + entrypoint: [""] + before_script: + - gem install mdl + - mdl --version + script: + - mdl --style all --warnings . + +# Build Jobs +build:armhf: + <<: *build + variables: + ADDON_ARCH: armhf + FROM: hassioaddons/base-armhf:2.1.2 + tags: + - build + - armhf + +build:aarch64: + <<: *build + variables: + ADDON_ARCH: aarch64 + FROM: hassioaddons/base-aarch64:2.1.2 + tags: + - build + - aarch64 + +build:i386: + <<: *build + variables: + ADDON_ARCH: i386 + FROM: hassioaddons/base-i386:2.1.2 + tags: + - build + - i386 + +build:amd64: + <<: *build + variables: + ADDON_ARCH: amd64 + FROM: hassioaddons/base-amd64:2.1.2 + tags: + - build + - amd64 + +# Scan jobs +clair:armhf: + <<: *scan + variables: + ADDON_ARCH: armhf + +clair:aarch64: + <<: *scan + variables: + ADDON_ARCH: aarch64 + +clair:i386: + <<: *scan + variables: + ADDON_ARCH: i386 + +clair:amd64: + <<: *scan + variables: + ADDON_ARCH: amd64 + +# Deploy jobs +deploy:armhf: + <<: *deploy + variables: + ADDON_ARCH: armhf + +deploy:aarch64: + <<: *deploy + variables: + ADDON_ARCH: aarch64 + +deploy:i386: + <<: *deploy + variables: + ADDON_ARCH: i386 + +deploy:amd64: + <<: *deploy + variables: + ADDON_ARCH: amd64 + +# Manifest jobs +manifest:sha: + <<: *manifest + only: + - master + +manifest:version: + <<: *manifest + variables: + TAG: "${CI_COMMIT_TAG}" + only: + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + +manifest:stable: + <<: *manifest + variables: + TAG: latest + only: + - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ + +manifest:beta: + <<: *manifest + variables: + TAG: beta + only: + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + +manifest:edge: + <<: *manifest + variables: + TAG: edge + only: + - master + +# Publish jobs +publish:stable: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository + only: + - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ + environment: + name: stable + +publish:beta: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository-beta + only: + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + environment: + name: beta + +publish:edge: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository-edge + only: + - master + environment: + name: edge \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index 3ea8973..f6c5214 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # MIT License -Copyright (c) 2018 Franck Nijhof +Copyright (c) 2018 Joakim Sørensen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff3b062 --- /dev/null +++ b/README.md @@ -0,0 +1,275 @@ +# Community Hass.io Add-ons: Tautulli + +[![GitHub Release][releases-shield]][releases] +![Project Stage][project-stage-shield] +[![License][license-shield]](LICENSE.md) + +[![GitLab CI][gitlabci-shield]][gitlabci] +![Project Maintenance][maintenance-shield] +[![GitHub Activity][commits-shield]][commits] + +[![Bountysource][bountysource-shield]][bountysource] +[![Discord][discord-shield]][discord] +[![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +Monitor and get statistics from your Plex server. + +## About + +Tautulli is an application that you can run alongside your Plex Media Server to monitor activity and track various statistics. Most importantly, these statistics include what has been watched, who watched it, when and where they watched it, and how it was watched. All statistics are presented in a nice and clean interface with many tables and graphs, which makes it easy to brag about your server to everyone else. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Hass.io add-on. + +1. [Add our Hass.io add-ons repository][repository] to your Hass.io instance. +1. Install the "Tautulli" add-on. +1. Start the "Tautulli" add-on +1. Check the logs of the "Tautulli" add-on to see if everything went well. +1. Click "OPEN WEB UI" to open the Tautulli website and folow the wizard to get it autorized with your Plex server. + +**NOTE**: Starting the add-on might take a couple of minutes (especially the +first time starting the add-on). + +**NOTE**: Do not add this repository to Hass.io, please use: +`https://github.com/hassio-addons/repository`. + +## Docker status + +![Supports armhf Architecture][armhf-shield] +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports i386 Architecture][i386-shield] + +[![Docker Layers][layers-shield]][microbadger] +[![Docker Pulls][pulls-shield]][dockerhub] + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```json +{ + "log_level": "info", + "username": "MarryPoppins", + "password": "Supercalifragilisticexpialidocious", + "ssl": true, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "ipv6": false +} +``` + +**Note**: _This is just an example, don't copy and past it! Create your own!_ + +### Option: `log_level` + +The `log_level` option controls the level of log output by the addon and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `username` + +Username for authenticating with the Tautulli interface. Leaving the username +field empty, will disable the authentication mechanism entirely. + +Setting a username/password can be added as an extra line of defense, +to prevent users of using your installation for themselves. + +This option is HIGHLY recommended in case you expose this add-on to the outside +world. + +**Note**: _This option support secrets, e.g., `!secret tautulli_username`._ + +### Option: `password` + +Password for authenticating with Tautulli interface. + +**Note**: _This option support secrets, e.g., `!secret tautulli_password`._ + +### Option: `ssl` + +Enables/Disables SSL (HTTPS) on the web interface of Tautulli. Set it `true` +to enable it, `false` otherwise. + +### Option: `certfile` + +The certificate file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option: `keyfile` + +The private key file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option: `ipv6` + +Set this option too `false` to disable IPv6 support. + +### Option: `i_like_to_be_pwned` + +Adding this option to the add-on configuration allows to you bypass the +HaveIBeenPwned password requirement by setting it to `true`. + +**Note**: _We STRONGLY suggest picking a stronger/safer password instead of +using this option! USE AT YOUR OWN RISK!_ + +### Option: `leave_front_door_open` + +Adding this option to the add-on configuration allows you to disable +authentication on the Web Terminal by setting it to `true` and leaving the +username and password empty. + +**Note**: _We STRONGLY suggest, not to use this, even if this add-on is +only exposed to your internal network. USE AT YOUR OWN RISK!_ + + +## Embedding into Home Assistant + +It is possible to embed Tautulli directly into Home Assistant, allowing you to +access your Tautulli through the Home Assistant frontend. + +Home Assistant provides the `panel_iframe` component, for these purposes. + +Example configuration: + +```yaml +panel_iframe: + tautulli: + title: Tautulli + icon: mdi:tautulli + url: http://addres.to.your.hass.io:8181 +``` + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. The format of the log is based on +[Keep a Changelog][keepchangelog]. + +Releases are based on [Semantic Versioning][semver], and use the format +of ``MAJOR.MINOR.PATCH``. In a nutshell, the version will be incremented +based on the following: + +- ``MAJOR``: Incompatible or major changes. +- ``MINOR``: Backwards-compatible new features and enhancements. +- ``PATCH``: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Community Hass.io Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Contributing + +This is an active open-source project. We are always open to people who want to +use the code or contribute to it. + +We have set up a separate document containing our +[contribution guidelines](CONTRIBUTING.md). + +Thank you for being involved! :heart_eyes: + +## Authors & contributors + +The original setup of this repository is by [Joakim Sørensen][ludeeus]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## We have got some Hass.io add-ons for you + +Want some more functionality to your Hass.io Home Assistant instance? + +We have created multiple add-ons for Hass.io. For a full list, check out +our [GitHub Repository][repository]. + +## License + +MIT License + +Copyright (c) 2018 Joakim Sørensen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[anchore-shield]: https://anchore.io/service/badges/image/67d1185473090e99d5ac5e1bb4d1aa2295117a9bd3d7abbf8cd8a71e331c8388 +[anchore]: https://anchore.io/image/dockerhub/hassioaddons%2Funifi%3Alatest +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[bountysource-shield]: https://img.shields.io/bountysource/team/hassio-addons/activity.svg +[bountysource]: https://www.bountysource.com/teams/hassio-addons/issues +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/ludeeus +[commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/addon-tautulli.svg +[commits]: https://github.com/hassio-addons/addon-tautulli/commits/master +[contributors]: https://github.com/hassio-addons/addon-tautulli/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[dockerhub]: https://hub.docker.com/r/hassioaddons/tautulli +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/ +[ludeeus]: https://github.com/ludeeus +[gitlabci-shield]: https://gitlab.com/hassio-addons/addon-tautulli/badges/master/pipeline.svg +[gitlabci]: https://gitlab.com/hassio-addons/addon-tautulli/pipelines +[home-assistant]: https://home-assistant.io +[i386-shield]: https://img.shields.io/badge/i386-yes-green.svg +[issue]: https://github.com/hassio-addons/addon-tautulli/issues +[keepchangelog]: http://keepachangelog.com/en/1.0.0/ +[layers-shield]: https://images.microbadger.com/badges/image/hassioaddons/tautulli.svg +[license-shield]: https://img.shields.io/github/license/hassio-addons/addon-tautulli.svg +[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg +[microbadger]: https://microbadger.com/images/hassioaddons/tautulli +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[pulls-shield]: https://img.shields.io/docker/pulls/hassioaddons/tautulli.svg +[reddit]: https://reddit.com/r/homeassistant +[releases-shield]: https://img.shields.io/github/release/hassio-addons/addon-tautulli.svg +[releases]: https://github.com/hassio-addons/addon-tautulli/releases +[repository]: https://github.com/hassio-addons/repository +[semver]: http://semver.org/spec/v2.0.0.htm diff --git a/tautulli/.README.j2 b/tautulli/.README.j2 new file mode 100644 index 0000000..83d2e7b --- /dev/null +++ b/tautulli/.README.j2 @@ -0,0 +1,67 @@ +# Community Hass.io Add-ons: Tautulli + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +Monitoring and tracking tool for Plex Media Server. + +## About + +Tautulli is an application that you can run alongside your Plex Media Server to monitor activity and track various statistics. Most importantly, these statistics include what has been watched, who watched it, when and where they watched it, and how it was watched. All statistics are presented in a nice and clean interface with many tables and graphs, which makes it easy to brag about your server to everyone else. + +[Click here for the full documentation][docs] + +{% if channel == "edge" %} +## WARNING! THIS IS AN EDGE VERSION! + +This Hass.io Add-ons repository contains edge builds of add-ons. Edge builds +add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +{% if channel == "beta" %} +## WARNING! THIS IS A BETA VERSION! + +This Hass.io Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/ludeeus +[discord-shield]: https://img.shields.io/discord/330944238910963714.svg +[discord]: https://discord.gg/c5DvZ4e +[docs]: {{ repo }}/blob/{{ version }}/README.md +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io +[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg +[project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} +[screenshot]: https://github.com/hassio-addons/addon-tautulli/raw/master/images/screenshot.png diff --git a/tautulli/Dockerfile b/tautulli/Dockerfile new file mode 100644 index 0000000..6d32e36 --- /dev/null +++ b/tautulli/Dockerfile @@ -0,0 +1,64 @@ +ARG BUILD_FROM=hassioaddons/base:2.1.2 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Sets working directory +WORKDIR /opt + +# Setup base +RUN \ + apk add --no-cache --virtual .build-dependencies \ + g++=6.4.0-r8 \ + gcc=6.4.0-r8 \ + make=4.2.1-r2 \ + python2-dev=2.7.15-r1 \ + libffi-dev=3.2.1-r4 \ + libressl-dev=2.7.4-r0 \ + && apk add --no-cache \ + git=2.18.0-r0 \ + python2=2.7.15-r1 \ + py2-pip=10.0.1-r0 \ + wget=1.19.5-r0 \ + && pip install --no-cache-dir -U \ + pip==18.0 \ + && pip install --no-cache-dir -U \ + plexapi==3.0.6 \ + pycryptodomex==3.6.6 \ + crudini==0.9 \ + PyOpenSSL==18.0.0 \ + && git clone --branch "v2.1.18" --depth=1 \ + https://github.com/Tautulli/Tautulli.git /opt \ + && apk del --purge .build-dependencies \ + && find /usr/lib/python2.7/ -type d -name tests -depth -exec rm -rf {} \; \ + && find /usr/lib/python2.7/ -type d -name test -depth -exec rm -rf {} \; \ + && find /usr/lib/python2.7/ -name __pycache__ -depth -exec rm -rf {} \; + +# Copy root filesystem +COPY rootfs / + +# Build arugments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="Tautulli" \ + io.hass.description="Monitoring and tracking tool for Plex Media Server." \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Joakim Sørensen @ludeeus " \ + org.label-schema.description="Monitoring and tracking tool for Plex Media Server." \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="Tautulli" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://addons.community" \ + org.label-schema.usage="https://github.com/hassio-addons/addon-tautulli/tree/master/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/hassio-addons/addon-tautulli" \ + org.label-schema.vendor="Community Hass.io Add-ons" diff --git a/tautulli/build.json b/tautulli/build.json new file mode 100644 index 0000000..d4ed113 --- /dev/null +++ b/tautulli/build.json @@ -0,0 +1,9 @@ +{ + "build_from": { + "aarch64": "hassioaddons/base-aarch64:2.1.2", + "amd64": "hassioaddons/base-amd64:2.1.2", + "armhf": "hassioaddons/base-armhf:2.1.2", + "i386": "hassioaddons/base-i386:2.1.2" + }, + "args": {} +} diff --git a/tautulli/config.json b/tautulli/config.json new file mode 100644 index 0000000..ef25233 --- /dev/null +++ b/tautulli/config.json @@ -0,0 +1,47 @@ +{ + "name": "Tautulli", + "version": "dev", + "slug": "tautulli", + "description": "Monitoring and tracking tool for Plex Media Server", + "url": "https://github.com/hassio-addons/addon-tautulli/tree/master/README.md", + "webui": "[PROTO:ssl]://[HOST]:[PORT:8181]", + "startup": "services", + "arch": [ + "aarch64", + "amd64", + "armhf", + "i386" + ], + "boot": "auto", + "hassio_api": true, + "homeassistant_api": false, + "host_network": false, + "ports": { + "8181/tcp": 8181 + }, + "map": [ + "config", + "ssl" + ], + "options": { + "log_level": "info", + "username": "", + "password": "", + "ssl": true, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem" + }, + "schema": { + "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)", + "username": "str", + "password": "str", + "ssl": "bool", + "certfile": "str", + "keyfile": "str", + "i_like_to_be_pwned": "bool?", + "leave_front_door_open": "bool?" + }, + "environment": { + "LOG_FORMAT": "{LEVEL}: {MESSAGE}" + } +} diff --git a/tautulli/icon.png b/tautulli/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cdeb13d59d02b2a4f3a518c6831005165c4aa6e4 GIT binary patch literal 27742 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%0Dt*N-W{8Zudd2z|bUr}l;lne5Aa??#e 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 literal 0 HcmV?d00001 diff --git a/tautulli/rootfs/etc/cont-init.d/10-requirements.sh b/tautulli/rootfs/etc/cont-init.d/10-requirements.sh new file mode 100644 index 0000000..90682c8 --- /dev/null +++ b/tautulli/rootfs/etc/cont-init.d/10-requirements.sh @@ -0,0 +1,51 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Tautulli +# This files check if all user configuration requirements are met +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Require username / password +if ! hass.config.has_value 'username' \ + && ! ( \ + hass.config.exists 'leave_front_door_open' \ + && hass.config.true 'leave_front_door_open' \ + ); +then + hass.die 'You need to set a username!' +fi + +if ! hass.config.has_value 'password' \ + && ! ( \ + hass.config.exists 'leave_front_door_open' \ + && hass.config.true 'leave_front_door_open' \ + ); +then + hass.die 'You need to set a password!'; +fi + +# Require a secure password +if hass.config.has_value 'password' \ + && ! hass.config.is_safe_password 'password'; then + hass.die "Please choose a different password, this one is unsafe!" +fi + +# Check SSL requirements, if enabled +if hass.config.true 'ssl'; then + if ! hass.config.has_value 'certfile'; then + hass.die 'SSL is enabled, but no certfile was specified' + fi + + if ! hass.config.has_value 'keyfile'; then + hass.die 'SSL is enabled, but no keyfile was specified' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'certfile')"; then + hass.die 'The configured certfile is not found' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'keyfile')"; then + hass.die 'The configured keyfile is not found' + fi +fi \ No newline at end of file diff --git a/tautulli/rootfs/etc/cont-init.d/20-preparations.sh b/tautulli/rootfs/etc/cont-init.d/20-preparations.sh new file mode 100644 index 0000000..c1bc821 --- /dev/null +++ b/tautulli/rootfs/etc/cont-init.d/20-preparations.sh @@ -0,0 +1,56 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Tautulli +# Preparing configuration for Tautulli +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +CONFIG=/data/config.ini + +# If config.ini does not exist, create it. +if ! hass.file_exists "/data/config.ini"; then + hass.log.info "Creating default configuration..." + crudini --set "$CONFIG" General week_start_monday 1 + crudini --set "$CONFIG" General update_show_changelog 0 + crudini --set "$CONFIG" General first_run_complete 0 + crudini --set "$CONFIG" General check_github 0 + crudini --set "$CONFIG" General check_github_on_startup 0 + crudini --set "$CONFIG" Advanced system_analytics 0 +fi + +hass.log.info "Updating running configuration..." + +# Temporrary changing config.ini to be valid during additions +## This has to be done because Tautulli added a ini header with [[header]] +sed -i "s/\\[\\[get_file_sizes_hold\\]\\]/\\[get_file_sizes_hold\\]/" "$CONFIG" + +# Update SSL info in configuration +if hass.config.true 'ssl'; then + hass.log.info "Ensure SSL is active in the configuration..." + crudini --set "$CONFIG" General enable_https 1 + crudini --set "$CONFIG" General https_cert_chain "\"/ssl/$(hass.config.get 'certfile')\"" + crudini --set "$CONFIG" General https_cert "\"/ssl/$(hass.config.get 'certfile')\"" + crudini --set "$CONFIG" General https_key "\"/ssl/$(hass.config.get 'keyfile')\"" +else + hass.log.info "Ensure SSL is not active in the configuration..." + crudini --set "$CONFIG" General enable_https 0 + crudini --set "$CONFIG" General https_cert_chain "\"\"" + crudini --set "$CONFIG" General https_cert "\"\"" + crudini --set "$CONFIG" General https_key "\"\"" +fi + +# Update username and password in configuration +if hass.config.has_value 'username' && hass.config.has_value 'password'; then + hass.log.info "Ensure authentication is enabled in the configuration..." + crudini --set "$CONFIG" General http_username "\"$(hass.config.get 'username')\"" + crudini --set "$CONFIG" General http_password "\"$(hass.config.get 'password')\"" +else + hass.log.info "Ensure authentication is not enabled in the configuration..." + crudini --set "$CONFIG" General http_username "\"\"" + crudini --set "$CONFIG" General http_password "\"\"" +fi + +# Changing config.ini back. +## This has to be done because Tautulli added a ini header with [[header]] +sed -i "s/\\[get_file_sizes_hold\\]/\\[\\[get_file_sizes_hold\\]\\]/" "$CONFIG" \ No newline at end of file diff --git a/tautulli/rootfs/etc/services.d/tautulli/finish b/tautulli/rootfs/etc/services.d/tautulli/finish new file mode 100644 index 0000000..2a18a1f --- /dev/null +++ b/tautulli/rootfs/etc/services.d/tautulli/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: Tautulli +# Take down the S6 supervision tree when Tautulli fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/tautulli/rootfs/etc/services.d/tautulli/run b/tautulli/rootfs/etc/services.d/tautulli/run new file mode 100644 index 0000000..f936a1d --- /dev/null +++ b/tautulli/rootfs/etc/services.d/tautulli/run @@ -0,0 +1,15 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Tautulli +# Runs Tautulli +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Start Tautulli +hass.log.info "Starting Tautulli..." +exec \ + python /opt/Tautulli.py \ + --datadir /data \ + --nolaunch \ + -p 8181 \ No newline at end of file