From 6438b930577a2cbb3a6f4988a27a0b89e3383935 Mon Sep 17 00:00:00 2001
From: Sergey Ivanov <seriv@cs.umd.edu>
Date: Wed, 28 Aug 2024 22:06:41 -0400
Subject: [PATCH] Check Mailman Lists and corresponding LDAP aliases match

---
 lib/Site/MailmanInLdap.pm | 86 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 lib/Site/MailmanInLdap.pm

diff --git a/lib/Site/MailmanInLdap.pm b/lib/Site/MailmanInLdap.pm
new file mode 100644
index 0000000..4299919
--- /dev/null
+++ b/lib/Site/MailmanInLdap.pm
@@ -0,0 +1,86 @@
+package Site::MailmanInLdap;
+
+use strict;
+use warnings;
+use IO::Socket;
+use Array::Diff;
+use Time::HiRes qw(tv_interval gettimeofday);
+
+use base 'Resmon::Module';
+
+use Resmon::ExtComm qw(run_command);
+
+=pod
+=head1 NAME
+
+Site::MailmanInLDap - check mailman lists and ldap aliases. 
+
+=head1 SYNOPSIS
+
+ Site::MailmanInLdap {
+   lists: noop
+ }
+
+=head1 DESCRIPTION
+
+This module checks if mailman lists for domain cs.umd.edu match correspondent mail aliases in LDAP
+
+=head1 CONFIGURATION
+
+=over
+
+=item check_name
+
+Arbitrary name of the check.
+
+=head1 METRICS
+
+=over
+
+=item onlyinldap
+
+=item onlyonmailman
+
+=item count
+
+=back
+=cut
+
+=pod
+curl -q --user restadmin:restpass http://localhost:8001/3.1/domains/cs.umd.edu/lists | jq .entries[].fqdn_listname | sed -e 's/"//g'  | sort | tee /tmp/11
+curl -q 'ldap://idm00.cs.umd.edu/cn=aliases,dc=cs,dc=umd,dc=edu?cn?sub?(mailHost=mailman3.cs.umd.edu)' 2>/dev/null | sed -n -e 's/^.*cn: //p' | sort | tee /tmp/00
+=cut
+
+sub handler {
+    my $self = shift;
+    my ($output_aliases,$output_mailman,$maillists,$aliases)=('','','','');
+    my @suffixes=('bounces','confirm','join','leave','owner','request','subscribe','unsubscribe');
+    $output_aliases = run_command("curl -q 'ldap://idm00.cs.umd.edu/cn=aliases,dc=cs,dc=umd,dc=edu?cn?sub?(mailHost=mailman3.cs.umd.edu)' 2>/dev/null | sed -n -e 's/^.*cn: //p' | sort");
+    $output_mailman = run_command("curl -q --user restadmin:restpass http://localhost:8001/3.1/domains/cs.umd.edu/lists | jq .entries[].list_name | sed -e 's/\"//g' | sort" );
+    my @aliases = split "\n", $output_aliases;
+    my @saliases = sort @aliases;
+    my @mlists = split "\n", $output_mailman;
+    my @maliases = ();
+    my $k=0;
+    foreach my $list ( @mlists ) {
+      push @maliases,"${list}\@cs.umd.edu";
+      print "\nMA: =${list}\@cs.umd.edu=\n";
+      print "\nLA: =$aliases[$k++]=\n";
+      foreach my $suffix ( @suffixes ) {
+        push @maliases,"${list}-${suffix}\@cs.umd.edu";
+        print "\nMA: =${list}-${suffix}\@cs.umd.edu=\n";
+        print "\nLA: =$aliases[$k++]=\n";
+      }
+    }
+    my @msaliases = sort @maliases;
+    my $diff = Array::Diff->diff( \@saliases, \@msaliases );
+    my %metrics = (
+        "onlyinldap"    => [ join(',',@{$diff->deleted}), "s"],
+        "onlyonmailman" => [ join(',',@{$diff->added}),   "s"],
+	"count"         => [ $diff->count, "i" ],
+    );
+
+    return \%metrics;
+};
+
+1;
-- 
GitLab