debian squeezeを動画再生サーバにする

■debian squeezeを動画再生サーバにする
 ※今回はwebサーバのトップページをログインユーザのホームディレクトリに変更します。

 参考:debian lennyを動画再生サーバにする
 http://d.hatena.ne.jp/labunix/20120108

$ sudo apt-get install -y apache2
$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default.org
$ sudo diff /etc/apache2/sites-available/default /etc/apache2/sites-available/default.org
4c4
<       DocumentRoot /home/user/www
---
>       DocumentRoot /var/www
9c9
<       <Directory /home/user/www/>
---
>       <Directory /var/www/>

$ sudo /etc/init.d/apache2 restart
$ mkdir ~/www

■lennyからscpする

$ sudo scp -r /var/www/* root@vmsqueeze:/home/user/www

■squeeze側で設定する

$ sudo chown -R `whoami`:`whoami` /home/`whoami`/www
$ w3m -no-proxy -dump_head http://`hostname -f`/playlist_a.html | head -1
HTTP/1.1 200 OK

■www転送設定
 ※以下は普通はやりません。上記だけで充分です。
  また、他にも多くの方法があります。

 ★wwwアクセスの構成
 lenny:80(/var/www/index.html)⇒lenny:9080⇒ポート転送(NAT)⇒squeeze:80(/home/user/www)

■lennyからsqueezeへのアクセスにsshを使う。
 ※当然ながらポートは被らないこと。
 ※lennyで設定。1024以下のポート転送にはroot権限が必要

$ netstat -an | grep 5080
$ sudo cat /root/.ssh/config
Host vmsqueezewww
  HostName      192.168.72.1
  GatewayPorts  yes
  LocalForward  5080 192.168.72.108:80

■ポート転送で接続する(lennyから)。

$ sudo -p 5022 root@vmsqueezewww
$ netstat -an | grep 5080
tcp6       0      0 :::5080                 :::*                    LISTEN

■lenny側の「/var/www/index.html」を修正

$ sudo cat /var/www/index.html
<html>
<head><title>vmsqueeze</title>
</head>
<body>
<div alien="center">
<table border="0">
<tr><td>
this is lenny

<a href="http://debian-lenny:5080/">vmsqueeze</a>
</td></tr>
</table>
</div>
</body>
</html>

■転送チェック(ssh転送接続無し)
 ※多段プロキシを通すとキャッシュの期限内は見れてしまうので。

  プロキシ構成は以下の通り
  w3m(lenny)⇒debian-lenny:3128⇒vmsqueeze:7080⇒vmsqueeze:80

  ポート転送構成は以下の通り
  w3m(lenny)⇒debian-lenny:5080⇒vmsqueeze:80

$ w3m -no-proxy -dump_head http://debian-lenny | head -1
HTTP/1.1 200 OK

$ w3m -no-proxy -dump_head http://debian-lenny:5080 | head -1
w3m: Can't load http://debian-lenny:5080.
■転送チェック(ssh転送接続有り)

$ w3m -no-proxy -dump_head http://debian-lenny | head -1
HTTP/1.1 200 OK

$ w3m -no-proxy -dump_head http://debian-lenny:5080 | head -1
HTTP/1.1 200 OK

$ w3m -no-proxy -dump http://debian-lenny:5080
It works!

This is squeeze

■「index.html」は「index.htm」に変更し、優先度を低に。
 「playlist_a.html」を「index.html」に変更し、優先度を高に。

 ※読み込みの優先順位は以下の通り。

$ sudo cat /etc/apache2/mods-available/dir.conf | \
   grep -v "<" | sed s/" "/"\n"/g | grep -v "^\$\|D"
index.html
index.cgi
index.pl
index.php
index.xhtml
index.htm

$ cd ${HOME}/www
$ mv index.html index.htm
$ mv playlist_a.html index.html

■これで一般webサーバと動画再生サーバの分離が完了。
 ※ポートが待ち受けてもいないので、エラーページすら返りませんのでご注意を。
  また、sshで多段ログインしないと使えませんw。
  DMZ環境内のグローバルポートの範囲内で使用が限定されていますが、
  更に、検証時に何かあった場合でも、ポート転送を止めれば直ぐにアクセス停止出来る状態になっています。

■XMLファイルの設定の自動化スクリプトの使い方サンプル
 ※スペース、カンマは無い前提ですが。。。
  「%20」とスペース等、URLとファイル名の関係は一切考慮していません。

 ★一行づつの場合

$ ./flaver_template.sh "/movie/video.flv,/movie/video.jpg,NoTitle" ;echo $?

 ★「sample」にカンマ区切り、一行に一ファイル設定として読み込む
  ※但し、「Y/N」の指定は必要

$ for list in $(cat sample);do ./flaver_template.sh "$list";echo $?;done | tee -a flaver.log

■スクリプト本体
 ※XMLについては秒単位でユニークなバックアップファイルを作るので、以下のように変更しても構いません。

 変更前:read YORN
 変更後:YORN="Y"

 ※エラー時にはリターンコードを出力します。
  エラーとなる場合は以下を参考にして下さい。

  ・「echo $?」でエラーコードを見る
  ・「#!/bin/bash -x」でデバッグモードにして全体を見る

 リターンコードは10進数です。
 引数チェックエラーは1桁、ユーザストップエラーは99、
 ディレクトリ/ファイルエラーは10番台、XMLエラーは20番台としています。
 正常終了時には0を返します。
 メッセージで返しても良いのですが、簡易スクリプトなので。。。

 ・引数の指定チェックエラー:1
 ・カンマ分離チェック:2
 ・ユーザによるストップ:99
 ・ドキュメントルート配下(ホーム)チェック:10
 ・バックアップチェック:11
 ・XMLの名前変更チェック:21
 ・XMLの最終チェック:22

$ cat flaver.sh
#!/bin/bash

# arg check
if [ "$#" -eq 1 ];then
  ARG=$1
else
  echo "usege: MOVIEPATH,PICPATH,TITLENAME"
  exit 1
fi

# arg count check
COUNT=$(echo ${ARG} | sed s/","/"\n"/g | wc -l | awk '{print $1}')
if [ ${COUNT} -eq 3 ];then
  echo "count check ok"
else
  echo "Error: count check NG $COUNT"
  exit 2
fi

# ask
MOVIEPATH=$(echo "${ARG}" | awk -F\, '{print $1}')
PICPATH=$(echo "${ARG}" | awk -F\, '{print $2}')
TITLENAME=$(echo "${ARG}" | awk -F\, '{print $3}')
echo "BACKUP = ${BACKUP}"
echo -n "Are you ok? [Y/n]"
read YORN
case "$YORN" in
  [Yy])
    echo "OK continue...";
    ;;
  *)
    echo "Error: User select stop. $YORN";
    exit 99;
    ;;
esac
# home check
#MYHOME=/var/www
MYHOME="${HOME}/www/playlistA"
if [ -d "${MYHOME}" ];then
  echo "${MYHOME} is ok"
else
  echo "Not Found: ${MYHOME}"
  exit 10
fi

# backup check
FLAG=0
cp ${MYHOME}/flaver.xml ${MYHOME}/${BACKUP} || FLAG=1
if [ ${FLAG} -eq 0 ];then
  echo "backup ok"
else
  echo "Error: backup NG FLAG = ${FLAG}"
  exit 11
fi

# move flaver.xml
FLAG=0
mv ${MYHOME}/flaver.xml ${MYHOME}/flaver.xml.bak || FLAG=1
if [ ${FLAG} -eq 0 ];then
  echo "flaver.xml move ok"
else
  echo "Error: flaver move NG FLAG = ${FLAG}"
  exit 21
fi

# last check
FLAG=0
test -f ${MYHOME}/flaver.xml.bak || FLAG=1
if [ ${FLAG} -eq 0 ];then
  echo "flaver.xml move ok"
else
  echo "Error: flaver move NG FLAG = ${FLAG}"
  exit 22
fi

cat flaver.xml.bak | grep -v '</flaver>' > flaver.xml
echo '
  <data>
    <file>'${MOVIEPATH}'</file>       <!-- 動画・音楽ファイルパス (必須) -->
    <image>'${PICPATH}'</image>     <!-- 画像・サムネイルパス -->
    <title>'${TITLEPATH}'</title>     <!-- タイトル -->
    <text></text>       <!-- テキスト (タイトルに連結) -->
    <author></author>   <!-- 著作者 (タイトルに連結) -->
    <link></link>       <!-- リンク (タイトルに付加) -->
    <time></time>       <!-- 再生時間 -->
    <size></size>       <!-- サイズ表示用 -->
    <byte></byte>       <!-- 容量表示用 -->
  </data>
' >> flaver.xml
echo '</flaver>' >> flaver.xml
exit 0