CentOSのコマンドラインから音楽を流す

自宅で仕事中にBGMをかけたいなー、と。

手元のPCでかければいいんですが、たまたまスピーカーが自宅サーバーの隣にあるし、
自宅サーバーといいつつDJ用のmp3が入ってるファイルサーバーなので
そっちのほうがライブラリが豊富。じゃあそのサーバー機で流せないかなー、と。

なお、会社ではTDKのBOOMBOXにChromecast Audioを繋げています。

自宅用にChromecast Audioを買っても良いんでしょうけど、注文しても届くまでの間は聞けない。
ふと自宅サーバーに使っているNEC Express5800 S70/SDを見てみるとオンボードでRealtek ALC262が乗ってる。
裏側を確認したらちゃんとLINE OUTがついてました。
じゃぁこれをスピーカーに繋いだらいいじゃない。

しばらく触ってなかったサーバーなのでyum updateするかーと思ったら、できない。
CentOS5だもんね…
これで解決: 古いLinuxでyumがYumRepo Errorで実行できない場合
これで解決。これはこれで後で入れ替えないとな。

とりあえず aplay hoge.wav してみると、サウンドカードが見つからないと言われる。
/etc/modprobe.conf を見てみると、どうやら認識はされている模様。はて。
あらためて system-config-soundcard を走らせてみても結果が変わっていないようですが、
rootでaplayしたら音が出ました。一般ユーザーから見えないのか。

% alsacard
pen error: No such file or directory
% su -
# alsacard
0
# aplay "all that matters(A)-louise.wav"
再生中 WAVE 'all that matters(A)-louise.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ

で、調べたら、auidoグループに所属しているユーザーじゃないとダメなんですね。
Express5800/S70 タイプSD + CentOS 6.4で音を出す – コンピュータ/ソフトウェア関連Tips

# usermod -aG audio myusername
# reboot

念のため再起動(alsaのrestartでもよかったかもしれない)

Advanced Linux Sound Architecture – ArchWiki
あんまり必要のないユーザーをaudioグループに入れるな、ともありますが、まぁ使うのは自分一人だし。

そんなわけで無事に再生できた。mp3もOK。

% mpg123 "DRILL KING ANTHOLOGY-01-ドリルキング・アンセム(ドリルキング社歌).mp3"
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.20.1; written and copyright by Michael Hipp and others
free software (LGPL) without any warranty but with best wishes

Playing MPEG stream 1 of 1: DRILL KING ANTHOLOGY-01-ドリルキング・アンセム(ドリルキング社歌).mp3 ...

MPEG 1.0 layer III, 192 kbit/s, 44100 Hz joint-stereo
Title: ドリルキング・アンセム Artist: ドリルキング社歌
Comment: Album: DRILL KING ANTHOLOGY
Year: 1994 Genre: Unknown

いい感じです。
しかし毎度CLIでaplayやらmpg123やら打ち込むのは大変だし、プレイリスト機能もほしい。
こうなると適当なwebインターフェースとかを持ったプレーヤーが欲しくなりますね…
そういうのないのかな。

いやむしろChromecast Audioのエミュレーターみたいなのがあればいいのか。
cheapcastとかleapcastとかはあったみたいですが続いてないですね。

※追記
VLCにwebインターフェースがあるっぽいですね。さっすがー
Control VLC via a browser – VideoLAN Wiki


関係ないですが、amazonはFire Stickとかを推してるだけあって、Chromecastを売ってないんですねw

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Chromecast Audio
価格:4978円(税込、送料無料) (2017/6/21時点)

古いWordPressサイトをStaticPressで静的に書き出してしまおう

WordPressで作ってた古いサイトを静的サイトに変換しておけば、
今後バージョンアップだとかセキュリティアップデートだとかに手間取らない。

ということで久々に触ったサイトのWordpressを最新版にバージョンアップして
StaticPressプラグインを導入。

有効化するぞーと思ったらエラーが。
class-static_press.phpの965行目でsyntax error。unexpected T_SL…

$regex = <<<'END'
/
(中略)
/x
END;

PHPのヒアドキュメントの開始でエラー。
シングルクォートで囲む ‘xxx’ という指定法はNowdoc形式といって、PHP5.3以降でないと使えない。
今回使ってたサーバーはさすが古いだけあって5.2.xでした。

幸い、(中略)の中にシングルクォートや変数を含む部分は無かったので

$regex = '
/
(中略)
/x
';

として解決。
直接プラグインを書き換えるのは一時しのぎだけど、
どうせこのサイトは静的に書き出してしまうのだからこれでも良かろう。

「良かろう」なんて普段使わない言葉遣いしたら亘理町の「よかろう寿司」に行きたくなったわね!はらこめし!
(↓元祖はらこめし味くらべのときの様子)

で、有効化したらメニューのStaticPressから設定して書き出し開始。
設定の「静的サイト URL」は、出力したファイルを後で運用するURLを指定しておく。
「出力先ディレクトリ (ドキュメントルート)」は既存のwordpressファイルととカブると面倒なので
独自のディレクトリを指定しておいた方がラクだと思う(無ければ作ってくれる)。

あとはできあがったファイルを適当に移設して公開すればオッケーよ!

EdgeRouter XをOpenVPNサーバーにする

EdgeRouterXを入手しました。
VPNを設定します。
L2TP/IPsecでもいいんですが、他のプラットフォームでも使ってるのでOpenVPNにしたい。

ubntにサイトにはsite-to-siteとかER-X同士のserver-clientしか書いてなかったが、
考えてみればserver-clientのclient側は他の端末でも良いはず。

…と作業して1回目は「繋がるのに通信できない」状態で諦め。
改めて作業したらあっさりつながった。

ER-Xはeth0からPPPoEでWANへ。
eth1~eth4は内部的にswitch0に接続、switch0はproxyarpをonに。

LANは192.168.64.0/24、OpenVPN側を192.168.65.0/24にする内容で


# sshでER-Xにログイン
sudo su
cd /usr/lib/ssl/misc
# CA作成
./CA.sh -newca

# server用の鍵作成
./CA.sh -newreq
./CA.sh -sign

cp demoCA/cacert.pem demoCA/private/cakey.pem /config/auth/
mv newcert.pem /config/auth/server.pem
mv newkey.pem /config/auth/server.key
openssl rsa -in /config/auth/server.key -out /config/auth/server-nopass.key

openssl dhparam -out /config/auth/dhp.pem -2 1024

# client用の鍵作成。hostnameがserverや他のclientとかぶらないようにする
./CA.sh -newreq
./CA.sh -sign
mv newcert.pem client1.pem
mv newkey.pem client1.key
openssl rsa -in client1.key -out client1-nopass.key
# ↑クライアント2つ目以降はここを繰り返し

# clientに client1(-nopass).key,client1.pem,cacert.pem をコピー

# EdgeRouterXの設定
----
configure

edit interfaces openvpn vtun0
set mode server
set server subnet 192.168.65.0/24
set tls ca-cert-file /config/auth/cacert.pem
set tls cert-file /config/auth/server.pem
set tls key-file /config/auth/server-nopass.key
set tls dh-file /config/auth/dhp.pem

# ルーティング情報のpush
set server push-route 192.168.64.0/24

# 下記は無くても繋がるけどいつも入れてる
## openvpn-optionをダブルクオートで囲んだり
## --comp-lzoみたいにハイフン付けたりするのは何か違いがあるのか?(調べなきゃ)
set openvpn-option comp-lzo
set openvpn-option persist-key
set openvpn-option persist-tun
# LAN側のDNSをpushする
set server name-server 192.168.31.240

# OpenVPN向けのFirewall設定
top

edit firewall name WAN_LOCAL rule 1
set description OpenVPN
set action accept
set destination port 1194
set log disable
set protocol udp

# 保存
commit
save
exit
----

# clientにovpnファイルを作る
----
client
dev tun
proto udp
remote erx.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
ca cacert.pem
cert client1.pem
key client1-nopass.key
----

これでとりあえず繋がった。
ta.keyとかtls-cipherの設定を追加してより強固にしたいが、また後日。

更新しなくなったWordPressサイトを静的にしておく

WordPressはPHPで動的にサイトを出してます。
当然サーバーのCPUパワーを食うので、更新しなくなったサイトは静的に変換して置いておきたい。
StaticPress等のプラグインを入れて出力させるのが常套手段なのですが、現段階の最新版Wordpress4.7.2に入れたらエラーが出たりして(使っているテーマ、環境にもよると思います)。

ならば無理矢理クロールして取ってしまえ!ということでwget
$ wget -nc -x -r http://example.com

出来上がったファイルは拡張子がhtmlじゃないものも多いので、
設置先サーバーのほうでMIME-typeをいじります。

今回はnginx上に置いたので

server {
    server_name example.com;
    location / {
        default_type text/html;
    }
}


これだけ。
たぶんApacheでもDefaultType text/htmlとか書いておけば拡張子ナシでもhtmlとして出してくれるでしょう(未確認)

あとはアクセスしてみて、微妙にリンク先が無かったりするものは個別に手直し。
Wordpressに限らず動的サイトを静的にするのに使えるなぁ。

2017-04-19 追記: wgetによる収集では一部欠けているようで、
やはりなんとかアップデートした後にStaticPressするのが良さそうです。

CentOS+Postfix環境でDKIM導入

CentOS5, CentOS6でpostfix使ってるところにDKIMを入れたのでメモ。

EPELを有効にしてyum -y install opendkimで入る。あっさり。

PostfixをDKIM認証に対応(CentOS) – Angel21 HP Blog
人様のblogを頼りに一通り設定する。
# mkdir /etc/opendkim/keys/example.com
# opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s 20170208
# chown opendkim:opendkim /etc/opendkim/keys/example.com/*

namedへTXTレコード追加
20170208._domainkey IN TXT "v=DKIM1; k=rsa; p=Mf(略)B"
_adsp._domainkey IN TXT "dkim=unknown"
_dmarc IN TXT "v=DMARC1;p=none;rua=mailto:dmarc@example.com;ruf=mailto:dmarc@example.com;rf=afrf;pct=100"

/etc/opendkim.conf
Mode sv
#KeyFile
KeyTable
SigningTable
ExternalIgnoreList
InternalHosts

秘密鍵指定
/etc/opendkim/KeyTable
20170208._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/20170208.private
ドメイン指定
/etc/opendkim/SigningTable
*@example.com 20170208._domainkey.example.com

追加でポイント

●namedで _ アンダースコアが使えない
named-checkzoneしてみると bad owner と言われてアンダースコアから始まる名前が使えない。
_dmarcを書くときに困るので、対象ゾーンにcheck-names ignoe;を追記して通るようにする。
zone "example.com" IN {
type master;
file "example.com.hosts";
check-names ignore;
};

●opendkimの鍵ファイルがセキュアじゃないと言われる
実際に送信してみるとエラーで送れてない。
maillogを見ると
key data is not secure: opendkim is in group 0 which has multiple users (e.g., "sync")
とエラーが出てる。にしてもgroup 0ってなぁ…

ググっても日本語資料皆無なので英語フォーラム見たら、軒並み回答なし。
しかしヒントっぽいのがあったので

opendkim.conf

/etc/opendkim.confの末尾に RequireSafeKeys false を追加。これで動いた。