#!/usr/bin/env perl

# wbmc_ssh_ldapconf, v 1.0 2002/07/24 19:15 hata

require "/opt/nec/mail/wbmc/lib/wbmc.pl";
require "/opt/nec/mail/wbmc/bin/wbmc_msh_cmd.pl";

#chomp($localhost =`hostname`);
chomp($hostname = `/opt/nec/mail/mailgethost`);
$umsconf_file = '/opt/nec/mail/ums.conf';
$umsconf_fov = '/home/mail/#ums.conf';
$ldapsearch_cmd = '/usr/bin/ldapsearch';

#&readParam();

$action = $ENV{'WBMC_LDAPCONF_ACTION'};
$ldap_admin = $ENV{'WBMC_LDAPCONF_ADMIN'};
$ldap_passwd = $ENV{'WBMC_LDAPCONF_PASSWD'};

if ($action eq "") {
    $action = $ARGV[0];
    $ldap_admin = $ARGV[1];
    $ldap_passwd = $ARGV[2];
}

if ($action eq "-a") {
    &ldapconf_modify;
} elsif ($action eq "-u") {
    &umsconf_modify;
} elsif ($action eq "-s") {
    &slapdconf_modify;
#} elsif ($action eq "-e") {
#    &emsldap_modify
}
exit;

sub parse_structsvr_list
{
    my @structsvr_list = ();
    
  # /opt/nec/mail/ums.conf ɤ߹
  # - host, port, uri, basedn, binddn, bindpw 
  #
    open(UMSCONF_FILE, $umsconf_file);
    while(<UMSCONF_FILE>) {
        $line = $_;
        chomp($line);
        if ($line =~ /^host/) {
            ($para, $host) = split(/=/, $line);
            $host =~ s/"//g;
        }
        if ($line =~ /^port/) {
            ($para, $port) = split(/=/, $line);
            $port =~ s/"//g;
        }
        if ($line =~ /^uri/) {
            ($para, $uri) = split(/=/, $line);
            $uri =~ s/"//g;
        }
        if ($line =~ /^basedn/) {
            ($para, $basedn) = split(/basedn=/, $line);
            $basedn =~ s/"//g;
        }
        if ($line =~ /^binddn/) {
            ($para, $binddn) = split(/binddn=/, $line);
            $binddn =~ s/"//g;
        }
        if ($line =~ /^bindpw/) {
            ($para, $bindpw) = split(/bindpw=/, $line);
            $bindpw =~ s/"//g;
        }
        if ($line =~ /^userid/) {
            ($para, $userid) = split(/userid=/, $line);
            $userid =~ s/"//g;
        }
        if ($line =~ /^groupid/) {
            ($para, $groupid) = split(/groupid=/, $line);
            $groupid =~ s/"//g;
        }
    }
    close(UMSCONF_FILE);

  # ldapseach ޥɤǹа
  # - ldapsearch -x -LLL -D "binddn" -w "bindpw" -h "host:port" -b "basedn"
  #                         "objectClass=expresMailServerStructServer"
  #
  #   uid: hogehoge -> hogehoge get
  #
    $ldapsearch_opt = " -x -LLL -D '$binddn' -w $bindpw -H '$uri' -b 'ou=Struct Server, $basedn' ";
#    $filter = '"objectClass=expressMailServerStructServer"';
    $structsvr_search = $ldapsearch_cmd . $ldapsearch_opt;
    my $find = 0;
    open(SRCH, "$structsvr_search | ");
    while(<SRCH>) {
        $line = $_;
        chomp($line);
        if ($line !~ /^uid: /) {
            next;
        }
        ($uid, $structsvr) = split(/uid: /, $line);
        push(@structsvr_list, $structsvr);
    }
    close(SRCH);
    return @structsvr_list;
}

sub ldapconf_modify
{
  # Ф ums.conf ѹ
    @structsvr_list = &parse_structsvr_list;
    $cmd = "/opt/nec/mail/mcmd/wbmc_ssh_ldapconf -u $ldap_admin '$ldap_passwd'";
  # $cmd = "/opt/nec/mail/wbmc/bin/wbmc_ssh_ldapconf -u $ldap_admin '$ldap_passwd'";
    for $structsvr (@structsvr_list) {
        next if ($structsvr eq $hostname);
        @result = &wbmc_dc_rsh($structsvr, $cmd);
    }
    @result = &wbmc_dc_rsh($hostname, $cmd);
  # slapd.conf, slapd_tls.conf ѹ
    $cmd = "/opt/nec/mail/mcmd/wbmc_ssh_ldapconf -s $ldap_admin '$ldap_passwd'";
  # $cmd = "/opt/nec/mail/wbmc/bin/wbmc_ssh_ldapconf -s $ldap_admin '$ldap_passwd'";
    @result = &wbmc_dc_rsh($host, $cmd);

  # emsldap ѹ
  #  $cmd = "/opt/nec/mail/wbmc/bin/wbmc_ssh_ldapconf -e $ldap_admin $ldap_passwd";
  #  @result = &wbmc_dc_rsh($host, $cmd);

  # emsldap Ƶư
    $cmd = "/opt/nec/mail/mcmd/emsldap restart";
  # $cmd = "/etc/rc.d/init.d/emsldap restart";
    @result = &wbmc_dc_rsh($host, $cmd);

  # minetd Ƶư¾ΥӥκƵưͭˤ뤿
    $cmd = "/opt/nec/mail/mcmd/minetd restart";
    for $structsvr (@structsvr_list) {
        @result = &wbmc_dc_rsh($structsvr, $cmd);
    }

  # ahttpd Ƶưminetd ƵưƤΥӥߤˤʤ뤿
    $cmd = "/opt/nec/mail/mcmd/ahttpd start";
    for $structsvr (@structsvr_list) {
        @result = &wbmc_dc_rsh($structsvr, $cmd);
    }
}

sub umsconf_modify
{
    open(UMSCONF_FILE_R, $umsconf_file);
    @line = <UMSCONF_FILE_R>;
    close(UMSCONF_FILE_R);
    foreach $line (@line) {
        chomp($line);
        $value = $line;
      #  if ($line =~ /^uri/) {
      #      ($para, $uri) = split(/=/, $line);
      #      $uri =~ s/"//g;
      #  }
        if ($line =~ /^binddn/) {
            ($para, $suffix) = split(/\,/, $line);
            $value = "binddn=cn=$ldap_admin" . "," . "$suffix";
        }
        if ($line =~ /^bindpw/) {
            if ($ldap_passwd ne '********') {
                $value = "bindpw=$ldap_passwd";
            }
        }
        push(@new, "$value\n");
    }
    open(UMSCONF_FILE_W, ">$umsconf_file");
    print UMSCONF_FILE_W @new;
    close(UMSCONF_FILE_W);
    system("/bin/chown $userid\:$groupid $umsconf_file");
    system("/bin/cp -pf $umsconf_file ${umsconf_fov}.tmp");
    system("/bin/mv -f ${umsconf_fov}.tmp $umsconf_fov");
}

sub slapdconf_modify
{
  # ums.conf ɤ߹
    open(UMSCONF_FILE, $umsconf_file);
    while (<UMSCONF_FILE>) {
        $line = $_;
        chomp($line);
        if ($line =~ /^host/) {
            ($para, $host) = split(/=/, $line);
            $host =~ s/"//g;
        }
        if ($line =~ /^port/) {
            ($para, $port) = split(/=/, $line);
            $port =~ s/"//g;
        }
        if ($line =~ /^uri/) {
            ($para, $uri) = split(/=/, $line);
            $uri =~ s/"//g;
        }
        if ($line =~ /^basedn/) {
            ($para, $basedn) = split(/basedn=/, $line);
            $basedn =~ s/"//g;
        }
        if ($line =~ /^binddn/) {
            ($para, $binddn) = split(/binddn=/, $line);
            $binddn =~ s/"//g;
        }
        if ($line =~ /^bindpw/) {
            ($para, $bindpw) = split(/bindpw=/, $line);
            $bindpw =~ s/"//g;
        }
        if ($line =~ /^userid/) {
            ($para, $userid) = split(/userid=/, $line);
            $userid =~ s/"//g;
        }
        if ($line =~ /^groupid/) {
            ($para, $groupid) = split(/groupid=/, $line);
            $groupid =~ s/"//g;
        }
    }
    close(UMSCONF_FILE);

  # slapd.confν
    $filename = "/opt/nec/mail/emsldap/slapd.conf";
    $filename_fov = "/home/mail/#emsldap/slapd.conf";
    &readFile($filename, "slapd", *line);
    for ($i = 0 ; $i < @line ; $i++) {
        $line = $line[$i];
        $line =~ s/#.*//;
        @ent = split(/\s+/ , $line);
        if ($ent[0] eq "rootdn") {
            $ent[1] = "\t\t\"cn=$ldap_admin";
            $ent[2] = ", $basedn\"\n";
            $line = join("" , @ent);
            @newline[$i] = $line;
            next;
        } elsif($ent[0] eq "rootpw") {
            if ($ldap_passwd ne '********') {
                open(IN, "/usr/sbin/slappasswd -s $ldap_passwd -h {CRYPT} |");
                while(<IN>) {
                    $CryptRootPassword = $_;
                }
                close(IN);
                $ent[1] = "\t\t$CryptRootPassword";
                $line = join("" , @ent);
                @newline[$i] = $line;
                next;
            }
        }
        @newline[$i] = $line[$i];
    }
  # եؽ񤭹
    &writeFile($filename, "slapd", @newline);
    system("/bin/chown $userid:$groupid $filename");
    system("/bin/cp -pf $filename ${filename_fov}.tmp");
    system("/bin/mv -f ${filename_fov}.tmp $filename_fov");

  # slapd_tls.confν
    $filename = "/opt/nec/mail/emsldap/slapd_tls.conf";
    $filename_fov = "/home/mail/#emsldap/slapd_tls.conf";
    &readFile($filename, "slapd", *line);
    for ($i = 0 ; $i < @line ; $i++) {
        $line = $line[$i];
        $line =~ s/#.*//;
        @ent = split(/\s+/ , $line);
        if ($ent[0] eq "rootdn") {
            $ent[1] = "\t\t\"cn=$ldap_admin";
            $ent[2] = ", $basedn\"\n";
            $line = join("" , @ent);
            @newline[$i] = $line;
            next;
        } elsif($ent[0] eq "rootpw") {
            if ($ldap_passwd ne '********') {
                open(IN, "/usr/sbin/slappasswd -s $ldap_passwd -h {CRYPT} |");
                while(<IN>) {
                    $CryptRootPassword = $_;
                }
                close(IN);
                $ent[1] = "\t\t$CryptRootPassword\n\n";
                $line = join("" , @ent);
                @newline[$i] = $line;
                next;
            }
        }
        @newline[$i] = $line[$i];
    }
  # եؽ񤭹
    &writeFile($filename, "slapd", @newline);
    system("/bin/chown $userid:$groupid $filename");
    system("/bin/cp -pf $filename ${filename_fov}.tmp");
    system("/bin/mv -f ${filename_fov}.tmp $filename_fov");

}

#sub emsldap_modify
#{
#}
