1. Perl
  2. Mojolicious

さくらのレンタルサーバーライトプランで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::CopyFindBin

業務に役立つPerl

Perlテキスト処理のエッセンス

PerlでポータブルなLinuxファイル管理入門

ITエンジニアの求人情報など

 ITエンジニアの求人情報・Webサービス・ソフトウェア・スクールなどの情報。

システム開発のお問い合わせ