package System::Introspector::Sudoers;
use Moo;
+use System::Introspector::Util qw(
+ handle_from_command
+ files_from_dir
+ output_from_file
+ transform_exceptions
+);
+
has sudoers_file => (
is => 'ro',
default => sub { '/etc/sudoers' },
sub _gather_files {
my ($self, $file) = @_;
- open my $fh, '<', $file
- or return $file => { error => "Unable to read: $!" };
- my @lines = <$fh>;
- my %file = ($file => { body => join '', @lines });
- for my $line (@lines) {
- chomp $line;
- if ($line =~ m{^#include\s+(.+)$}) {
- my $inc_file = $self->_insert_hostname($1);
- %file = (%file, $self->_gather_files($inc_file));
- }
- elsif ($line =~ m{^#includedir\s+(.+)$}) {
- my $inc_dir = $self->_insert_hostname($1);
- %file = (%file, $self->_gather_from_dir($inc_dir));
+ my $result = transform_exceptions {
+ my @lines = output_from_file $file;
+ my @result = ({ body => join '', @lines });
+ for my $line (@lines) {
+ chomp $line;
+ if ($line =~ m{^#include\s+(.+)$}) {
+ my $inc_file = $self->_insert_hostname($1);
+ push @result, $self->_gather_files($inc_file);
+ }
+ elsif ($line =~ m{^#includedir\s+(.+)$}) {
+ my $inc_dir = $self->_insert_hostname($1);
+ push @result, $self->_gather_from_dir($inc_dir);
+ }
}
- }
- return %file;
+ return \@result;
+ };
+ return $file => @$result;
}
sub _gather_from_dir {
my ($self, $dir) = @_;
- opendir(my $dh, $dir);
- return $dir => { error => "Unable to read dir $dir: $!" }
- unless $dh;
+ my @files = files_from_dir $dir;
my %file;
- while (my $file = readdir $dh) {
+ for my $file (@files) {
next if $file =~ m{\.} or $file =~ m{~$};
%file = (%file, $self->_gather_files("$dir/$file"));
}