IPSのmanifest内でrestartしているfmriサービス

IPSのmanifestを色々見ていると、restart_fmri=svc… なる記述を見かける。どうやら、このファイルを追加したときに、サービス再起動することで、SVR4 pkgのpostinstall スクリプト相当の処理を行っているらしい。

ということで、一覧を取得してみた。何となく分かるものもあるけど、分からないものも多い。あとで調べてみよう。

svc:/application/desktop-cache/gconf-cache:default
svc:/system/rad:default
svc:/application/desktop-cache/pixbuf-loaders-installer:default
svc:/application/desktop-cache/desktop-mime-cache:default
svc:/application/desktop-cache/mime-types-cache:default
svc:/system/manifest-import:default
svc:/application/font/fc-cache:default
svc:/application/desktop-cache/input-method-cache:default
svc:/application/opengl/ogl-select:default
svc:/application/desktop-cache/icon-cache:default
svc:/system/rbac:default

方法は簡単。pkg contents -m パッケージ名で全パッケージのmanifestを拾って、”restrart_fmri=” でgrepして、その引数を拾って、uniq しただけ。

実際には、pkg contents を使わず、以下のように公開されているミラー用のrepository イメージ内のmanifestファイルをgrepしている。以下の例では、repositoryイメージを/export/pkg/repo2010_11に展開している。


find /export/pkg/repo2010_11/repo/publisher/solaris/pkg -type f -print0 
 | xargs -0 grep 'restart_fmri='>'file

上記のファイルを、perl script で処理して、unique なサービスを割り出している。以下のperl scriptでは、再起動しているFMRIが、どのpkgに含まれているかの一覧も出している。出力結果は長いから省略。

#!/usr/bin/perl

use strict;
use warnings;
use constant TAG=> '    ';

my %fmri;
while (<>) {
    /restart_fmri=(S+)/;
    my $key=$1;
    next unless $key;
    my $path=(split(/:/))[0];
    my $pkg=(split(m|/|, $path))[-2];
    $pkg =~ s|%2F|/|g;

    $fmri{$key} = {} unless exists $fmri{$key};
    $fmri{$key}->{$pkg}=1;
}

foreach my $k (keys %fmri ) {
     print( "$kn", TAG,
            join("n" . TAG, sort( keys %{$fmri{$k}} ) ),
            "n");
}

Follow me!

Leave a Reply

Your email address will not be published. Required fields are marked *