| sol-inst documentation | Contained in the sol-inst distribution. |
Solaris::Contents - Read /var/sadm/install/contents file
$c=Solaris::Contents::new();
Solaris::Contents is an object oriented interface into the /var/sadm/install/contents file which Solaris uses to keep track of all the files installed on a system, and their corresponding packages.
$c=Solaris::Contents::new();
No arguements are required. By default, the object always believes the contents file is /var/sadm/install/contents. The ability to change this could change with a future release.
Returns an array of every file record in the contents file. Very long.
Returns an array of every file record for a specified package.
Returns a hash table of every element for a specified file.
Each of the above methods returns the specific data for a specified file entry from the contents file. Not all entries will have data specific to every method. Check the Solaris prototype man page for more information. The pkgs() method returns an array of packages related to that specific file.
The initialization time of Contents objects could take a few seconds depending on the size of the contents file.
I may add more methods to this class later on. It would be kind of neat to do more with the link entries.
Chris Josephes, chrisj@onvoy.com
| sol-inst documentation | Contained in the sol-inst distribution. |
#!/usr/local/bin/perl # Solaris::Contents # Object for the Solaris contents file # # Chris Josephes 200001003 # # # Package Definition # package Solaris::Contents; use strict; use vars qw($VERSION $Contents); $VERSION=0.9; $Contents="/var/sadm/install/contents"; # # Global Variables # # # Constructor Method # sub new { my ($object)={}; bless ($object); $object->{"file"}=$Contents; $object->_read(); $object->_reverseMap(); return($object); } sub version { return($VERSION); } # # Object Methods # # Return an array of all files in the contentsDB (very long) sub entries { my ($self)=@_; return(keys(%{$self->{"db"}})); } # Return an array of all files associated with one package sub entriesForPkg { my ($self,$pkg)=@_; return(keys(%{$self->{"rev"}->{$pkg}})); } # Return a hash with all of the data for a particular entry sub entry { my ($self,$file)=@_; return(%{$self->{"db"}->{$file}}); } # Return the file's ftype sub ftype { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"ftype"}); } sub class { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"class"}); } sub major { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"major"}); } sub minor { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"minor"}); } sub mode { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"mode"}); } sub user { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"user"}); } sub group { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"group"}); } sub size { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"size"}); } sub cksum { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"cksum"}); } sub modified { my ($self,$file)=@_; return($self->{"db"}->{$file}->{"modified"}); } sub pkgs { my ($self,$file)=@_; return(@{$self->{"db"}->{$file}->{"pkgs"}}); } # # Hidden Methods # sub _read { my ($self)=@_; my ($ln,$file,$ftype,$class,$fld,$flds,@rest,@rf,@lines); open (F, $self->{"file"}) || return(undef); (@lines)=<F>; close(F); while (@lines) { $ln=shift(@lines); next if ($ln=~/^#/); ($file,$ftype,$class,@rest)=split(/\s/,$ln); $self->{"db"}->{$file}->{"file"}=$file; $self->{"db"}->{$file}->{"ftype"}=$ftype; $self->{"db"}->{$file}->{"class"}=$class; # print("Ftype $ftype - File $file\n"); # The rest of the fields in the contents file # are dependent on what the ftype is if ($ftype eq "s" || $ftype eq "l") { (@rf)=(); } elsif ($ftype eq "b" || $ftype eq "c") { (@rf)=("major","minor","mode","user","group"); } elsif ($ftype eq "d") { (@rf)=("mode","user","group","pkgs"); } elsif ($ftype eq "e" || $ftype eq "f" || $ftype eq "v") { (@rf)=("mode","user","group","size","cksum","modified"); } else { # Unknown ftype, we shouldn't reach this part # Best to delete the strange entry and move on $self->{"db"}->{$file}={}; next; } while (@rf) { $fld=shift(@rf); # print("Assigning $fld to $file\n"); $self->{"db"}->{$file}->{$fld}=shift(@rest); } $self->{"db"}->{$file}->{"pkgs"}= [ @rest ]; } return(); } # Build a reverse contents map based on pacakge sub _reverseMap { my ($self)=@_; my ($file,$p,@pkgs); foreach $file ($self->entries()) { (@pkgs)=$self->pkgs($file); while (@pkgs) { $p=shift(@pkgs); $self->{"rev"}->{$p}->{$file}=1; } } return(); } # # Exit Block # 1; # # POD Block #