プロフィール

けい

Author:けい
公開したWebサービス・アプリ一覧はこちら

※2014年12月、私が個人で開発したWebサービス・アプリへの
累計アクセス数は8億を超えました。
負荷対策頑張ります。日々精進していきます!!


■■■ 業務経歴 ■■■
社会人1年目:携帯電話開発。画面周りを1年間
2年目 :海外向け携帯電話ミドルウェア開発
     ブラウザとプロトコルスタック周り
2年目後半~:携帯電話の通信専用チップ開発
3年目:カーナビ。画面周りの開発
3年目後半~:BDビデオカメラ
     組み込みLinux カーネルと
     ドライバの開発。
4年目12月:プロジェクト途中で退社
~ここまではC、またはC++で開発~

~ここからJavaがメインの開発~
4年目1月:Web系の会社に転職
       ~4ヶ月間の研修
5年目5月:製造業向け生産管理システム開発
6年目9月:証券会社向けシステム開発
7年目10月~携帯電話向けコミックサイトの運用・開発
8年目12月:プロジェクト途中で退社

~ここからPHPがメインの開発~
8年目1月~仲介手数料が無料の不動産屋の社内SEに転職
交渉しほぼ完全に裁量労働が可能な立場になる。
業務内容はシステム全般ですが、
最近はSEO対策の作業が多いです。
現在14年目 まだ、しばらくはこの会社に居るつもりです。

あと、全ての記事がリンクフリーです。

最近の記事

過去ログ

全ての記事を表示する

全ての記事を表示する

カテゴリー

FC2カウンター

RSSフィード

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.--    [ Myカテゴリ:スポンサー広告 ]

Asteriskの設定項目をMySQLに格納して見た

どうもけいです。先週は夏休みでした。
家族持ちなので、好きな開発ばかりもやっていられませんが、
久々にまとまった時間が取れたので、Asteriskの設定項目をMySQLに格納して見ました。

環境:OSはLinux、ディストリビューションはDebian etch。
アスタリスクはasterisk-1.4.21.2、アドオンはasterisk-addons-1.4.7。
参考にした本は以下の2冊です。



なのだが・・・両方の本で記載が異なっていて困ってしまいました。
徹底活用ガイドの方が手順が圧倒的に少なく、簡潔であるのにたいし、
運用・開発ガイドの方はunixODBCの使用や
設定ファイルodbcinst.iniなどの編集が必要であるとの記載があります。
徹底活用ガイドではodbcについては全く触れられていません。

また、両方ともSQL文が記載されてはいるのですが、
CDも無く、WebにSQL文が上がっているわけでもないので、
毎回60行近くあるSQL文を手動で打ち込まなければなりません(不親切だなぁ・・・)。

疑問に思って調べて見たところ、Asteriskではソースコードと共にSQL文も配布されています。
このSQL文を元にして、各DBごとにSQL文を変える方法がもっとも効率がよさそうです。

asterisk\contrib\scripts\

それでは手順です
?Asterisk add-on のインストール
※zaptel, asteriskをインストール後に、add-on のインストールを行う必要がある

1. ソースの入手後解凍する
$ tar zxvf asterisk-addons-1.4.X

2. 解凍したディレクトリに移動し、以下のコマンドを実行する
$ ./configure
$ make menuselect
$ make
$ sudo make install

?mySQLにデータベースとテーブル、ユーザを作成する

1. mySQLにログインする
$ mysql -u root -p

2. データベースを作成する

mysql> CREATE DATABASE astdb;
Query OK, 1 row affected (0.07 sec)

3. データベースに接続する

mysql> USE astdb;
Database changed

4. CDR用テーブル・ユーザを作成する
4.1 CDR用テーブル作成
CREATE TABLE `cdr` (
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`userfield` varchar(255) NOT NULL default ''
);

4.2. CDR用テーブルにIndexの作成
ALTER TABLE `cdr` ADD INDEX ( `calldate` );
ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );

4.3. INSERT権限だけがあるユーザーastcdrの作成
mysql> GRANT INSERT ON astdb.cdr TO astcdr@localhost IDENTIFIED BY 'astpass';
Query OK, 0 rows affected (0.04 sec)

4.4. 設定ファイルに反映する

・/etc/asterisk/cdr_mysql.conf を編集する

[global]
hostname=localhost
dbname=astdb
table=cdr
password=astpass
user=astcdr
port=3306
sock=/var/run/mysqld/mysqld.sock
userfield=1
※sockはディストリビューションごとに変わります。

5. SIP設定用テーブル・ユーザを作成する
5.1 SIP設定用テーブル作成
これは既にSQL文がソースコードの中に含まれているので簡単です。
以下のコマンドを入力するだけです。

% mysql astdb -u root -p < ./contrib/scripts/sip-friends.sql
Enter password:
ERROR 1064 (42000) at line 5: Something is wrong in your syntax : ') TYPE=MyISAM' ??? : 50 ????

と思ったら、SQL文がバグっています。
53行目のカンマは不要なので消してください。
変更前
INDEX ipaddr (ipaddr, port),
) TYPE=MyISAM;

変更後
INDEX ipaddr (ipaddr, port)
) TYPE=MyISAM;

% mysql astdb -u root -p < ./contrib/scripts/sip-friends.sql
Enter password:


ソースに添付されているSQL文はカラムが足りていないので、
以下のSQLを流してください。

CREATE TABLE `sipfriends` (
`name` varchar(40) NOT NULL default '',
`type` varchar(10) NOT NULL default '',
`username` varchar(40),
`fromuser` varchar(40),
`fromdomain` varchar(40),
`secret` varchar(40),
`md5secret` varchar(40),
`auth` varchar(10),
`mailbox` varchar(20),
`subscribemwi` varchar(10), -- yes/no
`vmexten` varchar(20),
`callerid` varchar(40),
`canreinvite` char(3) default 'yes',
`cancallforward` char(3) default 'yes',
`dtmfmode` varchar(7),
`cid_number` varchar(40),
`callingpres` varchar(20),
`usereqphone` varchar(10),
`language` varchar(10),
`incominglimit` varchar(10),
`context` varchar(40) NOT NULL default '',
`subscribecontext` varchar(40),
`amaflags` varchar(20),
`accountcode` varchar(20),
`musicclass` varchar(20),
`mohsuggest` varchar(20),
`allowtransfer` varchar(20),
`callgroup` varchar(20),
`pickupgroup` varchar(20),
`autoframing` varchar(10), -- yes/no
`disallow` varchar(100) default 'all',
`allow` varchar(100),
`musiconhold` varchar(100),
`maxcallbitrate` varchar(15),
`host` varchar(40) default 'dynamic',
`outboundproxy` varchar(40),
`ipaddr` varchar(20) NOT NULL default '',
`defaultip` varchar(20),
`port` int(6) NOT NULL default '0',
`nat` varchar(5) NOT NULL default 'no',
`deny` varchar(95),
`permit` varchar(95),
`mask` varchar(95),
`fullcontact` varchar(40),
`restrictcid` char(1),
`insecure` varchar(20),
`qualify` varchar(15),
`regseconds` int(11) NOT NULL default '0',
`regexten` varchar(20),
`regserver` varchar(20),
`rtptimeout` varchar(15),
`rtpholdtimeout` varchar(15),
`rtpkeepalive` varchar(15),
`setvar` varchar(200),
PRIMARY KEY (`name`),
INDEX host (host, port),
INDEX ipaddr (ipaddr, port)
) TYPE=MyISAM;

5.2 全ての権限があるユーザーastconfの作成
mysql> GRANT ALL ON astdb.sipfriends TO astconf@localhost IDENTIFIED BY 'astpass';

5.3. Asteriskに変更を適用する
/etc/asterisk/res_mysql.conf を変更する

[general]
dbhost = 127.0.0.1
dbname = astdb
dbuser = astconf
dbpass = astpass
dbport = 3306
dbsock = /var/run/mysqld/mysqld.sock //環境によって違います。

/etc/asterisk/extconfig.conf を変更する

[settings]
sipusers => mysql,astdb,sipfriends
sippeers => mysql,astdb,sipfriends

6. IAX設定用テーブル・ユーザを作成する
6.1 IAX設定用テーブル作成
手順的にはSIP設定用テーブルと同じ。
sqlの名前はiax-friends.sqlとなる。

% mysql astdb -u root -p < ./contrib/iax-friends.sql

同じようにiax-friends.sqlもバグっているので修正すること

※ 2008/08/09追記
どうやら、参考書の方が正しいらしいが、
添付されている Create文のカラムが圧倒的に多いのも気になる。
もしかしたら、使えるかもしれないと考え、参考書にソース添付のSQL文を
マージしたものが以下である。

CREATE TABLE `iaxfriends` (
`name` varchar(40) NOT NULL,
`username` varchar(40) NOT NULL default '',
`type` varchar(6) NOT NULL,
`secret` varchar(40) NOT NULL default '',
`md5secret` varchar(40),
`dbsecret` varchar(100) NOT NULL default '',
`notransfer` varchar(10) NOT NULL default '',
`inkeys` varchar(40) NOT NULL default '',
`outkey` varchar(40) NOT NULL default '',
`auth` varchar(100) NOT NULL default '',
`accountcode` varchar(100) NOT NULL default '',
`amaflags` varchar(20) NOT NULL default '',
`callerid` varchar(40) NOT NULL default '',
`context` varchar(40) NOT NULL default '',
`defaultip` varchar(20) NOT NULL default '',
`host` varchar(40) NOT NULL default 'dynamic',
`language` varchar(10) NOT NULL default '',
`mailbox` varchar(50),
`deny` varchar(95),
`permit` varchar(95),
`qualify` varchar(10) NOT NULL default '',
`disallow` varchar(40) NOT NULL default 'all',
`allow` varchar(40) NOT NULL default '',
`ipaddr` varchar(20) NOT NULL default '',
`port` int(6) NOT NULL default '0',
`regseconds` int(11) NOT NULL default '0',
`regcontext` varchar(40) NOT NULL default '',
`sourceaddress` varchar(20) NOT NULL default '',
`mask` varchar(20) NOT NULL default '',
`regexten` varchar(40) NOT NULL default '',
`mohinterpret` varchar(20) NOT NULL default '',
`mohsuggest` varchar(20) NOT NULL default '',
`cid_number` varchar(40) NOT NULL default '',
`sendani` varchar(10) NOT NULL default '',
`fullname` varchar(40) NOT NULL default '',
`trunk` varchar(10) NOT NULL default '',
`maxauthreq` varchar(15) NOT NULL default '',
`encryption` varchar(20) NOT NULL default '',
`transfer` varchar(10) NOT NULL default '',
`jitterbuffer` varchar(10) NOT NULL default '',
`forcejitterbuffer` varchar(10) NOT NULL default '',
`codecpriority` varchar(40) NOT NULL default '',
`qualifysmoothing` varchar(10) NOT NULL default '',
`qualifyfreqok` varchar(10) NOT NULL default '',
`qualifyfreqnotok` varchar(10) NOT NULL default '',
`timezone` varchar(20) NOT NULL default '',
`adsi` varchar(10) NOT NULL default '',
`setvar` varchar(200) NOT NULL default '',
PRIMARY KEY (`name`),
INDEX name (name, host),
INDEX name2 (name, ipaddr, port),
INDEX ipaddr (ipaddr, port),
INDEX host (host, port)
) TYPE=MyISAM;




astconfへ権限の追加
mysql> GRANT ALL ON astdb.iaxfriends TO astconf@localhost IDENTIFIED BY 'astpass';
Query OK, 0 rows affected (0.00 sec)

/etc/asterisk/extconfig.conf を変更する

[settings]
sipusers => mysql,astdb,sipfriends
sippeers => mysql,astdb,sipfriends
iaxusers => mysql,astdb,iaxfriends
iaxpeers => mysql,astdb,iaxfriends

7. ダイヤルプランをデータベース管理する
7.1 extentionテーブルの作成
ここでも参考書が2冊とも、SQL文が異なっている。
ちなみにソースの中にも、使用可能なSQL文が含まれているが、
参考書とも違うのである。

asterisk/contrib/scripts/retrieve_extensions_from_mysql.pl

retrieve_extensions_from_mysql.pl に記載されているもの
CREATE TABLE extensions (
context CHAR(20) DEFAULT 'default' NOT NULL,
extension CHAR(20) NOT NULL,
priority INT(2) DEFAULT '1' NOT NULL,
application CHAR(20) NOT NULL,
args CHAR(50),
descr TEXT,
flags INT(1) DEFAULT '0' NOT NULL,
PRIMARY KEY(context, extension, priority)
);

迷ったが、ソースに添付されているものが一番確実だろうと思い、
上記のSQLを実行した。
->結果:動作確認した結果、駄目だった。
調べて見たところ、ソースに埋め込まれているカラム名がextensionでは無く、extenだった。
よって、参考書が正しい!
なので、以下のように修正した。

CREATE TABLE extensions (
context CHAR(20) DEFAULT 'default' NOT NULL,
exten CHAR(20) NOT NULL,
priority INT(2) DEFAULT '1' NOT NULL,
app CHAR(20) NOT NULL,
appdata CHAR(200),
PRIMARY KEY(context, exten, priority)
)

7.2 astconfへ権限の追加
mysql> GRANT ALL ON astdb.extensions TO astconf@localhost IDENTIFIED BY 'astpass';
Query OK, 0 rows affected (0.00 sec)

7.3 asterisk側で変更を適用する
/etc/asterisk/extconfig.conf を以下のように変更する

[settings]
sipusers => mysql,astdb,sipfriends
sippeers => mysql,astdb,sipfriends
iaxusers => mysql,astdb,iaxfriends
iaxpeers => mysql,astdb,iaxfriends
extensions => mysql,astdb,extensions

8. 設定ファイルからデータベースへのデータ移行
8.1 sip.conf -> sipfriends テーブルへの移行
デフォルト値が使えるので記載する箇所はそんなに多くないです。

・sip.conf から個々の記載を削除し、DBのsipfriendsテーブルに記載を移す
例:
[99999991]
type=friend
username=99999991
secret=99999991



DBへは[99999991]はカラムnameに99999991を入れます。
その他はパラメータ名と、カラムが同じです。

8.2 extension.conf -> extensions テーブルへの移行

extension.conf 変更前
[inbound]
exten => _999999XX, 1,Dial(SIP/${EXTEN},120,tT)
exten => _999999XX, 2,Congestion

extension.conf 変更後
[inbound]
;switch => Realtime/コンテキスト名@テーブル名
;コンテキスト名、テーブル名共に省略可能。
;省略した場合、コンテキスト名は上に書いてある[inbound]が用いられ、
;テーブル名はextensionsが使用される
switch => Realtime/@

DBへは以下のように書く
context exten priority app appdata
inbound _999999XX 1 Dial SIP/${EXTEN}
inbound _999999XX 2 Congestion

8. Asteriskを再起動すれば作業完了

感想
重かった。そして長かった。
正直なところ、この作業は英語がバリバリ読める or コードがバリバリ読める人じゃないと、
なかなか辛いのではないかと思った。
googleで検索してみても日本語での情報は皆無であるし、
また、両方の参考書の記載も十分とはいいがたい。
Asterisk徹底活用ガイドでは8ページ、Asterisk運用・開発ガイドでは15ページの記載があるが、
DBのカラムの説明は両方共に書かれていないので、
ちょっと複雑な設定をやろうとするとsip.conf の項目に対応するカラムは何なのか?
書き方はこれでよいのか? とソースを見ながら悩むことになる。
結局のところ、パケットをダンプして、コードを見てという作業が必要になる。

また、AsteriskのDB化に関してだけいえば、Asterisk徹底活用ガイドの方が断然わかりやすかった。


目的が違う本なので、一概に比較することはできないが、
Asterisk運用・開発ガイドに書かれていることは、設定だけをやりたい人にはわかりずらすぎる。
(データベース設定の項目でCのAPIとかが書かれていたりする。)
よって、Asterisk徹底活用ガイドお勧め。
スポンサーサイト
コメント(0)   2008.08.04    [ Myカテゴリ:試してみた ]

コメントの投稿













管理者にだけ表示を許可する

Template Designed By
ぐらいんだぁ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。