Asterisk

Asteriskのインストール&設定メモ特設会場。
ウェブログのAsterisk カテゴリのエントリは«こちら»。

CentOS5にインストール(1.4.17)

http://www.voip-info.jp/wiki2/index.php/簡易インストールマニュアル

上記サイトを参考にインストールします。ただし、上記の設定を行いユーザー・グループをasteriskでバックグラウンド起動しようとすると

/var/run/asterisk.pid
/var/run/asterisk.ctl

が作成できないので起動できません。
そこで設定ファイル/etc/asterisk/asterisk.confの…

astrundir => /var/run

という行を

astrundir => /var/run/asterisk

…とし、/var/run/asteriskディレクトリを作成することで回避します。(オーナー・グループはasteriskで)

またudevの設定も修正しないと/dev/zap以下のオーナーがrootのままです。以下のページを参照して/etc/udev/rules.d/50-udev.rulesを修正します。

http://voip-info.jp/wiki2/index.php/Zaptel_udev#CentOS_5

なおシステム起動時にAsteriskを起動させるためにはソースファイルディレクトリ下の

contrib/init.d/rc.redhat.asterisk

/etc/rc.d/init.d/asterisk

としてコピーして、

# chkconfig –add asterisk
# chkconfig asterisk on

としておきます。

必要なパッチをあてる

とりあえず私の環境で必要なRT-200NEパッチとセッションタイマーパッチをあてます。

[RT-200NEパッチ]
以下のサイトからファイルをとってきて下さい。

http://www.voip-info.jp/wiki2/index.php/RT-200NE対応パッチ

ダウンロードしたらasterisk-1.4.17ディレクトリで

#patch -p0 < chan_sip.c.rt200ne.070417-02.patch

とタイプするだけです。

[セッションタイマーパッチ]
(1.4.17用)
https://zzaj.net/download/chan_sip.c.se-timer-20080105.diff

(1.4.22用)
https://zzaj.net/download/chan_sip.c.se-timer-20081018.diff

上記のファイルをダウンロードして、channelsディレクトリで

# patch -p0 < chan_sip.c.se-timer-20080105.diff

とします。

パッチがあたったところでmake; make installで出来上がり。

設定

セッションタイマーを使ったASAHI-NetのF基盤の場合の設定ファイル。 
(ページの幅の制限により、不本意な場所で改行されています)

sip.conf

[general]
context=default
realm=ドメイン名
bindport=5060
bindaddr=0.0.0.0
srvlookup=no
maxexpire=7200
defaultexpiry=3600
disallow=all
allow=ulaw
allow=alaw
allow=gsm
allow=ilbc
language=jp
dtmfmode=inband
register => IP電話番号@sip_domainの値:パスワード:ユーザー名@xephion/IP電話番号externip=外部IPアドレス
localnet=ローカルネットワーク/ネットマスク
nat=route

[xephion]
type=peer
name=ユーザー名
username=ユーザー名
secret=パスワード
fromuser=IP電話番号
fromdomain=sip_domainの値
host=sipsv_addrの値
dtmfmode=rfc2833
canreinvite=no
insecure=port,invite ; veryは推奨されないのでport,inviteに変更
progressinband=no
session-expires=300
context=xephion

extensions.conf

[general]
staitc=yes
writeprotect=yes
autofallthrough=yes

[globals]
MYIPDIAL => IP電話番号

; OUTGOING CALLS

; 9発信の場合
exten => _9.,1,Set(CALLERID(name)=${MYIPDIAL})
exten => _9.,n,Dial(SIP/${EXTEN:1}@xephion,60,tT)
exten => _9.,n,Hangup

; INCOMING CALLS

[xephion]
; 電話がかかってきたら番号非通知かどうかをチェックし、
exten => ${MYIPDIAL},1,GotoIf($[“${CALLERID(name)}” = “anonymous”]?20:2)
exten => ${MYIPDIAL},n,GotoIf($[“${CALLERID(name)}” = “Anonymous”]?20:3)
; 通知であれば内線201で受ける
exten => ${MYIPDIAL},n,Dial(SIP/201,40,tT)
exten => ${MYIPDIAL},n,Wait(1)
exten => ${MYIPDIAL},n,VoiceMail(201)
exten => ${MYIPDIAL},n,Hangup
; 非通知であれば猿の声を聞かせる
exten => ${MYIPDIAL},20,Answer()
exten => ${MYIPDIAL},n,wait(1)
exten => ${MYIPDIAL},n,Set(LANGUAGE()=en)
exten => ${MYIPDIAL},n,Playback(privacy-unident)
exten => ${MYIPDIAL},n,Playback(privacy-thankyou)
exten => ${MYIPDIAL},n,Playback(tt-monkeys)
exten => ${MYIPDIAL},n,Set(LANGUAGE()=jp)

設定ファイルsip.conf中にあるユーザー名・パスワード・sip_domainの値・sipsv_addrの値といった項目は、ASAHIネットの申し込みページから取得します。ただし申し込みページでそのまま進めていくと、HTMLソースの読めないポップアップウィンドウにデータが表示されてしまいますので、ちょっとした小細工が必要です。

ASAHIネットがわざわざソースを見られないようにしているのに、その見方を書いてしまったら怒られそうなので書くのは止めておきます。

おまけ

着信や発信の履歴のサマリをWebから見るためのファイル

hist.php

<html>
<head>
<title>Call history</title>
</head>
<body>
<a href=”./hist.php?target=Master.csv” mce_href=”./hist.php?target=Master.csv”>Current</a>
<a href=”./hist.php?target=Master.csv.1″ mce_href=”./hist.php?target=Master.csv.1″>1</a>
<a href=”./hist.php?target=Master.csv.2″ mce_href=”./hist.php?target=Master.csv.2″>2</a>
<a href=”./hist.php?target=Master.csv.3″ mce_href=”./hist.php?target=Master.csv.3″>3</a>
<a href=”./hist.php?target=Master.csv.4″ mce_href=”./hist.php?target=Master.csv.4″>4</a>
<a href=”./hist.php?target=Master.csv.5″ mce_href=”./hist.php?target=Master.csv.5″>5</a>
<table cellspacing=”0″>
  <tr>
    <th>Caller</th><th>Destination</th><th>Time</th><th>Status</th>
  </tr>

<?php
$filename = isset($_REQUEST[‘target’]) ? $_REQUEST[‘target’] : “Master.csv”;
$filepath= “/var/log/asterisk/cdr-csv/”.$filename;
$handle = fopen($filepath, “r”);
if (!$handle)
{
}
else
{
  while (($data = fgetcsv($handle, 1000)) != FALSE)
  {
    echo “<tr>\n”;
    echo ”  <td> “.
    $data[1].” </td><td> “.
    $data[2].” </td><td> “.
    $data[9].” </td><td> “.
    $data[14].” </td>\n”;
    echo “</tr>\n”;
  }
  fclose($handle);
}
?>
</table>
</body>
</html>

ログローテーション

/etc/logrotate.d/asterisk

/var/log/asterisk/messages /var/log/asterisk/*log {
        missingok
        rotate 5
        weekly
        create 0640 asterisk asterisk
        postrotate
                /usr/sbin/asterisk -rx ‘logger reloaded’ > /dev/null 2> /dev/null
        endscript
}
/var/log/asterisk/cdr-csv/*.csv {
        missingok
        rotate 5
        monthly
        create 0640 asterisk asterisk
}

blood, sweat and code