File Coverage

blib/lib/Net/Dropbear/SSHd.pm
Criterion Covered Total %
statement 45 60 75.0
branch 3 10 30.0
condition 1 3 33.3
subroutine 14 16 87.5
pod 4 5 80.0
total 67 94 71.2


line stmt bran cond sub pod time code
1             package Net::Dropbear::SSHd;
2              
3 11     11   476304 use strict;
  11         24  
  11         259  
4 11     11   122 use v5.8;
  11         37  
5             our $VERSION = '0.06';
6              
7 11     11   7341 use Child;
  11         60440  
  11         415  
8              
9 11     11   240360 use autodie;
  11         190693  
  11         67  
10 11     11   69980 use Carp;
  11         27  
  11         750  
11 11     11   10327 use Moo;
  11         163685  
  11         74  
12 11     11   29916 use Types::Standard qw/ArrayRef HashRef GlobRef Str Int Bool InstanceOf/;
  11         770314  
  11         130  
13              
14             has addrs => (
15             is => 'rw',
16             isa => ArrayRef[Str],
17             coerce => sub { ref $_[0] ? $_[0] : [ $_[0] ] },
18             );
19              
20             has keys => (
21             is => 'rw',
22             isa => ArrayRef[Str],
23             coerce => sub {
24             my $value = shift;
25             $value = ref $value ? $value : [ $value ];
26             foreach my $key ( @$value )
27             {
28             carp "Key file does not exist: $key"
29             if !-e $key;
30             }
31             return $value;
32             },
33             );
34              
35             has hooks => (
36             is => 'ro',
37             isa => HashRef,
38             default => sub { {} },
39             );
40              
41             has debug => ( is => "rw", isa => Bool, default => 0, );
42             has forkbg => ( is => "rw", isa => Bool, default => 0, );
43             has usingsyslog => ( is => "rw", isa => Bool, default => 0, );
44             has inetdmode => ( is => "rw", isa => Bool, default => 0, );
45             has norootlogin => ( is => "rw", isa => Bool, default => 1, );
46             has noauthpass => ( is => "rw", isa => Bool, default => 1, );
47             has norootpass => ( is => "rw", isa => Bool, default => 1, );
48             has allowblankpass => ( is => "rw", isa => Bool, default => 0, );
49             has delay_hostkey => ( is => "rw", isa => Bool, default => 0, );
50             has domotd => ( is => "rw", isa => Bool, default => 0, );
51             has noremotetcp => ( is => "rw", isa => Bool, default => 1, );
52             has nolocaltcp => ( is => "rw", isa => Bool, default => 1, );
53              
54             has child => (
55             is => 'rwp',
56             isa => InstanceOf['Child::Link::Proc'],
57             );
58              
59             has comm => (
60             is => 'rwp',
61             isa => GlobRef,
62             );
63              
64             sub is_running
65             {
66 20     20 1 103 my $self = shift;
67 20         325 return defined $self->child;
68             }
69              
70             sub run
71             {
72 10     10 1 1456 my $self = shift;
73 10         26 my $child_hook = shift;
74              
75 10 50 33     90 if (defined $child_hook && ref $child_hook ne 'CODE')
76             {
77 0         0 croak '$child_hook was not a code ref when calling run';
78             }
79              
80 11     11   31265 use Socket;
  11         44796  
  11         7579  
81 11     11   998 use IO::Handle;
  11         6965  
  11         4965  
82 10         73 socketpair(my $child_comm, my $parent_comm, AF_UNIX, SOCK_STREAM, PF_UNSPEC);
83              
84             my $child = Child->new(sub {
85 0     0   0 my $parent = shift;
86 0         0 $0 .= " [Net::Dropbear Child]";
87              
88 0         0 $parent_comm->close;
89 0         0 $self->_set_comm($child_comm);
90              
91 0         0 require Net::Dropbear::XS;
92              
93 0         0 Net::Dropbear::XS->setup_svr_opts($self);
94              
95 0 0       0 $child_hook->($parent)
96             if defined $child_hook;
97              
98 0         0 Net::Dropbear::XS->svr_main();
99              
100             # Should never return
101 0         0 croak 'Unexpected return from dropbear';
102 10         19363 });
103              
104 10         141 $self->_set_child($child->start);
105 10         35868 $child_comm->close;
106 10         343 $self->_set_comm($parent_comm);
107              
108 10         8493 return;
109             }
110              
111             sub stop
112             {
113 10     10 1 636513 my $self = shift;
114 10 50       204 if ($self->is_running)
115             {
116 10         265 $self->child->kill(15);
117             }
118             }
119              
120             sub wait
121             {
122 10     10 1 1061 my $self = shift;
123 10 50       72 if ($self->is_running)
124             {
125 10         179 $self->child->wait;
126             }
127             }
128              
129             sub auto_hook
130             {
131 0     0 0 0 my $self = shift;
132 0         0 my $hook = shift;
133              
134 0 0       0 if (exists $self->hooks->{$hook})
135             {
136 0         0 return $self->hooks->{$hook}->(@_);
137             }
138              
139 0         0 return Net::Dropbear::XS::HOOK_CONTINUE();
140             }
141              
142             sub import
143             {
144 21     21   14179 require Net::Dropbear::XS;
145 21         2010 Net::Dropbear::XS->export_to_level(1, @_);
146             }
147              
148             1;
149             __END__