commit
23bcbbf1e6
21 changed files with 268 additions and 204 deletions
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -2,7 +2,7 @@
|
||||||
name: Bug report
|
name: Bug report
|
||||||
about: Create a report to help us improve
|
about: Create a report to help us improve
|
||||||
title: "[BUG]"
|
title: "[BUG]"
|
||||||
labels: awaiting-approval
|
labels: awaiting-triage
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
|
@ -2,7 +2,7 @@
|
||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest an idea for this project
|
about: Suggest an idea for this project
|
||||||
title: "[Feature Request]"
|
title: "[Feature Request]"
|
||||||
labels: awaiting-approval
|
labels: awaiting-triage
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
23
.github/actions/docker-multi-login-action/action.yml
vendored
Normal file
23
.github/actions/docker-multi-login-action/action.yml
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
name: 'Docker Multi Login Action'
|
||||||
|
description: 'Log in to dockerhub, quay, and github container registry'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- shell: bash
|
||||||
|
run: |
|
||||||
|
echo "🔑 Logging into dockerhub..."
|
||||||
|
if docker login --username ${{ fromJSON(env.secrets).DOCKERHUB_USERNAME }} --password ${{ fromJSON(env.secrets).DOCKERHUB_PASSWORD }} > /dev/null 2>&1; then
|
||||||
|
echo "🎉 Login Succeeded!"
|
||||||
|
fi
|
||||||
|
- shell: bash
|
||||||
|
run: |
|
||||||
|
echo "🔑 Logging into quay.io..."
|
||||||
|
if docker login quay.io --username ${{ fromJSON(env.secrets).QUAY_USERNAME }} --password ${{ fromJSON(env.secrets).QUAY_PASSWORD }} > /dev/null 2>&1; then
|
||||||
|
echo "🎉 Login Succeeded!"
|
||||||
|
fi
|
||||||
|
- shell: bash
|
||||||
|
run: |
|
||||||
|
echo "🔑 Logging into ghcr.io..."
|
||||||
|
if docker login ghcr.io --username ${{ fromJSON(env.secrets).GHCR_USERNAME }} --password ${{ fromJSON(env.secrets).GHCR_PASSWORD }} > /dev/null 2>&1; then
|
||||||
|
echo "🎉 Login Succeeded!"
|
||||||
|
fi
|
46
.github/actions/docker-target-image-list-action/action.yml
vendored
Normal file
46
.github/actions/docker-target-image-list-action/action.yml
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
name: 'Docker Target Image List Generator'
|
||||||
|
description: 'A Github Action to generate a list of fully qualified target images for docker related steps'
|
||||||
|
inputs:
|
||||||
|
registries:
|
||||||
|
description: "Comma separated list of docker registries"
|
||||||
|
required: false
|
||||||
|
default: "docker.io,quay.io,ghcr.io"
|
||||||
|
images:
|
||||||
|
description: "Comma separated list of images"
|
||||||
|
required: true
|
||||||
|
tags:
|
||||||
|
description: "Comma separated list of image tags"
|
||||||
|
required: false
|
||||||
|
default: "edge"
|
||||||
|
outputs:
|
||||||
|
fully-qualified-target-images:
|
||||||
|
description: "List of fully qualified docker target images"
|
||||||
|
value: ${{ steps.gen-fqti.outputs.fully-qualified-target-images }}
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Generate fully qualified docker target images
|
||||||
|
id: gen-fqti
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
IFS=',' read -r -a registries <<< "${{ inputs.registries }}"
|
||||||
|
IFS=',' read -r -a images <<< "${{ inputs.images }}"
|
||||||
|
IFS=',' read -r -a tags <<< "${{ inputs.tags }}"
|
||||||
|
FQTI=""
|
||||||
|
echo "Generating fully qualified docker target images for:"
|
||||||
|
echo "🐋 Registries: ${#registries[@]}"
|
||||||
|
echo "📷 Images: ${#images[@]}"
|
||||||
|
echo "🏷️ Tags: ${#tags[@]}"
|
||||||
|
echo "🧮 Total: $((${#registries[@]}*${#images[@]}*${#tags[@]}))"
|
||||||
|
for registry in "${registries[@]}"; do
|
||||||
|
for image in "${images[@]}"; do
|
||||||
|
for tag in "${tags[@]}"; do
|
||||||
|
if [ -z "$FQTI" ]; then
|
||||||
|
FQTI="${registry}/${image}:${tag}"
|
||||||
|
else
|
||||||
|
FQTI="$FQTI,${registry}/${image}:${tag}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo ::set-output name=fully-qualified-target-images::${FQTI}
|
116
.github/workflows/docker.yaml
vendored
Normal file
116
.github/workflows/docker.yaml
vendored
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
name: varken
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 10 * * *'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
tags:
|
||||||
|
- 'v*.*.*'
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/docker.yaml'
|
||||||
|
- 'varken/**'
|
||||||
|
- 'Varken.py'
|
||||||
|
- 'Dockerfile'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/docker.yaml'
|
||||||
|
- 'varken/**'
|
||||||
|
- 'Varken.py'
|
||||||
|
- 'Dockerfile'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: 'Use this tag instead of most recent'
|
||||||
|
required: false
|
||||||
|
ignore-existing-tag:
|
||||||
|
description: 'Ignore existing tag if "true"'
|
||||||
|
required: false
|
||||||
|
env:
|
||||||
|
IMAGES: boerderij/varken
|
||||||
|
PLATFORMS: "linux/amd64,linux/arm64,linux/arm/v7"
|
||||||
|
jobs:
|
||||||
|
lint-and-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
- name: Lint
|
||||||
|
run: pip install flake8 && flake8 --max-line-length 120 Varken.py varken/*.py
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: lint-and-test
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Prepare
|
||||||
|
id: prep
|
||||||
|
run: |
|
||||||
|
VERSION=edge
|
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/v}
|
||||||
|
fi
|
||||||
|
if [ "${{ github.event_name }}" = "schedule" ]; then
|
||||||
|
VERSION=nightly
|
||||||
|
fi
|
||||||
|
if [[ ${GITHUB_REF##*/} == "develop" ]]; then
|
||||||
|
VERSION=develop
|
||||||
|
fi
|
||||||
|
TAGS="${VERSION}"
|
||||||
|
if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||||
|
TAGS="$TAGS,latest"
|
||||||
|
fi
|
||||||
|
echo ::set-output name=version::${VERSION}
|
||||||
|
echo ::set-output name=tags::${TAGS}
|
||||||
|
echo ::set-output name=branch::${GITHUB_REF##*/}
|
||||||
|
echo ::set-output name=build_date::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
echo ::set-output name=vcs_ref::${GITHUB_SHA::8}
|
||||||
|
- uses: ./.github/actions/docker-target-image-list-action
|
||||||
|
name: Generate Target Images
|
||||||
|
id: gen-tags
|
||||||
|
with:
|
||||||
|
images: ${{ env.IMAGES }}
|
||||||
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
with:
|
||||||
|
platforms: ${{ env.PLATFORMS }}
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
install: true
|
||||||
|
version: latest
|
||||||
|
driver-opts: image=moby/buildkit:master
|
||||||
|
- name: Docker Multi Login
|
||||||
|
uses: ./.github/actions/docker-multi-login-action
|
||||||
|
env:
|
||||||
|
secrets: ${{ toJSON(secrets) }}
|
||||||
|
- name: Build and Push
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
|
platforms: ${{ env.PLATFORMS }}
|
||||||
|
pull: true
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.gen-tags.outputs.fully-qualified-target-images }}
|
||||||
|
build-args: |
|
||||||
|
VERSION=${{ steps.prep.outputs.version }}
|
||||||
|
BRANCH=${{ steps.prep.outputs.branch }}
|
||||||
|
BUILD_DATE=${{ steps.prep.outputs.build_date }}
|
||||||
|
VCS_REF=${{ steps.prep.outputs.vcs_ref }}
|
||||||
|
- name: Inspect
|
||||||
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
|
run: |
|
||||||
|
IFS=',' read -r -a images <<< "${{ steps.gen-tags.outputs.fully-qualified-target-images }}"
|
||||||
|
for image in "${images[@]}"; do
|
||||||
|
docker buildx imagetools inspect ${image}
|
||||||
|
done
|
19
.github/workflows/invalid_template.yml
vendored
Normal file
19
.github/workflows/invalid_template.yml
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
name: 'Invalid Template'
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled, unlabeled, reopened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
support:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: dessant/support-requests@v2
|
||||||
|
with:
|
||||||
|
github-token: ${{ github.token }}
|
||||||
|
support-label: 'invalid:template-incomplete'
|
||||||
|
issue-comment: >
|
||||||
|
:wave: @{issue-author}, please edit your issue and follow the template provided.
|
||||||
|
close-issue: false
|
||||||
|
lock-issue: false
|
||||||
|
issue-lock-reason: 'resolved'
|
25
.github/workflows/support.yml
vendored
Normal file
25
.github/workflows/support.yml
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
name: 'Support Request'
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled, unlabeled, reopened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
support:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: dessant/support-requests@v2
|
||||||
|
with:
|
||||||
|
github-token: ${{ github.token }}
|
||||||
|
support-label: 'support'
|
||||||
|
issue-comment: >
|
||||||
|
:wave: @{issue-author}, we use the issue tracker exclusively
|
||||||
|
for bug reports and feature requests. However, this issue appears
|
||||||
|
to be a support request. Please use our support channels
|
||||||
|
to get help with Varken!
|
||||||
|
|
||||||
|
- [Discord](https://discord.gg/VjZ6qSM)
|
||||||
|
- [Discord Quick Access](http://cyborg.decreator.dev/channels/518970285773422592/530424560504537105/)
|
||||||
|
close-issue: true
|
||||||
|
lock-issue: false
|
||||||
|
issue-lock-reason: 'off-topic'
|
129
.gitlab-ci.yml
129
.gitlab-ci.yml
|
@ -1,129 +0,0 @@
|
||||||
stages:
|
|
||||||
- test
|
|
||||||
- build and push
|
|
||||||
- manifests
|
|
||||||
- release
|
|
||||||
|
|
||||||
.common_build: &common_build
|
|
||||||
image: docker:stable
|
|
||||||
stage: build and push
|
|
||||||
variables:
|
|
||||||
DOCKER_HOST: tcp://docker:2375/
|
|
||||||
DOCKER_DRIVER: overlay2
|
|
||||||
services:
|
|
||||||
- docker:dind
|
|
||||||
except:
|
|
||||||
- tags
|
|
||||||
only:
|
|
||||||
changes:
|
|
||||||
- "Dockerfile*"
|
|
||||||
- Varken.py
|
|
||||||
- varken/*
|
|
||||||
- .gitlab-ci.yml
|
|
||||||
before_script:
|
|
||||||
- mkdir $HOME/.docker
|
|
||||||
- echo '{"experimental":"enabled"}' > $HOME/.docker/config.json
|
|
||||||
- if [[ $CI_COMMIT_REF_NAME == "master" ]]; then
|
|
||||||
export TAG=$(grep -i version varken/__init__.py | cut -d \ -f3 | tr -d \");
|
|
||||||
else
|
|
||||||
export TAG="develop";
|
|
||||||
fi
|
|
||||||
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USER" --password-stdin
|
|
||||||
- export CI_PROJECT_PATH=$(echo $CI_PROJECT_PATH | tr "[:upper:]" "[:lower:]")
|
|
||||||
|
|
||||||
.common_release: &common_release
|
|
||||||
<<: *common_build
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- shared
|
|
||||||
only:
|
|
||||||
refs:
|
|
||||||
- master
|
|
||||||
|
|
||||||
flake8:
|
|
||||||
image: python:3.7.3-alpine
|
|
||||||
stage: test
|
|
||||||
cache:
|
|
||||||
key: "varken-cache"
|
|
||||||
paths:
|
|
||||||
- .cache/pip
|
|
||||||
- venv/
|
|
||||||
variables:
|
|
||||||
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
|
|
||||||
tags:
|
|
||||||
- shared
|
|
||||||
before_script:
|
|
||||||
- python -m venv venv
|
|
||||||
- source venv/bin/activate
|
|
||||||
- pip install -U flake8
|
|
||||||
script:
|
|
||||||
- flake8 --max-line-length 120 Varken.py varken/*.py
|
|
||||||
|
|
||||||
amd64:
|
|
||||||
<<: *common_build
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- shared
|
|
||||||
script:
|
|
||||||
- docker build --pull
|
|
||||||
--cache-from "$CI_PROJECT_PATH":"$TAG-amd64"
|
|
||||||
-t "$CI_PROJECT_PATH":"$TAG-amd64" .
|
|
||||||
- docker push "$CI_PROJECT_PATH":"$TAG-amd64"
|
|
||||||
|
|
||||||
armv6:
|
|
||||||
<<: *common_build
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- arm
|
|
||||||
script:
|
|
||||||
- docker build --pull
|
|
||||||
--cache-from "$CI_PROJECT_PATH":"$TAG-arm"
|
|
||||||
-t "$CI_PROJECT_PATH":"$TAG-arm"
|
|
||||||
-f Dockerfile.arm .
|
|
||||||
- docker push "$CI_PROJECT_PATH":"$TAG-arm"
|
|
||||||
|
|
||||||
arm64v8:
|
|
||||||
<<: *common_build
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- arm64
|
|
||||||
script:
|
|
||||||
- docker build --pull
|
|
||||||
--cache-from "$CI_PROJECT_PATH":"$TAG-arm64"
|
|
||||||
-t "$CI_PROJECT_PATH":"$TAG-arm64"
|
|
||||||
-f Dockerfile.arm64 .
|
|
||||||
- docker push "$CI_PROJECT_PATH":"$TAG-arm64"
|
|
||||||
|
|
||||||
versioned:
|
|
||||||
<<: *common_build
|
|
||||||
stage: manifests
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- shared
|
|
||||||
script:
|
|
||||||
- docker manifest create "$CI_PROJECT_PATH":"$TAG"
|
|
||||||
"$CI_PROJECT_PATH":"$TAG-amd64"
|
|
||||||
"$CI_PROJECT_PATH":"$TAG-arm64"
|
|
||||||
"$CI_PROJECT_PATH":"$TAG-arm"
|
|
||||||
- docker manifest push -p "$CI_PROJECT_PATH":"$TAG"
|
|
||||||
|
|
||||||
latest:
|
|
||||||
<<: *common_release
|
|
||||||
stage: manifests
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
script:
|
|
||||||
- docker manifest create "$CI_PROJECT_PATH":latest
|
|
||||||
"$CI_PROJECT_PATH":"$TAG-amd64"
|
|
||||||
"$CI_PROJECT_PATH":"$TAG-arm64"
|
|
||||||
"$CI_PROJECT_PATH":"$TAG-arm"
|
|
||||||
- docker manifest push -p "$CI_PROJECT_PATH":latest
|
|
||||||
|
|
||||||
github:
|
|
||||||
<<: *common_release
|
|
||||||
stage: release
|
|
||||||
script:
|
|
||||||
- apk add git
|
|
||||||
- git remote set-url origin "https://$GITHUB_USER:$GITHUB_TOKEN@github.com/$CI_PROJECT_PATH.git"
|
|
||||||
- git tag $TAG
|
|
||||||
- git push --tags
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
**Merged pull requests:**
|
**Merged pull requests:**
|
||||||
|
|
||||||
- v1.7.6 Merge [\#163](https://github.com/Boerderij/Varken/pull/163) ([samwiseg0](https://github.com/samwiseg0))
|
- v1.7.6 Merge [\#165](https://github.com/Boerderij/Varken/pull/165) ([samwiseg0](https://github.com/samwiseg0))
|
||||||
|
|
||||||
**Fixed bugs:**
|
**Fixed bugs:**
|
||||||
|
|
||||||
|
|
29
Dockerfile
29
Dockerfile
|
@ -1,10 +1,21 @@
|
||||||
FROM amd64/python:3.7.3-alpine
|
FROM python:3.9.1-alpine
|
||||||
|
|
||||||
LABEL maintainers="dirtycajunrice,samwiseg0"
|
ENV DEBUG="True" \
|
||||||
|
DATA_FOLDER="/config" \
|
||||||
|
VERSION="0.0.0" \
|
||||||
|
BRANCH="edge" \
|
||||||
|
BUILD_DATE="1/1/1970"
|
||||||
|
|
||||||
ENV DEBUG="True"
|
LABEL maintainer="dirtycajunrice,samwiseg0" \
|
||||||
|
org.opencontainers.image.created=$BUILD_DATE \
|
||||||
ENV DATA_FOLDER="/config"
|
org.opencontainers.image.url="https://github.com/Boerderij/Varken" \
|
||||||
|
org.opencontainers.image.source="https://github.com/Boerderij/Varken" \
|
||||||
|
org.opencontainers.image.version=$VERSION \
|
||||||
|
org.opencontainers.image.revision=$VCS_REF \
|
||||||
|
org.opencontainers.image.vendor="boerderij" \
|
||||||
|
org.opencontainers.image.title="varken" \
|
||||||
|
org.opencontainers.image.description="Varken is a standalone application to aggregate data from the Plex ecosystem into InfluxDB using Grafana for a frontend" \
|
||||||
|
org.opencontainers.image.licenses="MIT"
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
@ -16,9 +27,9 @@ COPY /data /app/data
|
||||||
|
|
||||||
COPY /utilities /app/data/utilities
|
COPY /utilities /app/data/utilities
|
||||||
|
|
||||||
RUN apk add --no-cache tzdata && \
|
RUN \
|
||||||
pip install --no-cache-dir -r /app/requirements.txt
|
apk add --no-cache tzdata \
|
||||||
|
&& pip install --no-cache-dir -r /app/requirements.txt \
|
||||||
|
&& sed -i "s/0.0.0/${VERSION}/;s/develop/${BRANCH}/;s/1\/1\/1970/${BUILD_DATE//\//\\/}/" varken/__init__.py
|
||||||
|
|
||||||
CMD cp /app/data/varken.example.ini /config/varken.example.ini && python3 /app/Varken.py
|
CMD cp /app/data/varken.example.ini /config/varken.example.ini && python3 /app/Varken.py
|
||||||
|
|
||||||
VOLUME /config
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
FROM arm32v6/python:3.7.3-alpine
|
|
||||||
|
|
||||||
LABEL maintainers="dirtycajunrice,samwiseg0"
|
|
||||||
|
|
||||||
ENV DEBUG="True"
|
|
||||||
|
|
||||||
ENV DATA_FOLDER="/config"
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY /requirements.txt /Varken.py /app/
|
|
||||||
|
|
||||||
COPY /varken /app/varken
|
|
||||||
|
|
||||||
COPY /data /app/data
|
|
||||||
|
|
||||||
RUN apk add --no-cache tzdata && \
|
|
||||||
pip install --no-cache-dir -r /app/requirements.txt
|
|
||||||
|
|
||||||
CMD cp /app/data/varken.example.ini /config/varken.example.ini && python3 /app/Varken.py
|
|
||||||
|
|
||||||
VOLUME /config
|
|
|
@ -1,22 +0,0 @@
|
||||||
FROM arm64v8/python:3.7.3-alpine
|
|
||||||
|
|
||||||
LABEL maintainers="dirtycajunrice,samwiseg0"
|
|
||||||
|
|
||||||
ENV DEBUG="True"
|
|
||||||
|
|
||||||
ENV DATA_FOLDER="/config"
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY /requirements.txt /Varken.py /app/
|
|
||||||
|
|
||||||
COPY /varken /app/varken
|
|
||||||
|
|
||||||
COPY /data /app/data
|
|
||||||
|
|
||||||
RUN apk add --no-cache tzdata && \
|
|
||||||
pip install --no-cache-dir -r /app/requirements.txt
|
|
||||||
|
|
||||||
CMD cp /app/data/varken.example.ini /config/varken.example.ini && python3 /app/Varken.py
|
|
||||||
|
|
||||||
VOLUME /config
|
|
|
@ -17,7 +17,7 @@ ecosystem into InfluxDB using Grafana for a frontend
|
||||||
Requirements:
|
Requirements:
|
||||||
* [Python 3.6.7+](https://www.python.org/downloads/release/python-367/)
|
* [Python 3.6.7+](https://www.python.org/downloads/release/python-367/)
|
||||||
* [Python3-pip](https://pip.pypa.io/en/stable/installing/)
|
* [Python3-pip](https://pip.pypa.io/en/stable/installing/)
|
||||||
* [InfluxDB](https://www.influxdata.com/)
|
* [InfluxDB 1.8.x](https://www.influxdata.com/)
|
||||||
* [Grafana](https://grafana.com/)
|
* [Grafana](https://grafana.com/)
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
@ -32,7 +32,6 @@ Supported Modules:
|
||||||
* [Radarr](https://radarr.video/) - A fork of Sonarr to work with movies à la Couchpotato.
|
* [Radarr](https://radarr.video/) - A fork of Sonarr to work with movies à la Couchpotato.
|
||||||
* [Tautulli](https://tautulli.com/) - A Python based monitoring and tracking tool for Plex Media Server.
|
* [Tautulli](https://tautulli.com/) - A Python based monitoring and tracking tool for Plex Media Server.
|
||||||
* [Ombi](https://ombi.io/) - Want a Movie or TV Show on Plex or Emby? Use Ombi!
|
* [Ombi](https://ombi.io/) - Want a Movie or TV Show on Plex or Emby? Use Ombi!
|
||||||
* [Unifi](https://unifi-sdn.ubnt.com/) - The Global Leader in Managed Wi-Fi Systems
|
|
||||||
* [Lidarr](https://lidarr.audio/) - Looks and smells like Sonarr but made for music.
|
* [Lidarr](https://lidarr.audio/) - Looks and smells like Sonarr but made for music.
|
||||||
|
|
||||||
Key features:
|
Key features:
|
||||||
|
@ -51,6 +50,7 @@ Please read [Asking for Support](https://wiki.cajun.pro/books/varken/chapter/ask
|
||||||
|
|
||||||
### InfluxDB
|
### InfluxDB
|
||||||
[InfluxDB Installation Documentation](https://wiki.cajun.pro/books/varken/page/influxdb-d1f)
|
[InfluxDB Installation Documentation](https://wiki.cajun.pro/books/varken/page/influxdb-d1f)
|
||||||
|
Note: Only v1.8.x is currently supported.
|
||||||
|
|
||||||
Influxdb is required but not packaged as part of Varken. Varken will create
|
Influxdb is required but not packaged as part of Varken. Varken will create
|
||||||
its database on its own. If you choose to give varken user permissions that
|
its database on its own. If you choose to give varken user permissions that
|
||||||
|
|
|
@ -15,7 +15,7 @@ from logging import getLogger, StreamHandler, Formatter, DEBUG
|
||||||
from varken import structures # noqa
|
from varken import structures # noqa
|
||||||
from varken.ombi import OmbiAPI
|
from varken.ombi import OmbiAPI
|
||||||
from varken.unifi import UniFiAPI
|
from varken.unifi import UniFiAPI
|
||||||
from varken import VERSION, BRANCH
|
from varken import VERSION, BRANCH, BUILD_DATE
|
||||||
from varken.sonarr import SonarrAPI
|
from varken.sonarr import SonarrAPI
|
||||||
from varken.radarr import RadarrAPI
|
from varken.radarr import RadarrAPI
|
||||||
from varken.lidarr import LidarrAPI
|
from varken.lidarr import LidarrAPI
|
||||||
|
@ -87,7 +87,7 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
vl.logger.info(u"Python %s", version)
|
vl.logger.info(u"Python %s", version)
|
||||||
|
|
||||||
vl.logger.info("Varken v%s-%s", VERSION, BRANCH)
|
vl.logger.info("Varken v%s-%s %s", VERSION, BRANCH, BUILD_DATE)
|
||||||
|
|
||||||
CONFIG = INIParser(DATA_FOLDER)
|
CONFIG = INIParser(DATA_FOLDER)
|
||||||
DBMANAGER = DBManager(CONFIG.influx_server)
|
DBMANAGER = DBManager(CONFIG.influx_server)
|
||||||
|
|
|
@ -107,14 +107,6 @@ services:
|
||||||
- VRKN_SICKCHILL_1_VERIFY_SSL=false
|
- VRKN_SICKCHILL_1_VERIFY_SSL=false
|
||||||
- VRKN_SICKCHILL_1_GET_MISSING=true
|
- VRKN_SICKCHILL_1_GET_MISSING=true
|
||||||
- VRKN_SICKCHILL_1_GET_MISSING_RUN_SECONDS=300
|
- VRKN_SICKCHILL_1_GET_MISSING_RUN_SECONDS=300
|
||||||
- VRKN_UNIFI_1_URL=unifi.domain.tld:8443
|
|
||||||
- VRKN_UNIFI_1_USERNAME=ubnt
|
|
||||||
- VRKN_UNIFI_1_PASSWORD=ubnt
|
|
||||||
- VRKN_UNIFI_1_SITE=default
|
|
||||||
- VRKN_UNIFI_1_USG_NAME=MyRouter
|
|
||||||
- VRKN_UNIFI_1_SSL=false
|
|
||||||
- VRKN_UNIFI_1_VERIFY_SSL=false
|
|
||||||
- VRKN_UNIFI_1_GET_USG_STATS_RUN_SECONDS=300
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- influxdb
|
- influxdb
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
VERSION = "1.7.6"
|
VERSION = "0.0.0"
|
||||||
BRANCH = 'master'
|
BRANCH = 'develop'
|
||||||
|
BUILD_DATE = '1/1/1970'
|
||||||
|
|
|
@ -20,7 +20,7 @@ class DBManager(object):
|
||||||
self.logger.info('Influxdb version: %s', version)
|
self.logger.info('Influxdb version: %s', version)
|
||||||
except ConnectionError:
|
except ConnectionError:
|
||||||
self.logger.critical("Error testing connection to InfluxDB. Please check your url/hostname")
|
self.logger.critical("Error testing connection to InfluxDB. Please check your url/hostname")
|
||||||
exit()
|
exit(1)
|
||||||
|
|
||||||
databases = [db['name'] for db in self.influx.get_list_database()]
|
databases = [db['name'] for db in self.influx.get_list_database()]
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,7 @@ class INIParser(object):
|
||||||
server_id)
|
server_id)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
maxmind_license_key = env.get(f'VRKN_GLOBAL_MAXMIND_LICENSE_KEY',
|
maxmind_license_key = env.get('VRKN_GLOBAL_MAXMIND_LICENSE_KEY',
|
||||||
self.config.get('global', 'maxmind_license_key'))
|
self.config.get('global', 'maxmind_license_key'))
|
||||||
|
|
||||||
server = TautulliServer(id=server_id, url=scheme + url, api_key=apikey,
|
server = TautulliServer(id=server_id, url=scheme + url, api_key=apikey,
|
||||||
|
|
|
@ -140,6 +140,7 @@ class OmbiTVRequest(NamedTuple):
|
||||||
totalSeasons: int = None
|
totalSeasons: int = None
|
||||||
tvDbId: int = None
|
tvDbId: int = None
|
||||||
requestedByAlias: str = None
|
requestedByAlias: str = None
|
||||||
|
requestStatus: str = None
|
||||||
|
|
||||||
|
|
||||||
class OmbiMovieRequest(NamedTuple):
|
class OmbiMovieRequest(NamedTuple):
|
||||||
|
@ -176,6 +177,7 @@ class OmbiMovieRequest(NamedTuple):
|
||||||
langCode: str = None
|
langCode: str = None
|
||||||
languageCode: str = None
|
languageCode: str = None
|
||||||
requestedByAlias: str = None
|
requestedByAlias: str = None
|
||||||
|
requestStatus: str = None
|
||||||
|
|
||||||
|
|
||||||
# Sonarr
|
# Sonarr
|
||||||
|
@ -494,6 +496,7 @@ class LidarrQueue(NamedTuple):
|
||||||
protocol: str = None
|
protocol: str = None
|
||||||
downloadClient: str = None
|
downloadClient: str = None
|
||||||
indexer: str = None
|
indexer: str = None
|
||||||
|
outputPath: str = None
|
||||||
downloadForced: bool = None
|
downloadForced: bool = None
|
||||||
id: int = None
|
id: int = None
|
||||||
|
|
||||||
|
|
|
@ -218,6 +218,7 @@ class TautulliAPI(object):
|
||||||
data['fields']['episodes'] = int(library['child_count'])
|
data['fields']['episodes'] = int(library['child_count'])
|
||||||
|
|
||||||
elif library['section_type'] == 'artist':
|
elif library['section_type'] == 'artist':
|
||||||
|
data['fields']['artists'] = int(library['count'])
|
||||||
data['fields']['albums'] = int(library['parent_count'])
|
data['fields']['albums'] = int(library['parent_count'])
|
||||||
data['fields']['tracks'] = int(library['child_count'])
|
data['fields']['tracks'] = int(library['child_count'])
|
||||||
influx_payload.append(data)
|
influx_payload.append(data)
|
||||||
|
|
|
@ -27,7 +27,7 @@ class UniFiAPI(object):
|
||||||
post = connection_handler(self.session, req, self.server.verify_ssl, as_is_reply=True)
|
post = connection_handler(self.session, req, self.server.verify_ssl, as_is_reply=True)
|
||||||
|
|
||||||
if not post or not post.cookies.get('unifises'):
|
if not post or not post.cookies.get('unifises'):
|
||||||
self.logger.error(f"Could not retrieve session cookie from UniFi Controller")
|
self.logger.error("Could not retrieve session cookie from UniFi Controller")
|
||||||
return
|
return
|
||||||
|
|
||||||
cookies = {'unifises': post.cookies.get('unifises')}
|
cookies = {'unifises': post.cookies.get('unifises')}
|
||||||
|
@ -39,7 +39,7 @@ class UniFiAPI(object):
|
||||||
get = connection_handler(self.session, req, self.server.verify_ssl)
|
get = connection_handler(self.session, req, self.server.verify_ssl)
|
||||||
|
|
||||||
if not get:
|
if not get:
|
||||||
self.logger.error(f"Could not get list of sites from UniFi Controller")
|
self.logger.error("Could not get list of sites from UniFi Controller")
|
||||||
return
|
return
|
||||||
site = [site['name'] for site in get['data'] if site['name'].lower() == self.server.site.lower()
|
site = [site['name'] for site in get['data'] if site['name'].lower() == self.server.site.lower()
|
||||||
or site['desc'].lower() == self.server.site.lower()]
|
or site['desc'].lower() == self.server.site.lower()]
|
||||||
|
|
Loading…
Reference in a new issue