Linux 設定日記

設定したことを忘れないように書いてあります。

2005.10.09
Vine Linuxを3.2にする

Vine Linuxを3.2にする。 この自体の作業は、/etc/apt/sources.lixtの3.1を3.2にするだけなので簡単だが、今回kernelもアップデートが必要となる。

Raidにしているため、Kernelの最作成作業が必要なので、いつもの通りmkkpkgで作成する。

が、今回うっかり、/dev/hda /dev/hdcに別々に書き込まなければいけないところを/dev/md0に対して書き込んでリブートしてしまった。

当然立ち上がらず。KNOPPIXで立ち上げ、/dev/hda2(root) と/dev/hda1(boot)を/mnt配下にmountして、chrootしlilo -v -C /etc/lilo.conf.hdaを実行。復旧する。

2005.05.22
Affelioをインストールする

Affelioをインストールするために動作条件として指定されている

Perl version.5.005以上 
CGI 
DBI 
DBD::SQLite 
Crypt::DH

をインストールしようとしたら、Crypt::DHがインストールできない。 Crypt::DHをインストールするためには、Crypt::RandomとMath::Pariがインストールされている必要があり、 さらにMath::Pariをインストールするためには、PARI/GPのライブラリがインストールされている必要があるためだ。

で、PARI/GPのrpmファイルをVine Linuxで探すが無い。 仕方ないので、またRPMファイルを作成するためのspecファイルを作成することにした。 makeファイルを見ると、DESTDIRの指定ができるので、make -e DESTDIR=$RPM_ROOT_DIRを書くだけで対応できた。

で、一通り環境は揃ったので、Affelioをダウンロード、展開。 指示に従って設定をする。また、apacheの設定として、cgiを実行できる様にする。

<VirtualHost *:8881>
    ServerAdmin     webmaster@your.domain
    DocumentRoot    /home/affelio/
    Servername      affelio.****.jp

    # logs
    CustomLog   logs/affelio-access_log combined
    ErrorLog    logs/affelio-error_log
    <Directory  /home/ncax-affelio/ >
        Options MultiViews Indexes SymLinksIfOwnerMatch ExecCGI
        AddHandler      cgi-script .cgi
        DirectoryIndex  index.html index.cgi
    </Directory>
</VirtualHost>

setup.cgiが無事完了したので実行してみると、Premature end of script headers: index.cgiのエラーがでて動作しない。 改行コードの問題かと、いろいろ変換してみたが動作は変わらず。 しかたないので、コンソールからいきなりindex.cgiを起動してみると、CGI::Sessionが見つからないと出る。 perl -MCPAN -e shellからinstall CGI::Sessionを実行、インストールしたら無事起動する様になった。 インストールドキュメントにあったCGIだけでは、CGI::Sessionはインストールされない様だ。

が、期待したのとは違うものだった。アカウント = サーバーなのね。てっきりサーバーは分散だけどアカウントは複数もてるものだと思った。 これでは普通のひとに勧めるのはつらいなぁ

2005.05.17
MHonArcをHack

標準添付のmhexternal(m2h_external::filter;)では、mimeエンコードの結果複数行になってしまったファイル名が正しく扱えない。 具体的には、\r\nが_(アンダースコア)にされてしまう。 MIMEArgsでusenameextを使用していない場合は、コンテンツタイプを見て拡張子をつけるので問題ないが、 textやtext/html以外のコンテンツはすべてoctet-streamとしてしまうメーラーが結構多いので、usenameextを使用しつつこの問題を回避するためのパッチ。

また、2.6.8ではusenameextが有効だったのに、2.6.10では有効にならないため、その修正も入れている。 本来必要なのかはよく分からないがとりあえずの対処ではある。

2.6.8では$inext変数がwrite_attachment関数に引き渡されていたが、2.6.10では$ext変数を引き渡している。 調べたかぎりでは、$ext変数に値を入れている所がないため、$inextを作っているusenameextの処理中で、$inextを$extに複写している。

以下のパッチを使用する場合は、/usr/lib/MHonArc/mhexternal.plをコピーしてmhexternal-ex.plを作成し、パッチを当てる。

*** mhexternal.pl       2004-05-17 14:47:18.000000000 +0900
--- mhexternal-ex.pl    2005-05-17 20:33:31.000000000 +0900
***************
*** 37,43 ****
  ##    02111-1307, USA
  ##---------------------------------------------------------------------------##
  
! package m2h_external;
  
  ##---------------------------------------------------------------------------
  ##    Filter routine.
--- 37,43 ----
  ##    02111-1307, USA
  ##---------------------------------------------------------------------------##
  
! package m2h_external_ex;
  
  ##---------------------------------------------------------------------------
  ##    Filter routine.
***************
*** 175,180 ****
--- 175,182 ----
      ## Check if utilizing extension from mail header defined filename
      if ($dispext && $usenameext) {
        $inext = $1;
+       $inext =~ s/_//g;
+       $ext = $inext;
      }
  
      ## Check if inlining (images only)

また、ファイルを単純に展開するだけでなく、添付ファイルのみ圧縮して保管するためにもフィルタを追加作成した。 MHonArcは標準で<GZIPFILES>というリソースを用意しているが、このリソースはHTMLファイルも圧縮してしまう。 ブラウザによってはダウンロードしたいときも表示してしまうなどの不都合が発生する場合もあるので、添付ファイルのみを圧縮するようにした。

このフィルタも同様に、/usr/lib/MHonArc/mhexternal.plをコピーしてmhexternal-zip.plを作成し、パッチを当てる。

*** mhexternal.pl       2004-05-17 14:47:18.000000000 +0900
--- mhexternal-zip.pl   2005-05-17 20:29:32.000000000 +0900
***************
*** 37,43 ****
  ##    02111-1307, USA
  ##---------------------------------------------------------------------------##
  
! package m2h_external;
  
  ##---------------------------------------------------------------------------
  ##    Filter routine.
--- 37,43 ----
  ##    02111-1307, USA
  ##---------------------------------------------------------------------------##
  
! package m2h_external_zip;
  
  ##---------------------------------------------------------------------------
  ##    Filter routine.
***************
*** 175,180 ****
--- 175,182 ----
      ## Check if utilizing extension from mail header defined filename
      if ($dispext && $usenameext) {
        $inext = $1;
+       $inext =~ s/_//g;
+       $ext = $inext;
      }
  
      ## Check if inlining (images only)
***************
*** 202,208 ****
  
      ## Write file
      ($filename, $urlfile) =
!       mhonarc::write_attachment($ctype, $data, {
          '-dirpath'  => $path,
          '-filename' => $name,
          '-ext'      => $ext,
--- 204,210 ----
  
      ## Write file
      ($filename, $urlfile) =
!       mhonarc::zip_write_attachment($ctype, $data, {
          '-dirpath'  => $path,
          '-filename' => $name,
          '-ext'      => $ext,

mhexternal-ex.plよりさらに変更したのは、添付ファイルの書き込み時に呼び出す関数。 従来は、write_attachment関数でファイルを作成するところをzip_write_attachment関数としている。

write_attachment関数は、mhmimetypes.plに含まれているため、圧縮書込みの関数zip_write_attachmentもそちらに追加する。 関数の内容はほぼ同じものだが、zip化して書き込むようにすることと、extentionはzipファイルには.zipをつけ、zipファイル中のファイルはそのままとする。

*** /var/tmp/verroot/usr/lib/MHonArc/mhmimetypes.pl     2004-05-17 14:47:18.000000000 +0900
--- mhmimetypes.pl      2005-05-17 20:31:28.000000000 +0900
***************
*** 329,335 ****
      }
  
      ## Write to random file first
!     my($fh, $tmpfile) = file_temp($ext.'XXXXXXXXXX', $pathname, '.'.$ext);
      binmode($fh);
      print $fh $$sref;
      close($fh);
--- 329,335 ----
      }
  
      ## Write to random file first
!     my($fh, $tmpfile) = file_temp($ext.'_XXXXXXXXXX', $pathname, '.'.$ext);
      binmode($fh);
      print $fh $$sref;
      close($fh);
***************
*** 358,363 ****
--- 358,446 ----
      ($pathname, $url);
  }
  
+ 
+ ##---------------------------------------------------------------------------
+ ##    zip_write_attachment(): Write & Compress data to a file with a given content-type.
+ ##    Function can be used by content-type filters for writing data
+ ##    to a file.
+ ##
+ sub zip_write_attachment {
+     use Archive::Zip;
+     my $content       = lc shift;   # Content-type
+     my $sref  = shift;      # Reference to data
+     my $opt   = ref($_[0]) ? shift : +{ @_ };
+ 
+     my $path   = $opt->{'-dirpath'}  || '';
+     my $fname    = $opt->{'-filename'} || '';
+     my $inext    = $opt->{'-ext'}      || '';
+     my $url    = $opt->{'-url'}      || $AttachmentUrl || '';
+ 
+     my $pathname   = $AttachmentDir;
+     my $rel_outdir = 0;
+     if (!$pathname) {
+       $pathname = $OUTDIR;
+       $rel_outdir = 1;
+     }
+ 
+     my $ctype  = 'application/octet-stream';
+     if ($content =~ m%^\s*([\w\-\./]+)%) {
+       $ctype = $1;
+     }
+     
+     if ($path) {
+       if (OSis_absolute_path($path)) {
+           $pathname   = $path;
+           $rel_outdir = 0;
+       } else {
+           $pathname .= $DIRSEP . $path;
+           $url .= '/' if ($url); $url .= urlize_file_path($path);
+       }
+     }
+     dir_create($pathname);
+ 
+     my $ext;
+     if (!$fname) {
+        $pre = $inext || (get_mime_ext($ctype))[0];                                # 拡張子をプレフィックスにする。
+        $ext = 'zip';                                                          # ファイルの拡張子はzip
+     } else {
+        # Convert invalid characters in filename to underscores
+        $fname =~ tr/\0-\40\t\n\r?:\57\134*"'<>|\177-\377/_/;
+     }
+
+     ## Write to random file first
+     my($fh, $tmpfile) = file_temp($pre.'_XXXXXXXXXX', $pathname, '.'.$ext);   # プレフィックス、エクステンションを指定。
+     my $zip = Archive::Zip->new();                                                # Zip形式をオープン
+     my $oname = basename($tmpfile);                                           # Zip中のファイル名は、tempファイルのファイル名。
+     $oname =~ s/$ext$/$pre/;                                                  #    ただし拡張子は変更。
+     my $member = $zip->addString($$sref, $oname);                             #
+     $member->desiredCompressionLevel(6);                                      # デフォルト値のはずだが指定しないと圧縮されない。
+     my $status = $zip->writeToFileHandle($fh);                                    # ファイルハンドルを指定してzip書込。
+     close($fh);
+ 
+     ## Set pathname for file
+     if ($fname) {
+       # need to rename to desired filename
+       $pathname .= $DIRSEP . $fname;
+       if (!rename($tmpfile, $pathname)) {
+           die qq/ERROR: Unable to rename "$tmpfile" to "$pathname": $!\n/;
+       }
+     } else {
+       # just use random filename
+       $pathname = $tmpfile;
+       $fname    = basename($tmpfile);
+     }
+     $url .= '/' if ($url); $url .= urlize_file_path($fname);
+     file_chmod($pathname);
+ 
+     if ($rel_outdir) {
+       $pathname  = $path;
+       $pathname .= $DIRSEP if ($pathname);
+       $pathname .= $fname;
+       $url       = join('/', $OUTDIR, $url)  if $SINGLE;
+     }
+     ($pathname, $url);
+ }
+ 
  ##---------------------------------------------------------------------------
  ##    Convert a filesystem path into a URL path.
  ##

で上記のパッチを利用するように、mhonarcのリソースファイルを以下のように作成した。

<MIMEFilters>
application/octet-stream;       m2h_external_ex::filter;       mhexternal-ex.pl
application/ms-excel;   m2h_external_zip::filter;       mhexternal-zip.pl
application/msexcel;    m2h_external_zip::filter;       mhexternal-zip.pl
application/vnd.msword; m2h_external_zip::filter;       mhexternal-zip.pl
application/vnd.ms-excel;       m2h_external_zip::filter;       mhexternal-zip.pl
application/vnd.ms-word;        m2h_external_zip::filter;       mhexternal-zip.pl
application/vnd.ms-powerpoint;  m2h_external_zip::filter;       mhexternal-zip.pl
application/pdf;        m2h_external_ex::filter;       mhexternal-ex.pl
application/vnd.x-lha;  m2h_external_ex::filter;       mhexternal-ex.pl
application/vnd.x-zip-compressed;       m2h_external_ex::filter;       mhexternal-ex.pl
</MIMEFilters>

<MIMEARGS>
text/plain:default=iso-2022-jp
m2h_external_ex::filter; usenameext useicon
m2h_external_zip::filter; usenameext useicon
</MIMEARGS>

application/*excelの様な表記が有効でないようなので、ずらずらと並べている。