From cc21e41d4a4ffc3960bd4a834086a5527585fd30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Floure?= Date: Thu, 28 Jun 2018 17:44:58 +0200 Subject: [PATCH] Add and remove users from the mailing lists --- conf.example.toml | 2 ++ unipoly-mlmmj-sync.rb | 69 +++++++++++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/conf.example.toml b/conf.example.toml index 3e63855..9c6a834 100644 --- a/conf.example.toml +++ b/conf.example.toml @@ -15,4 +15,6 @@ basetree = "ou=Lists,dc=unipoly,dc=epfl,dc=ch" [mlmmj] basepath = "/var/spool/mlmmj" list_binary = "/usr/bin/mlmmj-list" +sub_binary = "/usr/bin/mlmmj-sub" +unsub_binary = "/usr/bin/mlmmj-unsub" diff --git a/unipoly-mlmmj-sync.rb b/unipoly-mlmmj-sync.rb index f4ed83f..0093c9f 100755 --- a/unipoly-mlmmj-sync.rb +++ b/unipoly-mlmmj-sync.rb @@ -41,40 +41,71 @@ def main domain = conf["domain"] basetree = conf["ldap"]["lists"]["basetree"] conf["lists"].each do |cn| + puts ">> Processing list #{cn}@#{domain}" + filter = Net::LDAP::Filter.eq("cn", cn) + + print "Searching LDAP... " match = conn.search(:base => basetree, :filter => filter) - unless (match.size < 1) + if (match.size > 0) entry = match.first - members = entry.uniquemember.map { |dn| /mail=([^,]+),/.match(dn).values_at(1).first } - puts "Found: #{entry.dn} with #{members.size} entries" + members = entry.uniquemember.map do |dn| + /mail=([^,]+),/.match(dn).values_at(1).first + end - mlmmj_list_binary = conf["mlmmj"]["list_binary"] - mlmmj_basepath = conf["mlmmj"]["basepath"] + puts "OK" + puts "Found #{entry.dn} with #{members.size} members" + + print "Searchin mlmmj... " if (File.executable?(mlmmj_list_binary)) - raw = %x(#{mlmmj_list_binary} -L #{mlmmj_basepath}/#{cn}@#{domain} -s) - if ($?.exitstatus == 0) - subscribers = raw.split("\n") - puts "Got #{subscribers.size} subscribers from mlmmj for #{cn}@#{domain}" + mlmmj_list_binary = conf["mlmmj"]["list_binary"] + mlmmj_basepath = conf["mlmmj"]["basepath"] + list = "#{mlmmj_basepath}/#{cn}@#{domain}" + raw = %x(#{mlmmj_list_binary} -L #{list} -s) - members.each do |member| - if (subscribers.include?(member)) - subscribers.delete(member) + if ($?.exitstatus == 0) + purs "OK" + subscribers = raw.split("\n") + puts "Found #{cn}@#{domain} with #{subscribers.size} subscribers" + print "\n" + + # Add to the subscribers any missing entry + # Remove successful matches + members.each do |m| + if (subscribers.include?(m)) + subscribers.delete(m) else - puts "#{member} is to be added to #{cn}" + puts "Adding #{m}... " + mlmmj_sub_binary = conf["mlmmj"]["sub_binary"] + %x(#{mlmmj_sub_binary} -L #{list} -a #{m} -q -f -s) + if ($?.exitstatus == 0) + puts "OK" + else + puts "Failed" + end + end + end + + # Remove remaining "subcribers" (= they did not match with members) + subscribers.each do |s| + puts "Removing #{s}... " + mlmmj_unsub_binary = conf["mlmmj"]["unsub_binary"] + %x(#{mlmmj_unsub_binary} -L #{list} -a #{m} -q -s) + if ($?.exitstatus == 0) + puts "OK" + else + puts "Failed" end end - print "There are #{subscribers.size} addesses to remove:" - subscribers.each { |s| print " " + s} print "\n" else - puts "Failed to get the subscribers of #{cn}@#{domain}" + puts "FAIL" end else - puts "Could not execute #{mlmmj_list_binary}" + puts "could not execute #{mlmmj_list_binary}" end else - dn = "cn=#{cn},#{basetree}" - puts "Unable to find list: #{dn}" + puts "FAIL" end end end