/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.といちいち書かなければいけないのをうっかりして、しょっちゅう怒られました。