Документ создан: 11.02.2010

Массовая "заливка" в OID (Oracle LDAP).

31.03.2009 г.

На днях встала задача залить 380 пользователей в LDAP-каталог, а точнее - Oracle Internet Directory (OID). По-моему, естественно, что я не стал это делать руками, а призвал на помощь perl. Итак, приступим.

В примерах я не буду использовать всех 380 пользователей, а возьму троих абсолютно абстрактных.

Исходные данные:

xls-файл в котором список пользователей, состоящий из полных ФИО, названия предприятия, и e-mail.

Задача:

Залить всех пользователей в LDAP-каталог, предварительно создав account и придумав пароль длиной не менее пяти символов с обязательным наличием в нём, как минимум, одной цифры и символов латиницы.

Действия:

  1. Перво-наперво сформируем текстовый файл ("users_utf8.txt"), в который из xls-файла выведем только ФИО в UTF-8. Правда, у меня работало и в ISO-8859-5, и в KOI8-R, и в Windows-1251, но на машине под управлением Windows пришлось переводить в UTF-8, иначе в дальнейшем возникали ошибки. Описывать эту процедуру здесь не буду, скажу только, что можно сделать это через "Сохранить как…".
  2. Затем, сформируем account, с помощью приведённого ниже скрипта ("translit_utf8.pl"):
    #!/usr/bin/perl
    use encoding UTF8;
    while (<>){
      chomp;
      ~/^(\S+)\s+(\S{1})\S*\s+(\S{1}).*$/;
      $_ = $1.$2.$3;
      ~tr/абвгдезийклмнопрстуфхыэАБВГДЕЗИЙКЛМНОПРСТУФХЫЭ/abvgdeziiklmnoprstufhyeABVGDEZIIKLMNOPRSTUFHYE/;
      ~s/ё/yo/g; ~s/ж/zh/g; ~s/ч/ch/g; ~s/ш/sh/g; ~s/щ/sch/g; ~s/ю/yu/g; ~s/я/ya/g; ~s/ъ//g; ~s/ь//g; ~s/ц/ts/g;
      ~s/Ё/Yo/g; ~s/Ж/Zh/g; ~s/Ч/Ch/g; ~s/Ш/Sh/g; ~s/Щ/Sch/g; ~s/Ю/Yu/g; ~s/Я/Ya/g; ~s/Ъ//g; ~s/Ь//g; ~s/Ц/Ts/g;
      print "$_\n";
    }
    • Разбираем полученные данные (ФИО) на составляющие и формируем в виде "ФамилияИО";
    • Заменяем все русские символы на английские "аналоги" (tr///);
    • Заменяем русские буквы, не имеющие английских "аналогов", на комбинацию английских символов (s///g);
      Результат выглядит примерно так:
      $ cat ./users_utf8.txt | ./translit_utf8.pl
      PupkinID
      IvanovPV
      VasinaVV

      при том, что входной файл - так:

      Пупкин Иван Денисович
      Иванов Пётр Васильевич
      Васина Василина Васильевна


      Полученные данные добавляем в xls-файл.

  3. Нужное количество паролей, удовлетворяющих условию, нам "сгенерит" скрипт ("passgen.pl"):
    #!/usr/bin/perl -w
    use strict;
    my $passcount = shift || 1;
    my $passlen = shift || 5;
    my $pass = '';
    my @symbol=('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
    sub rnd{
      my $i = int(rand(3));
      my $return;
      if ( $i == 0 ){
        $return = lc(@symbol[int(rand(26))]);
      } elsif ( $i == 1 ){
        $return = uc(@symbol[int(rand(26))]);
      } else {
        $return = int(rand(10));
      }
      return $return;
    }
    
    sub is_valid{
      my $str = shift;
      my $return = 0;
      $return = 1 if $str =~ /[A-Z]+/g && $str =~ /[a-z]+/g && $str =~ /[0-9]+/g;
      return $return;
    }
    
    my $i=1;
    while ( $i i<= $passcount ){
      $pass = '';
      while  ( ! is_valid($pass) ){
        $pass = '';
        while ( length($pass) &lt; $passlen ){
          $pass .= rnd();
        }
      }
      $i+=1;
      print $pass,"\n";
    }

    Где:

    • $passcount - количество паролей (по-умолчанию - 1);
    • $passlen - длина пароля (по-умолчанию - 5 символов);
    • $pass - собственно, пароль (пустой);
    • @symbol - массив латинских символов;
    • rnd - функция, которая генерит псевдослучайное число от 0 до 2 и, в зависимости от значения, возвращает либо один символ в верхнем регистре, либо один символ в нижнем ругистре, либо цифру;
    • is_valid - функция, проверяющая наличие в пароле и символов, и цифр (хотя бы одно вхождение того и другого);
      Результат выглядит, примерно, так:
      $ ./passgen.pl 3 5
      u0T71
      3jlCu
      rB5qc

      В обновлённой версии файла проверяется обязательное наличие символов верхнего и нижнего регистра.
      Полученные пароли так же добавляем в xls-файл.
      Если кому-то надо, passgen.cgi тот же генератор, но "заточеный" под cgi-bin (скачайте и разожмите в passgen.cgi).

  4. В результате выполнения вышеописанных, действий получаем список пользователей, состоящий из полных ФИО, названия предприятия, e-mail, account'а и пароля, который выводим в csv-файл ("users.csv").
  5. А ldif-файл, который мы потом сможем использовать с "ldapadd" для добавления в LDAP-каталог, нам сформирует нижеприведённый скрипт ("create_ldif.pl"):
    #!/usr/bin/perl
    while (<>) {
      my ($fn,$ent,$mail,$uid,$pass) = /^([^\;]+)\;([^\;]+)\;([^\;]+)\;([^\;]+)\;(.+)$/;
      my ($last,$first,$middle) = $fn =~ /(\S+)\s+(\S+)\s+(\S+)/;
      print "dn: cn=$uid,cn=Users,dc=enterprise,dc=domain,dc=ru\n";
      print "cn: $uid\n";
      print "sn: $fn\n";
      print "objectclass: top\n";
      print "objectclass: person\n";
      print "objectclass: inetorgperson\n";
      print "objectclass: organizationalPerson\n";
      print "objectclass: orcluser\n";
      print "objectclass: orcluserv2\n";
      print "ou: $ent\n";
      print "givenname: $first\n";
      print "middlename: $middle\n";
      print "uid: $uid\n";
      print "userpassword: $pass\n";
      print "mail: $mail\n\n";
    }

    выполняем и смотрим результат:

    $ cat ./users.csv | ./create_ldif.pl > ./add.ldif
    $ cat ./add.ldif
    dn: cn=PupkinID,cn=Users,dc=enterprise,dc=domain,dc=ru
    cn: PupkinID
    sn: Пупкин Иван Денисович
    objectclass: top
    objectclass: person
    objectclass: inetorgperson
    objectclass: organizationalPerson
    objectclass: orcluser
    objectclass: orcluserv2
    ou: Контора
    givenname: Иван
    middlename: Денисович
    uid: PupkinID
    userpassword: u0T71
    mail: email@e-mail.ru
    dn: cn=IvanovPV,cn=Users,dc=enterprise,dc=domain,dc=ru
    cn: IvanovPV
    sn: Иванов Пётр Васильевич
    objectclass: top
    objectclass: person
    objectclass: inetorgperson
    objectclass: organizationalPerson
    objectclass: orcluser
    objectclass: orcluserv2
    ou: Контора
    givenname: Пётр
    middlename: Васильевич
    uid: IvanovPV
    userpassword: 3jlCu
    mail: email@e-mail.ru
    dn: cn=VasinaVV,cn=Users,dc=enterprise,dc=domain,dc=ru
    cn: VasinaVV
    sn: Васина Василина Васильевна
    objectclass: top
    objectclass: person
    objectclass: inetorgperson
    objectclass: organizationalPerson
    objectclass: orcluser
    objectclass: orcluserv2
    ou: Контора
    givenname: Василина
    middlename: Васильевна
    uid: VasinaVV
    userpassword: rb5qc
    mail: email@e-mail.ru

    вышеприведённый результат получен из файла вида:

    $ cat users.csv
    Пупкин Иван Денисович;Контора;email@e-mail.ru;PupkinID;u0T71
    Иванов Пётр Васильевич;Контора;email@e-mail.ru;IvanovPV;3jlCu
    Васина Василина Васильевна;Контора;email@e-mail.ru;VasinaVV;rb5qc
  6. Ну и в заключение выполняем, собственно, добавление пользователей в LDAP-каталог:
    $ ldapadd -h localhost -D "cn=admin" -w password -f add.ldif
    adding new entry cn=PupkinID,cn=Users,dc=enterprise,dc=domain,dc=ru
    adding new entry cn=IvanovPV,cn=Users,dc=enterprise,dc=domain,dc=ru
    adding new entry cn=VasinaVV,cn=Users,dc=enterprise,dc=domain,dc=ru

В заключение скажу, что добавление 380 пользователей в LDAP-каталог, включая все подготовительные работы (без написания скриптов), заняло у меня не более получаса.

 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate