FTP, WebDAV, NFSサーバにPythonからアクセスするクライアントライブラリ

Linuxだとmountしてローカルファイルと同じようにアクセスできるからいいけど、Windowsではそうもいかない。ftpやWebdavはエクスプローラで見えたりする状態もありうるが、対応していない大部分のアプリではそのパスを使ってファイルアクセスすることができない。

しかもWebDAVのサポートは打ち切り間近という話も。ここらでPure Pythonで統一的にこいつらにアクセスする方法を提供しておかないと、Windowsユーザは不便さが激増してしまうよ。

のうがきはともかく、作ってみたかったので作りました。ローカルファイル、FTP、WebDAV、NFSに同じインタフェースでアクセスできるライブラリ。使っているのはPythonの標準ライブラリのみ。おまけで簡単なCLIインタフェース(ftpっぽいやつ)もつけました。Windows、Linuxである程度、使えてます。

日本語ファイル/ディレクトリ名にはできる範囲で対応してます。使い方は普通のlistdirとかstatとかmkdirとかに似せたから、なんとなくわかるんじゃないかな。アップロードとダウンロードはリモート側がファイル名、ローカル側はファイルオブジェクトで渡す。

基本的にコーディング作業は片手に子供を抱えながら。泣き出したら中断、嫁に見つかっても中断という鬼ルールでして(この文章も片手でチマチマ打ってます(笑))、ここまで書いてデバッグするのにかなり時間を費やしてます。両手でキーボードを打てる時間が限られているのです。そんなこんなでこれからも時間はかかるはずですが、他にもいろいろつけ足していこうかと思っています。

今後の予定、使用上の注意、感想など。

  • CLIはURLを引数にしてfilesys.pyを起動すると動く。ftp://site/pathや、http://site/dav/、file:///path、nfs://site/shareが使えます。FTPのパスワードもURLの流儀で。ftp://user:pass@site/pathみたいな。 何も書かなければuser/pass=anonymous/python@です。
  • WebDAVのBasic認証やSSL、Digest認証などにもいずれちゃんと対応したい。
  • エラーハンドリングが甘いのをなんとかする
  • NFSの書き込み系オペレーションは失敗する(おそらくAUTH_UNIXの値の問題か?)。 これは修正するつもり。
  • NFSはroot(Administrator)でないとアクセス不可。これはmountd/nfsdにつなぐソケットのローカルポート番号を低い値にしないとサーバに信頼してもらえないため。 こちらは原理的に回避不可能と思ってます。
  • WebDAVはロックなどには対応してません。
  • 性能はあまり出ないと思います。
  • 機能はいろんなプロトコルの最大公約数的なもので。
  • CIFS対応は難しすぎていつ作れるかわからない。あそこまで複雑なプロトコルにする必要がどこにあったんだろう。
  • WebDAVも仕様はいっぱい決まっているが、Apache HTTP Serverのmod_davで使う形式しか実装していません。他のDAVサーバもあるので、そいつらへの対応はこれから。
  • 同様にvsftpd、Linuxのnfsdでしか試していないし、そいつらが使っている形式にしか対応していません。
  • しかしftpはファイルのプロトコルとしては雑すぎるだろ…
  • WebDAVではなく単なるWebサーバに(read-onlyで)アクセスするというやり方もやっておきたいところ。OPTIONSで自動判別できるし。
  • sftp、rcpとかは早めに作りたい
  • ローカル版としてMIMEファイル(mht向け?)へのアクセス、Zipやtarにも対応しときたい
  • ftpにしてもWebDAVにしてもNFSにしても、プロトコルにファイル名のエンコーディングの情報がないですよね。WebDAVはurlencode(%xx)はあるけど、それをデコードしたものがUTF-8であるという情報がないので、必然的に化けることがある。CIFSにはその情報があったはず。ZIPやtarといったアーカイブ、MP3のID3タグ、JPEGのコメントとかにもエンコーディング情報がなかった気がする。JPEGにはあったかな。PNGの国際化テキストのコンテナにはエンコーディング情報を入れられたような記憶がある。普通のテキストコンテナと国際化版の2種類が用意されていたはず。コンピュータ社会はアジア人には生きづらい場所ですね。
  • 途中で子供が寝入ってフトンに置けたので、この文章の後半はすいすい書けました。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です