———————package
Net::BlueCoat::SGOS;
use
strict;
no
warnings;
use
Data::Dumper;
use
LWP::UserAgent;
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) {
'connecting to '
.
$self
->{
'_applianceurlbase'
} .
"\n"
;
'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) {
'rawrealm='
.
$rawrealm
.
"\n"
;
'appliancerealm='
.
$self
->{
'_appliancerealm'
} .
"\n"
;
'applianceusername='
.
$self
->{
'_applianceusername'
} .
"\n"
;
'appliancepassword='
.
$self
->{
'_appliancepassword'
} .
"\n"
;
"passed to credentials:\n"
;
$self
->{
'_lwpnetloc'
} .
"\n"
;
$self
->{
'_appliancerealm'
} .
"\n"
;
$self
->{
'_applianceusername'
} .
"\n"
;
$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) {
"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) {
'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) {
'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) {
"_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) {
"_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) {
"appliancename=$self->{'appliance-name'}\n"
;
}
}
# model
# Model: 200-B
sub
_parse_model_number {
my
$self
=
shift
;
if
(
$self
->{
'_debuglevel'
} > 0) {
"_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) {
"_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) {
"_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) {
"_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) {
"_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) {
"_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) {
"_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) {
"_parse_sgos_version\n"
;
}
# parse SGOS version, SGOS releaseid, and serial number
if
(
$self
->{
'_debuglevel'
} > 0) {
"VERSION INFO SECTION:\n"
;
$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) {
"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__