ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

MojolicousからCGIを呼ぶ

2019-12-02

背景

サーバーがMojoliciousだけど、昔ながらのCGIスクリプトを使いたくなったので、なんとかして呼び出したい。

環境

Mojoliciousのプラグイン

CPANにあるCGIのプラグインを利用します。
Mojolicious::Plugin::CGI - Run CGI script from Mojolicious - metacpan.org
それだけではPerlbrewの対応ができないのと、設定のフォルダから自動的にCGIスクリプトを登録したいです。 そこで、Mojolicous起動時に読み込まれるプラグインを作りました。 設定のcgi_rootはCGIスクリプトがあるディレクトリのパスです。 モジュールのanyfileは単にファイルをクライアントに渡すものです。

package EnableCGI;
# エディタの文字コード判定用に漢字のコメントを置いておきます。
use Mojo::Base "Mojolicious::Plugin";

sub register {
        my ($self, $app, $conf) = @_;

        if ($conf && exists $conf->{cgi_root}) {
                $app->log->debug("----------");
                $app->log->debug("EnableCGI有効");
                $app->log->debug("CGIルート:$conf->{cgi_root}");
                for (map {s#^.*/##r} glob "$conf->{cgi_root}/*.cgi") {
                        $app->log->debug("CGI:$_");
                        $app->plugin(CGI => [ "/$conf->{cgi_root}/$_" => "/usr/bin/cd; cd $conf->{cgi_root}; /usr/bin/env perl -T -I . $_" ]);
                }

                $conf->{route}->get("/$conf->{cgi_root}/#filename")->to("anyfile#through", directory => "../$conf->{cgi_root}");
                for (grep {-d} glob "$conf->{cgi_root}/*") {
                        $app->log->debug("追加ディレクトリ:$_");
                        $conf->{route}->get("/$_/#filename")->to("anyfile#through", directory => "../$_");
                }
        }
}

1;