Posted by & filed under 未分類.

統計情報から、トラックバックしていただいていたことに気付いたので、現状どうなっているかをちょろっと書く。

遭遇した問題と対策

  • 連ドラとか短い番組ばかり撮って直ぐシャットダウンしているとEPG情報が枯渇する
    → 最低30分はシャットダウンしない
  • rasPIのKodi(XBMC)で録画を観るため、rasPIが動いている時間は落ちられると困る
    → rasPIのsystemdからchinachuサーバにsshログインし、chinachuサーバ側でSSHセッションを監視、セッションがある間は落とさない
  • ハイバーネートだとPT2やBCASリーダーが起動後に動かないときがある
    → PT2はモジュールのアンロードとロードで解消できたがBCASの方はなお不安定だったので、毎度シャットダウンするようにした。それによりchinachuサービスが先に死ぬようになりREST APIが使えず、jsonファイルを直参照して次回起動を変更するよう変更。

コード

gist良いなぁ。今回はブログ上に掲載。

root ~# crontab -l
# 起動後と3時間おきににlogwatchのレポートをメールする
@reboot /usr/sbin/logwatch --mailto haruo31@underthetree.jp
15 */3 * * * /usr/sbin/logwatch --mailto haruo31@underthetree.com

# upから30分以上経ち、かつchinachuが録画をしておらず、sshセッションがないとき
# メール送信し10秒後にshutdown -h
*/5 * * * * /usr/local/bin/up30min && /usr/local/bin/chinachuFree && /usr/local/bin/loginFree && ~root/shutmail.sh && sleep 10 && /sbin/shutdown -h now

# shutdown -r 10 せず敢えてsleepしているのはshutdown中であることで
# 何か制限があった気がしたから(ソースなし)

 

root ~# cat /usr/local/bin/up30min
#!/bin/sh

UTIME=`uptime -s`
BASE=`date -d"$UTIME" +%s`
EXP=`date -d-30min +%s`

[ "$BASE" -lt "$EXP" ]

exit $?

 

root ~# cat /usr/local/bin/chinachuFree
#!/usr/bin/env python3
# -*- charset: utf8 -*-

import sys
from ChinachuStatus import ChinachuStatus

if __name__ == '__main__':
    url = 'http://localhost:10772/api'
    res = ChinachuStatus(url).isChinachuBusy()
    if res:
        print("Chinachu is busy now.")
        sys.exit(1)
    print("Chinachu is free.")
    sys.exit(0)

 

root ~# cat /usr/local/bin/ChinachuStatus.py
#!/usr/bin/env python3
# -*- charset: utf8 -*-

from urllib.request import urlopen
import json
import io
import time

class ChinachuStatus:
    def __init__(self, urlBase):
        self.urlBase = urlBase
    
    def getNextReserve(self):
        response = urlopen(self.urlBase + '/reserves.json')
        res = json.load(io.TextIOWrapper(response, response.getheader('content-type').split('charset=')[1]))
        
        now = time.time()
        for e in [ int(ent['start'] / 1000) for ent in res if ent['start'] / 1000 > now ]:
            return e
    
    def isChinachuBusy(self):
        response = urlopen(self.urlBase + '/recording.json')
        res = json.load(io.TextIOWrapper(response, response.getheader('content-type').split('charset=')[1]))
        return len(res) > 0 or self.getNextReserve() - 600 < time.time()

if __name__ == '__main__':
    url = 'http://localhost:10772/api'
    print(ChinachuStatus(url).getNextReserve())
    print(ChinachuStatus(url).isChinachuBusy())

 

root ~# cat /usr/local/bin/loginFree
#!/bin/sh

if who -u | grep . > /dev/null; then
  exit 1
fi

exit 0

 

root ~# cat /usr/local/bin/chinachuNext
#!/usr/bin/env python3
# -*- charset: utf8 -*-

from ChinachuStatus import ChinachuStatus

if __name__ == '__main__':
    url = 'http://localhost:10772/api'
    # 5分前に起動
    print(ChinachuStatus(url).getNextReserve() - 300)

 

root ~# cat /etc/init.d/chinachu-nextsched
# /etc/rc6.d/K06chinachu-nextsched にリンクを張るのが多分正解 
#!/bin/sh

# Action script ensure that unattended-upgrades is finished 
# before a hibernate 

PATH=/sbin:/usr/sbin:/bin:/usr/bin
SHUTDOWN_HELPER=/usr/share/unattended-upgrades/unattended-upgrade-shutdown

echo 0 > /sys/class/rtc/rtc0/wakealarm
/bin/rm /home/chinachu/chinachu/data/*.lock’
/usr/local/bin/chinachuNext.old > /sys/class/rtc/rtc0/wakealarm
echo Wakeup schedule has been set successfully.

 

root ~# cat /usr/local/bin/chinachuNext.old
#!/usr/bin/env python3
# -*- charset: utf8 -*-

from urllib.request import urlopen
import json
import io
import time

class Reserves:
    def __init__(self, url):
        with open(url, mode='r', encoding='utf8') as f:
            self.o = json.load(f)
    
    def getNextTime(self):
        now = time.time()
        for e in [ int(ent['start'] / 1000) for ent in self.o if ent['start'] / 1000 > now ]:
            return e

if __name__ == '__main__':
    url = '/home/chinachu/chinachu/data/reserves.json'
    print(Reserves(url).getNextTime() - 300)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です