File Coverage

blib/lib/Footprintless/Localhost.pm
Criterion Covered Total %
statement 60 61 98.3
branch 13 20 65.0
condition 6 8 75.0
subroutine 13 13 100.0
pod 8 8 100.0
total 100 110 90.9


line stmt bran cond sub pod time code
1 12     12   85924 use strict;
  12         29  
  12         6803  
2 12     12   66 use warnings;
  12         18  
  12         530  
3              
4             package Footprintless::Localhost;
5             $Footprintless::Localhost::VERSION = '1.29';
6             # ABSTRACT: A localhost alias resolver
7             # PODNAME: Footprintless::Localhost
8              
9 12     12   477 use Log::Any;
  12         8779  
  12         73  
10              
11             my $logger = Log::Any->get_logger();
12             my $loopback_ipv4_regex = qr/127(?:.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/;
13              
14             sub new {
15 36     36 1 14875 return bless( {}, shift )->_init(@_);
16             }
17              
18             sub _add_alias {
19 171     171   64350 my ( $self, $alias ) = @_;
20              
21 171 50       341 if ($alias) {
22 171         518 $logger->debugf( 'adding alias [%s]', $alias );
23 171         2287 $self->{aliases}{ lc($alias) } = 1;
24             }
25              
26 171         445 return $self;
27             }
28              
29             sub _init {
30 36     36   113 my ( $self, %options ) = @_;
31              
32             # what gets returned if is_alias( );
33 36 50       217 $self->{empty} = exists( $options{empty} ) ? $options{empty} : 1;
34 36   100     214 $self->{etc_hosts_file} = $options{etc_hosts_file} || '/etc/hosts';
35              
36             $self->_add_alias('localhost')->_add_alias('127.0.0.1')
37 36 100       184 unless ( $options{none} );
38              
39 36 100       92 if ( $options{aliases} ) {
40 1         3 $self->_add_alias($_) foreach @{ $options{aliases} };
  1         4  
41             }
42              
43 36         139 return $self;
44             }
45              
46             sub is_alias {
47 48     48 1 143 my ( $self, $hostname ) = @_;
48              
49 48 50       189 if ($hostname) {
50             return ( $self->{loaded}{'127 subnet'} && $hostname =~ /^\s*$loopback_ipv4_regex\s*$/ )
51 48   100     1102 || $self->{aliases}{ lc($hostname) };
52             }
53             else {
54 0         0 return $self->{empty};
55             }
56             }
57              
58             sub is_loaded {
59 10     10 1 45 my ( $self, $extra ) = @_;
60 10   33     64 return $self->{loaded} && $self->{loaded}{$extra};
61             }
62              
63             sub load_127_subnet {
64 32     32 1 85 my ($self) = @_;
65 32         172 $self->{loaded}{'127 subnet'} = 1;
66 32         145 return $self;
67             }
68              
69             sub load_all {
70 32     32 1 100 return shift->load_etc_hosts()->load_hostfqdn()->load_hostname()->load_127_subnet();
71             }
72              
73             sub load_etc_hosts {
74 33     33 1 64 my ( $self, $etc_hosts_file ) = @_;
75 33 50       102 $etc_hosts_file = $self->{etc_hosts_file} unless ($etc_hosts_file);
76              
77 33 50       140 if ( !$self->{loaded}{'/etc/hosts'} ) {
78              
79             # attempt to load aliases from hosts file
80 33         124 $logger->debug( 'loading /etc/hosts from: %s', $etc_hosts_file );
81 33         324 eval {
82 33         1231 open( my $handle, '<', $etc_hosts_file );
83 33         678 while ( my $line = <$handle> ) {
84 228 100       1930 if ( $line =~ /^$loopback_ipv4_regex\s+(\S.*?)\s*$/ ) {
85 34         233 $self->_add_alias($_) foreach map { lc($_) } split( /\s+/, $1 );
  36         219  
86             }
87             }
88 33         371 close($handle);
89             };
90 33         149 $self->{loaded}{'/etc/hosts'} = 1;
91             }
92              
93 33         133 return $self;
94             }
95              
96             sub load_hostfqdn {
97 33     33 1 79 my ($self) = @_;
98              
99 33 50       108 if ( !$self->{loaded}{hostfqdn} ) {
100              
101             # if fqdn is present, add it too...
102 33         117 $logger->debug('loading hostfqdn');
103 33         4749 require Net::Domain;
104 33         95816 $self->_add_alias( Net::Domain::hostfqdn() );
105 33         111 $self->{loaded}{hostfqdn} = 1;
106             }
107              
108 33         149 return $self;
109             }
110              
111             sub load_hostname {
112 33     33 1 109 my ($self) = @_;
113              
114 33 50       121 if ( !$self->{loaded}{hostname} ) {
115              
116             # load alias from hostname
117 33         135 $logger->debug('loading hostname');
118 33         289 eval {
119             # hostname() croaks on fail, so just ignore
120 33         4101 require Sys::Hostname;
121 33         9619 $self->_add_alias( Sys::Hostname::hostname() );
122             };
123 33         150 $self->{loaded}{hostname} = 1;
124             }
125              
126 33         138 return $self;
127             }
128              
129             1;
130              
131             __END__