2013年10月07日

lxdeでペアレンタルコントロール

古いDellのInspiron 12にUbuntuを入れて数年前から息子に与えているのだが、小学生にあまりネットの世界をウロウロさせるのもどうかと思ってメーラーもブラウザも、もちろんその他のSNS系のアプリケーションも表面からは隠してあった。ちなみにこのInspiron12、13.04にアップグレードしてからはグラフィックの描画がつらくなってきたので、デスクトップ環境をLXDEで運用するようにしている。LXDEの場合、メニューバーからメニューを削除しておけば、一見したところどんなアプリも起動できない。それでは何もできないので、こちらが許可したアプリ、たとえばワープロだとかお絵かきソフトだとかはショートカットのアイコンをデスクトップに置いてある。これでだいたいはことが済む。Synfigなんてアニメのアプリも、本人の希望に応じて使えるようにした。ただ、Web関係だけは許可しなかった。

けれど、本人はもちろん、ネットでいろいろと情報を仕入れたい。ウチにはテレビがないので、友だちとのあいだで話題になるアニメ関係の情報とか、DVDを借りてきて観る映画の情報(特にハリー・ポッターだ)、あるいは友だちとやるゲームの関係の情報とかを検索したり、YouTubeで見たりしたいらしい。
こちらはそれは禁止しておきたいのだが、ある日、うっかり私が彼のパソコンで調べ物をしようとしたところを見られてしまった。もちろん私はブラウザを立ち上げるわけだが、その手順を秘密にしておきたいので、わざわざ端末を開いてFirefoxと入力して起動している。そこを一瞬見られたわけだ。すると彼は、端末にアプリケーション名を入れれば起動できるのだということを悟ってしまった。それでも私は、「やれるもんならやってみろ」と大きく構えていたが、ついにある日、Firefoxの正しいつづりを見つけてしまった。

こうなったら、放置するわけにはいかない。それまではパソコンは使いたいときに使えというかっこうで任せていたのだけれど、それは、ワープロで文章を書くとか画像ソフトで絵を書くとかは、小学生にとってそうそう根気の続く作業ではないからだ。放っておいても何時間もパソコンにかじりつく心配はない。ほんの30分もやったら飽きてしまう。ところが、Webの世界をぼんやり眺めていたら、いくらでも時間が過ぎる。いわゆるペアレンタルコントロールをすべきタイミングだ。

ペアレンタルコントロールは、大きく分けて2種類の対策を施せばいいだろう。1種類は有害サイトのフィルターリングで、これはFirefoxのアドオンを使えばいい。具体的にはFoxFilterというので間に合いそうだ。無償版はロックがかけられないのだけれど、英語を理解しない小学生に設定の変更は難しかろうから、しばらくのあいだのしのぎにはなる。

もう1種類は、PCそのものの使用時間を制限することだ。夜遅くまでパソコンにかじりつかれてはかなわないから、夜8時半にはシャットダウンしてほしい。学校が遠く朝早い関係で、できれば夜9時には床につかせたいからだ。これに関しては、Gnome Nannyというのがよさそうなのだが、あいにくなことにこれはGnome環境でなければ動かず、LXDEでは論外だし、仮にGnome環境に変更するにしても最新のUbuntuではバグが出て使い物にならないらしい(もちろんアップデートにより動くようになるのは遠くないだろうが)。ともかくも、これは諦めるべきだ。

ただ、このGnome Nanny、Linux-PAMというモジュールを操作するものらしく、したがってLinux-PAMを直接設定してやればパソコンの使用可能時間をコントロールすることができそうだとわかった(このあたりとか)。ただ、けっこう高度な設定らしく、何度かトライしたけれど失敗。どこがどうなっているのかよく理解できないのにあまり深追いしても傷を負いそうなのでいいかげんなところで諦める。

ということで困ってしまったのだが、調べていると同じような悩みを解決するためにシェルスクリプトを書いたという記事があった。なるほど、一定時間を経過したらスクリプトで強制的にログアウトさせてやればいいわけだ。つまり、
#!user/bin/bash
sleep 33m
killall -9 lxsession
というスクリプトをたとえばlogout.shというような名前で保存し、LXDEなのでLXDEの設定のAutostartフォルダ内に
[Desktop Entry]
Encoding=UTF-8
Name=Auto Log Off
Comment = Will automatically log individual off after a set period of time
Exec=bash (パス)/logout.sh
Terminal=true
というような内容でデスクトップファイルをつくっておく。すると、ログイン時に「33分後にログアウトする」というスクリプトが自動スタートするわけで、つまり1回のログインで33分までしか使用ができないという制限になる。

ただし、いきなりログアウトするとデータが失われる可能性があるので、やはり警告は必要だろう。警告も同じシェルスクリプト内に書けばいいのだけれど、そこまでプログラミングに詳しくないので、以前ちょっとかじったPythonを使って、警告のスクリプトを次のように書いた。
#!/usr/bin/env python
# -*- coding:UTF-8 -*-

import pygtk
pygtk.require('2.0')
import gtk
import datetime
import time

time.sleep(1800)

d = datetime.datetime.today()

class HelloWorld:
    def __init__(self):
        self.window = gtk.Window()
        self.window.set_title('時間です!')
        self.window.connect('destroy_event', self.end_application)
        self.window.connect('delete_event', self.end_application)

        self.label_show = gtk.Label()
        self.label_show.set_markup('<span size="24000">\n\n<b>きみがコンピュータを使いはじめて30分がたちました。\nいったん休憩してください。\n3分後に自動的にシャットダウンするので、\nすべてのファイルを保存してください。\nわかったら、「わかりました」ボタンを\nクリックしてください。\n\n</b></span>')

        self.button_hw = gtk.Button()
        self.button_hw.set_label('もうちょっと使いたい')
        self.button_hw.connect('clicked', self.set_hw_txt)

        self.button_gn = gtk.Button()
        self.button_gn.set_label('いま何時?')
        self.button_gn.connect('clicked', self.set_gn_txt)

        self.button_quit = gtk.Button()
        self.button_quit.set_label('わかりました')
        self.button_quit.connect('clicked', self.end_application)

        self.vbox = gtk.VBox()
        self.vbox.add(self.label_show)
        self.vbox.add(self.button_hw)
        self.vbox.add(self.button_gn)
        self.vbox.add(self.button_quit)

        self.window.add(self.vbox)

        self.window.show_all()

    def set_hw_txt(self, widget, data=None):
        self.label_show.set_markup("\n\n<big><b>いったんパソコンを終了して休憩してください。\nそれからもう一度起動すれば使えますよ。</b></big>\n\n\n\n\n")

    def set_gn_txt(self, widget, data=None):
        self.label_show.set_markup("\n\n<big><b>時計を見てください!\nただちにコンピュータをシャットダウンしてください。</b></big>\n\n\n\n\n")

    def end_application(self, widget, data=None):
        gtk.main_quit()
        return False

def main():
    hw = HelloWorld()
    gtk.main()

if __name__ == '__main__':
    main()
このPythonスクリプトも、やはり同じようにAutostartにデスクトップファイルをつくって自動起動させる。そうすると、強制ログアウトになる3分前に警告メッセージが出るという寸法だ。なお、変なダイアログがいっぱいあるのは、コードをもらってきた先のサンプルに合わせなければいけなかったからで、このあたり、Pythonのことを何も理解していないのがバレバレだろう。

とはいえ、これでは再ログインすればまた33分使えてしまう。最大の課題は夜8時半以降は使わせないことだから、夜8時以降はログインできないようにしなければならない。これもやはりPythonのスクリプトで制御する。つまり、
#!/usr/bin/python
# coding: UTF-8

import time
import os;
import datetime
import locale
import pynotify

d = datetime.datetime.today()

t= d.hour
h = float(t)
if h > 19 :
pynotify.init( "午後8時を過ぎています" )
n = pynotify.Notification("午後8時を過ぎています", "パソコンをすぐにシャットダウンしてください。", "dialog-warning")
n.show()

time.sleep(10)
os.system( "killall -9 lxsession" ) 

というスクリプトをたとえばtimeup.pyとかいうファイル名で保存しておき、それをやはりAutostartでログイン時に起動するようにしておく。すると、datetime関数で時刻を取得し、それが19時より大きい(つまり20時以降)であれば警告を出して10秒後にログアウトするしくみだ。実際、これでやってみると20時以降のログインはあっさりと弾かれる。24時を過ぎるとログインできてしまうのだけれど、さすがに小学生、そんな時間まで起きていないので、これはこれでいいだろう。

なんとも始末のわるいことに自動起動のスクリプトを3つも使ってしまっている。もちろん少しでもプログラミングのわかっている人なら、これを1つにまとめることなど造作もないだろう。それはそう思うのだけれど、とりあえず素人としては、用が足りれば十分。これでしばらくしのげそうだ。
posted by 松本 at 00:13| Comment(0) | TrackBack(0) | Ubuntuのアプリケーション | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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