diff --git a/core/core/management/__init__.py b/core/core/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/core/management/commands/__init__.py b/core/core/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/core/management/commands/update_metrics.py b/core/core/management/commands/update_metrics.py new file mode 100644 index 0000000..a51cfea --- /dev/null +++ b/core/core/management/commands/update_metrics.py @@ -0,0 +1,8 @@ +from django.core.management.base import BaseCommand, CommandError +from core.metrics import update_item_count + +class Command(BaseCommand): + help = "Refresh the metrics" + + def handle(self, *args, **options): + update_item_count() \ No newline at end of file diff --git a/core/core/metrics.py b/core/core/metrics.py new file mode 100644 index 0000000..4f79754 --- /dev/null +++ b/core/core/metrics.py @@ -0,0 +1,11 @@ +from prometheus_client import Gauge +from django_prometheus import exports +from inventory.models import * + +g_items_total = Gauge('c3lf_items_total', 'Current Total items') + +def update_item_count(): + # Get the count of MyModel objects + count = Item.objects.count() + # Set the gauge to the current count + g_items_total.set(count) \ No newline at end of file diff --git a/core/core/settings.py b/core/core/settings.py index 5a8f20f..31a024f 100644 --- a/core/core/settings.py +++ b/core/core/settings.py @@ -70,6 +70,7 @@ INSTALLED_APPS = [ 'inventory', 'mail', 'notify_sessions', + 'core' ] REST_FRAMEWORK = { diff --git a/core/core/urls.py b/core/core/urls.py index 1c5f158..2386891 100644 --- a/core/core/urls.py +++ b/core/core/urls.py @@ -19,6 +19,8 @@ from django.urls import path, include from .version import get_info +from .metrics import * + urlpatterns = [ path('djangoadmin/', admin.site.urls), path('api/2/', include('inventory.api_v2')), diff --git a/deploy/ansible/playbooks/deploy-c3lf-sys3.yml b/deploy/ansible/playbooks/deploy-c3lf-sys3.yml index 544b4e4..af5e9e8 100644 --- a/deploy/ansible/playbooks/deploy-c3lf-sys3.yml +++ b/deploy/ansible/playbooks/deploy-c3lf-sys3.yml @@ -311,6 +311,16 @@ notify: - restart c3lf-sys3 + - name: add c3lf-sys3-cron service + template: + src: templates/c3lf-sys3-cron.service.j2 + dest: /etc/systemd/system/c3lf-sys3-cron.service + + - name: add c3lf-sys3-cron timer + template: + src: templates/c3lf-sys3-cron.timer.j2 + dest: /etc/systemd/system/c3lf-sys3-cron.timer + - name: reload systemd systemd: daemon_reload: yes @@ -321,6 +331,12 @@ state: started enabled: yes + - name: start c3lf-sys3 timer + service: + name: c3lf-sys3-cron.timer + state: started + enabled: yes + - name: add postfix to www-data group user: name: postfix @@ -345,6 +361,13 @@ notify: - restart postfix + - name: configure rspamd dkim + template: + src: templates/rspamd-dkim.cf.j2 + dest: /etc/rspamd/local.d/dkim_signing.conf + notify: + - restart rspamd + - name: configure rspamd copy: content: | diff --git a/deploy/ansible/playbooks/templates/c3lf-sys3-cron.service.j2 b/deploy/ansible/playbooks/templates/c3lf-sys3-cron.service.j2 new file mode 100644 index 0000000..0df787e --- /dev/null +++ b/deploy/ansible/playbooks/templates/c3lf-sys3-cron.service.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=c3lf sys3 background service +After=network.target + +[Service] +User=www-data +Group=www-data +WorkingDirectory=/var/www/c3lf-sys3 +ExecStart=/var/www/c3lf-sys3/venv/bin/python3 /var/www/c3lf-sys3/repo/core/manage.py update_metrics +Environment=DJANGO_SETTINGS_MODULE=core.settings + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/deploy/ansible/playbooks/templates/c3lf-sys3-cron.timer.j2 b/deploy/ansible/playbooks/templates/c3lf-sys3-cron.timer.j2 new file mode 100644 index 0000000..6d888b4 --- /dev/null +++ b/deploy/ansible/playbooks/templates/c3lf-sys3-cron.timer.j2 @@ -0,0 +1,9 @@ +[Unit] +Description=Run Nextcloud cron.php every 5 minutes + +[Timer] +OnCalendar=minutely +Unit=c3lf-sys3-cron.service + +[Install] +WantedBy=timers.target \ No newline at end of file diff --git a/deploy/ansible/playbooks/templates/postfix.cf.j2 b/deploy/ansible/playbooks/templates/postfix.cf.j2 index f80d69b..ee073d6 100644 --- a/deploy/ansible/playbooks/templates/postfix.cf.j2 +++ b/deploy/ansible/playbooks/templates/postfix.cf.j2 @@ -37,7 +37,6 @@ alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = $myhostname, , localhost -relayhost = firefly.lab.or.it mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + diff --git a/deploy/ansible/playbooks/templates/rspamd-dkim.cf.j2 b/deploy/ansible/playbooks/templates/rspamd-dkim.cf.j2 new file mode 100644 index 0000000..0429a02 --- /dev/null +++ b/deploy/ansible/playbooks/templates/rspamd-dkim.cf.j2 @@ -0,0 +1,79 @@ +# local.d/dkim_signing.conf + +enabled = true; + +# If false, messages with empty envelope from are not signed +allow_envfrom_empty = true; + +# If true, envelope/header domain mismatch is ignored +allow_hdrfrom_mismatch = false; + +# If true, multiple from headers are allowed (but only first is used) +allow_hdrfrom_multiple = false; + +# If true, username does not need to contain matching domain +allow_username_mismatch = false; + +# Default path to key, can include '$domain' and '$selector' variables +path = "/var/lib/rspamd/dkim/$domain.$selector.key"; + +# Default selector to use +selector = "dkim"; + +# If false, messages from authenticated users are not selected for signing +sign_authenticated = true; + +# If false, messages from local networks are not selected for signing +sign_local = true; + +# Map file of IP addresses/subnets to consider for signing +# sign_networks = "/some/file"; # or url + +# Symbol to add when message is signed +symbol = "DKIM_SIGNED"; + +# Whether to fallback to global config +try_fallback = true; + +# Domain to use for DKIM signing: can be "header" (MIME From), "envelope" (SMTP From), "recipient" (SMTP To), "auth" (SMTP username) or directly specified domain name +use_domain = "header"; + +# Domain to use for DKIM signing when sender is in sign_networks ("header"/"envelope"/"auth") +#use_domain_sign_networks = "header"; + +# Domain to use for DKIM signing when sender is a local IP ("header"/"envelope"/"auth") +#use_domain_sign_local = "header"; + +# Whether to normalise domains to eSLD +use_esld = true; + +# Whether to get keys from Redis +use_redis = false; + +# Hash for DKIM keys in Redis +key_prefix = "DKIM_KEYS"; + +# map of domains -> names of selectors (since rspamd 1.5.3) +#selector_map = "/etc/rspamd/dkim_selectors.map"; + +# map of domains -> paths to keys (since rspamd 1.5.3) +#path_map = "/etc/rspamd/dkim_paths.map"; + +# If `true` get pubkey from DNS record and check if it matches private key +check_pubkey = false; +# Set to `false` if you want to skip signing if public and private keys mismatch +allow_pubkey_mismatch = true; + +# Domain specific settings +domain { + # Domain name is used as key + {{ mail_domain }} { + + # Private key path + path = "/var/lib/rspamd/dkim/{{ mail_domain }}.key"; + + # Selector + selector = "ds"; + } +} + diff --git a/web/src/views/Items.vue b/web/src/views/Items.vue index 30e553f..72b4079 100644 --- a/web/src/views/Items.vue +++ b/web/src/views/Items.vue @@ -67,7 +67,7 @@