diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..032f121 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,29 @@ +{ + "containerEnv": { + "WORKSPACE_DIRECTORY": "${containerWorkspaceFolder}" + }, + "extensions": [ + "timonwong.shellcheck", + "esbenp.prettier-vscode" + ], + "image": "ghcr.io/home-assistant/devcontainer:addons", + "name": "Example Home Assistant add-on repository", + "postStartCommand": ".devcontainer/setup.sh", + "runArgs": [ + "-e", + "GIT_EDITOR=code --wait", + "--privileged" + ], + "settings": { + "editor.formatOnPaste": false, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "files.trimTrailingWhitespace": true, + "terminal.integrated.defaultProfile.linux": "zsh", + "terminal.integrated.profiles.linux": { + "zsh": { + "path": "/usr/bin/zsh" + } + } + } +} diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 0000000..3f1eebd --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# Install pre-commit +sudo apt install -y pre-commit +pre-commit install diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..421a859 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 MrRaph_ + +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. diff --git a/README.md b/README.md index 577d2cb..6f00410 100644 --- a/README.md +++ b/README.md @@ -1 +1,7 @@ -# hassio-addons \ No newline at end of file +# MrRaph_'s custom Home Assistant addons + +This repository defines a few custom addons for Home Assistant. Notably: + +- [Kresus](./kresus): sets-up a [Kresus](https://kresus.org/) instance which is a personal finances management software. + +These addons are published under [MIT license](./LICENSE). diff --git a/kresus/CHANGELOG.md b/kresus/CHANGELOG.md new file mode 100644 index 0000000..1e4983e --- /dev/null +++ b/kresus/CHANGELOG.md @@ -0,0 +1,37 @@ +## 0.6.2 + +- Update woob dependencies install method + +## 0.6.1 + +- Remove support for i386 architecture + +## 0.6.0 + +- Bump Kresus to 0.19.0 + +## 0.5.1 + +- Fix AppArmor profile + +## 0.5.0 + +- Attempt using `alpine:edge` as base image + +## 0.4.2 + +- Fix AppArmor profile + +## 0.4.1 + +- Reinstall py3-lxml by default + +## 0.4.0 + +- Remove python dependencies from Dockerfile to prevent + incompatibility with woob requirements + +## 0.3.0 + +- Use `s6-setuidgid` instead of `su-exec` +- Set AppArmor in complain mode diff --git a/kresus/DOCS.md b/kresus/DOCS.md new file mode 100644 index 0000000..a6484b0 --- /dev/null +++ b/kresus/DOCS.md @@ -0,0 +1,54 @@ +# Home Assistant Custom Add-on: Kresus + +[Kresus](https://kresus.org/) is an open-source self-hostable Personal Finance Manager. +It automatically retrieves your daily bank transactions, lets you categorize them and manage your monthly budgets. + +It relies on [woob](https://gitlab.com/woob/woob) to fetch data from your bank website. + +## Installation + +Kresus requires a PostgreSQL database to store data. +If you do not already have a PostgreSQL database installed, you may consider the [PostgreSQL addon](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres). + +The installation of Kresus add-on is quite straightforward and do not differ from the standard installation process for Home-Assistant add-ons: + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Start the "Kresus" add-on. +1. Check the logs of the "Kresus" add-on to see if everything + went well. A working installation should indicate `Server is ready, let's start the show!` +1. Click the "OPEN WEB UI" button to open Kresus UI. + +## Configuration + +The only configuration configurations required are the database connection options. +If you used the [PostgreSQL add-on](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres) configured with following options: + +```yaml +databases: + - kresus_db +logins: + - password: CHANGEME_kr3sus-p@ssword_CHANGEME + username: kresus_user +rights: + - database: kresus_db + username: kresus_user +``` + +then you may configure kresus with these options: + +```yaml +postgres_hostname: homeassistant.local +postgres_port: 5432 +postgres_user: kresus_user +postgres_password: CHANGEME_kr3sus-p@ssword_CHANGEME +postgres_database: kresus_db +``` + +## Authors & contributors + +The original setup of this repository is by [Ezlo Picori](https://github.com/ezlo-picori). diff --git a/kresus/Dockerfile b/kresus/Dockerfile new file mode 100644 index 0000000..c9fc360 --- /dev/null +++ b/kresus/Dockerfile @@ -0,0 +1,108 @@ +ARG BUILD_FROM +FROM $BUILD_FROM + +# Default ENV +ENV \ + LANG="C.UTF-8" \ + S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ + S6_CMD_WAIT_FOR_SERVICES=1 \ + S6_SERVICES_READYTIME=50 + +# Set shell +SHELL ["/bin/ash", "-o", "pipefail", "-c"] + +# Build Args +ARG \ + BASHIO_VERSION \ + TEMPIO_VERSION \ + S6_OVERLAY_VERSION \ + JEMALLOC_VERSION \ + QEMU_CPU + +# Base system +WORKDIR /usr/src +ARG BUILD_ARCH + +RUN \ + set -x \ + && apk add --no-cache \ + bash \ + bind-tools \ + ca-certificates \ + curl \ + jq \ + tzdata \ + xz \ + \ + && apk add --no-cache --virtual .build-deps \ + build-base \ + autoconf \ + git \ + \ + && if [ "${BUILD_ARCH}" = "armv7" ]; then \ + export S6_ARCH="arm"; \ + elif [ "${BUILD_ARCH}" = "i386" ]; then \ + export S6_ARCH="i686"; \ + elif [ "${BUILD_ARCH}" = "amd64" ]; then \ + export S6_ARCH="x86_64"; \ + else \ + export S6_ARCH="${BUILD_ARCH}"; \ + fi \ + \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz" \ + | tar Jxvf - -C / \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz" \ + | tar Jxvf - -C / \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-arch.tar.xz" \ + | tar Jxvf - -C / \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-noarch.tar.xz" \ + | tar Jxvf - -C / \ + && mkdir -p /etc/fix-attrs.d \ + && mkdir -p /etc/services.d \ + \ + && git clone "https://github.com/jemalloc/jemalloc" /usr/src/jemalloc \ + && cd /usr/src/jemalloc \ + && git checkout ${JEMALLOC_VERSION} \ + && ./autogen.sh \ + && make -j "$(nproc)" \ + && make install \ + \ + && mkdir -p /usr/src/bashio \ + && curl -L -f -s "https://github.com/hassio-addons/bashio/archive/v${BASHIO_VERSION}.tar.gz" \ + | tar -xzf - --strip 1 -C /usr/src/bashio \ + && mv /usr/src/bashio/lib /usr/lib/bashio \ + && ln -s /usr/lib/bashio/bashio /usr/bin/bashio \ + \ + && curl -L -f -s -o /usr/bin/tempio \ + "https://github.com/home-assistant/tempio/releases/download/${TEMPIO_VERSION}/tempio_${BUILD_ARCH}" \ + && chmod a+x /usr/bin/tempio \ + \ + && apk del .build-deps \ + && rm -rf /usr/src/* + +# S6-Overlay +WORKDIR / +ENTRYPOINT ["/init"] + +# Copy root filesystem +COPY rootfs / + +# Setup base +RUN apk add --no-cache \ + gcc g++ gpgv jpeg-dev pwgen python3-dev py3-lxml py3-pip \ + py3-wheel make nodejs npm zlib-dev && \ + pip install -r /requirements.txt && \ + npm install --omit=dev -g kresus@0.19.0 && \ + addgroup kresus && \ + adduser -G kresus -D -H kresus && \ + mkdir -p /woob && \ + chown kresus:kresus /woob && \ + chown -R kresus:kresus /etc/kresus && \ + chmod 0400 /etc/kresus/config.ini && \ + chmod 0755 /etc/kresus + +ENV KRESUS_DIR="/data/kresus" +ENV KRESUS_USER="kresus" + +WORKDIR / diff --git a/kresus/README.md b/kresus/README.md new file mode 100644 index 0000000..d20aef7 --- /dev/null +++ b/kresus/README.md @@ -0,0 +1,25 @@ +# Home Assistant Add-on: Kresus + +Open source personal accounting solution. + +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports armhf Architecture][armhf-shield] +![Supports armv7 Architecture][armv7-shield] +![Supports i386 Architecture][i386-shield] + +## About + +[Kresus][kresus] is a free solution for personal accounting management. +It automatically retrieves your daily bank transactions, lets you categorize them +and manage your monthly budgets. + +![Kresus Preview][screenshot] + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[i386-shield]: https://img.shields.io/badge/i386-no-red.svg +[screenshot]: https://kresus.org/images/pages/view-all-accounts.png +[kresus]: https://kresus.org/ diff --git a/kresus/apparmor.txt b/kresus/apparmor.txt new file mode 100644 index 0000000..44f634b --- /dev/null +++ b/kresus/apparmor.txt @@ -0,0 +1,72 @@ +include + +profile kresus flags=(attach_disconnected,mediate_deleted) { + #include + + # Capabilities + file, + signal (send) set=(kill,term,int,hup,cont), + capability chown, + capability fowner, + capability kill, + + # S6-Overlay + /init ix, + /bin/** ix, + /usr/bin/** ix, + /run/{s6,s6-rc*,service}/** ix, + /package/** ix, + /command/** ix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /run/{,**} rwk, + /dev/tty rw, + + # Access to options.json and other files within your addon + /data/options.json r, + /data/kresus/{,**} rw, + + /package/admin/s6-2.11.2.0/command/s6-applyuidgid cx -> s6setuidgid, + profile s6setuidgid flags=(attach_disconnected,mediate_deleted) { + #include + capability setuid, + capability setgid, + + signal (receive) set=("cont","kill","term"), + + # Generic accesses + /package/admin/s6-2.11.2.0/command/s6-applyuidgid rm, + + /bin/{bash,busybox} ix, + /dev/{null,tty} rw, + /etc/{group,hosts,os-release,passwd,resolv.conf,ssl/**} r, + /package/admin/** rmix, + /run/s6/container_environment** r, + /tmp/.bashio/{,**} rw, + /usr/bin/{curl,jq,ssl_client} rix, + /usr/lib/bashio/bashio ix, + /lib/** rmix, + /tmp/pip-install-** rw, + + # Kresus specific accesses + /data/kresus_salt r, + /data/kresus/{,**} rw, + /etc/kresus/config.ini r, + /woob/ r, + /woob/** lrw, + /woob/.py-deps/** lrwix, + + /usr/bin/{,**} r, + /usr/bin/git ix, + /usr/bin/gpgv ix, + /usr/bin/node ix, + /usr/bin/python3.11 ix, + /usr/bin/pip3 rix, + /usr/libexec/git-core/** ix, + /usr/libexec/kresus/** rix, + /usr/local/lib/node_modules/** rm, + /usr/local/lib/node_modules/kresus/bin/kresus.js rix, + /usr/share/** r, + } +} diff --git a/kresus/build.yaml b/kresus/build.yaml new file mode 100644 index 0000000..a953b79 --- /dev/null +++ b/kresus/build.yaml @@ -0,0 +1,18 @@ +build_from: + aarch64: "arm64v8/alpine:edge" + armv7: "arm32v7/alpine:edge" + armhf: "arm32v6/alpine:edge" + amd64: "alpine:edge" +labels: + org.opencontainers.image.title: "Home Assistant Add-on: Kresus" + org.opencontainers.image.description: "Kresus addon" + org.opencontainers.image.source: "https://github.com/ezlo-picori/hassio-addons" + org.opencontainers.image.licenses: "MIT License" + io.hass.base.name: alpine +codenotary: + signer: ezlo@protonmail.com +args: + BASHIO_VERSION: 0.14.3 + TEMPIO_VERSION: 2021.09.0 + S6_OVERLAY_VERSION: 3.1.3.0 + JEMALLOC_VERSION: 5.3.0 diff --git a/kresus/config.yaml b/kresus/config.yaml new file mode 100644 index 0000000..0a9d78a --- /dev/null +++ b/kresus/config.yaml @@ -0,0 +1,33 @@ +name: Kresus +version: "0.6.2" +slug: kresus +codenotary: ezlo@protonmail.com +url: "https://github.com/ezlo-picori/hassio-addons/tree/main/kresus" +description: Open source personal accounting management +arch: + - armhf + - armv7 + - aarch64 + - amd64 +image: "ghcr.io/ezlo-picori/haos-addon-kresus-{arch}" +init: false +options: + postgres_hostname: homeassistant.local + postgres_port: 5432 + postgres_user: kresus + postgres_password: null + postgres_database: kresus +panel_icon: mdi:piggy-bank-outline +ports: + 9876/tcp: 9876 +ports_description: + 9876/tcp: "The port to access kresus web server." +schema: + postgres_hostname: str + postgres_port: int + postgres_user: str + postgres_password: password + postgres_database: str + http_basicauth: str? +startup: system +timeout: 20 diff --git a/kresus/icon.png b/kresus/icon.png new file mode 100644 index 0000000..df04d0d Binary files /dev/null and b/kresus/icon.png differ diff --git a/kresus/logo.png b/kresus/logo.png new file mode 100644 index 0000000..df04d0d Binary files /dev/null and b/kresus/logo.png differ diff --git a/kresus/rootfs/etc/kresus/config.ini b/kresus/rootfs/etc/kresus/config.ini new file mode 100644 index 0000000..defb96e --- /dev/null +++ b/kresus/rootfs/etc/kresus/config.ini @@ -0,0 +1,270 @@ +; Hi there! This is the configuration file for +; Kresus. Please make sure to read all the options before setting up +; Kresus for the first time. +; +[kresus] + +; This is where Kresus stores additional data, as the latest bank +; scrapping modules. It should be writeable by the user which launches +; the Kresus executable. +; Can be removed; defaults to HOME_DIR/.kresus. +; Overriden by the KRESUS_DIR environment variable, if it's set. +; Example: +; datadir=/home/ben/.kresus +datadir= + +; A user id obtained from using the "kresus create-user" command. +; This allows sharing a single database with several users. If your +; instance is only planned to host a single user, you can keep it +; disabled, and Kresus will know how to automatically generate a new +; user. +; Overriden by the KRESUS_USER_ID environment variable, if it's set. +; Example: +; userid=1 +userid= + +; This is the port that Kresus will run on. It is recommended not +; to expose it on port 80 directly but to use a reverse-proxy +; configuration like Nginx, Caddy or Apache. +; Can be removed; defaults to 9876. +; Overriden by the PORT environment variable, if it's set. +; Example: +; port=9876 +port= + +; The host on which the Kresus server will listen to. +; Can be removed; defaults to 127.0.0.1. +; Overriden by the HOST environment variable, if it's set. +; Example: +; host=127.0.0.1 +host= + +; The executable version of Python that is going to get used when +; interacting with Python scripts. This can be python or python3. +; Can be removed; defaults to python3. +; Overriden by the KRESUS_PYTHON_EXEC environment variable, if it's set. +; Example: +; python_exec=python3 +python_exec= + +; The directory prefix in the URL, if Kresus is to be served from a +; subdirectory. For instance, if your website is hosted at example.com +; and the url prefix is "money", then Kresus will be reachable at +; example.com/money. By default, it's '', meaning that Kresus has its own +; subdomain. +; Can be removed; defaults to "". +; Overriden by the KRESUS_URL_PREFIX environment variable, if it's set. +; Example: +; url_prefix=/money +url_prefix= + +; A salt value used in encryption algorithms (used for instance to +; encrypt/decrypt exports). It should be a random string value with +; at least 16 characters if you decide to provide it. +; Overriden by the KRESUS_SALT environment variable, if it's set. +; Example: +; salt=gj4J89fkjf4h29aDi0f{}fu4389sejk`9osk` +salt= + +; Set this to true if you want to use this instance only in demo +; mode, and to never allow users to link their personal accounts. +; +; WARNING! Switching this on and off may trigger data loss. Note that it +; is still possible to try Kresus in demo mode, even if this is not set +; to true. Setting this to true will *force* demo mode, and prevent users +; from leaving this mode. +; Can be removed; defaults to false. +; Overriden by the KRESUS_FORCE_DEMO_MODE environment variable, if it's set. +; Example: +; force_demo_mode=true +force_demo_mode= + +; If set to a string, will enable HTTP Basic Auth, by splitting the +; string on a colon, i.e. ":" +; Overriden by the KRESUS_AUTH environment variable, if it's set. +; Example: +; auth=foo:bar +auth= + +[woob] + +; The directory in which Woob core is stored. If empty, indicates +; that woob is already in the PYTHON_PATH (e.g. installed at the global +; level) +; Overriden by the KRESUS_WOOB_DIR environment variable, if it's set. +; Example: +; srcdir=/home/ben/code/woob +srcdir= + +; Path to a file containing a valid Woob's source list directory. +; If empty (the default), indicates that Kresus will generate its own +; source list file and will store it in +; KRESUS_DIR/woob-data/sources.list. +; Overriden by the KRESUS_WOOB_SOURCES_LIST environment variable, if it's set. +; Example: +; sources_list=/home/ben/code/woob/sources.list +sources_list= + +[email] + +; The transport method you want to use. Can be either: +; * "sendmail": relies on sendmail executable to be available on your +; system and only sendmail-specific parameters are used, +; +; * "smtp": you should provide proper SMTP credentials to use, in the +; dedicated configuration entries. +; +; If empty, no emails will be sent by Kresus. +; Overriden by the KRESUS_EMAIL_TRANSPORT environment variable, if it's set. +; Example: +; transport=smtp +transport= + +; The path to the sendmail executable to use. If empty, indicates +; that the default sendmail executable will be used. +; Overriden by the KRESUS_EMAIL_SENDMAIL_BIN environment variable, if it's set. +; Example: +; sendmail_bin=/usr/bin/sendmail +sendmail_bin= + +; The email address from which email alerts will be sent. Make sure +; that your domain DNS is correctly configured and that you've done +; what's needed to prevent email alerts from landing in the spam folder. +; Overriden by the KRESUS_EMAIL_FROM environment variable, if it's set. +; Example: +; from=kresus@domain.tld +from= + +; The network address (ipv4, ipv6 or FQDN) of the SMTP server. +; Overriden by the KRESUS_EMAIL_HOST environment variable, if it's set. +; Example: +; host=mail.domain.tld +host= + +; The port to which the SMTP server listens. Default values tend to +; be: 25 (server to server), or 587 (clients to server), or 465 +; (nonstandard). +; Overriden by the KRESUS_EMAIL_PORT environment variable, if it's set. +; Example: +; port=465 +port= + +; The username used during authentication to the SMTP server. If +; empty, indicates an anonymous connection will be used. +; Overriden by the KRESUS_EMAIL_USER environment variable, if it's set. +; Example: +; user=login +user= + +; The password used during authentication to the SMTP server. If +; empty, indicates no password will be used. +; Overriden by the KRESUS_EMAIL_PASSWORD environment variable, if it's set. +; Example: +; password=hunter2 +password= + +; If set to true, will force using a TLS connection. By default, +; emails are sent with STARTTLS, i.e. using TLS if available. +; Can be removed; defaults to false. +; Overriden by the KRESUS_EMAIL_FORCE_TLS environment variable, if it's set. +; Example: +; force_tls=false +force_tls= + +; If set to false, will allow self-signed TLS certificates. +; Can be removed; defaults to true. +; Overriden by the KRESUS_EMAIL_REJECT_UNAUTHORIZED_TLS environment variable, if it's set. +; Example: +; reject_unauthorized_tls=true +reject_unauthorized_tls= + +[notifications] + +; The baseurl from which apprise-api will be called for +; notifications to be sent. +; See https://github.com/caronc/apprise-api#installation for +; installation +; Overriden by the KRESUS_APPRISE_API_BASE_URL environment variable, if it's set. +; Example: +; appriseApiBaseUrl=http://localhost:8000/ +appriseApiBaseUrl= + +[logs] + +; The path to the log file to use. If empty, defaults to kresus.log +; in datadir. +; Overriden by the KRESUS_LOG_FILE environment variable, if it's set. +; Example: +; log_file=/var/log/kresus.log +log_file= + +[db] + +; Database type supported by Kresus, to choose among: +; - postgres +; - sqlite +; +; It must be set by the user. PostgreSQL is recommended and strongly supported; your experience with other databases might vary. +; +; Note using sqlite is *strongly discouraged* because it can't properly handle certain kinds of database migrations. It is only intended for development purposes. +; Overriden by the KRESUS_DB_TYPE environment variable, if it's set. +; Example: +; type=sqlite +type= + +; Logging level for the SQL queries. Possible values are: +; +; - all: will log every SQL query, including queries causing errors. +; - error (default value): will only log SQL queries resulting in errors. This is useful for debugging purposes. +; - none: nothing will be logged. +; Can be removed; defaults to error. +; Overriden by the KRESUS_DB_LOG environment variable, if it's set. +; Example: +; log=error +log= + +; Path to the sqlite database file. Make sure that the user running +; Kresus has the right permissions to write into this file. Required only for +; sqlite. +; Overriden by the KRESUS_DB_SQLITE_PATH environment variable, if it's set. +; Example: +; sqlite_path=/tmp/dev.sqlite +sqlite_path= + +; Path to a directory containing a Unix socket to connect to the +; database, or host address of the database server. Required for postgres. +; +; If using a Unix socket, the socket file's name will be inferred from the +; standard postgres name and the port number. +; Can be removed; defaults to localhost for postgres. +; Overriden by the KRESUS_DB_HOST environment variable, if it's set. +; Example: +; host=localhost +host= + +; Port of the database server. Required for postgres, even when +; using a Unix socket (the port is used to compute the socket's file name). +; Can be removed; defaults to 5432 for postgres. +; Overriden by the KRESUS_DB_PORT environment variable, if it's set. +; Example: +; port=5432 +port= + +; Username to connect to the database server. Required for postgres. +; Overriden by the KRESUS_DB_USERNAME environment variable, if it's set. +; Example: +; username=benjamin +username= + +; Password to connect to the database server. Required for postgres. +; Overriden by the KRESUS_DB_PASSWORD environment variable, if it's set. +; Example: +; password=hunter2 +password= + +; Database name to use. Required for postgres. +; Can be removed; defaults to kresus. +; Overriden by the KRESUS_DB_NAME environment variable, if it's set. +; Example: +; name=kresus +name= diff --git a/kresus/rootfs/etc/services.d/kresus/finish b/kresus/rootfs/etc/services.d/kresus/finish new file mode 100755 index 0000000..230d179 --- /dev/null +++ b/kresus/rootfs/etc/services.d/kresus/finish @@ -0,0 +1,15 @@ +#!/usr/bin/env bashio +# ============================================================================== +# Take down the S6 supervision tree when example fails +# s6-overlay docs: https://github.com/just-containers/s6-overlay +# ============================================================================== + +declare APP_EXIT_CODE=${1} + +if [[ "${APP_EXIT_CODE}" -ne 0 ]] && [[ "${APP_EXIT_CODE}" -ne 256 ]]; then + bashio::log.warning "Halt add-on with exit code ${APP_EXIT_CODE}" + echo "${APP_EXIT_CODE}" > /run/s6-linux-init-container-results/exitcode + exec /run/s6/basedir/bin/halt +fi + +bashio::log.info "Service restart after closing" diff --git a/kresus/rootfs/etc/services.d/kresus/run b/kresus/rootfs/etc/services.d/kresus/run new file mode 100755 index 0000000..d8bcbce --- /dev/null +++ b/kresus/rootfs/etc/services.d/kresus/run @@ -0,0 +1,25 @@ +#!/usr/bin/with-contenv bashio + +# ============================================================================== +# Init data directory +# ============================================================================== +if ! bashio::fs.directory_exists "${KRESUS_DIR}"; then + bashio::log.info "Create data directory \"${KRESUS_DIR}\"" + mkdir "${KRESUS_DIR}" + chown "${KRESUS_USER}:${KRESUS_USER}" "${KRESUS_DIR}" + chmod 0700 "${KRESUS_DIR}" +fi + +# ============================================================================== +# Generate Kresus salt once +# ============================================================================== +if ! bashio::fs.file_exists "/data/kresus_salt"; then + pwgen 32 1 > /data/kresus_salt + chown "${KRESUS_USER}:${KRESUS_USER}" /data/kresus_salt + chmod 400 /data/kresus_salt +fi + +# ============================================================================== +# Start service as unprivileged user +# ============================================================================== +exec s6-setuidgid "${KRESUS_USER}" /usr/libexec/kresus/start.sh diff --git a/kresus/rootfs/requirements.txt b/kresus/rootfs/requirements.txt new file mode 100644 index 0000000..40ff3e1 --- /dev/null +++ b/kresus/rootfs/requirements.txt @@ -0,0 +1 @@ +python-jose \ No newline at end of file diff --git a/kresus/rootfs/usr/libexec/kresus/start.sh b/kresus/rootfs/usr/libexec/kresus/start.sh new file mode 100755 index 0000000..a03d20d --- /dev/null +++ b/kresus/rootfs/usr/libexec/kresus/start.sh @@ -0,0 +1,55 @@ +#!/usr/bin/with-contenv bashio +WOOB_DIR="/woob" +KRESUS_INI_FILE="/etc/kresus/config.ini" + +# ============================================================================== +# Pull latest Woob version +# ============================================================================== +cd "${WOOB_DIR}" || bashio::exit.nok + +bashio::log.info "Clear woob install" +rm -rf {,.[!.],..?}* + +bashio::log.info "Add clean woob install" +wget -qO- https://gitlab.com/woob/woob/-/archive/master/woob-master.tar.gz | tar xz --strip-components=1 + +bashio::log.info "Updating Woob dependencies..." +pip3 install --no-cache-dir --prefix .py-deps . +PYTHONPATH=$(python3 -c "import sys, os; print(os.sep.join(['$(pwd)', '.py-deps', 'lib', f'python{sys.version_info.major}.{sys.version_info.minor}', 'site-packages']))") +export PYTHONPATH +bashio::log.info "Done updating Woob dependencies." + +# ============================================================================== +# Set-up environment variables +# ============================================================================== + +# Basic Kresus options +export PORT=9876 +export HOST=0.0.0.0 +export KRESUS_PYTHON_EXEC=python3 +export KRESUS_WOOB_DIR="${WOOB_DIR}" + +KRESUS_SALT="$(cat /data/kresus_salt)" +export KRESUS_SALT + +# Kresus Basic auth +if bashio::config.has_value 'http_basicauth'; then + KRESUS_AUTH="$(bashio::config 'http_basicauth')" + export KRESUS_AUTH +fi + +# Kresus database +export KRESUS_DB_TYPE="postgres" + +KRESUS_DB_HOST="$(bashio::config 'postgres_hostname')" +KRESUS_DB_PORT="$(bashio::config 'postgres_port')" +KRESUS_DB_USERNAME="$(bashio::config 'postgres_user')" +KRESUS_DB_PASSWORD="$(bashio::config 'postgres_password')" +KRESUS_DB_NAME="$(bashio::config 'postgres_database')" +export KRESUS_DB_HOST KRESUS_DB_PORT KRESUS_DB_USERNAME \ + KRESUS_DB_PASSWORD KRESUS_DB_NAME + +# ============================================================================== +# Start Kresus +# ============================================================================== +kresus -c ${KRESUS_INI_FILE} diff --git a/kresus/translations/en.yaml b/kresus/translations/en.yaml new file mode 100644 index 0000000..a9aa6a8 --- /dev/null +++ b/kresus/translations/en.yaml @@ -0,0 +1,27 @@ +configuration: + postgres_hostname: + name: "DB hostname" + description: >- + Hostname of the PostgreSQL database. + postgres_port: + name: "DB port" + description: >- + Port of the PostgreSQL database. + postgres_user: + name: "DB user" + description: >- + User to connect to the database. + postgres_password: + name: "DB password" + description: >- + Password of the database user. + postgres_database: + name: "DB database" + description: >- + Name of the kresus database. + http_basicauth: + name: "Authentication" + description: >- + Logins for HTTP basic auth authentication ("login:passwd" format, optional). +network: + 9876/tcp: Port to access kresus web server. diff --git a/repository.yaml b/repository.yaml new file mode 100644 index 0000000..be5d153 --- /dev/null +++ b/repository.yaml @@ -0,0 +1,3 @@ +name: MrRaph_'s custom Home Assistant addons +url: "https://github.com/MrRaph/hassio-addons" +maintainer: MrRaph_