Darwin-Streaming-Server/WebAdmin/WebAdminHtml/relayxmlparser.pl
Darren VanBuren 849723c9cf Add even more of the source
This should be about everything needed to build so far?
2017-03-07 17:14:16 -08:00

897 lines
No EOL
25 KiB
Perl

#!/usr/bin/perl
#----------------------------------------------------------
#
# @APPLE_LICENSE_HEADER_START@
#
#
# Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
#
# This file contains Original Code and/or Modifications of Original Code
# as defined in and that are subject to the Apple Public Source License
# Version 2.0 (the 'License'). You may not use this file except in
# compliance with the License. Please obtain a copy of the License at
# http://www.opensource.apple.com/apsl/ and read it before using this
# file.
#
# The Original Code and all software distributed under the License are
# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
# Please see the License for the specific language governing rights and
# limitations under the License.
#
# @APPLE_LICENSE_HEADER_END@
#
#
#---------------------------------------------------------
# local *FILEHDL;
# local $parser = "";
# An array containing references to a relay array
# local @relays;
# Each relay array contains
# [0] name = (value of attribute NAME from the relay OBJECT tag)
# [1] enabled = (0 or 1)
# [2] source = source hash
# [3] numdest =
# [4] number of dest hashes
# Each source (destination) hash
# (1) always contains the keyword "type" for the type of source (destination)
# (2) each pref it has with the name as a keyword and a value associated with it
# (3) for any list pref, it has the name as the keyword and an array ref as value
# where the array is the list of values for the pref
# $relayfile = $ARGV[0];
# open(FILEHDL, $relayfile) or die "Can't open file $xmlfile\n";
# read(FILEHDL, $parser, -s $relayfile);
# close(FILEHDL);
# -------------------------------------------------
# getNewRelay()
#
# -------------------------------------------------
sub getNewRelay {
$relayIsNew = 1;
$relayDestCount = 1;
$relayEnabled = 1;
$currentRelay = 'untitled';
$relayType = 'rtsp_source';
$relaySourceHostname = '';
$relaySourceMountPoint = '';
$relaySourceUsername = '';
$relaySourcePassword = '';
@relayDestType = ('announced_destination');
@relayDestHostname = ();
@relayDestMountPoint = ();
@relayDestType = ();
@relayDestUsername = ();
@relayDestPassword = ();
@relayDestPort = ();
@relayDestTTL = ();
}
# -------------------------------------------------
# AddRelayDestination()
#
# adds a dest to the window and saves vals
# -------------------------------------------------
sub AddRelayDestination() {
my $i;
@relayDestHostname = ();
@relayDestMountPoint = ();
@relayDestType = ();
@relayDestUsername = ();
@relayDestPassword = ();
@relayDestPort = ();
@relayDestTTL = ();
$relayDestCount = $query->{'relayDestCount'};
for ($i = 0; $i < $relayDestCount; $i++) {
push(@relayDestHostname, $query->{'relayDestHostname'.$i});
push(@relayDestMountPoint, $query->{'relayDestMountPoint'.$i});
push(@relayDestType, $query->{'relayDestType'.$i});
push(@relayDestUsername, $query->{'relayDestUsername'.$i});
push(@relayDestPassword, $query->{'relayDestPassword'.$i});
push(@relayDestPort, $query->{'relayDestPort'.$i});
push(@relayDestTTL, $query->{'relayDestTTL'.$i});
}
$relayDestCount++;
}
# -------------------------------------------------
# getValsForRelay()
#
# expects $query->{'currentRelay'} to be
# populated with the current relay name.
#
# returns a javascript string. put it in
# <script></script> tags. also make sure you have
# a hidden field named "relaydata" to hold the data
# -------------------------------------------------
sub getValsForRelay {
my $messHash = adminprotolib::GetMessageHash();
my $relayConfigDir = '';
my $status = adminprotolib::EchoData($relayConfigDir, $messHash, $authheader, $qtssip, $qtssport, "/modules/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file", "/modules/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file");
my $relayName = $query->{'currentRelay'};
my $relayarrayref = getArraysFromFile($relayConfigDir);
my $sourcehashref;
my %sourcehash;
my $desthashref;
my %desthash;
my @relays = @$relayarrayref;
@relayDestHostname = ();
@relayDestMountPoint = ();
@relayDestType = ();
@relayDestUsername = ();
@relayDestPassword = ();
@relayDestPort = ();
@relayDestTTL = ();
foreach $relayRef (@relays) {
@relay = @$relayRef;
$relayEnabled = $relay[1];
$sourcehashref = $relay[2];
%sourcehash = %$sourcehashref;
if ((($sourcehash{'type'} eq 'rtsp_source') and ($sourcehash{'source_addr'} eq '') and ($relayName eq '***qtssDefaultRelay***')) or (($sourcehash{'type'} ne 'udp_source') and ($relay[0] eq $relayName))) {
$relayDestCount = $relay[3];
$relayType = $sourcehash{'type'};
$relaySourceHostname = $sourcehash{'source_addr'};
$relaySourceMountPoint = $sourcehash{'url'};
if ($relayType eq 'announced_source') {
$relaySourceUsername = '';
$relaySourcePassword = '';
}
elsif ($relayType eq 'rtsp_source') {
$relaySourceUsername = $sourcehash{'name'};
$relaySourcePassword = $sourcehash{'password'};
}
last;
}
}
for ($i = 4; $i < ($relayDestCount+4); $i++) {
$desthashref = $relay[$i];
%desthash = %$desthashref;
push(@relayDestHostname, $desthash{'dest_addr'});
push(@relayDestType, $desthash{'type'});
if ($desthash{'type'} eq 'announced_destination') {
push(@relayDestMountPoint, $desthash{'url'});
push(@relayDestUsername, $desthash{'name'});
push(@relayDestPassword, $desthash{'password'});
push(@relayDestPort, '');
push(@relayDestTTL, '');
}
elsif ($desthash{'type'} eq 'udp_destination') {
push(@relayDestMountPoint, '');
push(@relayDestUsername, '');
push(@relayDestPassword, '');
push(@relayDestPort, $desthash{'udp_base_port'});
push(@relayDestTTL, $desthash{'ttl'});
}
else {
push(@relayDestUsername, '');
push(@relayDestPassword, '');
push(@relayDestPort, '');
push(@relayDestTTL, '');
}
}
if ($relayDestCount == 0) {
$relayDestCount = 1;
}
}
# -------------------------------------------------
# getRelayDestData()
#
# populates vars for relay dest in currentDest
# param.
# -------------------------------------------------
sub getRelayDestData {
my @allDestConfigs = split(/\r/, $query->{'relaydata'});
@selectedDestConfig = split(/\t/, $allDestConfigs[$query->{'currentDest'}]);
$qtssDestType = $selectedDestConfig[0];
if ($qtssDestType eq 'announced_destination') {
$qtssAnnouncedIP = $selectedDestConfig[1];
$qtssUDPIP = '';
$qtssAnnouncedPorts = $selectedDestConfig[2];
$qtssUDPPorts = '';
$qtssAnnouncedName = $selectedDestConfig[3];
$qtssAnnouncedPassword = $selectedDestConfig[4];
if ($selectedDestConfig[5] eq '') {
$qtssAnnouncedIsPath = 'false';
}
else {
$qtssAnnouncedIsPath = 'true';
}
$qtssAnnouncedPath = $selectedDestConfig[5];
$qtssUDPIsTTL = '';
$qtssUDPTTL = '';
}
else {
$qtssDestType = 'udp_destination';
$qtssAnnouncedIP = '';
$qtssUDPIP = $selectedDestConfig[1];
$qtssAnnouncedPorts = '';
$qtssUDPPorts = $selectedDestConfig[2];
$qtssUDPPorts =~ s/ /\\r/;
$qtssAnnouncedName = '';
$qtssAnnouncedPassword = '';
$qtssAnnouncedIsPath = '';
$qtssAnnouncedPath = '';
if ($selectedDestConfig[7] eq '') {
$qtssUDPIsTTL = 'false';
}
else {
$qtssUDPIsTTL = 'true';
}
$qtssUDPTTL = $selectedDestConfig[7];
}
$qtssDestIP1 = $selectedDest;
$jsstr = $query->{'relaydata'};
$jsstr =~ s/[\r\n]/\\r/g;
$jsstr =~ s/\\r\\r/\\r/g;
$jsstr =~ s/\t/\\t/g;
$jsstr = 'document.forms[0].elements["relaydata"].value="'.$jsstr.'";'."\r\t\t";
$jsstr .= 'document.forms[0].elements["qtssUDPPorts"].value="'.$qtssUDPPorts.'";';
$nextFilename = $query->{'nextFilename'};
$relayType = $query->{'relayType'};
$relayEnabled = $query->{'relayEnabled'};
$relayReceiveSource = $query->{'relayReceiveSource'};
$relayHasReceivePath = $query->{'relayHasReceivePath'};
$relayReceivePath = $query->{'relayReceivePath'};
$relayAcquireSource = $query->{'relayAcquireSource'};
$relayAcquirePath = $query->{'relayAcquirePath'};
$relayAcquireUsername = $query->{'relayAcquireUsername'};
$relayAcquirePassword = $query->{'relayAcquirePassword'};
}
# -------------------------------------------------
# SetRelayDestData()
#
# sets the dest data in the current relaydata
# param, and returns the necessary vars
# -------------------------------------------------
sub SetRelayDestData {
my $relaydata = $query->{'relaydata'};
$relaydata =~ s/\r\n/\r/g;
my @allDestConfigs = split(/[\r\n]/, $relaydata);
my $i = 0;
my $item;
my $qtssUDPPorts;
my $displayIP;
$jsstr = 'document.forms[0].elements["relaydata"].value="';
my $jsstr2 = '';
my @parsedItemArray = ();
foreach $item (@allDestConfigs) {
$item =~ s/[\r\n]//g;
if (($i == $query->{'currentDest'}) and ($query->{'savechanges'} eq 'true')) {
my $qtssDestType = $query->{'qtssDestType'};
$jsstr .= $qtssDestType.'\t';
if ($qtssDestType eq 'announced_destination') {
$displayIP = $query->{'qtssAnnouncedIP'};
$jsstr .= $displayIP.'\t';
$jsstr .= $query->{'qtssAnnouncedPorts'}.'\t';
$jsstr .= $query->{'qtssAnnouncedName'}.'\t';
$jsstr .= $query->{'qtssAnnouncedPassword'}.'\t';
if ($query->{'qtssAnnouncedIsPath'} eq 'true') {
$jsstr .= $query->{'qtssAnnouncedPath'}.'\t';
}
else {
$jsstr .= '\t';
}
}
else {
$displayIP = $query->{'qtssUDPIP'};
$jsstr .= $displayIP.'\t';
$qtssUDPPorts = $query->{'qtssUDPPorts'};
$qtssUDPPorts =~ s/\r\n/\r/g;
$qtssUDPPorts =~ s/[\r\n]/ /g;
$jsstr .= $qtssUDPPorts.'\t\t\t\t\t';
if ($query->{'qtssUDPIsTTL'} eq 'true') {
$jsstr .= $query->{'qtssUDPTTL'}.'\t';
}
else {
$jsstr .= '\t';
}
}
$jsstr .= '\r';
}
else {
@parsedItemArray = split(/\t/,$item);
if ($parsedItemArray[0] eq 'announced_destination') {
$displayIP = $parsedItemArray[1];
}
else {
$displayIP = $parsedItemArray[1];
}
$item =~ s/\t/\\t/g;
$jsstr .= $item . '\r';
}
$jsstr2 .= "\r\t\tdocument.forms[0].elements['dests'].length++;";
$jsstr2 .= "\r\t\tdocument.forms[0].elements['dests'].options[$i].text = '$displayIP';";
$jsstr2 .= "\r\t\tdocument.forms[0].elements['dests'].options[$i].value = '$displayIP';";
$i++;
}
if (($query->{'currentDest'} == (-1)) and ($query->{'savechanges'} eq 'true')) {
my $qtssDestType = $query->{'qtssDestType'};
$jsstr .= $qtssDestType.'\t';
if ($qtssDestType eq 'announced_destination') {
$displayIP = $query->{'qtssAnnouncedIP'};
$jsstr .= $displayIP.'\t';
$jsstr .= $query->{'qtssAnnouncedPorts'}.'\t';
$jsstr .= $query->{'qtssAnnouncedName'}.'\t';
$jsstr .= $query->{'qtssAnnouncedPassword'}.'\t';
if ($query->{'qtssAnnouncedIsPath'} eq 'true') {
$jsstr .= $query->{'qtssAnnouncedPath'}.'\t';
}
else {
$jsstr .= '\t';
}
}
else {
$displayIP = $query->{'qtssUDPIP'};
$jsstr .= $displayIP.'\t';
$qtssUDPPorts = $query->{'qtssUDPPorts'};
$qtssUDPPorts =~ s/\r\n/\r/g;
$qtssUDPPorts =~ s/[\r\n]/ /g;
$jsstr .= $qtssUDPPorts.'\t\t\t\t\t';
if ($query->{'qtssUDPIsTTL'} eq 'true') {
$jsstr .= $query->{'qtssUDPTTL'}.'\t';
}
else {
$jsstr .= '\t';
}
}
$jsstr .= '\r';
$jsstr2 .= "\r\t\tdocument.forms[0].elements['dests'].length++;";
$jsstr2 .= "\r\t\tdocument.forms[0].elements['dests'].options[$i].text = '$displayIP';";
$jsstr2 .= "\r\t\tdocument.forms[0].elements['dests'].options[$i].value = '$displayIP';";
}
$jsstr =~ s/\\r\\r/\\r/g;
$jsstr .= '";'."\r\t\t";
$jsstr .= $jsstr2;
$jsstr .= "\r\t\t";
$relayType = $query->{'relayType'};
$relayEnabled = $query->{'relayEnabled'};
$relayReceiveSource = $query->{'relayReceiveSource'};
$relayHasReceivePath = $query->{'relayHasReceivePath'};
$relayReceivePath = $query->{'relayReceivePath'};
$relayAcquireSource = $query->{'relayAcquireSource'};
$relayAcquirePath = $query->{'relayAcquirePath'};
$relayAcquireUsername = $query->{'relayAcquireUsername'};
$relayAcquirePassword = $query->{'relayAcquirePassword'};
}
# -------------------------------------------------
# DeleteRelayDest()
#
# deletes the destination in currentDest
# query param
# -------------------------------------------------
sub DeleteRelayDest {
my $i;
@relayDestHostname = ();
@relayDestMountPoint = ();
@relayDestType = ();
@relayDestUsername = ();
@relayDestPassword = ();
@relayDestPort = ();
@relayDestTTL = ();
$relayDestCount = $query->{'relayDestCount'};
for ($i = 0; $i < $relayDestCount; $i++) {
if ($i != ($query->{'currentDest'} - 1)) {
push(@relayDestHostname, $query->{'relayDestHostname'.$i});
push(@relayDestMountPoint, $query->{'relayDestMountPoint'.$i});
push(@relayDestType, $query->{'relayDestType'.$i});
push(@relayDestUsername, $query->{'relayDestUsername'.$i});
push(@relayDestPassword, $query->{'relayDestPassword'.$i});
push(@relayDestPort, $query->{'relayDestPort'.$i});
push(@relayDestTTL, $query->{'relayDestTTL'.$i});
}
}
$relayDestCount--;
}
# -------------------------------------------------
# SaveRelay()
#
# saves array in currentRelay param to file
# -------------------------------------------------
sub SaveRelay {
my $messHash = adminprotolib::GetMessageHash();
my $relayConfigDir = '';
my $status = adminprotolib::EchoData($relayConfigDir, $messHash, $authheader, $qtssip, $qtssport, "/modules/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file", "/modules/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file");
my $relayName = $query->{'currentRelay'};
my $relayEnabled = $query->{'relayEnabled'};
my $relayarrayref = getArraysFromFile($relayConfigDir);
my @relaylist = @$relayarrayref;
my %sourcehash = ();
my $i = 0;
my $i2 = 0;
my $item;
my $item2;
my @newRelay = ();
my $relayDestCount = $query->{'relayDestCount'};
my $relayIsNew = $query->{'relayIsNew'};
# delete the old relay, if the name changed
if (($query->{'relayIsNew'} ne '1') and ($query->{'currentRelay_shadow'} ne $query->{'currentRelay'})) {
my @newrelayarrays = ();
foreach $item (@relaylist) {
my @currentRelay = @$item;
if ($currentRelay[0] ne $query->{'currentRelay_shadow'}) {
push(@newrelayarrays, $item);
}
}
@relays = @newrelayarrays;
}
if ($relayEnabled ne '1') {
$relayEnabled = '0';
}
$sourcehash{'type'} = $query->{'relayType'};
if ($query->{'currentRelay'} ne '***qtssDefaultRelay***') {
$sourcehash{'source_addr'} = $query->{'relaySourceHostname'};
$sourcehash{'url'} = $query->{'relaySourceMountPoint'};
$_ = $query->{'relayType'};
if ($_ eq 'announced_source') {
$sourcehash{'name'} = '';
$sourcehash{'password'} = '';
}
else {
$sourcehash{'name'} = $query->{'relaySourceUsername'};
$sourcehash{'password'} = $query->{'relaySourcePassword'};
}
}
push(@newRelay, $relayName);
push(@newRelay, $relayEnabled);
push(@newRelay, \%sourcehash);
push(@newRelay, $relayDestCount);
for ($i = 0; $i < $relayDestCount; $i++) {
my %desthash = ();
$desthash{'type'} = $query->{'relayDestType'.$i};
$desthash{'dest_addr'} = $query->{'relayDestHostname'.$i};
$desthash{'url'} = $query->{'relayDestMountPoint'.$i};
if ($desthash{'type'} eq 'announced_destination') {
$desthash{'name'} = $query->{'relayDestUsername'.$i};
$desthash{'password'} = $query->{'relayDestPassword'.$i};
}
else {
$desthash{'udp_base_port'} = $query->{'relayDestPort'.$i};
if ($query->{'relayDestTTL'.$i} ne '') {
$desthash{'ttl'} = $query->{'relayDestTTL'.$i};
}
}
push(@newRelay, \%desthash);
}
my $foundIt = 0;
foreach $item (@relays) {
my @currentRelay = @$item;
my $oldsourcehashref = $relay[2];
my %oldsourcehash = %$sourcehashref;
if ((($sourcehash{'type'} eq 'rtsp_source') and ($sourcehash{'source_addr'} eq '') and ($query->{'currentRelay'} eq '***qtssDefaultRelay***')) or ($currentRelay[0] eq $query->{'currentRelay'})) {
$foundIt = 1;
$item = \@newRelay;
last;
}
$i++;
}
if ($foundIt == 0) {
push (@relays, \@newRelay)
}
$myHdl = select();
# my $relayarrayref = getArraysFromFile($relayConfigDir);
open(FILEHDL, ">$relayConfigDir") or die "Can't open relay file '$relayfile'!";
print FILEHDL WriteRelayConfigToFile();
close(FILEHDL);
FixFileGroup($relayConfigDir);
chmod 0600, $relayConfigDir;
$status = &adminprotolib::SetAttribute($data, $messHash, $authheader, $qtssip, $qtssport, '/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file', $relayConfigDir);
$confirmMessage = $messages{'RelaySaveText'};
}
# -------------------------------------------------
# DeleteRelay()
#
# deletes selected relay
# -------------------------------------------------
sub DeleteRelay {
my $messHash = adminprotolib::GetMessageHash();
my $relayConfigDir = '';
my $status = adminprotolib::EchoData($relayConfigDir, $messHash, $authheader, $qtssip, $qtssport, "/modules/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file", "/modules/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file");
my @allDestConfigs = split(/\r/, $query->{'relaydata'});
my $relayName = $query->{'currentRelay'};
my $item;
my $relayarrayref = getArraysFromFile($relayConfigDir);
my @newrelayarrays = ();
foreach $item (@relays) {
my @currentRelay = @$item;
if ($currentRelay[0] ne $query->{'currentRelay'}) {
push(@newrelayarrays, $item);
}
}
@relays = @newrelayarrays;
open(FILEHDL, ">$relayConfigDir") or die "Can't open relay file '$relayfile'!";
print FILEHDL WriteRelayConfigToFile();
close(FILEHDL);
FixFileGroup($relayConfigDir);
chmod 0600, $relayConfigDir;
$status = &adminprotolib::SetAttribute($data, $messHash, $authheader, $qtssip, $qtssport, '/admin/server/qtssSvrModuleObjects/QTSSRelayModule/qtssModPrefs/relay_prefs_file', $relayConfigDir);
}
# -------------------------------------------------
# getArraysFromFile($relayfile)
#
# returns a reference to the array.
# -------------------------------------------------
sub getArraysFromFile {
my $relayfile = $_[0];
my $parser = "";
my $line = "";
@relays = ();
if (open(FILEHDL, $relayfile)) {
# read the entire file into
while ($line = <FILEHDL>) {
$parser .= $line;
}
}
else { # couldn't open file - try creating a new one
open(FILEHDL, ">$relayfile") or die "Can't open relay file '$relayfile'!";
$parser = "<RELAY_CONFIG>\n\t<OBJECT TYPE=\"relay\" NAME=\"***qtssDefaultRelay***\">\n\t\t<OBJECT CLASS=\"source\" TYPE=\"announced_source\">\n\t\t</OBJECT>\n\t</OBJECT>\n</RELAY_CONFIG>\n";
print FILEHDL $parser;
}
# we're done with the file; now close it
close(FILEHDL);
FixFileGroup($relayConfigDir);
chmod 0600, $relayConfigDir;
if (ParseXML($parser) == 1) {
return \@relays;
}
else {
return 0;
}
}
# $success = ParseXML($parser);
# if($success == 1)
#{
# PrintRelayConfig();
# WriteRelayConfigToFile();
#}
# ParseXML function
sub ParseXML
{
my $buf = $_[0];
while ($buf =~ m/^(\s*?)<!--(.*?)-->(.*)/s)
{
$buf = $3;
}
if ( $buf =~ m/^(.*?)<RELAY_CONFIG>(.*?)<\/RELAY_CONFIG>/s )
{
$buf = $2;
}
else
{
print "Valid <RELAY_CONFIG> tag not found!\n";
return 0;
}
while ($buf !~ m/^(\s*?)$/s)
{
if ($buf =~ m/^(\s*?)<!--(.*?)-->(.*)/s)
{
$buf = $3;
next;
}
elsif ($buf =~ m/^(\s*?)<OBJECT TYPE="relay" NAME="(.*?)">(.*)/s)
{
$buf = ParseRelay($3, $2);
}
elsif ($buf =~ m/^(\s*?)<OBJECT TYPE="relay">(.*)/s)
{
$buf = ParseRelay($2);
}
else
{
print "Invalid XML file\n";
print "$buf";
exit -1;
}
}
return 1;
}
# Each relay array contains
# [0] name =
# [1] enabled = (0 or 1)
# [2] source = source hash
# [3] numdest =
# [4] number of dest hashes
sub ParseRelay
{
my $buf = $_[0];
my $relayname = (defined($_[1]))? $_[1]: "";
my @relay = ($relayname, 1, undef, 0);
# we will append destinations array to relay array at the very end;
my @destinations;
while ($buf !~ m/^(\s*?)$/s)
{
# ignore comment tags
if ($buf =~ m/^(\s*?)<!--(.*?)-->(.*)/s)
{
$buf = $3;
next;
}
# parse pref ENABLED and store 0 or 1 in the second element of relay arr
elsif ($buf =~ m/^(\s*?)<PREF NAME="enabled">(.*?)<\/PREF>(.*)/s)
{
if($2 eq "false")
{
$relay[1] = 0;
}
$buf = $3;
next;
}
# parse source/destination tag
elsif ($buf =~ m/^(\s*?)<OBJECT CLASS="(.*?)" TYPE="(.*?)">(.*?)<\/OBJECT>(.*)/s )
{
$buf = $5;
if($2 eq "source")
{
$relay[2] = ParseClass($3, $4);
}
elsif ($2 eq "destination")
{
$relay[3]++;
push(@destinations, ParseClass($3, $4));
}
next;
}
elsif ($buf =~ m/^(\s*?)<\/OBJECT>(.*)/s)
{
$buf = $2;
last;
}
else
{
print "Invalid XML file\n";
print "$buf";
exit -1;
}
}
push(@relay, @destinations);
push(@relays, \@relay);
return $buf;
}
# takes in the type of source/destination and the buffer
# returns a ref to the source/destination hash
sub ParseClass
{
# Each source (destination) hash
# (1) always contains the keyword "type" for the type of source (destination)
# (2) each pref it has with the name as a keyword and a value associated with it
# (3) for any list pref, it has the name as the keyword and an array ref as value
# where the array is the list of values for the pref
my %objectHash;
$objectHash{'type'} = $_[0];
my $objectBuf = $_[1];
while ($objectBuf !~ m/^(\s*?)$/s)
{
# ignore comment tags
if ($objectBuf =~ m/^(\s*?)<!--(.*?)-->(.*)/s)
{
$objectBuf = $3;
next;
}
# parse pref
elsif ($objectBuf =~ m/^(\s*?)<PREF NAME="(.*?)">(.*?)<\/PREF>(.*)/s)
{
$objectHash{$2} = $3;
$objectBuf = $4;
next;
}
# parse list pref
elsif ($objectBuf =~ m/^(\s*?)<LIST-PREF NAME="(.*?)">(.*?)<\/LIST-PREF>(.*)/s)
{
my @listArr;
my $listName = $2;
my $listBuf = $3;
$objectBuf = $4;
while($listBuf !~ m/^(\s*?)$/s)
{
# ignore comment tags
if ($listBuf =~ m/^(\s*?)<!--(.*?)-->(.*)/s)
{
$listBuf = $3;
next;
}
elsif ($listBuf =~ m/^(\s*?)<VALUE>(.*?)<\/VALUE>(.*)/s)
{
push(@listArr, $2);
$listBuf = $3;
next;
}
else
{
print "Invalid XML file\n";
print "$listBuf";
exit -1;
}
}
$objectHash{$listName} = \@listArr;
next;
}
else
{
print "Invalid XML file\n";
print "$objectBuf";
exit -1;
}
}
return \%objectHash;
}
# Each relay array contains
# [0] name =
# [1] enabled = (0 or 1)
# [2] source = source hash
# [3] numdest =
# [4] number of source hashes
sub PrintRelayConfig
{
my $i, $j;
for ($i = 0; $i <= $#relays; $i++)
{
my $relRef = $relays[$i];
my @rel = @$relRef;
print "Relay Name=$rel[0] Enabled=$rel[1]\n";
if (defined($rel[2]))
{
print " Source\n";
PrintHash($rel[2]);
print " ---\n";
}
print "Number of destinations = $rel[3]\n";
for ($j = 4; $j <= $#rel; $j++)
{
print " Destination\n";
PrintHash($rel[$j]);
print " ---\n";
}
print " -------\n";
}
}
sub PrintHash
{
my $hashRef = $_[0];
my $key;
foreach $key (keys %$hashRef)
{
print " $key = $hashRef->{$key}\n";
}
}
sub WriteRelayConfigToFile
{
# my $filename = $_[0];
my $fileBuf = qq(<RELAY_CONFIG>\n);
my $i, $j;
for ($i = 0; $i <= $#relays; $i++)
{
my $relRef = $relays[$i];
my @rel = @$relRef;
if($rel[0] eq "")
{
$fileBuf .= qq(<OBJECT TYPE="relay">\n);
}
else
{
$fileBuf .= qq(<OBJECT TYPE="relay" NAME="$rel[0]">\n);
}
if($rel[1] == 0)
{
$fileBuf .= qq( <PREF NAME="enabled">false</PREF>\n);
}
my $sourceRef = $rel[2];
$fileBuf .= qq( <OBJECT CLASS="source" TYPE="$sourceRef->{'type'}">\n);
$fileBuf .= WriteClassConfigToBuffer($sourceRef);
$fileBuf .= qq( </OBJECT>\n);
for($j = 4; $j <= $#rel; $j++)
{
my $destRef = $rel[$j];
$fileBuf .= qq( <OBJECT CLASS="destination" TYPE="$destRef->{'type'}">\n);
$fileBuf .= WriteClassConfigToBuffer($destRef);
$fileBuf .= qq( </OBJECT>\n);
}
$fileBuf .= qq(</OBJECT>\n);
}
$fileBuf .= qq(</RELAY_CONFIG>);
# $fileBuf = "archived version\n------------------\n$fileBuf";
# print "archived version\n";
# print "------------------\n";
# print "$fileBuf";
return $fileBuf
}
sub WriteClassConfigToBuffer
{
my $buf = "";
my $hashRef = $_[0];
my $key;
my $i;
foreach $key (keys %$hashRef)
{
if($key eq "type")
{
next;
}
$val = $hashRef->{$key};
if(not ref $val)
{
$buf .= qq( <PREF NAME="$key">$val</PREF>\n);
}
else
{
@vallist = @$val;
$buf .= qq( <LIST-PREF NAME="$key">\n);
for($i = 0; $i <= $#vallist; $i++)
{
$buf .= qq( <VALUE>$vallist[$i]</VALUE>\n);
}
$buf .= qq( </LIST-PREF>\n);
}
}
return $buf;
}
1; # return true