#!/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 # 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 = ) { $parser .= $line; } } else { # couldn't open file - try creating a new one open(FILEHDL, ">$relayfile") or die "Can't open relay file '$relayfile'!"; $parser = "\n\t\n\t\t\n\t\t\n\t\n\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>/s ) { $buf = $2; } else { print "Valid tag not found!\n"; return 0; } while ($buf !~ m/^(\s*?)$/s) { if ($buf =~ m/^(\s*?)(.*)/s) { $buf = $3; next; } elsif ($buf =~ m/^(\s*?)(.*)/s) { $buf = ParseRelay($3, $2); } elsif ($buf =~ m/^(\s*?)(.*)/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>(.*)/s) { if($2 eq "false") { $relay[1] = 0; } $buf = $3; next; } # parse source/destination tag elsif ($buf =~ m/^(\s*?)(.*?)<\/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>(.*)/s) { $objectHash{$2} = $3; $objectBuf = $4; next; } # parse list pref elsif ($objectBuf =~ m/^(\s*?)(.*?)<\/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>(.*)/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(\n); my $i, $j; for ($i = 0; $i <= $#relays; $i++) { my $relRef = $relays[$i]; my @rel = @$relRef; if($rel[0] eq "") { $fileBuf .= qq(\n); } else { $fileBuf .= qq(\n); } if($rel[1] == 0) { $fileBuf .= qq( false\n); } my $sourceRef = $rel[2]; $fileBuf .= qq( \n); $fileBuf .= WriteClassConfigToBuffer($sourceRef); $fileBuf .= qq( \n); for($j = 4; $j <= $#rel; $j++) { my $destRef = $rel[$j]; $fileBuf .= qq( \n); $fileBuf .= WriteClassConfigToBuffer($destRef); $fileBuf .= qq( \n); } $fileBuf .= qq(\n); } $fileBuf .= qq(); # $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( $val\n); } else { @vallist = @$val; $buf .= qq( \n); for($i = 0; $i <= $#vallist; $i++) { $buf .= qq( $vallist[$i]\n); } $buf .= qq( \n); } } return $buf; } 1; # return true