File Coverage

blib/lib/Siebel/AssertOS/Linux/Distribution.pm
Criterion Covered Total %
statement 33 68 48.5
branch 6 30 20.0
condition 2 20 10.0
subroutine 7 8 87.5
pod 0 3 0.0
total 48 129 37.2


line stmt bran cond sub pod time code
1             package Siebel::AssertOS::Linux::Distribution;
2            
3 2     2   32 use 5.006000;
  2         6  
  2         124  
4 2     2   12 use strict;
  2         2  
  2         68  
5 2     2   11 use warnings;
  2         2  
  2         3404  
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.01';
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             );
47            
48             our %version_match = (
49             'gentoo' => 'Gentoo Base System release (.*)',
50             'debian' => '(.+)',
51             'suse' => 'VERSION = (.*)',
52             'fedora' => 'Fedora(?: Core)? release (\d+) \(',
53             'redflag' => 'Red Flag (?:Desktop|Linux) (?:release |\()(.*?)(?: \(.+)?\)',
54             'redhat' => 'Red Hat(?: Enterprise)? Linux(?: Server)? release (.*) \(',
55             'oracle enterprise linux' => 'Enterprise Linux Server release (.+) \(',
56             'slackware' => '^Slackware (.+)$',
57             'pardus' => '^Pardus (.+)$',
58             'centos' => '^CentOS(?: Linux)? release (.+)(?:\s\(Final\))',
59             'scientific' => '^Scientific Linux release (.+) \(',
60             );
61            
62             if ( $^O ne 'linux' ) {
63            
64             # require Carp;
65             # Carp::croak('you are trying to use a linux specific module on a different OS');
66             }
67            
68             sub new {
69 1     1 0 5 my %self = (
70             'DISTRIB_ID' => '',
71             'DISTRIB_RELEASE' => '',
72             'DISTRIB_CODENAME' => '',
73             'DISTRIB_DESCRIPTION' => '',
74             'release_file' => '',
75             'pattern' => ''
76             );
77            
78 1         15 return bless \%self;
79             }
80            
81             sub distribution_name {
82 1   33 1 0 10 my $self = shift || new();
83 1         2 my $distro;
84 1 50       4 if ( $distro = $self->_get_lsb_info() ) {
85 1 50       20 return $distro if ($distro);
86             }
87            
88 0         0 foreach (qw(enterprise-release fedora-release)) {
89 0 0 0     0 if ( -f "$release_files_directory/$_"
90             && !-l "$release_files_directory/$_" )
91             {
92 0 0 0     0 if ( -f "$release_files_directory/$_"
93             && !-l "$release_files_directory/$_" )
94             {
95 0         0 $self->{'DISTRIB_ID'} = $release_files{$_};
96 0         0 $self->{'release_file'} = $_;
97 0         0 return $self->{'DISTRIB_ID'};
98             }
99             }
100             }
101            
102 0         0 foreach ( keys %release_files ) {
103 0 0 0     0 if ( -f "$release_files_directory/$_"
104             && !-l "$release_files_directory/$_" )
105             {
106 0 0 0     0 if ( -f "$release_files_directory/$_"
107             && !-l "$release_files_directory/$_" )
108             {
109 0 0       0 if ( $release_files{$_} eq 'redhat' ) {
110 0         0 foreach my $rhel_deriv ( 'centos', 'scientific', ) {
111 0         0 $self->{'pattern'} = $version_match{$rhel_deriv};
112 0         0 $self->{'release_file'} = 'redhat-release';
113 0 0       0 if ( $self->_get_file_info() ) {
114 0         0 $self->{'DISTRIB_ID'} = $rhel_deriv;
115 0         0 $self->{'release_file'} = $_;
116 0         0 return $self->{'DISTRIB_ID'};
117             }
118             }
119 0         0 $self->{'pattern'} = '';
120             }
121 0         0 $self->{'release_file'} = $_;
122 0         0 $self->{'DISTRIB_ID'} = $release_files{$_};
123 0         0 return $self->{'DISTRIB_ID'};
124             }
125             }
126             }
127 0         0 undef;
128             }
129            
130             sub distribution_version {
131 0   0 0 0 0 my $self = shift || new();
132 0         0 my $release;
133 0 0       0 return $release if ( $release = $self->_get_lsb_info('DISTRIB_RELEASE') );
134 0 0       0 if ( !$self->{'DISTRIB_ID'} ) {
135 0 0       0 $self->distribution_name() or die 'No version because no distro.';
136             }
137 0         0 $self->{'pattern'} = $version_match{ $self->{'DISTRIB_ID'} };
138 0         0 $release = $self->_get_file_info();
139 0         0 $self->{'DISTRIB_RELEASE'} = $release;
140 0         0 return $release;
141             }
142            
143             sub _get_lsb_info {
144 1     1   2 my $self = shift;
145 1   50     6 my $field = shift || 'DISTRIB_ID';
146 1         2 my $tmp = $self->{'release_file'};
147 1 50       234 if ( -r "$release_files_directory/" . $standard_release_file ) {
148 1         3 $self->{'release_file'} = $standard_release_file;
149 1         3 $self->{'pattern'} = $field . '=(.+)';
150 1         4 my $info = $self->_get_file_info();
151 1 50       4 if ($info) {
152 1         3 $self->{$field} = $info;
153 1         7 return $info;
154             }
155             }
156 0         0 $self->{'release_file'} = $tmp;
157 0         0 $self->{'pattern'} = '';
158 0         0 undef;
159             }
160            
161             sub _get_file_info {
162 1     1   2 my $self = shift;
163 1 50       52 open my $fh, '<', "$release_files_directory/" . $self->{'release_file'}
164             or die 'Cannot open file: '
165             . $release_files_directory . '/'
166             . $self->{'release_file'};
167 1         2 my $info = '';
168 1         3 local $_;
169 1         17 while (<$fh>) {
170 1         3 chomp $_;
171 1         32 ($info) = $_ =~ m/$self->{'pattern'}/;
172 1 50       25 return "\L$info" if $info;
173             }
174 0           undef;
175             }
176            
177             1;
178             __END__