package Unix::Statgrab;
use 5.00503;
use strict;
use Carp;
require Exporter;
require DynaLoader;
use AutoLoader;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
@ISA = qw(Exporter
DynaLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
# This allows declaration use Unix::Statgrab ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
%EXPORT_TAGS = ( 'all' => [ qw(
get_error drop_privileges
get_host_info
get_cpu_stats get_cpu_stats_diff get_cpu_percents
get_disk_io_stats get_disk_io_stats_diff
get_fs_stats
get_load_stats
get_mem_stats
get_swap_stats
get_network_io_stats get_network_io_stats_diff
get_network_iface_stats
get_page_stats get_page_stats_diff
get_user_stats
get_process_stats
sort_procs_by_name
sort_procs_by_pid
sort_procs_by_uid
sort_procs_by_gid
sort_procs_by_size
sort_procs_by_res
sort_procs_by_cpu
sort_procs_by_time
SG_ERROR_ASPRINTF
SG_ERROR_DEVSTAT_GETDEVS
SG_ERROR_DEVSTAT_SELECTDEVS
SG_ERROR_ENOENT
SG_ERROR_GETIFADDRS
SG_ERROR_GETMNTINFO
SG_ERROR_GETPAGESIZE
SG_ERROR_KSTAT_DATA_LOOKUP
SG_ERROR_KSTAT_LOOKUP
SG_ERROR_KSTAT_OPEN
SG_ERROR_KSTAT_READ
SG_ERROR_KVM_GETSWAPINFO
SG_ERROR_KVM_OPENFILES
SG_ERROR_MALLOC
SG_ERROR_NONE
SG_ERROR_OPEN
SG_ERROR_OPENDIR
SG_ERROR_PARSE
SG_ERROR_SETEGID
SG_ERROR_SETEUID
SG_ERROR_SETMNTENT
SG_ERROR_SOCKET
SG_ERROR_SWAPCTL
SG_ERROR_SYSCONF
SG_ERROR_SYSCTL
SG_ERROR_SYSCTLBYNAME
SG_ERROR_SYSCTLNAMETOMIB
SG_ERROR_UNAME
SG_ERROR_UNSUPPORTED
SG_ERROR_XSW_VER_MISMATCH
SG_IFACE_DUPLEX_FULL
SG_IFACE_DUPLEX_HALF
SG_IFACE_DUPLEX_UNKNOWN
SG_PROCESS_STATE_RUNNING
SG_PROCESS_STATE_SLEEPING
SG_PROCESS_STATE_STOPPED
SG_PROCESS_STATE_UNKNOWN
SG_PROCESS_STATE_ZOMBIE
) ] );
@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@EXPORT = qw(
get_error drop_privileges
get_host_info
get_cpu_stats get_cpu_stats_diff get_cpu_percents
get_disk_io_stats get_disk_io_stats_diff
get_fs_stats
get_load_stats
get_mem_stats
get_swap_stats
get_network_io_stats get_network_io_stats_diff
get_network_iface_stats
get_page_stats get_page_stats_diff
get_user_stats
get_process_stats
sort_procs_by_name
sort_procs_by_pid
sort_procs_by_uid
sort_procs_by_gid
sort_procs_by_size
sort_procs_by_res
sort_procs_by_cpu
sort_procs_by_time
SG_ERROR_ASPRINTF
SG_ERROR_DEVSTAT_GETDEVS
SG_ERROR_DEVSTAT_SELECTDEVS
SG_ERROR_ENOENT
SG_ERROR_GETIFADDRS
SG_ERROR_GETMNTINFO
SG_ERROR_GETPAGESIZE
SG_ERROR_KSTAT_DATA_LOOKUP
SG_ERROR_KSTAT_LOOKUP
SG_ERROR_KSTAT_OPEN
SG_ERROR_KSTAT_READ
SG_ERROR_KVM_GETSWAPINFO
SG_ERROR_KVM_OPENFILES
SG_ERROR_MALLOC
SG_ERROR_NONE
SG_ERROR_OPEN
SG_ERROR_OPENDIR
SG_ERROR_PARSE
SG_ERROR_SETEGID
SG_ERROR_SETEUID
SG_ERROR_SETMNTENT
SG_ERROR_SOCKET
SG_ERROR_SWAPCTL
SG_ERROR_SYSCONF
SG_ERROR_SYSCTL
SG_ERROR_SYSCTLBYNAME
SG_ERROR_SYSCTLNAMETOMIB
SG_ERROR_UNAME
SG_ERROR_UNSUPPORTED
SG_ERROR_XSW_VER_MISMATCH
SG_IFACE_DUPLEX_FULL
SG_IFACE_DUPLEX_HALF
SG_IFACE_DUPLEX_UNKNOWN
SG_PROCESS_STATE_RUNNING
SG_PROCESS_STATE_SLEEPING
SG_PROCESS_STATE_STOPPED
SG_PROCESS_STATE_UNKNOWN
SG_PROCESS_STATE_ZOMBIE
);
$VERSION = '0.04';
if ($] >= 5.006) {
*sort_procs_by_name = \&_sort_procs_by_name;
*sort_procs_by_pid = \&_sort_procs_by_pid;
*sort_procs_by_uid = \&_sort_procs_by_uid;
*sort_procs_by_gid = \&_sort_procs_by_gid;
*sort_procs_by_size = \&_sort_procs_by_size;
*sort_procs_by_res = \&_sort_procs_by_res;
*sort_procs_by_cpu = \&_sort_procs_by_cpu;
*sort_procs_by_time = \&_sort_procs_by_time;
} else {
no strict 'refs';
my $pkg = caller;
# older perls don't yet know about prototyped sort routines
*sort_procs_by_name = sub { _sort_procs_by_name(${"${pkg}::a"}, ${"${pkg}::b"}) };
*sort_procs_by_pid = sub { _sort_procs_by_pid (${"${pkg}::a"}, ${"${pkg}::b"}) };
*sort_procs_by_uid = sub { _sort_procs_by_uid (${"${pkg}::a"}, ${"${pkg}::b"}) };
*sort_procs_by_gid = sub { _sort_procs_by_gid (${"${pkg}::a"}, ${"${pkg}::b"}) };
*sort_procs_by_size = sub { _sort_procs_by_size(${"${pkg}::a"}, ${"${pkg}::b"}) };
*sort_procs_by_res = sub { _sort_procs_by_res (${"${pkg}::a"}, ${"${pkg}::b"}) };
*sort_procs_by_cpu = sub { _sort_procs_by_cpu (${"${pkg}::a"}, ${"${pkg}::b"}) };
*sort_procs_by_time = sub { _sort_procs_by_time(${"${pkg}::a"}, ${"${pkg}::b"}) };
}
sub AUTOLOAD {
# This AUTOLOAD is used to 'autoload' constants from the constant()
# XS function.
my $constname;
($constname = $AUTOLOAD) =~ s/.*:://;
croak "&Unix::Statgrab::constant not defined" if $constname eq 'constant';
my ($error, $val) = constant($constname);
if ($error) { croak $error; }
{
no strict 'refs';
# Fixed between 5.005_53 and 5.005_61
#XXX if ($] >= 5.00561) {
#XXX *$AUTOLOAD = sub () { $val };
#XXX }
#XXX else {
*$AUTOLOAD = sub { $val };
#XXX }
}
goto &$AUTOLOAD;
}
bootstrap Unix::Statgrab $VERSION;
# Preloaded methods go here.
# Autoload methods go after =cut, and are processed by the autosplit program.
1;
__END__
# Below is stub documentation for your module. You'd better edit it!
=head1 NAME
Unix::Statgrab - Perl extension for collecting information about the machine
=head1 SYNOPSIS
use Unix::Statgrab;
local $, = "\n";
my $host = get_host_info or
die get_error;
print $host->os_name,
$host->os_release,
$host->os_version,
...;
my $disks = get_disk_io_stats or
die get_error;
for (0 .. $disks->num_disks - 1) {
print $disks->disk_name($_),
$disks->read_bytes($_),
...;
}
=head1 DESCRIPTION
Unix::Statgrab is a wrapper for libstatgrab as available from L. It is a reasonably portable attempt to query interesting stats about your computer. It covers information on the operating system, CPU, memory usage, network interfaces, hard-disks etc.
Each of the provided functions follow a simple rule: It never takes any argument and returns either an object (in case of success) or C. In case C was returned, check the return value of C. Also see L<"ERROR HANDLING"> further below.
=head1 FUNCTIONS
=head2 drop_privileges()
Unix::Statgrab can be told to discard I and I privileges which is usually a good thing. If your program
doesn't need the elevated privileges somewhere else, call it right after C