added a one hour alarm to end long-running processes
[scpubgit/System-Introspector.git] / lib / System / Introspector / Gatherer.pm
CommitLineData
60e1cc39 1package System::Introspector::Gatherer;
2use Moo;
a5e1e1c6 3use Object::Remote;
4use Object::Remote::Future;
5use System::Introspector::Gatherer::Bridge;
60e1cc39 6use Module::Runtime qw( use_module );
7
949dba9c 8has introspectors => (is => 'ro', required => 1);
9
10sub gather_all {
11 my ($self) = @_;
12 my %report;
93555732 13 alarm 60*60;
949dba9c 14 for my $spec (@{ $self->introspectors }) {
15 my ($base, $args) = @$spec;
16 $report{$base} = use_module("System::Introspector::Probe::$base")
17 ->new($args)
18 ->gather;
19 }
20 return \%report;
60e1cc39 21}
22
a5e1e1c6 23sub _new_direct {
949dba9c 24 my ($class, $remote, $args) = @_;
25 return $class->new::on($remote, $args || {});
a5e1e1c6 26}
27
28sub _new_bridged {
949dba9c 29 my ($class, $bridge, $remote, $args) = @_;
a5e1e1c6 30 return System::Introspector::Gatherer::Bridge->new::on($bridge,
31 remote_spec => $remote,
32 remote_class => $class,
949dba9c 33 remote_args => $args || {},
a5e1e1c6 34 );
35}
36
37sub new_from_spec {
38 my ($class, %arg) = @_;
39 my ($user, $host, $sudo_user) = @arg{qw( user host sudo_user )};
40 my $sudo = defined($sudo_user) ? sprintf('%s@', $sudo_user) : undef;
949dba9c 41 my $args = { introspectors => $arg{introspectors} };
a5e1e1c6 42 if (defined $host) {
43 my $remote = join '@', grep defined, $user, $host;
44 if (defined $sudo_user) {
949dba9c 45 return $class->_new_bridged($remote, $sudo, $args);
a5e1e1c6 46 }
47 else {
949dba9c 48 return $class->_new_direct($remote, $args);
a5e1e1c6 49 }
50 }
51 else {
52 if (defined $sudo_user) {
949dba9c 53 return $class->_new_direct($sudo, $args);
a5e1e1c6 54 }
55 else {
949dba9c 56 return $class->new($args);
a5e1e1c6 57 }
58 }
59}
60
60e1cc39 611;