#!/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 ($ARGV[1])
{
    my $groupName = $ARGV [1];
    my $g = $a->get($groupName) ||
		die "Group $groupName not found in accounts db\n";

    my $type = $g->prop('type');
    if ($type =~ /^group/)
    {
	@groups = ($g);
    }
    # Is it a user?
    elsif ($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 = ();
    }
    else
    {
	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 $members = $properties{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);
