Sys-Info-Driver-OSX

 view release on metacpan or  search on metacpan

lib/Sys/Info/Driver/OSX.pm  view on Meta::CPAN

}

sub _sysctl {
    my($key) = @_;

    my $success;
    my($out, $error) = capture {
        $success = ! system '/usr/sbin/sysctl' => $key;
    };

    my %rv;
    if ( $out ) {
        foreach my $row ( split RE_SYSCTL_SPLIT, $out ) {
            chomp $row;
            next if ! $row;
            my($name, $value) = _parse_sysctl_row( $row, $key );
            $rv{ $name } = $value;
        }
    }

    my $total = keys %rv;

    $error = __PACKAGE__->trim( $error ) if $error;

    return {
        value   => $total > 1 ? { %rv } : $rv{ $key },
        error   => $error,
        bogus   => $error ? _sysctl_not_exists( $error ) : 0,
        success => $success,
    };
}

sub _parse_sysctl_row {
    my($row, $key) = @_;
    my(undef, $name, $value) = split RE_SYSCTL_ROW, $row, 2;

    if ( ! defined $value || $value eq q{} ) {
        croak sprintf q(Can't happen: No value in output for property )
                     . q('%s' inside row '%s' collected from key '%s'),
                        $name || q([no name]),
                        $row,
                        $key;
    }

    return map { __PACKAGE__->trim( $_ ) } $name, $value;
}

sub _sysctl_not_exists {
    my($error) = @_;
    return if ! $error;
    foreach my $test ( SYSCTL_NOT_EXISTS ) {
        return 1 if $error =~ $test;
    }
    return 0;
}

sub powermetrics {
    my @opt = @_;
    if ( $< ) {
        croak sprintf 'powermetrics can only be executed as root and not %s (%s)',
                (getpwuid $<)[0],
                $<,
        ;
    }
    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;
        }
    }

    return %info;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME



( run in 2.886 seconds using v1.01-cache-2.11-cpan-b9db842bd85 )