burak / CPAN-Sys-Info-Driver-Linux

Linux driver for Sys::Info (Perl)

Changed (Δ392 bytes):

raw changeset »

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)

Up to file-list Build.PL:

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;

Up to file-list SPEC:

@@ -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 Exporter ();
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 64 if $lm;
42
        return '64' if $lm;
41
43
    }
42
    my $arch = $cpu[0]->{architecture};
43
    return 64 if $arch =~ m{64}xms;
44
    return 32;
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+/, $self->slurp( proc->{loadavg} );
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 || die "Parser called without data";
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+/, $cpu{flags};
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
    $OSVERSION{RAW}->{EDITION};
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 "%s based Computer", $arch;
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+/, $uptime;
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($id) || ! defined($gid);
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 { shift->uname->{nodename} }
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 ! @junk || @junk != 6;
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}i;
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  = sort( { $b->[0] cmp $a->[0] } @fstab ) if @fstab > 1;
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 { shift->uname->{machine} =~ m{64}xms ? 64 : 32 }
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/, $self->slurp( proc->{meminfo} ) ) {
270
    foreach my $line ( split /\n/xms, $self->slurp( proc->{meminfo} ) ) {
266
271
        chomp $line;
267
        my($k, $v) = split /:/, $line;
272
        my($k, $v) = split /:/xms, $line;
268
273
269
        $mem{ $k } = (split /\s+/, $self->trim( $v ) )[0];
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+/, $line;
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 = '' if not $build_date; # running since blah thingie
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 not $distro or $distro =~ m{\(gcc};
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 "%s %s (kernel: %s)",
387
    $OSVERSION{LONGNAME}         = sprintf '%s %s (kernel: %s)',
383
388
                                   @OSVERSION{ qw/ NAME         VERSION / },
384
389
                                   $kernel;
385
    $OSVERSION{LONGNAME_EDITION} = sprintf "%s %s (kernel: %s)",
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 => {

Up to file-list t/03-basic.t:

1
1
#!/usr/bin/env perl -w
2
2
use strict;
3
use warnings;
3
4
use Test::Sys::Info;
4
5
5
6
driver_ok('Linux');