ninegate/src/cadolesuser-1.0/src/Cadoles/CoreBundle/Command/SynchroCommand.php

681 lines
32 KiB
PHP
Raw Normal View History

2018-12-18 09:44:39 +01:00
<?php
namespace Cadoles\CoreBundle\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\KernelInterface;
use Doctrine\DBAL\Connection as DBALConnection;
use Doctrine\ORM\EntityManager;
use Cadoles\CoreBundle\Entity\Niveau01;
use Cadoles\CoreBundle\Entity\Niveau02;
2019-03-12 14:50:57 +01:00
use Cadoles\CoreBundle\Entity\User;
use Cadoles\CoreBundle\Entity\Group;
use Cadoles\CoreBundle\Entity\UserGroup;
2018-12-18 09:44:39 +01:00
global $bdd01;
global $config;
class SynchroCommand extends Command
{
protected function configure()
{
$this
// the name of the command (the part after "bin/console")
->setName('Core:Synchro')
// the short description shown while running "php bin/console list"
->setDescription('Synchronisation Annuaire')
// the full command description shown when running the command with
// the "--help" option
->setHelp('This command Synchro for Core')
->addArgument('simulate', InputArgument::OPTIONAL, 'true to simulate / false to run')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$kernel = new \AppKernel('dev', true);
$kernel->boot();
$kernel->loadClassCache();
$em = $kernel->getContainer()->get('service_container')->get('doctrine.orm.default_entity_manager');
setlocale( LC_CTYPE, 'fr_FR' );
2019-03-12 14:50:57 +01:00
$labelniveau01 = mb_strtoupper($kernel->getContainer()->getParameter('labelniveau01'));
$labelniveau02 = mb_strtoupper($kernel->getContainer()->getParameter('labelniveau02'));
$masteridentity = $kernel->getContainer()->getParameter('masteridentity');
2018-12-18 09:44:39 +01:00
$simulate = $input->getArgument('simulate');
if($simulate=="") $simulate="true";
if($simulate!="true"&&$simulate!="false") {
$output->writeln('Paramétre incorrect');
return;
}
$simulate=($simulate=="true");
$output->writeln('');
if($simulate) $output->writeln('** SIMULATION');
else $output->writeln('** REEL');
2019-03-12 14:50:57 +01:00
$output->writeln('');
$output->writeln('=====================================================');
$output->writeln('== SYNCHONISATION ANNUAIRE ==========================');
$output->writeln('=====================================================');
2018-12-18 09:44:39 +01:00
$ldap = $kernel->getContainer()->get('cadoles.core.service.ldap');
2019-03-12 14:50:57 +01:00
if(!$ldap->isEnabled()) {
if($masteridentity !="LDAP") {
$output->writeln('');
$output->writeln(' Synchronisation annuaire désactivée');
}
else {
$output->writeln('');
$output->writeln('=====================================================');
$output->writeln('== SYNCHONISATION LDAP TO BUNDLE ====================');
$output->writeln('=====================================================');
$ldap_basedn = $kernel->getContainer()->getParameter('ldap_basedn');
$ldap_template = $kernel->getContainer()->getParameter('ldap_template');
$ldap_username = $kernel->getContainer()->getParameter('ldap_username');
$ldap_firstname = $kernel->getContainer()->getParameter('ldap_firstname');
$ldap_lastname = $kernel->getContainer()->getParameter('ldap_lastname');
$ldap_email = $kernel->getContainer()->getParameter('ldap_email');
$ldap_usersadmin = $kernel->getContainer()->getParameter('ldap_usersadmin');
$fieldstoread = array($ldap_username,$ldap_firstname,$ldap_lastname,$ldap_email);
$ldapusers = array();
if($ldap_template=="scribe") {
$output->writeln('');
$output->writeln('== PROFILS ==========================================');
// Eleves
$ldapfilter="(&(uid=*)(ENTPersonProfils=eleve))";
$label="PROFIL = Elèves";
$output->writeln(" - $label");
if(!$simulate) $this->addmodGroup($em,$label,$ldapfilter);
// Enseignants
$ldapfilter="(|(&(uid=*)(ENTPersonProfils=enseignant))(&(uid=*)(typeadmin=0))(&(uid=*)(typeadmin=2)))";
$label="PROFIL = Enseignants";
$output->writeln(" - $label");
if(!$simulate) $this->addmodGroup($em,$label,$ldapfilter);
// Responsables
$ldapfilter="(&(uid=*)(ENTPersonProfils=responsable))";
$label="PROFIL = Responsables";
$output->writeln(" - $label");
if(!$simulate) $this->addmodGroup($em,$label,$ldapfilter);
// Administratifs
$ldapfilter="(&(uid=*)(ENTPersonProfils=administratif))";
$label="PROFIL = Administratifs";
$output->writeln(" - $label");
if(!$simulate) $this->addmodGroup($em,$label,$ldapfilter);
$output->writeln('');
$output->writeln('== CLASSES ==========================================');
$results = $ldap->search("type=Classe", ['cn','description','gidNumber'], $ldap_basedn);
foreach($results as $result) {
$cn=$result["cn"];
$ldapfilter="(|(&(type=Classe)(cn=$cn))(&(type=Equipe)(cn=profs-$cn))(&(ENTPersonProfils=Administratif)(divcod=$cn)))";
$label="CLASSE = ".$result["cn"];
$output->writeln(" - $label");
if(!$simulate) $this->addmodGroup($em,$label,$ldapfilter);
}
}
$output->writeln('');
$output->writeln('== USERS ============================================');
// On parcours les niveaux 01 pour connaitre les filtres ldap associé
$datas=$em->createQueryBuilder()->select('table')->from('CadolesCoreBundle:Niveau01','table')->where('table.ldapfilter IS NOT NULL')->getQuery()->getResult();
foreach($datas as $data) {
// On execute le filtre d'appartenance à ce niveau
$results = $ldap->search($data->getLdapfilter(), $fieldstoread, $ldap_basedn);
// Pour chaque utilisateur ldap
foreach($results as $result) {
// On sauvegarde ce user
array_push($ldapusers,$result[$ldap_username]);
// Création ou Modification du user
$user=$em->getRepository('CadolesCoreBundle:User')->findBy(array('username' => $result[$ldap_username]));
if(!$user) {
$output->writeln(" - Création dans Bundle >> ".$result[$ldap_username]);
if(!$simulate) $this->addUser($em,$data,$result[$ldap_username],$result[$ldap_firstname],$result[$ldap_lastname],$result[$ldap_email],$ldap_usersadmin);
}
else {
$output->writeln(" - Modification dans Bundle >> ".$result[$ldap_username]);
if(!$simulate) $this->modUser($em,$user[0],$result[$ldap_username],$result[$ldap_firstname],$result[$ldap_lastname],$result[$ldap_email],$ldap_usersadmin);
}
}
}
$output->writeln('');
$output->writeln('== USERS GROUP ======================================');
$groups=$em->getRepository('CadolesCoreBundle:Group')->findAll();
foreach($groups as $group) {
$ldapusersgroup=array();
$ldapfilter=$group->getLdapfilter();
$output->writeln('');
$output->writeln('== '.$group->getLabel());
if(!is_null($ldapfilter)) {
$results = $ldap->search($ldapfilter,[$ldap_username,"memberuid"] , $ldap_basedn);
foreach($results as $result) {
if(isset($result["memberuid"])) {
// Si memberid est un tableau il y a plusieur user dedans
if(is_array($result["memberuid"])) {
foreach($result["memberuid"] as $key => $value) {
if(is_int($key)) {
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(array('username' => $value));
if($user) {
array_push($ldapusersgroup,$value);
$output->writeln(" - Rattacher >> ".$value);
if(!$simulate) $this->addtoGroup($em,$user,$group);
}
}
}
}
// sinon m'a qu'un seul uid
else {
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(array('username' => $result["memberuid"]));
if($user) {
array_push($ldapusersgroup,$result["memberuid"]);
$output->writeln(" - Rattacher >> ".$result["memberuid"]);
if(!$simulate) $this->addtoGroup($em,$user,$group);
}
}
}
if(isset($result[$ldap_username])) {
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(array('username' => $result[$ldap_username]));
if($user) {
array_push($ldapusersgroup,$result[$ldap_username]);
$output->writeln(" - Rattacher >> ".$result[$ldap_username]);
if(!$simulate) $this->addtoGroup($em,$user,$group);
}
}
}
$members=$em->getRepository('CadolesCoreBundle:UserGroup')->findBy(array('group' => $group));
foreach($members as $member) {
if(!in_array($member->getUser()->getUsername(),$ldapusersgroup)) {
$output->writeln(" - Détattacher >> ".$member->getUser()->getUsername());
if(!$simulate) {
$em->remove($member);
$em->flush();
}
}
}
}
}
$output->writeln('');
$output->writeln('=====================================================');
$output->writeln('== SYNCHONISATION BUNDLE TO LDAP ====================');
$output->writeln('=====================================================');
$output->writeln('');
$output->writeln('== USERS ============================================');
// Pour chaque utilisateur de la base
$users=$em->getRepository('CadolesCoreBundle:User')->findAll();
foreach($users as $user) {
// Si l'utilisateur n'est pas dans la liste des users ldap : on le supprime
if(!in_array($user->getUsername(),$ldapusers)) {
$output->writeln(" - Suppression dans Bundle >> ".$user->getUsername());
if(!$simulate) {
$em->remove($user);
$em->flush();
}
}
}
}
}
else {
2018-12-18 09:44:39 +01:00
$output->writeln('');
$output->writeln('=====================================================');
$output->writeln('== SYNCHONISATION BUNDLE TO LDAP ====================');
$output->writeln('=====================================================');
$output->writeln('');
$output->writeln('== NIVEAU01 =========================================');
$baseNiveau01 = $kernel->getContainer()->getParameter('ldap_baseniveau01');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:Niveau01','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$criteria = '(cn='.$data->getLabel().')';
$subbranch=$baseNiveau01;
$results = $ldap->search($criteria, array('cn'), $subbranch);
// Mise à jour si elle existe
if(count($results) > 0) {
$output->writeln(' - Modification dans annuaire >> '.$data->getLabel());
if(!$simulate) $ldap->modifyNiveau01($data,$data->getLabel());
}
// Sinon création de la fiche
else {
$output->writeln(' - Création dans annuaire >> '.$data->getLabel());
if(!$simulate) $ldap->addNiveau01($data);
}
}
$output->writeln('');
$output->writeln('== NIVEAU02 =========================================');
$baseNiveau02 = $kernel->getContainer()->getParameter('ldap_baseniveau02');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:Niveau02','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$criteria = '(cn='.$data->getLabel().')';
$subbranch=$baseNiveau02;
$results = $ldap->search($criteria, array('cn'), $subbranch);
// Mise à jour si elle existe
if(count($results) > 0) {
$output->writeln(' - Modification dans annuaire >> '.$data->getLabel());
if(!$simulate) $ldap->modifyNiveau02($data,$data->getLabel());
}
// Sinon création de la fiche
else {
$output->writeln(' - Création dans annuaire >> '.$data->getLabel());
if(!$simulate) $ldap->addNiveau02($data);
}
}
$output->writeln('');
$output->writeln('== GROUP ============================================');
$baseGroup = $kernel->getContainer()->getParameter('ldap_basegroup');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:Group','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$criteria = '(cn='.$data->getLabel().')';
$subbranch=$baseGroup;
$results = $ldap->search($criteria, array('cn'), $subbranch);
// Mise à jour si elle existe
if(count($results) > 0) {
$output->writeln(' - Modification dans annuaire >> '.$data->getLabel());
if(!$simulate) $ldap->modifyGroup($data,$data->getLabel());
}
// Sinon création de la fiche
else {
$output->writeln(' - Création dans annuaire >> '.$data->getLabel());
if(!$simulate) $ldap->addGroup($data);
}
}
$output->writeln('');
$output->writeln('== USER =============================================');
$baseUser = $kernel->getContainer()->getParameter('ldap_baseuser');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:User','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$criteria = '(uid='.$data->getUsername().')';
$subbranch=$baseUser;
$results = $ldap->search($criteria, array('uid'), $subbranch);
// S'assurer que SIREN correspond au Niveau01
if($data->getNiveau01()->getSiren()!=$data->getSiren()) {
$data->SetSiren($data->getNiveau01()->getSiren());
$data->flush();
}
// S'assurer que SIRET correspond au Niveau02
if($data->getNiveau02()!==null&&$data->getNiveau01()->getSiren()!=$data->getSiren()) {
$data->SetSiret($data->getNiveau02()->getSiret());
$data->flush();
}
// Mise à jour si elle existe
if(count($results) > 0) {
$output->writeln(' - Modification dans annuaire >> '.$data->getUsername());
if(!$simulate) $ldap->modifyUser($data);
}
// Sinon création de la fiche
else {
$output->writeln(' - Création dans annuaire >> '.$data->getUsername());
if(!$simulate) $ldap->addUser($data);
}
// Rattachement à Niveau01 et Niveau02
if(!$simulate) $ldap->addGroupUser($data);
}
$output->writeln('');
$output->writeln('== USER GROUP =======================================');
$baseGroup = $kernel->getContainer()->getParameter('ldap_basegroup');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:Group','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$criteria = '(cn='.$data->getLabel().')';
$subbranch=$baseGroup;
$results = $ldap->search($criteria, array('cn'), $subbranch);
// Mise à jour des membres du groupes
if(count($results) > 0) {
$output->writeln(' - '.$data->getLabel());
$dn=$ldap->getGroupDN($data->getLabel());
$attrs["memberuid"]=array();
$attrs["cadolesMember"]=array();
foreach($data->getUsers() as $usergroupe) {
array_push($attrs["memberuid"],$usergroupe->getUser()->getUsername());
array_push($attrs["cadolesMember"],$ldap->getUserDN($usergroupe->getUser()));
$output->writeln(' > '.$usergroupe->getUser()->getUsername());
}
if(!$simulate) $ldap->ldapModify($dn, $attrs);
}
}
$output->writeln('');
$output->writeln('=====================================================');
$output->writeln('== SYNCHONISATION LDAP TO BUNDLE ====================');
$output->writeln('=====================================================');
$output->writeln('');
$output->writeln('== NIVEAU01 =========================================');
$baseNiveau01 = $kernel->getContainer()->getParameter('ldap_baseniveau01');
$criteria = '(cn=*)';
$subbranch=$baseNiveau01;
$results = $ldap->search($criteria, array('cn'), $subbranch);
foreach($results as $result) {
$data = $em->getRepository('CadolesCoreBundle:Niveau01')->findBy(array('label' => $result["cn"]));
if($data) $output->writeln(' - Existe dans bundle >> '.$result["cn"]);
else {
$output->writeln(' - A supprimer dans annuaire >> '.$result["cn"]);
$dn=$ldap->getNiveau01DN($result["cn"]);
if(!$simulate) $ldap->deleteByDN($dn);
}
}
$output->writeln('');
$output->writeln('== NIVEAU02 =========================================');
$baseNiveau02 = $kernel->getContainer()->getParameter('ldap_baseniveau02');
$criteria = '(cn=*)';
$subbranch=$baseNiveau02;
$results = $ldap->search($criteria, array('cn'), $subbranch);
foreach($results as $result) {
$data = $em->getRepository('CadolesCoreBundle:Niveau02')->findBy(array('label' => $result["cn"]));
if($data) $output->writeln(' - Existe dans bundle >> '.$result["cn"]);
else {
$output->writeln(' - A supprimer dans annuaire >> '.$result["cn"]);
$dn=$ldap->getNiveau02DN($result["cn"]);
if(!$simulate) $ldap->deleteByDN($dn);
}
}
$output->writeln('');
$output->writeln('== GROUP ============================================');
$baseGroup = $kernel->getContainer()->getParameter('ldap_basegroup');
$criteria = '(cn=*)';
$subbranch=$baseGroup;
$results = $ldap->search($criteria, array('cn'), $subbranch);
foreach($results as $result) {
$data = $em->getRepository('CadolesCoreBundle:Group')->findBy(array('label' => $result["cn"]));
if($data) $output->writeln(' - Existe dans bundle >> '.$result["cn"]);
else {
$output->writeln(' - A supprimer dans annuaire >> '.$result["cn"]);
$dn=$ldap->getGroupDN($result["cn"]);
if(!$simulate) $ldap->deleteByDN($dn);
}
}
$output->writeln('');
$output->writeln('== USER =============================================');
$baseUser = $kernel->getContainer()->getParameter('ldap_baseuser');
$criteria = '(uid=*)';
$subbranch=$baseUser;
$results = $ldap->search($criteria, array('uid'), $subbranch);
foreach($results as $result) {
$data = $em->getRepository('CadolesCoreBundle:User')->findBy(array('username' => $result["uid"]));
if($data) $output->writeln(' - Existe dans bundle >> '.$result["uid"]);
else {
$output->writeln(' - A supprimer dans annuaire >> '.$result["uid"]);
$dn='uid='.$result["uid"].','.$baseUser;
if(!$simulate) $ldap->deleteByDN($dn);
}
}
}
2019-03-12 14:50:57 +01:00
2018-12-18 09:44:39 +01:00
$output->writeln('');
$output->writeln('=====================================================');
$output->writeln('== SYNCHONISATION BUNDLE TO EPORTAIL ================');
$output->writeln('=====================================================');
$eportail = $kernel->getContainer()->get('cadoles.core.service.eportail');
if(!$eportail->isEnabled()) {
$output->writeln('');
$output->writeln(' Synchronisation ePortail désactivée');
}
else {
$output->writeln('');
$output->writeln('== NIVEAU01 =========================================');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:Niveau01','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$output->writeln(' - Synchronisation eportail >> '.$data->getLabel());
if(!$simulate) $eportail->syncNiveau01($data,$data->getLabel());
}
$output->writeln('');
$output->writeln('== NIVEAU02 =========================================');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:Niveau02','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$output->writeln(' - Synchronisation eportail >> '.$data->getLabel());
if(!$simulate) $eportail->syncNiveau02($data,$data->getLabel());
}
$output->writeln('');
$output->writeln('== GROUP ============================================');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:Group','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$output->writeln(' - Synchronisation eportail >> '.$data->getLabel());
if(!$simulate) $eportail->syncGroup($data,$data->getLabel());
}
$output->writeln('');
$output->writeln('== USER =============================================');
$datas = $em ->createQueryBuilder()
->select('table')
->from('CadolesCoreBundle:User','table')
->getQuery()
->getResult();
foreach($datas as $data) {
$output->writeln(' - Synchronisation eportail >> '.$data->getUsername());
if(!$simulate) $eportail->syncUser($data);
}
$output->writeln('');
$output->writeln('=====================================================');
$output->writeln('== SYNCHONISATION EPORTAIL TO BUNDLE ================');
$output->writeln('=====================================================');
$dbeportail= $kernel->getContainer()->get('service_container')->get('doctrine.orm.eportail_entity_manager')->getConnection();
$output->writeln('');
$output->writeln('== GROUP ============================================');
$sql = "SELECT * FROM env_group WHERE group_id>0";
$query = $dbeportail->prepare($sql);
$query->execute();
while($row=$query->fetch()){
$fgOK=false;
if (strpos($row["group_name"], $labelniveau01.' = ') === 0) {
$tmp=str_replace("$labelniveau01 = ","",$row["group_name"]);
$data = $em->getRepository('CadolesCoreBundle:Niveau01')->findBy(array('label' =>$tmp));
if($data) {
$fgOK=true;
$output->writeln(' - Existe dans bundle >> '.$row["group_name"]);
}
}
if (strpos($row["group_name"], $labelniveau02.' = ') === 0) {
$tmp=str_replace("$labelniveau01 = ","",$row["group_name"]);
$data = $em->getRepository('CadolesCoreBundle:Niveau02')->findBy(array('label' =>$tmp));
if($data) {
$fgOK=true;
$output->writeln(' - Existe dans bundle >> '.$row["group_name"]);
}
}
if (strpos($row["group_name"], 'GROUPE = ') === 0) {
$tmp=str_replace("GROUPE = ","",$row["group_name"]);
$data = $em->getRepository('CadolesCoreBundle:Group')->findBy(array('label' =>$tmp));
if($data) {
$fgOK=true;
$output->writeln(' - Existe dans bundle >> '.$row["group_name"]);
}
}
if(!$fgOK) {
$output->writeln(' - A supprimer dans eportail >> '.$row["group_name"]);
if(!$simulate) delGroup($row["group_id"]);
}
}
$output->writeln('');
$output->writeln('== USER =============================================');
$sql = "SELECT * FROM env_user WHERE user_id>0";
$query = $dbeportail->prepare($sql);
$query->execute();
while($row=$query->fetch()){
$data = $em->getRepository('CadolesCoreBundle:User')->findBy(array('username' =>$row["user_login"]));
if($data) $output->writeln(' - Existe dans bundle >> '.$row["user_login"]);
else {
$output->writeln(' - A supprimer dans eportail >> '.$row["user_login"]);
if(!$simulate) delUser($row["user_id"]);
}
}
}
$output->writeln('');
$output->writeln('');
}
protected static function determineKernelRootDir(Event $event) {
$extra = $event->getComposer()->getPackage()->getExtra();
$rootdir = rtrim(getcwd(), '/');
return $rootdir . '/' . trim($extra['symfony-app-dir'], '/');
}
2019-03-12 14:50:57 +01:00
protected static function addmodGroup($em,$label,$ldapfilter) {
$group=$em->getRepository('CadolesCoreBundle:Group')->findOneBy(array('fgtemplate' => true, 'label' => $label));
if(!$group) {
$group=new Group();
}
$group->setLabel($label);
$group->setFgopen(false);
$group->setFgall(false);
$group->setLdapfilter($ldapfilter);
$group->setFgtemplate(true);
$em->persist($group);
$em->flush();
}
protected static function addtoGroup($em,$user,$group) {
$member=$em->getRepository('CadolesCoreBundle:UserGroup')->findOneBy(array('group' => $group, 'user' => $user));
if(!$member) {
$member= new UserGroup();
$member->setGroup($group);
$member->setUser($user);
$em->persist($member);
$em->flush();
}
}
protected static function addUser($em,$niveau01,$username,$firstname,$lastname,$email,$usersadmin) {
$user = new User();
$user->setUsername($username);
$user->setLastname($lastname);
$user->setFirstname($firstname);
$user->setEmail($email);
$user->setNiveau01($niveau01);
$user->setSiren($niveau01->getSiren());
$user->setPassword("PASSWORDFROMEXTERNE");
$user->setVisible(true);
$user->setAuthlevel("simple");
$user->setBelongingpopulation("agent");
if(in_array($username,$usersadmin))
$user->setRole("ROLE_ADMIN");
else
$user->setRole("ROLE_USER");
$em->persist($user);
$em->flush();
}
protected static function modUser($em,$user,$username,$firstname,$lastname,$email,$usersadmin) {
$user->setLastname($lastname);
$user->setFirstname($firstname);
$user->setEmail($email);
if(in_array($username,$usersadmin))
$user->setRole("ROLE_ADMIN");
$em->persist($user);
$em->flush();
}
2018-12-18 09:44:39 +01:00
}