さくらのレンタルサーバーライトプランでCPANモジュールをインストールするためのスクリプト
さくらのレンタルサーバーライトプラン(月額125円)でCPANモジュールをインストールするためのWebアプリケーション(CGIスクリプト)を書きました。さくらのレンタルサーバーライトプランでは、SSHやTelnetを使えないために、CPANモジュールのインストールは障壁の高いものになってはいますが、このツールを使うとあら簡単に、Webブラウザ上からモジュールをインストールすることができます。
[f:id:perlcodesample:20110323012954p:image]
Windows上でMojoliciousの開発を始めて、さくらのレンタルサーバーで公開するまでの手順と同じ手順でさくらのレンタルサーバー上にFTPでアップロードしてください。app.cgiのパーミッションは755にする必要があります。
ディレクトリ構成は以下のようにします。
sakuracpanm - app.cgi
モジュールのインストールはテキストボックスにモジュール名を入力して、インストールボタンを押すだけです。初回のCPANモジュールのインストールはcpanmの依存モジュールをインストールする必要があるため時間がかかります(5~10分)。気長に待ってください。だれでも利用できるので、インストールが終わったらすぐにこのツールを削除するか、パーミッションを000などにするなどしてください。
#!/usr/bin/perl
use FindBin;
use lib "$FindBin::Bin/lib";
use Mojolicious::Lite;
use File::Copy 'move';
use LWP::UserAgent;
use utf8;
# トップページ
get '/' => sub {
my $self = shift;
my $module = $self->req->param('module');
$self->stash(error => '');
$self->stash(output => '');
if ($module && $module =~ /^[:\w]+$/) {
my $home = $ENV{DOCUMENT_ROOT};
$home =~ s#/www$##;
my @output;
my @cpanm;
eval {
chdir $home
or die qq{Can't change directory "$home": $!};
my $ua = LWP::UserAgent->new;
my $res = $ua->get('http://xrl.us/cpanm/');
my $cpanm_content;
if ($res->is_success) {
$cpanm_content = $res->content;
}
else {
die qq{Can't donwlaod "cpanm"};
}
push @cpanm, '#!/usr/bin/perl';
push @cpanm, "BEGIN {" .
"\$ENV{HOME} = '$home';" .
"use lib '$home/perl5/lib/perl5';" .
"}";
push @cpanm, $cpanm_content;
open my $write_fh, '>', 'cpanm'
or die qq{Can't open "cpanm" for write: $!};
print $write_fh join("\n", @cpanm);
close $write_fh;
my $output = `perl cpanm --local-lib=$home/perl5 $module 2>&1`;
push @output, split /\n/, $output;
};
return $self->render(error => $@) if $@;
$self->render(output => \@output);
}
elsif ($module) {
$self->stash(error => 'モジュール名を正しく入力してください');
$self->render;
}
else {
$self->render;
}
} => 'index';
app->start;
__DATA__
@@ index.html.ep
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<title>さくらのレンタルサーバーライト CPANモジュールインストール</title>
</head>
<body>
<h1>さくらのレンタルサーバーライト CPANモジュールインストール</h1>
<pre>
# インストールしたモジュールを利用したい場合はスクリプト(app.cgi)に以下のように記述します。
use FindBin;
use lib "$FindBin::Bin/../../perl5/lib/perl5";
# このスクリプトはだれもが利用可能なのでインストールが終了したらすぐに削除してください。
</pre>
<form method="get" action="<%= url_for '/' %>" >
<div>モジュール <input type="text" name="module"><input type="submit" value="インストール" ></div>
<div style="color:red"><%= $error %></div>
<div>
% if ($output) {
% foreach my $line (@$output) {
<p style="margin:0; padding:0"><%= $line %></p>
% }
% }
</div>
</form>
</body>
</html>
(参考)File::Copy、FindBin
Perlゼミ

