cancel
Showing results for 
Search instead for 
Did you mean: 
Miguel_Rosa
Nimbostratus
Nimbostratus

Problem this snippet solves:

This code is an improvement of "Perl Ltm Config To Xml (version 2)" published on previous DevCentral (https://devcentral.f5.com/s/articles/perl-ltm-config-to-xml-version-2-1009😞 queries the components of a virtual servers configuration and prints it out in an XML format. Is recursive through partitions and prints the following data:

VS_name

VS_IP: IP and port

RD (route domain)

VS_state: status (ex. green) and state (ex. enabled)

Profiles: name, type, context. If SSL profile aditional info: certificate, chain, key, cipher list

Persistence

iRules: order and name

Pool_name

LB-method: method, minimum active members

Member: name, IP, port, ratio, priority, status and state

Monitors: name, interval, timeout. If HTTP/HTTPS monitors additional info: Send and Receive strings

SNAT_name

SNAT_members


Has a new option "-s" or "-simplified" which outputs multiple values like the profile list or pool members into a unique XML field. Purpose of simplified mode is to be able to have one Virtual Server per row on Excel, with lists showing on a single cell.

This code has been tested on BIG-IP version 12.1 and 14.1.

How to use this snippet:

Default mode:

./LTM-to-XML.pl bigip uid pwd > result.xml


Example for simplified mode and removal of partition information:

./LTM-to-XML.pl -s 127.0.0.1 uid pwd | sed "s/\/.*app\///g" | sed "s/\/Common\///g" > result.xml


The XML can be dragged and dropped on MS Excel and opened as an XML table.



Code :

#!/usr/bin/perl
#----------------------------------------------------------------------------
# The contents of this file are subject to the iControl Public License
# Version 4.5 (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://www.f5.com/.
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and limitations
# under the License.
#
# The Original Code is iControl Code and related documentation
# distributed by F5.
#
# The Initial Developer of the Original Code is F5 Networks,
# Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2003 F5 Networks,
# Inc. All Rights Reserved.  iControl (TM) is a registered trademark of F5 Networks, Inc.
#
# Alternatively, the contents of this file may be used under the terms
# of the GNU General Public License (the "GPL"), in which case the
# provisions of GPL are applicable instead of those above.  If you wish
# to allow use of your version of this file only under the terms of the
# GPL and not to allow others to use your version of this file under the
# License, indicate your decision by deleting the provisions above and
# replace them with the notice and other provisions required by the GPL.
# If you do not delete the provisions above, a recipient may use your
# version of this file under either the License or the GPL.
#----------------------------------------------------------------------------

use Getopt::Long;  
#use SOAP::Lite + trace => qw(method debug);
use SOAP::Lite;
use MIME::Base64;
use Socket;
use Data::Dumper;

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
 
#----------------------------------------------------------------------------
# Validate Arguments
#----------------------------------------------------------------------------
my $Mode = "default";

sub usage()
{
  die ("Usage: LTM-to-XML.pl host uid pwd\n");
}
 
usage(), exit  if not GetOptions(
    's|simplified!'   => \$flag, 
); 
if (defined($flag)) { $Mode = "simplified" }
my $BIGIP = $ARGV[0];
my $User = $ARGV[1];
my $Pass = $ARGV[2];
 
if ( ($BIGIP eq "") or ($User eq "") or ($Pass eq "") )
{
  usage();
}

sub ip_to_int {
 unpack('N',inet_aton(shift));
}
 
#----------------------------------------------------------------------------
# Transport Information
#----------------------------------------------------------------------------
sub SOAP::Transport::HTTP::Client::get_basic_credentials
{
  return "$User" => "$Pass";
}
 
$urnMap = {
    "{urn:iControl}Common.VLANFilterList" => 1,
    "{urn:iControl}ASM.ApplyLearningType" => 1,
    "{urn:iControl}ASM.DosDetectionMode" => 1,
    "{urn:iControl}ASM.DosOperationMode" => 1,
    "{urn:iControl}ASM.DynamicSessionsInUrlType" => 1,
    "{urn:iControl}ASM.FlagState" => 1,
    "{urn:iControl}ASM.LoggingLogicOperation" => 1,
    "{urn:iControl}ASM.LoggingRemoteFacility" => 1,
    "{urn:iControl}ASM.LoggingRemoteProtocol" => 1,
    "{urn:iControl}ASM.LoggingRemoteStorageType" => 1,
    "{urn:iControl}ASM.LoggingRequestSearchTarget" => 1,
    "{urn:iControl}ASM.LoggingRequestType" => 1,
    "{urn:iControl}ASM.LoggingStorageFormatType" => 1,
    "{urn:iControl}ASM.PolicyTemplate" => 1,
    "{urn:iControl}ASM.ProtocolType" => 1,
    "{urn:iControl}ASM.SeverityName" => 1,
    "{urn:iControl}ASM.ViolationName" => 1,
    "{urn:iControl}ASM.WebApplicationLanguage" => 1,
    "{urn:iControl}Classification.SignatureDefinition.SignatureUpdateProgressStatusType" => 1,
    "{urn:iControl}Classification.SignatureUpdateSchedule.SignatureUpdateIntervalType" => 1,
    "{urn:iControl}Common.ArmedState" => 1,
    "{urn:iControl}Common.AuthenticationMethod" => 1,
    "{urn:iControl}Common.AutoLasthop" => 1,
    "{urn:iControl}Common.AvailabilityStatus" => 1,
    "{urn:iControl}Common.DaemonStatus" => 1,
    "{urn:iControl}Common.EnabledState" => 1,
    "{urn:iControl}Common.EnabledStatus" => 1,
    "{urn:iControl}Common.FileChainType" => 1,
    "{urn:iControl}Common.FirewallPolicyType" => 1,
    "{urn:iControl}Common.FirewallRuleAction" => 1,
    "{urn:iControl}Common.FirewallRulePlacementType" => 1,
    "{urn:iControl}Common.FirewallRuleState" => 1,
    "{urn:iControl}Common.HAAction" => 1,
    "{urn:iControl}Common.HAState" => 1,
    "{urn:iControl}Common.IPHostType" => 1,
    "{urn:iControl}Common.MetadataPersistence" => 1,
    "{urn:iControl}Common.PoolProfileType" => 1,
    "{urn:iControl}Common.ProtocolType" => 1,
    "{urn:iControl}Common.SFlowGlobalType" => 1,
    "{urn:iControl}Common.SourcePortBehavior" => 1,
    "{urn:iControl}Common.StatisticType" => 1,
    "{urn:iControl}Common.TMOSModule" => 1,
    "{urn:iControl}Common.UnitType" => 1,
    "{urn:iControl}Common.VerificationStatus" => 1,
    "{urn:iControl}GlobalLB.Application.ApplicationObjectType" => 1,
    "{urn:iControl}GlobalLB.DNSSECKey.KeyAlgorithm" => 1,
    "{urn:iControl}GlobalLB.DNSSECKey.KeyType" => 1,
    "{urn:iControl}GlobalLB.DNSSECZone.HashAlgorithm" => 1,
    "{urn:iControl}GlobalLB.Monitor.IntPropertyType" => 1,
    "{urn:iControl}GlobalLB.Monitor.StrPropertyType" => 1,
    "{urn:iControl}GlobalLB.Monitor.TemplateType" => 1,
    "{urn:iControl}GlobalLB.WideIP.LBDecisionLogVerbosity" => 1,
    "{urn:iControl}GlobalLB.AddressType" => 1,
    "{urn:iControl}GlobalLB.AutoConfigurationState" => 1,
    "{urn:iControl}GlobalLB.AvailabilityDependency" => 1,
    "{urn:iControl}GlobalLB.DomainNameCheckMode" => 1,
    "{urn:iControl}GlobalLB.HardwareSecurityModuleType" => 1,
    "{urn:iControl}GlobalLB.LBMethod" => 1,
    "{urn:iControl}GlobalLB.LDNSProbeProtocol" => 1,
    "{urn:iControl}GlobalLB.LinkWeightType" => 1,
    "{urn:iControl}GlobalLB.MetricLimitType" => 1,
    "{urn:iControl}GlobalLB.MonitorAssociationRemovalRule" => 1,
    "{urn:iControl}GlobalLB.MonitorInstanceStateType" => 1,
    "{urn:iControl}GlobalLB.MonitorRuleType" => 1,
    "{urn:iControl}GlobalLB.RegionDBType" => 1,
    "{urn:iControl}GlobalLB.RegionType" => 1,
    "{urn:iControl}GlobalLB.ServerType" => 1,
    "{urn:iControl}LocalLB.Class.ClassType" => 1,
    "{urn:iControl}LocalLB.Class.FileFormatType" => 1,
    "{urn:iControl}LocalLB.Class.FileModeType" => 1,
    "{urn:iControl}LocalLB.DNSExpress.NOTIFYAction" => 1,
    "{urn:iControl}LocalLB.DNSExpress.TSIGKeyAlgorithm" => 1,
    "{urn:iControl}LocalLB.LSNPool.HairpinMode" => 1,
    "{urn:iControl}LocalLB.LSNPool.NATMode" => 1,
    "{urn:iControl}LocalLB.LSNPool.PersistMode" => 1,
    "{urn:iControl}LocalLB.Monitor.IntPropertyType" => 1,
    "{urn:iControl}LocalLB.Monitor.StrPropertyType" => 1,
    "{urn:iControl}LocalLB.Monitor.TemplateType" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.AnalyticsAlertGranularity" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.AnalyticsAlertMetric" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.AnalyticsAlertThresholdRelation" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.CapturedProtocol" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.LoggingFacility" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.SessionCookieSecurityMode" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.SessionTimeout" => 1,
    "{urn:iControl}LocalLB.ProfileAnalytics.TransactionPart" => 1,
    "{urn:iControl}LocalLB.ProfileDNS.DNS64AdditionalSectionRewrite" => 1,
    "{urn:iControl}LocalLB.ProfileDNS.DNS64Mode" => 1,
    "{urn:iControl}LocalLB.ProfileDNS.DNSLastAction" => 1,
    "{urn:iControl}LocalLB.ProfileDiameterEndpoint.DiameterApplicationType" => 1,
    "{urn:iControl}LocalLB.ProfileFastL4.PVAOffloadState" => 1,
    "{urn:iControl}LocalLB.ProfileHttp.ViaHeader" => 1,
    "{urn:iControl}LocalLB.ProfilePersistence.PersistenceHashMethod" => 1,
    "{urn:iControl}LocalLB.ProfileRequestLogging.Protocol" => 1,
    "{urn:iControl}LocalLB.ProfileSIP.RTPProxyStyle" => 1,
    "{urn:iControl}LocalLB.ProfileSPDY.ActivationMode" => 1,
    "{urn:iControl}LocalLB.ProfileSPDY.PriorityMode" => 1,
    "{urn:iControl}LocalLB.ProfileSPDY.SupportedProtocolVersion" => 1,
    "{urn:iControl}LocalLB.ProfileUserStatistic.UserStatisticKey" => 1,
    "{urn:iControl}LocalLB.ProfileWebAcceleration.CacheVaryType" => 1,
    "{urn:iControl}LocalLB.RAMCacheInformation.RAMCacheVaryType" => 1,
    "{urn:iControl}LocalLB.RateClass.DirectionType" => 1,
    "{urn:iControl}LocalLB.RateClass.DropPolicyType" => 1,
    "{urn:iControl}LocalLB.RateClass.QueueType" => 1,
    "{urn:iControl}LocalLB.RateClass.UnitType" => 1,
    "{urn:iControl}LocalLB.Rule.VerificationStatus" => 1,
    "{urn:iControl}LocalLB.VirtualServer.SourceAddressTranslationType" => 1,
    "{urn:iControl}LocalLB.VirtualServer.VirtualServerCMPEnableMode" => 1,
    "{urn:iControl}LocalLB.VirtualServer.VirtualServerType" => 1,
    "{urn:iControl}LocalLB.AdaptServiceDownAction" => 1,
    "{urn:iControl}LocalLB.AddressType" => 1,
    "{urn:iControl}LocalLB.AuthenticationMethod" => 1,
    "{urn:iControl}LocalLB.AvailabilityStatus" => 1,
    "{urn:iControl}LocalLB.ClientSSLCertificateMode" => 1,
    "{urn:iControl}LocalLB.ClonePoolType" => 1,
    "{urn:iControl}LocalLB.CompressionMethod" => 1,
    "{urn:iControl}LocalLB.CookiePersistenceMethod" => 1,
    "{urn:iControl}LocalLB.CredentialSource" => 1,
    "{urn:iControl}LocalLB.DNSCacheLocalZoneType" => 1,
    "{urn:iControl}LocalLB.DNSCacheType" => 1,
    "{urn:iControl}LocalLB.DataGroupType" => 1,
    "{urn:iControl}LocalLB.EnabledStatus" => 1,
    "{urn:iControl}LocalLB.HardwareAccelerationMode" => 1,
    "{urn:iControl}LocalLB.HttpChunkMode" => 1,
    "{urn:iControl}LocalLB.HttpCompressionMode" => 1,
    "{urn:iControl}LocalLB.HttpRedirectRewriteMode" => 1,
    "{urn:iControl}LocalLB.LBMethod" => 1,
    "{urn:iControl}LocalLB.MonitorAssociationRemovalRule" => 1,
    "{urn:iControl}LocalLB.MonitorInstanceStateType" => 1,
    "{urn:iControl}LocalLB.MonitorRuleType" => 1,
    "{urn:iControl}LocalLB.MonitorStatus" => 1,
    "{urn:iControl}LocalLB.PersistenceMode" => 1,
    "{urn:iControl}LocalLB.ProfileContextType" => 1,
    "{urn:iControl}LocalLB.ProfileMode" => 1,
    "{urn:iControl}LocalLB.ProfileType" => 1,
    "{urn:iControl}LocalLB.RamCacheCacheControlMode" => 1,
    "{urn:iControl}LocalLB.RateLimitMode" => 1,
    "{urn:iControl}LocalLB.ResponseControlMode" => 1,
    "{urn:iControl}LocalLB.RtspProxyType" => 1,
    "{urn:iControl}LocalLB.SSLCertificateExtension" => 1,
    "{urn:iControl}LocalLB.SSLOption" => 1,
    "{urn:iControl}LocalLB.SecureRenegotiationMode" => 1,
    "{urn:iControl}LocalLB.ServerSSLCertificateMode" => 1,
    "{urn:iControl}LocalLB.ServiceDownAction" => 1,
    "{urn:iControl}LocalLB.SessionStatus" => 1,
    "{urn:iControl}LocalLB.SnatType" => 1,
    "{urn:iControl}LocalLB.TCPCongestionControlMode" => 1,
    "{urn:iControl}LocalLB.TCPOptionMode" => 1,
    "{urn:iControl}LocalLB.UncleanShutdownMode" => 1,
    "{urn:iControl}LocalLB.VirtualAddressStatusDependency" => 1,
    "{urn:iControl}LocalLB.WACacheControlMode" => 1,
    "{urn:iControl}Log.DestinationRemoteHighSpeedLog.HighSpeedLogProtocol" => 1,
    "{urn:iControl}Log.Filter.Source" => 1,
    "{urn:iControl}Log.SyslogFacility" => 1,
    "{urn:iControl}Log.SyslogFormat" => 1,
    "{urn:iControl}Log.SyslogLevel" => 1,
    "{urn:iControl}Management.Device.ChassisVersion" => 1,
    "{urn:iControl}Management.DeviceGroup.DeviceSyncType" => 1,
    "{urn:iControl}Management.DeviceGroup.MemberState" => 1,
    "{urn:iControl}Management.DeviceGroup.StatusColor" => 1,
    "{urn:iControl}Management.DeviceGroup.Type" => 1,
    "{urn:iControl}Management.EM.TaskStatus" => 1,
    "{urn:iControl}Management.EventNotification.EventDataType" => 1,
    "{urn:iControl}Management.EventSubscription.AuthenticationMode" => 1,
    "{urn:iControl}Management.EventSubscription.EventType" => 1,
    "{urn:iControl}Management.EventSubscription.ObjectType" => 1,
    "{urn:iControl}Management.EventSubscription.SubscriptionStatusCode" => 1,
    "{urn:iControl}Management.KeyCertificate.CertificateType" => 1,
    "{urn:iControl}Management.KeyCertificate.KeyType" => 1,
    "{urn:iControl}Management.KeyCertificate.ManagementModeType" => 1,
    "{urn:iControl}Management.KeyCertificate.SecurityType" => 1,
    "{urn:iControl}Management.KeyCertificate.ValidityType" => 1,
    "{urn:iControl}Management.Provision.ProvisionLevel" => 1,
    "{urn:iControl}Management.SMTPConfiguration.EncryptedConnectionType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.AuthType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.DiskCheckType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.LevelType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.ModelType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.PrefixType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.PrivacyProtocolType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.SinkType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.TransportType" => 1,
    "{urn:iControl}Management.SNMPConfiguration.ViewType" => 1,
    "{urn:iControl}Management.UserManagement.UserRole" => 1,
    "{urn:iControl}Management.DebugLevel" => 1,
    "{urn:iControl}Management.LDAPPasswordEncodingOption" => 1,
    "{urn:iControl}Management.LDAPSSLOption" => 1,
    "{urn:iControl}Management.LDAPSSOOption" => 1,
    "{urn:iControl}Management.LDAPSearchMethod" => 1,
    "{urn:iControl}Management.LDAPSearchScope" => 1,
    "{urn:iControl}Management.OCSPDigestMethod" => 1,
    "{urn:iControl}Management.RadiusServiceType" => 1,
    "{urn:iControl}Management.ZoneType" => 1,
    "{urn:iControl}Networking.ARP.NDPState" => 1,
    "{urn:iControl}Networking.Interfaces.BundleState" => 1,
    "{urn:iControl}Networking.Interfaces.LLDPAdminStatus" => 1,
    "{urn:iControl}Networking.Interfaces.MediaType" => 1,
    "{urn:iControl}Networking.PacketFilterGlobals.DefaultAction" => 1,
    "{urn:iControl}Networking.ProfileWCCPGRE.WCCPGREForwarding" => 1,
    "{urn:iControl}Networking.RouteDomainV2.RoutingProtocol" => 1,
    "{urn:iControl}Networking.STPInstance.PathCostType" => 1,
    "{urn:iControl}Networking.STPInstanceV2.PathCostType" => 1,
    "{urn:iControl}Networking.SelfIPPortLockdown.AllowMode" => 1,
    "{urn:iControl}Networking.SelfIPV2.AllowMode" => 1,
    "{urn:iControl}Networking.Trunk.DistributionHashOption" => 1,
    "{urn:iControl}Networking.Trunk.LACPTimeoutOption" => 1,
    "{urn:iControl}Networking.Trunk.LinkSelectionPolicy" => 1,
    "{urn:iControl}Networking.Tunnel.TunnelDirection" => 1,
    "{urn:iControl}Networking.VLAN.VLANCMPHash" => 1,
    "{urn:iControl}Networking.VLANGroup.VLANGroupTransparency" => 1,
    "{urn:iControl}Networking.iSessionLocalInterface.NatSourceAddress" => 1,
    "{urn:iControl}Networking.iSessionPeerDiscovery.DiscoveryMode" => 1,
    "{urn:iControl}Networking.iSessionPeerDiscovery.FilterMode" => 1,
    "{urn:iControl}Networking.iSessionRemoteInterface.NatSourceAddress" => 1,
    "{urn:iControl}Networking.iSessionRemoteInterface.OriginState" => 1,
    "{urn:iControl}Networking.iSessionRemoteInterfaceV2.NatSourceAddress" => 1,
    "{urn:iControl}Networking.iSessionRemoteInterfaceV2.OriginState" => 1,
    "{urn:iControl}Networking.FilterAction" => 1,
    "{urn:iControl}Networking.FlowControlType" => 1,
    "{urn:iControl}Networking.IPCompAlgorithm" => 1,
    "{urn:iControl}Networking.IPsecDiffieHellmanGroup" => 1,
    "{urn:iControl}Networking.IPsecDirection" => 1,
    "{urn:iControl}Networking.IPsecDynSaEncryptAlgorithm" => 1,
    "{urn:iControl}Networking.IPsecIkeEncrAlgorithm" => 1,
    "{urn:iControl}Networking.IPsecIkeHashAlgorithm" => 1,
    "{urn:iControl}Networking.IPsecIkeLogLevel" => 1,
    "{urn:iControl}Networking.IPsecIkePeerCertType" => 1,
    "{urn:iControl}Networking.IPsecIkePeerGeneratePolicy" => 1,
    "{urn:iControl}Networking.IPsecIkePeerIDType" => 1,
    "{urn:iControl}Networking.IPsecIkePeerMode" => 1,
    "{urn:iControl}Networking.IPsecIkePeerNatTraversal" => 1,
    "{urn:iControl}Networking.IPsecManSaEncrAlgorithm" => 1,
    "{urn:iControl}Networking.IPsecMode" => 1,
    "{urn:iControl}Networking.IPsecProtocol" => 1,
    "{urn:iControl}Networking.IPsecSaAuthAlgorithm" => 1,
    "{urn:iControl}Networking.IPsecSaManAlgorithm" => 1,
    "{urn:iControl}Networking.IPsecSaMethod" => 1,
    "{urn:iControl}Networking.IPsecTrafficSelectorAction" => 1,
    "{urn:iControl}Networking.LearningMode" => 1,
    "{urn:iControl}Networking.MediaStatus" => 1,
    "{urn:iControl}Networking.MemberTagType" => 1,
    "{urn:iControl}Networking.MemberType" => 1,
    "{urn:iControl}Networking.PhyMasterSlaveMode" => 1,
    "{urn:iControl}Networking.RouteEntryType" => 1,
    "{urn:iControl}Networking.STPLinkType" => 1,
    "{urn:iControl}Networking.STPModeType" => 1,
    "{urn:iControl}Networking.STPRoleType" => 1,
    "{urn:iControl}Networking.STPStateType" => 1,
    "{urn:iControl}Networking.TunnelProtocol" => 1,
    "{urn:iControl}PEM.Policy.FilterOperationType" => 1,
    "{urn:iControl}PEM.Policy.GateStatusType" => 1,
    "{urn:iControl}PEM.Policy.L2EndpointType" => 1,
    "{urn:iControl}PEM.Policy.ProtocolType" => 1,
    "{urn:iControl}PEM.Policy.ReportGranularityType" => 1,
    "{urn:iControl}PEM.ServiceChainEndpoint.ServiceOptionType" => 1,
    "{urn:iControl}PEM.Subscriber.SessionDBPolicyType" => 1,
    "{urn:iControl}PEM.Subscriber.SessionDBSubscriberType" => 1,
    "{urn:iControl}PEM.Subscriber.SubscriberIdType" => 1,
    "{urn:iControl}PEM.PersistenceType" => 1,
    "{urn:iControl}Security.DoSDevice.DoSDeviceVector" => 1,
    "{urn:iControl}Security.FirewallWeeklySchedule.FWWeekDay" => 1,
    "{urn:iControl}Security.LogProfile.DNSStorageFormat" => 1,
    "{urn:iControl}Security.LogProfile.EntryLength" => 1,
    "{urn:iControl}Security.LogProfile.FilterKey" => 1,
    "{urn:iControl}Security.LogProfile.LogicOperation" => 1,
    "{urn:iControl}Security.LogProfile.NetworkStorageFormat" => 1,
    "{urn:iControl}Security.LogProfile.RemoteFacility" => 1,
    "{urn:iControl}Security.LogProfile.RemoteProtocol" => 1,
    "{urn:iControl}Security.LogProfile.RemoteStorage" => 1,
    "{urn:iControl}Security.LogProfile.ResponseLogging" => 1,
    "{urn:iControl}Security.LogProfile.SIPStorageFormat" => 1,
    "{urn:iControl}Security.LogProfile.StorageFormat" => 1,
    "{urn:iControl}Security.ProfileDoS.Anomaly" => 1,
    "{urn:iControl}Security.ProfileDoS.DNSQuery" => 1,
    "{urn:iControl}Security.ProfileDoS.NetworkAttackVector" => 1,
    "{urn:iControl}Security.ProfileDoS.OperationMode" => 1,
    "{urn:iControl}Security.ProfileDoS.SIPAttackVector" => 1,
    "{urn:iControl}Security.ProfileIPIntelligence.Action" => 1,
    "{urn:iControl}Security.HeaderOpcode" => 1,
    "{urn:iControl}Security.QueryType" => 1,
    "{urn:iControl}System.ConfigSync.ConfigExcludeComponent" => 1,
    "{urn:iControl}System.ConfigSync.ConfigIncludeComponent" => 1,
    "{urn:iControl}System.ConfigSync.LoadMode" => 1,
    "{urn:iControl}System.ConfigSync.SaveMode" => 1,
    "{urn:iControl}System.ConfigSync.SyncMode" => 1,
    "{urn:iControl}System.Disk.APPVOwner" => 1,
    "{urn:iControl}System.Disk.APPVPreservabilityMode" => 1,
    "{urn:iControl}System.Disk.LogicalDiskUserMode" => 1,
    "{urn:iControl}System.Disk.RAIDStatus" => 1,
    "{urn:iControl}System.Failover.FailoverMode" => 1,
    "{urn:iControl}System.Failover.FailoverState" => 1,
    "{urn:iControl}System.HAGroup.HAGroupClusterAttribute" => 1,
    "{urn:iControl}System.HAGroup.HAGroupPoolAttribute" => 1,
    "{urn:iControl}System.HAGroup.HAGroupTrunkAttribute" => 1,
    "{urn:iControl}System.HAStatus.Feature" => 1,
    "{urn:iControl}System.Services.ServiceAction" => 1,
    "{urn:iControl}System.Services.ServiceStatusType" => 1,
    "{urn:iControl}System.Services.ServiceType" => 1,
    "{urn:iControl}System.Session.ReturnedPath" => 1,
    "{urn:iControl}System.Statistics.GtmIQueryState" => 1,
    "{urn:iControl}System.Statistics.GtmPathStatisticObjectType" => 1,
    "{urn:iControl}System.VCMP.VCMPGuestState" => 1,
    "{urn:iControl}System.VCMP.VCMPNetworkMode" => 1,
    "{urn:iControl}System.VCMP.VCMPOperatingSystem" => 1,
    "{urn:iControl}System.VCMP.VCMPSlotAllocation" => 1,
    "{urn:iControl}System.VCMP.VCMPStatus" => 1,
    "{urn:iControl}System.VCMP.VirtualDiskStatus" => 1,
    "{urn:iControl}System.CPUMetricType" => 1,
    "{urn:iControl}System.ChassisSlotState" => 1,
    "{urn:iControl}System.ConnectionType" => 1,
    "{urn:iControl}System.FanMetricType" => 1,
    "{urn:iControl}System.HardwareType" => 1,
    "{urn:iControl}System.PSMetricType" => 1,
    "{urn:iControl}System.TemperatureMetricType" => 1,
    "{urn:iControl}WebAccelerator.Applications.ETag" => 1,
    "{urn:iControl}WebAccelerator.Applications.InfoHeader" => 1,
    "{urn:iControl}iCall.GeneralHandlerState" => 1,
    "{urn:iControl}iCall.MatchAlgorithm" => 1,
    "{urn:iControl}iCall.PerpetualHandlerState" => 1,
};
sub SOAP::Deserializer::typecast
{
  my ($self, $value, $name, $attrs, $children, $type) = @_;
  my $retval = undef;
  if ( 1 == $urnMap->{$type} )
  {
    $retval = $value;
  }
  return $retval;
}
 
sub GetInterface()
{
  my ($module, $name) = @_;
  
  $interface = SOAP::Lite
    -> uri("urn:iControl:$module/$name")
    -> readable(1)
    -> proxy("https://$BIGIP/iControl/iControlPortal.cgi");
  eval { $interface->transport->http_request->header
  ( 'Authorization' => 'Basic ' . MIME::Base64::encode("$User:$Pass", '') ); };
 
  return $interface;
}
 
sub FixEmptyEntries()
{
  my @list1 = @_;
  my @list2;
  
  my $valid_item = "";
  
  for $i (0 .. $#list1)
  {
  
    $item = @list1[$i];
    if ( $item ne "" )
    {
      $valid_item = $item;
      break;
    }
  }
  
  for $i (0 .. $#list1)
  {
    $item = @list1[$i];
    if ( $item ne "" ) { push @list2, $item; }
    else               { push @list2, $valid_item; }
  }
  return @list2;
}

#----------------------------------------------------------------------------
# sub getMonitorInfo()
#----------------------------------------------------------------------------
sub getMonitorInfo()
{
  my ($monitor) = (@_);
  $result = "";
  
  @Monitors=();
  @PropertyTypes=();
  push @Monitors, $monitor;
  push @Monitors, $monitor;
  push @PropertyTypes, "ITYPE_INTERVAL";
  push @PropertyTypes, "ITYPE_TIMEOUT";

  $soapResponse = $LocalLBMonitor->get_template_integer_property(
    SOAP::Data->name(template_names => [@Monitors]),
    SOAP::Data->name(property_types => [@PropertyTypes])
  );
  &checkResponse($soapResponse);
  @StringValueA = @{$soapResponse->result};
  #print Dumper(@StringValueA);
  $StringValue = pop(@StringValueA);
  $timeout = $StringValue->{"value"};
  $StringValue = pop(@StringValueA);
  $interval = $StringValue->{"value"};
  $result = " | I:$interval | T:$timeout";

  $soapResponse = $LocalLBMonitor->get_template_type(    
  SOAP::Data->name(template_names => [$monitor])  );
  &checkResponse($soapResponse);
  @TemplateTypeA = @{$soapResponse->result};

  $TemplateType = @TemplateTypeA[0];
  if ( "TTYPE_HTTP" eq $TemplateType || "TTYPE_HTTPS" eq $TemplateType)
  {
    @Monitors=();
	@PropertyTypes=();
	push @Monitors, $monitor;
    push @Monitors, $monitor;
    push @PropertyTypes, "STYPE_SEND";
    push @PropertyTypes, "STYPE_RECEIVE";
    
    $soapResponse = $LocalLBMonitor->get_template_string_property(
      SOAP::Data->name(template_names => [@Monitors]),
      SOAP::Data->name(property_types => [@PropertyTypes])
    );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
	#print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $recv = $StringValue->{"value"};
    $recv  =~ s/&(?!amp;)/&/g;
    $recv  =~ s/>/>/g;
    $recv  =~ s/{"value"};
    $send  =~ s/&(?!amp;)/&/g;
    $send  =~ s/>/>/g;
    $send  =~ s/ Send:$send\n > Recv:$recv";
  }
  return "$result";
}

#----------------------------------------------------------------------------
# sub getSSLInfo()
#----------------------------------------------------------------------------
sub getSSLInfo()
{
  my ($profile,$type) = (@_);

  if ("CLIENT_SSL" eq $type)
  {
    $soapResponse = $LocalLBProfileClientSSL->get_certificate_file_v2(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $cert = $StringValue->{"value"};

    $soapResponse = $LocalLBProfileClientSSL->get_chain_file_v2(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $chain = $StringValue->{"value"};

    $soapResponse = $LocalLBProfileClientSSL->get_key_file_v2(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $key = $StringValue->{"value"};

    $soapResponse = $LocalLBProfileClientSSL->get_cipher_list(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $String = $StringValue->{"values"};
    $cipher = join(":",@{$String});
  
    $ret="";
    if($cert ne ""){ $ret="\n > Cert:$cert" };
    if($chain ne ""){ $ret.="\n > Chain:$chain" };
    if($key ne ""){ $ret.="\n > Key:$key" };
    if($cipher ne "" && $cipher ne "DEFAULT"){ $ret.="\n > Cipher:$cipher" };
    return $ret;
  }
  elsif ("SERVER_SSL" eq $type)
  {
    $soapResponse = $LocalLBProfileServerSSL->get_certificate_file_v2(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $cert = $StringValue->{"value"};

    $soapResponse = $LocalLBProfileServerSSL->get_chain_file_v2(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $chain = $StringValue->{"value"};

    $soapResponse = $LocalLBProfileServerSSL->get_key_file_v2(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $key = $StringValue->{"value"};

    $soapResponse = $LocalLBProfileServerSSL->get_cipher_list(    
    SOAP::Data->name(profile_names => [$profile])  );
    &checkResponse($soapResponse);
    @StringValueA = @{$soapResponse->result};
    #print Dumper(@StringValueA);
    $StringValue = pop(@StringValueA);
    $String = $StringValue->{"values"};
    $cipher = join(":",@{$String});
  
    $ret="";
    if($cert ne ""){ $ret="\n > Cert:$cert" };
    if($chain ne ""){ $ret.="\n > Chain:$chain" };
    if($key ne ""){ $ret.="\n > Key:$key" };
    if($cipher ne "" && $cipher ne "DEFAULT"){ $ret.="\n > Cipher:$cipher" };
    return $ret;
  }
  return "";
}


# Status conversion 
my $MONITOR_STATUS_MAP = 
  {
    "INSTANCE_STATE_UNCHECKED" => "UNCHECKED",
    "INSTANCE_STATE_CHECKING" => "CHECKING",
    "INSTANCE_STATE_UP" => "UP",
    "INSTANCE_STATE_DOWN" => "DOWN",
    "INSTANCE_STATE_FORCED_DOWN" => "FORCED_DOWN",
    "INSTANCE_STATE_DISABLED" => "DISABLED",
    "INSTANCE_STATE_DOWN_BY_IRULE" => "DOWN_BY_IRULE",
    "INSTANCE_STATE_DOWN_WAIT_FOR_MANUAL_RESUME" => "DOWN_WAIT_MANUAL_RESUME",
  };

my $ENABLED_STATUS_MAP = 
  {
    "ENABLED_STATUS_NONE" => "NONE",
    "ENABLED_STATUS_ENABLED" => "ENABLED",
    "ENABLED_STATUS_DISABLED" => "DISABLED",
    "ENABLED_STATUS_DISABLED_BY_PARENT" => "DISABLED_BY_PARENT",
  };

my $STATUS_MAP = 
  {
    "AVAILABILITY_STATUS_RED" => "RED",
    "AVAILABILITY_STATUS_GREEN" => "GREEN",
    "AVAILABILITY_STATUS_BLUE" => "BLUE",
  };
my $VS_STATE_MAP = 
  {
    "STATE_ENABLED" => "ENABLED",
    "STATE_DISABLED" => "DISABLED",
  };

# Get config  
sub GetConfigXML()
{
    # Enable Recursive Partition/Folder lookup and set /Common as active folder
    $SystemSession = &GetInterface("System", "Session");
    $soapResponse = $SystemSession->set_recursive_query_state(
        SOAP::Data->name(state => "STATE_ENABLED")
    );
    &checkResponse($soapResponse);
    $soapResponse = $SystemSession->set_active_folder(
    SOAP::Data->name(folder => "/")
    );
    
    # Get data
    $LocalLBVirtualServer = &GetInterface("LocalLB", "VirtualServer");
    $LocalLBPool = &GetInterface("LocalLB", "Pool");
    $LocalLBPoolMember = &GetInterface("LocalLB", "PoolMember");
    $LocalLBSNATPool = &GetInterface("LocalLB", "SNATPool");
    $LocalLBNodeAddressV2 = &GetInterface("LocalLB", "NodeAddressV2");
    $LocalLBMonitor = &GetInterface("LocalLB", "Monitor");
    $LocalLBProfileServerSSL = &GetInterface("LocalLB", "ProfileServerSSL");
    $LocalLBProfileClientSSL = &GetInterface("LocalLB", "ProfileClientSSL");

    # VS List
    $soapResponse = $LocalLBVirtualServer->get_list();
    &checkResponse($soapResponse);
    @vs_list = @{$soapResponse->result};
    #print Dumper(@vs_list);

    # Destination
    $soapResponse = $LocalLBVirtualServer->get_destination_v2(
    SOAP::Data->name (virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @destination_list = @{$soapResponse->result};

    # Type
    $soapResponse = $LocalLBVirtualServer->get_type(
    SOAP::Data->name (virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @vstype_list = @{$soapResponse->result};

    # iRules
    $soapResponse = $LocalLBVirtualServer->get_rule(
    SOAP::Data->name (virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @rule_listA = @{$soapResponse->result};

    # Profiles
    $soapResponse = $LocalLBVirtualServer->get_profile(
    SOAP::Data->name(virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @profile_listA = @{$soapResponse->result};

    $soapResponse = $LocalLBVirtualServer->get_persistence_profile(
    SOAP::Data->name(virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @persistenceprofile_listA = @{$soapResponse->result};

    # SNAT
    $soapResponse = $LocalLBVirtualServer->get_source_address_translation_snat_pool(
    SOAP::Data->name(virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @snat_list = @{$soapResponse->result};

    # ensure we don't pass empty entries to the following methods.  
    @snat_list2 = &FixEmptyEntries(@snat_list);

    # SNAT Pool Members
    $soapResponse = $LocalLBSNATPool->get_member_v2(
    SOAP::Data->name(snat_pools => [@snat_list2])
    );
    &checkResponse($soapResponse);
    @snatmember_listA = @{$soapResponse->result};

    # State
    $soapResponse = $LocalLBVirtualServer->get_enabled_state(
    SOAP::Data->name(virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @state_list = @{$soapResponse->result};
    $soapResponse = $LocalLBVirtualServer->get_object_status(
    SOAP::Data->name(virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @status_list = @{$soapResponse->result};

    # Pools
    $soapResponse = $LocalLBVirtualServer->get_default_pool_name(
    SOAP::Data->name (virtual_servers => [@vs_list])
    );
    &checkResponse($soapResponse);
    @pool_list = @{$soapResponse->result};

    # ensure we don't pass empty entries to the following methods.  
    @pool_list2 = &FixEmptyEntries(@pool_list);

    # Pool Members
    $soapResponse = $LocalLBPool->get_member_v2(
    SOAP::Data->name(pool_names => [@pool_list2])
    );
    &checkResponse($soapResponse);
    @member_listA = @{$soapResponse->result};

    # Member/Monitor Details
    $soapResponse = $LocalLBPool->get_member_priority(
    SOAP::Data->name(pool_names => [@pool_list2]), 
    SOAP::Data->name(members => [@member_listA])
    );
    &checkResponse($soapResponse);
    @priorityA = @{$soapResponse->result};
    #print Dumper(@priorityA);
    
    $soapResponse = $LocalLBPool->get_member_ratio(
    SOAP::Data->name(pool_names => [@pool_list2]), 
    SOAP::Data->name(members => [@member_listA])
    );
    &checkResponse($soapResponse);
    @ratioA = @{$soapResponse->result};
    #print Dumper(@ratioA);

    $soapResponse = $LocalLBPoolMember->get_object_status(
    SOAP::Data->name(pool_names => [@pool_list2])
    );
    &checkResponse($soapResponse);
    @object_statusA = @{$soapResponse->result};
    #print Dumper(@object_status);

    # LB Method
    $soapResponse = $LocalLBPool->get_lb_method(
    SOAP::Data->name(pool_names => [@pool_list2])
    );
    &checkResponse($soapResponse);
    @lbmethod_list = @{$soapResponse->result};

    $soapResponse = $LocalLBPool->get_minimum_active_member(
    SOAP::Data->name(pool_names => [@pool_list2])
    );
    &checkResponse($soapResponse);
    @min_members_list = @{$soapResponse->result};
	#print Dumper(@min_members_list);

    $soapResponse = $LocalLBPool->get_monitor_association(
    SOAP::Data->name(pool_names => [@pool_list2])
    );
    &checkResponse($soapResponse);
    @monitor_list = @{$soapResponse->result};

    # Node list
    $soapResponse = $LocalLBNodeAddressV2->get_list();
    &checkResponse($soapResponse);
    @node_list = @{$soapResponse->result};
    #print Dumper(@node_list);
    $soapResponse = $LocalLBNodeAddressV2->get_address(
    SOAP::Data->name(nodes => [@node_list])    );
    &checkResponse($soapResponse);
    @node_address = @{$soapResponse->result};
    #print Dumper(@node_address);
    my %nodehash;
    @nodehash{@node_list} = @node_address;
    #print Dumper(\%nodehash);

    # VS list sort index by IP:port
    my %vipH;
    for $i (0 .. $#destination_list)
    {
        $destination = @destination_list[$i];
        $daddr = $destination->{"address"};
        $dport = $destination->{"port"};
        if($daddr =~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){ $ip = $1; }else{ $ip = $daddr }
        $dint = ip_to_int($ip)*100000+$dport;
        $vipH{$dint} = $i;
    }
    #print Dumper(\%vipH);


    # print XML
    print "\n";
    print "\n";
    print "  \n";
    
    foreach $n (sort keys %vipH)
    {
        $i = $vipH{$n};
        # vip
        $vip = @vs_list[$i];
        $destination = @destination_list[$i];
        $pool = @pool_list[$i];
        $vstype = @vstype_list[$i];
        $snat = @snat_list[$i];
        $state = @state_list[$i];
        $stateVS = $VS_STATE_MAP->{$state};
        $statuse = @status_list[$i]->{"availability_status"};
        $statusVS = $STATUS_MAP->{$statuse};
        @rule_list = @{$rule_listA[$i]};
        @profile_list = @{$profile_listA[$i]};
        @persistenceprofile_list = @{$persistenceprofile_listA[$i]};

        # pool
        @member_list = @{$member_listA[$i]};
        @object_status = @{$object_statusA[$i]};
        @priority = @{$priorityA[$i]};
        @ratio = @{$ratioA[$i]};
        $monitorassociations = @monitor_list[$i];
        $monitor_rule = $monitorassociations->{"monitor_rule"};
        $lb_method = $lbmethod_list[$i];
		$lb_method =~ s/^LB_METHOD_//;
		$minActive = $min_members_list[$i];

        # SNAT
        @snatmember_list = @{$snatmember_listA[$i]};
		
        # Route Domain
        $daddr = $destination->{"address"};
        $dport = $destination->{"port"};
        if($daddr =~/%(\d+)/){ $rd = $1; }else{ $rd = 0 }
        
        if($Mode eq "simplified"){
            print "    \n";
        }
        else{
            print "    \n";
        }
        
		# Pool
        if ( $pool ne "" ) 
        {
          if($Mode eq "simplified"){
			  if($minActive>0){ $extra="\n> MinActiveMembers: $minActive" }else{ $extra="" }
			  print "      \n";
              print "      \n";
          }
          else{
			  print "      \n";
              for $j (0 .. $#member_list)
              {
                $member = @member_list[$j];
                $node = $member->{"address"};
                $address = @nodehash{$node};
                $port = $member->{"port"};
                $pri = @priority[$j];
                $ratio = @ratio[$j];
                $monitorS = @object_status[$j]->{"object_status"}->{"availability_status"};
                $enabledS = @object_status[$j]->{"object_status"}->{"enabled_status"};
                $status = "$MONITOR_STATUS_MAP->{$monitorS} | $ENABLED_STATUS_MAP->{$enabledS}";
                print "        \n";
              }
          }
          $type = $monitor_rule->{"type"};
          @templates = @{$monitor_rule->{"monitor_templates"}};
          if($Mode eq "simplified"){
              print "        \n"; 
          }
          else{
              print "        \n"; 
          }
          if($Mode eq "simplified"){
              print "      \n";
          }
          else{
              for $j (0 .. $#templates)
              {
                $template = @templates[$j];
                $sMonitor = &getMonitorInfo($template);
                print "          \n";
              }
          }
          print "        \n";
          
          print "      \n";
        }

		# Profiles
        if($Mode eq "simplified"){
            print "      \n";
        }
        else{
            for $j (0 .. $#profile_list)
            {
              $profile = @profile_list[$j];
              $name = $profile->{"profile_name"};
              $type = $profile->{"profile_type"};
              $context = $profile->{"profile_context"};
              $default = $pprofile->{"default_profile"};
              $sslinfo = &getSSLInfo($name,$type);
              print "      \n";
            }
        }

		# Persistence
        if($Mode eq "simplified"){
            print "      \n";
        }
        else{
            for $j (0 .. $#persistenceprofile_list)
            {
              $pprofile = @persistenceprofile_list[$j];
              $name = $pprofile->{"profile_name"};
              $default = $pprofile->{"default_profile"};
              print "      \n";
            }
        }

		# iRule
        if($Mode eq "simplified"){
            print "      \n";
        }
        else{
            for $j (0 .. $#rule_list)
            {
              $rule = @rule_list[$j];
              $name = $rule->{"rule_name"};
              $priority = $rule->{"priority"};
              print "      \n";
            }
        }

		# SNAT
        if ( $snat ne "" ) 
        {
          print "      \n";
          if($Mode eq "simplified"){
              print "      \n";
          }
          else{
              for $j (0 .. $#snatmember_list)
              {
                $snatmember = @snatmember_list[$j];
                print "        \n";
              }
          }
          print "      \n";
        }

        print "    \n";
    }
    print "  \n";
    print "\n";
    
    # Set /Common as active folder
    $soapResponse = $SystemSession->set_active_folder(
    SOAP::Data->name(folder => "/")
    );
    &checkResponse($soapResponse);
}

&GetConfigXML();
 
 
#----------------------------------------------------------------------------
# checkResponse
#----------------------------------------------------------------------------
sub checkResponse()
{
  my ($soapResponse) = (@_);
  if ( $soapResponse->fault )
  {
    print $soapResponse->faultcode, " ", $soapResponse->faultstring, "\n";
    exit();
  }
}

Tested this on version:

12.1
Comments
StevenSharpe
Nimbostratus
Nimbostratus

Any ideas why I would get an error when trying to import into Excel saying '<' is not a valid character? I'm getting this where it is returning information around the monitors of a pool.

Miguel_Rosa
Nimbostratus
Nimbostratus

Could you check if is because the monitor uses a string with some special characters like '&' or '<' or '>'?

I have updated the code to convert all below:

ampersand: & to &amp;

greater-than: > to &gt;

less-than: < to &lt;

apostrophe: ' to &apos;

quote: " to &quot;

 

Version history
Last update:
‎30-Sep-2019 08:27
Updated by:
Contributors