113 lines
3.3 KiB
Perl
113 lines
3.3 KiB
Perl
#!/usr/bin/perl -w
|
|
|
|
#----------------------------------------------------------------------
|
|
# copyright (C) 2002-2006 Mitel Networks Corporation
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
#----------------------------------------------------------------------
|
|
|
|
package esmith;
|
|
|
|
use strict;
|
|
use Errno;
|
|
use esmith::ConfigDB;
|
|
use esmith::AccountsDB;
|
|
use esmith::util;
|
|
|
|
my $c = esmith::ConfigDB->open_ro || die "Couldn't open config db\n";
|
|
my $a = esmith::AccountsDB->open_ro || die "Couldn't open accounts db\n";
|
|
|
|
my $event = $ARGV [0] || die "Event name arg missing\n";;
|
|
my @groups;
|
|
|
|
if (scalar @ARGV)
|
|
{
|
|
@groups = map { $a->get($_); } @ARGV;
|
|
foreach my $g (@groups)
|
|
{
|
|
my $type = $g->prop('type');
|
|
if ($type =~ /^user/)
|
|
{
|
|
# That's fine. We were probably just called from the user-delete
|
|
# event, in which case we want to update all of the groups. So, leave
|
|
# the groups array empty.
|
|
@groups = ();
|
|
last;
|
|
}
|
|
elsif ($type !~ /^group/){
|
|
die "Expected a user or a group. Got neither: $type\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
# Regenerate all the groups if the previous block failed in some way.
|
|
unless (@groups)
|
|
{
|
|
@groups = $a->groups;
|
|
}
|
|
|
|
foreach my $group (@groups)
|
|
{
|
|
my $groupName = $group->key;
|
|
unless ($group->prop('type') eq 'group')
|
|
{
|
|
warn "Account $groupName is not a group account.\n";
|
|
next;
|
|
}
|
|
my %properties = $group->props;
|
|
$groupName =~ s/\./:/g;
|
|
my $group = "/var/qmail/alias/.qmail-$groupName";
|
|
my @group_members = split(/,/, $properties{Members});
|
|
# Check if we should exclude members from this group email address
|
|
my @exclude_users = split(/,/, ($properties{EmailExcludeUsers} || ''));
|
|
my @exclude_groups = split(/,/, ($properties{EmailExcludeGroups} || ''));
|
|
foreach my $exclude_group (@exclude_groups){
|
|
my $g = $a->get($exclude_group);
|
|
next unless $g;
|
|
push @exclude_users, split(/,/, ($g->prop('Members') || ''));
|
|
}
|
|
my %exclude = map { $_, 1 } @exclude_users;
|
|
@exclude_users = keys %exclude;
|
|
my @members = ();
|
|
foreach my $user (@group_members){
|
|
next if grep { $_ eq $user } @exclude_users;
|
|
push @members, $user;
|
|
}
|
|
my $members = join(',', @members);
|
|
|
|
esmith::util::processTemplate(
|
|
{
|
|
CONFREF =>
|
|
{
|
|
Members => $members,
|
|
},
|
|
|
|
TEMPLATE_PATH =>
|
|
"/var/qmail/alias/.qmail-group",
|
|
|
|
OUTPUT_FILENAME => "/var/qmail/alias/.qmail-$groupName",
|
|
}
|
|
);
|
|
|
|
unless (-f "/var/qmail/alias/.qmail-$groupName-default")
|
|
{
|
|
symlink "/var/qmail/alias/.qmail-$groupName",
|
|
"/var/qmail/alias/.qmail-$groupName-default";
|
|
}
|
|
|
|
}
|
|
exit (0);
|