研究会

機械学習、データベース、分散システム、その他技術的なことを書く研究会です

Freenet のプラグインを作ろう: HelloWorld プラグインの作成

はじめに

最近 Freenetプラグインを書く必要に迫られ情報収集をしている。しかし開発に当たって必要な情報が英語でも日本語でも纏まっていない印象なのでここに記しておく。

Freenet はインターネット検閲に対抗するため匿名でのコミュニケーションを実現する P2P 型システムである。ユーザーからは分散型のストレージのような感じで使える。そしてそのストレージ機能を利用して匿名メールや匿名掲示板のようなものを実現するプラグインが開発されている。

今回は公式 Wikiチュートリアル に則って簡単な HelloWorld プラグインを作成する。

ソースコード

HelloWorld.java

/**
 * 参考: https://wiki.freenetproject.org/Plugin_API
 */

import freenet.pluginmanager.*;
import java.util.Date;

public class HelloWorld implements FredPlugin {
    private volatile boolean goon = true;

    /* Freenet の API にアクセスするためのオブジェクト */
    PluginRespirator pr;

    /* プラグインがアンロードされた時に呼ばれる */
    public void terminate() {
        goon = false;
    }

    /* プラグインがロードされた時に呼ばれる */
    public void runPlugin(PluginRespirator pr) {
        this.pr = pr;

        while (goon) {
            /* 標準エラーへの出力は wrapper.log ファイルに吐かれる */
            System.err.println("Heartbeat from HelloWorld-plugin: " + (new Date()));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // Who cares ?
            }
        }
    }
}

manifest.mf

※ jar を作るときに生成されるマニフェストファイルへ追記する設定。Freenetプラグインのエントリーポイントを知らせる。

Plugin-Main-Class: HelloWorld

ビルド

Freenet のインストールフォルダー (Windows でのデフォルトは AppData\Local\Freenet) に freenet.jar があるはずなので、クラスパスとして指定しつつビルドする。また jar 作成時にマニフェストファイルも指定する。

javac -cp path\to\freenet.jar HelloWorld.java
jar -cvmf manifest.mf HelloWorld.jar HelloWorld.class

実行

Freenet の Web インターフェースにアクセス (localhost:8888 あたり) し、上部の「設定」タブから「プラグイン」に移動、下部の「非公式プラグインを追加」で作成した HelloWorld.jar を指定してロードする。

AppData\Local\Freenet\wrapper 付近にある wrapper.log というファイルを見ると以下のような出力が確認されるはず。

INFO   | jvm 1    | 2014/12/14 02:31:56 | Downloading plugin path\to\HelloWorld.jar
INFO   | jvm 1    | 2014/12/14 02:31:56 | Heartbeat from HelloWorld-plugin: Sun Dec 14 02:31:56 JST 2014
INFO   | jvm 1    | 2014/12/14 02:31:57 | Heartbeat from HelloWorld-plugin: Sun Dec 14 02:31:57 JST 2014

プラグインのアンロードは「Plugins currently loaded」から HelloWorld プラグインを見つけて「アンロード」ボタンを押す。

まとめ