31.03.2009 г.
На днях встала задача залить 380 пользователей в LDAP-каталог, а точнее - Oracle Internet Directory (OID). По-моему, естественно, что я не стал это делать руками, а призвал на помощь perl. Итак, приступим.
В примерах я не буду использовать всех 380 пользователей, а возьму троих абсолютно абстрактных.
Исходные данные:
xls-файл в котором список пользователей, состоящий из полных ФИО, названия предприятия, и e-mail.
Задача:
Залить всех пользователей в LDAP-каталог, предварительно создав account и придумав пароль длиной не менее пяти символов с обязательным наличием в нём, как минимум, одной цифры и символов латиницы.
Действия:
#!/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"; }
/
/
/
);/
/
/
g);$ cat ./users_utf8.txt | ./translit_utf8.pl PupkinID IvanovPV VasinaVV
при том, что входной файл - так:
Пупкин Иван Денисович Иванов Пётр Васильевич Васина Василина Васильевна
Полученные данные добавляем в xls-файл.
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) < $passlen ){ $pass .= rnd(); } } $i+=1; print $pass,"\n"; }
Где:
$ ./passgen.pl 3 5 u0T71 3jlCu rB5qc
В обновлённой версии файла проверяется обязательное наличие символов верхнего и нижнего регистра.
Полученные пароли так же добавляем в xls-файл.
Если кому-то надо, passgen.cgi тот же генератор, но "заточеный" под cgi-bin (скачайте и разожмите в passgen.cgi).
#!/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
$ 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-каталог, включая все подготовительные работы (без написания скриптов), заняло у меня не более получаса.