#!/usr/bin/php
<?php

require_once("pre.php");

function switch_user($username) {

	global $G_SESSION;
	global $progname;
	global $stderr;

	$user = user_get_object_by_name($username);
	if (!$user) {
		fwrite($stderr, "$progname: error switching to user \"$username\"\n");
		return false;
	}
	$user->setLoggedIn();
	$G_SESSION = $user;

	return true;

} // end switch_user()

$progname = basename($argv[0]);
$stderr = fopen("php://stderr", "w");

if (count($argv) != 3) {
	print "\n";
	print "usage: $progname <INCF PK> <INCF slug>\n";
	print "\n";
	print "creates a group for an INCF import\n";
	print "\n";
	print "must be run as root\n";
	print "\n";
	print "PK is the ID from the INCF dump\n";
	print "\n";
	print "slug is the INCF slug (short identifier)\n";
	print "\n";
	exit(1);
}

if (posix_getuid() != 0) {
	fwrite($stderr, "$progname: must be run as root\n");
	exit(1);
}

$incf_pk = $argv[1];
$incf_slug = $argv[2];

if (!preg_match("/^[a-z0-9\-]+$/", $incf_slug)) {
	fwrite($stderr, "$progname: bad INCF slug \"$incf_slug\"\n");
	exit(1);
}

if (!switch_user("incf_creator")) {
	exit(1);
}

print "creating group...\n";

$group = new Group();
if (!$group|| !is_object($group)) {
	fwrite($stderr, "$progname: error creating group object\n");
	exit(1);
}
if ($group->isError()) {
	fwrite($stderr, "$progname: error creating group object\n");
	fwrite($stderr, "$progname: " . $group->getErrorMessage() . "\n");
	exit(1);
}

$rv = $group->create(session_get_user(), 
                     "template for INCF $incf_slug", 
                     substr("incf_$incf_slug", 0, 15), 
                     "template for INCF $incf_slug", 
                     "100", 
                     "", 
                     "", 
                     "existing", 
                     "template for INCF $incf_pk: $incf_slug", 
                     'shell1',
                     $sys_cvs_host, 
                     "", 
                     "",
                     "");
if (!$rv) {
	fwrite($stderr, "$progname: error creating group\n");
	fwrite($stderr, "$progname: " . $group->getErrorMessage() . "\n");
	exit(1);
}

print "created group " . $group->getID() . ": " . $group->getUnixName() . "\n";

if (!switch_user("nitrcadmin")) {
	exit(1);
}

print "approving group...\n";

if (!$group->approve(session_get_user())) {
	fwrite($stderr, "$progname: error approving group\n");
	fwrite($stderr, "$progname: " . $group->getErrorMessage() . "\n");
	exit(1);
}

print "setting FRS directory permissions...\n";

chown("/var/lib/gforge/uploads/" . $group->getUnixName(), "apache");
chgrp("/var/lib/gforge/uploads/" . $group->getUnixName(), "apache");
chmod("/var/lib/gforge/uploads/" . $group->getUnixName(), 0755);

print "updating source info...\n";

$query = "UPDATE groups SET source = 'incf', source_id = $incf_pk WHERE group_id = " . $group->getID();
$res = db_query($query);
if (!$res) {
	fwrite($stderr, "$progname: error updating group with INCF information\n");
	fwrite($stderr, "$progname: " . db_error() . "\n");
	exit(1);
}
pg_free_result($res);

print "turning off internal functionality...\n";

$rv = $group->update(session_get_user(),
                     $group->getPublicName(), 
                     $group->getHomePage(), 
                     $group->getDescription(), 
                     0, 
                     0, 
                     0, 
                     0, 
                     1, 
                     0, 
                     0, 
                     1, 
                     '', 
                     '', 
                     100, 
                     '', 
                     '', 
                     0, 
                     0, 
                     1, 
                     0, 
                     0);
if (!$rv) {
	fwrite($stderr, "$progname: error turning off internal functionality\n");
	fwrite($stderr, "$progname: " . $group->getErrorMessage() . "\n");
	exit(1);
}

if (!$group->setPluginUse("mwiki", false)) {
	fwrite($stderr, "$progname: error turning off mediawiki\n");
	fwrite($stderr, "$progname: " . $group->getErrorMessage() . "\n");
	exit(1);
}

print "creating member role...\n";

$role = new Role($group);
if (!$role || !is_object($role)) {
	fwrite($stderr, "$progname: error creating role object\n");
	exit(1);
} elseif ($role->isError()) {
	fwrite($stderr, "$progname: error creating role object\n");
	fwrite($stderr, "$progname: " . $role->getErrorMessage() . "\n");
	exit(1);
}

$role_data = array("projectadmin" => array(0 => 0), 
                   "frs" => array(0 => 0), 
                   "scm" => array(0 => -1), 
                   "docman" => array(0 => 0), 
                   "forumadmin" => array(0 => 0), 
                   "forum" => array(), 
                   "trackeradmin" => array(0 => 0), 
                   "tracker" => array(), 
                   "pmadmin" => array(0 => 0), 
                   "pm" => array());

$query = "SELECT group_forum_id FROM forum_group_list WHERE group_id = " . $group->getID();
$res = db_query($query);
if (!$res) {
	fwrite($stderr, "$progname: error getting forums from database\n");
	fwrite($stderr, "$progname: " . db_error() . "\n");
	exit(1);
}
while ($row = pg_fetch_array($res)) {
	$role_data["forum"][$row["group_forum_id"]] = -1;
}
pg_free_result($res);

$query = "SELECT group_artifact_id FROM artifact_group_list WHERE group_id = " . $group->getID();
$res = db_query($query);
if (!$res) {
	fwrite($stderr, "$progname: error getting trackers from database\n");
	fwrite($stderr, "$progname: " . db_error() . "\n");
	exit(1);
}
while ($row = pg_fetch_array($res)) {
	$role_data["tracker"][$row["group_artifact_id"]] = -1;
}
pg_free_result($res);

$query = "SELECT group_project_id FROM project_group_list WHERE group_id = " . $group->getID();
$res = db_query($query);
if (!$res) {
	fwrite($stderr, "$progname: error getting task managers from database\n");
	fwrite($stderr, "$progname: " . db_error() . "\n");
	exit(1);
}
while ($row = pg_fetch_array($res)) {
	$role_data["pm"][$row["group_project_id"]] = -1;
}
pg_free_result($res);

$role_id = $role->create("Member", $role_data);
if (!$role_id) {
	fwrite($stderr, "$progname: error creating role\n");
	fwrite($stderr, "$progname: " . $role->getErrorMessage() . "\n");
	exit(1);
}

print "done\n";

exit(0);

?>
