package File::Find::Rule::DMIDecode;
use base qw(File::Find::Rule);
use strict;
use warnings;
use List::MoreUtils qw(any);
use Parse::DMIDecode;
use Perl6::Slurp;
our $VERSION = 0.05;
# Detect dmidecode file.
sub File::Find::Rule::dmidecode_file {
my $file_find_rule = shift;
my $self = $file_find_rule->_force_object;
return $self->file->exec(sub{
my $file = shift;
my $data = slurp($file);
my $dmidecode = Parse::DMIDecode->new;
$dmidecode->parse($data);
return $dmidecode->dmidecode_version ? 1 : 0;
});
}
sub File::Find::Rule::dmidecode_handle {
my ($file_find_rule, $handle) = @_;
my $self = $file_find_rule->_force_object;
return $self->file->exec(sub{
my $file = shift;
my $data = slurp($file);
my $dmidecode = Parse::DMIDecode->new;
$dmidecode->parse($data);
return any { $_->handle eq $handle } $dmidecode->get_handles;
});
}
sub File::Find::Rule::dmidecode_type {
my ($file_find_rule, $dmi_type) = @_;
my $self = $file_find_rule->_force_object;
return $self->file->exec(sub{
my $file = shift;
my $data = slurp($file);
my $dmidecode = Parse::DMIDecode->new;
$dmidecode->parse($data);
return $dmidecode->get_handles(dmitype => $dmi_type);
});
}
1;
__END__
=pod
=encoding utf8
=head1 NAME
File::Find::Rule::DMIDecode - Common rules for searching for dmidecode files.
=head1 SYNOPSIS
use File::Find::Rule;
use File::Find::Rule::DMIDecode;
my @files = File::Find::Rule->dmidecode_file->in($dir);
my @files = File::Find::Rule->dmidecode_handle($handle)->in($dir);
my @files = File::Find::Rule->dmidecode_type($dmi_type)->in($dir);
=head1 DESCRIPTION
This Perl module contains File::Find::Rule rules for detecting dmidecode files.
dmidecode text file is output of dmidecode tool, which prints information about
DMI.
DMI (Desktop Management Interface) generates a standard framework for managing
and tracking components in a desktop, notebook or server computer, by
abstracting these components from the software that manages them.
See L<DMI on Wikipedia|https://en.wikipedia.org/wiki/Desktop_Management_Interface>.
=head1 SUBROUTINES
=head2 C<dmidecode_file>
my @files = File::Find::Rule->dmidecode_file->in($dir);
The C<dmidecode_file()> rule detect dmidecode files by parsing of structure.
=head2 C<dmidecode_handle>
my @files = File::Find::Rule->dmidecode_handle($handle)->in($dir);
The C<dmidecode_handle($handle)> rule detect dmidecode handle in file.
=head2 C<dmidecode_type>
my @files = File::Find::Rule->dmidecode_type($dmi_type)->in($dir);
The C<dmidecode_type($dmi_type)> rule detect dmidecode DMI type in file.
=head1 EXAMPLE1
use strict;
use warnings;
use File::Find::Rule;
use File::Find::Rule::DMIDecode;
# Arguments.
if (@ARGV < 1) {
print STDERR "Usage: $0 dir\n";
exit 1;
}
my $dir = $ARGV[0];
# Print all dmidecode files in directory.
foreach my $file (File::Find::Rule->dmidecode_file->in($dir)) {
print "$file\n";
}
# Output like:
# Usage: qr{[\w\/]+} dir
=head1 EXAMPLE2
use strict;
use warnings;
use File::Find::Rule;
use File::Find::Rule::DMIDecode;
# Arguments.
if (@ARGV < 2) {
print STDERR "Usage: $0 dir handle\n";
exit 1;
}
my $dir = $ARGV[0];
my $handle = $ARGV[1];
# Print all dmidecode handles in directory.
foreach my $file (File::Find::Rule->dmidecode_handle($handle)->in($dir)) {
print "$file\n";
}
# Output like:
# Usage: qr{[\w\/]+} dir handle
=head1 EXAMPLE3
use strict;
use warnings;
use File::Find::Rule;
use File::Find::Rule::DMIDecode;
# Arguments.
if (@ARGV < 2) {
print STDERR "Usage: $0 dir dmi_type\n";
exit 1;
}
my $dir = $ARGV[0];
my $dmi_type = $ARGV[1];
# Print all dmidecode handles in directory.
foreach my $file (File::Find::Rule->dmidecode_type($dmi_type)->in($dir)) {
print "$file\n";
}
# Output like:
# Usage: qr{[\w\/]+} dir dmi_type
=head1 DEPENDENCIES
L<File::Find::Rule>,
L<List::MoreUtils>,
L<Parse::DMIDecode>,
L<Perl6::Slurp>.
=head1 SEE ALSO
=over
=item L<File::Find::Rule>
Alternative interface to File::Find
=back
=head1 REPOSITORY
L<https://github.com/michal-josef-spacek/File-Find-Rule-DMIDecode>
=head1 AUTHOR
Michal Josef Špaček L<mailto:skim@cpan.org>
L<http://skim.cz>
=head1 LICENSE AND COPYRIGHT
© Michal Josef Špaček 2020-2021
BSD 2-Clause License
=head1 VERSION
0.05
=cut