/etc/fstabの情報を管理するモジュールを作る

/etc/fstabの情報を管理するモジュールを作ってみることにしました。perlでのモジュールの作り方は知らないので、まずpythonで。とりあえず、必要なインターフェイスは、

パーティション名 → デバイスノード
パーティション名 → マウントポイント
パーティション名 → ファイルシステムタイプ

を教えてくれる関数です。あとは、

任意の一語 → 有効なパーティション名かどうかを「はい」か「いいえ」で答える

というインターフェイスもあると便利そうです。完璧な設計が出来上がったので、早速実装にうつります。

#!/usr/bin/python
# -*- coding:utf-8 -*-

from __future__ import with_statement
import sys
from subprocess import call,Popen,PIPE
import os
import re

class localFileSystem():
    """
    クラス localFileSystem()
    このクラスは、pcにあるファイルシステムの名前、パス、ファイルシステムを
    初期化の時に/etc/fstabから読みとり、問い合せに応じて、適切な文字列を
    返す
    """

    __devnode = {}          # 仮想ボリュームのデバイスノード
    __filesystem = {}       # 仮想ボリュームのファイルシステム
    __mountpoint = {}       # 仮想ボリュームのマウントポイント
    __automount = {}        # ボリュームが自動マウントか

    def __init__(self,root='gentoo'):
        # /etc/fstabを読み込んで、__devnode,__filesystemを初期化する
        reg_slash = re.compile(r'/')
        with open("/etc/fstab") as f:
            for line in f:
                # 行頭が/で始まる行だけを処理する
                if reg_slash.match(line):

                    fs=line.split()
                    """
                    fs[0] デバイスノード; (例) '/dev/md1'
                    fs[1] マウントポイント; (例) '/boot'
                    fs[2] ファイルシステム; (例) 'ext2'
                    fs[3] マウントオプション; (例) 'noauto,noatime'
                    """
                    # マウントポイントの最後の一語をkeyとする
                    # (例) /usr/portage -> portage
                    key=re.split(reg_slash,fs[1]).pop()

                    # 特殊なパーティションを処理する
                    if key == '':
                        key = root          # /のデフォルトはgentoo
                    elif key == 'none':
                        continue            # マウントポイントがnoneなら無視する

                    self.__devnode[key] = fs[0]
                    self.__mountpoint[key] = fs[1]
                    self.__filesystem[key] = fs[2]

                    if fs[3].find('noauto') != -1:
                        self.__automount[key] = False
                    else:
                        self.__automount[key] = True

    # def __init__() 

    # __devnode[key]を返すメソッド
    def get_devnode(self,name):
        return self.__devnode[name]

    # __filesystem[key]を返すメソッド
    def get_filesystem(self,name):
        return self.__filesystem[name]

    # __mountpoint[key]を返すメソッド
    def get_mountpoint(self,name):
        return self.__mountpoint[name]

    # lvnameを返すメソッド
    def get_lvname(self,name):
        vn = self.__devnode[name].split('/')
        if len(vn) == 3:
            # /dev/hoge の場合は、物理パーティション
            return 'physical'
        else:
            # /dev/hoge/hage /dev/mapper/hogeの場合は論理ボリューム
	    # /dev/mapper/hogeのパターンは、面倒なので処理してないです
	    # 本気をだせば、簡単に実装できると思う
            return vn[2]

    # keyが有効であればTrueを返す
    def is_goodkey(self,key):
        return self.__devnode.has_key(key)

    # keyが自動マウントであればTrueを返します
    def is_automount(self,key):
        return self.__automount[key]

# class localFileSystem

たったこれだけの実装ですが、慣れていないので大変でした。特に、self.といちいち書かなければいけないのをうっかりして、しょっちゅう怒られました。