Skip to content

Commit

Permalink
Implement dovecot mail plugin, configure limits
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jchristgit authored and jb3 committed Aug 30, 2024
1 parent 39b99de commit 670df77
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 73 deletions.
24 changes: 19 additions & 5 deletions ansible/roles/munin/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}"
Expand Down Expand Up @@ -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

Expand Down
15 changes: 15 additions & 0 deletions ansible/roles/munin/templates/plugin.conf.j2
Original file line number Diff line number Diff line change
@@ -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%
64 changes: 64 additions & 0 deletions ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2
Original file line number Diff line number Diff line change
@@ -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:
67 changes: 67 additions & 0 deletions ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2
Original file line number Diff line number Diff line change
@@ -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:
68 changes: 0 additions & 68 deletions ansible/roles/munin/vars/main.yml

This file was deleted.

0 comments on commit 670df77

Please sign in to comment.