Implement multiple on duplicated user found policies
This commit is contained in:
parent
368ccf82ff
commit
cd0d9abea8
1 changed files with 105 additions and 36 deletions
|
@ -26,11 +26,13 @@ require_once INSTALL_PATH.'program/include/clisetup.php';
|
||||||
function print_usage()
|
function print_usage()
|
||||||
{
|
{
|
||||||
print "Usage: export-contact.sh -u username -m mailhost.fqdn\n";
|
print "Usage: export-contact.sh -u username -m mailhost.fqdn\n";
|
||||||
print "-u / --user User name\n";
|
print "-u / --user User name\n";
|
||||||
print "-m / --mailhost Mailhost (optional)\n";
|
print "-m / --mailhost Mailhost (optional)\n";
|
||||||
print "-o / --output Output file\n";
|
print "-o / --output Output file\n";
|
||||||
print "-v / --verbose Enable verbose mode\n";
|
print "-l / --last-login-on-duplicated Use last login user on duplicated\n";
|
||||||
print "-d / --debug Enable debug mode\n";
|
print "-a / --all-on-duplicated Retreive all user contacts on duplicated\n";
|
||||||
|
print "-v / --verbose Enable verbose mode\n";
|
||||||
|
print "-d / --debug Enable debug mode\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
function vputs($str)
|
function vputs($str)
|
||||||
|
@ -47,7 +49,7 @@ function progress_update($pos, $max)
|
||||||
|
|
||||||
class rcmail_export extends rcmail_utils {
|
class rcmail_export extends rcmail_utils {
|
||||||
|
|
||||||
function get_userid($user,$mailhost=null) {
|
function get_userid($user,$mailhost=null,$onDuplicatedPolicy='error') {
|
||||||
$db = self::db();
|
$db = self::db();
|
||||||
$sql = "SELECT user_id, mail_host, last_login FROM " . $db->table_name('users', true) . " WHERE username=?";
|
$sql = "SELECT user_id, mail_host, last_login FROM " . $db->table_name('users', true) . " WHERE username=?";
|
||||||
$sql_params = array($user);
|
$sql_params = array($user);
|
||||||
|
@ -63,10 +65,39 @@ class rcmail_export extends rcmail_utils {
|
||||||
log_msg('FATAL',"User $user not found !");
|
log_msg('FATAL',"User $user not found !");
|
||||||
}
|
}
|
||||||
elseif ($db -> num_rows($sql_result)>1) {
|
elseif ($db -> num_rows($sql_result)>1) {
|
||||||
log_msg('FATAL', "More thant one user found for username $user. You need to specify mailhost !");
|
log_msg("DEBUG","On duplicated user policy : $onDuplicatedPolicy");
|
||||||
log_msg('INFO', "Users found :");
|
switch ($onDuplicatedPolicy) {
|
||||||
while($sql_arr = $db->fetch_assoc($sql_result)) {
|
case 'last-login':
|
||||||
log_msg('INFO', " - User : $user / ID : ".$sql_arr['user_id']." / Mailhost : ".$sql_arr['mail_host']." / Last login : ".$sql_arr['last_login']);
|
log_msg('INFO', "More thant one user found for username $user : take the last connected one.");
|
||||||
|
$user_id = false;
|
||||||
|
$mailhost = false;
|
||||||
|
$last_connected="1900-01-01 00:00:00";
|
||||||
|
while($sql_arr = $db->fetch_assoc($sql_result)) {
|
||||||
|
log_msg('DEBUG', " - User : $user / ID : ".$sql_arr['user_id']." / Mailhost : ".$sql_arr['mail_host']." / Last login : ".$sql_arr['last_login']);
|
||||||
|
if ( strnatcmp($last_connected, $sql_arr['last_login']) <= 0 ) {
|
||||||
|
$last_connected=$sql_arr['last_login'];
|
||||||
|
$user_id = $sql_arr['user_id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_msg('INFO', "Last connected one is ID $user_id / Mailhost : $mailhost / Last login : $last_connected");
|
||||||
|
return $user_id;
|
||||||
|
break;
|
||||||
|
case 'all':
|
||||||
|
log_msg('INFO', "More thant one user found for username $user : take all of them.");
|
||||||
|
$user_ids = array();
|
||||||
|
while($sql_arr = $db->fetch_assoc($sql_result)) {
|
||||||
|
log_msg('DEBUG', " - User : $user / ID : ".$sql_arr['user_id']." / Mailhost : ".$sql_arr['mail_host']." / Last login : ".$sql_arr['last_login']);
|
||||||
|
$user_ids[] = $sql_arr['user_id'];
|
||||||
|
}
|
||||||
|
return $user_ids;
|
||||||
|
break;
|
||||||
|
case 'error':
|
||||||
|
default:
|
||||||
|
log_msg('FATAL', "More thant one user found for username $user. You need to specify mailhost !");
|
||||||
|
log_msg('INFO', "Users found :");
|
||||||
|
while($sql_arr = $db->fetch_assoc($sql_result)) {
|
||||||
|
log_msg('INFO', " - User : $user / ID : ".$sql_arr['user_id']." / Mailhost : ".$sql_arr['mail_host']." / Last login : ".$sql_arr['last_login']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -77,44 +108,57 @@ class rcmail_export extends rcmail_utils {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_user_address_book($user, $mailhost = null) {
|
function get_user_address_book($user, $mailhost = null, $onDuplicatedPolicy = 'error') {
|
||||||
$userid=$this -> get_userid($user, $mailhost);
|
$userids=$this -> get_userid($user, $mailhost, $onDuplicatedPolicy);
|
||||||
if ($userid !== false) {
|
if ($userid === false)
|
||||||
|
return false;
|
||||||
|
if (!is_array($userids))
|
||||||
|
$userids = array($userids);
|
||||||
|
$address_books = array();
|
||||||
|
foreach ($userids as $userid) {
|
||||||
log_msg('DEBUG', "User $user ID : $userid");
|
log_msg('DEBUG', "User $user ID : $userid");
|
||||||
$contacts = new rcube_contacts(self::db(), $userid);
|
$address_books[] = new rcube_contacts(self::db(), $userid);
|
||||||
return $contacts;
|
|
||||||
}
|
}
|
||||||
return false;
|
return $address_books;
|
||||||
}
|
}
|
||||||
|
|
||||||
function export_user_contacts($user, $mailhost = null, $out = null) {
|
function export_user_contacts($user, $mailhost = null, $out = null, $onDuplicatedPolicy = 'error') {
|
||||||
$CONTACTS = $this->get_user_address_book($user, $mailhost);
|
$address_books = $this->get_user_address_book($user, $mailhost, $onDuplicatedPolicy);
|
||||||
if ($CONTACTS === false) {
|
if ($address_books === false) {
|
||||||
log_msg('WARNING', "No address book found for user $user");
|
log_msg('WARNING', "No address book found for user $user");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$CONTACTS->set_page(1);
|
|
||||||
$CONTACTS->set_pagesize(99999);
|
|
||||||
$result = $CONTACTS->list_records(null, 0, true);
|
|
||||||
|
|
||||||
if (!$out) {
|
if (!$out) {
|
||||||
$out = STDOUT;
|
$out = STDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
$count=0;
|
log_msg('DEBUG', count($address_books). " address book(s) found for user $user.");
|
||||||
while ($result && ($row = $result->next())) {
|
|
||||||
if ($CONTACTS) {
|
|
||||||
$this -> prepare_for_export($row, $CONTACTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
// fix folding and end-of-line chars
|
$total_count=0;
|
||||||
$row['vcard'] = preg_replace('/\r|\n\s+/', '', $row['vcard']);
|
for($idx=0; $idx < count($address_books); $idx++) {
|
||||||
$row['vcard'] = preg_replace('/\n/', rcube_vcard::$eol, $row['vcard']);
|
log_msg('DEBUG', "Export contact of address book #$idx of user $user.");
|
||||||
fwrite($out, rcube_vcard::rfc2425_fold($row['vcard']) . rcube_vcard::$eol);
|
$address_books[$idx]->set_page(1);
|
||||||
$count++;
|
$address_books[$idx]->set_pagesize(99999);
|
||||||
|
$result = $address_books[$idx]->list_records(null, 0, true);
|
||||||
|
|
||||||
|
$count=0;
|
||||||
|
while ($result && ($row = $result->next())) {
|
||||||
|
if ($address_books[$idx]) {
|
||||||
|
$this -> prepare_for_export($row, $address_books[$idx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fix folding and end-of-line chars
|
||||||
|
$row['vcard'] = preg_replace('/\r|\n\s+/', '', $row['vcard']);
|
||||||
|
$row['vcard'] = preg_replace('/\n/', rcube_vcard::$eol, $row['vcard']);
|
||||||
|
fwrite($out, rcube_vcard::rfc2425_fold($row['vcard']) . rcube_vcard::$eol);
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
log_msg("INFO","$count contact(s) found in address book #$idx of user $user");
|
||||||
|
$total_count += $count;
|
||||||
}
|
}
|
||||||
log_msg("INFO","$count contact(s) found in address book of user $user");
|
log_msg("INFO","$total_count contact(s) found in total for user $user");
|
||||||
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepare_for_export(&$record, $source = null) {
|
function prepare_for_export(&$record, $source = null) {
|
||||||
|
@ -165,7 +209,16 @@ class rcmail_export extends rcmail_utils {
|
||||||
}
|
}
|
||||||
|
|
||||||
// get arguments
|
// get arguments
|
||||||
$opts = array('u' => 'user', 'm' => 'mailhost', 'o' => 'output', 'd' => 'debug', 'v' => 'verbose', 'h' => 'help');
|
$opts = array(
|
||||||
|
'u' => 'user',
|
||||||
|
'm' => 'mailhost',
|
||||||
|
'o' => 'output',
|
||||||
|
'l' => 'last-login-on-duplicated',
|
||||||
|
'a' => 'all-on-duplicated',
|
||||||
|
'd' => 'debug',
|
||||||
|
'v' => 'verbose',
|
||||||
|
'h' => 'help',
|
||||||
|
);
|
||||||
$args = rcube_utils::get_opt($opts);
|
$args = rcube_utils::get_opt($opts);
|
||||||
|
|
||||||
if ($_SERVER['argv'][1] == 'help' || isset($args['help'])) {
|
if ($_SERVER['argv'][1] == 'help' || isset($args['help'])) {
|
||||||
|
@ -214,9 +267,25 @@ if (!empty($args['output'])) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($args['last-login-on-duplicated'])) {
|
||||||
|
$onDuplicatedPolicy = 'last-login';
|
||||||
|
}
|
||||||
|
elseif (isset($args['all-on-duplicated'])) {
|
||||||
|
$onDuplicatedPolicy = 'all';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$onDuplicatedPolicy = 'error';
|
||||||
|
}
|
||||||
|
log_msg("DEBUG","On duplicated user policy : $onDuplicatedPolicy");
|
||||||
|
|
||||||
$export = new rcmail_export();
|
$export = new rcmail_export();
|
||||||
|
|
||||||
$export -> export_user_contacts( $args['user'], $args['mailhost'], $out);
|
$result = $export -> export_user_contacts(
|
||||||
|
$args['user'],
|
||||||
|
$args['mailhost'],
|
||||||
|
$out,
|
||||||
|
$onDuplicatedPolicy
|
||||||
|
);
|
||||||
|
|
||||||
if ($out)
|
if ($out)
|
||||||
fclose($out);
|
fclose($out);
|
||||||
|
|
Loading…
Reference in a new issue