1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-21 18:41:03 +00:00

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.
This commit is contained in:
Christian Weiske 2025-02-02 11:23:58 +01:00
parent 49b2fda89b
commit 4737389bdc
4 changed files with 247 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,148 @@
#!/bin/bash
# -*- sh -*-
set -e
set -o pipefail
: << =cut
=head1 NAME
hibiscus_account_balances - Show all account balances
Connects to the database of a "Hibiscus Server" homebanking instance.
This script helps to get notified when the balance of accounts
drop below a threshold value.
=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
warning - Warning threshold for all accounts
critical - Critical threshold for all accounts
acct_X_warning - Warning threshold for a single account with ID X
acct_X_critical - Critical threshold for a single account with ID X
label_filter - String to remove from account labels
graph_title - Title of the graph in munin
include - Comma-separated list of account IDs to include in the account list
exclude - Comma-separated list of account IDs to remove from the list
Warning/critical thresholds value examples:
-"500:" for a balance lower than 500
-"1000" for a balance over 1000
-"1000:2000" for a balance outside 1000 and 2000
The account IDs are shown at the end of the labels: "Accountlabel #23".
=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 <cweiske@cweiske.de>
=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

View file

@ -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 <cweiske@cweiske.de>
=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"