AIX-LPP
view release on metacpan or search on metacpan
LPP/lpp_name.pm view on Meta::CPAN
keys %{$self->{FILESET}} ) unless @_;
my %param = @_;
if (defined $param{FORMAT}) { $self->{FORMAT} = $param{FORMAT}}
if (defined $param{PLATFORM}) { $self->{PLATFORM} = $param{PLATFORM}}
if (defined $param{TYPE}) { $self->{TYPE} = $param{TYPE}}
if (defined $param{NAME}) { $self->{NAME} = $param{NAME}}
return ( $self->{NAME},$self->{TYPE},$self->{FORMAT},$self->{PLATFORM},
keys %{$self->{FILESET}} );
}
sub fileset {
my $self = shift;
my $fsname = shift;
my %param = @_;
if ( $#_ == -1 ) {
return ($self->{FILESET}{$fsname}{NAME},$self->{FILESET}{$fsname}{VRMF},
$self->{FILESET}{$fsname}{DISK},$self->{FILESET}{$fsname}{BOSBOOT},
$self->{FILESET}{$fsname}{CONTENT},$self->{FILESET}{$fsname}{LANG},
$self->{FILESET}{$fsname}{DESCRIPTION},
$self->{FILESET}{$fsname}{COMMENTS});
} else {
LPP/lpp_name.pm view on Meta::CPAN
$self->{FILESET}{$fsname}{DISK},
$self->{FILESET}{$fsname}{BOSBOOT},
$self->{FILESET}{$fsname}{CONTENT},
$self->{FILESET}{$fsname}{LANG},
$self->{FILESET}{$fsname}{DESCRIPTION},
$self->{FILESET}{$fsname}{COMMENTS});
}
sub sizeinfo {
my $self = shift;
my $fset = shift;
my $size_ref = shift;
$self->{FILESET}{$fset}{SIZEINFO} = $size_ref;
return $self->{FILESET}{$fset}{SIZEINFO};
}
sub requisites {
my $self = shift;
my $fset = shift;
my $ref_req = shift;
$self->{FILESET}{$fset}{REQ} = $ref_req;
return $self->{FILESET}{$fset}{REQ};
}
sub validate {
}
sub read {
my $class = shift;
my $fh = shift;
my $self = {};
bless $self, $class;
chomp (my $line = <$fh>);
my ($format,$platform,$type,$name,$token) = split / /, $line;
$self->lpp(NAME => $name, FORMAT => $format, TYPE => $type,
PLATFORM => $platform);
chomp ($line = <$fh>);
# add while loop here to process fileset headers
my ($fsn,$vrmf,$disk,$bosboot,$content,$lang,@desc) = split / /, $line;
$self->fileset($fsn, NAME => $fsn,VRMF => $vrmf,DISK => $disk,
BOSBOOT => $bosboot, CONTENT => $content, LANG => $lang,
DESCRIPTION => join ' ', @desc);
chomp ($line = <$fh>) until $line =~ /^\[/;
chomp ($line = <$fh>);
FSDATA: { do {
chomp $line;
my @reqs;
last if $line =~ /^\]/;
LPP/lpp_name.pm view on Meta::CPAN
return $self;
}
sub write {
my $self = shift;
my $fh = shift;
print $fh join ' ', $self->{FORMAT}, $self->{PLATFORM}, $self->{TYPE},
$self->{NAME}, "{\n";
foreach my $fileset (keys %{$self->{FILESET}} ) {
print $fh join ' ', $self->{FILESET}{$fileset}{NAME},
$self->{FILESET}{$fileset}{VRMF},
$self->{FILESET}{$fileset}{DISK},
$self->{FILESET}{$fileset}{BOSBOOT},
$self->{FILESET}{$fileset}{CONTENT},
$self->{FILESET}{$fileset}{LANG},
$self->{FILESET}{$fileset}{DESCRIPTION}, "\n[\n";
for my $i ( 0 .. $#{$self->{FILESET}{$fileset}{REQ}} ) {
print $fh join ' ',@{${$self->{FILESET}{$fileset}{REQ}}[$i]},"\n";
}
print $fh "%\n";
foreach my $key (sort keys %{$self->{FILESET}{$fileset}{SIZEINFO}}) {
print $fh join ' ', $key,
$self->{FILESET}{$fileset}{SIZEINFO}{$key}, "\n";
}
print $fh "%\n%\n%\n%\n]\n";
}
print $fh "}";
}
1;
__END__
=head1 NAME
AIX::LPP::lpp_name - Perl module for manipulation of an AIX lpp_name file
=head1 SYNOPSIS
use AIX::LPP::lpp_name;
$x = lpp_name->new();
$x->lpp(NAME => 'test.lpp',TYPE => 'I',PLATFORM => 'R',FORMAT => '4');
$x->fileset('test.lpp.rte', VRMF => '1.0.0.0',DISK => '01',BOSBOOT => 'N',
CONTENT => 'I', LANG => 'en_US', DESCRIPTION => 'test.lpp description',
COMMENTS => '');
my @reqs = [ ['*prereq','bos.rte','4.3.3.0'] ];
$x->requisites('test.lpp.rte', \@reqs);
my %sizes = { '/usr' => '5', '/etc' => '1' };
$x->sizeinfo('test.lpp.rte', \%sizes);
$x->write(\*out_fh);
or
$x = lpp_name->read(\*in_fh);
my %lppdata = $x->lpp();
my %fsdata = $x->fileset('test.lpp.rte');
my $req_ref = $x->requisites('test.lpp.rte');
my $size_ref = $x->sizeinfo('test.lpp.rte');
=head1 DESCRIPTION
AIX::LPP::lpp_name is a class module for reading, creating, and modifying
AIX lpp_name files. The lpp_name file is an internal component of AIX
packages (called LPPs). LPPs consist of filesets and information about
installing them. This information can include: prerequisites, filesystem
requirements, copywrites, etc..
=head1 CONSTRUCTOR METHODS
=over 4
=item $x = lpp_name->new();
The simple form of the new constructor method creates an empty lpp_name
object. This object is then modified using lpp() and fileset() object
methods. Basic LPP information can also be passed to new() as follows: ...
=item $x = lpp_name->read(\*in_fh);
Alternatively, a new lpp_name object can be create by reading data from
an lpp_name formatted file. read() is both a class method and an instance
method (or it will be when I'm finished).
=head1 OBJECT METHODS
=over 4
=item lpp()
=item fileset()
=item requisites()
=item sizeinfo()
=item read()
=item write()
=item validate()
distribution without the prior approval of the author.
This code is provided with no warranty of any kind, and is used entirely at
your own risk.
This code was written by the author as a private individual, and is in no way
endorsed or warrantied by IBM.
WHAT IS IT?
-----------
This set of modules provides AIX-specific functionality, related to obtaining
and manipulating configuration information from the Operating System and LPP
packages.
The following module is provided:
AIX::LPP::lpp_name
Parses and writes lpp_name package configuration files.
(a future enhancement will add content validation)
The following module is under development:
AIX::LPP.pm
2. Run 'perl Makefile.PL && make test'
3. If successful, run 'make install'
HOW TO USE
----------
use AIX::LPP::lpp_name;
$x = lpp_name->new();
$x->lpp(NAME => 'test.lpp',TYPE => 'I',PLATFORM => 'R',FORMAT => '4');
$x->fileset('test.lpp.rte', VRMF => '1.0.0.0',DISK => '01',BOSBOOT => 'N',
CONTENT => 'I', LANG => 'en_US', DESCRIPTION => 'test.lpp description',
COMMENTS => '');
my @reqs = [ ['*prereq','bos.rte','4.3.3.0'] ];
$x->requisites('test.lpp.rte', \@reqs);
my %sizes = { '/usr' => '5', '/etc' => '1' };
$x->sizeinfo('test.lpp.rte', \%sizes);
$x->write(\*out_fh);
or
$x = lpp_name->read(\*in_fh);
my %lppdata = $x->lpp();
my %fsdata = $x->fileset('test.lpp.rte');
my $req_ref = $x->requisites('test.lpp.rte');
my $size_ref = $x->sizeinfo('test.lpp.rte');
Read the installp manpage and the IBM LPP package format documentation
for more detail. The use maintained lppbuild package is also a good
source of documentation.
Support questions and suggestions can be directed to critter@aixadm.org
improve the parsing routine to handle multiple filesets per package
add validation()
add defaults() ?
add object classes for handling other package data: post_i, odmadd,
copywrite, etc.
add methods to store/query *installed* package info
scripts/mkcontrol view on Meta::CPAN
# change this to use stdin/stdout
$package = AIX::LPP::lpp_name->read(\*STDIN);
# instead of calling write(), find the data we want and print it to stdout
my ($name,$version,$type,$four,$fs) = $package->lpp();
my ($fsname,$vrmf,$disk,$bboot,$cntnt,$lang,$desc,$cmnt) =
$package->fileset($fs);
print 'NAME=',"$fsname\n";
print 'VERSION=',"$vrmf\n";
print 'DESCRIPTION=',"$desc\n";
use AIX::LPP::lpp_name;
print "1..8\n";
$package = AIX::LPP::lpp_name->new(NAME => 'test.lpp',TYPE => 'I',
PLATFORM => 'R',FORMAT => '4');
print "ok 1\n";
$package->fileset('test.lpp.rte',VRMF => '1.0.0.0',DISK => '01',BOSBOOT => 'N',
CONTENT => 'I',LANG => 'en_US',DESCRIPTION => 'test.lpp description',
COMMENTS => '');
print "ok 2\n";
$package->fileset('test.lpp.adt');
print "ok 3\n";
my @reqs = [ ['*prereq','bos.rte','4.3.3.0'] ];
$package->requisites('test.lpp.adt', \@reqs);
print "ok 4\n";
$package->sizeinfo('test.lpp.adt');
print "ok 5\n";
$package->lpp(FORMAT => 5) && print "ok 6\n";
$package->lpp() && print "ok 7\n";
$package->{FORMAT} && print "ok 8\n";
use AIX::LPP::lpp_name;
print "1..1\n";
open(LPP_NAME,">data/lpp_test.2") or die "Can't open file lpp_name: $!";
$package = AIX::LPP::lpp_name->new(NAME => 'test.lpp',TYPE => 'I',
FORMAT => '4', PLATFORM => 'R');
$package->fileset('test.lpp.rte', VRMF => '01.01.0000.0000',DISK => '01',
BOSBOOT => 'N',CONTENT => 'U', LANG => 'en_US',
DESCRIPTION => 'test package description' );
# $package->requisites();
# $package->sizeinfo();
$package->write(\*LPP_NAME);
print "ok 1\n";
( run in 0.540 second using v1.01-cache-2.11-cpan-49f99fa48dc )