The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Телефонная книга Asterisk для eyeBeam 1.x
Итак, есть 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 webmaster@example.local
       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: Желающие могут доработать скрипт, например создать отдельно группы
конференций, служебную (голосовая почта и т.п.)
 
22.10.2011 , Автор: desenix
Ключи: asterisk, addressbook, voip / Лицензия: CC-BY
Раздел:    Корень / Маршрутизаторы Cisco, VoIP / VoIP

Обсуждение [ RSS ]
  • 1, dew (?), 21:06, 23/10/2011 [ответить]  
  • +/
    через реврайты можно разграничить пользователей своими каталогами. тогда можно не переживать по поводу порчи телефоных книг разными пользователями
     
     
  • 2, desenix (ok), 14:31, 25/10/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Можно, но мне так было проще писать скрипт, поэтому и предупредил.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру