PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/repair_mppef_samba.php

https://bitbucket.org/phenobarbital/php-ldap
PHP | 143 lines | 100 code | 7 blank | 36 comment | 13 complexity | a28bf6c84af3821c9c46e56fb49a5664 MD5 | raw file
  1. #!/usr/bin/php
  2. <?php
  3. include "conf/base.inc.php";
  4. include_once BASE_DIR . "conf/include_ldap.inc.php";
  5. #base de inserción y busqueda en mppef:
  6. $basemppef = 'ou=unidades,dc=mppef,dc=gob,dc=ve';
  7. $mppef = ldap::load('mppef');
  8. #buscar el usuario dentro del ADS:
  9. $ads = ldap::load('ads');
  10. //$filter = "(&(objectClass=posixAccount)(uid=ejemplo))";
  11. $filter = "(&(objectClass=posixAccount)(uid=*))";
  12. #abrir la conexion:
  13. $mppef->open();
  14. $ads->open();
  15. #cargar los schemas de mppef (para razones de creacion y validacion de entradas)
  16. #objeto unico dentro de todo el arbol LDAP
  17. ldap_schema::setAdapter($mppef);
  18. #construyo el arbol:
  19. ldap_schema::build();
  20. #obtenemos todos los usuarios:
  21. $users = $mppef->query($filter, $basemppef, 'sub');
  22. $excepciones = array('jesuslara', 'jrey', 'eagmunoz', 'jgonzalezg', 'hhalls', 'hespin', 'elsanto');
  23. #inicializamos varias variables de control:
  24. $editados = 0;
  25. #gestion de errores
  26. $error = 0;
  27. $errores = array();
  28. #control de la presencia en el ADS
  29. $inads = 0;
  30. $newuidnumber = 5000;
  31. foreach($users as $user) {
  32. #Crear una entrada de usuario
  33. $u = $mppef->create($basemppef);
  34. #uid
  35. $uid = $user->uid;
  36. #Agrego los objectclasses efectivos de una entrada:
  37. $u->addObjectclass('organizationalPerson');
  38. $u->addObjectClass('inetOrgPerson');
  39. $u->addObjectClass('sambaSamAccount');
  40. $u->addObjectClass('qmailUser');
  41. $u->addObjectClass('posixAccount');
  42. $u->addObjectClass('shadowAccount');
  43. #atributo base de la entrada
  44. $u->baseAttribute('cn');
  45. #atributos base:
  46. $u->cn = $user->cn;
  47. $u->sn = $user->sn;
  48. #reparando entradas:
  49. $u->o = 'MPPEF';
  50. #corregir el GID del usuario
  51. $u->gidNumber = 513;
  52. #reparar atributos samba:
  53. $u->sambaPrimaryGroupSID = 513;
  54. $u->sambaDomainName = 'MPPEF';
  55. $u->sambaAcctFlags = '[U ]';
  56. #reparar flags de samba:
  57. $u->sambaPasswordHistory = '0000000000000000000000000000000000000000000000000000000000000000';
  58. #cuota del filesystem de samba en MB
  59. $u->sambaUserQuota = 512;
  60. $entry = "(&(objectClass=user)(samaccounttype=". ADS_NORMAL_ACCOUNT .")(samaccountname={$uid}))";
  61. $base = 'DC=MF,DC=gov,DC=ve';
  62. $a = $ads->query($entry, $base, 'sub');
  63. if ($a->num_rows()) {
  64. $inads++;
  65. $sid = $a->bin_to_str_sid('objectSid');
  66. $rid = str_replace('S-1-5-21-1658329406-718221906-1845911597-', '', $sid);
  67. //echo "rid: {$rid}\n";
  68. $u->sambaSID = $sid;
  69. #si el UID no forma parte de las excepciones, normalizo su uidNumber
  70. if (!in_array($uid, $excepciones)) {
  71. $u->uidNumber = $rid;
  72. }
  73. } else {
  74. #si no se encuentra en usuario en el active directory, igual hay que normalizar
  75. if (!in_array($uid, $excepciones)) {
  76. $u->uidNumber = $newuidnumber;
  77. $u->sambaSID = 'S-1-5-21-1658329406-718221906-1845911597-' . $newuidnumber;
  78. $newuidnumber++;
  79. }
  80. }
  81. if(!$user->sambaNTPassword) {
  82. $u->sambaPwdLastSet = 10;
  83. $u->sambaPwdCanChange = 1238617258;
  84. $u->sambaPwdMustChange = 1238617259;
  85. }
  86. #definir si el password NT y LM no han sido establecidos:
  87. if (!$user->sambaNTPassword) {
  88. $u->sambaNTPassword = '259745CB123A52AA2E693AAACCA2DB52';
  89. }
  90. if (!$user->sambaLMPassword) {
  91. $u->sambaLMPassword = '0182BD0BD4444BF836077A718CCDF409';
  92. }
  93. #agregar si no tiene pager y mobile:
  94. if (!$user->mobile) {
  95. $u->mobile = 0;
  96. }
  97. if (!$user->pager) {
  98. $u->pager = 0;
  99. }
  100. #acomodar el mailhost:
  101. //$u->mailHost = 'correo.mppef.gob.ve';
  102. #tamaño máximo de un correo (20MB máximo):
  103. //$u->mailSizeMax = 20971520;
  104. #por ultimo, extraer la unidad funcional a la que pertenece:
  105. $a = ldap_explode_dn($user->dn(), 1);
  106. //print_r($a);
  107. unset($a['count']);
  108. $ou = $a[2];
  109. $u->baseAttribute('cn');
  110. $u->ou = $ou;
  111. #RDN de la entrada:
  112. $u->setRDN("ou=usuarios,ou={$ou}");
  113. #y guardo esta entrada
  114. if(!$u->update()) {
  115. $error++;
  116. $errores[$uid] = $u->dn();
  117. } else {
  118. echo $u->dn() . "\n";
  119. $editados++;
  120. }
  121. }
  122. echo "==== stats ====\n";
  123. echo 'Se obtuvieron ' . $users->count() . " usuarios desde MPPEF.\n";
  124. echo "se modificaron {$editados} usuarios existentes\n";
  125. if ($inads) {
  126. echo "se encontraron {$inads} usuarios en el Active Directory\n";
  127. }
  128. if ($error) {
  129. echo "hubo {$error} errores de edicion; revisar log\n";
  130. var_dump($errores);
  131. }
  132. echo "Ultimo uid asignado a los usuario no ADS: {$newuidnumber}\n";
  133. echo "==== ======\n";
  134. #cerrar:
  135. $mppef->close();
  136. ?>