Sys-Info-Driver-OSX

 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,



( run in 0.623 second using v1.01-cache-2.11-cpan-71847e10f99 )