Dave Cross: Still Munging Data With Perl: Online event - Mar 27 Learn more

our $VERSION = '2.06';
use 5.016;
use strict;
my $SLACKWARE_VERSION_FILE = "/etc/slackware-version";
sub _slackware_version {
# If Slackware version file does not exist, we're probably not on a
# Slackware system.
unless (-e $SLACKWARE_VERSION_FILE) {
return undef;
}
open my $fh, '<', $SLACKWARE_VERSION_FILE
or die "Failed to open $SLACKWARE_VERSION_FILE for reading: $!\n";
my $l = readline $fh;
chomp $l;
# Some Slackware version numbers will have a third number, but we'll ignore
# it. Most software uses the major.minor numbering scheme.
my ($ver) = $l =~ /^Slackware (\d+\.\d+)/;
unless ($ver) {
warn "Bad $SLACKWARE_VERSION_FILE?\n";
return undef;
}
return $ver;
}
my $SLACKWARE_VERSION = _slackware_version();
my $IS_SLACKWARE = defined $SLACKWARE_VERSION;
my $PKGTOOL_LOGS = undef;
my %PACKAGES;
if ($IS_SLACKWARE) {
$PKGTOOL_LOGS = $SLACKWARE_VERSION < 15
? '/var/log/packages'
: '/var/lib/pkgtools/packages'
;
__PACKAGE__->load;
}
sub load {
%PACKAGES = ();
foreach my $pkgf (glob "$PKGTOOL_LOGS/*") {
$pkgf = basename($pkgf);
# Copied this regex from sbopkg
$pkgf =~ /(.*)-([^-]*)-([^-]*)-([0-9]*)(.*)/ or next;
$PACKAGES{$1} = {
Version => $2,
Arch => $3,
Build => $4,
Tag => $5,
};
}
return 1;
}
sub is_slackware { $IS_SLACKWARE };
sub version { $SLACKWARE_VERSION };
sub pkgtool_logs { $PKGTOOL_LOGS };
sub packages { sort keys %PACKAGES };
sub packages_by_tag {
my $self = shift;
my $tag = shift;
return grep { $PACKAGES{$_}->{Tag} eq $tag } $self->packages();
}
sub installed {
my $self = shift;
my $pkg = shift;
return defined $PACKAGES{$pkg};
}
1;
=head1 NAME
Slackware::SBoKeeper::System - Slackware system information
=head1 SYNOPSIS
use Slackware::SBoKeeper::System;
...
=head1 DESCRIPTION
Slackware::SBoKeeper::System is a module that provides miscellaneous
information about the Slackware system. This module is not meant to be used
outside of L<sbokeeper>. If you are looking for L<sbokeeper> user documentation,
please consult its manual.
Slackware::SBoKeeper::System works similarly to L<File::Spec>, it is meant to
be used like an object. That means the following subroutines should be invoked
as methods of C<Slackware::SBoKeeper::System>.
=head1 METHODS
=over 4
=item load()
Loads the Slackware package database. Automatically called when the module is
first loaded (if we're on a Slackware system). Can be be called again to reload
the database.
=item is_slackware()
Returns true if we're on a Slackware system, false if we're not.
=item version()
Returns Slackware system's version number, following the major.minor numbering
scheme. Returns C<undef> on non-Slackware systems.
=item pkgtool_logs()
Returns pkgtool log directory. C<undef> on non-Slackware systems.
=item packages()
Returns list of installed packages.
=item packages_by_tag($tag)
Returns list of installed packages with the tag C<$tag>. For example, to get
all SlackBuilds.org packages installed on your system:
Slackware::SBoKeeper::System->packages_by_tag('_SBo');
=item installed($pkg)
Returns true if C<$pkg> is installed, false if not.
=back
=head1 FILES
=over 4
=item F</etc/slackware-version>
File present on all Slackware systems that contains the Slackware version
number.
=back
=head1 AUTHOR
Written by Samuel Young, E<lt>samyoung12788@gmail.comE<gt>.
=head1 COPYRIGHT
Copyright (C) 2024-2025, Samuel Young
This program is free software; you can redistribute it and/or modify it under
the terms of either: the GNU General Public License as published by the Free
Software Foundation; or the Artistic License.
=head1 SEE ALSO
L<sbokeeper>
=cut