さらに、多くのアスタリスクユーザーにはさまざまなレベルのトレーニングがあります。誰かがプログラミングよりもシステム管理や従来の電話にさえ近いです。 さらに、テレフォニーの詳細-慣れていない実験では、稼働中のシステムをロードせずに、ラップトップでテストや実験を行う方がよい-システムを混乱させる必要があります。 一般的に、「後で延期する」多くの理由があります。
この記事では、Dockerを使用して、柔軟なluaスクリプトの味をすばやく取得する方法を、アスタリスクで作業するすべての人とすべての人に示したいと思います。 そして、実際にさらに使用するかどうかを決定します。 (読書には興味がありませんが、視聴には興味があります。本文の最後に、要点と結果を記載した6分間のビデオがあります。)

導入語
いくつかのプロジェクトの一環として、すべてをコンテナにパッケージ化する現在の傾向に従って、 アストルアイメージ(アスタリスク+ルア)を準備しました。 Dockerfileには、アスタリスク11、lua 5.1、luarocks(luaのパッケージマネージャー)、luamongo(mongodbにアクセスするためのドライバー)、いくつかのlua rocksパッケージをインストールするためのコマンドが含まれています。 docker-astoluaリポジトリで自分だけの有用なものだけを取り続け、主力者を組み立てることができます。
確かに、ドッカーの利点は、イメージをダウンロードし、テスト、実験、テストを実行してからイメージを削除できることです。これにより、オペレーティングシステムがクリーンで使い慣れたままになります。
astoluaイメージに基づいて、luaのアスタリスクとダイヤルプランのテスト構成ファイルを使用する独自の作業イメージを作成します。
準備する
ドッカーが必要です。 インストールしていない場合は、まずdockerをインストールしてください( 公式ドキュメント 、 Habrに関する記事 )。
gitも必要です( gitをインストールします )
私の作業システムがUbuntu 14.04であることもすぐにわかります。 別のLinuxを使用する場合、コマンドに違いはありませんが、ニュアンスは除外されません。
アストルーア画像のダウンロード
イメージを強化します(注意、イメージはhub.docker.comリポジトリからダウンロードされます。サイズは約600MBです)。
docker pull antirek/astolua
サンプル
docker-astolua-sampleのクローンを作成します -これは、この記事用に事前に準備されたファイルのセットです。
git clone https://github.com/antirek/docker-astolua-sample.git cd docker-astolua-sample
サンプルで停止して、ディレクトリの内容を見てみましょう。
Dockerfile
作業イメージを作成するためのファイル。 その中で、私たちはアストルアを基礎とすることを示しています。 次に、コンテナの起動時に実行されるafter_start.sh起動スクリプトを追加します。 コンテナを起動するコンソールにアスタリスクコンソールログが表示されます。
ビルドファイル
ファイル内に、Dockerfileからサンプルイメージを作成するdockerコマンド。
docker build -t "astolua:sample" .
実行ファイル
ファイル内で、必要なリソースの構成を含むサンプル画像に基づいてコンテナを起動するdockerコマンド。
docker run \ -v /etc/localtime:/etc/localtime:ro \ -v $(pwd)/store/etc/asterisk:/etc/asterisk \ -v $(pwd)/store/var/log/asterisk:/var/log/asterisk \ -v $(pwd)/store/var/menu:/var/menu/ \ --net=host \ -i -t "astolua:sample"
格納フォルダー
ストアフォルダーには、アスタリスク構成ファイル(通常は/ etc /アスタリスクにあります)およびログと音声メニューのフォルダーが含まれています。
runコマンドが最も興味深いのは、 コンテナに必要なリソースはここに示されています。 たとえば、オプション-v $(pwd)/ store / etc / asterisk:/ etc / asteriskを使用すると、ストアフォルダーの構成ファイルがコンテナー内の/ etc /アスタリスクの場所にあることを指定します。
ファイルにコマンドがあるのはなぜですか? 次のように、ファイル内のコマンドを編集すると便利です。 これにより、さまざまなオプションを持つチームで変更をテストする時間が短縮され、すべての変更がバージョン管理の対象となります。 また、画像を他の人と共有する場合は、後でオプションをdocker-composeに転送すると便利です。
コンソールに戻ります。
astolua:サンプルのイメージを作成しましょう(docker-astolua-sampleを複製したディレクトリ内)。
./build
アスタリスクを開始します(マシンで既に実行されているポート5060を占有するアスタリスクまたはその他のサービスが既にある場合は、最初に停止することをお勧めします)
./run
アスタリスクのブートログがコンソールに表示されます。 接続をテストできます。
2つのサブスクライバ101および102(パスワード1234)がアスタリスク構成ファイルsip.confに示され、キュー1234がqueues.confファイルに追加されます。このファイルに、これら2つのサブスクライバが追加されます。 101人の加入者用にソフトフォンまたはハードフォンをセットアップし、102へのコールを試行します(外部のVoIPサービスまたはハードウェアの設定に接続するトランクがないため、ローカルコールでダイヤルプランをテストします)。 加入者間のコールに関する情報は、アスタリスクコンソールに表示されます。
加入者は働いていますか、通話は通過しますか? [OK]をクリックすると、Dockerコンテナのアスタリスクが正常に機能します。
ダイヤルプランルア
luaダイヤルプランは、extensions.luaファイルにあります。 store / etc / asteriskフォルダー内のアスタリスク構成ファイルには、機能するluaダイヤルプランの例があります。
拡張機能とヒント変数は、このファイルに正しく記述されている必要があります(luaの用語では、これらは「テーブル」です)。
拡張機能テーブルには、コンテキストと対応する拡張機能が含まれています。 すべてが伝統的なダイヤルプランのようなものです。 ただし、各拡張機能は独自の機能によって処理されます。この機能では、アプリとチャネルテーブルを介してアスタリスクと対話しながら、luaで既に何でも実行できます。
最も簡単な例
extensions = { ["internal"] = { ["_1XX"] = function (context, extension) -- do something -- app.dial('SIP/'..extension); -- do something again end; } }
ダイヤルダイヤルプランアプリケーションはアプリを介して利用可能であり、従来のダイヤルプランと同じパラメーターをすべて使用することがわかります。 アプリを介して、 すべてのダイヤルプランアプリケーションが利用可能です。
チャネル変数は、チャネル変数へのアクセスを提供します。 したがって、たとえば、dialstatusを取得します。
extensions = { ["internal"] = { ["_1XX"] = function (context, extension) -- do something -- app.dial('SIP/'..extension); local dialstatus = channel["DIALSTATUS"]:get(); app.noop('dialstatus: '..dialstatus); end; } }
extensions.luaを変更し、アスタリスクCLI モジュールreload pbx_lua.soのコマンドでextensions.luaを再読み込みできます。 アスタリスクはlua構文をチェックし、すべてが正常であれば、実行のためにロードします-変更をテストできます。
LUAダイヤルプランで他に何ができますか?
たとえば、Dialplan Dial機能によって返されるdialstatusを柔軟に処理できます。 これらのGoto(s-$ {DIALSTATUS}、1)を発明する必要はありません。ステータスチェックを人間として書くことができます。
extensions = { ["internal"] = { ["_1XX"] = function (context, extension) app.dial('SIP/'..extension); local dialstatus = channel["DIALSTATUS"]:get(); if dialstatus == 'BUSY' then -- do something elseif dialstatus == 'CHANUNAVAIL' then -- do another thing end; end; } }
extensions.luaの例には、単純なivrの例があります。200を呼び出すと、ファイル/ var / menu / demoからエントリが聞こえ、1または2を押して続行できます。
local ivr = function (context, extension) app.read("IVR_CHOOSE", "/var/menu/demo", 1, nil, 2, 3); local choose = channel["IVR_CHOOSE"]:get(); if choose == '1' then app.queue('1234'); elseif choose == '2' then dial('internal', '101'); else app.hangup(); end; end;
従来のダイヤルプランの数十行を書いた人にとって、ここではすべてがおなじみのはずです。 さらに、luaおよびluarocksパッケージの全機能が表示されます。 明らかに、ダイヤルプランで、SMS、電子メールの送信、データベースへのデータの挿入、データベースからのデータの取得、およびデータベースのいずれか(mysql、mongodb、redisなど)、コマンド呼び出し、別の呼び出しの開始ができることを願っています、もちろん、すべてがアスタリスクのフレームワーク内で機能することを忘れずに、トランクなどでコールのクールなルーティングを行います。すべての「難しい」タスクを個別に解決することをお勧めします。
次は?
私は提案する:
- アスタリスクとLUAの公式ドキュメントをご覧ください -基本を理解するのに十分な例と比較
- Sayman_NskとovoshlookからHabréに関する記事をもう一度読んでください : luaの ダイヤル プラン 、 ダイヤルプランの AMI、 DEFコードの更新 、IVRの作成
- ほとんどのPBX機能が実装されているIgmarからのluaダイヤルプランの例を参照してください:サブスクライバーへの呼び出し、キューオペレーターの登録/登録、着信呼び出し用のwebhook、曜日と時刻に応じたルーティング。
- 独自の何かを「ガッシュ」:)
この記事がクイックスタートに役立つことを願っています。無料の冬の夜を見つけて、このダイヤルプランの書き方を試してみてください。
間違い? トラブル? ご質問は? 書いてください。