view release on metacpan or search on metacpan
lib/Sys/Info/Driver/OSX.pm view on Meta::CPAN
sub vm_stat {
my $success;
my($out, $error) = capture {
$success = ! system q{/usr/bin/vm_stat};
};
warn "vm_stat: $error\n" if $error;
croak "vm_stat call failed!" if ! $success;
croak "vm_stat didn't generate any output" if ! $out;
my @lines = split m{\n+}, $out;
my $page_size = shift @lines;
if ( $page_size =~ m{
\QMach Virtual Memory Statistics: (page size of\E
\s (.+?) \s
bytes\)
}xms
) {
$page_size = $1;
}
else {
croak "Unable to determine page size from input";
}
pop @lines; # some junk info line
my %rv;
for my $line ( @lines ) {
my($k, $v) = split m{[:]}xms, $line, 2;
$_ = __PACKAGE__->trim( $_ ) for $k, $v;
$k =~ s{ \A ["'] }{}xms;
$k =~ s{ ["'] \z }{}xms;
$k =~ s{ [\s\-] }{_}xmsg;
$v =~ s{ [.] \z }{}xms;
$rv{lc $k} = $v;
}
$rv{page_size} = $page_size;
lib/Sys/Info/Driver/OSX.pm view on Meta::CPAN
sub sw_vers {
my $success;
my($out, $error) = capture {
$success = ! system '/usr/bin/sw_vers';
};
$_ = __PACKAGE__->trim( $_ ) for $out, $error;
croak "Unable to capture `sw_vers`: $error" if $error || ! $success;
return map { split m{:\s+?}xms, $_ }
split m{\n}xms, $out;
}
sub fsysctl {
my $key = shift || croak 'Key is missing';
my $rv = _sysctl( $key );
my $val = $rv->{bogus} ? croak "sysctl: $key is not defined"
: $rv->{error} ? croak "Error fetching $key: $rv->{error}"
: $rv->{value}
;
return $val;
lib/Sys/Info/Driver/OSX.pm view on Meta::CPAN
}
my $success;
my($out, $error) = capture {
$success = ! system "/usr/bin/powermetrics @opt";
};
$_ = __PACKAGE__->trim( $_ ) for $out, $error;
croak "Unable to capture `powermetrics`: $error" if $error || ! $success;
my @info = split m{ [\n]+ }xms, $out;
my %info;
for my $i ( @info ) {
next if $i =~ m{ \A [*] }xms;
my($k, $v) = split m{[:]}xms, $i, 2;
$_ = __PACKAGE__->trim( $_ ) for $k, $v;
if ( $v =~ m{ \[ }xms ) {
my($subk, $subv) = split m{\s+}xms, $v, 2;
my @subv = map {
s{ [\[\]] }{}xms;
split m{ [:] \s+ }xms, $_
}
split m{ \] \s+ \[ }xms, $subv
;
$info{ $subk } = { @subv };
}
elsif ( $k =~ m{ \QC-state residency\E }xms ) {
my($subk, @subv) = split m{ [()] }xms, $v;
@subv = map { split m{ [\s] }xms, $_ } @subv;
$info{ $k } = {
value => __PACKAGE__->trim( $subk ),
map {
s{ [:] \s? }{}xms;
__PACKAGE__->trim( $_ )
} @subv,
};
}
else {
$info{ $k } = $v;
lib/Sys/Info/Driver/OSX/Device/CPU.pm view on Meta::CPAN
sub identify {
my $self = shift;
if ( ! $self->{META_DATA} ) {
my($cpu) = system_profiler( 'SPHardwareDataType' );
my $mcpu = do {
my $rv;
my $mcpu = nsysctl('machdep.cpu');
foreach my $key ( keys %{ $mcpu } ) {
my @k = split m{[.]}xms, $key;
my $e = $rv->{ shift @k } ||= {};
$e = $e->{$_} ||= {} for @k;
$e->{value} = $mcpu->{ $key };
}
$rv->{machdep}{cpu};
};
my $mach = $self->uname->{machine} || fsysctl('hw.machine_arch');
my $arch = $mach =~ m{ i [0-9] 86 }xmsi ? 'x86'
: $mach =~ m{ ia64 }xmsi ? 'IA64'
lib/Sys/Info/Driver/OSX/Device/CPU.pm view on Meta::CPAN
-n => 1,
-i => 1,
);
my %af = map { $_ => $pm{ $_ } }
grep { $pm{$_} ne ' 0 MHz' }
grep { $_ =~ m{ \QHW active frequency\E }xms }
keys %pm;
my @clusters_speed = sort { $a <=> $b }
map {
(
split m{\s+}xms,
__PACKAGE__->trim( $_ )
)[0]
}
values %af;
# get the max. Likely P-N cluster.
$speed = $clusters_speed[-1];
}
}
}
lib/Sys/Info/Driver/OSX/Device/CPU.pm view on Meta::CPAN
}
return $self->_serve_from_cache(wantarray);
}
sub load {
my $self = shift;
my $level = shift || 0;
my $raw = fsysctl('vm.loadavg') || return;
$raw =~ s<[{}]><>xmsg;
my @loads = split m{\s}xms, __PACKAGE__->trim( $raw );
if ( $level > $#loads || $level < 0 ) {
croak "Bogus load level $level specified";
}
return $loads[$level];
}
sub bitness {
my $self = shift;
my @cpus = $self->identify or return;
lib/Sys/Info/Driver/OSX/OS.pm view on Meta::CPAN
}
sub _parse_uptime {
my($value, $key, $use_gmtime) = @_;
if ( my @m = $value =~ m<\A[{](.+?)[}]\s+?(.+?)\z>xms ) {
my($data, $stamp) = @m;
my %data = map {
map {
__PACKAGE__->trim($_)
} split m{=}xms
} split m{[,]}xms, $data;
croak "sec key does not exist in $key" if ! exists $data{sec};
return $data{sec};
}
if ( my @m = $value =~ RE_DATE_STAMP ) {
my($mon_name, $mday, $hms, $year) = @m;
my $mon = $MONTH_TO_ID{ $mon_name }
|| croak "Unable to gather month from $mon_name";
my($hour, $min, $sec) = split m{:}xms, $hms;
require Time::Local;
my $converter = $use_gmtime ? \&Time::Local::timegm
: \&Time::Local::timelocal;
return $converter->( $sec, $min, $hour, $mday, $mon, $year );
}
return;
}
lib/Sys/Info/Driver/OSX/OS.pm view on Meta::CPAN
return $type eq 'yes' ? 64 : 32;
}
}
# ------------------------[ P R I V A T E ]------------------------ #
sub _probe_swap {
my($self) = @_;
# `vm_stat` ?
my $swapusage = fsysctl 'vm.swapusage';
my @sparts = split m<\s{2,}>xms, $swapusage;
my $swap_enc = $sparts[-1] =~ m{encrypted}xms ? pop @sparts : undef;
my %sw = map { split m{ \s+ = \s+ }xms, $_ } @sparts;
my $size = sub {
my($unit, $orig) = @_;
return $UNIT_TO_BYTES{ $unit }
|| croak "Unable to determine bytes from $unit unit ($orig)"
};
foreach my $prop ( qw( free used total ) ) {
my $value = $sw{ $prop } || next;
my $unit = chop $value;
$value += 0;
lib/Sys/Info/Driver/OSX/OS.pm view on Meta::CPAN
# I have no /var/log/OSInstall.custom on my system, so I believe that
# file is no longer reliable
my @idate;
push @idate, -e $FILE{cdis} ? ( stat $FILE{cdis} )[10] : ();
if ( -e $FILE{install_history} ) {
my $rec = plist( $FILE{install_history} );
push @idate, $rec ? do {
# poor mans date parser
my $d = $rec->[0]{date} || q();
my($y,$h) = split m{T}xms, $d, 2;
if ( $y && $h ) {
chop $h;
my($year, $mon, $mday) = split m{\-}xms, $y;
my($hour, $min, $sec) = split m{:}xms, $h;
require Time::Local;
Time::Local::timelocal(
$sec, $min, $hour, $mday, $mon - 1, $year
);
}
else {
()
}
} : ();
}
lib/Sys/Info/Driver/OSX/OS.pm view on Meta::CPAN
: $MACOS->{ $major };
return $name || 'Unknown macOS';
}
sub _populate_osversion {
return if %OSVERSION;
my $self = shift;
my $uname = $self->uname;
# 'Darwin Kernel Version 10.5.0: Fri Nov 5 23:20:39 PDT 2010; root:xnu-1504.9.17~1/RELEASE_I386',
my($stuff, $root) = split m{;}xms, $uname->{version}, 2;
my($name, $stamp) = split m{:}xms, $stuff, 2;
$_ = __PACKAGE__->trim( $_ ) for $stuff, $root, $name, $stamp;
my %sw_vers = sw_vers();
my $build_date = $stamp ? $self->date2time( $stamp ) : undef;
my $build = $sw_vers{BuildVersion} || $stamp;
my $raw_version = __PACKAGE__->trim( $sw_vers{ProductVersion} || $uname->{release} );
my($major, $minor, $patch) = split m{[.]}xms, $raw_version;
my $edition = $self->_probe_edition( $major, $minor, $patch );
my $sysname = $uname->{sysname} eq 'Darwin'
? ( $major == 10 ? 'Mac OSX' : 'macOS' )
: $uname->{sysname};
my %v = (
BUILD => defined $build ? __PACKAGE__->trim($build) : 0,
BUILD_DATE => defined $build_date ? __PACKAGE__->trim($build_date) : 0,
EDITION => $edition,