2014年04月21日

Openboxログイン時間制限用のスクリプトを書いた

前回「MinecraftもどきのMinetestに息子がはまった」と書いたが、ゲームにはまって抑制が効かなくなるのも困るので、親子の間で時間制限をかけることに合意した。1日30分とか2日で1時間とか、いや1日1時間はしたいとか、いろいろ攻防があった挙句(もともとテレビは見ないし、Wiiもやめるという前提で)、1週間に5時間ということで落ち着いた。ただし、これをいちいち手作業で管理していたら大変だから、1週間に5時間しかつかえないように設定したい。Mintestそのものにはそういう機能はないので、外部からペアレンタルコントロールをかける必要がある。これはシステムのレベルでも行えないことはないのかもしれないけれど、たまたま他の必要からMintest専用アカウントをつくったので、このアカウントへのログイン時間を制限すればいい。となると、以前作成した「lxdeでペアレンタルコントロール」のスクリプトを改造すればいいのではないかと考えた。
けれど、考えはじめてみると、1週間の時間制限というのは案外難しい。Pythonで書くとして、経過時間を外部ファイルに書き出して記録するのが実際的だなと考えた。そして、週のはじめにその経過時間をゼロにリセットする。曜日を整数として取得すると月曜日が0だから、これを利用すればいいんだろうと考えた。
けれど、よく考えたら、必ずしも毎日アカウントにログインするとは限らない。「月曜日ごとにリセットする」というスクリプトでは、たとえば初回のログインが水曜日だったら数値はリセットされない。最終のログインが週末とも限らないから、「前回のログイン曜日よりも小さなログイン曜日になったらリセット」というのも使えない。全く使わない週も可能性としてはあるわけで、そこまで考えたら、やっぱり日付を取得してきっちりと週のはじめを読んでやらないといけない。
ということで、次のようなスクリプトを書いた。例によって基本がわかっていない私は、あちこちから拾ってきたサンプルのつぎはぎである。公表するのも恥ずかしいようなものだが、私はプログラマではないので、プログラマにとって恥ずかしいようなことでも恥と思わずにできる。素人の強みだ。


#!/usr/bin/python
# coding: UTF-8

import datetime
from datetime import date
import time
import ConfigParser
import os;
import locale
import pynotify


if __name__ == "__main__":

    inifile = ConfigParser.SafeConfigParser()
    inifile.read("./config.ini")

lastdate = inifile.get("int","lastdate")
totaltime = int(inifile.get("int","totaltime"))

lastyear = int(lastdate[0:4])
lastmonth = int(lastdate[5:7])
lastday = int(lastdate[8:10])
d = datetime.date.today()
d0 = date(lastyear, lastmonth, lastday)
days = d - d0
dayow = d0.weekday() - d.weekday()

if int(days.days) > 6:
        totaltime = 0
else:
        if dayow >0:
                totaltime = 0
        else:
                totaltime = totaltime

while totaltime < 360:
        time.sleep(60)
        totaltime = totaltime +1
        st = """[int]"""+ "\n" +"""lastdate        =        """+ str(d) + "\n" + """totaltime        =        """ + str(totaltime)
        f = open('config.ini', 'w')
        f.write(st)
        f.close()

pynotify.init( "1週間の制限5時間です" )
n = pynotify.Notification("制限時間になりました。", "また来週!", "dialog-warning")
n.show()

time.sleep(60)
os.system( "openbox --exit") 


別にconfig.iniという初期設定ファイルを作成しておく。内容は、

[int]
lastdate=2014-04-16
totaltime=0

という感じだ。これをOpenbox環境のアカウントでautostartに仕込んでおく。ただし、ここで重要なのは、スクリプト中に指定してある初期設定ファイルの場所を絶対パスに書き換えておくこと。あるいはcdでディレクトリを変更しておけばいいのかもしれないが、相対パスだと自動起動がうまく働かなかった。しばらく悩んでしまった。

1分毎に設定ファイルを書き換えるスクリプトなので、うるさいといえばうるさいのだけれど、ゲームの終了時のイベントを読んで設定ファイルを記録するスクリプトを書けなかったので、しかたない。これでとりあえずは十分に役に立っているようだ。現在のところこのスクリプトでわかるように制限時間を経過すると1分だけ時間猶予を与えてから強制ログアウトするようになっている。なんだか息子はこれを逆手に取って制限時間後にログインし、1分だけ遊ぶというおかしなことをやっているようだから、ここは10秒ぐらいに短縮したほうがいいのかもしれない。

「どうやって制限しているの?」と尋ねられたので、上記のような大まかな構造だけは説明した。息子はその設定ファイルがどこにあるのかを探し出したいらしいが(もちろん書き換えたいのだ)、それは秘密にしてある。もしもそれを探しだし、書き換えるぐらいの力量がついたら、ペアレンタルコントロールなんか不要になるんだろう。いつかそんな日が来ることを願っている。
posted by 松本 at 10:56| Comment(0) | TrackBack(0) | Ubuntuのアプリケーション | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック