## Linux で CAP を使う mini-HOWTO

誠司
衛藤

    seto@slip.net

１９９７年５月１２日

CAP とは、The Columbia AppleTalk Package の略称で、一言で言う と Unix Box にマックの通信プロトコルである AppleTalk を理解さ せるソフトウェアである。

## 免責

この文書の内容は、正しい手順の作業の上でのみ信頼できるものにな ると思われるが、この文書の内容に起因する損害が出たとしてもその 責任は、著者にはないということを承諾しておいていただきたい。

## CAP とは？

CAP とは、The Columbia AppleTalk Package の略称で、一言で言う と Unix Box にマックの通信プロトコルである AppleTalk を理解さ せるソフトウェアである。また名前からも分かるように、このソフト ウェアは、コロンビア大学によって開発されたものである。それでこ のパッケージを使って何ができるのかというと、まずマックのための ファイル・サーバの構築、AppleTalk を使ったプリンタ・サーバの構 築、マック・ワークステーションとのインタラクティブな通信、Post Script プリンタへのプリント・ジョブの送信、そして PostScript プ リンタとのインタラクティブな通信などがある。個人的に筆者は、プ リンタとの双方向でのやりとりができるという点で、最後の Post Script プリンタとのインタラクティブな通信というのに非常に旨味 を感じる。

## ソースの取得とコンパイル

あいにく CAP は、バイナリでの配布は行われていないため、各自ソ ースをダウンロードし、コンパイルしなければならない。CAP のソー スは、様々なサイトから FTP を使ってダウンロードできる。次に示 すサイトは、ほんの一例にすぎない：

       ftp://munnari.OZ.AU/mac
       ftp://gatekeeper.DEC.COM/pub/net/appletalk/cap
       ftp://ftp.kuis.kyoto-u.AC.JP/net/cap
       ftp://ftp.crl.go.jp/archives/mac/kdd-mac/Network/cap60

まず、上記のサイトから `cap60.plNNN.tar.Z` を取得し、解凍する:

       # compress -d cap60.plNNN.tar.Z
       # tar xf cap60.plNNN.tar

現在 `cap60.patch198` までのパッチが出ているので、 それらを使ってパッチレベルを上げる。個々のパッチについては、cap60 の 再上位のディレクトリで：

       # patch -p < cap60.patchNNN

とするのだが、CAP には、前にも述べたように非常にたくさんのパッ チが出ているため、次のようなスクリプトで対応する：

       #!/bin/zsh
       setopt numeric_glob_sort
       for i in cap60.patches/cap60.patch*
       patch -p < $i >>& /tmp/patches

さらに Linux 用パッチ `linux.iptalk.patch` を当てる。 これでコンパイルできる状態になったはずだ。まず

       # ./Configure

として独自のシステムの環境に合わせる。ここでは、プログラムがいろ いろと聞いてくるが、デフォルトのままで大丈夫のようだ。次に以下の コマンドで、各ディレクトリ毎の `Makefile` を作る：

       # ./gen.makes

さらに

       # make include

でヘッダファイルをインストールする。そして

       # make libsmade

とし、CAP 用ライブラリの生成に取り掛かる。それが終ったら本題の CAP 各種プログラムのコンパイルだ。

       # make programs

一応何もなければ、すんなりとコンパイルしてくれるはずだ。最後に

       # make install

とし、各種プログラムをインストールする。すると `/usr/local/cap` というディレクトリに make で作られたプログラム群が置かれる。ま た IPTalk を使用する場合には、`/etc/servives` に NIC の設定に対する次のエントリを忘れずに行なっておこう：

      at-rtmp   201/udp
      at-nbp    202/udp
      at-echo   204/udp
      at-zis    206/udp

## CAP のコンポーネント

次に筆者の CAP のディレクトリを紹介しよう。

      /usr/local/cap
      ./          ash         atlooklws   capd        iwpr        papof*
      ../         atis        atpinger    getzones    lwpr        papstatus
      .banner     atistest    aufs        instappl    ntxjif*     rc.cap*
      afpvols     atlook      canonif*    isrv        papif*      tlw

### 注意

* 印の付いていないファイルは、`make install` をした後に 自動的に置かれるもので、* 印の付いたファイルは後からコンパイルし、持 ってきたもの、あるいは自分で作成したものである。

以下は、各々のファイルについての説明である：

      .banner   ... バナー・ファイル。
      afpvaols* ... aufs を起動する際に使うコンフィギュレーション・ファイル。
      ash       ... AppleShare サーバーへのログインや対話的な通信を可能にす
                    るプログラム。
      atis      ... AppleTalk Information Server の略で、AppleTalk での通信
                    を可能にする。
      atistest  ... atis が正常に動いているかどうかを検証するプログラム。
      atlook    ... ゾーン内でのサービスを一覧表示するプログラム。
      atlooklws ... ゾーン内での LaserWriter を一覧表示するプログラム。
      atpinger  ... ゾーン内のサービスに対して ping を行ない、それらのサービ
                    スの状態を調べるプログラム。
      aufs*     ... AppleTalk file protocol UNIX File Server。AppleShare サー
                    バーを構築するプログラム。
      canonif*  ... 任意のプリンタに対するフィルタ。
      capd      ... CAP デーモン。各機器の物理的アドレスをインタプリットする。
      getzones  ... アクセスできるゾーンを一覧表示するプログラム。
      instappl  ... アプリケーションをインストールする際に使われるらしいのだ
                    が、筆者は、使用したことがないので分からない。
      isrv      ... printcap に登録されているプリンタに対して印刷物を出力する
                    際に用いるコマンド。
      iwpr      ... printcap に登録されていないプリンタに対して印刷物を出力す
                    る際に用いるコマンド。
      ntxjif*   ... 任意のプリンタに対するフィルタ。
      papif*    ... LaserWriter プリンタ用入力／通信フィルタ。
      papof*    ... LaserWriter プリンタ用出力／バナー・フィルタ。
      papstatus ... プリンタの印刷状態を見るプログラムらしいのだが、筆者には、
                    使用方法が分からない。
      rc.cap*   ... CAP を起動する際に用いるスクリプト。
      tlw       ... 特定の LaserWriter にアクセスし、PostScript インタプリタ
                    を起動することのできるプログラム。

なお前述のように 一連の `make` だけでは、`aufs、papif、papof` などのプログラムやフィルタは、コンパイル、 インストールしてくれないので、後に自ら CAP60 の再上位ディレクトリ `/applications` の下の `aufs` や `papif` のディレクトリの中で、各プログラムをコンパイルして `/usr/local/cap` のディレクトリにそれらのファイルを 持って来なければならない。

## CAP の起動

CAP の起動は、手動で行なってもよいのだが、以下のようなスクリプトで起動 させると便利である。

`/etc/rc.d/rc.local` に次のようなステートメントを加える:

      #
      # start AppleShare server
      #
      if &lsqb; -f /usr/local/cap/rc.cap &rsqb;; then
          /usr/local/cap/rc.cap
      fi
      #----End of /etc/rc.d/rc.local----

# `/usr/local/cap/rc.cap` :

      #!/bin/sh

      echo "CAP server starting."
      /usr/local/cap/capd eth0 "hogehoge zone"
      /usr/local/cap/atis
      /usr/local/cap/aufs -l /var/log/aufs.log -n `hostname` \
      		-U 10 -G guest -V /usr/local/cap/afpvols
      #----End of /usr/local/cap/rc.cap----

CAP デーモンを起動させる `capd` コマンドは、第一引数に ネットワーク・インターフェースのデバイス名、第二引数は、CAP を動かしたい ゾーン名を指定する。 この場合、ネットワーク・インターフェースに対するデバイス名は、`eth0`、ゾーン名は、`hogehoge zone` となっているが、 各自の環境に合わせて変えてい ただきたい。なおゾーン名の中にスペースが入っている場合は、上記のように " （ダブル・クォーテーション）で囲んで記述する。プロンプトが返ってきた ら、成功ということである。さらにこのコマンドを発行すると /etc のディレ クトリに `etalk.local` という EtherTalk のダイナミック・ コンフィギュレーション・ファイルができる。これも成功の目安にする。

`etalk.local` ファイルの例：

      #
      # EtherTalk dynamic configuration data
      #
      # Last update:  Tue Apr 29 18:20:44 1997
      #
      # Generated by Kernel AppleTalk
      #
      interface       "eth0"
      netRangeStart   15.160
      netRangeEnd     15.160
      thisNet         15.160
      thisNode        52
      thisZone        "hogehoge zone"
      bridgeNet       15.160
      bridgeNode      167
      bridgeIP        127.0.0.1
      nisNet          15.160
      nisNode         52
      asyncNet         0.00
      asyncZone       ""
      # ----End of etalk.local----

なお `/usr/local/cap/rc.cap` ファイルの中の `aufs` コマンドについては、後述の 「ファイル・サーバの構築」 の項で説明する。次に atis が、正常に動いているかどうかを `atistest` というコマンドを使って検証する。次のような出力があれば、正常に 動いているということだ。

      # atistest
      CAP distribution 6.00 using Kernel Based EtherTalk encapsulation,
      June 1996 Copyright (c) 1986,1987,1988 by The Trustees of Columbia
      University in the City of New York

      abInit: &lsqb;ddp:  15.160, 136&rsqb;, &lsqb;GW:  15.160, 165&rsqb; starting
      debugging NBP
      Registering "atis test:testing@*"
      NBP SndNBP: sending
      NBP nbp_timeout: 4 tick timeout on -1073743660, 3 remain
      NBP SndNBP: sending
      NBP nbp_timeout: 4 tick timeout on -1073743660, 2 remain
      NBP SndNBP: sending
      NBP nbp_timeout: 4 tick timeout on -1073743660, 1 remain
      NBP SndNBP: sending
      NBP nbp_timeout: 4 tick timeout on -1073743660, 0 remain
      NBP SndNBP: sending
      NBP status done: found -1073743660
      Okay

さてこれで各種 CAP プログラムを走らせるためのお膳立てができ た訳だ。

## ファイル・サーバの構築

今度は、マック用ファイル・サーバの構築である。これを行なうには、 `aufs` というコマンドを用いる。

      # aufs -l /var/log/aufs.log -n `hostname` -U 10 -G guest \
    	  -V /usr/local/cap/afpvols

`aufs` には、20程のコマンド・オプションがあるが、普通使う のは、上記のステートメントの中で使っているものぐらいであろう。以下に各オプ ションについての説明を示す：

      -l ... ログ・ファイル名を指定する（デフォルトは<servername>.log ）
      -n ... サーバ名を指定する。デフォルトは、<hostname> Aufs。
      -U ... 一度に行なえるセッションの数を指定する。
      -G ... ゲスト・ログインを許可する。この場合、サーバ側に
             guest アカウントが必要である。
      -V ... アクセスするボリュームを記述しておくファイル名を指定
             する。

afpvols ファイルの例：

      #
      # This is an example of Apple Filing Protocol Volume file.
      #
      # Format:
      #  path:volume name&lsqb;:password&rsqb;&lsqb;:&rsqb;
      #

      /home/guest:Guest::
      /home/seiji:Seiji:xxxxx:
      # ---- End of afpvols ----

AppleShare サーバが立ち上がるとマックの「セレクタ・ダイアロ グ」の「ファイルサーバの選択」のリスト・ボックスにサーバ名が 現れるはずである。

## プリンタ・サーバの構築

さて今度は、プリンタ・サーバの構築である。これは、CAP と lpd の組み合わせで、ゾーン内の AppleTalk で繋がっている PostScript プリンタに自由にプリント・ジョブを送るというものである。さら に lpd のリモート機能を使えば、CAP がインストールされていない Unix Box からでも、CAP がインストールされている Linux Box 経由 でプリント・ジョブを PostScript プリンタに送ることができる。ま ず最初に `atlooklws` というコマンドで特定のゾーン の中で使用できる PostScript プリンタを一覧表示させてみよう。 以下のような出力が得られるはずだ。

      # atlooklws "hogehoge zone"

      abInit: &lsqb;ddp:  15.160, 228&rsqb;, &lsqb;GW:  15.160, 167&rsqb; starting
      Looking for =:LaserWriter@SJ TW 8 ...
        1 - ATM Dev IIg:LaserWriter@*                &lsqb;Net: 15.161 Node: 83 Skt:191&rsqb;
      ---status: idle
      Address confirmed for socket 191
        2 - Apple LaserWriter IINTX_J:LaserWriter@*  &lsqb;Net: 15.161 Node:221 Skt:169&rsqb;
      ---status: idle
      Address confirmed for socket 169
        3 - Canon Lasershot B406GII_J:LaserWriter@*  &lsqb;Net: 15.161 Node:202 Skt:128&rsqb;
      ---status: idle
      Address confirmed for socket 128
        4 - Centaur (fonts LWII-NTX):LaserWriter@*   &lsqb;Net: 15.161 Node:153 Skt:234&rsqb;
      ---status: idle
      Address confirmed for socket 234
        5 - Cheque:LaserWriter@*                     &lsqb;Net: 15.161 Node:167 Skt:191&rsqb;
      ---status: idle
      Address confirmed for socket 191
        6 - EPSON LP-8200PS2:LaserWriter@*           &lsqb;Net: 15.161 Node:172 Skt:128&rsqb;
      ---status: idle

今度は、特定のプリンタにアクセスして、PostScript インタプリタを 起動させてみよう。それは、`tlw` というコマンドで行なう。

      # tlw "Canon Lasershot B406GII_J:LaserWriter@*"
      abInit: &lsqb;ddp:  15.160, 228&rsqb;, &lsqb;GW:  15.160, 167&rsqb; starting
      Starting session with Canon Lasershot B406GII_J:LaserWriter@*
      %no status
      status: idle

      Okay
      PostScript(r) Version 2013.115
      (c) Copyright 1984-1994 Adobe Systems Incorporated.
      Typefaces (c) Copyright 1981 Linotype-Hell AG and/or its subsidiaries.
      All Rights Reserved.
      PS> showpage

次にこのプリンタに何か PS ファイルを送り、プリントしてみる。

      # lwpr -p "Canon Lasershot B406GII_J:LaserWriter@*" temp.ps
      abInit: &lsqb;ddp:  15.160, 228&rsqb;, &lsqb;GW:  15.160, 167&rsqb; starting
      Status: status: idle
      status: idle
      Sending temp.ps

これで印刷が可能かどうか分かったら、次に lpd と連係して PostScript プリンタに AppleTalk を介してプリント・ジョブを送り、印刷させるた めの設定に入る。まず、`/etc` ディレクトリに `cap.printers` というゾーン内の PostScript プリンタ の名前を定義するファイルを以下のようにして作る。

      #
      # /etc/cap.printers
      #

      ntxj=Apple LaserWriter IINTX_J:LaserWriter@*
      canon=Canon Lasershot B406GII_J:LaserWriter@*
      # ---- End of /etc/cap.printers ----

次に `printcap` を環境に合わせて編集する。

      # /etc/printcap
      #
      # Please don't edit this file directly unless you know what you are doing!
      # Be warned that the control-panel printtool requires a very strict format!
      # Look at the printcap(5) man page for more info.
      #
      # This file can be edited with the printtool in the control-panel.

      ##PRINTTOOL## LOCAL PostScript 300x300 a4 1
      lp:\
              :sd=/var/spool/lpd/lp:\
              :lp=/dev/lp1:\
              :sh:\
              :mx#0:\
              :if=/var/spool/lpd/lp/filter:

      ## Remote PostScript Canon Laser Shot B-406G II
      lp|canon|Canon Lasershot B406GII_J:\
              :lp=/dev/canon:\
              :sd=/var/spool/lpd/canon:\
              :pl#72:pw#85:\
              :sf:\
              :mx#0:\
              :lf=/var/spool/lpd/canon/canon-lpd-errs:\
              :af=/var/spool/lpd/canon/canon-lpd-acct:\
              :if=/usr/local/cap/canonif:\
              :of=/usr/local/cap/papof:
      # ---- End of /etc/printcap ----

次に特定のプリンタに対するデバイス・ポートを作る。

      # touch /dev/canon
      # chmod 660 /dev/canon

次は、特定のプリンタに対するスプール・ディレクトリやバナー ・ファイルを作る。

      # mkdir /var/spool/lpd
      # mkdir /var/spool/lpd/canon
      # touch /var/spool/lpd/canon/.banner
      # chmod daemon.daemon /var/spool/lpd/canon/.banner

続いてログ・ファイルの作成である。

      # touch /var/spool/lpd/canon/canon-lpd-errs
      # touch /var/spool/lpd/canon/canon-lpd-acct

最後に特定のプリンタのためのフィルター・ファイルを以下のように して作る。

      #!/bin/sh
      # canonif - CAP Input filter for Canon Laser Shot B-406G II

      /usr/local/cap/papif -P canon $*
      # ---- End of /usr/local/cap/canonif ----

プリント・コマンドは、以下の通り：

      # lpr -Pcanon hogehoge.ps

さて次に CAP がインストールされていない Unix Box (hogehoge2)から CAP がインストールされてある Linux Box (hogehoge1)経由でプリント ・ジョブを `printcap` に登録してあるプリンタに 送るための設定方法について記す。まず CAP がインストールされてある Linux Box の `/etc` ディレクトリに `hosts.lpd` というファイルを以下のように作る。

      # hosts.lpd
      hogehoge2

さらに CAP がインストールされていない Unix Box の `printcap` を lpd のリモート機能が使えるように次のように設定する。

      # CAP がインストールされていない Unix Box の printcap
      lp|canon|:lp=:rm=hogehoge1:rp=canon:

こうすることで、hogehoge2 から次のコマンドで hogehoge1 にプリン ト・ジョブを送ることができる。

      # lpr -Pcanon hogehoge.ps

## 最後に

これで CAP に関する全ての説明が終った。CAP をコンパイルし、導入 してみての感想は、Linux Box とマックや PostScript プリンタとの コミュニケーションが意外に簡単にできてしまったということだ。ま た１つのパッケージでこんなに数多くのことができてしまうというこ とは、少し驚きでもあるが、とても素晴らしいことだと思う。また何 だか得をしたようにも思う。このパッケージを使って様々なアプリケ ーションの開発へと発展していくのだろう。そういう意味で CAP とい うソフトウェアは、非常に優れたソフトウェアであると言えよう。

## 参考文献

      1. CAP パッケージの README。
      2. CAP60/doc の中のドキュメント類。
      3. UNIX USER 1994 No. 10 「LaserWriter への出力のみならずも UNIX
         上で AppleShare サーバーも実現する CAP ファミリー」
         熊野 善康著、 ソフトバンク