File Coverage

blib/lib/Linux/Distribution.pm
Criterion Covered Total %
statement 66 68 97.0
branch 22 30 73.3
condition 12 20 60.0
subroutine 8 8 100.0
pod 0 3 0.0
total 108 129 83.7


line stmt bran cond sub pod time code
1             package Linux::Distribution;
2              
3 12     12   242725 use 5.006000;
  12         41  
  12         444  
4 12     12   55 use strict;
  12         19  
  12         318  
5 12     12   57 use warnings;
  12         25  
  12         11568  
6              
7             require Exporter;
8              
9             our @ISA = qw(Exporter);
10              
11             our @EXPORT_OK = qw( distribution_name distribution_version );
12              
13             our $VERSION = '0.22';
14              
15             our $release_files_directory='/etc';
16             our $standard_release_file = 'lsb-release';
17              
18             our %release_files = (
19             'gentoo-release' => 'gentoo',
20             'fedora-release' => 'fedora',
21             'centos-release' => 'centos',
22             'enterprise-release' => 'oracle enterprise linux',
23             'turbolinux-release' => 'turbolinux',
24             'mandrake-release' => 'mandrake',
25             'mandrakelinux-release' => 'mandrakelinux',
26             'debian_version' => 'debian',
27             'debian_release' => 'debian',
28             'SuSE-release' => 'suse',
29             'knoppix-version' => 'knoppix',
30             'yellowdog-release' => 'yellowdog',
31             'slackware-version' => 'slackware',
32             'slackware-release' => 'slackware',
33             'redflag-release' => 'redflag',
34             'redhat-release' => 'redhat',
35             'redhat_version' => 'redhat',
36             'conectiva-release' => 'conectiva',
37             'immunix-release' => 'immunix',
38             'tinysofa-release' => 'tinysofa',
39             'trustix-release' => 'trustix',
40             'adamantix_version' => 'adamantix',
41             'yoper-release' => 'yoper',
42             'arch-release' => 'arch',
43             'libranet_version' => 'libranet',
44             'va-release' => 'va-linux',
45             'pardus-release' => 'pardus',
46             'system-release' => 'amazon',
47             );
48              
49             our %version_match = (
50             'gentoo' => 'Gentoo Base System release (.*)',
51             'debian' => '(.+)',
52             'suse' => 'VERSION = (.*)',
53             'fedora' => 'Fedora(?: Core)? release (\d+) \(',
54             'redflag' => 'Red Flag (?:Desktop|Linux) (?:release |\()(.*?)(?: \(.+)?\)',
55             'redhat' => 'Red Hat(?: Enterprise)? Linux(?: Server)? release (.*) \(',
56             'oracle enterprise linux' => 'Enterprise Linux Server release (.+) \(',
57             'slackware' => '^Slackware (.+)$',
58             'pardus' => '^Pardus (.+)$',
59             'centos' => '^CentOS(?: Linux)? release (.+) \(',
60             'scientific' => '^Scientific Linux release (.+) \(',
61             'amazon' => 'Amazon Linux AMI release (.+)$',
62             );
63              
64              
65             if ($^O ne 'linux') {
66             # require Carp;
67             # Carp::croak('you are trying to use a linux specific module on a different OS');
68             }
69              
70             sub new {
71 14     14 0 217 my %self = (
72             'DISTRIB_ID' => '',
73             'DISTRIB_RELEASE' => '',
74             'DISTRIB_CODENAME' => '',
75             'DISTRIB_DESCRIPTION' => '',
76             'release_file' => '',
77             'pattern' => ''
78             );
79            
80 14         51 return bless \%self;
81             }
82              
83             sub distribution_name {
84 13   66 13 0 147 my $self = shift || new();
85 13         23 my $distro;
86 13 100       69 if ($distro = $self->_get_lsb_info()){
87 3 50       27 return $distro if ($distro);
88             }
89              
90 10         28 foreach (qw(enterprise-release fedora-release)) {
91 19 100 66     193 if (-f "$release_files_directory/$_" && !-l "$release_files_directory/$_"){
92 2 50 33     31 if (-f "$release_files_directory/$_" && !-l "$release_files_directory/$_"){
93 2         5 $self->{'DISTRIB_ID'} = $release_files{$_};
94 2         4 $self->{'release_file'} = $_;
95 2         6 return $self->{'DISTRIB_ID'};
96             }
97             }
98             }
99              
100 8         85 foreach (keys %release_files) {
101 127 100 66     1090 if (-f "$release_files_directory/$_" && !-l "$release_files_directory/$_"){
102 8 50 33     182 if (-f "$release_files_directory/$_" && !-l "$release_files_directory/$_"){
103 8 100       37 if ( $release_files{$_} eq 'redhat' ) {
104 4         10 foreach my $rhel_deriv ('centos','scientific',) {
105 7         21 $self->{'pattern'} = $version_match{$rhel_deriv};
106 7         12 $self->{'release_file'}='redhat-release';
107 7 100       21 if ( $self->_get_file_info() ) {
108 2         4 $self->{'DISTRIB_ID'} = $rhel_deriv;
109 2         5 $self->{'release_file'} = $_;
110 2         7 return $self->{'DISTRIB_ID'};
111             }
112             }
113 2         7 $self->{'pattern'}='';
114             }
115 6         17 $self->{'release_file'} = $_;
116 6         16 $self->{'DISTRIB_ID'} = $release_files{$_};
117 6         48 return $self->{'DISTRIB_ID'};
118             }
119             }
120             }
121             undef
122 0         0 }
123              
124             sub distribution_version {
125 12   66 12 0 9335 my $self = shift || new();
126 12         25 my $release;
127 12 100       1030 return $release if ($release = $self->_get_lsb_info('DISTRIB_RELEASE'));
128 10 50       49 if (! $self->{'DISTRIB_ID'}){
129 0 0       0 $self->distribution_name() or die 'No version because no distro.';
130             }
131 10         60 $self->{'pattern'} = $version_match{$self->{'DISTRIB_ID'}};
132 10         42 $release = $self->_get_file_info();
133 10         450 $self->{'DISTRIB_RELEASE'} = $release;
134 10         621 return $release;
135             }
136              
137             sub _get_lsb_info {
138 25     25   41 my $self = shift;
139 25   100     128 my $field = shift || 'DISTRIB_ID';
140 25         46 my $tmp = $self->{'release_file'};
141 25 100       380 if ( -r "$release_files_directory/" . $standard_release_file ) {
142 5         7 $self->{'release_file'} = $standard_release_file;
143 5         9 $self->{'pattern'} = $field . '=(.+)';
144 5         11 my $info = $self->_get_file_info();
145 5 50       12 if ($info){
146 5         11 $self->{$field} = $info;
147 5         21 return $info
148             }
149             }
150 20         44 $self->{'release_file'} = $tmp;
151 20         65 $self->{'pattern'} = '';
152 20         80 undef;
153             }
154              
155             sub _get_file_info {
156 22     22   36 my $self = shift;
157 22 50       671 open my $fh, '<', "$release_files_directory/" . $self->{'release_file'} or die 'Cannot open file: '.$release_files_directory.'/' . $self->{'release_file'};
158 22         51 my $info = '';
159 22         27 local $_;
160 22         408 while (<$fh>){
161 26         49 chomp $_;
162 26         488 ($info) = $_ =~ m/$self->{'pattern'}/;
163 26 100       680 return "\L$info" if $info;
164             }
165 5         76 undef;
166             }
167              
168             1;
169             __END__