Cobalt パッケージ(.pkg)をつくってみよう!

2003/07/05 たちばなまさし


目次

■Cobalt パッケージ(.pkg)とは

■Cobat パッケージの構成

■オリジナルパッケージの作成

■補足


■Cobalt パッケージ(.pkg)とは

Cobalt製品は、Webブラウザから製品の管理画面を参照し、そこからネットワークやユーザアカウントなどの各種設定が行なえます。このような製品は最近では珍しくありませんが、データのバックアップや製品のセキュリティパッチのインストールなど、サーバ運営で必要な項目すべてをWebブラウザからの操作で完結できるようにした製品はCobalt がおそらく最初でしょう。現在でこそ同等のことが可能な製品は数多くありますが、管理画面の使いやすさ、操作の分かり易さの点では、他の製品と大きな差をつけているように思います。

Cobalt 製品は、初代 Cobalt 製品(Cobalt Qube2700)から、Webブラウザからのソフトウェアのインストールをサポートしていました。これによりユーザは、たとえサーバ管理やソフトウェアなどに関する専門的な知識がなくても、簡単にソフトウェアのインストールが行なえます。この目的は、1つにはセキュリティパッチの適用に関するユーザの負担を軽減する(敷居を下げる)ことでしたが、もう1つ、サードパーティの開発者への門戸を開いたという重要な側面がありました。

外部な開発者は、Cobalt のパッケージ形式に準拠したかたちでパッケージングし直すだけで、ユーザに(Microsoft Windows の「ソフトウェアの追加と削除」と同じように)統一的かつ簡単な方法でインストールできるかたちでソフトウェアを配布できるのです。またこのパッケージは、インストール時に稼動可能なサーバプラットフォームやパッケージ間の依存関係などを調べることができます。こうした特長により、ユーザはインストール方法に迷うことなく安心してソフトウェアをインストールできるようになります。また外部のソフトウェアベンダは、このパッケージ形式を積極的に使うことにより、提供したソフトウェアのユーザサポートを軽減できる可能性があります※1

また、Cobalt Qube3 以降の製品では、BlueLinQ というソフトウェアの自動インストールの仕組みが提供されました。これは、Microsoft Windows の “Windows Update”と似たようなものですが、使用できるソフトウェア(セキュリティパッチやサードパーティのアプリケーションなど)のリストを自動的に特定のサイト(Sun が運営する BlueLinQサーバ)から取得する、というものです。従来機種では Sun のダウンロードサイトからパッチが出ているか確認して、指示された順番どおりにインストールする必要があったのですが、この手順をほぼ自動でやってくれるようになりました。サードパーティのソフトウェアについても同様のことがいえます。

なお、Cobalt Qube3 以降の製品では、Sausalito というフレームワークが導入され、管理画面のユーザインタフェースの非常に多くの部分が改良されました。パッケージのインストールの際の画面表示では、Webブラウザに常に進捗が表示されるように改善されました。これは、インストールに時間がかかるような大きなソフトウェアのインストール時に非常に有効なものです。また、インストールの準備が整った時点でパッケージの内容が表示されるようになったため、ユーザは「インストール後に再起動が必要」などという情報を見た後でインストールをキャンセルする、といったことが可能になりました。

※1 実際には、Cobalt のパッケージ形式を使用してソフトウェアを提供するソフトハウスはあまり多くありませんでした。この原因はおそらく、Cobalt 製品が SOHO などの市場よりも(エンジニアがたくさんいる)ISP などの市場により多く出荷されたために、Cobalt 独自のパッケージを作成して提供することのメリットがあまりなかったためでしょう。

■Cobat パッケージの構成

Cobalt のパッケージは、RPM パッケージやインストールスクリプトを tar.gz 形式で圧縮したものです。なお、Sun Cobalt 純正パッケージは、これに gpg による署名が加えられています※2

ここでは、Cobalt Qube3 以降の機種(Cobalt Qube3、RaQ XTR/550)で採用されたパッケージ形式を取り上げ、例として簡単なパッケージを作成してみることにします。

オリジナルパッケージの作成の前に、まずは既存のパッケージを展開して、中身を見てみましょう。
『【参考1】 パッケージの内容(Qube3-All-Security-4.0.1-16409.pkg の場合)』を参考に、てきとうなパッケージを展開してみてください。

【参考1】 パッケージの内容(Qube3-All-Security-4.0.1-16409.pkg の場合)
  • 署名の確認
gpg --verify Qube3-All-Security-4.0.1-16409.pkg
  • 展開
gpg --decrypt Qube3-All-Security-4.0.1-16409.pkg | tar zxvf -
以下のように内容が展開されます。
packing_list
pkginfo/
pkginfo/locale/
pkginfo/locale/zh_CN/
pkginfo/locale/zh_CN/generic.mo
pkginfo/locale/de/
pkginfo/locale/de/generic.mo
pkginfo/locale/es/
pkginfo/locale/es/generic.mo
pkginfo/locale/ja/
pkginfo/locale/ja/generic.mo
pkginfo/locale/fr/
pkginfo/locale/fr/generic.mo
pkginfo/locale/zh_TW/
pkginfo/locale/zh_TW/generic.mo
pkginfo/locale/en/
pkginfo/locale/en/generic.mo
RPMS/
RPMS/qpopper-3.0.2-C9stackguard.i386.rpm
scripts/
scripts/pre-install/
scripts/post-install/
参考)http://cobaltqube.org/faq/raq550-j.html
(11 July. 2002 はたやまさんからの情報)

RPMパッケージのほかに、インストールスクリプトらしいもの、アンインストールスクリプトらしいものなどが、ディレクトリ階層上に配置されていることが確認できると思います。

このディレクトリ階層は、【図1】のような構成になっています。

【図1】 Cobalt パッケージ(.pkg)の内部ディレクトリ構造
/
|-- packing_list ....... パッケージの基本情報を記述
|-- pkginfo/ ........... インストール時に画面に表示される情報など(.mo 形式)
| |--locale/ 
| | |-- en/ ............ (英語メッセージカタログ)
| | |-- jp/ ............ (日本語メッセージカタログ)
|-- scripts/ ........... インストール/アンインストール時に実行されるスクリプト
| |-- pre_install/ ..... (RPMパッケージをインストールする前に実行されるスクリプト)
| |-- post_install/ .... (RPMパッケージをインストールした後に実行されるスクリプト)
| |-- pre_uninstall/ ... (RPMパッケージをアンインストールする前に実行されるスクリプト)
| |-- post_uninstall/ .. (RPMパッケージをアンインストールした後に実行されるスクリプト)
|--RPMS/ ............... インストールするRPMパッケージ

パッケージ内で最も重要なのは packing_list ファイルです。
packing_list では、パッケージ名やバージョンなどのほか、各種メッセージやインストールするRPMファイルなど、パッケージのすべての基本情報が定義されています(【リスト1】)。

【リスト1】 packing_list ファイルの内容(Qube3-All-Security-4.0.1-16409.pkg)
[Package -- Version=1.0]
Vendor: Cobalt
VendorTag: [[Cobalt]]
Name: Security16409
NameTag: [[Security16409]]
Version: 1.0
Product: 4...WG
Product: 4...WGJ
Product: 4...WGJ-VML
PackageType: update
LongDesc: [[longDesc]]
ShortDesc: [[shortDesc]]
Copyright: [[copyright]]
Depend: Cobalt:OS >= 6.4

RPM: qpopper-3.0.2-C9stackguard.i386.rpm

[/Package]

packing_list ファイルの内容は、必ず [Package -- Version=1.0] で始まり [/Package] で終わります。その間の各行が実際の内容になります。行頭の“:”(コロン)で終わる文字列が設定項目で、この後に続く文字列が設定内容です。なお、空白行や先頭が“#”(シャープ)で始まる行は無視されます。
なお、依存性やRPMパッケージ名などの項目は複数指定できます。複数指定する場合には、複数行記入します。

packing_list ファイルで使用できる設定項目の主なものを、【リスト2】にまとめました。

【リスト2】 packing_list ファイルで使用できる主な設定項目
Vendor : ベンダ名(英数、アンダースコア、+記号のみ使用可)
VendorTag : ベンダ名(i18n)
Name : パッケージ名(英数、アンダースコア、+記号のみ使用可)
NameTag : パッケージ名(i18n)
Version : パッケージのバージョン
VersionTag : パッケージのバージョン(i18n)
Size : パッケージのサイズ(アップデートサーバで配信する場合のみ必要)
Category : パッケージのカテゴリ(英数、アンダースコア、+記号のみ使用可)
Location : パッケージをダウンロードできるURL
InfoURL : 追加情報として指定するURL
Product : インストール対象の製品名(正規表現使用可)
例)すべての Qube3 を対象とする場合は“4...WG.*”とする
PackageType : パッケージのタイプ(complete または update)
LongDesc : パッケージの長い説明(i18n)
ShortDesc : パッケージの短い説明(i18n)
Copyright : 著作権(i18n)
Depend : 依存性
例)ベンダ名:パッケージ名 >= バージョン
Options : uninstallable,refreshui,refreshcce
RPM : RPMパッケージ名

【リスト2】で“i18n”と記述されている項目は、“[[”および“]]”で囲い、メッセージIDを指定したものです。
ここで指定されたメッセージIDは、Webブラウザからのインストール時に、各言語用のメッセージと置き換えられて表示されます。各言語用のメッセージ(メッセージIDとの対応表)は、pkginfo 以下の所定のディレクトリ内で各言語ごとのファイルとして格納されている必要があります。

※2 Cobalt Qube3 より前の機種のパッケージでは、署名は行なわれていません。なお、パッケージの仕様が大きく異なりますので、旧パッケージの形式についてはここでは扱いません。

■オリジナルパッケージの作成

ここでは、例として sudo コマンドの Cobalt パッケージを作成します。
Cobalt Qube3Plus での、admin ユーザによる作業を前提として進めていきます。
なお、ここでのCobalt パッケージ作成例では、Vine Linux の RPM パッケージを流用させて頂くことにします。

  1. ソース(SRPM)パッケージの用意

    Vine Linux のホームページ http://www.vinelinux.org/ で、ダウンロード用の FTP ミラーサイトを調べます。次に、この FTP ミラーサイトの1つから、Vine Linux 2.6 の sudo コマンドの SRPM パッケージを取得します。

    wget ftp://ftp.jaist.ac.jp/os/linux/Vine/Vine-2.6/SRPMS/SRPMS/sudo-1.6.6-0vl3.src.rpm

     

  2. RPM パッケージの作成

    RPM パッケージの作成に関しては、Redhat 6.x の場合とほぼ同じ手順となります。
    root になり、以下のようにして rebuild を行ないます。

    rpm -i sudo-1.6.6-0vl3.src.rpm
    rpm -b /usr/src/redhat/SPECS/sudo.spec

    上記により、以下の場所にRPMパッケージが作成されます。

    /usr/src/redhat/RPMS/i386/sudo-1.6.6-0vl3.i386.rpm

     

  3. Cobalt パッケージ作成用ディレクトリの用意

    まず、パッケージに必要なディレクトリ階層を作成します。
    ここでは、ディレクトリ ~admin/sudo-pkg/ 内に作成することにします。

    mkdir ~admin/sudo-pkg
    cd ~admin/sudo-pkg
    mkdir -p pkginfo/locale/{en,ja}
    mkdir -p scripts/{pre_install,post_install,pre_uninstall,post_uninstall}
    mkdir RPMS

    これにより、【図2】のようにディレクトリが作成されます。

    【図2】 Cobalt パッケージ作成のために準備したディレクトリ
    ~admin/
      sudo-pkg/
      |-- pkginfo/
      | |--locale/
      | | |-- en/
      | | |-- jp/
      |-- scripts/
      | |-- pre_install/
      | |-- post_install/
      | |-- pre_uninstall/
      | |-- post_uninstall/
      |--RPMS/

     

  4. Cobalt パッケージに含める各ファイルの用意

    2. で作成した RPM ファイルを RPMS ディレクトリにコピーします。

    cp /usr/src/redhat/RPMS/i386/sudo-1.6.6-0vl3.i386.rpm RPMS/

    RPM ファイルが用意できたところで、Cobalt パッケージの内容を定義する packing_list ファイルの作成に移ります。
    ディレクトリ ~admin/sudo-pkg/ 内に、【リスト3】の内容で packing_list ファイルを作成します。

    【リスト3】 ~admin/sudo-pkg/packing_list ファイルの内容
    [Package -- Version=1.0]
    Vendor: CobaltUsersGroup
    VendorTag: [[vendor]]
    Name: sudo
    NameTag: [[name]]
    Version: 1.6.6
    Product: 4...WG.*
    PackageType: complete
    LongDesc: [[longDesc]]
    ShortDesc: [[shortDesc]]
    Copyright: [[copyright]]
    Depend: Cobalt:OS >= 6.0
    Options: uninstallable
    RPM: sudo-1.6.6-0vl3.i386.rpm
    [/Package]

    次に、管理画面に表示させる各種メッセージを用意します。

    メッセージファイルは、.mo形式(GNU gettext のメッセージカタログ)で用意する必要があります。.mo形式のファイルは、テキストファイル(.po形式)から、msgfmt コマンドで変換して生成します。

    以下の手順により、.mo形式のメッセージファイルを作成します。
     

    1. 変換元ファイル(.po形式)の作成

      【リスト4】のように、メッセージカタログの元となるファイル(.poファイル)を作成します。
      ただし日本語の場合には、.poファイル内の文字コードを「エスケープ済みシフトJIS」という特殊な形式で用意しておく必要があります。
      【リスト5】の内容のファイルをEUC-JPコードで作成しておき、これを以下のように変換します。

      cat pkginfo/locale/ja/generic.po_eucjp | /usr/local/sbin/nkf -Es | sed -e [続]
      's/\\/\\\\/g' > pkginfo/locale/ja/generic.po

       

    2. .po ファイルから .mo ファイルへの変換

      msgfmt コマンドにより、.po形式を .mo形式に変換します※3
       
      msgfmt -o pkginfo/locale/en/generic.mo pkginfo/locale/en/generic.po
      msgfmt -o pkginfo/locale/ja/generic.mo pkginfo/locale/ja/generic.po

    なお、ここでは英語と日本語のメッセージカタログのみを作成しましたが、中国語など他の言語のメッセージを用意する場合も同様の手順となります。

    【リスト4】 ~admin/sudo-pkg/pkginfo/locale/en/generic.po ファイルの内容
    msgid "name"
    msgstr "Sudo"
    
    msgid "vendor"
    msgstr "Cobalt Users Group"
    
    msgid "version"
    msgstr "1.6.6"
    
    msgid "shortDesc"
    msgstr "Allows command execution as root for specified users."
    
    msgid "longDesc"
    msgstr "Sudo (superuser do) allows a system administrator to give certain users [続]
    (or groups of users) the ability to run some (or all) commands as root while lo[続]
    gging all commands and arguments. Sudo operates on a per-command basis, it is n[続]
    ot a replacement for the shell."
    
    msgid "copyright"
    msgstr "Todd C. Miller"

     

    【リスト5】 ~admin/sudo-pkg/pkginfo/locale/ja/generic.po_eucjp ファイルの内容
    msgid "name"
    msgstr "Sudo"
    
    msgid "vendor"
    msgstr "Cobalt Users Group"
    
    msgid "version"
    msgstr "1.6.6"
    
    msgid "shortDesc"
    msgstr "特定のユーザにroot権限でのコマンド実行を許可します。"
    
    msgid "longDesc"
    msgstr "sudo は、特定のユーザや特定のグループに所属するユーザが、スーパーユーザ[続]
    権限でいくつかのコマンド操作を行うことを許可するためのプログラムです。"
    
    msgid "copyright"
    msgstr "Todd C. Miller"

    最後に、インストール/アンインストール時に実行されるスクリプトを用意します(【リスト6】〜【リスト9】)。
    特に必要がなければ用意する必要はありませんが、ここでは念のため、インストール前に同名のRPMファイルをアンインストールする記述と、アンインストール時に設定ファイル /etc/sudoers ファイルを削除する記述を追加しています。

    【リスト6】 ~admin/sudo-pkg/scripts/pre_install/blah ファイルの内容
    #!/bin/sh
    
    echo "pre-install $$ $0" >> /tmp/install_sudo.log
    rpm -e --justdb --nodeps sudo > /dev/null 2>&1
    exit 0

     

    【リスト7】 ~admin/sudo-pkg/scripts/post_install/blah ファイルの内容
    #!/bin/sh
    
    echo "post-install $$ $0" >> /tmp/install_sudo.log
    exit 0

     

    【リスト8】 ~admin/sudo-pkg/scripts/pre_uninstall/blah ファイルの内容
    #!/bin/sh
    
    echo "pre-uninstall $$ $0" >> /tmp/install_sudo.log
    exit 0

     

    【リスト9】 ~admin/sudo-pkg/scripts/post_uninstall/blah ファイルの内容
    #!/bin/sh
    
    rm -f /etc/sudoers >> /tmp/install_sudo.log
    echo "post-uninstall $$ $0" >> /tmp/install_sudo.log
    exit 0

     

  5. Cobalt パッケージの作成

    ここまでの手順で、パッケージを作成する用意がすべて整いました。
    あとは、以下のようにして tar.gz 形式で固めるだけです。

    cd ~admin/sudo-pkg/
    tar -zcf ../sudo-1.6.6.pkg *

    これで無事、以下の場所に sudo コマンドの Cobalt パッケージ sudo-1.6.6.pkg が作成されました。

    ~admin/sudo-1.6.6.pkg

     

  6. インストールテスト

    早速、作成した Cobalt パッケージのインストールテストをしてみましょう。

    Cobalt Qube3Plus の管理画面「BlueLinQ タブ」から「サードパーティソフトウェア」を選択し、ソフトウェアの手動インストール画面を表示します。作成した Cobalt パッケージアップロードし、指示に従ってインストールを行います。

    無事、インストールが完了しました。
    (当たり前ですが)Cobalt の純正パッケージと同様の操作でオリジナルパッケージをインストールできるのは、ちょっと感動です。

    もちろん、ソフトウェア一覧からアンインストールも可能です。

    以上です。


今回作成した Cobalt パッケージは、ここからダウンロードできますのでお試しください。

なお、このパッケージには GUI の設定ツールはありませんから、実際に使用する場合には、シェルから別途設定(/etc/sudoers ファイルの編集)を行う必要があります。

※3 作成したパッケージに .poファイルを含める必要はありませんが、残しておいても特に害はありません。

■補足

2003年6月現在、Sausalito およびソフトウェアパッケージに関する開発者向けの情報が、PDF文書として以下から取得できます。

ftp://ftp-eng.cobalt.com/pub/developer/TechNotes/SSDK.pdf

何らかの理由で署名が必要な場合には、作成したパッケージに、以下のようにして署名を付加します。
ただし、署名したパッケージを正しくインストールするためには、インストール先のサーバが署名の公開鍵を正しく認識できるように設定されている必要があります。

$ gpg -s -r 秘密鍵のID -o sudo-1.6.6.pkg sudo-1.6.6.tar.gz

You need a passphrase to unlock the secret key for
user: "tarou (i love comments) <tarou@mydomain.go.jp>"
1024-bit DSA key, ID 公開鍵のID, created 2003-06-30

たちばなまさし <moomin@happymusic.com>