Perl CGI ライブラリ


 [Index]    モジュールの詳細   ダウンロード

概要

機能

 Perl CGIライブラリはCGIを容易に作れるようにするためのライブラリである。Perl CGIライブラリは以下のモジュールからなっている。


動作条件


インストール

以下の説明はUbuntu 14のApacheにインストールするときの例である。その際、root権限が必要になる。

cgi-binへのファイルコピー

以下のファイルを/var/www/cgi-binにコピーする。コピーが終わったら拡張子.cgiのファイルのパーミッションを0755に、それ以外のファイルのパーミッションを0644に設定する。


viewsディレクトリの作成

/var/www/cgi-bin/viewsというディレクトリを作成し、パーミッションを0644に設定する。そこに以下のファイルをコピーする。


dataディレクトリの作成

/var/www/dataというディレクトリを作成し、パーミッションを0777に設定する。そこに以下のファイルをコピーする。コピーしたら、data.dbは0666、それ以外は0644に設定する。


その他のファイル

必須ではないが、画像ファイル、cssファイル、javascriptファイル(特にjQuery)を/var/www/htmlのどこかにコピーしておく。


パスワードファイルの初期化

/data/passwords.csv の中身を初期化する。1行は、「ユーザ名,パスワード」の形式なので、必要なユーザを定義する。

(例) user1,12345

passwords.csv を保存したら enc_pwd.pl でパスワードを暗号化する。
(使用方法) perl enc_pwd.pl

 

使用例

hello.cgi

文字列を表示するだけのCGIである。

#!/usr/bin/perl

require 'CommonCGI.pm';

$cgi = CommonCGI->new;

$html = <<HTML;
<html>
<head>
<title>Hello</title>
</head>

<body>
<br />
<h1 style="text-align:center">Hello, World.</h1>
</body>
</html>
HTML

$cgi->setHtml($html);
$cgi->response();

ヒアドキュメント内で $ を使う場合は、\$ とエスケープする必要がある。(そうしないと、変数とみなされる)


home.cgi (ホームディレクトリの表示)

次のサンプルはユーザのホームディレクトリを表示する。ユーザIDはサーバのユーザIDと同じ必要がある。

#!/usr/bin/perl

use lib '/var/www/cgi-bin';
use CommonCGI;
use AuthUser;
use Logger;


our $cgi = CommonCGI->new;
our $auth = AuthUser->new;

# 表示内容を作成する。
sub makeContent {
  my $uid = shift;
  my $str = '';
  #my $dir = '/home/' . $uid;
  my $dir = '/home/user';

  if (-d $dir) {
    opendir(DH, $dir);
    my @files = sort grep { !m/^(\.|\.\.)$/g } readdir(DH);
    closedir(DH);
    $str .= "<ul>";
    $str .= $cgi->listItems(\@files);
    $str .= "</ul>\n";
    $cgi->appendHtml($str);
  }
  else {
    $cgi->appendHtml('<div style="color:red;">ユーザが存在しないかディレクトリにアクセスできません。</div>');
  }
}


# メインプログラム
sub main {
  Logger::write_t("home.cgi");
  my $userid = $cgi->getCookie('userid');
  my $password = $cgi->getCookie('password');
  $cgi->append('views/head.phtm');
  $cgi->appendHtml("\n<body>\n<h1>\${title}</h1>\n<p><a href=\"menu.cgi\">Menu</a></p>\n");
  $cgi->setValue('title', 'Home directory');
  $cgi->replace('css', '/css/default.css');
  $cgi->replace('script', '');
  $cgi->replace('jquery', '/js/jquery-1.6.1.min.js');


  if ($auth->verify($userid, $password) == 0) {
    $cgi->appendHtml('<div style="color:red">認証エラー</div>');
  }
  else {
    makeContent($userid);
  }

  $cgi->append('views/foot.phtm');
  $cgi->respond();
}

# Start
main();



cgilog.cgi (Logger.pmで出力したログの表示)

次のサンプルは、Logger.pmを使って出力したログの内容を表示する。

#!/usr/bin/perl

# cgilog.cgi CGIログの表示
require 'CommonCGI.pm';
require 'AuthUser.pm';
require 'Logger.pm';

use constant TEMPL => 'views/simple.phtm';
use constant TITLE => 'CGIログ';
use constant CSS => '/css/default.css';

Logger::write_t('cgilog.cgi');

our $cgi = CommonCGI->new;
our $auth = AuthUser->new;


#
#  HTMLを表示する。
#  ===============
sub makeHtml {
  my $content = shift;
  $cgi->readHtml(TEMPL);
  $cgi->replace('header', $cgi->htmlHeader());
  $cgi->setValue('title', TITLE);
  $cgi->setValue('css', CSS);
  $cgi->replace('script', '');
  $cgi->replace('content', $cgi->tag('pre', $content, 
    $cgi->style({'padding'=>'5px', 'border'=>'dotted 1px navy'})));
}


#
#  メインプログラム
#  ================
sub main {
  my $userid = $cgi->getCookie('userid');
  my $password = $cgi->getCookie('password');

  if ($auth->verify($userid, $password) == 0) {
    $cgi->setValue('content', "認証エラー");
  }
  else {
    my $command = 'tail /var/tmp/ccgi.log';
    my $str = qx/$command/;
    if ($?) {
      $cgi->setValue('content', "Error: The command returned non zero.");
    }
    else {
      makeHtml($str);
    }
  }
  $cgi->respond();
}

# Start up
main;


 

HTMLテンプレート

 外部のファイルから読み込んだ文字列またはヒアドキュメントをHTMLテンプレートとして使用できる。その場合、プレーウショルダとして次の形式の文字列を認識する。これらは、メソッド setValue, replace, include で他の文字列に置換できる。


(サンプル)
${header}
<html>
<!-- simple.phtm -->
<!--    header  HTMLヘッダー -->
<!--    title   タイトル -->
<!--    css     CSSファイル -->
<!--    jquery  jQueryファイル -->
<!--    script  JavaScriptソース -->
<!--    content bodyの内容 -->
<head>
<http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>${title}</title>
<link rel="stylesheet" type="text/css" href="${css}" />
<script type="text/javascript" src="${jquery}"></script>
<script type="text/javascript">
${script}
</script>
</head>

<body>
<h2>${title}</h2>
<p><a href="/cgi-bin/menu.cgi">Menu</a> | <a href="/cgi-bin/login.cgi">Login</a></p>
<p>
${content}
</p>
<p> </p>
<body>
</html>

 モジュールの詳細   ダウンロード    このページのトップへ