From 4737389bdc3c4e2c08b415c7fcb6bc4626857c4f Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Sun, 2 Feb 2025 11:23:58 +0100 Subject: [PATCH] Add Hibiscus server homebanking plugins 1. Last account update age in hours 2. Account balances The plugins have been in use for several months now and warn when the balance of accounts drop below a configurable value, and when Hibiscus stopped updating data because a TAN needs to be entered manually after 90 days. The plugins directly query the MySQL database of a Hibiscus server instance. See https://www.willuhn.de/products/hibiscus-server/ for more information. --- .../hibiscus_account_balances-1.png | Bin 0 -> 17029 bytes .../hibiscus_last_account_update-1.png | Bin 0 -> 11990 bytes plugins/hibiscus/hibiscus_account_balances | 148 ++++++++++++++++++ plugins/hibiscus/hibiscus_last_account_update | 99 ++++++++++++ 4 files changed, 247 insertions(+) create mode 100644 plugins/hibiscus/example-graphs/hibiscus_account_balances-1.png create mode 100644 plugins/hibiscus/example-graphs/hibiscus_last_account_update-1.png create mode 100755 plugins/hibiscus/hibiscus_account_balances create mode 100755 plugins/hibiscus/hibiscus_last_account_update diff --git a/plugins/hibiscus/example-graphs/hibiscus_account_balances-1.png b/plugins/hibiscus/example-graphs/hibiscus_account_balances-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ec266952e1c6bf8107936552ec3521b4296f7cc8 GIT binary patch literal 17029 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

i<&|1?fHe*fR_eQj*S_%j!RI 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 literal 0 HcmV?d00001 diff --git a/plugins/hibiscus/example-graphs/hibiscus_last_account_update-1.png b/plugins/hibiscus/example-graphs/hibiscus_last_account_update-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad9cc9c1ba31cf68cf2b7219d715f7c578090f1 GIT binary patch literal 11990 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 rfC=uu)7<}Gb^QIp*@(A_*O8L-^gbw + +=head1 LICENSE + +AGPL-3.0-only https://spdx.org/licenses/AGPL-3.0-only.html + +=head1 MAGIC MARKERS + +#%# family=manual + +=cut + +# variables +database=${database:-hibiscus} +host=${host:-localhost} +user=${user:-} +pass=${password:-} +mysql=${mysql:-/usr/bin/mysql} +host_name=${host_name:-} +label_filter=${label_filter:-} +graph_title=${graph_title:-Hibiscus account balances} +include=${include:-} +exclude=${exclude:-} + + +case $1 in + config) + echo "graph_title ${graph_title}" + echo "graph_vlabel Value in EUR" + echo "graph_args --base 1000" + echo "graph_category banking" + + if [ ! -z "$include" ]; then + include="AND id IN ($include)" + fi + if [ ! -z "$exclude" ]; then + exclude="AND id NOT IN ($exclude)" + fi + + echo "\ + SELECT\ + id,\ + IF(kategorie IS NULL, bezeichnung, CONCAT(kategorie, ': ', bezeichnung)) AS label\ + FROM konto\ + WHERE flags IS NULL $include $exclude\ + ORDER BY label"\ + | $mysql\ + --batch\ + --skip-ssl\ + --skip-column-names\ + -h"$host" -u"$user" -p"$password"\ + "$database"\ + | while read acctid acctlabel; do + if [ ! -z "$label_filter" ]; then + echo "acct_$acctid.label $acctlabel #$acctid" | sed "s/$label_filter//" + else + echo "acct_$acctid.label $acctlabel #$acctid" + fi + echo "acct_$acctid.draw LINE" + warnvar="acct_${acctid}_warning" + acctwarning=${!warnvar:-${warning:-}} + if [ ! -z "$acctwarning" ]; then + echo "acct_$acctid.warning $acctwarning" + fi + done + if [ -n "$host_name" ]; then + echo "host_name $host_name" + fi + exit 0;; +esac + +echo "\ + SELECT\ + id,\ + saldo\ + FROM konto\ + WHERE flags IS NULL\ + ORDER BY id"\ + | $mysql\ + --batch\ + --skip-ssl\ + --skip-column-names\ + -h"$host" -u"$user" -p"$password"\ + "$database"\ + | while read acctid acctbalance; do + echo "acct_$acctid.value $acctbalance" + done diff --git a/plugins/hibiscus/hibiscus_last_account_update b/plugins/hibiscus/hibiscus_last_account_update new file mode 100755 index 00000000..ca5f193d --- /dev/null +++ b/plugins/hibiscus/hibiscus_last_account_update @@ -0,0 +1,99 @@ +#!/bin/bash +# -*- sh -*- +set -e +set -o pipefail + +: << =cut + +=head1 NAME + +hibiscus_last_account_update - Age of the last bank account update + +Connects to the database of a "Hibiscus Server" homebanking instance. +Checks bank accounts and returns the balance ("Saldo") update date of +the account that was updated least recently. + +This script helps to get notified when the automatic updates stopped +because a TAN needs to be entered manually after 90 days. + +=head1 CONFIGURATION + +=head2 ENVIRONMENT VARIABLES + + host - Hostname of MySQL/MariaDB server + user - Database user + password - Database password + database - Database name + mysql - MySQL/MariaDB binary + host_name - To put the graph onto a different host + +=head2 CONFIGURATION EXAMPLE + + [hibiscus_*] + env.user hibiscususer + env.password thisismypassword + env.mysql /usr/bin/mariadb + +=head1 REQUIREMENTS + +"bash" and "mysql"/"mariadb" are required. + +"bash" instead of "sh" needed because of "set -o pipefail", which is not +supported in Debian 12 yet. + +=head1 SEE ALSO + +https://www.willuhn.de/products/hibiscus-server/ + +=head1 AUTHOR +Christian Weiske + +=head1 LICENSE + +AGPL-3.0-only https://spdx.org/licenses/AGPL-3.0-only.html + +=head1 MAGIC MARKERS + +#%# family=manual + +=cut + +# variables +database=${database:-hibiscus} +host=${host:-localhost} +user=${user:-} +pass=${password:-} +mysql=${mysql:-/usr/bin/mysql} +host_name=${host_name:-} + + +case $1 in + config) + echo "graph_title Hibiscus last account update" + echo "graph_vlabel Age in hours" + echo "graph_args --base 1000 -l 0" + echo "graph_category banking" + echo "graph_order age" + echo "age.label Oldest account update age" + echo "age.draw AREA" + echo "age.warning 72" + if [ -n "$host_name" ]; then + echo "host_name $host_name" + fi + exit 0;; +esac + +age_hours=$( + echo "\ + SELECT HOUR(TIMEDIFF(NOW(), saldo_datum)) AS age\ + FROM konto\ + WHERE flags IS NULL\ + ORDER BY age DESC\ + LIMIT 1"\ + | $mysql\ + --skip-ssl\ + --skip-column-names\ + -h"$host" -u"$user" -p"$password"\ + "$database" +) +echo "age.value $age_hours"