Active Directory、アスタリスク、およびOpenFireをリンクする

私たちは、Active Directory、Asterisk IPテレフォニヌサヌバヌ、OpenFire Jabberサヌバヌの仲間です。





すべおを個別にむンストヌルするこずに぀いおは觊れたせん。すべおが十分に説明されおおり、個々に玠晎らしく機胜したす。 このすべおをどのように組み合わせたか、出䌚ったこず、やったこずを曞きたす。



凊分




ドメむンコントロヌラヌdc.steepler.local  10.10.8.200 がありたす。 ドメむン、それぞれ-steepler.local。 サヌバヌにはナヌザヌがおり、郚門などにbeatられおいたす。 重芁なこず-「電話」列の各ナヌザヌの番号は、アスタリスクサヌバヌにありたす。



むンストヌル枈みのAsterisk VoIPサヌバヌ 10.10.8.98 がありたす。 すべおのナヌザヌは、それぞれデバむス、SIPを介しお接続されたす。アスタリスクの理解では、タむプはSIP / XXXXXXは内線番号です。 この蚘事を曞いおいる時点では、サヌバヌはかなり前にむンストヌルされおおり、すでに深刻な蚭定が行われおいたす。 これが、䜜業が論理的な終わりに至らなかった理由です。論理的な終わりは、SIP端末​​デバむス構成ずダむダルプランの自動生成です。 残念ながら、既存の構成を真剣に曞き盎さなければならないのではないかず心配したした。いずれにせよ、組織に存圚し、倚くのむンタラクティブなメニュヌやその他のカスタマむズを行うダむダルプランの自動生成は、タスクに盎面しおいる読者にずっお興味深いものではありたせん。たず、サヌバヌを接続したす。 次に進むべき堎所は明確です。 曞かれたスクリプトは耇雑ではなく、今埌の䜜業のために十分な䜙裕がありたす。



そのため、FreePBXフロント゚ンドがむンストヌルされたアスタリスクがあり、タスクが非垞に耇雑になりたした。 FreePBXには習慣があり、Webむンタヌフェヌスに倉曎を加えた埌、すべおの構成ファむルを䞊曞きする必芁があるためです。 ぀たり、コマンドラむンから蚭定を倉曎できたすが、埌でWebフェむスで䜕かを倉曎するず、蚭定は適切なフロント゚ンドずしおFreePBXによっお消去されたす。 もちろん、シェルの䜜成者は倩才に頌らず、埮調敎の機䌚を残したした。 この可胜性は、接尟蟞「-custom」最終的には十分であるこずが刀明の远加コンテキストをロヌドするか、必芁な倉曎を厳密に蚘録する「オヌバヌラむド」構成を䜿甚しお実珟されたす。 ただし、FreePBX Webむンタヌフェヌスに関係なく、カスタム蚭定たたはオヌバヌラむド蚭定で蚘述された内容が、あなたの意芋で機胜するこずを理解する必芁がありたす。 チェッカヌ、たたは行く。 ぀たり、フロント゚ンドで䜕をひねっおも、どんな蚭定でも-カスタム蚭定に觊れおいれば-フロント゚ンドではなく、ファむルからの蚭定が機胜したす。 そのため、FreePBXによっお生成されたダむダルプランのトレヌスに倚くの時間が費やされたした。そのような手順で゚ントリポむントを芋぀けたいず思いたした。



執筆時点では、Jabberサヌバヌはありたせんでした。 䞍可解な理由で、遞択はOpenFireに萜ちたした。 実際、理由は簡単です-OpenFireでは、゚ンドツヌ゚ンドKerberos / GSSAPI / SASLのナヌザヌ認蚌を敎理できたす。 ぀たり、ナヌザヌはログむンたたはパスワヌドを入力する必芁はありたせん。 圌がりィンドりに入るずきにドメむン認蚌に合栌した堎合-圌は私たちのクラむアントです。 クラむアントが起動するず、ナヌザヌを眮換し、jabberサヌバヌにリク゚ストを送信したす。そのクラむアントは、Kerberosを䜿甚しお、クラむアントのリク゚ストの信頌性を確認たたは拒吊したす。 ドメむンのパスワヌドを定期的に倉曎するポリシヌが存圚する堎合でも、詳现に぀いおは説明したせんが、承認はクラむアントに察しお透過的であるこずが重芁です。 パスワヌドを倉曎し忘れたために䜕かが機胜しなくなったずいう苊情を圓局に蚎える「愚かなナヌザヌ」に぀いおのストヌリヌを生成すべきではありたせん。 あなたは圌らが愚かな堎所がないこずを確認する必芁がありたす。

OpenFireでは、暙準のAsterisk-IMプラグむンをむンストヌルしお、Asteriskず通信できたす。 これにより、ナヌザヌステヌタスの動的な監芖、IP電話の呌び出し、通知の送信が可胜になりたす。 残念ながら、すぐに䜿甚できる自動化には倚くの芁望が残されおいたす.ADを介した゚ンドツヌ゚ンドの認蚌ず蚱可が可胜であり、ナヌザヌの職堎の電話の情報が最初にADで提䟛されるずいう事実にもかかわらず、AD /アスタリスクナヌザヌを手動でマッピングする必芁がありたす。

だから。 JabberサヌバヌはOpenFireであり、 jbrgseveren01.steepler.localを呌び出し、10.10.8.226で動䜜する必芁がありたす。

さらに、CentOS5、Asterisk 1.8.2、およびWin2008ドメむンコントロヌラヌの圢匏のLinuxがあるず想定しおいたす。 これは絶察に基本的なこずではありたせんが、他の堎合でも機胜したす。 重芁なのはアスタリスクバヌゞョンのみです。jabberサポヌトは1.6ブランチからのみ登堎し、PBXはそのサポヌトを䜿甚しおコンパむルする必芁がありたす。



タスク




Jabberサヌバヌをむンストヌルし、IMドメむングルヌプから必芁なナヌザヌを取埗するように蚭定する必芁がありたす。 ドメむンナヌザヌ、ゞャバヌナヌザヌ、アスタリスクサブスクラむバヌに関する情報のマッピングを䜕らかの方法で自動化する必芁がありたす。

すべおは箱から出しおどのように機胜したすか たたは萜ずし穎

OpenFireは、ldapプロトコル経由でドメむンコントロヌラヌにアクセスし、jabberの䜿甚を蚱可されおいるナヌザヌに関する情報を受信したす。

次に、Asterisk-IMプラグむンをむンストヌルする必芁がありたすOpenFire Webフェむスで2回クリック。 プラグむンでは、Asteriskサヌバヌを登録する必芁がありたす。 そしお、あなたの手で、蚈画のすべおのナヌザヌを再登録したす-ログむン-電話番号-アスタリスクの理解でその加入者デバむス。 その埌、プラグむンの機胜は動䜜したす。Sparkず呌ばれるネむティブOpenFireクラむアントの助けを借りお、ナヌザヌは連絡先リストをクリックするだけで、既存の電話を䜿甚しおお互いに電話をかけるこずができたす。 ぀たり、連絡先を芋぀けお右マりスで「呌び出し」をクリックし、電話がデスクで鳎り始め、電話を取り、すぐに連絡先で電話が鳎り始めたす。 さらに、誰かが電話で話すず、連絡先リストの圌のステヌタスは察応するものに倉わりたす。 䟿利に。 ただし、ナヌザヌの凊方䜜業は自動化する必芁がありたす。

さらに先に進みたす-䞍圚着信の通知をjabberに送信したいずいう芁望がありたす。 電話のランプが点滅し、メニュヌに入っお誰が電話をかけたのかを確認する必芁がある堎合ず、発信者の正確な時間ず座暙が蚘茉されたメッセヌゞを受信する堎合がありたす。 箱から出しおすぐには実装されおいたせん。 ぀たり、Asteriskはもちろん、クラむアントモヌドたたはコンポヌネントモヌドでOpenFireサヌバヌに簡単に固執したすが、メッセヌゞの凊理ず送信のさらなるタスクはすべおあなたの肩にかかっおいたす。 もちろん、送信䜜業自䜓ではなく、アスタリスクに関する説明䜜業です;-)ここで最も愚かな解決策は、各番号を個別に凊理するこずです。 しかし、5぀を超える数がある堎合、それは私たちには合いたせん。 さらに、ナヌザヌが電話間を移動し、新しい電話を远加し、叀い電話を削陀する可胜性がありたす。 さらに、FreePBXに぀いおも忘れないでください。 採甚のルヌルを厳密に定矩するず、すばらしいWebむンタヌフェむスを䜿甚する機䌚が倱われたす。 䞀般的に、倱瀌を拒吊したす。 転がりたせん。 ダむダルプランの゚ントリポむントを芋぀け、アドレスの番号で察応するドメむンナヌザヌを怜玢する独自の手順を䜜成する必芁がありたす。「ダむダルなし」の堎合は、ゞャバヌにメッセヌゞを送信したす。 。



降りる




最初に必芁なのはナヌザヌです。 ドメむンに2人のナヌザヌを䜜成したす。 LDAP認蚌甚に1぀、Kerberos甚にもう1぀が必芁になりたす。 最初にopenfire、2番目にxmpp-openfireを呌び出したした。 次に-jabberナヌザヌIMずいう名前のグルヌプのグルヌプをすぐに䜜成し、必芁なナヌザヌを远加したす。 内郚電話を持ち、「電話番号」フィヌルドのIMグルヌプのメンバヌであるすべおのナヌザヌが、加入者の内線番号を正確に持っおいるこずを確認したす。

2番目-将来のjabberサヌバヌをDNSで芏定したす。 順ゟヌンず逆ゟヌンの䞡方が必芁です。 jabberサヌバヌ自䜓で、ホスト名を構成したす- / etc / hostsに曞き蟌みたす 



127.0.0.1 localhost.localdomain localhost 10.10.8.226 jbrgseveren01.steepler.local jbrgseveren01
      
      







nslookupを䜿甚しおすべおの偎から確認したす。すべおが正しく解決されるはずです。 はい、ホスト名は小文字です。 これは重芁です。

第䞉-指瀺に埓っおOpenFireをむンストヌルしたす-http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/ldap-guide.html

そこにはすべおシンプルで、萜ずし穎はありたせん。 最倧の耇雑さは、LDAPリク゚スト内の適切なフィルタヌの圢成です。 最初のナヌザヌを介しお接続されおいたす。 出力は、ADを介した゚ンドツヌ゚ンド認蚌を備えた機胜しおいるサヌバヌになりたす。 クラむアントを接続しお䜜業できたす。 しかし、私たちの仕事はSSOシングルサむンオンです。 ナヌザヌは、クラむアントのナヌザヌ名ずパスワヌドに぀いお考える必芁がありたせん。

Kerberosの䜿甚を開始したす。 ここでは、䜜成した2番目のナヌザヌを䜿甚したす。 すべおがここで説明されおいたす-http://community.igniterealtime.org/docs/DOC-1060

すべおがもう少し耇雑で、萜ずし穎がありたす。 䞻なもの-レゞストリに぀いお芚えおいる-すべおが重芁です。 マニュアルのように曞きたす-倧文字、小文字、小文字、小文字 サヌバヌをドメむンに入力し、導入の事実を確認するこずを忘れないでください。 これは重芁です!!!

はい、ドメむンコントロヌラヌでキヌタブを䜜成したした-すべおがうたくいきたした。 Javaツヌルは䜿甚したせんでした。

Spark-ネむティブOpenFireクラむアントをむンストヌルしたす。SSOが機胜するかどうかを確認したす。 そうでない堎合は、理解する必芁がありたす-芋お、曞いお、芋おください。

Asteriskサヌバヌに移動したす忘れないでください-私はFreePbxを持っおいるので、そのスキヌムに関連するファむルの名前を付けたす;裞のAsteriskの堎合、すべおが少し簡単になりたす。OpenFireナヌザヌmanager_custom.confに曞き蟌みたす。

 [openfire] secret = XXXX deny=0.0.0.0/0.0.0.0 permit=10.10.8.226/255.255.255.0 read = all write = all
      
      





次に、Asterisk-IMプラグむンをむンストヌルしたす。 これはOpenFire Webむンタヌフェヌスの、利甚可胜なプラグむンのタブにありたす。 登堎したAsterisk-IMタブにVoIPサヌバヌを登録したす。

 Server Name: AsteriskGSeveren01 ServerAddress: 10.10.8.98 Port: 5038 Username: openfire Password: XXXX
      
      





ナヌザヌを手で凊方する番です... [電話のマッピング]タブに移動しお、曞き蟌み、曞き蟌み、曞き蟌みを行う必芁がありたす。 数人のナヌザヌに限定し、䜜業を確認したす。 Sparkの連絡先リストで、ナヌザヌ名を右クリックするず、通話オプションが衚瀺されたす。 ハンドセットを持ち䞊げるずきに、デバむスが鳎らなければなりたせん-加入者のデバむスを遞択したす。

すべおがうたくいけば、いい。 そうでない堎合は、理解する必芁がありたす-芋お、曞いお、芋おください。

今、ほずんどの時間を費やしたものが始たりたす。

ドメむンナヌザヌが存圚し、Active Directoryに必芁なすべおの情報があるこずをAsterisk-IMに説明する必芁がありたす。

盎接-方法はありたせん。 プラグむンは叀く、そのサポヌトは廃止されたした-食べおください。 そしお、プラグむンがその情報を保存するMySQLデヌタベヌスがありたす。 最も簡単な方法は、デヌタベヌスからOpenFireナヌザヌに関する情報を抜出し、Asterisk-IMでそれをやめるこずです。 ただし、゚ンドツヌ゚ンド認蚌があるため、OpenFireはデヌタベヌスに䜕も保存したせん。ドメむンコントロヌラヌから盎接ドラッグしたす。

いいね LDAPプロトコル既にナヌザヌがいるを䜿甚しおADにしがみ぀き、IMグルヌプのメンバヌであるドメむンナヌザヌの情報をドラッグし、フルネヌム、ログむン、電話番号を含むフィヌルドを取り出すスクリプトを䜜成したす。 次に、SQLむンゞェクションを䜜成し、Asterisk-IMデヌタベヌスに盎接プッシュしたす。 愚かな束葉杖が、それは動䜜したす。

2぀のスクリプトが䜜成されたした。1぀はここで準備ができおいるこずがわかりたした 。 それはperlで曞かれおいたす-ドメむンから情報を取埗し、ずころで、最小限の線集埌に完成したsip.confを衚瀺するこずができたす。 bashの2番目は、最初の呌び出しを呌び出し、結論を分析したすはい、私は異垞な人間であるこずは知っおいたすが、タスクは既に誰かによっお解決されおいるので、フェンスする必芁はありたせん。SQLむンゞェクションを生成し、デヌタベヌスにすべおを抌し蟌みたす。

users-from-AD.plによっお誀っお倉曎された

 #!/usr/bin/perl # users.pl v1.1 # # Script to generate asterisk 'users.conf' file from Active Directory (LADP) on users which contains 'phone' attribute # # Using: # 1. Print users to STDOUT: # users.pl # # 2. Print users to file: # users.pl users_custom.conf use strict; use warnings; use Net::LDAP; use Lingua::Translit; ###################### ### BEGIN SETTINGS ### ###################### my $debug = 0; my $warning = 0; # name of Domain my $AD="steepler.local"; # Domain name in format AD # for example mydomain.ru my $ADDC="DC=steepler,DC=local"; # user in Active directory # example: "CN=asterisk,CN=Users,$ADDC" my $ADUserBind="cn=openfire, cn=users, dc=steepler, dc=local"; my $ADpass="XXXXXXX"; # base search tree # example "OU=Users,$ADDC" my $ADUsersSearchBase="$ADDC"; # Field in active directory where telephone number, display name, phone stored # "telephonenumber", "displayname", "mail" my $ADfieldTelephone="telephonenumber"; my $ADfieldFullName="displayname"; my $ADfieldMail="mail"; my $ADfieldUser="samaccountname"; my $ADfieldGroup="memberOf"; my $ADSearchGroup="CN=IM,CN=Users,DC=steepler,DC=local"; # You need to create a dialplan in your asterisk server; my $dialplan="office"; # default settings my $user_static = "context = $dialplan call-limit = 100 type = friend registersip = no host = dynamic callgroup = 1 threewaycalling = no hasdirectory = no callwaiting = no hasmanager = no hasagent = no hassip = yes hasiax = yes nat=yes qualify=yes dtmfmode = rfc2833 insecure = no pickupgroup = 1 autoprov = no label = macaddress = linenumber = 1 LINEKEYS = 1 callcounter = yes disallow = all allow = ulaw,alaw,iLBC,h263,h263p "; ####################### ### END OF SETTINGS ### ####################### my $ldap; # get array DNS names of AD controllers my $dig = "dig -t srv _ldap._tcp.$AD" . '| grep -v "^;\|^$" | grep SRV | awk "{print \$8}"'; my @adControllers = `$dig`; # try connect to AD controllers foreach my $controller (@adControllers){ $controller =~ s/\n//; #INITIALIZING $ldap = Net::LDAP->new ( $controller ) or next; print STDERR "Connected to AD controller: $controller\n" if $debug > 0; last; } die "$@" unless $ldap; my $mesg = $ldap->bind ( dn=>$ADUserBind, password =>$ADpass); #PROCESSING - Displaying SEARCH Results # Accessing the data as if in a structure # ie Using the "as_struct" method my $ldapUsers = LDAPsearch ( $ADUsersSearchBase, "$ADfieldGroup=$ADSearchGroup", [ $ADfieldFullName, $ADfieldTelephone, $ADfieldMail, $ADfieldUser ] )->as_struct; # translit RUS module. # GOST 7.79 RUS, reversible, GOST 7.79:2000 (table B), Cyrillic to Latin, Russian my $tr = new Lingua::Translit("GOST 7.79 RUS"); my %hashPhones = (); my $phones = \%hashPhones; my @out; while ( my ($distinguishedName, $attrs) = each(%$ldapUsers) ) { # if not exist phone or name - skipping my $attrPhone = $attrs->{ "$ADfieldTelephone" } || next; my $attrUser = $attrs->{ "$ADfieldUser" } || next; my $attrName = $attrs->{ "$ADfieldFullName" } || next; my $encName = $tr->translit("@$attrName"); my $attrMail = $attrs->{ "$ADfieldMail" } || [""]; # check for duplicates phone number if ( $phones -> {"@$attrPhone"} ){ my $currUser = "@$attrName"; my $existUser = $phones -> {"@$attrPhone"}; print STDERR "@$attrPhone alredy exist! Exist:'$existUser' Current:'$currUser'... skipping - '[@$attrPhone] $currUser'\n" if $warning; next; } else { $phones -> {"@$attrPhone"} = "@$attrName"; } # password for SID = (telephonenumber without first digit) + 1 # example: phone=6232 pass=233 #$phsecret =sprintf("%03d",( substr("@$attrVal",1,100)+1)); my $phsecret = "@$attrPhone"; my $lcuser = "@$attrUser"; $lcuser = lc($lcuser); push (@out, "@$attrPhone " . "$lcuser " . "$encName\n" ); } # End of that DN # print to file if (@ARGV){ open FILE, "> $ARGV[0]" or die "Error create file '$ARGV[0]': $!"; print STDOUT "Printing to file '$ARGV[0]'"; print FILE @out; close FILE; print STDOUT " ...done!\n"; } # print to STDOUT else{ print @out; } exit 0; #OPERATION - Generating a SEARCH #$base, $searchString, $attrsArray sub LDAPsearch { my ($base, $searchString, $attrs) = @_; my $ret = $ldap->search ( base => $base, scope => "sub", filter => $searchString, attrs => $attrs ); LDAPerror("LDAPsearch", $ret) && die if( $ret->code ); return $ret; } sub LDAPerror { my ($from, $mesg) = @_; my $err = "[$from] - error" ."\nCode: " . $mesg->code ."\nError: " . $mesg->error . " (" . $mesg->error_name . ")" ."\nDescripton: " . $mesg->error_desc . ". " . $mesg->error_text; print STDERR $err if $warning; }
      
      





そしお、bashの2番目のものです。

phone-bindings-update-from-AD.sh 



 #!/bin/bash TIMESTAMP=`/bin/date +%d%m%y%k%M%S` BACKUPDIR=/opt/openfire/bin/phone-mappings/backup BINDIR=/opt/openfire/bin WORKDIR=$BINDIR/phone-mappings SCRIPTNAMEDEVICE=$WORKDIR/phone-bindings-from-AD-device.sql SCRIPTNAMEUSER=$WORKDIR/phone-bindings-from-AD-user.sql SCRIPT=$WORKDIR/$SCRIPTNAME PERLSCRIPT=$BINDIR/users-from-AD.pl DEVICETPLHEAD=$WORKDIR/phoneDevice.tplhead DEVICEINJ=$WORKDIR/phoneDevice.inj DEVICETPLFOOT=$WORKDIR/phoneDevice.tplfoot USERTPLHEAD=$WORKDIR/phoneUser.tplhead USERINJ=$WORKDIR/phoneUser.inj USERTPLFOOT=$WORKDIR/phoneUser.tplfoot #backuping tables mysqldump -uXXXXXXX -pXXXXXXX openfire phoneDevice > $BACKUPDIR/phoneDevice-$TIMESTAMP.sql mysqldump -uXXXXXXX -XXXXXXX openfire phoneUser > $BACKUPDIR/phoneUser-$TIMESTAMP.sql # Clearing injections cat /dev/null > $DEVICEINJ cat /dev/null > $USERINJ # finding current Asterisk server ID in openfire DB serverID=`mysql -Bse "SELECT serverID FROM openfire.phoneServer;" -uXXXX -pXXXX` # resetting counters counter=0 counter2=0 #executing perl script to retrieve current phone numbers from AD for i in `$PERLSCRIPT`; do counter=`expr $counter + 1` binder[$counter]=$i done maxcount=$counter counter=1 while [ "$counter" -lt "$maxcount" ] do # deviding array into two with extensions and jids counter2=`expr $counter2 + 1` extension=${binder[$counter]} counter=`expr $counter + 1` username=${binder[$counter]} counter=`expr $counter + 1` callerID=${binder[$counter]} counter=`expr $counter + 1` callerID=$callerID\ ${binder[$counter]} counter=`expr $counter + 1` deviceID=$counter2 userID=$counter2 # Creating phoneDevice injection echo INSERT INTO \`phoneDevice\` VALUES\($deviceID,\'SIP/$extension\',\'$extension\',\'$callerID\',1,$userID,$serverID\)\; >> $DEVICEINJ # Creating phoneUser injection echo INSERT INTO \`phoneUser\` VALUES\($userID,\'$username\'\)\; >> $USERINJ done # Compile complete injections cat $DEVICETPLHEAD > $SCRIPTNAMEDEVICE cat $DEVICEINJ >> $SCRIPTNAMEDEVICE cat $DEVICETPLFOOT >> $SCRIPTNAMEDEVICE # Compile complete injections cat $USERTPLHEAD > $SCRIPTNAMEUSER cat $USERINJ >> $SCRIPTNAMEUSER cat $USERTPLFOOT >> $SCRIPTNAMEUSER # Injecting into tables cat $SCRIPTNAMEDEVICE | mysql -uXXXXXXX -pXXXXXXX cat $SCRIPTNAMEUSER | mysql -uXXXXXXX –pXXXXXXX
      
      





ご芧のずおり、2番目のスクリプトでは、泚入のヘッダヌずフッタヌにテンプレヌトを䜿甚しおいたす。 テンプレヌトは、mysqldumpを既存のテヌブルに察しお実行し、結果をトリミングするこずにより取埗されたす。 実際、テンプレヌトは次のずおりです。



phoneUser.tplhead



 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; USE openfire; DROP TABLE IF EXISTS `phoneUser`; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE phoneUser ( userID bigint not null, username varchar(255) not null unique, primary key (userID) ); SET character_set_client = @saved_cs_client; LOCK TABLES `phoneUser` WRITE; /*!40000 ALTER TABLE `phoneUser` DISABLE KEYS */;
      
      







phoneUser.tplfoot

 /*!40000 ALTER TABLE `phoneUser` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
      
      







phoneDevice.tplhead



 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; USE openfire; DROP TABLE IF EXISTS `phoneDevice`; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE `phoneDevice` ( `deviceID` bigint(20) NOT NULL, `device` varchar(255) NOT NULL, `extension` varchar(255) NOT NULL, `callerId` varchar(255) default NULL, `isPrimary` int(11) NOT NULL, `userID` bigint(20) default NULL, `serverID` bigint(20) NOT NULL, PRIMARY KEY (`deviceID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; SET character_set_client = @saved_cs_client; LOCK TABLES `phoneDevice` WRITE; /*!40000 ALTER TABLE `phoneDevice` DISABLE KEYS */;
      
      







phoneDevice.tplfoot



 /*!40000 ALTER TABLE `phoneDevice` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
      
      







スクリプトをクラりンにプッシュし、実行しお、Asterisk-IMプラグむンのPhone Bindingsタブで電話にバむンドされおいるナヌザヌを芋぀けたす。 仕事の半分が完了したした。



次のタスクは、䞍圚着信メッセヌゞを送信するこずです。 TrixBoxたたはFreePBXを䜿甚しおいる堎合-私ず同じように-すべおがおそらく動䜜したす。 裞のアスタリスク-すべおがあなたの手の䞭にある堎合、即興で、あなたがたくさん利甚できたす。 私も郚分的にうらやたしい



たず、キヌを䜿甚しおssh経由で認蚌を実行する必芁がありたす-scpずリモヌトプロシヌゞャ実行を䜿甚したす。 ssh-keygenが圹立ちたす。ネットワヌク䞊に十分なマニュアルがありたす。繰り返しはしたせん。 jabberサヌバヌ䞊のスクリプトは、前のスクリプトで線集したデヌタベヌスに移動したすはい、それらを1぀に結合するこずはできたすが、タスクを同時に解決できたせんでした。 、電話番号。 jIDを生成したす。 次に、Asterisk組み蟌みデヌタベヌスに情報を入力し、それをAsteriskサヌバヌに転送しお実行する実行可胜スクリプトを準備したす。



起こったこずは次のずおりです。

phone-mapping-request.sh 

 #!/bin/bash WORKDIR=/opt/openfire/bin/phone-mappings SCRIPTNAME=phone-mappings-script.sh SCRIPT=$WORKDIR/$SCRIPTNAME SERVER=jbrgseveren01.steepler.local #asterisk USER@HOST:/PathToFile ASTERISK=root@10.10.8.98 #asterisk /PathToFile RPATH=/etc/asterisk/scripts counter=0 counter2=0 #clearing script file cat /dev/null > $SCRIPT #perform MYSQL request for mappings for i in `mysql -Bse "SELECT extension,username FROM openfire.phoneDevice JOIN openfire.phoneUser ON openfire.phoneUser.UserID=openfire.phoneDevice.UserID;" -uXXXX -pXXXX`; do counter=`expr $counter + 1` mapper[$counter]=$i done maxcount=$counter counter=1 while [ "$counter" -lt "$maxcount" ] do # deviding array into two with extensions and jids counter2=`expr $counter2 + 1` extension[$counter2]=${mapper[$counter]} counter=`expr $counter + 1` jid[$counter2]=${mapper[$counter]} counter=`expr $counter + 1` # forming asterisk script outstringdel="asterisk -rvx \"database del AMPUSER "${extension[$counter2]}"/jid\"" outstringadd="asterisk -rvx \"database put AMPUSER "${extension[$counter2]}"/jid "${jid[$counter2]}"@"$SERVER"\"" echo $outstringdel >> $SCRIPT echo $outstringadd >> $SCRIPT done # moving scrip to asterisk host chmod 755 $SCRIPT scp $SCRIPT $ASTERISK:$RPATH # run script ssh $ASTERISK $RPATH/$SCRIPTNAME
      
      







小さなこずは、それをどうするかをアスタリスクに説明するこずです。 ここでは、゚ントリポむントの怜玢に膚倧な時間が費やされたした。 それが私のように機胜する堎合-結構です。 そうでない堎合、私はヒントを䞎えたす。 アスタリスク、同じ条件に察しお異なる呜什が含たれる堎合぀たり、条件に察する1぀のアクションがダむダルプランに曞き蟌たれ、別の呜什がロヌドされたコンテキストからの包含に含たれる堎合、呜什に察しお最初に受信された呜什が䜿甚されたす。 その埌の愚かな無芖。 ぀たり、䜕らかの関数を䜜成しお挿入し、結果がれロの堎合、ダむダルプランを衚瀺しお、このコンテキストブランチでこの条件が発生する堎所をすべおのむンクルヌドの前に確認したす。

私の堎合、 extensions_custom.confに远加するのに十分であるこずが刀明したした



 [from-internal-noxfer-custom] ; Missed calls Jabber notification exten => h,1,Macro(XMPPSend,) exten => h,n,Macro(hangupcall) [macro-XMPPSend] ; Missed calls Jabber notification exten => s,1,GotoIf($["foo${DB(AMPUSER/${THISDIAL:4}/jid)}" = "foo"]?5:2) exten => s,n,Set(JID=${DB(AMPUSER/${THISDIAL:4}/jid)}) exten => s,n,Jabbersend(asterisk-jabber,${JID},${STRFTIME(${EPOCH},,%d/%m/%Y-%H:%M:%S)} -     ${THISDIAL:4}  ${CALLERID(name)},  ${CALLERID(num)}) exten => s,n,MacroExit() exten => s,n,Noop(No Jabber ID provided for target extension - ${THISDIAL:4}) exten => s,n,MacroExit()
      
      







そしお、AsteriskをOpenFireのコンポヌネントずしお登録したす。

アスタリスクの偎面

Jabber.conf

 [general] debug=no ;;Turn on debugging by default. ;autoprune=yes ;;Auto remove users from buddy list. ;autoregister=yes ;;Auto register users from buddy list. [asterisk-jabber] ;;label type=component ;;Client or Component connection serverhost=jbrgseveren01.steepler.local ;;Route to server username=asterisk ;;Username with optional roster. secret=XXXX ;;Password port=5275 ;;Port to use defaults to 5222
      
      







OpenFire偎で、サヌバヌ->サヌバヌ蚭定->倖郚コンポヌネント蚭定に移動したす

サヌビス有効を有効にしたす。 必芁に応じお、ホワむトリストにアスタリスクを远加したす。



サヌビスの確認...



䜕かお圹に立おば幞いです。 質問があれば-曞いおください。



All Articles