#!/moira/bin/perl -Tw

# $Id$

# The following exit codes are defined and MUST BE CONSISTENT with the
# error codes the library uses:
$MR_DBMS_ERR = 47836421;

$ENV{PATH} = "/bin:/usr/bin:/sbin:/usr/sbin";

$outdir = '/moira/dcm/tsm';
umask 022;

use DBI;

$dbh = DBI->connect("dbi:Oracle:moira", "moira", "moira")
  || exit $MR_DBMS_ERR;

$sth0 = $dbh->prepare("SELECT l.list_id, m.name " .
		      "FROM list l, machine m, serverhosts sh " .
		      "WHERE sh.value3 = l.name AND sh.service = 'TSM' " .
		      "AND m.mach_id = sh.mach_id") || exit $MR_DBMS_ERR;
$sth0->execute;

while (($root_list_id, $hostname) = $sth0->fetchrow_array) {
    open(OUT, ">$outdir/$hostname");

    $sth = $dbh->prepare("SELECT l.name, l.gid FROM list l " .
			 "WHERE l.list_id = " . 
			 $dbh->quote($root_list_id)) || 
			 exit $MR_DBMS_ERR;
    $sth->execute;

    while (($name, $gid) = $sth->fetchrow_array) {
	$row = "$name:$gid:";
	$row =~ s/\0//g;
	print OUT $row;
	$maybecomma = "";
    }

    $sth = $dbh->prepare("SELECT u.login FROM users u, imembers i " .
			 "WHERE i.list_id = " . $dbh->quote($root_list_id) .
			 "AND i.direct = 1 " .
			 "AND i.member_type = 'USER' " .
			 "AND u.users_id = i.member_id") || exit $MR_DBMS_ERR;
    $sth->execute;

    while (($login) = $sth->fetchrow_array) { 
	$row = "$maybecomma$login";
	$row =~ s/\0//g;
	print OUT $row;
	$maybecomma = ",";
    }

    $row = "\n";
    $row =~ s/\0//g;
    print OUT $row;

    $sth = $dbh->prepare("SELECT l.name, l.gid FROM list l, imembers i " .
			 "WHERE i.list_id = " . $dbh->quote($root_list_id) .
			 "AND i.member_type = 'LIST' " .
			 "AND i.member_id = l.list_id AND i.direct = 1 " .
			 "AND l.grouplist = 1 ORDER BY l.name") || exit $MR_DBMS_ERR;
    $sth->execute;
    
    while (($name, $gid) = $sth->fetchrow_array) {
	$sth2 = $dbh->prepare("SELECT UNIQUE i.member_type, i.member_id " .
			      "FROM imembers i, list l " .
			      "WHERE l.name = " . $dbh->quote($name) .
			      "AND i.list_id = l.list_id " .
			      "AND (i.member_type = 'USER' " .
			      "OR i.member_type = 'STRING')") || 
				  exit $MR_DBMS_ERR;
	$sth2->execute;
	
	$row = "$name:$gid:";
	$row =~ s/\0//g;
	print OUT $row;
	$maybecomma = "";
	
	while (($type, $id) = $sth2->fetchrow_array) {
	    if ($type eq "USER") {
		($member) = $dbh->selectrow_array("SELECT login FROM users " .
						  "WHERE users_id = " . 
						  $dbh->quote($id)) ||
						      exit $MR_DBMS_ERR;
	    }
	    elsif ($type eq "STRING") {
		($member) = $dbh->selectrow_array("SELECT string " .
						  "FROM strings " .
						  "WHERE string_id = " .
						  $dbh->quote($id)) ||
						      exit $MR_DBMS_ERR;
	    }
	    $row = "$maybecomma$member";
	    $row =~ s/\0//g;
	    print OUT $row;
	    $maybecomma = ",";
	}
	
	$row = "\n";
	$row =~ s/\0//g;
	print OUT $row;
    }
    close(OUT);
}

$dbh->disconnect;

exit 0;
