mrPresedent

Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Столкнулся с той же задачей, что и Glaf. У нас Зимбра привязана к АД, и, ввиду наличия некоторых сервисов, берущих инфу о пользователе из АД, все нужные поля типа должности, телефона, отдела и т.д. прописаны в его свойствах. Гугл сразу открыл мне секреты zmprov csig, так что я решил отталкиваться от этого, генерируя конечный html-код bash-скриптом. Увы, ldapsearch вообще ни разу не дружит с кириллицей, т.к. она в АД кодирована кажется в base-64. Но в perl нашелся нужный модуль. Итак, воплотилось это в двух файлах: bash-скрипт и perl-скрипт. При запуске .sh, он запрашивает accountname, передает его perl. Perl ищет по пользователю необходимую инфу и пишет ее на экран в файл построчно (логин, имя, должность, мыло etc). Я не очень то дружу с глобальными переменными при программировании на почти незнакомых языках, так что пусть лучше будет файл. Sh читает этот файл, выдергивая нужную строку - значение конкретной переменной, которая уютно размещена в шаблоне html-кода будущей подписи. А затем просто делает zmprov для этого пользователя. Может кому понадобится: ldaparser.pl Код: #!/usr/bin/perl -w use strict; use warnings; use Net::LDAP; use Data::Dumper; my $arg = shift; my $ldapServer = 'pdc.mydomain.ru'; my $ldapUserToAuth = 'user@mydomain.ru'; # Любая активная учётка сойдет my $ldapUserPasswd = 'qwer1234'; # Пароль для учетки # Откуда начинать поиск (тут в подразделении users домена) my $ldapBase = 'cn=users, dc=mydomain, dc=ru'; # Фильтр поиска, задан ниже, т.к. косячит $arg изза кавычек #my $ldapFilter = '(&(objectclass=user)(sAMAccountName=$arg)(objectcategory=Person)(mail=*@mydomain.ru))'; # Возвращаемые поля, которые нас интересуют my $ldapAttrs = [ 'sAMAccountName','displayName','mail','title','telephoneNumber','mobile' ]; # Подключаемся к серверу LDAP my $ldap = Net::LDAP->new ($ldapServer) or die "Error: $@\n"; my $ldapMesg = $ldap->bind ( "$ldapUserToAuth", password => "$ldapUserPasswd", version => 3); # Забираем оттуда всех юзеров, подходящих по фильтру (здесь лишь один - $arg) my $ldapSearch = $ldap->search ( base => "$ldapBase", # filter => "$ldapFilter", filter => "(&(objectclass=user)(sAMAccountName=$arg)(objectcategory=Person)(mail=*mydomain.ru))", attrs => $ldapAttrs ); die $ldapSearch->error if $ldapSearch->code; # Отключаемся $ldap->unbind; #Выводим результат на экран foreach my $entry ($ldapSearch->entries) { print $entry->get_value('sAMAccountName'), "\n"; print $entry->get_value('displayName'), "\n"; print $entry->get_value('title'), "\n"; print $entry->get_value('mobile'), "\n"; print $entry->get_value('telephoneNumber'), "\n"; print $entry->get_value('mail'), "\n-------------------------------\n"; } | Запускается как /path/to/script/ldaparser.pl username ------------------------------------------------------------- sign.sh Код: #!/bin/bash #Просим учетку без @домен echo "Учетная запись AD: @mydomain.ru" read adacc #Папка со скриптами path="/opt" #Удаляем генерированные ранее файлы от прошлого юзера rm -rf $path/1sign.txt rm -rf $path/sign.txt rm -rf $path/test.text #Запускаем perl-скрипт $path/ldaparser.pl $adacc > $path/test.text #Растаскиваем результат по переменным M=$(head -n 6 $path/test.text | tail -n 1) N=$(head -n 2 $path/test.text | tail -n 1) D=$(head -n 3 $path/test.text | tail -n 1) T=$(head -n 4 $path/test.text | tail -n 1) n=$(head -n 5 $path/test.text | tail -n 1) #Генерим html-код echo "<html><div style=font-family: tahoma, new york, times, serif; color: #000066; font-size: 12pt;><div><br></div><div><span></span><div>" > $path/1sign.txt echo "<br><br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>С уважением, $N </span></em>" >>$path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>$D </span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>mail: $M </span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>моб.: +7-$T </span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>___________________________________________________</span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>ООО Комис, Россия, 420029, Казань, ул. Журналистов, 6 </span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>Komis LLC, Zhurnalistov st., 6, Kazan, 420029, Russia </span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>Тел. / Phone +7 (843) 277-94-94, 277-94-77 (вн. $n) </span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>Факс / Fax +7 (843) 277-94-94 </span></em>" >> $path/1sign.txt echo "<br><em><span style='font-family: tahoma, new york, times, serif; color: #000066; font-size: small;'>www.komisgroup.ru </span></em><br>" >> $path/1sign.txt echo "<img src=http://s7.hostingkartinok.com/uploads/images/2014/06/65f08b718296d1214109e03cd47c0796.png>" >> $path/1sign.txt echo "<span></span><br></div></div></html>" >> $path/1sign.txt #Избавляемся от переходов на новую строку cat $path/1sign.txt | tr -d '\r\n' > $path/sign.txt #И ставим подпись с названием komis-zimbra-sig (если дефолтная подпись, можно модифицировать через msig вместо csig) /opt/zimbra/bin/zmprov csig $M komis-zimbra-sig zimbraPrefMailSignatureHTML "$(cat $path/sign.txt)" | Просто делаем chmod +x /opt/sign.sh /opt/ldaparser.pl и запускаем /opt/sign.sh По идее, можно допилить, заставив .pl-скрипт выдавать список юзеров с мейлами, затем добавить в список EOF и в баше объявить цикл do while EOF, пусть по всем юзерам пройдется. Но я не стал этого делать ввиду того, что проще руками 200 человек забить, обходя "избранных" и прочих "не таких как все", а так же в будущем проще будет работать с новыми пользователями, не вызывая цикл каждый раз. | Всего записей: 28 | Зарегистр. 14-09-2011 | Отправлено: 15:16 16-06-2014 | Исправлено: mrPresedent, 15:23 16-06-2014 |
|