aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Johannes Christ <[email protected]>2024-08-29 20:23:42 +0200
committerGravatar Joe Banks <[email protected]>2024-08-30 16:14:05 +0100
commit670df77f60d455973360f6d1d656a94787c96bed (patch)
treef90f005799c785f75e7974eaab699c099ece5424
parentUpdate dependency ruff to v0.6.3 (diff)
Implement dovecot mail plugin, configure limits
This also moves custom plugins into the `roles/munin/templates/plugins` directory, which should hopefully be easier to maintain than the existing inline dictionary. The only issue is that now it is a bit harder to deal with the filepaths. This change has already been deployed.
-rw-r--r--ansible/roles/munin/tasks/main.yml24
-rw-r--r--ansible/roles/munin/templates/plugin.conf.j215
-rw-r--r--ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j264
-rw-r--r--ansible/roles/munin/templates/plugins/lovering_inheritance.py.j267
-rw-r--r--ansible/roles/munin/vars/main.yml68
5 files changed, 165 insertions, 73 deletions
diff --git a/ansible/roles/munin/tasks/main.yml b/ansible/roles/munin/tasks/main.yml
index aec521f..ab86a43 100644
--- a/ansible/roles/munin/tasks/main.yml
+++ b/ansible/roles/munin/tasks/main.yml
@@ -33,6 +33,18 @@
notify:
- Restart munin-node service
+- name: Template munin plugin configuration file
+ template:
+ src: plugin.conf.j2
+ dest: /etc/munin/plugin-conf.d/custom
+ owner: root
+ group: root
+ mode: "0444"
+ tags:
+ - role::munin
+ notify:
+ - Restart munin-node service
+
- name: Enable non-default munin plugins
file:
src: "/usr/share/munin/plugins/{{ item.src }}"
@@ -68,15 +80,17 @@
- Restart munin-node service
- name: Copy custom munin plugins
- copy:
- content: "{{ item.value }}"
- dest: /etc/munin/plugins/{{ item.key }}
+ template:
+ src: "{{ item }}"
+ # Split two levels of file extensions
+ dest: "/etc/munin/plugins/{{ item | basename | splitext | first | splitext | first }}"
owner: root
group: root
mode: "0555"
loop_control:
- label: "{{ item.key }}"
- loop: "{{ munin_node_custom_plugins | dict2items }}"
+ # I love representing data modification logic in YAML!
+ label: "{{ item | basename | splitext | first | splitext | first }}"
+ with_fileglob: "../templates/plugins/*"
tags:
- role::munin
diff --git a/ansible/roles/munin/templates/plugin.conf.j2 b/ansible/roles/munin/templates/plugin.conf.j2
new file mode 100644
index 0000000..9d2c74c
--- /dev/null
+++ b/ansible/roles/munin/templates/plugin.conf.j2
@@ -0,0 +1,15 @@
+# Ansible managed
+
+[dovecot_maildirs]
+user root
+group vmail
+
+[load]
+env.load_warning {{ ansible_processor_nproc * 0.7 }}
+env.load_critical {{ ansible_processor_nproc * 0.85 }}
+
+[memory]
+env.apps_warning 70%
+env.apps_critical 90%
+env.swap_warning 60%
+env.swap_critical 80%
diff --git a/ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2 b/ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2
new file mode 100644
index 0000000..b634df3
--- /dev/null
+++ b/ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2
@@ -0,0 +1,64 @@
+#!/bin/sh
+# Ansible managed
+
+cd /var/vmail || exit 1
+
+print_maildir_config() {
+ find . -maxdepth 1 -type d \
+ | tail -n +2 \
+ | awk -F / '{
+ print $2 ".draw AREASTACK"
+ print $2 ".label " $2
+ }'
+}
+
+if [ "$1" = "autoconf" ]; then
+ echo "no"
+ exit
+fi
+
+if [ "$1" = "config" ]; then
+ cat <<EOF
+multigraph dovecot_maildir_sizes
+graph_title Dovecot Maildir sizes
+graph_args --base 1024 -l 0
+graph_vlabel bytes
+graph_category mail
+graph_info Shows the sizes of top mail directories by their respective users
+graph_total Total
+graph_order joe jc
+EOF
+ print_maildir_config
+ cat <<EOF
+multigraph dovecot_maildir_mails
+graph_title Dovecot mails in maildirs
+graph_args --base 1000 -l 0
+graph_vlabel mails
+graph_category mail
+graph_info Shows the amount of mails by user on our Dovecot server
+graph_total Total
+graph_order joe jc
+EOF
+ print_maildir_config
+ exit 0
+fi
+
+echo "multigraph dovecot_maildir_sizes"
+du --bytes --summarize -- * \
+ | awk '{ print $2 ".value " $1 }'
+
+echo "multigraph dovecot_maildir_mails"
+find . \
+ | awk -F / '
+ # Maildir e-mails have the hostname contained in them
+ $0 ~ "{{ ansible_fqdn }}" {
+ total[$2] += 1
+ }
+ END {
+ for (user in total) {
+ print user ".value " total[user]
+ }
+ }
+ '
+
+# vim: ft=sh.jinja2:
diff --git a/ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2 b/ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2
new file mode 100644
index 0000000..4e6d315
--- /dev/null
+++ b/ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+# Ansible managed
+
+import datetime
+import random
+import sys
+
+if sys.argv[-1] == "autoconf":
+ print("no")
+ sys.exit(0)
+
+if sys.argv[-1] == "config":
+
+ print("""\
+graph_title Lovering Inheritance
+graph_args --base 1000 -l 0
+graph_vlabel £
+graph_category people
+graph_info This graph shows the insurance that Chris can cash out.
+graph_total Total
+savings.label Savings
+savings.info Base inheritance money Chris paid into his account in 2024
+savings.draw AREASTACK
+interest.label Interest
+interest.info Amount of money gained from interest on the base amount
+interest.draw AREASTACK
+inherited.label Inherited money
+inherited.info Amount inherited from deaths of friends, family and victims
+inherited.draw AREASTACK\
+ """)
+ sys.exit(0)
+
+# Fixed seed to ensure that the bank jitter is constant
+random.seed(1234)
+today = datetime.date.today()
+savings = 740
+interest_per_day = 0.005
+insurance_policy_start = datetime.date(2024, 8, 28)
+days_griefed = (today - insurance_policy_start).days
+accrued_interest = 0
+for _ in range(days_griefed):
+ bank_jitter = random.random()
+ accrued_interest += bank_jitter * (interest_per_day * (savings + accrued_interest))
+
+inherited_money = 0
+
+if days_griefed > 10:
+ # Hassan declared as KIA (he had stocks in Big Oil)
+ inherited_money += 10000
+
+if days_griefed > 60:
+ # Death of Joe (prospect of sale of stolen GPUs)
+ inherited_money += 5000
+
+if days_griefed > 170:
+ # Bella disappears (spent all on chicken and gifts for his wife)
+ inherited_money += 300
+
+if days_griefed > 360:
+ # Lola Banks deploys her Titan missile but burns herself to death
+ inherited_money += 12000
+
+print(f"savings.value {savings}")
+print(f"interest.value {accrued_interest}")
+print(f"inherited.value {inherited_money}")
+
+# vim: ft=python.jinja2:
diff --git a/ansible/roles/munin/vars/main.yml b/ansible/roles/munin/vars/main.yml
deleted file mode 100644
index 9c8245d..0000000
--- a/ansible/roles/munin/vars/main.yml
+++ /dev/null
@@ -1,68 +0,0 @@
----
-munin_node_custom_plugins:
- lovering_inheritance: |
- #!/usr/bin/env python3
- # Ansible managed
-
- import datetime
- import random
- import sys
-
- if sys.argv[-1] == "autoconf":
- print("no")
- sys.exit(0)
-
- if sys.argv[-1] == "config":
-
- print("""\
- graph_title Lovering Inheritance
- graph_args --base 1000 -l 0
- graph_vlabel £
- graph_category people
- graph_info This graph shows the insurance that Chris can cash out.
- graph_total Total
- savings.label Savings
- savings.info Base inheritance money Chris paid into his account in 2024
- savings.draw AREASTACK
- interest.label Interest
- interest.info Amount of money gained from interest on the base amount
- interest.draw AREASTACK
- inherited.label Inherited money
- inherited.info Amount inherited from deaths of friends, family and victims
- inherited.draw AREASTACK\
- """)
- sys.exit(0)
-
- # Fixed seed to ensure that the bank jitter is constant
- random.seed(1234)
- today = datetime.date.today()
- savings = 740
- interest_per_day = 0.005
- insurance_policy_start = datetime.date(2024, 8, 28)
- days_griefed = (today - insurance_policy_start).days
- accrued_interest = 0
- for _ in range(days_griefed):
- bank_jitter = random.random()
- accrued_interest += bank_jitter * (interest_per_day * (savings + accrued_interest))
-
- inherited_money = 0
-
- if days_griefed > 10:
- # Hassan declared as KIA (he had stocks in Big Oil)
- inherited_money += 10000
-
- if days_griefed > 60:
- # Death of Joe (prospect of sale of stolen GPUs)
- inherited_money += 5000
-
- if days_griefed > 170:
- # Bella disappears (spent all on chicken and gifts for his wife)
- inherited_money += 300
-
- if days_griefed > 360:
- # Lola Banks deploys her Titan missile but burns herself to death
- inherited_money += 12000
-
- print(f"savings.value {savings}")
- print(f"interest.value {accrued_interest}")
- print(f"inherited.value {inherited_money}")