From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
no warnings;
our %_URL = (
'archconf_expanded' => '/archconf_expanded.txt',
'contentfilter_status' => '/ContentFilter/Status',
'sysinfo' => '/SYSINFO',
);
our %defaults = (
'appliancehost' => 'proxy',
'applianceport' => 8082,
'applianceusername' => 'admin',
'appliancepassword' => 'password',
'applianceconnectmode' => 'https',
'debuglevel' => 0,
);
=head1 NAME
Net::BlueCoat::SGOS - A module to interact with Blue Coat SGOS-based devices.
=head1 VERSION
Version 0.91
=cut
our $VERSION = '0.91';
=head1 SYNOPSIS
This module interacts with Blue Coat SGOS-based devices. Right
now, this is limited to parsing of the 'sysinfo' data from the
device.
use strict; #always!
use Net::BlueCoat::SGOS;
my $bc = Net::BlueCoat::SGOS->new(
'appliancehost' => 'swg.example.com',
'applianceport' => 8082,
'applianceuser' => 'admin',
'appliancepassword' => 'password'
);
$bc->login();
# or
# my $bc = Net::BlueCoat::SGOS->new();
# $bc->get_sysinfo_from_file('/path/to/file.sysinfo');
my $sgosversion = $bc->{'sgosversion'};
my $sgosreleaseid = $bc->{'sgosreleaseid'};
my $serialnumber = $bc->{'serialnumber'};
my $modelnumber = $bc->{'modelnumber'};
my $sysinfotime = $bc->{'sysinfotime'};
# Hardware section of the sysinfo file
my $hwinfo = $bc->{'sgos_sysinfo_sect'}{'Hardware Information'};
# Software configuration (i.e. show configuration)
my $swconfig = $bc->{'sgos_sysinfo_sect'}{'Software Configuration'};
=head1 SUBROUTINES/METHODS
Below are methods for Net::BlueCoat::SGOS.
=cut
=head2 new
Creates a new Net::BlueCoat::SGOS object. Can be passed one of the following:
appliancehost
applianceport
applianceusername
appliancepassword
applianceconnectmode (one of http or https)
debuglevel
=cut
sub new {
my $class = shift;
my $self = {};
bless($self, $class);
my %args = (%defaults, @_);
$self->{'_appliancehost'} = $args{'appliancehost'};
$self->{'_applianceport'} = $args{'applianceport'};
$self->{'_applianceusername'} = $args{'applianceusername'};
$self->{'_appliancepassword'} = $args{'appliancepassword'};
$self->{'_connectmode'} = $args{'applianceconnectmode'};
$self->{'_debuglevel'} = $args{'debuglevel'};
$self->{'_lwpua'} = LWP::UserAgent->new();
$self->{'_lwpua'}->agent("Net::BlueCoat/$VERSION");
return $self;
}
=head2 login
Logs into the Blue Coat appliance using the parameters given when
constructed.
=cut
sub login {
my $self = shift;
my %args = (%defaults, @_);
if (!$self->{'_appliancehost'}) {
$self->{'_appliancehost'} = $args{'appliancehost'};
}
if (!$self->{'_applianceport'}) {
$self->{'_applianceport'} = $args{'applianceport'};
}
if (!$self->{'_applianceusername'}) {
$self->{'_applianceusername'} = $args{'applianceusername'};
}
if (!$self->{'_appliancepassword'}) {
$self->{'_appliancepassword'} = $args{'appliancepassword'};
}
if (!$self->{'_applianceconnectmode'}) {
$self->{'_applianceconnectmode'} = $args{'applianceconnectmode'};
}
if (!$self->{'_debuglevel'}) {
$self->{'_debuglevel'} = $args{'debuglevel'};
}
if ( $self->{'_appliancehost'}
&& $self->{'_applianceport'}
&& $self->{'_applianceconnectmode'}
&& $self->{'_applianceusername'}
&& $self->{'_appliancepassword'}) {
if ($self->{'_applianceconnectmode'} eq 'https') {
$self->{'_applianceurlbase'} = q#https://# . $self->{'_appliancehost'} . q#:# . $self->{'_applianceport'};
}
elsif ($self->{'_applianceconnectmode'} eq 'http') {
$self->{'_applianceurlbase'} = q#http://# . $self->{'_appliancehost'} . q#:# . $self->{'_applianceport'};
}
$self->{'_lwpnetloc'} = $self->{'_appliancehost'} . q/:/ . $self->{'_applianceport'};
if ($self->{'_debuglevel'} > 0) {
print 'connecting to ' . $self->{'_applianceurlbase'} . "\n";
print 'lwpnetloc=' . $self->{'_lwpnetloc'} . "\n";
}
my $response = $self->{'_lwpua'}->get($self->{'_applianceurlbase'});
my $rawrealm = $response->header('www-authenticate');
($self->{'_appliancerealm'}) = $rawrealm =~ m/realm=\"(.*)\"$/isx;
if ($self->{'_debuglevel'} > 0) {
print 'rawrealm=' . $rawrealm . "\n";
print 'appliancerealm=' . $self->{'_appliancerealm'} . "\n";
print 'applianceusername=' . $self->{'_applianceusername'} . "\n";
print 'appliancepassword=' . $self->{'_appliancepassword'} . "\n";
print "passed to credentials:\n";
print $self->{'_lwpnetloc'} . "\n";
print $self->{'_appliancerealm'} . "\n";
print $self->{'_applianceusername'} . "\n";
print $self->{'_appliancepassword'} . "\n";
}
$self->{'_lwpua'}->credentials(
$self->{'_lwpnetloc'},
$self->{'_appliancerealm'},
$self->{'_applianceusername'},
$self->{'_appliancepassword'}
);
}
my $r = $self->_get_sysinfo();
if (!defined($r)) {
return undef;
}
else {
return 1;
}
}
=head2 get_sysinfo_from_file
Takes one parameter: the filename of a sysinfo file on the disk. Use this
instead of logging in over the network.
$bc->get_sysinfo_from_file('sysinfo.filename.here');
=cut
sub get_sysinfo_from_file {
my $self = shift;
my $filename = shift;
if ($self->{'_debuglevel'} > 0) {
print "sub:get_sysinfo_from_file, filename=$filename\n";
}
if (-f $filename) {
open(FSDFLKFJ, '<' . $filename);
# slurp
{
local $/ = undef;
$self->{'_sgos_sysinfo'} = <FSDFLKFJ>;
}
close FSDFLKFJ;
#$self->{'_sgos_sysinfo'} = `head -4000 "$filename"`;
if ($self->{'_sgos_sysinfo'}) {
# remove CR+LF
$self->{'_sgos_sysinfo'} =~ s/\r\n/\n/gi;
my $r = $self->_parse_sysinfo();
if ($r) {
# yes, if data
return 1;
}
else {
return undef;
}
}
else {
return undef;
}
}
else {
# no filename specified
return undef;
}
}
sub _get_sysinfo {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print 'Getting ' . $self->{'_applianceurlbase'} . $_URL{'sysinfo'} . "\n";
}
my $r = $self->{'_lwpua'}->get($self->{'_applianceurlbase'} . $_URL{'sysinfo'});
if ($r->is_error) {
return undef;
}
else {
$self->{'_sgos_sysinfo'} = $r->content;
if ($self->{'_debuglevel'} > 0) {
print 'status=' . $r->status_line . "\n";
#print 'sysinfo=' . $r->content . "\n";
}
}
if ($self->{'_sgos_sysinfo'}) {
# remove CR+LF
$self->{'_sgos_sysinfo'} =~ s/\r\n/\n/gi;
my $r = $self->_parse_sysinfo();
if ($r) {
return 1;
}
else {
return undef;
}
}
else {
return undef;
}
}
sub _parse_sysinfo {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_sysinfo\n";
}
my @split_sysinfo =
split(/__________________________________________________________________________/, $self->{'_sgos_sysinfo'});
$self->{'_sgos_sysinfo_split_count'} = $#split_sysinfo;
# init the % var
$self->{'sgos_sysinfo_sect'}{'_ReportInfo'} = $split_sysinfo[0];
foreach (1 .. $#split_sysinfo) {
my $chunk = $split_sysinfo[$_];
my @section = split(/\n/, $chunk);
chomp @section;
# the first 2 lines are junk
shift @section;
shift @section;
my $sectionname = shift @section;
if ($sectionname eq 'Software Configuration') {
# get rid of 3 lines from top and 1 from bottom
shift @section;
shift @section;
shift @section;
pop @section;
}
if ($sectionname eq 'TCP/IP Routing Table') {
shift @section;
shift @section;
shift @section;
shift @section;
shift @section;
}
# throw away the next line, it contains the URL for the source data
shift @section;
my $data = join("\n", @section);
$self->{'sgos_sysinfo_sect'}{$sectionname} = $data;
}
# parse version
$self->_parse_sgos_version();
# parse releaseid
$self->_parse_sgos_releaseid();
# parse serial number
$self->_parse_serial_number();
# parse sysinfo time
$self->_parse_sysinfo_time();
# parse model
$self->_parse_model_number();
# parse the configuration
if ($self->{'sgos_sysinfo_sect'}{'Software Configuration'}) {
$self->_parse_swconfig;
$self->{'sysinfo_type'} = 'sysinfo';
}
else {
$self->{'sysinfo_type'} = 'sysinfo_snapshot';
return undef;
}
# parse VPM-CPL and VPM-XML
$self->_parse_vpm();
# parse the static bypass list
$self->_parse_static_bypass();
# parse the appliance name
$self->_parse_appliance_name();
# parse the network information
$self->_parse_network();
# parse the ssl accelerator info
$self->_parse_ssl_accelerator();
# parse the default gateway
$self->_parse_default_gateway();
# parse the route table
$self->_parse_route_table();
return 1;
}
# Find appliance-name
# located in the Software Configuration
# looks like:
# appliance-name "ProxySG 210 4609077777"
# limited to 127 characters
# e.g.: % String exceeds allowed length (127)
#
sub _parse_appliance_name {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_swconfig\n";
}
(undef, $self->{'appliance-name'}) =
$self->{'sgos_sysinfo_sect'}{'Software Configuration'} =~ m/(appliance-name|hostname) (.+)$/im;
$self->{'appliance-name'} =~ s/^\"//;
$self->{'appliance-name'} =~ s/\"$//;
if ($self->{'_debuglevel'} > 0) {
print "appliancename=$self->{'appliance-name'}\n";
}
}
# model
# Model: 200-B
sub _parse_model_number {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_model_number\n";
}
($self->{'modelnumber'}) = $self->{'sgos_sysinfo_sect'}{'Hardware Information'} =~ m/Model:\s(.+)/im;
}
# get network
# Network:
# Interface 0:0: Bypass 10/100 with no link (MAC 00:d0:83:04:ae:fc)
# Interface 0:1: Bypass 10/100 running at 100 Mbps full duplex (MAC 00:d0:83:04:ae:fd)
sub _parse_network {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_network\n";
}
my ($netinfo) = $self->{'sgos_sysinfo_sect'}{'Hardware Information'} =~ m/Network:(.+)Accelerators/ism;
my @s = split(/\n/, $netinfo);
chomp @s;
foreach (@s) {
my $line = $_;
my ($interface) = $line =~ m/Interface\s+(.+)\:\s/im;
my ($mac) = $line =~ m/\(MAC\s(.+)\)/im;
my ($running) = $line =~ m/running\sat\s(.+)\s\(MAC/im;
my $capabilities;
#Interface 0:0: Intel Gigabit running at 1 Gbps full duplex (MAC 00:e0:81:79:a5:1a)
#Interface 2:0: Bypass 10/100/1000 with no link (MAC 00:e0:ed:0b:67:e6)
if ($line =~ m/running at/) {
($capabilities) = $line =~ m/Interface\s$interface\:\s\w+(.+)\s+running at/;
}
if ($line =~ m/with no link/) {
($capabilities) = $line =~ m/Interface\s$interface\:\s\w+(.+)\s+with no link/;
}
if ($capabilities) {
$capabilities =~ s/\s+//ig;
}
if ($interface && $capabilities) {
$self->{'interface'}{$interface}{'capabilities'} = $capabilities;
}
#print "Running=$running\n";
if ($interface && $mac) {
$self->{'interface'}{$interface}{'mac'} = $mac;
}
if ($interface && $running) {
$self->{'interface'}{$interface}{'linkstatus'} = $running;
}
if ($interface && !$running) {
$self->{'interface'}{$interface}{'linkstatus'} = 'no link';
}
#print "interface=$interface, mac=$mac\n";
}
# supplement from swconfig/networking
#print "getting supplemental networking info\n";
my @t = split(/\n/, $self->{'sgos_swconfig_section'}{'networking'});
chomp @t;
if ($#t < 2) {
@t = split(/\n/, $self->{'sgos_sysinfo_sect'}{'Software Configuration'});
}
my $interface;
my ($ip, $netmask);
foreach (@t) {
my $line = $_;
if ($line =~ m/interface (.+)\;/i) {
($interface) = $line =~ m/^interface (\d+\:?\d*\.*\d*)/i;
}
# sgos4, ip address and subnet mask are on separate lines
# sgos5, ip address and subnet mask are on SAME line
if ($line =~ m/ip-address/) {
($ip, $netmask) = $line =~ m/^ip-address *(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) *(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})*/i;
$ip =~ s/\s+//gi;
$netmask =~ s/\s+//gi;
}
if ($line =~ m/subnet-mask/) {
($netmask) = $line =~ m/^subnet-mask *(.{1,3}\..{1,3}\..{1,3}\..{1,3})/i;
$netmask =~ s/\s+//gi;
}
if (length($interface) > 1 && $ip && $netmask) {
$self->{'interface'}{$interface}{'ip'} = $ip;
$self->{'interface'}{$interface}{'netmask'} = $netmask;
$interface = undef;
$ip = undef;
}
}
}
sub _parse_swconfig {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_swconfig\n";
}
my @split_swconfig =
split(/\n/, $self->{'sgos_sysinfo_sect'}{'Software Configuration'});
# only applies to SGOS >5
my $sectionname = '';
foreach (1 .. $#split_swconfig) {
my $line = $split_swconfig[$_];
chomp $line;
if ($line =~ m/!- BEGIN/) {
($sectionname) = $line =~ m/!- BEGIN (.+)/;
}
elsif ($line =~ m/!- END/) {
next;
}
else {
$self->{'sgos_swconfig_section'}{$sectionname} = $self->{'sgos_swconfig_section'}{$sectionname} . $line . "\n";
}
}
}
sub _parse_static_bypass {
my $self = shift;
my @lines = split(/\n/, $self->{'sgos_sysinfo_sect'}{'Software Configuration'});
my $have_static_bypass;
foreach my $line (@lines) {
if ($line =~ m/static-bypass/) {
$have_static_bypass = 1;
}
elsif ($have_static_bypass) {
if ($line =~ m/exit/) {
last;
}
else {
$line =~ s/^add //i;
$self->{'static-bypass'} = $self->{'static-bypass'} . $line . "\n";
}
}
}
}
sub _parse_vpm {
my $self = shift;
my @lines = split(/\n/, $self->{'sgos_sysinfo_sect'}{'Software Configuration'});
my $have_vpm_cpl;
my $have_vpm_xml;
foreach my $line (@lines) {
if ($line =~ m/^inline policy vpm-cpl \"*end-(\d+)-inline\"*/) {
($have_vpm_cpl) = $line =~ m/^inline policy vpm-cpl \"*end-(\d+)-inline\"*/;
}
elsif ($have_vpm_cpl) {
if ($line =~ m/end-$have_vpm_cpl-inline/i) {
last;
}
else {
$self->{'vpm-cpl'} = $self->{'vpm-cpl'} . $line . "\n";
}
}
}
foreach my $line (@lines) {
if ($line =~ m/^inline policy vpm-xml \"*end-(\d+)-inline\"*/) {
($have_vpm_xml) = $line =~ m/^inline policy vpm-xml \"*end-(\d+)-inline\"*/;
}
elsif ($have_vpm_xml) {
if ($line =~ m/end-$have_vpm_xml-inline/i) {
last;
}
else {
$self->{'vpm-xml'} = $self->{'vpm-xml'} . $line . "\n";
}
}
}
return 1 if ($self->{'vpm-cpl'} && $self->{'vpm-xml'});
}
=head2 vpmcpl
Displays the VPM-CPL data. Note that this does not currently return the
local, central, or forwarding policies.
=cut
sub vpmcpl {
my $self = shift;
return $self->{'vpm-cpl'};
}
=head2 vpmxml
Displays the VPM-XML data.
=cut
sub vpmxml {
my $self = shift;
return $self->{'vpm-xml'};
}
sub _parse_default_gateway {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
}
my @s = split(/\n/, $self->{'sgos_swconfig_section'}{'networking'});
chomp @s;
if ($#s < 2) {
@s = split(/\n/, $self->{'sgos_sysinfo_sect'}{'Software Configuration'});
}
foreach my $line (@s) {
if ($line =~ m/ip-default-gateway/) {
($self->{'ip-default-gateway'}) = $line =~ m/^ip-default-gateway +(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
}
}
}
sub _parse_route_table {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
}
#inline static-route-table "end-398382495-inline"
#; IP-Address Subnet Mask Gateway
#172.16.0.0 255.240.0.0 172.20.144.1
#end-398382495-inline
my @r;
if ($self->{'sgos_sysinfo_sect'}{'TCP/IP Routing Table'}) {
$self->{'routetable'} = $self->{'sgos_sysinfo_sect'}{'TCP/IP Routing Table'};
}
else {
@r = split(/\n/, $self->{'sgos_sysinfo_sect'}{'Software Configuration'});
}
my $marker;
foreach my $line (@r) {
if ($line =~ m/inline static-route-table \"end-\d+-inline\"/i) {
($marker) = $line =~ m/inline static-route-table \"end-(\d+)-inline\"/i;
}
if ($line =~ m/end-$marker-inline/) {
$marker = undef;
}
if ($marker && $line !~ /$marker/i) {
if ($line =~ m/^\s*?\;/) { next }
if ($line =~
m/\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
) {
$self->{'static-route-table'} = $self->{'static-route-table'} . $line . "\n";
}
}
}
}
sub _parse_serial_number {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_sgos_serial_number\n";
}
($self->{'serialnumber'}) = $self->{'sgos_sysinfo_sect'}{'Version Information'} =~ m/Serial\snumber\sis\s(\d+)/isx;
}
sub _parse_ssl_accelerator {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_ssl_accelerator\n";
}
# SSL Accelerators
# looks like:
# Accelerators: none
# or
# Accelerators:
# Internal: Cavium CN1010 Security Processor
# Internal: Cavium CN501 Security Processor
# Internal: Broadcom 5825 Security Processor
#
my ($acceleratorinfo) = $self->{'sgos_sysinfo_sect'}{'Hardware Information'} =~ m/(Accelerators\:.+)/ism;
my @a = split(/\n/, $acceleratorinfo);
#print "There are $#a lines\n";
# if 1 line, then no SSL accelerator
if ($#a == 0) {
$self->{'ssl-accelerator'} = 'none';
}
if ($#a > 0) {
($self->{'ssl-accelerator'}) = $a[1] =~ m/\s+(.+)/;
}
# print "DEBUG: acceleratorinfo=$acceleratorinfo\n";
#print "DEBUG: ssl-accelerator=$self->{'ssl-accelerator'}\n";
}
# sysinfo time
# time on this file
# The current time is Mon Nov 23, 2009 18:48:38 GMT (SystemTime 438547718)
# The current time is Sat Mar 7, 2009 16:57:30 GMT (SystemTime 415990650)
sub _parse_sysinfo_time {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_sysinfo_time\n";
}
($self->{'sysinfotime'}) = $self->{'sgos_sysinfo_sect'}{'Version Information'} =~ m/^The current time is (.+) \(/im;
}
sub _parse_sgos_releaseid {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_sgos_releaseid\n";
}
# parse SGOS version, SGOS releaseid, and serial number
# SGOS release ID
($self->{'sgosreleaseid'}) = $self->{'sgos_sysinfo_sect'}{'Version Information'} =~ m/Release\sid:\s(\d+)/isx;
}
sub _parse_sgos_version {
my $self = shift;
if ($self->{'_debuglevel'} > 0) {
print "_parse_sgos_version\n";
}
# parse SGOS version, SGOS releaseid, and serial number
if ($self->{'_debuglevel'} > 0) {
print "VERSION INFO SECTION:\n";
print $self->{'sgos_sysinfo_sect'}{'Version Information'} . "\n";
}
# SGOS version
# #Version Information
# URL_Path /SYSINFO/Version
# Blue Coat Systems, Inc., ProxySG Appliance Version Information
# Version: SGOS 4.2.10.1
#
($self->{'sgosversion'}) = $self->{'sgos_sysinfo_sect'}{'Version Information'} =~ m/Version:\sSGOS\s(\d+\.\d+\.\d+\.\d+)/im;
if ($self->{'_debuglevel'} > 0) {
print "SGOS version = $self->{'sgosversion'}\n";
}
}
=head2 Other Data
Other data that is directly accessible in the object:
Appliance Name: $bc->{'appliance-name'}
Model Number: $bc->{'modelnumber'}
Serial Number: $bc->{'serialnumber'}
SGOS Version: $bc->{'sgosversion'}
Release ID: $bc->{'sgosreleaseid'}
Default Gateway: $bc->{'ip-default-gateway'}
Sysinfo Time: $bc->{'sysinfotime'}
Accelerator Info: $bc->{'ssl-accelerator'}
The software configuration can be retrieved as follows:
$bc->{'sgos_sysinfo_sect'}{'Software Configuration'}
Other sections that can be retrieved:
$bc->{'sgos_sysinfo_sect'}{'Software Configuration'}
$bc->{'sgos_sysinfo_sect'}{'ADN Compression Statistics'}
$bc->{'sgos_sysinfo_sect'}{'ADN Configuration'}
$bc->{'sgos_sysinfo_sect'}{'ADN Node Info'}
$bc->{'sgos_sysinfo_sect'}{'ADN Sizing Peers'}
$bc->{'sgos_sysinfo_sect'}{'ADN Sizing Statistics'}
$bc->{'sgos_sysinfo_sect'}{'ADN Tunnel Statistics'}
$bc->{'sgos_sysinfo_sect'}{'AOL IM Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Access Log Objects'}
$bc->{'sgos_sysinfo_sect'}{'Access Log Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Authenticator Memory Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Authenticator Realm Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Authenticator Total Realm Statistics'}
$bc->{'sgos_sysinfo_sect'}{'CCM Configuration'}
$bc->{'sgos_sysinfo_sect'}{'CCM Statistics'}
$bc->{'sgos_sysinfo_sect'}{'CIFS Memory Usage'}
$bc->{'sgos_sysinfo_sect'}{'CIFS Statistics'}
$bc->{'sgos_sysinfo_sect'}{'CPU Monitor'}
$bc->{'sgos_sysinfo_sect'}{'CacheEngine Main'}
$bc->{'sgos_sysinfo_sect'}{'Configuration Change Events'}
$bc->{'sgos_sysinfo_sect'}{'Content Filter Status'}
$bc->{'sgos_sysinfo_sect'}{'Core Image'}
$bc->{'sgos_sysinfo_sect'}{'Crypto Statistics'}
$bc->{'sgos_sysinfo_sect'}{'DNS Cache Statistics'}
$bc->{'sgos_sysinfo_sect'}{'DNS Query Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Disk 1'}
... and up to Disk 10, in some cases
$bc->{'sgos_sysinfo_sect'}{'Endpoint Mapper Internal Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Endpoint Mapper Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Endpoint Mapper database contents'}
$bc->{'sgos_sysinfo_sect'}{'FTP Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Forwarding Settings'}
$bc->{'sgos_sysinfo_sect'}{'Forwarding Statistics Per IP'}
$bc->{'sgos_sysinfo_sect'}{'Forwarding Summary Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Forwarding health check settings'}
$bc->{'sgos_sysinfo_sect'}{'Forwarding health check statistics'}
$bc->{'sgos_sysinfo_sect'}{'HTTP Configuration'}
$bc->{'sgos_sysinfo_sect'}{'HTTP Main'}
$bc->{'sgos_sysinfo_sect'}{'HTTP Requests'}
$bc->{'sgos_sysinfo_sect'}{'HTTP Responses'}
$bc->{'sgos_sysinfo_sect'}{'Hardware Information'}
$bc->{'sgos_sysinfo_sect'}{'Hardware sensors'}
$bc->{'sgos_sysinfo_sect'}{'Health Monitor'}
$bc->{'sgos_sysinfo_sect'}{'Health check entries'}
$bc->{'sgos_sysinfo_sect'}{'Health check statistics'}
$bc->{'sgos_sysinfo_sect'}{'ICP Hosts'}
$bc->{'sgos_sysinfo_sect'}{'ICP Settings'}
$bc->{'sgos_sysinfo_sect'}{'ICP Statistics'}
$bc->{'sgos_sysinfo_sect'}{'IM Configuration'}
$bc->{'sgos_sysinfo_sect'}{'Kernel Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Licensing Statistics'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Client Statistics'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Conversation Client Errors'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Conversation Other Errors'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Conversation Server Errors'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Errors'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Internal Statistics'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Server Statistics'}
$bc->{'sgos_sysinfo_sect'}{'MAPI Statistics'}
$bc->{'sgos_sysinfo_sect'}{'MMS Configuration'}
$bc->{'sgos_sysinfo_sect'}{'MMS General'}
$bc->{'sgos_sysinfo_sect'}{'MMS Statistics'}
$bc->{'sgos_sysinfo_sect'}{'MMS Streaming Statistics'}
$bc->{'sgos_sysinfo_sect'}{'MSN IM Statistics'}
$bc->{'sgos_sysinfo_sect'}{'OPP Services'}
$bc->{'sgos_sysinfo_sect'}{'OPP Statistics'}
$bc->{'sgos_sysinfo_sect'}{'P2P Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Persistent Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Policy Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Policy'}
$bc->{'sgos_sysinfo_sect'}{'Priority 1 Events'}
$bc->{'sgos_sysinfo_sect'}{'Quicktime Configuration'}
$bc->{'sgos_sysinfo_sect'}{'Quicktime Statistics'}
$bc->{'sgos_sysinfo_sect'}{'RIP Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Real Configuration'}
$bc->{'sgos_sysinfo_sect'}{'Real Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Refresh Statistics'}
$bc->{'sgos_sysinfo_sect'}{'SCSI Disk Statistics'}
$bc->{'sgos_sysinfo_sect'}{'SOCKS Gateways Settings'}
$bc->{'sgos_sysinfo_sect'}{'SOCKS Gateways Statistics'}
$bc->{'sgos_sysinfo_sect'}{'SOCKS Proxy Statistics'}
$bc->{'sgos_sysinfo_sect'}{'SSL Proxy Certificate Cache'}
$bc->{'sgos_sysinfo_sect'}{'SSL Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Security processor Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Server Side persistent connections'}
$bc->{'sgos_sysinfo_sect'}{'Services Management Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Services Per-service Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Services Proxy Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Software Configuration'}
$bc->{'sgos_sysinfo_sect'}{'System Memory Statistics'}
$bc->{'sgos_sysinfo_sect'}{'TCP/IP ARP Information'}
$bc->{'sgos_sysinfo_sect'}{'TCP/IP Listening list'}
$bc->{'sgos_sysinfo_sect'}{'TCP/IP Malloc Information'}
$bc->{'sgos_sysinfo_sect'}{'TCP/IP Routing Table'}
$bc->{'sgos_sysinfo_sect'}{'TCP/IP Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Threshold Monitor Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Version Information'}
$bc->{'sgos_sysinfo_sect'}{'WCCP Configuration'}
$bc->{'sgos_sysinfo_sect'}{'WCCP Statistics'}
$bc->{'sgos_sysinfo_sect'}{'Yahoo IM Statistics'}
The details for interface 0:0 are stored here:
IP address: $bc->{'interface'}{'0:0'}{'ip'}
Netmask: $bc->{'interface'}{'0:0'}{'netmask'}
MAC address: $bc->{'interface'}{'0:0'}{'mac'}
Link status: $bc->{'interface'}{'0:0'}{'linkstatus'}
Capabilities: $bc->{'interface'}{'0:0'}{'capabilities'}
You can retrieve the interface names like this:
my @interfaces = keys %{$bc->{'interface'}};
The route table can be retrieved as follows:
$bc->{'sgos_sysinfo_sect'}{'TCP/IP Routing Table'}
The static route table can be retrieved as follows:
$bc->{'static-route-table'}
The WCCP configuration can be retrieved as follows:
$bc->{'sgos_sysinfo_sect'}{'WCCP Configuration'}
=cut
=head1 AUTHOR
Matthew Lange <mmlange@cpan.org>
=head1 BUGS
Please report any bugs or feature requests through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Net-BlueCoat-SGOS>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Net::BlueCoat::SGOS
You can also look for information at:
=over 4
=item * RT: CPAN's request tracker
=item * AnnoCPAN: Annotated CPAN documentation
=item * CPAN Ratings
=item * Search CPAN
=back
=head1 LICENSE AND COPYRIGHT
Copyright (C) 2008-2010 Matthew Lange.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
by the Free Software Foundation.
=cut
1; # End of Net::BlueCoat::SGOS
__DATA__