今回は、Pythonでカラフルなファイルシステムを作ってみました。
最近、Pythonでオリジナルのファイルシステムを作っています。色付けと簡単なフォーマットを適用するだけで見栄えが良くなることに気づいたので、そのコードを紹介します。
Decoderの準備
まず、色付けとログ記録を自動で行ってくれるデコレータのfuse_method
関数です。この関数はデコレートされたメソッドを実行し、例外が発生した場合にはerror
関数を呼び出します。
def fuse_method(f):
def wrapped_func(*args, **kw):
try:
return f(*args, **kw)
except:
error('Unhandled error')
return wrapped_func
次に、エラーメッセージを表示するためのerror
、警告メッセージを表示するためのwarn
、情報メッセージを表示するためのinfo
、デバッグメッセージを表示するためのdebug
関数です。
def error(*args, **kw):
from traceback import format_exc
print(f'{Fore.RED}ERRO{Fore.RESET}', *args, *kw)
for line in format_exc().splitlines():
print(f'{Fore.RED} *{Fore.RESET}', line)
def warn(*args, **kw):
print(f'{Fore.YELLOW}WARN{Fore.RESET}', *args, **kw)
def info(*args, **kw):
print(f'{Fore.GREEN}INFO{Fore.RESET}', *args, **kw)
def debug(*args, **kw):
print(f'{Fore.***}DEBG{Fore.RESET}', *args, **kw)
これらの関数を使うと、簡単にログを出力できます。以下はファイルシステムの一部のコード例です。
class OreOreFS(Fuse):
...
@fuse_method
def readlink(self, path):
....
このようにしてログ出力を自動化することができます。
オレオレファイルシステム
「オレオレファイルシステムって何?」と思われるかもしれませんが、これは私が考えた最強のファイルシステムです。実際には新しいファイルシステムを作ることはなく、既存のWebサービスをファイルシステムにマウントするフィルタドライバを作ることが多いです。特にWindowsでは、WebDAVのリダイレクタを作るだけで済む場合があります。ただし、WindowsでのFUSEの開発は少し難しいです。WSLで開発するか、Dokanを使うかを検討する必要があります。
PythonのFUSEライブラリであるpython-fuse
を使用しています。以下はpython-fuse
のサンプルコードの一部です。
https://github.com/libfuse/python-fuse/blob/master/example/hello.py
なお、pyfuse
を使いたかったのですが、GentooのPortageには存在しなかったため、断念しました。
FUSEは以前、Dokanが全盛期の頃にたくさん開発したので、短期間で開発することができそうです。また、言語バインディングも豊富です。ただし、一番の問題は「どのようなファイルシステムにするか」ということです。ハードウェアから自作することも考えられますが、かなり手間がかかります。
さらに、ファイルシステムを作るために、さまざまなハードウェアの実験を行っています。例えば、ESP32のBLE LL周りのテストは非常に面倒ですが、ファイルシステムにすることで簡略化できるかもしれません。EEPROMなどのデバイスにアクセスすることもできますが、利用方法によっては少し手間がかかる場合があります。
コマンドを送信してデバイスに直接アクセスすることが好きなので、デバイスのドライバレベルの高度な操作はあまり詳しくありません(笑)
以前、遊びで購入したハードウェアのリンクを共有します。
https://jp.robotshop.com/products/devantech-usb-to-i2c-module
これはUSBを使用してさまざまなデバイスと通信するためのデバイスです。Cのサンプルコードのリンクも忘れてしまいましたが、どこかにあるはずです(笑)探してみて、見つかったら教えてください。