「ほい、これ」ってファイルを渡せる Hoi というツールをつくった
PC間でのファイル受け渡しのときにファイルサーバを使うことがたまにありますが、OSによってファイルパスやその書式が違ったり、受け渡し用のディレクトリをつくるとか、ファイル渡したいだけなのに、なんだか小さなひっかかりがあってスマートじゃないなあといつも感じてました。
なので、もっと直感的に「ほい、これ」って渡せるツールをつくってみました。
Hoi
Hoiはファイルの受け渡しを簡単に行うためのコマンドラインツールです。Go言語で書かれており、HTTPファイルサーバを利用して機能を提供します。
ファイルを渡す
使い方は簡単でローカルのファイルパスをhoi
コマンドの引数に渡すだけです。
$ hoi ~/Documents/hoge.txt
そうすると以下のような、ダウンロード用のURLが出力されます。
http://192.168.0.100:8081/h6un2x8zx6018xuhhn3bu7twwnf4ol1y/hoge.txt
これをIRCなりなんなりで相手に伝えてください。
仕組み
特に難しいことはしていません。主な処理はこういう感じです。
- ファイルダウンロード用にHTTPサーバを起動する
- HTTPサーバのDocumentRootに対して引数のファイルのシンボリックリンクをはる
見ての通り、シンボリックリンクさえはればどんなファイルでもダウンロード対象になりますし、HTTPSでもないので、
必ず信頼できるネットワーク上で使うようにしてください。
ファイルを消す
$ hoi --clear
で公開しているファイルのシンボリックリンクを削除します。
そのうち、定期的に消すような処理を入れようかなと思ってます。
デーモン化について
HTTPサーバのデーモン化、Supervisordとか使わず Hoi 単体だけでできるように、こんな感じのシンプルなやつにしてます。
func runAsDaemon() {
cmd := exec.Command(os.Args[0], "--server")
cmd.Start()
}
今のところ、PIDでしかHTTPサーバのプロセスにたどり着く手段がなくて、サーバのstatus/stopとかの実装をどうしようか思案中です。
Go言語でのデーモン化についてよい案をお持ちのかた、アドバイスお待ちしてます。
Go言語、HTTPサーバを立てるだけならすぐできてしまって便利ですね。
ファイルの受け渡しのためにローカルにHTTPサーバを立てるというのはある意味ぜいたくですが、全然負荷もかからないので、こんな風に使ってみるのもありかなとちょっと遊んでみました。