tinynealyのtres(FEATHER予約)使い方[ネット越し予約システム]

トップ
11/07/24(日) アナログ放送が終わり、このシステムは、使えなくなりました。




簡単なネット越し予約システムの構築 05/11/02(水) 15:33:33 最終更新
簡単な概要は以下のとおりです。(等幅フォントでご覧ください)

   外部
    │
    │  ┌─ 専用マシンA─┐          ┌── Windows XP─────────
   F│  │                │          │
   T│  │                │  scp/ftp │      ┌←───タスクスケジューラ
   P├→┼ 予約依頼file ─┼┬────┼→┌─tresex─┐
    │  │ 予約リスト ←─┼┼┐      │  │          │
    │  │                ││├←──┼─┤          │
    │  │                │││scp/ftp   │          │
    │  └────────┘││      │  │  ┌tres┐│
    │                      ││      │  │  └┬─┘│
    │  ┌─ sonet等─B ─┐││      │  └──│──┘
    │  │                │││      │        ↓
    │  │                │││      │     FEATHER
    └→┼ 予約依頼file ─┼┘│      │
        │ 予約リスト ←─┼─┘      │
        │                │          │
        │                │          │
        └────────┘          └────────────────

  必要なソフト  : Cygwin
                  (利用するコマンド bash, ncftpget, ncftpput, ssh, scp)


  1. 外部から、常に起動されているマシンAまたはマシンBに対してFTPにて、予約やキャンセルのための、iEPGファイルを転送します。
  2. WindowsXPマシンでは、タスクスケジューラによって、定期的に休止復帰し tres を起動するシェルスクリプト tresex を実行します。
  3. tresex は、AまたはBマシンから、scpやftpのコマンドを使って、要求のiEPGファイルを取り込みます
  4. 要求、キャンセルに応じて tres を実行します。
  5. 正常に終了を確認して、AまたはBマシンの対象にした iEPGファイルを実行終了とわかるようにリネームします。
  6. 現在の予約リスト情報を通知します。
インストール
  1. cygwinのインストール
    具体的なインストールは他に任せします。インストールは、d:\cygwin にインストールしたものとします。
  2. tres をPATHのある位置においてください。
    tresは、version 0.52 以降が必要です。
    例では、d:\cygwin\usr\local\bin (cygwin上では/usr/local/binとして認識)にあるものとして掲載しますので、各環境に合わせて読み替えないし書き換えしてください。
  3. 以下の tresex を修正し、d:\cygwin\usr\local\bin 以下においてください。

    tresexの内容
    ←の部分は適宜修正してお使いください。sshを使う場合は、キーを交換しパスワードが聞かないように設定しておく必要があります。
    #! /bin/bash
    #
    #  tresex 予約実行
    #
    
    PATH=/usr/local/bin:$PATH
    
    usessh=0                     # ←ssh/scpを使う場合は 1 を
    ftpuser=tinynealy            # ←FTPマシンのユーザ名
    ftphost=ftp.abc.ne.jp        # ←FTPマシンのホスト名
    ftppass=himitsu              # ←FTPマシンのパスワード
    ftppath=/public_html/tres    # ←FTPマシンの格納パス
    
    tmpdir=/tmp/tresex
    ext=tvpi                     # ←iEPGの拡張子を変える場合はここを修正
    
    ###
    
    genrename()
    {
        if [ x"$2" = x ]; then echo "internal error"; fi
        
        fn="$1"
        gen=$(($2))
    
        logcnt=${gen}
        while [ $logcnt -gt 0 ]; do
    	des=${fn}.${logcnt}
    	logcnt2=$((${logcnt}-1))
    	if [ $logcnt2 = 0 ]; then src=${fn}; else src=${fn}.${logcnt2}; fi
    	#echo "mv ${src} ${des}"
    	/bin/mv -f ${src} ${des} >/dev/null 2>&1
    	logcnt=$((${logcnt}-1))
        done
    }
    
    now=`date +'%y%m%d_%H%M%S'`
    
    mkdir -p ${tmpdir} >/dev/null 2>&1
    
    logfl=${tmpdir}/tresex.log
    progtres="tres"
    extex=done
    
    resext=txt
    reslist0=resinfo.${resext}
    reslist=${tmpdir}/${reslist0}
    resultfl0=${reslist0%.${resext}}.${resext}
    resultfl=${tmpdir}/${resultfl0}
    
    tasklog=${tmpdir}/task.log
    
    reshtml=reserv_info.html
    
    tmpfl=${tmpdir}/tmp.$$
    trap '/bin/rm -f ${tmpfl}; exit $excd' 0
    excd=0
    
    
    # ログの世代管理
    genrename ${logfl} 10
    
    touch ${logfl}
    touch ${reslist}
    
    
    echo "予約実行システム ${now}" | tee -a ${logfl}
    
    if [ ! -d ${tmpdir} ]; then
        echo "作業directory ${tmpdir} がありません。" | tee -a ${logfl}
        exit 1
    fi
    
    # ホストの内容
    if [ x${usessh} = x1 ]; then
        ssh ${ftpuser}@${ftphost} "ls -lR /home/html/tres"  | kc -s | tee -a ${logfl}
    fi
    
    # 作業ディレクトリへ移動
    cd ${tmpdir}
    
    # (1)キャンセル実行
    grp=cancel
    /bin/rm -f *.${ext}  >/dev/null 2>&1
    
    if [ x${usessh} = x1 ]; then
        scp -pr ${ftpuser}@${ftphost}:${ftppath}/${grp}/\*.${ext} .
    else
        ncftpget -DD -u ${ftpuser} -p "${ftppass}" ${ftphost} . ${ftppath}/${grp}/\*.${ext}
    fi
    
    lst=`ls *.${ext} 2>/dev/null | sort`
    if [ x"$lst" != x ]; then
        echo "★予約キャンセル実行..." | tee -a ${logfl} | tee -a ${reslist}
        for j in $lst; do
            echo "${progtres} -c $j"  | tee -a ${logfl} | tee -a ${reslist}
            ${progtres} -c $j > ${tmpfl}  2>&1 
    	ecd=$?
    	cat ${tmpfl} | tee -a ${logfl} | tee -a ${reslist}
    
            if [ x$ecd != x0 ]; then
    	    echo "予約キャンセルに失敗しました ($j)" | tee -a ${logfl} | tee -a ${reslist}
    	fi
    
    	echo "名称変更 $j ==> ${j%.${ext}}.${extex}.${now}" | tee -a ${logfl} | tee -a ${reslist}
    
    	/bin/mv -f $j ${j%.${ext}}.${extex}.${now}
    	if [ x${usessh} = x1 ]; then
    	    ssh ${ftpuser}@${ftphost} "cd ${ftppath}/${grp}; /bin/mv -f $j ${j%.${ext}}.${extex}.${now}"
    	else
    	    ncftpput  -u ${ftpuser} -p "${ftppass}" ${ftphost} ${ftppath}/${grp} ${j%.${ext}}.${extex}.${now}
    	fi
    
        done
    
    else
        echo "※予約キャンセルファイルはありません" | tee -a ${logfl}
    fi
    
    # 実行
    grp=reserve
    /bin/rm -f *.${ext}  >/dev/null 2>&1
    
    if [ x${usessh} = x1 ]; then
        scp -pr ${ftpuser}@${ftphost}:${ftppath}/${grp}/\*.${ext} .
    else
        ncftpget -DD -u ${ftpuser} -p "${ftppass}" ${ftphost} . ${ftppath}/${grp}/\*.${ext}
    fi
    
    lst=`ls *.${ext} 2>/dev/null | sort`
    if [ x"$lst" != x ]; then
        echo "★予約実行..." | tee -a ${logfl}  | tee -a ${reslist}
        for j in $lst; do
            echo "${progtres} $j" | tee -a ${logfl} | tee -a ${reslist}
            ${progtres} $j  2>&1  | tee -a ${logfl} | tee -a ${reslist}
            # 確認
            ${progtres} -e $j > ${tmpfl}  2>&1 
    	ecd=$?
    	cat ${tmpfl} | tee -a ${logfl} | tee -a ${reslist}
    
            if [ x$ecd != x0 ]; then
    	    echo "予約に失敗しました ($j)" | tee -a ${logfl} | tee -a ${reslist}
    	fi
    
    	echo "名称変更 $j ==> ${j%.${ext}}.${extex}.${now}" | tee -a ${logfl} | tee -a ${reslist}
    
    	/bin/mv -f $j ${j%.${ext}}.${extex}.${now}
    	if [ x${usessh} = x1 ]; then
    	    ssh ${ftpuser}@${ftphost} "cd ${ftppath}/${grp}; /bin/mv -f $j ${j%.${ext}}.${extex}.${now}"
    	else
    	    ncftpput  -u ${ftpuser} -p "${ftppass}" ${ftphost} ${ftppath}/${grp} ${j%.${ext}}.${extex}.${now}
    	fi
    
        done
    
    else
        echo "※予約ファイルはありません" | tee -a ${logfl}
    fi
    
    # 状況を保存 ... 
    grp=list
    
    cd ${tmpdir}
    
    genrename ${reslist} 10
    genrename ${resultfl} 10
    genrename ${reshtml} 10
    
    echo "" | tee -a ${logfl} | tee -a ${reslist}
    echo "★ 予約状況リスト === `date +'%y/%m/%d %T'` 現在 ===" | tee -a ${logfl} | tee -a ${reslist}
    ${progtres} -i -o${reshtml} 2>&1 | tee -a ${logfl} >> ${reslist}
    
    
    # 結果ファイルを戻す
    echo "
    `date +'%y/%m/%d %T'` 現在
    " >> ${reshtml} cp -p ${reslist0} ${resultfl0} if [ x${usessh} = x1 ]; then scp -p ${reshtml}* ${resultfl0}* ${ftpuser}@${ftphost}:${ftppath}/${grp}/ else ncftpput -u ${ftpuser} -p "${ftppass}" ${ftphost} ${ftppath}/${grp} ${resultfl0} ${reshtml} fi #sleep 5 # 終わり exit 0

  4. タスクスケジューラの設定
    • スタート−設定−コントロールパネル−タスク−スケジュールされたタスクの追加 を選ぶ
    • タスクウィザード [次へ]
    • 実行するプログラムは [参照(R)]を選んで D:\cygwin\bin\bash.exe を選択
    • このタスクの名前.. では、"TRES自動予約" と入力, 日単位 を選択後、[次へ]
    • このタスクを開始する日時... 開始 17:00 毎日 [次へ]
    • ユーザ名.. 現在のユーザ名とパスワードを入力 [次へ]
    • スケジュールされたタスク... ここで [完了]をクリックしたときに詳細プロパティを開くにマークして [完了]
    • 「タスク」タブで、 実行するファイル名 D:\cygwin\bin\bash.exe ==> D:\cygwin\bin\bash.exe /usr/local/bin/tresex に変更
    • 「スケジュール」タブで 、日単位 開始時刻 17:00 [詳細設定] で、をマークして 間隔 30分 継続時間 3時間 とする。(これで17:00〜30分毎に20:00まで、処理してくれる。細かく設定したい場合は、複数のスケジュールを表示するにマークして、[新規]を押して、同様の処理を繰り返してください。
    • 「設定」タブで、電源の管理で タスクの実行時にスリープを解除するにマークします。これをしないと休止状態の場合から復帰しません。
    • [OK]を押し、再度パスワードを入力すれば設定が完了します。
      D:\cygwin\usr\X11R6\bin\run.exe bash /usr/local/bin/tresexとすると、実行時dosのウィンドウが出なくなります。

  5. 動作の確認
    • 外部のftpホストの指定した(ftppath変数で指定した)ディレクトリ以下の reserve のディレクトリ(無ければ作成)に、iEPGのファイルを転送します。
      iEPGのファイルは、テレビ王国などの番組情報サイトの[予約]やiEPGボタンに対し右クリックで、対象をファイルに保存にて作成し、必要に応じて編集後、転送してください。
    • 指定した時間になったら、あるいは、タスクをすぐに実行させて、予約を確認してください。
      すぐ実行するには、エキスプローラからコントロールパネル−タスク から、"TRES自動予約" を選択、右ボタンの[タスクの実行]を行って確認してください
      動作がおかしいときは、/tmp/tresex/tresex.log を参照してみてエラー等を確認してください。
    • キャンセルも同様に、外部のftpホストの指定したディレクトリの cencel のディレクトリ(無ければ作成)に iEPGファイルを置くことで行うことができます。
      予約、キャンセルはまとめて可能です。両方ある場合は、キャンセルから実行されます。
    • 確認ができ、再度、実行する時間や間隔を変える場合は、エキスプローラからコントロールパネル−タスク から、"TRES自動予約"でのプロパティで変更してください。
    • 一度、実行したものは、日時を追加してリネームされていますので、再度利用できます。特にキャンセルしたい場合は、reserveのファイルを cancel に移動し、拡張子を戻すことで可能です。
    • 外部のftpホストの指定したディレクトリの list のディレクトリ(無ければ作成)に resinfo.txt として現在の予約の情報が格納されます。また reserv_info.html には、現在の予約情報が html 形式で格納されていますので、この位置が Web サイトからアクセスすれば、内容が視覚的に確認可能です。現行のサンプル
  6. その他
    • 休止について
      このシステムで予約動作で休止復帰した場合は、その後自動で休止にはなりません。対策としては、ここの 「休止はいやよ」の機能を使う。FEATHERで標準についている ciRAgent の起動時間と同じ時間に起動するように設定し、その休止になるタイミングを利用する。等があります。
      録画が実行し、休止になるように設定されていれば、そのタイミングで休止になります。
      tresex に、休止するコマンドを追加することも可能です。cygwin上の hibernate コマンドを使います。
      /bin/hibernate --hibernate now
      
      ただ、これを入れると、ログインしているときでも休止になってしまいますので注意が必要です。これを回避するのが、「休止はいやよ」の機能です。
    • 動作に関して意見等がある場合は、ソフト掲示版を用意しましたのでこちらにお願いします。

動作に関する問い合わせは、tinynealyにて