自分の地域の電話番号を正規表現なしでしようとする

Hi%username%!



アスタリスクPBXを管理するプロセスでは、遅かれ早かれコールを宛先にルーティングする必要があります。ほとんどの場合、都市、MN、エリア内通信、MGです。 最初の2つでは、すべてが明確です。 しかし、最後の2つは...さて、ここで大したことは何ですか? DEFとABCコードの正規表現の準備については、キャリッジと記事とスクリプトの小さなカートが既に書かれていますが、これらのすべての正規表現を更新する必要がある場合があります。 そして、思考が生まれ、それを自動化できるかどうかが決まりました。 残念ながら、準備ができていて最も重要なものは見つかりませんでした。 そこで、自転車を再発明します。



これを行うには、以下を実行する必要があります。



  1. アスタリスクデータベース接続を構成する
  2. DEFおよびABCリージョンコードを使用してテーブルを作成および設定する
  3. アスタリスクの追加機能を説明する機能
  4. 必要な方向のコンテキストを記述します




手順1.データベースとのアスタリスク接続を構成する


データベースが既にインストールおよび構成されていると想定しています。 私はpostgresqlデータベースを使用するリアルタイムメカニズムを使用しているため、説明されているすべてのアクションはpostgresqlで有効です。他のデータベースでは、マイナーな変更が必要になる場合があります。

アスタリスクのあるサーバーに、unixodbcと、すべての依存関係を持つodbc用のpostgresqlドライバーをインストールします。 Debian / Ubuntuの場合、これは次のコマンドで実行されます。



#apt-get install unixodbc odbc-postgresql







odbcドライバーの説明ファイルを次の形式にします。



 #cat /etc/odbcini.ini [PostgreSQL ANSI] Description = PostgreSQL ODBC driver (ANSI version) Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbca.so Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so Debug = 0 CommLog = 1 UsageCount = 1 [PostgreSQL Unicode] Description = PostgreSQL ODBC driver (Unicode version) Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so Debug = 0 CommLog = 1 UsageCount = 1
      
      







32ビットシステムの場合、ドライバーへのパスは異なります。



以前に作成したデータベースへの接続を作成します。



 # cat /etc/odbc.ini [config] Description = PostgreSQL connection to 'asterisk' database Driver = PostgreSQL ANSI Database = asterisk Servername = 192.168.204.167 UserName = asterisk Password = Uidj$5tuYF Port = 5432 Protocol = 9.1 KSQO = No ReadOnly = No RowVersioning = No ShowSystemTables = No ShowOidColumn = No FakeOidIndex = No ConnSettings =
      
      







データベースへの接続を確認します。



 isql config
      
      





次のプロンプトが表示された場合:

 +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL>
      
      







接続が正常に機能していることを意味します。



この接続を/etc/asterisk/res_odbc.confに登録します。



 [asterisk] enabled => yes dsn => config username => asterisk password => Uidj$5tuYF pre-connect => yes
      
      







ステップ2. DEFおよびABCリージョンコードを使用してテーブルを作成し、入力する


データベースサーバーで、内部にアスタリスクデータベースを作成します。このデータベースには、おおよそ次の表を作成します(最低限必要な列数を指定します)。



 CREATE TABLE zones ( def smallint NOT NULL, start integer NOT NULL, finish integer NOT NULL) WITHOUT OIDS;
      
      







次のスクリプトを実行して、作成したテーブルに入力します。



 #!/bin/bash REGION='' echo "COPY zones FROM stdin;" > zones.sql wget -q http://www.rossvyaz.ru/docs/articles/DEF-9x.html -O DEF-9x.html cat DEF-9x.html|iconv -f cp1251 -t utf8|grep -i $REGION|awk '{print($3"\t"$6"\t"$9)}' >> zones.sql rm DEF-9x.html wget -q http://rossvyaz.ru/docs/articles/ABC-3x.html -O ABC-3x.html cat ABC-3x.html |iconv -f cp1251 -t utf8|grep -i $REGION|awk '{print($3"\t"$6"\t"$9)}' >> zones.sql rm ABC-3x.html wget -q http://rossvyaz.ru/docs/articles/ABC-4x.html -O ABC-4x.html cat ABC-4x.html |iconv -f cp1251 -t utf8|grep -i $REGION|awk '{print($3"\t"$6"\t"$9)}' >> zones.sql rm ABC-4x.html wget -q http://rossvyaz.ru/docs/articles/ABC-8x.html -O ABC-8x.html cat ABC-8x.html |iconv -f cp1251 -t utf8|grep -i $REGION|awk '{print($3"\t"$6"\t"$9)}' >> zones.sql rm ABC-8x.html echo "\." >> zones.sql psql -U asterisk -d asterisk -c 'DELETE FROM zones' psql -U asterisk -d asterisk -f zones.sql rm zones.sql
      
      







ステップ3.アスタリスクの追加機能の機能を説明する


/etc/asterisk/func_odbc.confで説明する追加の関数が必要になります



 [ZONES] prefix=CHECK dsn=asterisk readhandle=asterisk readsql=SELECT count(*) from zones where def='${ARG1:1:3}' and start<='${ARG1:4}' and finish>='${ARG1:4}'
      
      







ステップ4:必要な指示のコンテキストを書く


最後のステップ:コンテキストを説明します。



最初のコンテキストは、ゾーン内コールのみが許可されているサブスクライバ向けです。



 [zones] include => template
      
      







長距離電話が許可されている人の2番目:



 [meggorod] include => template
      
      







はい、それらは同じです:



 [template] exten => _8XXXXXXXXXX,1,GotoIf($["${CHECK_ZONES(${EXTEN})}" = "1"]?4) same => 2,GotoIf($["${CONTEXT}" = "meggorod"]?6:error,1) same => 3,Hangup() same => 4,Dial(SIP/prov1/${EXTEN},30,tTS(3600)gxX) same => 5,Hangup() same => 6,Dial(SIP/prov2/${EXTEN},30,tTS(3600)gxX) exten => error,1,Playback(an-error-has-occured) exten => error,n,Hangup()
      
      







まあ、それがすべてのようです。 このオプションは理想とはほど遠いですが、機能します。



All Articles