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 =~ /\d+/g && $str =~ /\w+/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-каталог, включая все подготовительные работы (без написания скриптов), заняло у меня не более получаса.