pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


OpenWRT + asterisk + Fusion IP-Phone SMART で作る?? FAX 送受信環境(作業中)

2014/12/22時点の覚書。OpenWRTにopkgでasteriskをインストールしてファクスの送受信環境を作るという誰得なテストです。

なぜこんなことを試しているのか。

asterisk + fax の環境構築方法を調べると Digium の Fax for Asterisk を使う事例が多く見つかるわけだが、契約中のDTIVPS環境ではNICのデバイス名が違うために Fax for Asterisk が有効化できませんでした。

なにか他に方法はないものかと調べているときに、手元の OpenWRT のパッケージ一覧を見ると asterisk とか asterisk11-res-fax のような文字列が目に止まったので「もしかして OpenWRT で出来るのか?」と思って試行錯誤してます。

ファクスの送信は一応行えるようになった。

/var/spool/asterisk/faxout/ に dw-faxout.tif を配置したのち、以下のようにすれば送信は一応できる。少なくともPamFax宛の送信はできた。

あとは、メール添付の投げ込みの仕組みを作ればよいのだけど、実際に運用するには向かない気がしてきた。なにしろ、ストレージやメモリが少ない。ま、実運用に不向きなら、今回の内容を VPS 環境で作り直すだけだが。

root@OpenWrt:~# asterisk -vvvcr
Asterisk 11.12.0, Copyright (C) 1999 - 2013 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 11.12.0 currently running on OpenWrt (pid = 17840)
Core debug is still 3.
OpenWrt*CLI> channel originate SIP/81[発信先番号]@fusion-smart extension send@faxout
(以下省略)

ファクスの受信は上手くいかない。。。

送信が行えるようになったので、こんどはこれを自分宛に送るテストをしているが、今の所は成功せず。
"FAX CNG detected but no fax extension" という NOTICE が出ているので、設定が微妙に間違っているのだろう。。。

パッケージ選択

asterisk11
asterisk11-app-originate
asterisk11-app-system
asterisk11-func-global
asterisk11-res-clioriginate
asterisk11-res-fax
asterisk11-res-fax-spandsp
asterisk11-res-musiconhold
asterisk11-res-timing-pthread
coreutils-base64
ssmtp
imagemagick-tools
imagemagick-tiff

本当は添付ファイルを処理するなら msmtp のほうがよいと思うんだけど、
ssmtp 前提で作ってしまった。。。

imagemagick* は、tiff->PDF変換を想定して入れているけど、現時点では未使用。

設定ファイルなど

/etc/asterisk/extensions.conf

[globals]
MYNUMBER1=[Fusionの番号]

[default]

;From fusion
exten => ${MYNUMBER1},1,Goto(faxin,receive,1)
exten => _0.,1,Dial(SIP/fusion-smart/${EXTEN:1})

[faxin]
exten => receive,1,NoOp(**** SETTING FAXOPT ****)
exten => receive,n,Set(FAXOPT(ecm)=yes)
exten => receive,n,Set(FAXOPT(headerinfo)=[適当な文字列])
exten => receive,n,Set(FAXOPT(localstationid)=+81-50-[Fusionの番号])
exten => receive,n,Set(FAXOPT(maxrate)=14400)
exten => receive,n,Set(FAXOPT(minrate)=4800)
exten => receive,n,Set(FAXFILE=${EPOCH}.tif)

exten => receive,n,NoOp(**** RECEIVING FAX : ${FAXFILE} ****)
exten => receive,n,ReceiveFAX(/var/spool/asterisk/faxin/${FAXFILE})
exten => h,1,System(/usr/local/bin/sendfax.sh ${FAXFILE})
exten => h,n,Hangup

[faxout]
exten => send,1,NoOp(**** SENDING FAX ****)
exten => send,n,Wait(6)
exten => send,n,Set(GLOBAL(FAXCOUNT)=$[ ${GLOBAL(FAXCOUNT)} + 1 ])
exten => send,n,Set(FAXCOUNT=${GLOBAL(FAXCOUNT)})

exten => send,n,NoOp(**** SETTING FAXOPT ****)
exten => send,n,Set(FAXOPT(ecm)=yes)
exten => send,n,Set(FAXOPT(headerinfo)=[適当な文字列])
exten => send,n,Set(FAXOPT(localstationid)=+81-50-[Fusionの番号])
exten => send,n,Set(FAXOPT(maxrate)=14400)
exten => send,n,Set(FAXOPT(minrate)=4800)
exten => send,n,Set(FAXFILE=dw-faxout.tif)

; Send the fax
exten => send,n,NoOp(**** SENDING FAX : ${FAXFILE} ****)
exten => send,n,SendFAX(/var/spool/asterisk/faxout/${FAXFILE},d)

; Hangup! Print FAXOPTs
exten => h,1,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})
exten => h,n,NoOp(FAXOPT(filename) : ${FAXOPT(filename)})
exten => h,n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)})
exten => h,n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)})
exten => h,n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)})
exten => h,n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)})
exten => h,n,NoOp(FAXOPT(pages) : ${FAXOPT(pages)})
exten => h,n,NoOp(FAXOPT(rate) : ${FAXOPT(rate)})
exten => h,n,NoOp(FAXOPT(remotestationid) : ${FAXOPT(remotestationid)})
exten => h,n,NoOp(FAXOPT(resolution) : ${FAXOPT(resolution)})
exten => h,n,NoOp(FAXOPT(status) : ${FAXOPT(status)})
exten => h,n,NoOp(FAXOPT(statusstr) : ${FAXOPT(statusstr)})
exten => h,n,NoOp(FAXOPT(error) : ${FAXOPT(error)})

/etc/asterisk/sip.conf

[general]
register => [fusionの番号]:[fusionのパスワード]@smart.0038.net
maxexpirey=3600
defaultexpirey=3600
context=default
port=5060
bindaddr=0.0.0.0
srvlookup=yes
allowguest=no
disallow=all
allow=ulaw
allow=alaw
allow=gsm
language=en
faxdetect=yes

[fusion-smart]
type=friend
defaultuser=[fusionの番号]
fromuser=[fusionの番号]
secret=[fusionのパスワード]
host=smart.0038.net
fromdomain=smart.0038.net
context=default
insecure=port,invite
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
dtmfmode=inband
nat=never

/etc/ssmtp/ssmtp.conf

# Gmail に送信するための設定を書いています。

root=[gmailのアカウント]

mailhub=smtp.gmail.com:587
rewriteDomain=gmail.com

hostname=openwrt

UseTLS=YES
UseSTARTTLS=Yes

AuthUser=[gmailのアカウント]
AUthPass=[gmailのパスワード]

FromLineOverride=yes


/usr/local/bin/sendfax.sh

#!/bin/sh
# シェルスクリプトで添付ファイルを送信する強引な処理です。

MAILFROM=[gmailのアカウント]
MAILTO=[gmailのアカウント]

FAXFILE=$1
FILENAME="/var/spool/asterisk/faxin/$FAXFILE"

CMD_SENDMAIL="ssmtp -t"
#CMD_SENDMAIL=cat
DATE=$( date +"%Y/%m/%d" -r "${FILENAME}" )
BOUNDARY="==============$( date +"%Y%m%d%H%M%S" )"


(
########################################
# mail header
#
cat<<EOF
From: ${MAILFROM}
To:${MAILTO}
Subject: fax received
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="${BOUNDARY}"

--${BOUNDARY}
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

EOF

########################################
# mail body
#
cat<<EOF
received fax

EOF

########################################
# mime header for attached file
#
FILENAME_ATTACHED=FAXFILE
cat<<EOF

--${BOUNDARY}
Content-Type: application/octet-stream;
        name="$FILENAME_ATTACHED"
Content-Disposition: attachment;
        filename="$FILENAME_ATTACHED"
Content-Transfer-Encoding: base64

EOF

########################################
# insert faxfile with base64 encoding
#
cat $FILENAME | base64

########################################
# close multipart
#
cat<<EOF

--${BOUNDARY}--
EOF
) | $CMD_SENDMAIL