package Slackware::SBoKeeper::System; our $VERSION = '2.06'; use 5.016; use strict; use warnings; use File::Basename; 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