#!/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);