#! /usr/bin/perl -w use strict; use BSD::Sysctl qw(sysctl sysctl_description sysctl_set); use Getopt::Std; use IO::Pipe; use vars '$VERSION'; $VERSION = '0.1'; getopts( 'CdeosSV', \my %opt ); if ($opt{V}) { print $VERSION, $/; exit; } if ($opt{S}) { # Scan my $s = IO::Pipe->new; $s->reader(qw(/sbin/sysctl -Nao)) or die "Cannot open pipe from sysctl: $!\n"; while (<$s> ) { chomp; print "$_: ", pretty(sysctl($_)), "\n"; } } elsif ($opt{s}) { $< and die "Not running as root\n"; my $variable = shift or die "No variable name given\n"; my $value = shift or die "No value for $variable given\n"; my $old = sysctl($variable) or die "Failed to fetch $variable\n"; if (sysctl_set($variable, $value)) { print "old value: $old\n"; my $new = sysctl($variable); print "new value: $new\n"; } else { print "error: \$!=$!\n"; } } else { for my $mib (@ARGV) { if ($opt{o}) { # oid if (my $info = BSD::Sysctl::_mib_info($mib)) { my ($fmtkey, @oid) = unpack( 'i i/i', $info ); print "$mib => ", join('.', @oid), " (fmt=$fmtkey)\n"; } else { warn "no such mib: $mib\n"; } } elsif ($opt{d}) { # description if (my $desc = sysctl_description($mib)) { print "$mib: $desc\n"; } } elsif ($opt{e}) { # exists print "$mib ", ( BSD::Sysctl::_mib_exists($mib) ? 'exists' : 'does not exist' ), $/; } else { # just print if (my $val = sysctl($mib)) { print "$mib: ", pretty($val), "\n"; } } } } if ($opt{C}) { # cache dumper for my $k (sort keys %BSD::Sysctl::MIB_CACHE) { print "cache $k => [@{[unpack('i i/i', $BSD::Sysctl::MIB_CACHE{$k})]}]\n"; } } sub pretty { my $val = shift; if (ref($val) eq 'HASH') { my $out = "{\n"; $out .= " $_ => $val->{$_}\n" for sort keys %$val; return $out . '}'; } elsif (ref($val) eq 'ARRAY') { local $" = ', '; return "[@$val]"; } else { return $val; } }