1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
package Crypt::Random::Source::Base::Proc;
# ABSTRACT: Base class for helper processes (e.g. C<openssl>)
our $VERSION = '0.14';
use Moo;
extends qw(Crypt::Random::Source::Base::Handle);
use Capture::Tiny 0.08 qw(capture);
use File::Spec;
use IO::File 1.14;
use Types::Standard qw(Str);
use namespace::clean;
use 5.008;
has command => ( is => "rw", required => 1 );
has search_path => ( is => 'rw', isa => Str, lazy => 1, builder => 1);
# This is a scalar so that people can customize it (which they would
# particularly need to do on Windows).
our $TAINT_PATH =
'/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin';
sub _build_search_path {
# In taint mode it's not safe to use $ENV{PATH}.
if (${^TAINT}) {
return $TAINT_PATH;
}
return $ENV{PATH};
}
sub open_handle {
my $self = shift;
my $cmd = $self->command;
my @cmd = ref $cmd ? @$cmd : $cmd;
my $retval;
local $ENV{PATH} = $self->search_path;
my ($stdout, $stderr) = capture { $retval = system(@cmd) };
chomp($stderr);
if ($retval) {
my $err = join(' ', @cmd) . ": $! ($?)";
if ($stderr) {
$err .= "\n$stderr";
}
die $err;
}
warn $stderr if $stderr;
my $fh = IO::File->new(\$stdout, '<');
return $fh;
}
1;
=pod
=encoding UTF-8
=head1 NAME
Crypt::Random::Source::Base::Proc - Base class for helper processes (e.g. C<openssl>)
=head1 VERSION
version 0.14
=head1 SYNOPSIS
use Moo;
extends qw(Crypt::Random::Source::Base::Proc);
has '+command' => ( default => ... );
=head1 DESCRIPTION
This is a base class for using command line utilities which output random data
on STDOUT as L<Crypt::Random::Source> objects.
=head1 ATTRIBUTES
=head2 command
An array reference or string that is the command to run.
=head1 METHODS
=head2 open_handle
Opens a pipe for reading using C<command>.
=head1 SUPPORT
Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=Crypt-Random-Source>
(or L<bug-Crypt-Random-Source@rt.cpan.org|mailto:bug-Crypt-Random-Source@rt.cpan.org>).
=head1 AUTHOR
יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>
=head1 COPYRIGHT AND LICENCE
This software is copyright (c) 2008 by Yuval Kogman.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
__END__
# ex: set sw=4 et:
|