Итак, есть Asterisk (использовался 1.10 beta) и программный VoIP-телефон
eyeBeam 1.x, связь с книгой соответственно осуществляется через WebDav. Для
eyeBeam 1.5.x не подходит, так как другой формат записей и сохранять через
WebDav он не умеет (видимо писала другая команда).
Настройки софтфона:
Server-side Storage:
Storage method: WebDAV
Use SIP credentials: +
Root URL: http://webdav.example.local/webdav/
WebDAV pool time: 600
Так как все пользователи будут в одном каталоге, их файлы имеют разные имена,
теоретически возможна порча одним пользователем, файла телефонной книги другого.
Ещё нам понадобиться Apache с модулем WebDAV, его конфигурация:
<VirtualHost *:80>
ServerName webdav.example.local
ServerAdmin [email protected]
DocumentRoot /server/www/WEBDAV
ErrorLog "/server/www/WEBDAV/error.log"
<Directory /server/www/WEBDAV/>
AllowOverride None
Order deny,allow
deny from all
</Directory >
<Directory /server/www/WEBDAV/webdav/>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
DavLockDB /server/www/WEBDAV/DavLock
<Location /webdav/>
DAV on
AuthType Basic
AuthName "WebDav"
AuthUserFile /server/www/WEBDAV/paswd
Require valid-user
</Location>
</VirtualHost>
Создаём директорию /server/www/WEBDAV/webdav/ или в другом месте по желанию,
назначаем владельцем пользователя из под которого работает Apache. Файл паролей
создавать не надо, его создаст скрипт, о котором далее.
Создаём там где удобно файл phonebook.pl, его необходимо запускать после
добавления/удаления пользователя из Asterisk, как это сделать автоматически не
нашёл, поэтому запускаю руками.
Скрипт написан немного коряво, так как пишу на Perl время от времени и по справочникам.
#!/usr/bin/perl
use POSIX;
# путь к файлу пользователей Asterisk (должен существовать)
$srccfg="/etc/asterisk/users.conf";
# путь к файлу паролей webdav (создаётся автоматически, перезаписывается)
$paswdfile="/server/www/WEBDAV/paswd";
# путь к файлам профилей с телефонными книгами пользователей (создаётся автоматически, перезаписывается)
$phbookfiles="/server/www/WEBDAV/webdav";
# домен SIP, используется при генерации телефонных книг
$sipdomain="example.local";
# суффикс телефонной книги eyeBeam в формате XML, для webdav (константа, не менять!)
$phbooksuf="resource-list.xml";
# суффикс для файла с правилами (константа, не менять!)
$phrulesuf="presence-rules.xml";
# путь для временных файлов
$tmpath="/var/tmp";
# владелец файлов, от которого выполняется Apache ( автоматически
# назначается создаваемым файлам телефонной книги и файлу паролей )
$apacheuser="apache.apache";
# приложение для генерации файла паролей.
$htpasswd="htpasswd";
open(SF, "$srccfg") || die;
$flag=0;
@number=();
@name=();
@pasw=();
$cnt=0;
$phonetext="";
while ($line = <SF>)
{
$st = $line=~s/^\[(.*)\].*[\n\r]*/\1/g;
if($st) {
$flag=1;
$number[$cnt]=$line;
}
$st = $line=~s/^fullname\s*=\s*([^\n\r]*)\s.*/\1/g;
if($st && $flag) {
$name[$cnt]=$line;
$flag=$flag+1;
$st = $number[$cnt]=~m/general/g;
if($st) { $flag=0; }
}
$st = $line=~s/^secret\s*=\s*([^\n\r]*)\s.*/\1/g;
if($st && $flag) {
$pasw[$cnt]=$line;
$flag=$flag+1;
}
if($flag>=3){
$flag=0;
$phonetext = $phonetext." \\r\n\ ".$name[$cnt]."\\r \n\ \r\n";
#print("\\ n\r\".$name[$cnt]."\\n\r\\n\r");
#print "pasword=$pasw[$cnt]\r\n";
if($cnt==0){ system $htpasswd, "-bc", $paswdfile, $number[$cnt], $pasw[$cnt]; }
else{ system $htpasswd, "-b", $paswdfile, $number[$cnt], $pasw[$cnt]; }
$cnt=$cnt+1;
}
}
close(SF);
# chown
system "chown", $apacheuser, $paswdfile;
$phonemask1="\<display\-name\>PhoneBook\<\/display\-name\>\r\n";
$phonemask2="\<\/list\>";
$phonemask = '\<display\-name\>PhoneBook\<\/display\-name\>.*?\<\/list\>';
$cntt=0;
while($cntt<$cnt){
$fphbook=$phbookfiles."/".$number[$cntt].".". $sipdomain.".".$phbooksuf;
$fphrule=$phbookfiles."/".$number[$cntt].".". $sipdomain.".".$phrulesuf;
$cntt=$cntt+1;
if( -e $fphbook){ print "Update: $fphbook\r\n";
open(SF, "$fphbook") || die "Can't open file read $fphbook";
@var = <SF>;
close(SF);
$var = join('',@var);
$st = $var =~ s/\<display\-name\>PhoneBook\<\/display\-name\>.+?<\/list>/$phonemask1$phonetext$phonemask2/si;
print "RES:$st\r\n";
if($st) {
system "chmod", "666",$fphbook;
open(SF, ">$fphbook") || die "Can't open file write $fphbook";
print SF $var;
close(SF);
system "chmod", "644",$fphbook;
}#if
}else{ # файл не существует, создадим его
print "Create: $fphbook\r\n";
open(SF, ">$fphbook") || die;
print SF "\\r\n";
print SF "\\r\n";
print SF " \\r\n";
print SF " \PhoneBook\\r\n";
print SF "$phonetext";
print SF " \\r\n";
print SF " \\r\n";
print SF " \Private\\r\n";
print SF " \\r\n";
print SF " \\r\n";
print SF " \Choose\\r\n";
print SF " \\r\n";
print SF "\\r\n";
close(SF);
# chown
system "chown", $apacheuser, $fphbook;
}
if( ! -e $fphrule){
print "Create: $fphrule\r\n";
open(SF, ">$fphrule") || die;
print SF "\\r\n";
print SF "\\r\n";
print SF "\\r\n";
close(SF);
# chown
system "chown", $apacheuser, $fphrule;
}
#print "$fphbook\r\n";
}#while
Нюансы:
1. Для данного софтфона, книга подгружается и сохраняется сама, по указанному таймауту.
2. В справочнике появляется группа PhoneBook, в ней контакты Asterisk, если
туда добавить что-то из софтфона, при следующем обновлении будет затёрто.
Поэтому для иных контактов можно создавать другие группы (прямо в софтфоне) и в
них добавлять свои контакты. Так для этого специально скриптом создаётся пустая
группа Personal.
PS: Желающие могут доработать скрипт, например создать отдельно группы
конференций, служебную (голосовая почта и т.п.)
|