setName('Core:Synchro') ->setDescription('Synchronisation Annuaire') ->setHelp('This command Synchro for Core') ->addArgument('simulate', InputArgument::OPTIONAL, 'true to simulate / false to run') ->addArgument('cronid', InputArgument::OPTIONAL, 'ID Cron Job') ->addArgument('lastchance', InputArgument::OPTIONAL, 'Lastchance to run the cron') ; } protected function execute(InputInterface $input, OutputInterface $output) { $this->container = $this->getApplication()->getKernel()->getContainer(); $this->em = $this->container->get('doctrine')->getEntityManager(); $this->output = $output; $this->filesystem = new Filesystem(); $this->rootlog = $this->container->get('kernel')->getRootDir()."/../var/logs/"; $this->writelnred(''); $this->writelnred('== Core:Synchro'); $this->writelnred('=========================================================================================================='); setlocale( LC_CTYPE, 'fr_FR' ); $labelniveau01 = mb_strtoupper($this->container->getParameter('labelniveau01')); $labelniveau02 = mb_strtoupper($this->container->getParameter('labelniveau02')); $masteridentity = $this->container->getParameter('masteridentity'); $simulate = $input->getArgument('simulate'); if($simulate=="") $simulate="true"; if($simulate!="true"&&$simulate!="false") { $this->writeln('Paramétre incorrect'); return; } $simulate=($simulate=="true"); $this->writeln(''); if($simulate) $this->writeln('** SIMULATION'); else $this->writeln('** REEL'); $this->writeln(''); $this->writeln('====================================================='); $this->writeln('== SYNCHONISATION ANNUAIRE =========================='); $this->writeln('====================================================='); $ldap = $this->container->get('cadoles.core.service.ldap'); if(!$ldap->isEnabled()) { if($masteridentity =="LDAP") { $this->writeln(''); $this->writeln('====================================================='); $this->writeln('== SYNCHONISATION LDAP TO BUNDLE ===================='); $this->writeln('====================================================='); $ldap_basedn = $this->container->getParameter('ldap_basedn'); $ldap_template = $this->container->getParameter('ldap_template'); $ldap_username = $this->container->getParameter('ldap_username'); $ldap_firstname = $this->container->getParameter('ldap_firstname'); $ldap_lastname = $this->container->getParameter('ldap_lastname'); $ldap_email = $this->container->getParameter('ldap_email'); $ldap_usersadmin = $this->container->getParameter('ldap_usersadmin'); $fieldstoread = array($ldap_username,$ldap_firstname,$ldap_lastname,$ldap_email); $ldapusers = array(); if($ldap_template=="scribe") { $this->writeln(''); $this->writeln('== PROFILS =========================================='); // Eleves $ldapfilter="(&(uid=*)(ENTPersonProfils=eleve))"; $label="PROFIL = Elèves"; $this->writeln(" - $label"); if(!$simulate) $this->addmodGroup($label,$ldapfilter,false); // Enseignants $ldapfilter="(|(&(uid=*)(ENTPersonProfils=enseignant))(&(uid=*)(typeadmin=0))(&(uid=*)(typeadmin=2)))"; $label="PROFIL = Enseignants"; $this->writeln(" - $label"); if(!$simulate) $this->addmodGroup($label,$ldapfilter,true); // Responsables $ldapfilter="(&(uid=*)(ENTPersonProfils=responsable))"; $label="PROFIL = Responsables"; $this->writeln(" - $label"); if(!$simulate) $this->addmodGroup($label,$ldapfilter,false); // Administratifs $ldapfilter="(&(uid=*)(ENTPersonProfils=administratif))"; $label="PROFIL = Administratifs"; $this->writeln(" - $label"); if(!$simulate) $this->addmodGroup($label,$ldapfilter,true); $this->writeln(''); $this->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"]; $this->writeln(" - $label"); if(!$simulate) $this->addmodGroup($label,$ldapfilter,true); } } $this->writeln(''); $this->writeln('== USERS ============================================'); // On parcours les niveaux 01 pour connaitre les filtres ldap associé $datas=$this->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=$this->em->getRepository('CadolesCoreBundle:User')->findBy(array('username' => $result[$ldap_username])); if(!$user) { $this->writeln(" - Création dans Bundle >> ".$result[$ldap_username]); if(!$simulate) $this->addUser($data,$result[$ldap_username],$result[$ldap_firstname],$result[$ldap_lastname],$result[$ldap_email],$ldap_usersadmin); } else { $this->writeln(" - Modification dans Bundle >> ".$result[$ldap_username]); if(!$simulate) $this->modUser($user[0],$result[$ldap_username],$result[$ldap_firstname],$result[$ldap_lastname],$result[$ldap_email],$ldap_usersadmin); } } } $this->writeln(''); $this->writeln('== USERS GROUP ======================================'); $groups=$this->em->getRepository('CadolesCoreBundle:Group')->findAll(); foreach($groups as $group) { $ldapusersgroup=array(); $ldapfilter=$group->getLdapfilter(); $this->writeln(''); $this->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=$this->em->getRepository('CadolesCoreBundle:User')->findOneBy(array('username' => $value)); if($user) { array_push($ldapusersgroup,$value); $this->writeln(" - Rattacher >> ".$value); if(!$simulate) $this->addtoGroup($user,$group); } } } } // sinon m'a qu'un seul uid else { $user=$this->em->getRepository('CadolesCoreBundle:User')->findOneBy(array('username' => $result["memberuid"])); if($user) { array_push($ldapusersgroup,$result["memberuid"]); $this->writeln(" - Rattacher >> ".$result["memberuid"]); if(!$simulate) $this->addtoGroup($user,$group); } } } if(isset($result[$ldap_username])) { $user=$this->em->getRepository('CadolesCoreBundle:User')->findOneBy(array('username' => $result[$ldap_username])); if($user) { array_push($ldapusersgroup,$result[$ldap_username]); $this->writeln(" - Rattacher >> ".$result[$ldap_username]); if(!$simulate) $this->addtoGroup($user,$group); } } } $members=$this->em->getRepository('CadolesCoreBundle:UserGroup')->findBy(array('group' => $group)); foreach($members as $member) { if(!in_array($member->getUser()->getUsername(),$ldapusersgroup)) { $this->writeln(" - Détattacher >> ".$member->getUser()->getUsername()); if(!$simulate) { $this->em->remove($member); $this->em->flush(); } } } } } $this->writeln(''); $this->writeln('====================================================='); $this->writeln('== SYNCHONISATION BUNDLE TO LDAP ===================='); $this->writeln('====================================================='); $this->writeln(''); $this->writeln('== USERS ============================================'); // Pour chaque utilisateur de la base $users=$this->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)) { $this->writeln(" - Suppression dans Bundle >> ".$user->getUsername()); if(!$simulate) { $this->em->remove($user); $this->em->flush(); } } } } } else { $this->writeln(''); $this->writeln('====================================================='); $this->writeln('== SYNCHONISATION BUNDLE TO LDAP ===================='); $this->writeln('====================================================='); $this->writeln(''); $this->writeln('== NIVEAU01 ========================================='); $baseNiveau01 = $this->container->getParameter('ldap_baseniveau01'); $datas = $this->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) { $this->writeln(' - Modification dans annuaire >> '.$data->getLabel()); if(!$simulate) $ldap->modifyNiveau01($data,$data->getLabel()); } // Sinon création de la fiche else { $this->writeln(' - Création dans annuaire >> '.$data->getLabel()); if(!$simulate) $ldap->addNiveau01($data); } } $this->writeln(''); $this->writeln('== NIVEAU02 ========================================='); $baseNiveau02 = $this->container->getParameter('ldap_baseniveau02'); $datas = $this->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) { $this->writeln(' - Modification dans annuaire >> '.$data->getLabel()); if(!$simulate) $ldap->modifyNiveau02($data,$data->getLabel()); } // Sinon création de la fiche else { $this->writeln(' - Création dans annuaire >> '.$data->getLabel()); if(!$simulate) $ldap->addNiveau02($data); } } $this->writeln(''); $this->writeln('== GROUP ============================================'); $baseGroup = $this->container->getParameter('ldap_basegroup'); $datas = $this->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) { $this->writeln(' - Modification dans annuaire >> '.$data->getLabel()); if(!$simulate) $ldap->modifyGroup($data,$data->getLabel()); } // Sinon création de la fiche else { $this->writeln(' - Création dans annuaire >> '.$data->getLabel()); if(!$simulate) $ldap->addGroup($data); } } $this->writeln(''); $this->writeln('== USER ============================================='); $baseUser = $this->container->getParameter('ldap_baseuser'); $datas = $this->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) { $this->writeln(' - Modification dans annuaire >> '.$data->getUsername()); if(!$simulate) $ldap->modifyUser($data); } // Sinon création de la fiche else { $this->writeln(' - Création dans annuaire >> '.$data->getUsername()); if(!$simulate) $ldap->addUser($data); } // Rattachement à Niveau01 et Niveau02 if(!$simulate) $ldap->addGroupUser($data); } $this->writeln(''); $this->writeln('== USER GROUP ======================================='); $baseGroup = $this->container->getParameter('ldap_basegroup'); $datas = $this->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) { $this->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())); $this->writeln(' > '.$usergroupe->getUser()->getUsername()); } if(!$simulate) $ldap->ldapModify($dn, $attrs); } } $this->writeln(''); $this->writeln('====================================================='); $this->writeln('== SYNCHONISATION LDAP TO BUNDLE ===================='); $this->writeln('====================================================='); $this->writeln(''); $this->writeln('== NIVEAU01 ========================================='); $baseNiveau01 = $this->container->getParameter('ldap_baseniveau01'); $criteria = '(cn=*)'; $subbranch=$baseNiveau01; $results = $ldap->search($criteria, array('cn'), $subbranch); foreach($results as $result) { $data = $this->em->getRepository('CadolesCoreBundle:Niveau01')->findBy(array('label' => $result["cn"])); if($data) $this->writeln(' - Existe dans bundle >> '.$result["cn"]); else { $this->writeln(' - A supprimer dans annuaire >> '.$result["cn"]); $dn=$ldap->getNiveau01DN($result["cn"]); if(!$simulate) $ldap->deleteByDN($dn); } } $this->writeln(''); $this->writeln('== NIVEAU02 ========================================='); $baseNiveau02 = $this->container->getParameter('ldap_baseniveau02'); $criteria = '(cn=*)'; $subbranch=$baseNiveau02; $results = $ldap->search($criteria, array('cn'), $subbranch); foreach($results as $result) { $data = $this->em->getRepository('CadolesCoreBundle:Niveau02')->findBy(array('label' => $result["cn"])); if($data) $this->writeln(' - Existe dans bundle >> '.$result["cn"]); else { $this->writeln(' - A supprimer dans annuaire >> '.$result["cn"]); $dn=$ldap->getNiveau02DN($result["cn"]); if(!$simulate) $ldap->deleteByDN($dn); } } $this->writeln(''); $this->writeln('== GROUP ============================================'); $baseGroup = $this->container->getParameter('ldap_basegroup'); $criteria = '(cn=*)'; $subbranch=$baseGroup; $results = $ldap->search($criteria, array('cn'), $subbranch); foreach($results as $result) { $data = $this->em->getRepository('CadolesCoreBundle:Group')->findBy(array('label' => $result["cn"])); if($data) $this->writeln(' - Existe dans bundle >> '.$result["cn"]); else { $this->writeln(' - A supprimer dans annuaire >> '.$result["cn"]); $dn=$ldap->getGroupDN($result["cn"]); if(!$simulate) $ldap->deleteByDN($dn); } } $this->writeln(''); $this->writeln('== USER ============================================='); $baseUser = $this->container->getParameter('ldap_baseuser'); $criteria = '(uid=*)'; $subbranch=$baseUser; $results = $ldap->search($criteria, array('uid'), $subbranch); foreach($results as $result) { $data = $this->em->getRepository('CadolesCoreBundle:User')->findBy(array('username' => $result["uid"])); if($data) $this->writeln(' - Existe dans bundle >> '.$result["uid"]); else { $this->writeln(' - A supprimer dans annuaire >> '.$result["uid"]); $dn='uid='.$result["uid"].','.$baseUser; if(!$simulate) $ldap->deleteByDN($dn); } } } $eportail = $this->container->get('cadoles.core.service.eportail'); if($eportail->isEnabled()) { $this->writeln(''); $this->writeln('====================================================='); $this->writeln('== SYNCHONISATION BUNDLE TO EPORTAIL ================'); $this->writeln('====================================================='); $this->writeln(''); $this->writeln('== NIVEAU01 ========================================='); $datas = $this->em ->createQueryBuilder() ->select('table') ->from('CadolesCoreBundle:Niveau01','table') ->getQuery() ->getResult(); foreach($datas as $data) { $this->writeln(' - Synchronisation eportail >> '.$data->getLabel()); if(!$simulate) $eportail->syncNiveau01($data,$data->getLabel()); } $this->writeln(''); $this->writeln('== NIVEAU02 ========================================='); $datas = $this->em ->createQueryBuilder() ->select('table') ->from('CadolesCoreBundle:Niveau02','table') ->getQuery() ->getResult(); foreach($datas as $data) { $this->writeln(' - Synchronisation eportail >> '.$data->getLabel()); if(!$simulate) $eportail->syncNiveau02($data,$data->getLabel()); } $this->writeln(''); $this->writeln('== GROUP ============================================'); $datas = $this->em ->createQueryBuilder() ->select('table') ->from('CadolesCoreBundle:Group','table') ->getQuery() ->getResult(); foreach($datas as $data) { $this->writeln(' - Synchronisation eportail >> '.$data->getLabel()); if(!$simulate) $eportail->syncGroup($data,$data->getLabel()); } $this->writeln(''); $this->writeln('== USER ============================================='); $datas = $this->em ->createQueryBuilder() ->select('table') ->from('CadolesCoreBundle:User','table') ->getQuery() ->getResult(); foreach($datas as $data) { $this->writeln(' - Synchronisation eportail >> '.$data->getUsername()); if(!$simulate) $eportail->syncUser($data); } $this->writeln(''); $this->writeln('====================================================='); $this->writeln('== SYNCHONISATION EPORTAIL TO BUNDLE ================'); $this->writeln('====================================================='); $dbeportail= $this->container->get('service_container')->get('doctrine.orm.eportail_entity_manager')->getConnection(); $this->writeln(''); $this->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 = $this->em->getRepository('CadolesCoreBundle:Niveau01')->findBy(array('label' =>$tmp)); if($data) { $fgOK=true; $this->writeln(' - Existe dans bundle >> '.$row["group_name"]); } } if (strpos($row["group_name"], $labelniveau02.' = ') === 0) { $tmp=str_replace("$labelniveau01 = ","",$row["group_name"]); $data = $this->em->getRepository('CadolesCoreBundle:Niveau02')->findBy(array('label' =>$tmp)); if($data) { $fgOK=true; $this->writeln(' - Existe dans bundle >> '.$row["group_name"]); } } if (strpos($row["group_name"], 'GROUPE = ') === 0) { $tmp=str_replace("GROUPE = ","",$row["group_name"]); $data = $this->em->getRepository('CadolesCoreBundle:Group')->findBy(array('label' =>$tmp)); if($data) { $fgOK=true; $this->writeln(' - Existe dans bundle >> '.$row["group_name"]); } } if(!$fgOK) { $this->writeln(' - A supprimer dans eportail >> '.$row["group_name"]); if(!$simulate) delGroup($row["group_id"]); } } $this->writeln(''); $this->writeln('== USER ============================================='); $sql = "SELECT * FROM env_user WHERE user_id>0"; $query = $dbeportail->prepare($sql); $query->execute(); while($row=$query->fetch()){ $data = $this->em->getRepository('CadolesCoreBundle:User')->findBy(array('username' =>$row["user_login"])); if($data) $this->writeln(' - Existe dans bundle >> '.$row["user_login"]); else { $this->writeln(' - A supprimer dans eportail >> '.$row["user_login"]); if(!$simulate) delUser($row["user_id"]); } } } $this->writeln(''); return 1; } private function writelnred($string) { $this->output->writeln(''.$string.''); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); } private function writeln($string) { $this->output->writeln($string); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); } protected function addmodGroup($label,$ldapfilter,$fgcanshare) { $group=$this->em->getRepository('CadolesCoreBundle:Group')->findOneBy(array('fgtemplate' => true, 'label' => $label)); if(!$group) { $group=new Group(); $group->setFgcanshare($fgcanshare); } $group->setLabel($label); $group->setFgopen(false); $group->setFgall(false); $group->setLdapfilter($ldapfilter); $group->setFgtemplate(true); $this->em->persist($group); $this->em->flush(); } protected function addtoGroup($user,$group) { $member=$this->em->getRepository('CadolesCoreBundle:UserGroup')->findOneBy(array('group' => $group, 'user' => $user)); if(!$member) { $member= new UserGroup(); $member->setGroup($group); $member->setUser($user); $this->em->persist($member); $this->em->flush(); } } protected function addUser($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"); $this->em->persist($user); $this->em->flush(); } protected function modUser($user,$username,$firstname,$lastname,$email,$usersadmin) { $user->setLastname($lastname); $user->setFirstname($firstname); $user->setEmail($email); if(in_array($username,$usersadmin)) $user->setRole("ROLE_ADMIN"); $this->em->persist($user); $this->em->flush(); } }