#!/usr/pkg/bin/perl
#
# Copyright (c) 1994-2008 Carnegie Mellon University.  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
#
# 3. The name "Carnegie Mellon University" must not be used to
#    endorse or promote products derived from this software without
#    prior written permission. For permission or any legal
#    details, please contact
#      Carnegie Mellon University
#      Center for Technology Transfer and Enterprise Creation
#      4615 Forbes Avenue
#      Suite 302
#      Pittsburgh, PA  15213
#      (412) 268-7393, fax: (412) 268-7395
#      innovation@andrew.cmu.edu
#
# 4. Redistributions of any form whatsoever must retain the following
#    acknowledgment:
#    "This product includes software developed by Computing Services
#     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
#
# CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
# FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
# AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
# OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

require 5;

#use strict; # XXX does not compile with strict :(
use warnings;

sub read_conf {
    my $file = shift;

    open CONF, $file or die "can't open $file";
    print "reading configure file $file...\n";
    while (<CONF>) {
        if (/^#/) {
            next;
        }
        if (/\@include:\s*(.*)$/) {
            print "I will include configure file $1.\n";
            push @configs, $1;
        }
        if (/^configdirectory:\s*(.*)$/) {
            $confdir = $1;
            print "I will configure directory $confdir.\n";
        }
        if (/^(?:meta)?partition-.*:\s*(.*)$/) {
            if (grep /$1/, @parts) {
                next;
            }
            print "I saw partition $1.\n";
            push @parts, $1;
        }
    }
    print "done\n";
    close CONF;
}

$imapdconf = shift || "/etc/imapd.conf";

push @configs, $imapdconf;

while ($conf = shift @configs) {
    read_conf($conf);
}

defined $confdir or die "'configdirectory:' in $imapdconf is missing";
@parts or die "No partition defined in $imapdconf";
$d = $confdir;

print "configuring $d...\n";

chdir $d or die "couldn't change to $d";

mkdir "proc", 0755 || warn "can't create $d/proc: $!";
mkdir "db", 0755 || warn "can't create $d/db: $!";
mkdir "socket", 0755 || warn "can't create $d/socket: $!";
mkdir "log", 0755 || warn "can't create $d/log: $!";
mkdir "msg", 0755 || warn "can't create $d/msg: $!";
mkdir "ptclient", 0755 || warn "can't create $d/ptclient: $!";
mkdir "sync", 0755 || warn "can't create $d/sync: $!";

while ($part = shift @parts) {
    print "creating $part...\n";
    mkdir $part, 0755 || warn "can't create $part: $!";
    chdir $part or die "couldn't change to partition $part";
    mkdir "stage.", 0755 || warn "can't create $part/stage.: $!";
    mkdir "sync.", 0755 || warn "can't create $part/sync.: $!";
}

print "done\n";
