サーバが新しくなってから放置状態だったasteriskを復活させてみる。以前のエントリはasteriskの導入 (1) - PC日記
まずは、portsからnet/asteriskをインストール。現在のバージョンは1.8系になっている。(ちなみに、最新版はasterisk11系らしい)
configのオプションはSPANDSPを追加(後でfax系をやるため)
インストールが終わったら、続いてjapanese/asterisk-soundsをインストール。
=============================================================================
[FYI]

 To get natural word order in Japanese sentences
 you can patch to /usr/ports/net/asterisk and reinstall it as below.

 For example,
 1. Download app_voicemail.c.yymmdd-01.patch and say.c.yymmdd-01.patch from
    ftp://ftp.voip-info.jp/asterisk/patch/1.8.X.Y/
    where 1.8.X.Y is corresponding to PORTVERSION in
    /usr/ports/net/asterisk/Makefile.
 2. Put them to /usr/ports/net/asterisk/files as
    patch-apps::app_voicemail.c and patch-main::say.c, respectively.
 3. Reinstall /usr/ports/net/asterisk.
 4. Add the following options section to
    /usr/local/etc/asterisk/asterisk.conf.

     [options]
     languageprefix=yes

=============================================================================
インストールされたのは1.8.25.0だが、ftp://ftp.voip-info.jp/asterisk/patch/ には 1.8.20.1までしかない。しかし、1.8系はすべて1.8.0へのシンボリックリンクのようなので、1.8.0から2つのファイルを持って来る。
このとき、何故かfetchコマンド等だとtimeoutで失敗するので、ブラウザで表示させてファイルに保存した。
これを指示通りにリネームして/usr/ports/net/asterisk/filesに置き、asteriskを再インストール。
昔の環境から設定ファイルをコピーしてきて起動したところ、エラーが出てうまく動かない。
ぷちぷち潰したので、違いについて記述していく。

asterisk.conf
asterisk-soundsの指示に従ってlanguageprefix = yes を有効に。(何故昔のが無効だったのか謎)
live_dangerously = no を有効化。(Privilege Escalations with Dialplan Functions - Asterisk Project - Asterisk Project Wikiには、asterisk12からはデフォルトがnoって書いてあるけど、コメントをはずさないと文句を言われた)
sip.conf
language=jpをjaに変更。
username=の行を全てdefaultuser=に変更
insecure=veryの行をinsecure=invite,portに変更。これをやらないと、ひかり電話の着信でasteriskが応答しない。(Asterisk Forums • View topic - insecure=very Unknown insecure mode 'very')
modules.conf
エラーではないのだが、起動時にログにずらずらとWARNINGが出るので、未使用のモジュールの内警告が出るものをnoload指定
noload => pbx_ael.so
noload => chan_dahdi.so
noload => codec_dahdi.so
noload => res_config_sqlite.so
noload => res_smdi.so
noload => cel_tds.so
noload => cel_custom.so
noload => cel_pgsql.so
noload => cdr_sqlite.so
noload => cdr_radius.so
noload => chan_skinny.so
noload => chan_unistim.so
cdr_pgsql.conf
Encoding not specified.とか言われたので、encoding=UTF-8を追加。

ここまでで、以前と同じように使えるようになった。以前はSIPクライアントにWindowsのExpress Talkを使っていたのだが、今はMacなのでLinphoneと言うアプリを入れてみた。(設定がわかりにくい)
続いて、voicemail機能を使ってみようと思いたち、voicemail.confを眺める。
こちらは、前回の記事で内容を晒していないので、有効な行だけ掲載する。
[general]
format=wav49
serveremail=asterisk@wizard-limit.net
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%Y/%m/%d(%a) %H:%M:%S
sendvoicemail=yes
[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
japan=Asia/Tokyo|Q PHM 'jp-ni' 'vm-received'
[default]
1234 => password,mailbox,to address,,tz=japan
注意点は以下。
  • serveremailは、デフォルトのasteriskだけだと、正しいホスト名がつかなかったので、ドメインまで含めるようにした。
  • emaildateformatは、メールに含まれる日時のフォーマットが気に入らなかったので修正した
  • zonemessagesのjapan=の後は、Asterisk サンプル設定ファイル voicemail.conf - VOIP-Info.jp Wikiの通りにJapanだとタイムゾーンが正しくならない。/usr/share/zoneinfoにあるものでないといけないらしいので、FreeBSDの場合はAsia/Tokyoとする
  • defaultの1234はメールボックス名。変えても良いが、数字でないといけないらしい。/var/spool/asterisk/voicemail/default/にディレクトリが存在する必要があるので、面倒だからデフォルトのまま1234とした
後は、extensions.confでVoicemail()アプリを呼んであげれば良いのだが、voip-info.jpのサンプルだと内線毎のメールボックスなので、外線着信で使えるように以下のようにした。
exten => 200,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204,30,tT)
exten => 200,n,NoOp(${DIALSTATUS})
exten => 200,n,GotoIf($["${DIALSTATUS}"!="CHANUNAVAIL"]?vm-rec)
exten => 200,n,Ringing()
exten => 200,n,Wait(30)
exten => 200,n(vm-rec),Answer()
exten => 200,n,Wait(1)
exten => 200,n,Voicemail(1234)
exten => 200,n,Hangup
200は、ひかり電話の外線が着信したときに呼び出されるextenで、最初の行で201〜204を30秒間呼び出す。この間にひかり電話の子機を含むどれかの端末が応答すればそれで終わり。
30秒間誰も応答しなかった場合は、次の行のNoOpが実行されるが、これはログにDIALSTATUSを出すためだけで、何もしない。
次のGotoIfで、DIALSTATUSがCHANUNAVAIL以外のときは、vm_recの行に飛ぶ。
これは、MacのLinphoneが起動していないときなど、SIPクライアントが一つもいないときは、30秒呼び出す前にCHANUNAVAILでDialが終了してしまうため、ひかり電話の子機が電話に出られないのを防ぐため。
CHANUNAVAILのときは、Ringing()で相手に着信を知らせ、次の行のWait(30)で30秒待つ。(Ringing()がないと、Wait()が異常終了してしまう)
それでも誰も電話に出ない時は、Answer()で着信する。
Wait(1)で1秒待つ。
Voicemail(1234)で、voicemail.confで設定したメールボックス1234に録音される。
これだと、例えばSIPの子機が一台だけで、それが内線通話中のときにもWait(30)に行かずにいきなりAnswer()に行ってしまうので、もう少し調整が必要かもしれない。
とりあえずこの設定で、asteriskのvoicemailが留守電として機能し、録音されると指定した宛先にメールが飛ぶ。
私の場合はiPhoneに届くようにしているので、iPhoneのメールアプリから添付ファイルをタッチすればそのまま録音内容を聞くことができる。iPhone自体の留守電は、ソフトバンクの「留守番電話プラス」を契約していないので、いちいち留守番電話センターに電話しないと聞けないのと比べると非常に良い。

voip-info.jpのサンプルだと、録音がある状態で内線から298にかけるとVoicemailMain()が呼ばれるので、ガイダンスに従ってメールボックス番号とパスワードを入れると、録音を聞くことができる。
しかし、ひかり電話の子機からは操作できないし、いちいちガイダンスを聞きながら操作をするのもだるいので、webインターフェイスを使うことにする。参考にしたのはAsteriskによるIP-PBXの構築(CentOS4.2編)
portsから入れた場合、vmail.cgiはどこにもインストールされないので、ソースから持って来る必要がある。/usr/port/net/asteriskでmakeした後、cleanしなければworkの下にソースが残っているので、そこから必要なファイルを取り出すことにする。
まずは、cgiを入れる先を決める必要がある。私の場合は、過去のしがらみ等の関係で /var/www/docs/lan/asteriskとした。以下の説明はそのつもりで読んで欲しい。
# mkdir /var/www/docs/lan/asterisk
# cd /usr/ports/net/asterisk/work/asterisk-1.8.25.0
# cp contrib/scripts/vmail.cgi /var/www/docs/lan/asterisk/
# cp images/*.gif /var/www/docs/lan/asterisk/
次に、vmail.cgiを編集する。

変更点は、以下。
  • 設定ファイル系が、/etc/asteriskになっているので、/usr/local/etc/asteriskに変更
  • 日時が、UTCで送られてしまうので、Asia/Tokyoのタイムゾーンで、かつ日本人に馴染みのあるフォーマットで表示するようにしてみた
後は、apacheの設定でvmail.cgiをブラウザからアクセスできるようにすれば良いのだが、メールボックス名、パスワード共に電話で入力できるように数字なので、プライバシーを大事にしたい場合は別の方法で認証するようにすると良い。私の場合は、httpsのクライアント証明書がないとアクセスできないページに配置した。
ここまでで、録音の一覧の参照と再生ができるようになる。
始めて再生するときは、コーデックを選択する画面が出るが、GSM Compressed WAV を選べば voicemail.confで指定した wav49 を指定したことになる。
Macのfirefoxだとこれで再生できたが、iPhoneのSafariだと再生できなかった。

ここまでだと、削除ができないので、なんとかする必要がある。
voicemailの録音データは/var/spool/asterisk/voicemail/default/1234/INBOXにある(新規の録音の場合)
このディレクトリは、asteriskユーザしか書き込みができないので、cgiを動かすユーザが書き込みできるようにしてやる必要がある。
  1. cgiを動かすユーザ(FreeBSD/apacheの場合はwww)を、/etc/groupでasteriskグループに追加する
  2. メールボックスディレクトリを、グループ権限で書けるようにする
    # cd /var/spool/asterisk/voicemail/default/1234
    # chmod g+ws INBOX
    
    ※ setgidしているのは、BSDのファイルシステムではディレクトリにsetgidすると中に作られるファイルのグループがディレクトリと一致するようになるため。別に不要だが。
    ※ 中の録音データは、0644だが、ディレクトリに書き込み権があれば削除、移動はできる。
    ※ vmail.cgiでは、削除だけでなくフォルダの移動もできるので、この機能を使いたい場合はINBOX以外のフォルダも用意し、chmod g+wsする必要がある
次回は、iaxmodem + hylafaxでfax関連をやってみようと思う。
# どうせ、電話もFAXも全然使わないんだけどさ。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: asteriskの導入 (3)

このブログ記事に対するトラックバックURL: http://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/3109

コメントする

このブログ記事について

このページは、falseが2014年1月 9日 14:59に書いたブログ記事です。

ひとつ前のブログ記事は「FreeBSDで日本語マニュアル」です。

次のブログ記事は「Macでsamba」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 5.2