burak / CPAN-Sys-Info-Driver-Linux
Linux driver for Sys::Info (Perl)
$ hg clone http://bitbucket.org/burak/cpan-sys-info-driver-linux/
| commit 22: | 938fea93e15b |
| parent 21: | e3fc6a0124b1 |
| branch: | default |
- View burak's profile
-
burak's public repos »
- CPAN-Padre-Plugin-HG
- CPAN-Net-Bitbucket
- CPAN-GD-SecurityImage
- CPAN-Lingua-TR-Numbers
- CPAN-Sys-Info-Driver-Windows
- CPAN-Task-Lingua-Any-Numbers
- CPAN-Time-Elapsed
- CPAN-Win32-ASP-CGI
- CPAN-Scalar-Util-Reftype
- CPAN-Parse-HTTP-UserAgent
- CPAN-Acme-CPANAuthors-Turkish
- CPAN-tools
- CPAN-Device-CableModem-Motorola-SB4200
- CPAN-Text-Template-Simple
- CPAN-CGI-Auth-Basic
- CPAN-GD-Thumbnail
- CPAN-Lingua-Any-Numbers
- CPAN-MP3-M3U-Parser
- CPAN-PHP-Session-DBI
- CPAN-Sys-Info
- CPAN-Sys-Info-Base
- CPAN-Sys-Info-Driver-BSD
- CPAN-Sys-Info-Driver-Linux
- CPAN-Sys-Info-Driver-Unknown
- CPAN-Test-Sys-Info
- Send message
3 months ago
Changed (Δ392 bytes):
Build.PL (3 lines added, 0 lines removed)
SPEC (1 lines added, 0 lines removed)
lib/Sys/Info/Driver/Linux.pm (3 lines added, 3 lines removed)
lib/Sys/Info/Driver/Linux/Device.pm (1 lines added, 0 lines removed)
lib/Sys/Info/Driver/Linux/Device/CPU.pm (11 lines added, 11 lines removed)
lib/Sys/Info/Driver/Linux/OS.pm (46 lines added, 42 lines removed)
t/03-basic.t (1 lines added, 0 lines removed)
1 |
1 |
use strict; |
2 |
use warnings; |
|
2 |
3 |
use lib qw( builder ); |
3 |
4 |
use Build; |
4 |
5 |
|
5 |
6 |
my $mb = Build->new; |
6 |
7 |
$mb->change_versions(1); |
7 |
8 |
$mb->create_build_script; |
9 |
||
10 |
1; |
| … | … | @@ -5,6 +5,7 @@ die "OS unsupported\n" if $^O !~ m{linux |
5 |
5 |
'Linux::Distribution' => 0, |
6 |
6 |
'Unix::Processors' => 0, |
7 |
7 |
'Sys::Info::Base' => '0.72', |
8 |
($] < 5.006 ? ( 'warnings::compat' => 0 ) : ()), |
|
8 |
9 |
}, |
9 |
10 |
build_requires => { |
10 |
11 |
'Test::Sys::Info' => '0.15', |
Up to file-list lib/Sys/Info/Driver/Linux.pm:
1 |
1 |
package Sys::Info::Driver::Linux; |
2 |
2 |
use strict; |
3 |
use warnings; |
|
3 |
4 |
use vars qw( $VERSION @ISA @EXPORT ); |
4 |
use |
|
5 |
use base qw( Exporter ); |
|
5 |
6 |
|
6 |
7 |
$VERSION = '0.73'; |
7 |
@ISA = qw( Exporter ); |
|
8 |
8 |
@EXPORT = qw( proc ); |
9 |
9 |
|
10 |
use constant proc => { |
|
10 |
use constant proc => { ## no critic (NamingConventions::Capitalization) |
|
11 |
11 |
loadavg => '/proc/loadavg', # average cpu load |
12 |
12 |
cpuinfo => '/proc/cpuinfo', # cpu information |
13 |
13 |
uptime => '/proc/uptime', # uptime file |
Up to file-list lib/Sys/Info/Driver/Linux/Device.pm:
1 |
1 |
package Sys::Info::Driver::Linux::Device; |
2 |
2 |
use strict; |
3 |
use warnings; |
|
3 |
4 |
use vars qw( $VERSION ); |
4 |
5 |
|
5 |
6 |
$VERSION = '0.70'; |
Up to file-list lib/Sys/Info/Driver/Linux/Device/CPU.pm:
1 |
1 |
package Sys::Info::Driver::Linux::Device::CPU; |
2 |
2 |
use strict; |
3 |
use warnings; |
|
3 |
4 |
use vars qw($VERSION); |
4 |
5 |
use base qw(Sys::Info::Base); |
5 |
6 |
use Sys::Info::Driver::Linux; |
6 |
7 |
use Unix::Processors; |
7 |
8 |
use POSIX (); |
9 |
use Carp qw( croak ); |
|
8 |
10 |
|
9 |
11 |
$VERSION = '0.70'; |
10 |
12 |
|
| … | … | @@ -37,39 +39,37 @@ sub bitness { |
37 |
39 |
my $flags = $cpu[0]->{flags}; |
38 |
40 |
if ( $flags ) { |
39 |
41 |
my $lm = grep { $_ eq 'lm' } @{$flags}; |
40 |
return |
|
42 |
return '64' if $lm; |
|
41 |
43 |
} |
42 |
my $arch = $cpu[0]->{architecture}; |
|
43 |
return 64 if $arch =~ m{64}xms; |
|
44 |
return |
|
44 |
return $cpu[0]->{architecture} =~ m{64}xms ? '64' : '32'; |
|
45 |
45 |
} |
46 |
46 |
|
47 |
47 |
sub load { |
48 |
48 |
my $self = shift; |
49 |
49 |
my $level = shift; |
50 |
my @loads = split /\s+/ |
|
50 |
my @loads = split /\s+/xms, $self->slurp( proc->{loadavg} ); |
|
51 |
51 |
return $loads[$level]; |
52 |
52 |
} |
53 |
53 |
|
54 |
54 |
sub _parse_cpuinfo { |
55 |
55 |
my $self = shift; |
56 |
my $raw = shift || |
|
56 |
my $raw = shift || croak 'Parser called without data'; |
|
57 |
57 |
my($k, $v); |
58 |
58 |
my %cpu; |
59 |
foreach my $line (split /\n/, $raw) { |
|
60 |
($k, $v) = split /\s+:\s+/, $line; |
|
59 |
foreach my $line (split /\n/xms, $raw) { |
|
60 |
($k, $v) = split /\s+:\s+/xms, $line; |
|
61 |
61 |
$cpu{$k} = $v; |
62 |
62 |
} |
63 |
63 |
|
64 |
my @flags = split /\s+/ |
|
64 |
my @flags = split /\s+/xms, $cpu{flags}; |
|
65 |
65 |
my %flags = map { $_ => 1 } @flags; |
66 |
66 |
my $up = Unix::Processors->new; |
67 |
67 |
(my $name = $cpu{'model name'}) =~ s[ \s{2,} ][ ]xms; |
68 |
68 |
|
69 |
69 |
return( |
70 |
70 |
processor_id => $cpu{processor}, |
71 |
data_width => $flags{lm} ? 64 : 32, # guess |
|
72 |
address_width => $flags{lm} ? 64 : 32, # guess |
|
71 |
data_width => $flags{lm} ? '64' : '32', # guess |
|
72 |
address_width => $flags{lm} ? '64' : '32', # guess |
|
73 |
73 |
bus_speed => undef, |
74 |
74 |
speed => $cpu{'cpu MHz'}, |
75 |
75 |
name => $name, |
Up to file-list lib/Sys/Info/Driver/Linux/OS.pm:
1 |
1 |
package Sys::Info::Driver::Linux::OS; |
2 |
2 |
use strict; |
3 |
use warnings; |
|
3 |
4 |
use vars qw( $VERSION ); |
4 |
5 |
use base qw( Sys::Info::Base ); |
5 |
6 |
use POSIX (); |
| … | … | @@ -7,6 +8,10 @@ use Cwd; |
7 |
8 |
use Carp qw( croak ); |
8 |
9 |
use Sys::Info::Driver::Linux; |
9 |
10 |
use Sys::Info::Constants qw( :linux ); |
11 |
use constant PIPE => q{|}; |
|
12 |
use constant FSTAB_LENGTH => 6; |
|
13 |
||
14 |
##no critic (InputOutput::ProhibitBacktickOperators) |
|
10 |
15 |
|
11 |
16 |
$VERSION = '0.70'; |
12 |
17 |
|
| … | … | @@ -111,15 +116,15 @@ my %DEBIAN_VFIX = ( |
111 |
116 |
lenny => '5.0', |
112 |
117 |
); |
113 |
118 |
|
114 |
my $EDITION_SUPPORT = join '|', keys %{ $EDITION }; |
|
115 |
my $MANUFACTURER_SUPPORT = join '|', keys %{ $MANUFACTURER }; |
|
119 |
my $EDITION_SUPPORT = join PIPE, keys %{ $EDITION }; |
|
120 |
my $MANUFACTURER_SUPPORT = join PIPE, keys %{ $MANUFACTURER }; |
|
116 |
121 |
|
117 |
122 |
# unimplemented |
118 |
123 |
sub logon_server {} |
119 |
124 |
|
120 |
125 |
sub edition { |
121 |
126 |
my $self = shift->_populate_osversion; |
122 |
|
|
127 |
return $OSVERSION{RAW}->{EDITION}; |
|
123 |
128 |
} |
124 |
129 |
|
125 |
130 |
sub tz { |
| … | … | @@ -165,7 +170,7 @@ sub meta { |
165 |
170 |
|
166 |
171 |
$info{system_manufacturer} = undef; |
167 |
172 |
$info{system_model} = undef; |
168 |
$info{system_type} = sprintf |
|
173 |
$info{system_type} = sprintf '%s based Computer', $arch; |
|
169 |
174 |
|
170 |
175 |
$info{page_file_path} = join ', ', map { $_->{Filename} } @swaps; |
171 |
176 |
|
| … | … | @@ -175,14 +180,15 @@ sub meta { |
175 |
180 |
sub tick_count { |
176 |
181 |
my $self = shift; |
177 |
182 |
my $uptime = $self->slurp( proc->{uptime} ) || return 0; |
178 |
my @uptime = split /\s+/ |
|
183 |
my @uptime = split /\s+/xms, $uptime; |
|
179 |
184 |
# this file has two entries. uptime is the first one. second: idle time |
180 |
185 |
return $uptime[LIN_UP_TIME]; |
181 |
186 |
} |
182 |
187 |
|
183 |
188 |
sub name { |
184 |
my $self = shift->_populate_osversion; |
|
185 |
my %opt = @_ % 2 ? () : (@_); |
|
189 |
my($self, @args) = @_; |
|
190 |
$self->_populate_osversion; |
|
191 |
my %opt = @args % 2 ? () : @args; |
|
186 |
192 |
my $id = $opt{long} ? ($opt{edition} ? 'LONGNAME_EDITION' : 'LONGNAME') |
187 |
193 |
: ($opt{edition} ? 'NAME_EDITION' : 'NAME' ) |
188 |
194 |
; |
| … | … | @@ -201,24 +207,23 @@ sub is_root { |
201 |
207 |
my $id = POSIX::geteuid(); |
202 |
208 |
my $gid = POSIX::getegid(); |
203 |
209 |
return 0 if $@; |
204 |
return 0 if ! defined |
|
210 |
return 0 if ! defined $id || ! defined $gid; |
|
205 |
211 |
return $id == 0 && $gid == 0 && $name eq 'root'; |
206 |
212 |
} |
207 |
213 |
|
208 |
214 |
sub login_name { |
209 |
my $self = shift; |
|
210 |
my %opt = @_ % 2 ? () : (@_); |
|
215 |
my($self, @args) = @_; |
|
216 |
my %opt = @args % 2 ? () : @args; |
|
211 |
217 |
my $login = POSIX::getlogin() || return; |
212 |
218 |
my $rv = eval { $opt{real} ? (getpwnam $login)[LIN_REAL_NAME_FIELD] : $login }; |
213 |
219 |
$rv =~ s{ [,]{3,} \z }{}xms if $opt{real}; |
214 |
220 |
return $rv; |
215 |
221 |
} |
216 |
222 |
|
217 |
sub node_name { |
|
223 |
sub node_name { return shift->uname->{nodename} } |
|
218 |
224 |
|
219 |
225 |
sub domain_name { |
220 |
226 |
my $self = shift; |
221 |
my $domain; |
|
222 |
227 |
|
223 |
228 |
foreach my $line ( $self->read_file( proc->{resolv} ) ) { |
224 |
229 |
chomp $line; |
| … | … | @@ -237,48 +242,48 @@ sub fs { |
237 |
242 |
my(@fstab, @junk, $re); |
238 |
243 |
foreach my $line( $self->read_file( proc->{fstab} ) ) { |
239 |
244 |
chomp $line; |
240 |
next if $line =~ m[^#]; |
|
241 |
@junk = split /\s+/, $line; |
|
242 |
next if |
|
245 |
next if $line =~ m{ \A \# }xms; |
|
246 |
@junk = split /\s+/xms, $line; |
|
247 |
next if ! @junk || @junk != FSTAB_LENGTH; |
|
243 |
248 |
next if lc($junk[LIN_FS_TYPE]) eq 'swap'; # ignore swaps |
244 |
249 |
$re = $junk[LIN_MOUNT_POINT]; |
245 |
next if $self->{current_dir} !~ m{\Q$re\E} |
|
250 |
next if $self->{current_dir} !~ m{\Q$re\E}xmsi; |
|
246 |
251 |
push @fstab, [ $re, $junk[LIN_FS_TYPE] ]; |
247 |
252 |
} |
248 |
253 |
|
249 |
@fstab = |
|
254 |
@fstab = reverse sort { $a->[0] cmp $b->[0] } @fstab if @fstab > 1; |
|
250 |
255 |
my $fstype = $fstab[0]->[1]; |
251 |
256 |
my $attr = $self->_fs_attributes( $fstype ); |
252 |
return |
|
257 |
return |
|
253 |
258 |
filesystem => $fstype, |
254 |
259 |
($attr ? %{$attr} : ()) |
255 |
|
|
260 |
; |
|
256 |
261 |
} |
257 |
262 |
|
258 |
sub bitness { |
|
263 |
sub bitness { return shift->uname->{machine} =~ m{64}xms ? '64' : '32' } |
|
259 |
264 |
|
260 |
265 |
# ------------------------[ P R I V A T E ]------------------------ # |
261 |
266 |
|
262 |
267 |
sub _parse_meminfo { |
263 |
268 |
my $self = shift; |
264 |
269 |
my %mem; |
265 |
foreach my $line ( split /\n/ |
|
270 |
foreach my $line ( split /\n/xms, $self->slurp( proc->{meminfo} ) ) { |
|
266 |
271 |
chomp $line; |
267 |
my($k, $v) = split /:/ |
|
272 |
my($k, $v) = split /:/xms, $line; |
|
268 |
273 |
|
269 |
$mem{ $k } = (split /\s+/ |
|
274 |
$mem{ $k } = (split /\s+/xms, $self->trim( $v ) )[0]; |
|
270 |
275 |
} |
271 |
276 |
return %mem; |
272 |
277 |
} |
273 |
278 |
|
274 |
279 |
sub _parse_swap { |
275 |
280 |
my $self = shift; |
276 |
my @swaps = split /\n/, $self->slurp( proc->{swaps} ); |
|
277 |
my @swap_title = split /\s+/, shift( @swaps ); |
|
281 |
my @swaps = split /\n/xms, $self->slurp( proc->{swaps} ); |
|
282 |
my @swap_title = split /\s+/xms, shift @swaps; |
|
278 |
283 |
my @swap_list; |
279 |
284 |
foreach my $line ( @swaps ) { |
280 |
285 |
chomp $line; |
281 |
my @data = split /\s+/ |
|
286 |
my @data = split /\s+/xms, $line; |
|
282 |
287 |
push @swap_list, |
283 |
288 |
{ |
284 |
289 |
map { $swap_title[$_] => $data[$_] } 0..$#swap_title |
| … | … | @@ -291,8 +296,8 @@ sub _ip { |
291 |
296 |
my $self = shift; |
292 |
297 |
my $raw = qx(ifconfig); |
293 |
298 |
return if not $raw; |
294 |
my @raw = split /inet addr/, $raw; |
|
295 |
if ( $raw[1] =~ m{(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})}xmso ) { |
|
299 |
my @raw = split /inet addr/xms, $raw; |
|
300 |
if ( $raw[1] =~ m{(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})}xms ) { |
|
296 |
301 |
return $1; |
297 |
302 |
} |
298 |
303 |
return; |
| … | … | @@ -301,7 +306,7 @@ sub _ip { |
301 |
306 |
sub _populate_osversion { |
302 |
307 |
return if %OSVERSION; |
303 |
308 |
my $self = shift; |
304 |
my $version = |
|
309 |
my $version = q{}; |
|
305 |
310 |
|
306 |
311 |
if ( -e proc->{'version'} && -f _) { |
307 |
312 |
$version = $self->trim( |
| … | … | @@ -312,11 +317,11 @@ sub _populate_osversion { |
312 |
317 |
); |
313 |
318 |
} |
314 |
319 |
|
315 |
my($str, $build_date) = split /\#/, $version; |
|
316 |
my($kernel, $distro) = ('',''); |
|
320 |
my($str, $build_date) = split /\#/xms, $version; |
|
321 |
my($kernel, $distro) = (q{},q{}); |
|
317 |
322 |
#$build_date = "1 Fri Jul 23 20:48:29 CDT 2004';"; |
318 |
323 |
#$build_date = "1 SMP Mon Aug 16 09:25:06 EDT 2004"; |
319 |
$build_date = |
|
324 |
$build_date = q{} if not $build_date; # running since blah thingie |
|
320 |
325 |
# format: 'Linux version 1.2.3 (foo@bar.com)' |
321 |
326 |
# format: 'Linux version 1.2.3 (foo@bar.com) (gcc 1.2.3)' |
322 |
327 |
# format: 'Linux version 1.2.3 (foo@bar.com) (gcc 1.2.3 (Redhat blah blah))' |
| … | … | @@ -329,12 +334,12 @@ sub _populate_osversion { |
329 |
334 |
} |
330 |
335 |
} |
331 |
336 |
|
332 |
$distro = 'Linux' if |
|
337 |
$distro = 'Linux' if ! $distro || $distro =~ m{\(gcc}xms; |
|
333 |
338 |
|
334 |
339 |
# kernel build date |
335 |
340 |
$build_date = $self->date2time($build_date) if $build_date; |
336 |
my $build = $build_date || ''; |
|
337 |
$build = scalar( localtime $build ) if $build; |
|
341 |
my $build = $build_date || q{}; |
|
342 |
$build = scalar localtime $build if $build; |
|
338 |
343 |
|
339 |
344 |
require Linux::Distribution; |
340 |
345 |
my $linux = Linux::Distribution->new; |
| … | … | @@ -355,8 +360,8 @@ sub _populate_osversion { |
355 |
360 |
} |
356 |
361 |
|
357 |
362 |
if ( ! $edition && $dv !~ m{[0-9]}xms ) { |
358 |
if ( $dn =~ /Debian/i ) { |
|
359 |
my @buf = split m{/}, $dv; |
|
363 |
if ( $dn =~ /Debian/xmsi ) { |
|
364 |
my @buf = split m{/}xms, $dv; |
|
360 |
365 |
if ( my $test = $DEBIAN_VFIX{ lc $buf[0] } ) { |
361 |
366 |
# Debian version comes as the edition name |
362 |
367 |
$edition = $dv; |
| … | … | @@ -368,8 +373,8 @@ sub _populate_osversion { |
368 |
373 |
%OSVERSION = ( |
369 |
374 |
NAME => $osname, |
370 |
375 |
NAME_EDITION => $edition ? "$osname ($edition)" : $osname, |
371 |
LONGNAME => '', # will be set below |
|
372 |
LONGNAME_EDITION => '', # will be set below |
|
376 |
LONGNAME => q{}, # will be set below |
|
377 |
LONGNAME_EDITION => q{}, # will be set below |
|
373 |
378 |
VERSION => $V, |
374 |
379 |
KERNEL => $kernel, |
375 |
380 |
RAW => { |
| … | … | @@ -379,10 +384,10 @@ sub _populate_osversion { |
379 |
384 |
}, |
380 |
385 |
); |
381 |
386 |
|
382 |
$OSVERSION{LONGNAME} = sprintf |
|
387 |
$OSVERSION{LONGNAME} = sprintf '%s %s (kernel: %s)', |
|
383 |
388 |
@OSVERSION{ qw/ NAME VERSION / }, |
384 |
389 |
$kernel; |
385 |
$OSVERSION{LONGNAME_EDITION} = sprintf |
|
390 |
$OSVERSION{LONGNAME_EDITION} = sprintf '%s %s (kernel: %s)', |
|
386 |
391 |
@OSVERSION{ qw/ NAME_EDITION VERSION / }, |
387 |
392 |
$kernel; |
388 |
393 |
return; |
| … | … | @@ -391,7 +396,6 @@ sub _populate_osversion { |
391 |
396 |
sub _fs_attributes { |
392 |
397 |
my $self = shift; |
393 |
398 |
my $fs = shift; |
394 |
my $_PC_PATH_MAX; |
|
395 |
399 |
|
396 |
400 |
return { |
397 |
401 |
ext3 => { |
