2
0
forked from Wavyzz/dolibarr

Fix: add ldap import/export script

This commit is contained in:
Regis Houssin
2017-09-17 10:42:00 +02:00
parent d9b3a4e456
commit 1f88e624c2
4 changed files with 355 additions and 3 deletions

View File

@@ -163,7 +163,7 @@ if (! empty($conf->adherent->enabled))
$arraylist=array(); $arraylist=array();
$arraylist['0']=$langs->trans("No"); $arraylist['0']=$langs->trans("No");
$arraylist['1']=$langs->trans("DolibarrToLDAP"); $arraylist['1']=$langs->trans("DolibarrToLDAP");
//$arraylist['ldap2dolibarr']=$langs->trans("LDAPToDolibarr").' ('.$langs->trans("SupportedForLDAPImportScriptOnly").')'; $arraylist['ldap2dolibarr']=$langs->trans("LDAPToDolibarr").' ('.$langs->trans("SupportedForLDAPImportScriptOnly").')';
print $form->selectarray('activememberstypes',$arraylist,$conf->global->LDAP_MEMBER_TYPE_ACTIVE); print $form->selectarray('activememberstypes',$arraylist,$conf->global->LDAP_MEMBER_TYPE_ACTIVE);
print '</td><td>'.$langs->trans("LDAPDnMemberTypeActiveExample").'</td></tr>'; print '</td><td>'.$langs->trans("LDAPDnMemberTypeActiveExample").'</td></tr>';
} }

View File

@@ -0,0 +1,131 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2017 Regis Houssin <regis.houssin@capnetworks.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* \file scripts/user/sync_members_types_dolibarr2ldap.php
* \ingroup ldap core
* \brief Script de mise a jour des types de membres dans LDAP depuis base Dolibarr
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: ".$script_file." now\n";
exit(-1);
}
$now=$argv[1];
require_once($path."../../htdocs/master.inc.php");
require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php");
// Global variables
$version=DOL_VERSION;
$error=0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',',$argv));
/*
if (! $conf->global->LDAP_SYNCHRO_ACTIVE)
{
print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
exit(-1);
}
*/
$sql = "SELECT rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."adherent_type";
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
$ldap=new Ldap();
$result=$ldap->connect_bind();
if ($result > 0)
{
while ($i < $num)
{
$ldap->error="";
$obj = $db->fetch_object($resql);
$membertype = new AdherentType($db);
$membertype->id = $obj->rowid;
$membertype->fetch($membertype->id);
print $langs->trans("UpdateMemberType")." rowid=".$membertype->id." ".$membertype-label;
$oldobject=$membertype;
$oldinfo=$membertype->_load_ldap_info();
$olddn=$membertype->_load_ldap_dn($oldinfo);
$info=$membertype->_load_ldap_info();
$dn=$membertype->_load_ldap_dn($info);
$result=$ldap->add($dn,$info,$user); // Wil fail if already exists
$result=$ldap->update($dn,$info,$user,$olddn);
if ($result > 0)
{
print " - ".$langs->trans("OK");
}
else
{
$error++;
print " - ".$langs->trans("KO").' - '.$ldap->error;
}
print "\n";
$i++;
}
$ldap->unbind();
$ldap->close();
}
else {
print $ldap->error;
}
}
else
{
dol_print_error($db);
}
exit($error);

View File

@@ -0,0 +1,221 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Maxime Kohlhaas <maxime@atm-consulting.fr>
* Copyright (C) 2017 Regis Houssin <regis.houssin@capnetworks.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* \file scripts/user/sync_members_types_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script to update members types into Dolibarr from LDAP
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
}
require_once($path."../../htdocs/master.inc.php");
require_once(DOL_DOCUMENT_ROOT."/core/lib/date.lib.php");
require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php");
$langs->load("main");
$langs->load("errors");
// Global variables
$version=DOL_VERSION;
$error=0;
$forcecommit=0;
$confirmed=0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',',$argv));
// List of fields to get from LDAP
$required_fields = array(
$conf->global->LDAP_KEY_MEMBERS_TYPES,
$conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME,
$conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION,
$conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS
);
// Remove from required_fields all entries not configured in LDAP (empty) and duplicated
$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElement")));
if (! isset($argv[1])) {
//print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n";
print "Usage: $script_file (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]\n";
exit(-1);
}
foreach($argv as $key => $val)
{
if ($val == 'commitiferror') $forcecommit=1;
if (preg_match('/--server=([^\s]+)$/',$val,$reg)) $conf->global->LDAP_SERVER_HOST=$reg[1];
if (preg_match('/--excludeuser=([^\s]+)$/',$val,$reg)) $excludeuser=explode(',',$reg[1]);
if (preg_match('/-y$/',$val,$reg)) $confirmed=1;
}
print "Mails sending disabled (useless in batch mode)\n";
$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails
print "\n";
print "----- Synchronize all records from LDAP database:\n";
print "host=".$conf->global->LDAP_SERVER_HOST."\n";
print "port=".$conf->global->LDAP_SERVER_PORT."\n";
print "login=".$conf->global->LDAP_ADMIN_DN."\n";
print "pass=".preg_replace('/./i','*',$conf->global->LDAP_ADMIN_PASS)."\n";
print "DN to extract=".$conf->global->LDAP_MEMBER_TYPE_DN."\n";
print 'Filter=('.$conf->global->LDAP_KEY_MEMBERS_TYPES.'=*)'."\n";
print "----- To Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
print "database=".$conf->db->name."\n";
print "----- Options:\n";
print "commitiferror=".$forcecommit."\n";
print "Mapped LDAP fields=".join(',',$required_fields)."\n";
print "\n";
if (! $confirmed)
{
print "Hit Enter to continue or CTRL+C to stop...\n";
$input = trim(fgets(STDIN));
}
if (empty($conf->global->LDAP_MEMBER_TYPE_DN))
{
print $langs->trans("Error").': '.$langs->trans("LDAP setup for members types not defined inside Dolibarr");
exit(-1);
}
$ldap = new Ldap();
$result = $ldap->connect_bind();
if ($result >= 0)
{
$justthese=array();
// We disable synchro Dolibarr-LDAP
$conf->global->LDAP_MEMBER_TYPE_ACTIVE=0;
$ldaprecords = $ldap->getRecords('*',$conf->global->LDAP_MEMBER_TYPE_DN, $conf->global->LDAP_KEY_MEMBERS_TYPES, $required_fields, 0, array($conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS));
if (is_array($ldaprecords))
{
$db->begin();
// Warning $ldapuser has a key in lowercase
foreach ($ldaprecords as $key => $ldapgroup)
{
$membertype = new AdherentType($db);
$membertype->fetch('', $ldapgroup[$conf->global->LDAP_KEY_MEMBERS_TYPES]);
$membertype->label = $ldapgroup[$conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME];
$membertype->description = $ldapgroup[$conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION];
$membertype->entity = $conf->entity;
//print_r($ldapgroup);
if ($membertype->id > 0) { // Member type update
print $langs->transnoentities("MemberTypeUpdate").' # '.$key.': name='.$membertype->label;
$res=$membertype->update($user);
if ($res > 0)
{
print ' --> Updated member type id='.$membertype->id.' name='.$membertype->label;
}
else
{
$error++;
print ' --> '.$res.' '.$membertype->error;
}
print "\n";
} else { // Member type creation
print $langs->transnoentities("MemberTypeCreate").' # '.$key.': name='.$membertype->label;
$res=$membertype->create($user);
if ($res > 0)
{
print ' --> Created member type id='.$membertype->id.' name='.$membertype->label;
}
else
{
$error++;
print ' --> '.$res.' '.$membertype->error;
}
print "\n";
}
//print_r($membertype);
}
if (! $error || $forcecommit)
{
if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n";
else print $langs->transnoentities("ErrorButCommitIsDone")."\n";
$db->commit();
}
else
{
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone",$error)."\n";
$db->rollback();
}
print "\n";
}
else
{
dol_print_error('',$ldap->error);
$error++;
}
}
else
{
dol_print_error('',$ldap->error);
$error++;
}
exit($error);
/**
* Function to say if a value is empty or not
*
* @param string $element Value to test
* @return boolean True of false
*/
function dolValidElement($element)
{
return (trim($element) != '');
}

View File

@@ -138,8 +138,8 @@ class AdherentTest extends PHPUnit_Framework_TestCase
$localobject=new AdherentType($this->savdb); $localobject=new AdherentType($this->savdb);
$localobject->statut=1; $localobject->statut=1;
$localobject->libelle='Adherent type test'; $localobject->label='Adherent type test';
$localobject->cotisation=1; $localobject->subscription=1;
$localobject->vote=1; $localobject->vote=1;
$result=$localobject->create($user); $result=$localobject->create($user);
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";