diff --git a/fireflyiii_data_importer/icon.png b/fireflyiii_data_importer/icon.png index 494445acc..30b4db13f 100644 Binary files a/fireflyiii_data_importer/icon.png and b/fireflyiii_data_importer/icon.png differ diff --git a/fireflyiii_data_importer/logo.png b/fireflyiii_data_importer/logo.png index 494445acc..30b4db13f 100644 Binary files a/fireflyiii_data_importer/logo.png and b/fireflyiii_data_importer/logo.png differ diff --git a/fireflyiii_fints_importer/CHANGELOG.md b/fireflyiii_fints_importer/CHANGELOG.md new file mode 100644 index 000000000..66f7e8b76 --- /dev/null +++ b/fireflyiii_fints_importer/CHANGELOG.md @@ -0,0 +1 @@ +- Initial release diff --git a/fireflyiii_fints_importer/Dockerfile b/fireflyiii_fints_importer/Dockerfile new file mode 100644 index 000000000..4d1a52072 --- /dev/null +++ b/fireflyiii_fints_importer/Dockerfile @@ -0,0 +1,91 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_FROM +ARG BUILD_VERSION +ARG BUILD_UPSTREAM="1.0" +FROM ${BUILD_FROM} + +################## +# 2 Modify Image # +################## + + +################## +# 3 Install apps # +################## + +# Copy local files +COPY rootfs/ / + +# Modules +ARG MODULES="00-banner.sh 00-global_var.sh 90-config_yaml.sh" + +# Automatic modules download +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d || printf '%s\n' "${MODULES}" >/MODULESFILE + +# Manual apps +ENV PACKAGES="cron" + +# Automatic apps & bashio +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh || printf '%s\n' "${PACKAGES:-}" > /ENVFILE + +################ +# 4 Entrypoint # +################ + +RUN chmod 777 /entrypoint.sh +ENTRYPOINT [ "/usr/bin/env" ] +CMD [ "/entrypoint.sh" ] + +############ +# 5 Labels # +############ + +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Add-ons" \ + org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://github.com/alexbelgium" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/fireflyiii_fints_importer/Readme.md b/fireflyiii_fints_importer/Readme.md new file mode 100644 index 000000000..3034d024b --- /dev/null +++ b/fireflyiii_fints_importer/Readme.md @@ -0,0 +1,50 @@ +# Home assistant add-on: Fireflyiii fints importer + +[![Donate][donation-badge]](https://www.buymeacoffee.com/alexbelgium) + +![Version](https://img.shields.io/badge/dynamic/json?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Ffireflyiii_data_importer%2Fconfig.json) +![Ingress](https://img.shields.io/badge/dynamic/json?label=Ingress&query=%24.ingress&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Ffireflyiii_data_importer%2Fconfig.json) +![Arch](https://img.shields.io/badge/dynamic/json?color=success&label=Arch&query=%24.arch&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Ffireflyiii_data_importer%2Fconfig.json) + +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/9c6cf10bdbba45ecb202d7f579b5be0e)](https://www.codacy.com/gh/alexbelgium/hassio-addons/dashboard?utm_source=github.com&utm_medium=referral&utm_content=alexbelgium/hassio-addons&utm_campaign=Badge_Grade) +[![GitHub Super-Linter](https://github.com/alexbelgium/hassio-addons/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) +[![Builder](https://github.com/alexbelgium/hassio-addons/workflows/Builder/badge.svg)](https://github.com/alexbelgium/hassio-addons/actions/workflows/builder.yaml) + +[donation-badge]: https://img.shields.io/badge/Buy%20me%20a%20coffee-%23d32f2f?logo=buy-me-a-coffee&style=flat&logoColor=white + +_Thanks to everyone having starred my repo! To star it click on the image below, then it will be on top right. Thanks!_ + +[![Stargazers repo roster for @alexbelgium/hassio-addons](https://reporoster.com/stars/alexbelgium/hassio-addons)](https://github.com/alexbelgium/hassio-addons/stargazers) + +## About + +["Firefly III"](https://www.firefly-iii.org) is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. This tool allows you to import transactions from your FinTS enabled bank into Firefly III. It comes with a web GUI that guides you through the process. + +This addon is based on the docker image https://hub.docker.com/r/benkl/firefly-iii-fints-importer + +## Configuration + +Read official documentation for information how to set : https://github.com/bnw/firefly-iii-fints-importer + +Configurations can be added in the /config/addons_config/fireflyiii_fints_importer/configurations folder according to : https://github.com/bnw/firefly-iii-fints-importer#storing-configurations + +## Installation + +The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on. + +1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA) + [![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Set the add-on options to your preferences +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Open the webUI and adapt the software options + +## Support + +Create an issue on github + +## Illustration + +[repository]: https://github.com/alexbelgium/hassio-addons diff --git a/fireflyiii_fints_importer/apparmor.txt b/fireflyiii_fints_importer/apparmor.txt new file mode 100644 index 000000000..f2f79cf52 --- /dev/null +++ b/fireflyiii_fints_importer/apparmor.txt @@ -0,0 +1,56 @@ +#include + +profile fireflyiii_fints_addon flags=(attach_disconnected,mediate_deleted) { + #include + + capability, + file, + signal, + mount, + umount, + remount, + network udp, + network tcp, + network dgram, + network stream, + network inet, + network inet6, + network netlink raw, + + capability setgid, + capability setuid, + capability sys_admin, + capability dac_read_search, + # capability dac_override, + # capability sys_rawio, + +# S6-Overlay + /bin/** ix, + /usr/bin/** ix, + /usr/lib/bashio/** ix, + /etc/s6/** rix, + /run/s6/** rix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /init rix, + /var/run/** mrwkl, + /var/run/ mrwkl, + /dev/i2c-1 mrwkl, + # Files required + /dev/sda1 mrwkl, + /dev/sdb1 mrwkl, + /dev/mmcblk0p1 mrwkl, + /dev/* mrwkl, + /tmp/** mrkwl, + + # Data access + /data/** rw, + + # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container + ptrace (trace,read) peer=docker-default, + + # docker daemon confinement requires explict allow rule for signal + signal (receive) set=(kill,term) peer=/usr/bin/docker, + +} diff --git a/fireflyiii_fints_importer/build.json b/fireflyiii_fints_importer/build.json new file mode 100644 index 000000000..e52b560d8 --- /dev/null +++ b/fireflyiii_fints_importer/build.json @@ -0,0 +1,7 @@ +{ + "build_from": { + "armv7": "benkl/firefly-iii-fints-importer:latest", + "aarch64": "benkl/firefly-iii-fints-importer:latest", + "amd64": "benkl/firefly-iii-fints-importer:latest" + } +} diff --git a/fireflyiii_fints_importer/config.json b/fireflyiii_fints_importer/config.json new file mode 100644 index 000000000..c9096d7b0 --- /dev/null +++ b/fireflyiii_fints_importer/config.json @@ -0,0 +1,30 @@ +{ + "apparmor": true, + "arch": ["aarch64", "amd64", "armv7"], + "boot": "auto", + "description": "Import financial transactions from you FinTS enabled bank into Firefly III", + "devices": [], + "environment": { + "TRUSTED_PROXIES": "**" + }, + "map": ["config:rw", "share:rw", "ssl"], + "name": "Firefly iii FinTS Importer", + "options": { + "CONFIG_LOCATION": "/config/addons_config/fireflyiii_fints_importer/config.yaml" + }, + "ports": { + "8080/tcp": 3476 + }, + "ports_description": { + "8080/tcp": "web interface" + }, + "schema": { + "CONFIG_LOCATION": "str", + "silent": "bool?" + }, + "slug": "fireflyiii_fints_importer", + "upstream": "1.0", + "url": "https://github.com/alexbelgium/hassio-addons", + "version": "1.0", + "webui": "[PROTO:ssl]://[HOST]:[PORT:8080]" +} diff --git a/fireflyiii_fints_importer/icon.png b/fireflyiii_fints_importer/icon.png new file mode 100644 index 000000000..9261c7883 Binary files /dev/null and b/fireflyiii_fints_importer/icon.png differ diff --git a/fireflyiii_fints_importer/logo.png b/fireflyiii_fints_importer/logo.png new file mode 100644 index 000000000..9261c7883 Binary files /dev/null and b/fireflyiii_fints_importer/logo.png differ diff --git a/fireflyiii_fints_importer/rootfs/entrypoint.sh b/fireflyiii_fints_importer/rootfs/entrypoint.sh new file mode 100644 index 000000000..9becb179e --- /dev/null +++ b/fireflyiii_fints_importer/rootfs/entrypoint.sh @@ -0,0 +1,27 @@ +#!/bin/bash +echo "Starting..." + +############################ +# Backup Dockerfile Script # +############################ + +if [ -f /etc/cont-init.d/00-aaa_dockerfile_backup.sh ]; then + chown "$(id -u)":"$(id -g)" /etc/cont-init.d/00-aaa_dockerfile_backup.sh + chmod +x /etc/cont-init.d/00-aaa_dockerfile_backup.sh + /./etc/cont-init.d/00-aaa_dockerfile_backup.sh + rm /etc/cont-init.d/00-aaa_dockerfile_backup.sh +fi + +#################### +# Starting scripts # +#################### + +for SCRIPTS in /etc/cont-init.d/*; do + [ -e "$SCRIPTS" ] || continue + echo "$SCRIPTS: executing" + chown "$(id -u)":"$(id -g)" "$SCRIPTS" + chmod a+x "$SCRIPTS" + # Change shebang if no s6 supervision + sed -i 's|/usr/bin/with-contenv bashio|/usr/bin/env bashio|g' "$SCRIPTS" + /."$SCRIPTS" || echo "$SCRIPTS: exiting $?" +done diff --git a/fireflyiii_fints_importer/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh b/fireflyiii_fints_importer/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh new file mode 100644 index 000000000..98dddfe70 --- /dev/null +++ b/fireflyiii_fints_importer/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# If dockerfile failed install manually + +############################## +# Automatic modules download # +############################## +if [ -e "/MODULESFILE" ]; then + MODULES=$(/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d +fi + +####################### +# Automatic installer # +####################### +if [ -e "/ENVFILE" ]; then + PACKAGES=$(/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh +fi diff --git a/fireflyiii_fints_importer/rootfs/etc/cont-init.d/20-folders.sh b/fireflyiii_fints_importer/rootfs/etc/cont-init.d/20-folders.sh new file mode 100644 index 000000000..3ec571dff --- /dev/null +++ b/fireflyiii_fints_importer/rootfs/etc/cont-init.d/20-folders.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bashio +# shellcheck shell=bash + +CONFIGSOURCE=$(bashio::config "CONFIG_LOCATION") +CONFIGSOURCE=$(dirname "$CONFIGSOURCE") + +# Create directory +mkdir -p "$CONFIGSOURCE" || true +mkdir -p "$CONFIGSOURCE/import_files" || true +mkdir -p "$CONFIGSOURCE/configurations" || true + +# Create symlinks +cp -n /data/configurations $CONFIGSOURCE/configurations +rm -r /data/configurations +ln -s $CONFIGSOURCE/configurations /data/configurations + +# Make sure permissions are right +chown -R "$(id -u):$(id -g)" "$CONFIGSOURCE" diff --git a/fireflyiii_fints_importer/rootfs/etc/cont-init.d/99-run.sh b/fireflyiii_fints_importer/rootfs/etc/cont-init.d/99-run.sh new file mode 100644 index 000000000..23ce65458 --- /dev/null +++ b/fireflyiii_fints_importer/rootfs/etc/cont-init.d/99-run.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bashio +# shellcheck shell=bash + +CONFIGSOURCE=$(bashio::config "CONFIG_LOCATION") +CONFIGSOURCE="$(dirname "$CONFIGSOURCE")" + +################# +# CONFIG IMPORT # +################# + +if [ "$(ls -A "$CONFIGSOURCE/configurations")" ]; then + bashio::log.info "Configurations were found in $CONFIGSOURCE/configurations, they will be loaded." +fi + +################ +# CRON OPTIONS # +################ + +if bashio::config.has_value 'Updates'; then + + if [ "$(ls -A "${CONFIGSOURCE}"/import_files)" ]; then + # Align update with options + echo "" + FREQUENCY=$(bashio::config 'Updates') + bashio::log.info "$FREQUENCY updates" + echo "" + + # Sets cron // do not delete this message + cp /templates/cronupdate /etc/cron."${FREQUENCY}"/ + chmod 777 /etc/cron."${FREQUENCY}"/cronupdate + + # Sets cron to run with www-data user + # sed -i 's|root|www-data|g' /etc/crontab + + # Starts cron + service cron start + + # Export variables + IMPORT_DIR_WHITELIST="${CONFIGSOURCE}/import_files" + export IMPORT_DIR_WHITELIST + + bashio::log.info "Automatic updates were requested. The files in ${CONFIGSOURCE}/import_files will be imported $FREQUENCY." + + else + bashio::log.fatal "Automatic updates were requested, but there are no configuration files in ${CONFIGSOURCE}/import_files. There will therefore be be no automatic updates." + fi + +fi + +############## +# LAUNCH APP # +############## + +bashio::log.info "Please wait while the app is loading !" + +if bashio::config.true 'silent'; then + bashio::log.warning "Silent mode activated. Only errors will be shown. Please disable in addon options if you need to debug" + php -S 0.0.0.0:8080 /app/index.php >/dev/null +else + php -S 0.0.0.0:8080 /app/index.php +fi diff --git a/fireflyiii_fints_importer/rootfs/templates/cronupdate b/fireflyiii_fints_importer/rootfs/templates/cronupdate new file mode 100644 index 000000000..c86170d26 --- /dev/null +++ b/fireflyiii_fints_importer/rootfs/templates/cronupdate @@ -0,0 +1,15 @@ +#!/usr/bin/env bashio +# shellcheck shell=bash + +PATHTOFILES="$(bashio::config "CONFIG_LOCATION")" +PATHTOFILES="$(dirname "${PATHTOFILES}")" + +( +bashio::log.info "Running update according to defined schedule. Files located in $PATHTOFILES will be imported" +if bashio::config.true 'silent'; then + bashio::log.warning "Silent mode activated. Only errors will be shown. Please disable in addon options if you need to debug" + su -l www-data -s /bin/bash -c "/usr/local/bin/php /var/www/html/artisan importer:auto-import >/dev/null" +else + su -l www-data -s /bin/bash -c "/usr/local/bin/php /var/www/html/artisan importer:auto-import $PATHTOFILES/import_files" +fi +) &>/proc/1/fd/1