The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Телефонная книга Asterisk для eyeBe..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Телефонная книга Asterisk для eyeBe..."  +/
Сообщение от auto_tips on 23-Окт-11, 21:06 
Итак, есть 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: Желающие могут доработать скрипт, например создать отдельно группы конференций, служебную (голосовая почта и т.п.)

URL:
Обсуждается: https://www.opennet.ru/tips/info/2636.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Телефонная книга Asterisk для eyeBeam 1.x"  +/
Сообщение от dew on 23-Окт-11, 21:06 
через реврайты можно разграничить пользователей своими каталогами. тогда можно не переживать по поводу порчи телефоных книг разными пользователями
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Телефонная книга Asterisk для eyeBeam 1.x"  +/
Сообщение от desenix (ok) on 25-Окт-11, 14:31 
Можно, но мне так было проще писать скрипт, поэтому и предупредил.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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