#!/tools/ns/bin/perl
# Integrate WebServer into Mission Control framework.

$| = 1;
$isNT = -d '\\';

# parse arguments
if ($#ARGV < 0 || $#ARGV > 15) {
    printUsage();
}
my $argc = 0;
my $rootDir = 0;
my $hostname = 0;
my $host = 0;
my $port = 0;
my $baseDN = 0;
my $bindDN = 0;
my $bindPwd = 0;
my $ldapHost = 0;
my $ldapPort = 0;
while ($argc <= $#ARGV) {
    if ($ARGV[$argc] eq "-root") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $rootDir = $ARGV[$argc++];
        $rootDir =~ s/\\/\//g if $isNT;
        if (substr($rootDir, length($rootDir)-1, length($rootDir)) eq "/") {
            chop($rootDir);
        }
    } elsif ($ARGV[$argc] eq "-host") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $hostname = $ARGV[$argc++];
        # XXX: FIGURE OUT HOST HERE!
        $host = $hostname;
        if ($host =~ /\./) {
            $host =~ s/^(\w*)\..*$/$1/;
        }
    } elsif ($ARGV[$argc] eq "-port") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $port = $ARGV[$argc++];
        if (!(/^\w*$/) || $port < 1 || $port > 65535) {
            printError ("No such port: $port\n");
        }
    } elsif ($ARGV[$argc] eq "-basedn") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $baseDN = $ARGV[$argc++];
    } elsif ($ARGV[$argc] eq "-binddn") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $bindDN = $ARGV[$argc++];
    } elsif ($ARGV[$argc] eq "-bindpwd") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $bindPwd = $ARGV[$argc++];
    } elsif ($ARGV[$argc] eq "-ldaphost") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $ldapHost = $ARGV[$argc++];
    } elsif ($ARGV[$argc] eq "-ldapport") {
        $argc++;
        if ($argc > $#ARGV) {
            printUsage();
        }
        $ldapPort = $ARGV[$argc++];
        if (!(/^\w*$/) || $ldapPort < 1 || $ldapPort > 65535) {
            printError ("No such port: $ldapPort\n");
        }
    } else {
        printError("No such parameter: $ARGV[$argc]\n");
    }
}
if (!$rootDir || !$hostname || !$host || !$port ||
    !$ldapHost || !$ldapPort || !$baseDN || !$bindDN || !$bindPwd) {
    print "ACK!\n";
    printUsage();
}


# print LDIF file
my $timestamp = time();
my $fileName;
local *LDIF;

$fileName = "./mcc.ldif";
open(LDIF, "> $fileName") or printError("Cannot read $fileName: $!\n");
print LDIF <<__UP_TO_THIS_POINT__;
dn: cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot
changetype: add
objectclass: top
objectclass: nsApplication
objectclass: groupOfUniqueNames
cn: iPlanet Web Server
description: iPlanet Web Server
nsproductname: iPlanet Web Server
nsnickname: https
nsproductversion: 4.1
nsbuildnumber: FIXED
nsrevisionnumber: FIXED
nsinstalledlocation: $rootDir
nsexpirationdate: FIXED
installationtimestamp: $timestamp
uniquemember: cn=https-admserv, cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot
creatorsname: $bindDN
modifiersname: $bindDN
createtimestamp: $timestamp
modifytimestamp: $timestamp

dn: cn=https-admserv, cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot
changetype: add
objectclass: top
objectclass: netscapeServer
objectclass: netscapeWebServer
objectclass: nsResourceRef
objectclass: groupOfUniqueNames
cn: https-admserv
nsserverid: $hostname
nsserverport: $port 
userpassword: $bindPwd
serverroot: $rootDir 
serverhostname: $hostname
aci: (targetattr=*)(version 3.0; acl "Enable delegated access"; allow (read, search, compare) groupdn="ldap:///cn=https-admserv, cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot";)
aci: (targetattr=uniquemember)(targetfilter=(objectclass=netscapeServer))(version 3.0; acl "Enable access delegation"; allow (write) groupdn="ldap:///cn=https-admserv, cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot";)
uniquemember: cn=https-admserv, cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot
uniquemember: cn=admin-serv-HOST, cn=Netscape Administration Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot
installationtimestamp: 19980921194200Z
creatorsname: $bindDN
createtimestamp: $timestamp
serverproductname: iPlanet Web Server
description:: RW50ZXJwcmlzZSBTZXJ2ZXIK
modifiersname: $bindDN
modifytimestamp: $timestamp

dn: cn=configuration,cn=https-admserv, cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot
changetype: add
objectclass: nsConfig
objectclass: nsAdminObject
objectclass: top
cn: configuration
nsclassname: com.netscape.management.entserv.EntServer\@entserv41.jar\@cn=admin-serv-HOST, cn=Netscape Administration Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot
nsserverport: $port 
aci: (targetattr=*)(version 3.0; acl "Enable Server configuration"; allow (all) groupdn="ldap:///cn=https-admserv, cn=iPlanet Web Server, cn=Server Group, cn=$hostname, ou=$baseDN, o=NetscapeRoot";)
creatorsname: $bindDN
modifiersname: $bindDN 
createtimestamp: 19991109190139Z
modifytimestamp: 19991109190139Z

__UP_TO_THIS_POINT__
close(LDIF);

# create entry in LDAP server
`./ldapmodify -h $ldapHost -p $ldapPort -D "$bindDN" -w "$bindPwd" -f $fileName`;

# clean up after ourselves
unlink($fileName);

exit(0);


sub printError {
    my $msg = shift;

    print $msg;
    exit(1);
}


sub printUsage {

    print "Usage:  perl installMCC -root <server root> -host <hostname> -port <port>\n";
    print "                        -ldaphost <ldap hostname> -ldapport <port>\n";
    print "                        -basedn <base DN> -binddn <bind DN> -bindpwd <bind password>\n";
    print "Where:  -root     = server root directory\n";
    print "        -host     = hostname\n";
    print "        -port     = port number\n";
    print "        -ldaphost = ldap hostname\n";
    print "        -ldapport = ldap port number\n";
    print "        -basedn   = base DN\n";
    print "        -binddn   = bind DN\n";
    print "        -bindpwd  = bind password\n";
    print "\n";
    exit(0);
}
