This example is a HTTP daemon that implements the EventNotification interface to receive iControl status messages. It will then proxy that message and post it to a specified Twitter account.
Who says the BIG-IP can't be social! This perl program implements a HTTP daemon running on port 8088 and listens for the iControl Management::EventNotification::changes_occurred method. There are a few settings you'll want to configure before running this program. Namely the BIGIP variables containing the BIG-IP you are connecting to, the LISTENER variables that specify where this perl module is running, and the TWITTER credentials for your Twitter account.-->
To make it plain dead simple, you can just plop this directly on your BIG-IP and run it as-is with only setting the Twitter credentials. Keep in mind that installing anything on your BIG-IP could effect performance so do so at your own risk.
Once you have everything setup, just run the app and you should be good to go.
The subscription is only set to monitor pool members, but you could easily modify the event_type_list in the setupSubscription subroutine by adding more event types you would like to monitor.
Happy Twittering!
Code :
#!/usr/bin/perl
#----------------------------------------------------------------------------
# The contents of this file are subject to the "END USER LICENSE AGREEMENT FOR F5
# Software Development Kit for iControl"; you may not use this file except in
# compliance with the License. The License is included in the iControl
# Software Development Kit.
#
# 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-2007 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 SOAP::Transport::HTTP;
my $INFO = 1;
my $DEBUG = 1;
my $BIGIP = "localhost";
my $BIGIP_PORT = "80";
my $BIGIP_UID = "";
my $BIGIP_PWD = "";
my $LISTENER_NAME = "iControlTwitterProxy";
my $LISTENER_HOST = "localhost";
my $LISTENER_PORT = 8088;
my $LISTENER_UID = "";
my $LISTENER_PWD = "";
my $TWITTER_UID = "TWITTER_ACCOUNT_GOES_HERE";
my $TWITTER_PWD = "TWITTER_PASSWORD_GOES_HERE";
# don't want to die on 'Broken pipe' or Ctrl-c
$SIG{PIPE} = 'IGNORE';
###
### API for the SOAP server for cmd_dispatch
###
package Management::EventNotification;
BEGIN { push (@INC, "."); }
use iControlTypeCast;
#------------------------------------------------------------------------------------------
# sub events_occurred
#------------------------------------------------------------------------------------------
sub events_occurred {
my ($self,$event_source,$subscription_id,$event_data_list,$time_stamp) = @_;
if ( $DEBUG ) { print "events_occurred() was just invoked!\n"; }
# $event_source
$system_id = $event_source->{"system_id"};
$url = $event_source->{"url"};
$year = $time_stamp->{"year"};
$month = $time_stamp->{"month"};
$day = $time_stamp->{"day"};
$hour = $time_stamp->{"hour"};
$minute = $time_stamp->{"minute"};
$second = $time_stamp->{"second"};
if ( $INFO ) { print "Event Occurred\n"; }
if ( $INFO ) { print " System Id : $system_id\n"; }
if ( $INFO ) { print " Url : $url\n"; }
if ( $INFO ) { print "subscription id: $subscription_id\n"; }
if ( $INFO ) { print " Time Stamp : $year:$month:$day/$hour:$minute:$second\n"; }
if ( $DEBUG ) { print " Event Data List\n"; }
foreach $event_data (@{$event_data_list})
{
processEvent($event_data);
}
}
#------------------------------------------------------------------------------------------
# sub processEvent
#------------------------------------------------------------------------------------------
sub processEvent()
{
my ($event_data) = (@_);
$username = $event_data->{"username"};
$sequence_number = $event_data->{"sequence_number"};
$event_type = $event_data->{"event_type"};
$object_type = $event_data->{"object_type"};
@event_data_item_list = @{$event_data->{"event_data_item_list"}};
if ( $DEBUG ) { print "---------------\n"; }
if ( $DEBUG ) { print " seq # : $sequence_number\n"; }
if ( $DEBUG ) { print " Event Type : $event_type\n"; }
if ( $DEBUG ) { print "Object Type : $object_type\n"; }
if ( $DEBUG ) { print "Event List\n"; }
if ( $DEBUG ) { print " ----------------\n"; }
if ( "OBJECTTYPE_RULE" eq $object_type )
{
&processRule($event_data);
}
elsif ( "OBJECTTYPE_INTERFACE" eq $object_type )
{
&processInterface($event_data);
}
elsif ( "OBJECTTYPE_MONITOR_INSTANCE" eq $object_type )
{
if ( $DEBUG ) { print "Ignoring object type '$object_type'\n"; }
}
elsif ( "OBJECTTYPE_POOL" eq $object_type )
{
if ( $DEBUG ) { print "Ignoring object type '$object_type'\n"; }
}
elsif ( "OBJECTTYPE_POOL_MEMBER" eq $object_type )
{
if ( $DEBUG ) { &processPoolMember($event_data); }
}
elsif ( "OBJECTTYPE_VIRTUAL_SERVER" eq $object_type )
{
if ( $DEBUG ) { print "Ignoring object type '$object_type'\n"; }
}
else
{
if ( $DEBUG ) { print "Ignoring object type '$object_type'\n"; }
}
}
#------------------------------------------------------------------------------------------
# sub processRule
#------------------------------------------------------------------------------------------
sub processRule()
{
my ($event_data) = (@_);
@event_data_item_list = @{$event_data->{"event_data_item_list"}};
$event_type = $event_data->{"event_type"};
my $EVENTTYPE_MAP =
{
"EVENTTYPE_MODIFY" => "MODIFIED",
"EVENTTYPE_CREATE" => "CREATED",
"EVENTTYPE_DELETE" => "DELETED",
};
foreach $event_data_item (@event_data_item_list)
{
$event_data_name = $event_data_item->{"event_data_name"};
$event_data_type = $event_data_item->{"event_data_type"};
$event_data_value = $event_data_item->{"event_data_value"};
if ( $DEBUG ) { print " Item Data : $event_data_name = $event_data_value ($event_data_type)\n"; }
if ( $event_data_name eq "rule_name") { $rule_name = $event_data_value; }
}
if ( "" ne $rule_name )
{
$Action = $EVENTTYPE_MAP->{$event_type};
$tweet = "Rule '$rule_name' has been $Action.";
&processTweet($tweet);
}
}
#------------------------------------------------------------------------------------------
# sub processInterface
#------------------------------------------------------------------------------------------
sub processInterface()
{
my ($event_data) = (@_);
@event_data_item_list = @{$event_data->{"event_data_item_list"}};
$event_type = $event_data->{"event_type"};
my $MEDIA_STATUS_MAP =
{
"0" => "UP",
"1" => "DOWN",
"2" => "DISABLED",
"3" => "UNINITIALIZED",
"4" => "LOOPBACK",
"5" => "UNPOPULATED",
};
$interface_name = "";
$interface_status = "";
foreach $event_data_item (@event_data_item_list)
{
$event_data_name = $event_data_item->{"event_data_name"};
$event_data_type = $event_data_item->{"event_data_type"};
$event_data_value = $event_data_item->{"event_data_value"};
if ( $DEBUG ) { print " Item Data : $event_data_name = $event_data_value ($event_data_type)\n"; }
if ( $event_data_name eq "interface_name") { $interface_name = $event_data_value; }
elsif ( $event_data_name eq "interface_status") { $interface_status = $event_data_value; }
}
if ( ("" ne $interface_name) && ("" ne $interface_status) )
{
$sStatus = $MEDIA_STATUS_MAP->{$interface_status};
$tweet = "Interface '$interface_name' status changed to $sStatus.";
&processTweet($tweet);
}
}
#------------------------------------------------------------------------------------------
# sub processPoolMember
#------------------------------------------------------------------------------------------
sub processPoolMember()
{
my ($event_data) = (@_);
@event_data_item_list = @{$event_data->{"event_data_item_list"}};
$pool_name = "";
$member_ip = "";
$member_port = "";
$new_sessions = "";
$availability = "";
$enabled = "";
$monitor_status = "";
$session_status = "";
foreach $event_data_item (@event_data_item_list)
{
$event_data_name = $event_data_item->{"event_data_name"};
$event_data_type = $event_data_item->{"event_data_type"};
$event_data_value = $event_data_item->{"event_data_value"};
if ( $DEBUG ) { print " Item Data : $event_data_name = $event_data_value ($event_data_type)\n"; }
if ( $event_data_name eq "pool_member_pool_name") { $pool_name = $event_data_value; }
elsif ( $event_data_name eq "pool_member_addr") { $member_ip = $event_data_value; }
elsif ( $event_data_name eq "pool_member_port") { $member_port = $event_data_value; }
elsif ( $event_data_name eq "pool_member_new_session_enable") { $new_sessions = $event_data_value; }
elsif ( $event_data_name eq "generic_status_availability_state") { $availability = $event_data_value; }
elsif ( $event_data_name eq "generic_status_enabled_state") { $enabled = $event_data_value; }
elsif ( $event_data_name eq "generic_status_enabled_state") { $enabled = $event_data_value; }
elsif ( $event_data_name eq "pool_member_monitor_status") { $monitor_status = $event_data_value; }
elsif ( $event_data_name eq "pool_member_session_status") { $session_status = $event_data_value; }
}
if ( ("" ne $pool_name) and ("" ne $member_ip) and ("" ne $member_port) and
("" ne $new_sessions) and ("" ne $availability) and ("" ne $enabled) )
{
&processMemberChange($pool_name, $member_ip, $member_port, $new_sessions, $availability, $enabled);
}
elsif ( ("" ne $pool_name) and ("" ne $member_ip) and ("" ne $member_port) and
("" ne $monitor_status) )
{
&processMonitorChange($pool_name, $member_ip, $member_port, $monitor_status, $session_status);
}
else
{
if ( $DEBUG ) { print "Unqualifying event notification\n"; }
}
}
#------------------------------------------------------------------------------------------
# sub processMemberChange
#------------------------------------------------------------------------------------------
sub processMemberChange()
{
my ($pool_name, $member_ip, $member_port, $new_sessions, $availability, $enabled) = (@_);
if ( ("" ne $pool_name) and ("" ne $member_ip) and ("" ne $member_port) and
("" ne $new_sessions) and ("" ne $availability) and ("" ne $enabled) )
{
if ( $DEBUG ) { print "Processing Member Change Tweet:\n"; }
if ( $DEBUG ) { print " Pool Name: $pool_name\n"; }
if ( $DEBUG ) { print " Member : $member_addr:$member_port\n"; }
if ( $DEBUG ) { print " New Sess : $new_sessions\n"; }
if ( $DEBUG ) { print " Avail : $availability\n"; }
if ( $DEBUG ) { print " Enabled : $enabled\n"; }
$sEnabled = "UNKNOWN";
$sAvailable = "ERROR";
$ENABLED_MAP =
{
"1" => "UP",
"2" => "DOWN"
};
$sEnabled = $ENABLED_MAP->{$enabled};
if ( "" eq $sEnabled ) { $sEnabled = "UNKNOWN"; }
# if ( $enabled eq "1") { $sEnabled = "UP"; }
# elsif ( $enabled eq "2") { $sEnabled = "DOWN"; }
# else { $sEnabled = "UNKNOWN"; }
$AVAILABILITY_MAP =
{
"0" => "ERROR",
"1" => "ACTIVE",
"2" => "INACTIVE",
"3" => "INACTIVE (Needs Intervention)",
"4" => "INACTIVE (Unknown)",
"5" => "INACTIVE (Unlicensed)",
};
$sAvailable = $AVAILABILITY_MAP->{$availability};
if ( "" eq $sAvailable ) { $sAvailable = "ERROR"; }
# if ( $availability eq "0") { $sAvailable = "ERROR"; }
# elsif ( $availability eq "1") { $sAvailable = "ACTIVE"; }
# elsif ( $availability eq "2") { $sAvailable = "INACTIVE"; }
# elsif ( $availability eq "3") { $sAvailable = "INACTIVE (Needs Intervention)"; }
# elsif ( $availability eq "4") { $sAvailable = "INACTIVE (Unknown)"; }
# elsif ( $availability eq "5") { $sAvailable = "INACTIVE (Unlicensed)"; }
# else { $sAvailable = "ERROR"; }
if ( ("UP" eq $sEnabled) and ("ACTIVE" eq $sAvailable) )
{
$tweet = "Member $member_ip:$member_port in pool $pool_name seems to have recovered and is ready to rock!";
}
else
{
$tweet = "Member $member_ip:$member_port in pool $pool_name seems to be having problems. It is marked '$sEnabled' with a '$sAvailable' state."
}
&processTweet($tweet);
}
}
#------------------------------------------------------------------------------------------
# sub processMonitorChange
#------------------------------------------------------------------------------------------
sub processMonitorChange()
{
my ($pool_name, $member_ip, $member_port, $monitor_state, $session_status) = (@_);
if ( ("" ne $pool_name) and ("" ne $member_ip) and ("" ne $member_port) and
("" ne $monitor_state) )
{
if ( $DEBUG ) { print "Processing Monitor Change Tweet:\n"; }
if ( $DEBUG ) { print " Pool Name: $pool_name\n"; }
if ( $DEBUG ) { print " Member : $member_addr:$member_port\n"; }
if ( $DEBUG ) { print " Mon State: $monitor_state\n"; }
$MONITOR_STATE_MAP =
{
"0" => "UNCHECKED",
"1" => "CHECKING",
"2" => "UP",
"3" => "DOWN",
"4" => "FORCED DOWN",
"5" => "MAINT",
"6" => "ADDRESS DOWN",
"7" => "DOWN BY IRULE",
"8" => "MARKED DOWN",
};
$SESSION_STATUS_MAP =
{
"0" => "ENABLED",
"1" => "DISABLED",
"2" => "FORCED DISABLED",
"3" => "ADDRESS DISABLED",
};
$sState = $MONITOR_STATE_MAP->{$monitor_state};
$sSessionStatus = $SESSION_STATUS_MAP->{$session_status};
if ( ("UP" eq $sState) and ("ENABLED" eq $sSessionStatus) )
{
$tweet = "Member $member_ip:$member_port in pool $pool_name seems to have recovered and is ready to rock!";
}
else
{
$tweet = "Member $member_ip:$member_port in pool $pool_name is down. Monitor is reporting a monitor/session state = '$sState/$sSessionStatus'";
}
&processTweet($tweet);
}
}
#------------------------------------------------------------------------------------------
# sub processTweet
#------------------------------------------------------------------------------------------
sub processTweet()
{
my ($tweet) = (@_);
# call curl to submit POST to twitter
$cmd = "curl --data-ascii \"status=$tweet\" --user $TWITTER_UID:$TWITTER_PWD http://twitter.com:80/statuses/update.xml";
if ( $DEBUG ) { print "$cmd\n"; }
system($cmd);
}
#------------------------------------------------------------------------------------------
# sub SOAP::Transport::HTTP::Client::get_basic_credentials
#------------------------------------------------------------------------------------------
sub SOAP::Transport::HTTP::Client::get_basic_credentials
{
return "$BIGIP_UID" => "$BIGIP_PWD";
}
#------------------------------------------------------------------------------------------
# sub setupSubscription
#------------------------------------------------------------------------------------------
sub setupSubscription()
{
my $exists = 0;
my $sProtocol = "http";
if ( $BIGIP_PORT eq 443 ) { $sProtocol = "https"; }
$EventSubscription = SOAP::Lite
-> uri('urn:iControl:Management/EventSubscription')
-> proxy("$sProtocol://$BIGIP:$BIGIP_PORT/iControl/iControlPortal.cgi");
eval { $EventSubscription->transport->http_request->header
(
'Authorization' =>
'Basic ' . MIME::Base64::encode("$BIGIP_UID:$BIGIP_PWD", '')
); };
if ( $DEBUG ) { print "Requesting Subscription List...\n"; }
# Get a list of the subscriptions and look for a match.
$soapResponse = $EventSubscription->get_list();
if ( !$soapResponse->fault )
{
@sub_list = @{$soapResponse->result};
if ( $DEBUG ) { print "Requesting Subscritpion Details...\n"; }
$soapResponse = $EventSubscription->query
(
SOAP::Data->name(id_list => [@sub_list])
);
if ( !$soapResponse->fault )
{
@SubscriptionStatusList = @{$soapResponse->result};
@params = $soapResponse->paramsout;
@SubscriptionDefinitionList = @{@params[0]};
foreach $SubscriptionDefinition (@SubscriptionDefinitionList)
{
$id = $SubscriptionDefinition->{"id"};
$details = $SubscriptionDefinition->{"details"};
$name = $details->{"name"};
@event_type_list = @{$details->{"event_type_list"}};
$url = $details->{"url"};
$url_credentials = $details->{"url_credentials"};
$auth_mode = $url_credentials->{"auth_mode"};
$username = $url_credentials->{"username"};
$password = $url_credentials->{"password"};
$ttl = $details->{"ttl"};
$min_events_per_timeslice = $details->{"min_events_per_timeslice"};
$max_timeslice = $details->{"max_timeslice"};
$enabled_state = $details->{"enabled_state"};
if ( $DEBUG ) { print "Comparing subscription ($name, $url)...\n"; }
if ( ($name eq $LISTENER_NAME) && ($url eq "http://$LISTENER_HOST:$LISTENER_PORT") )
{
if ( $DEBUG ) { print "Found a match!!!\n"; }
$exists = 1;
break;
}
}
}
}
if ( !$exists )
{
if ( $DEBUG ) { print "Subscription doesn't exist, creating one...\n"; }
# No subscription exists, need to create one...
$name = $LISTENER_NAME;
@event_type_list =
(
"EVENTTYPE_CREATE",
"EVENTTYPE_MODIFY",
"EVENTTYPE_DELETE",
"EVENTTYPE_POOL_MEMBER"
);
$url = "http://$LISTENER_HOST:$LISTENER_PORT";
$url_credentials =
{
auth_mode => "AUTHMODE_BASIC",
username => $LISTENER_UID,
password => $LISTENER_PWD,
};
$ttl = -1;
$min_events_per_timeslice = 5;
$max_timeslice = 10;
$enabled_state = "STATE_ENABLED";
$sub_detail =
{
name => $name,
event_type_list => [@event_type_list],
url => $url,
url_credentials => $url_credentials,
ttl => $ttl,
min_events_per_timeslice => $min_events_per_timeslice,
max_timeslice => $max_timeslice,
enabled_state => $enabled_state
};
$soapResponse = $EventSubscription->create
(
SOAP::Data->name(sub_detail_list => [$sub_detail])
);
if ( !$soapResponse->fault )
{
@SubscriptionStatusList = @{$soapResponse->result};
$i = 0;
foreach $SubscriptionStatus (@SubscriptionStatusList)
{
$code = $SubscriptionStatus->{"code"};
$data = $SubscriptionStatus->{"data"};
if ( $DEBUG ) { print "Creation of Subscription $i\n"; }
if ( $DEBUG ) { print " code: $code\n"; }
if ( $DEBUG ) { print " data: $data\n"; }
$i++;
}
$exists = 1;
}
}
return $exists;
}
#------------------------------------------------------------------------------------------
# Main program logic
#------------------------------------------------------------------------------------------
if ( &setupSubscription() )
{
my $daemon = SOAP::Transport::HTTP::Daemon
-> new (LocalAddr => $LISTENER_HOST, LocalPort => $LISTENER_PORT)
-> on_action(sub {})
-> dispatch_with
(
{'urn:iControl:Management/EventNotification' => 'Management::EventNotification'}
);
print "Starting HTTP daemon listening on ", $daemon->url, "\n";
$daemon->handle;
}
1;
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"message:278038\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/codeshare/perl-twitter-proxy/278038\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"componentScriptGroups({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"message:278038\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/codeshare/perl-twitter-proxy/278038\"}}})":{"__typename":"ComponentRenderResult","html":""}},"componentScriptGroups({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewStandard\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/ThreadedReplyList\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyCallToAction\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/guides/GuideBottomNavigation\"]})":[{"__ref":"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1751558165592"}],"cachedText({\"lastModified\":\"1751558165592\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1751558165592"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"User:user:-1":{"__typename":"User","id":"user:-1","entityType":"USER","eventPath":"community:zihoc95639/user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":null,"possibleValues":["en-US","en-GB","fr-FR","de-DE","ja-JP","pt-PT","pt-BR","es-ES"]},"repliesSortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT","localValue":"DEFAULT","possibleValues":["DEFAULT","LIKES","PUBLISH_TIME","REVERSE_PUBLISH_TIME"]}},"deleted":false},"CachedAsset:pages-1751560861975":{"__typename":"CachedAsset","id":"pages-1751560861975","value":[{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"WorkstreamsPage","type":"COMMUNITY","urlPath":"/workstreams","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.Learn","type":"COMMUNITY","urlPath":"/c/how-do-i/learn","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501996000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1751560861975,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}","userBanned":"We're sorry, but you have been banned from using this site.","userBannedReason":"You have been banned for the following reason: {reason}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMzgtTzNNNGh5\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstMzgtTzNNNGh5","height":0,"width":0,"mimeType":"image/svg+xml"},"Rank:rank:38":{"__typename":"Rank","id":"rank:38","position":15,"name":"Cirrus","color":"CCCCCC","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMzgtTzNNNGh5\"}"},"rankStyle":"FILLED"},"User:user:131293":{"__typename":"User","id":"user:131293","uid":131293,"login":"CodeCentral_194","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-10.svg?time=0"},"rank":{"__ref":"Rank:rank:38"},"email":"","messagesCount":277,"biography":null,"topicsCount":277,"kudosReceivedCount":7,"kudosGivenCount":0,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-05-04T20:11:22.000-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","entityType":"CATEGORY","displayId":"CrowdSRC","nodeType":"category","depth":1,"title":"CrowdSRC","shortTitle":"CrowdSRC","parent":{"__ref":"Category:category:top"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","entityType":"CATEGORY","displayId":"top","nodeType":"category","depth":0,"title":"Top","shortTitle":"Top"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","entityType":"TKB","displayId":"codeshare","nodeType":"board","depth":2,"conversationStyle":"TKB","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"PUBLISH_TIME","repliesFormat":"threaded"},"tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":true,"tagType":"FREEFORM_AND_PRESET","description":"Have some code. Share some code.","title":"CodeShare","shortTitle":"CodeShare","parent":{"__ref":"Category:category:CrowdSRC"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:zihoc95639"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:CrowdSRC"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"theme":{"__ref":"Theme:customTheme1"},"boardPolicies":{"__typename":"BoardPolicies","canViewSpamDashBoard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.access_spam_quarantine.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.access_spam_quarantine.allowed.accessDenied","args":[]}},"canArchiveMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.content_archivals.enable_content_archival_settings.accessDenied","key":"error.lithium.policies.content_archivals.enable_content_archival_settings.accessDenied","args":[]}},"canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}},"canReadNode":{"__typename":"PolicyResult","failureReason":null}},"isManualSortOrderAvailable":false,"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"linkProperties":{"__typename":"LinkProperties","isExternalLinkWarningEnabled":false}},"TkbTopicMessage:message:278038":{"__typename":"TkbTopicMessage","uid":278038,"subject":"Perl Twitter Proxy","id":"message:278038","entityType":"TKB_ARTICLE","eventPath":"category:CrowdSRC/community:zihoc95639board:codeshare/message:278038","revisionNum":1,"repliesCount":0,"author":{"__ref":"User:user:131293"},"depth":0,"hasGivenKudo":false,"helpful":null,"board":{"__ref":"Tkb:board:codeshare"},"conversation":{"__ref":"Conversation:conversation:278038"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"showMoveIndicator":false,"moderationData":{"__ref":"ModerationData:moderation_data:278038"},"teaser":"","body":"
Problem this snippet solves:
This example is a HTTP daemon that implements the EventNotification interface to receive iControl status messages. It will then proxy that message and post it to a specified Twitter account.
\n
Who says the BIG-IP can't be social! This perl program implements a HTTP daemon running on port 8088 and listens for the iControl Management::EventNotification::changes_occurred method. There are a few settings you'll want to configure before running this program. Namely the BIGIP variables containing the BIG-IP you are connecting to, the LISTENER variables that specify where this perl module is running, and the TWITTER credentials for your Twitter account.-->
\n
To make it plain dead simple, you can just plop this directly on your BIG-IP and run it as-is with only setting the Twitter credentials. Keep in mind that installing anything on your BIG-IP could effect performance so do so at your own risk.
\n
Once you have everything setup, just run the app and you should be good to go.
\n
The subscription is only set to monitor pool members, but you could easily modify the event_type_list in the setupSubscription subroutine by adding more event types you would like to monitor.
\n
Happy Twittering!
Code :
#!/usr/bin/perl \n#---------------------------------------------------------------------------- \n# The contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5 \n# Software Development Kit for iControl\"; you may not use this file except in \n# compliance with the License. The License is included in the iControl \n# Software Development Kit.\n#\n# Software distributed under the License is distributed on an \"AS IS\"\n# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\n# the License for the specific language governing rights and limitations\n# under the License.\n#\n# The Original Code is iControl Code and related documentation\n# distributed by F5.\n#\n# The Initial Developer of the Original Code is F5 Networks,\n# Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2007 F5 Networks,\n# Inc. All Rights Reserved. iControl (TM) is a registered trademark of F5 Networks, Inc.\n#\n# Alternatively, the contents of this file may be used under the terms\n# of the GNU General Public License (the \"GPL\"), in which case the\n# provisions of GPL are applicable instead of those above. If you wish\n# to allow use of your version of this file only under the terms of the\n# GPL and not to allow others to use your version of this file under the\n# License, indicate your decision by deleting the provisions above and\n# replace them with the notice and other provisions required by the GPL.\n# If you do not delete the provisions above, a recipient may use your\n# version of this file under either the License or the GPL.\n#----------------------------------------------------------------------------\nuse SOAP::Transport::HTTP;\n\nmy $INFO = 1;\nmy $DEBUG = 1;\n\nmy $BIGIP = \"localhost\";\nmy $BIGIP_PORT = \"80\";\nmy $BIGIP_UID = \"\";\nmy $BIGIP_PWD = \"\";\n\nmy $LISTENER_NAME = \"iControlTwitterProxy\";\nmy $LISTENER_HOST = \"localhost\";\nmy $LISTENER_PORT = 8088;\nmy $LISTENER_UID = \"\";\nmy $LISTENER_PWD = \"\";\n\nmy $TWITTER_UID = \"TWITTER_ACCOUNT_GOES_HERE\";\nmy $TWITTER_PWD = \"TWITTER_PASSWORD_GOES_HERE\";\n\n\n# don't want to die on 'Broken pipe' or Ctrl-c\n$SIG{PIPE} = 'IGNORE';\n\n\n###\n### API for the SOAP server for cmd_dispatch\n###\npackage Management::EventNotification;\n\nBEGIN { push (@INC, \".\"); }\nuse iControlTypeCast;\n\n\n#------------------------------------------------------------------------------------------\n# sub events_occurred\n#------------------------------------------------------------------------------------------\nsub events_occurred {\n my ($self,$event_source,$subscription_id,$event_data_list,$time_stamp) = @_;\n if ( $DEBUG ) { print \"events_occurred() was just invoked!\\n\"; }\n\n # $event_source\n $system_id = $event_source->{\"system_id\"};\n $url = $event_source->{\"url\"};\n \n $year = $time_stamp->{\"year\"};\n $month = $time_stamp->{\"month\"};\n $day = $time_stamp->{\"day\"};\n $hour = $time_stamp->{\"hour\"};\n $minute = $time_stamp->{\"minute\"};\n $second = $time_stamp->{\"second\"};\n\n\n if ( $INFO ) { print \"Event Occurred\\n\"; }\n if ( $INFO ) { print \" System Id : $system_id\\n\"; }\n if ( $INFO ) { print \" Url : $url\\n\"; }\n if ( $INFO ) { print \"subscription id: $subscription_id\\n\"; }\n if ( $INFO ) { print \" Time Stamp : $year:$month:$day/$hour:$minute:$second\\n\"; }\n if ( $DEBUG ) { print \" Event Data List\\n\"; }\n foreach $event_data (@{$event_data_list})\n {\n processEvent($event_data);\n }\n\n}\n\n#------------------------------------------------------------------------------------------\n# sub processEvent\n#------------------------------------------------------------------------------------------\nsub processEvent()\n{\n my ($event_data) = (@_);\n\n $username = $event_data->{\"username\"};\n $sequence_number = $event_data->{\"sequence_number\"};\n $event_type = $event_data->{\"event_type\"};\n $object_type = $event_data->{\"object_type\"};\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n\n\n if ( $DEBUG ) { print \"---------------\\n\"; }\n if ( $DEBUG ) { print \" seq # : $sequence_number\\n\"; }\n if ( $DEBUG ) { print \" Event Type : $event_type\\n\"; }\n if ( $DEBUG ) { print \"Object Type : $object_type\\n\"; }\n if ( $DEBUG ) { print \"Event List\\n\"; }\n if ( $DEBUG ) { print \" ----------------\\n\"; }\n\n if ( \"OBJECTTYPE_RULE\" eq $object_type )\n {\n &processRule($event_data);\n }\n elsif ( \"OBJECTTYPE_INTERFACE\" eq $object_type )\n {\n &processInterface($event_data);\n }\n elsif ( \"OBJECTTYPE_MONITOR_INSTANCE\" eq $object_type )\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n elsif ( \"OBJECTTYPE_POOL\" eq $object_type )\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n elsif ( \"OBJECTTYPE_POOL_MEMBER\" eq $object_type )\n {\n if ( $DEBUG ) { &processPoolMember($event_data); }\n }\n elsif ( \"OBJECTTYPE_VIRTUAL_SERVER\" eq $object_type )\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n else\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n\n}\n\n#------------------------------------------------------------------------------------------\n# sub processRule\n#------------------------------------------------------------------------------------------\nsub processRule()\n{\n my ($event_data) = (@_);\n\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n $event_type = $event_data->{\"event_type\"};\n\n my $EVENTTYPE_MAP =\n {\n \"EVENTTYPE_MODIFY\" => \"MODIFIED\",\n \"EVENTTYPE_CREATE\" => \"CREATED\",\n \"EVENTTYPE_DELETE\" => \"DELETED\",\n };\n\n foreach $event_data_item (@event_data_item_list)\n {\n $event_data_name = $event_data_item->{\"event_data_name\"};\n $event_data_type = $event_data_item->{\"event_data_type\"};\n $event_data_value = $event_data_item->{\"event_data_value\"};\n if ( $DEBUG ) { print \" Item Data : $event_data_name = $event_data_value ($event_data_type)\\n\"; }\n\n if ( $event_data_name eq \"rule_name\") { $rule_name = $event_data_value; }\n }\n\n if ( \"\" ne $rule_name )\n {\n $Action = $EVENTTYPE_MAP->{$event_type};\n $tweet = \"Rule '$rule_name' has been $Action.\";\n\n &processTweet($tweet);\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processInterface\n#------------------------------------------------------------------------------------------\nsub processInterface()\n{\n my ($event_data) = (@_);\n\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n\n $event_type = $event_data->{\"event_type\"};\n\n\n my $MEDIA_STATUS_MAP =\n {\n \"0\" => \"UP\",\n \"1\" => \"DOWN\",\n \"2\" => \"DISABLED\",\n \"3\" => \"UNINITIALIZED\",\n \"4\" => \"LOOPBACK\",\n \"5\" => \"UNPOPULATED\",\n };\n\n $interface_name = \"\";\n $interface_status = \"\";\n\n foreach $event_data_item (@event_data_item_list)\n {\n $event_data_name = $event_data_item->{\"event_data_name\"};\n $event_data_type = $event_data_item->{\"event_data_type\"};\n $event_data_value = $event_data_item->{\"event_data_value\"};\n if ( $DEBUG ) { print \" Item Data : $event_data_name = $event_data_value ($event_data_type)\\n\"; }\n\n if ( $event_data_name eq \"interface_name\") { $interface_name = $event_data_value; }\n elsif ( $event_data_name eq \"interface_status\") { $interface_status = $event_data_value; }\n }\n\n if ( (\"\" ne $interface_name) && (\"\" ne $interface_status) )\n {\n $sStatus = $MEDIA_STATUS_MAP->{$interface_status};\n $tweet = \"Interface '$interface_name' status changed to $sStatus.\";\n\n &processTweet($tweet);\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processPoolMember\n#------------------------------------------------------------------------------------------\nsub processPoolMember()\n{\n my ($event_data) = (@_);\n\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n\n $pool_name = \"\";\n $member_ip = \"\";\n $member_port = \"\";\n $new_sessions = \"\";\n $availability = \"\";\n $enabled = \"\";\n $monitor_status = \"\";\n $session_status = \"\";\n\n foreach $event_data_item (@event_data_item_list)\n {\n $event_data_name = $event_data_item->{\"event_data_name\"};\n $event_data_type = $event_data_item->{\"event_data_type\"};\n $event_data_value = $event_data_item->{\"event_data_value\"};\n if ( $DEBUG ) { print \" Item Data : $event_data_name = $event_data_value ($event_data_type)\\n\"; }\n\n if ( $event_data_name eq \"pool_member_pool_name\") { $pool_name = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_addr\") { $member_ip = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_port\") { $member_port = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_new_session_enable\") { $new_sessions = $event_data_value; }\n\n elsif ( $event_data_name eq \"generic_status_availability_state\") { $availability = $event_data_value; }\n elsif ( $event_data_name eq \"generic_status_enabled_state\") { $enabled = $event_data_value; }\n elsif ( $event_data_name eq \"generic_status_enabled_state\") { $enabled = $event_data_value; }\n\n elsif ( $event_data_name eq \"pool_member_monitor_status\") { $monitor_status = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_session_status\") { $session_status = $event_data_value; }\n }\n\n\n if ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $new_sessions) and (\"\" ne $availability) and (\"\" ne $enabled) )\n {\n &processMemberChange($pool_name, $member_ip, $member_port, $new_sessions, $availability, $enabled);\n }\n elsif ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $monitor_status) )\n {\n &processMonitorChange($pool_name, $member_ip, $member_port, $monitor_status, $session_status);\n }\n else\n {\n if ( $DEBUG ) { print \"Unqualifying event notification\\n\"; } \n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processMemberChange\n#------------------------------------------------------------------------------------------\nsub processMemberChange()\n{\n my ($pool_name, $member_ip, $member_port, $new_sessions, $availability, $enabled) = (@_);\n\n if ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $new_sessions) and (\"\" ne $availability) and (\"\" ne $enabled) )\n {\n if ( $DEBUG ) { print \"Processing Member Change Tweet:\\n\"; }\n if ( $DEBUG ) { print \" Pool Name: $pool_name\\n\"; }\n if ( $DEBUG ) { print \" Member : $member_addr:$member_port\\n\"; }\n if ( $DEBUG ) { print \" New Sess : $new_sessions\\n\"; }\n if ( $DEBUG ) { print \" Avail : $availability\\n\"; }\n if ( $DEBUG ) { print \" Enabled : $enabled\\n\"; }\n \n $sEnabled = \"UNKNOWN\";\n $sAvailable = \"ERROR\";\n\n $ENABLED_MAP = \n {\n \"1\" => \"UP\",\n \"2\" => \"DOWN\"\n };\n $sEnabled = $ENABLED_MAP->{$enabled};\n if ( \"\" eq $sEnabled ) { $sEnabled = \"UNKNOWN\"; }\n\n# if ( $enabled eq \"1\") { $sEnabled = \"UP\"; }\n# elsif ( $enabled eq \"2\") { $sEnabled = \"DOWN\"; }\n# else { $sEnabled = \"UNKNOWN\"; }\n\n $AVAILABILITY_MAP =\n {\n \"0\" => \"ERROR\",\n \"1\" => \"ACTIVE\",\n \"2\" => \"INACTIVE\",\n \"3\" => \"INACTIVE (Needs Intervention)\",\n \"4\" => \"INACTIVE (Unknown)\",\n \"5\" => \"INACTIVE (Unlicensed)\",\n };\n\n $sAvailable = $AVAILABILITY_MAP->{$availability};\n if ( \"\" eq $sAvailable ) { $sAvailable = \"ERROR\"; }\n\n# if ( $availability eq \"0\") { $sAvailable = \"ERROR\"; }\n# elsif ( $availability eq \"1\") { $sAvailable = \"ACTIVE\"; }\n# elsif ( $availability eq \"2\") { $sAvailable = \"INACTIVE\"; }\n# elsif ( $availability eq \"3\") { $sAvailable = \"INACTIVE (Needs Intervention)\"; }\n# elsif ( $availability eq \"4\") { $sAvailable = \"INACTIVE (Unknown)\"; }\n# elsif ( $availability eq \"5\") { $sAvailable = \"INACTIVE (Unlicensed)\"; }\n# else { $sAvailable = \"ERROR\"; }\n\n if ( (\"UP\" eq $sEnabled) and (\"ACTIVE\" eq $sAvailable) )\n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name seems to have recovered and is ready to rock!\";\n }\n else\n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name seems to be having problems. It is marked '$sEnabled' with a '$sAvailable' state.\"\n }\n\n &processTweet($tweet);\n\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processMonitorChange\n#------------------------------------------------------------------------------------------\nsub processMonitorChange()\n{\n my ($pool_name, $member_ip, $member_port, $monitor_state, $session_status) = (@_);\n\n if ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $monitor_state) )\n {\n if ( $DEBUG ) { print \"Processing Monitor Change Tweet:\\n\"; }\n if ( $DEBUG ) { print \" Pool Name: $pool_name\\n\"; }\n if ( $DEBUG ) { print \" Member : $member_addr:$member_port\\n\"; }\n if ( $DEBUG ) { print \" Mon State: $monitor_state\\n\"; }\n\n $MONITOR_STATE_MAP =\n {\n \"0\" => \"UNCHECKED\",\n \"1\" => \"CHECKING\",\n \"2\" => \"UP\",\n \"3\" => \"DOWN\",\n \"4\" => \"FORCED DOWN\",\n \"5\" => \"MAINT\",\n \"6\" => \"ADDRESS DOWN\",\n \"7\" => \"DOWN BY IRULE\",\n \"8\" => \"MARKED DOWN\",\n };\n\n $SESSION_STATUS_MAP = \n {\n \"0\" => \"ENABLED\",\n \"1\" => \"DISABLED\",\n \"2\" => \"FORCED DISABLED\",\n \"3\" => \"ADDRESS DISABLED\",\n };\n\n $sState = $MONITOR_STATE_MAP->{$monitor_state};\n $sSessionStatus = $SESSION_STATUS_MAP->{$session_status}; \n\n if ( (\"UP\" eq $sState) and (\"ENABLED\" eq $sSessionStatus) ) \n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name seems to have recovered and is ready to rock!\";\n }\n else\n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name is down. Monitor is reporting a monitor/session state = '$sState/$sSessionStatus'\";\n }\n &processTweet($tweet);\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processTweet\n#------------------------------------------------------------------------------------------\nsub processTweet()\n{\n my ($tweet) = (@_);\n\n # call curl to submit POST to twitter\n $cmd = \"curl --data-ascii \\\"status=$tweet\\\" --user $TWITTER_UID:$TWITTER_PWD http://twitter.com:80/statuses/update.xml\";\n\n if ( $DEBUG ) { print \"$cmd\\n\"; }\n system($cmd);\n}\n\n#------------------------------------------------------------------------------------------\n# sub SOAP::Transport::HTTP::Client::get_basic_credentials\n#------------------------------------------------------------------------------------------\nsub SOAP::Transport::HTTP::Client::get_basic_credentials\n{\n return \"$BIGIP_UID\" => \"$BIGIP_PWD\";\n}\n\n#------------------------------------------------------------------------------------------\n# sub setupSubscription\n#------------------------------------------------------------------------------------------\nsub setupSubscription()\n{\n my $exists = 0;\n\n my $sProtocol = \"http\";\n if ( $BIGIP_PORT eq 443 ) { $sProtocol = \"https\"; }\n\n $EventSubscription = SOAP::Lite\n -> uri('urn:iControl:Management/EventSubscription')\n -> proxy(\"$sProtocol://$BIGIP:$BIGIP_PORT/iControl/iControlPortal.cgi\");\n eval { $EventSubscription->transport->http_request->header\n (\n 'Authorization' => \n 'Basic ' . MIME::Base64::encode(\"$BIGIP_UID:$BIGIP_PWD\", '')\n ); };\n\n if ( $DEBUG ) { print \"Requesting Subscription List...\\n\"; }\n\n # Get a list of the subscriptions and look for a match.\n $soapResponse = $EventSubscription->get_list();\n if ( !$soapResponse->fault )\n {\n @sub_list = @{$soapResponse->result};\n \n if ( $DEBUG ) { print \"Requesting Subscritpion Details...\\n\"; }\n $soapResponse = $EventSubscription->query\n (\n SOAP::Data->name(id_list => [@sub_list])\n );\n if ( !$soapResponse->fault )\n {\n @SubscriptionStatusList = @{$soapResponse->result};\n @params = $soapResponse->paramsout;\n @SubscriptionDefinitionList = @{@params[0]};\n\n foreach $SubscriptionDefinition (@SubscriptionDefinitionList)\n {\n $id = $SubscriptionDefinition->{\"id\"};\n \n $details = $SubscriptionDefinition->{\"details\"};\n $name = $details->{\"name\"};\n @event_type_list = @{$details->{\"event_type_list\"}};\n $url = $details->{\"url\"};\n \n $url_credentials = $details->{\"url_credentials\"};\n $auth_mode = $url_credentials->{\"auth_mode\"};\n $username = $url_credentials->{\"username\"};\n $password = $url_credentials->{\"password\"};\n \n $ttl = $details->{\"ttl\"};\n $min_events_per_timeslice = $details->{\"min_events_per_timeslice\"};\n $max_timeslice = $details->{\"max_timeslice\"};\n $enabled_state = $details->{\"enabled_state\"};\n\n if ( $DEBUG ) { print \"Comparing subscription ($name, $url)...\\n\"; }\n if ( ($name eq $LISTENER_NAME) && ($url eq \"http://$LISTENER_HOST:$LISTENER_PORT\") )\n {\n if ( $DEBUG ) { print \"Found a match!!!\\n\"; }\n $exists = 1;\n break;\n }\n }\n }\n }\n\n if ( !$exists )\n {\n if ( $DEBUG ) { print \"Subscription doesn't exist, creating one...\\n\"; }\n # No subscription exists, need to create one...\n $name = $LISTENER_NAME;\n\n @event_type_list =\n (\n \"EVENTTYPE_CREATE\",\n \"EVENTTYPE_MODIFY\",\n \"EVENTTYPE_DELETE\",\n \"EVENTTYPE_POOL_MEMBER\"\n );\n\n $url = \"http://$LISTENER_HOST:$LISTENER_PORT\";\n $url_credentials =\n {\n auth_mode => \"AUTHMODE_BASIC\",\n username => $LISTENER_UID,\n password => $LISTENER_PWD,\n };\n $ttl = -1;\n $min_events_per_timeslice = 5;\n $max_timeslice = 10;\n $enabled_state = \"STATE_ENABLED\";\n\n $sub_detail =\n {\n name => $name,\n event_type_list => [@event_type_list],\n url => $url,\n url_credentials => $url_credentials,\n ttl => $ttl,\n min_events_per_timeslice => $min_events_per_timeslice,\n max_timeslice => $max_timeslice,\n enabled_state => $enabled_state\n };\n\n $soapResponse = $EventSubscription->create\n (\n SOAP::Data->name(sub_detail_list => [$sub_detail])\n );\n if ( !$soapResponse->fault )\n {\n @SubscriptionStatusList = @{$soapResponse->result};\n $i = 0;\n foreach $SubscriptionStatus (@SubscriptionStatusList)\n {\n $code = $SubscriptionStatus->{\"code\"};\n $data = $SubscriptionStatus->{\"data\"};\n \n if ( $DEBUG ) { print \"Creation of Subscription $i\\n\"; }\n if ( $DEBUG ) { print \" code: $code\\n\"; }\n if ( $DEBUG ) { print \" data: $data\\n\"; }\n $i++;\n }\n\n $exists = 1;\n }\n } \n return $exists;\n}\n\n#------------------------------------------------------------------------------------------\n# Main program logic\n#------------------------------------------------------------------------------------------\nif ( &setupSubscription() )\n{\n my $daemon = SOAP::Transport::HTTP::Daemon\n -> new (LocalAddr => $LISTENER_HOST, LocalPort => $LISTENER_PORT)\n -> on_action(sub {})\n -> dispatch_with\n (\n {'urn:iControl:Management/EventNotification' => 'Management::EventNotification'}\n );\n\n\n\n print \"Starting HTTP daemon listening on \", $daemon->url, \"\\n\";\n $daemon->handle;\n}\n\n1;
","body@stringLength":"20903","rawBody":"
Problem this snippet solves:
This example is a HTTP daemon that implements the EventNotification interface to receive iControl status messages. It will then proxy that message and post it to a specified Twitter account.
\n
Who says the BIG-IP can't be social! This perl program implements a HTTP daemon running on port 8088 and listens for the iControl Management::EventNotification::changes_occurred method. There are a few settings you'll want to configure before running this program. Namely the BIGIP variables containing the BIG-IP you are connecting to, the LISTENER variables that specify where this perl module is running, and the TWITTER credentials for your Twitter account.-->
\n
To make it plain dead simple, you can just plop this directly on your BIG-IP and run it as-is with only setting the Twitter credentials. Keep in mind that installing anything on your BIG-IP could effect performance so do so at your own risk.
\n
Once you have everything setup, just run the app and you should be good to go.
\n
The subscription is only set to monitor pool members, but you could easily modify the event_type_list in the setupSubscription subroutine by adding more event types you would like to monitor.
\n
Happy Twittering!
Code :
#!/usr/bin/perl \n#---------------------------------------------------------------------------- \n# The contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5 \n# Software Development Kit for iControl\"; you may not use this file except in \n# compliance with the License. The License is included in the iControl \n# Software Development Kit.\n#\n# Software distributed under the License is distributed on an \"AS IS\"\n# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\n# the License for the specific language governing rights and limitations\n# under the License.\n#\n# The Original Code is iControl Code and related documentation\n# distributed by F5.\n#\n# The Initial Developer of the Original Code is F5 Networks,\n# Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2007 F5 Networks,\n# Inc. All Rights Reserved. iControl (TM) is a registered trademark of F5 Networks, Inc.\n#\n# Alternatively, the contents of this file may be used under the terms\n# of the GNU General Public License (the \"GPL\"), in which case the\n# provisions of GPL are applicable instead of those above. If you wish\n# to allow use of your version of this file only under the terms of the\n# GPL and not to allow others to use your version of this file under the\n# License, indicate your decision by deleting the provisions above and\n# replace them with the notice and other provisions required by the GPL.\n# If you do not delete the provisions above, a recipient may use your\n# version of this file under either the License or the GPL.\n#----------------------------------------------------------------------------\nuse SOAP::Transport::HTTP;\n\nmy $INFO = 1;\nmy $DEBUG = 1;\n\nmy $BIGIP = \"localhost\";\nmy $BIGIP_PORT = \"80\";\nmy $BIGIP_UID = \"\";\nmy $BIGIP_PWD = \"\";\n\nmy $LISTENER_NAME = \"iControlTwitterProxy\";\nmy $LISTENER_HOST = \"localhost\";\nmy $LISTENER_PORT = 8088;\nmy $LISTENER_UID = \"\";\nmy $LISTENER_PWD = \"\";\n\nmy $TWITTER_UID = \"TWITTER_ACCOUNT_GOES_HERE\";\nmy $TWITTER_PWD = \"TWITTER_PASSWORD_GOES_HERE\";\n\n\n# don't want to die on 'Broken pipe' or Ctrl-c\n$SIG{PIPE} = 'IGNORE';\n\n\n###\n### API for the SOAP server for cmd_dispatch\n###\npackage Management::EventNotification;\n\nBEGIN { push (@INC, \".\"); }\nuse iControlTypeCast;\n\n\n#------------------------------------------------------------------------------------------\n# sub events_occurred\n#------------------------------------------------------------------------------------------\nsub events_occurred {\n my ($self,$event_source,$subscription_id,$event_data_list,$time_stamp) = @_;\n if ( $DEBUG ) { print \"events_occurred() was just invoked!\\n\"; }\n\n # $event_source\n $system_id = $event_source->{\"system_id\"};\n $url = $event_source->{\"url\"};\n \n $year = $time_stamp->{\"year\"};\n $month = $time_stamp->{\"month\"};\n $day = $time_stamp->{\"day\"};\n $hour = $time_stamp->{\"hour\"};\n $minute = $time_stamp->{\"minute\"};\n $second = $time_stamp->{\"second\"};\n\n\n if ( $INFO ) { print \"Event Occurred\\n\"; }\n if ( $INFO ) { print \" System Id : $system_id\\n\"; }\n if ( $INFO ) { print \" Url : $url\\n\"; }\n if ( $INFO ) { print \"subscription id: $subscription_id\\n\"; }\n if ( $INFO ) { print \" Time Stamp : $year:$month:$day/$hour:$minute:$second\\n\"; }\n if ( $DEBUG ) { print \" Event Data List\\n\"; }\n foreach $event_data (@{$event_data_list})\n {\n processEvent($event_data);\n }\n\n}\n\n#------------------------------------------------------------------------------------------\n# sub processEvent\n#------------------------------------------------------------------------------------------\nsub processEvent()\n{\n my ($event_data) = (@_);\n\n $username = $event_data->{\"username\"};\n $sequence_number = $event_data->{\"sequence_number\"};\n $event_type = $event_data->{\"event_type\"};\n $object_type = $event_data->{\"object_type\"};\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n\n\n if ( $DEBUG ) { print \"---------------\\n\"; }\n if ( $DEBUG ) { print \" seq # : $sequence_number\\n\"; }\n if ( $DEBUG ) { print \" Event Type : $event_type\\n\"; }\n if ( $DEBUG ) { print \"Object Type : $object_type\\n\"; }\n if ( $DEBUG ) { print \"Event List\\n\"; }\n if ( $DEBUG ) { print \" ----------------\\n\"; }\n\n if ( \"OBJECTTYPE_RULE\" eq $object_type )\n {\n &processRule($event_data);\n }\n elsif ( \"OBJECTTYPE_INTERFACE\" eq $object_type )\n {\n &processInterface($event_data);\n }\n elsif ( \"OBJECTTYPE_MONITOR_INSTANCE\" eq $object_type )\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n elsif ( \"OBJECTTYPE_POOL\" eq $object_type )\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n elsif ( \"OBJECTTYPE_POOL_MEMBER\" eq $object_type )\n {\n if ( $DEBUG ) { &processPoolMember($event_data); }\n }\n elsif ( \"OBJECTTYPE_VIRTUAL_SERVER\" eq $object_type )\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n else\n {\n if ( $DEBUG ) { print \"Ignoring object type '$object_type'\\n\"; }\n }\n\n}\n\n#------------------------------------------------------------------------------------------\n# sub processRule\n#------------------------------------------------------------------------------------------\nsub processRule()\n{\n my ($event_data) = (@_);\n\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n $event_type = $event_data->{\"event_type\"};\n\n my $EVENTTYPE_MAP =\n {\n \"EVENTTYPE_MODIFY\" => \"MODIFIED\",\n \"EVENTTYPE_CREATE\" => \"CREATED\",\n \"EVENTTYPE_DELETE\" => \"DELETED\",\n };\n\n foreach $event_data_item (@event_data_item_list)\n {\n $event_data_name = $event_data_item->{\"event_data_name\"};\n $event_data_type = $event_data_item->{\"event_data_type\"};\n $event_data_value = $event_data_item->{\"event_data_value\"};\n if ( $DEBUG ) { print \" Item Data : $event_data_name = $event_data_value ($event_data_type)\\n\"; }\n\n if ( $event_data_name eq \"rule_name\") { $rule_name = $event_data_value; }\n }\n\n if ( \"\" ne $rule_name )\n {\n $Action = $EVENTTYPE_MAP->{$event_type};\n $tweet = \"Rule '$rule_name' has been $Action.\";\n\n &processTweet($tweet);\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processInterface\n#------------------------------------------------------------------------------------------\nsub processInterface()\n{\n my ($event_data) = (@_);\n\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n\n $event_type = $event_data->{\"event_type\"};\n\n\n my $MEDIA_STATUS_MAP =\n {\n \"0\" => \"UP\",\n \"1\" => \"DOWN\",\n \"2\" => \"DISABLED\",\n \"3\" => \"UNINITIALIZED\",\n \"4\" => \"LOOPBACK\",\n \"5\" => \"UNPOPULATED\",\n };\n\n $interface_name = \"\";\n $interface_status = \"\";\n\n foreach $event_data_item (@event_data_item_list)\n {\n $event_data_name = $event_data_item->{\"event_data_name\"};\n $event_data_type = $event_data_item->{\"event_data_type\"};\n $event_data_value = $event_data_item->{\"event_data_value\"};\n if ( $DEBUG ) { print \" Item Data : $event_data_name = $event_data_value ($event_data_type)\\n\"; }\n\n if ( $event_data_name eq \"interface_name\") { $interface_name = $event_data_value; }\n elsif ( $event_data_name eq \"interface_status\") { $interface_status = $event_data_value; }\n }\n\n if ( (\"\" ne $interface_name) && (\"\" ne $interface_status) )\n {\n $sStatus = $MEDIA_STATUS_MAP->{$interface_status};\n $tweet = \"Interface '$interface_name' status changed to $sStatus.\";\n\n &processTweet($tweet);\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processPoolMember\n#------------------------------------------------------------------------------------------\nsub processPoolMember()\n{\n my ($event_data) = (@_);\n\n @event_data_item_list = @{$event_data->{\"event_data_item_list\"}};\n\n $pool_name = \"\";\n $member_ip = \"\";\n $member_port = \"\";\n $new_sessions = \"\";\n $availability = \"\";\n $enabled = \"\";\n $monitor_status = \"\";\n $session_status = \"\";\n\n foreach $event_data_item (@event_data_item_list)\n {\n $event_data_name = $event_data_item->{\"event_data_name\"};\n $event_data_type = $event_data_item->{\"event_data_type\"};\n $event_data_value = $event_data_item->{\"event_data_value\"};\n if ( $DEBUG ) { print \" Item Data : $event_data_name = $event_data_value ($event_data_type)\\n\"; }\n\n if ( $event_data_name eq \"pool_member_pool_name\") { $pool_name = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_addr\") { $member_ip = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_port\") { $member_port = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_new_session_enable\") { $new_sessions = $event_data_value; }\n\n elsif ( $event_data_name eq \"generic_status_availability_state\") { $availability = $event_data_value; }\n elsif ( $event_data_name eq \"generic_status_enabled_state\") { $enabled = $event_data_value; }\n elsif ( $event_data_name eq \"generic_status_enabled_state\") { $enabled = $event_data_value; }\n\n elsif ( $event_data_name eq \"pool_member_monitor_status\") { $monitor_status = $event_data_value; }\n elsif ( $event_data_name eq \"pool_member_session_status\") { $session_status = $event_data_value; }\n }\n\n\n if ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $new_sessions) and (\"\" ne $availability) and (\"\" ne $enabled) )\n {\n &processMemberChange($pool_name, $member_ip, $member_port, $new_sessions, $availability, $enabled);\n }\n elsif ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $monitor_status) )\n {\n &processMonitorChange($pool_name, $member_ip, $member_port, $monitor_status, $session_status);\n }\n else\n {\n if ( $DEBUG ) { print \"Unqualifying event notification\\n\"; } \n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processMemberChange\n#------------------------------------------------------------------------------------------\nsub processMemberChange()\n{\n my ($pool_name, $member_ip, $member_port, $new_sessions, $availability, $enabled) = (@_);\n\n if ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $new_sessions) and (\"\" ne $availability) and (\"\" ne $enabled) )\n {\n if ( $DEBUG ) { print \"Processing Member Change Tweet:\\n\"; }\n if ( $DEBUG ) { print \" Pool Name: $pool_name\\n\"; }\n if ( $DEBUG ) { print \" Member : $member_addr:$member_port\\n\"; }\n if ( $DEBUG ) { print \" New Sess : $new_sessions\\n\"; }\n if ( $DEBUG ) { print \" Avail : $availability\\n\"; }\n if ( $DEBUG ) { print \" Enabled : $enabled\\n\"; }\n \n $sEnabled = \"UNKNOWN\";\n $sAvailable = \"ERROR\";\n\n $ENABLED_MAP = \n {\n \"1\" => \"UP\",\n \"2\" => \"DOWN\"\n };\n $sEnabled = $ENABLED_MAP->{$enabled};\n if ( \"\" eq $sEnabled ) { $sEnabled = \"UNKNOWN\"; }\n\n# if ( $enabled eq \"1\") { $sEnabled = \"UP\"; }\n# elsif ( $enabled eq \"2\") { $sEnabled = \"DOWN\"; }\n# else { $sEnabled = \"UNKNOWN\"; }\n\n $AVAILABILITY_MAP =\n {\n \"0\" => \"ERROR\",\n \"1\" => \"ACTIVE\",\n \"2\" => \"INACTIVE\",\n \"3\" => \"INACTIVE (Needs Intervention)\",\n \"4\" => \"INACTIVE (Unknown)\",\n \"5\" => \"INACTIVE (Unlicensed)\",\n };\n\n $sAvailable = $AVAILABILITY_MAP->{$availability};\n if ( \"\" eq $sAvailable ) { $sAvailable = \"ERROR\"; }\n\n# if ( $availability eq \"0\") { $sAvailable = \"ERROR\"; }\n# elsif ( $availability eq \"1\") { $sAvailable = \"ACTIVE\"; }\n# elsif ( $availability eq \"2\") { $sAvailable = \"INACTIVE\"; }\n# elsif ( $availability eq \"3\") { $sAvailable = \"INACTIVE (Needs Intervention)\"; }\n# elsif ( $availability eq \"4\") { $sAvailable = \"INACTIVE (Unknown)\"; }\n# elsif ( $availability eq \"5\") { $sAvailable = \"INACTIVE (Unlicensed)\"; }\n# else { $sAvailable = \"ERROR\"; }\n\n if ( (\"UP\" eq $sEnabled) and (\"ACTIVE\" eq $sAvailable) )\n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name seems to have recovered and is ready to rock!\";\n }\n else\n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name seems to be having problems. It is marked '$sEnabled' with a '$sAvailable' state.\"\n }\n\n &processTweet($tweet);\n\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processMonitorChange\n#------------------------------------------------------------------------------------------\nsub processMonitorChange()\n{\n my ($pool_name, $member_ip, $member_port, $monitor_state, $session_status) = (@_);\n\n if ( (\"\" ne $pool_name) and (\"\" ne $member_ip) and (\"\" ne $member_port) and\n (\"\" ne $monitor_state) )\n {\n if ( $DEBUG ) { print \"Processing Monitor Change Tweet:\\n\"; }\n if ( $DEBUG ) { print \" Pool Name: $pool_name\\n\"; }\n if ( $DEBUG ) { print \" Member : $member_addr:$member_port\\n\"; }\n if ( $DEBUG ) { print \" Mon State: $monitor_state\\n\"; }\n\n $MONITOR_STATE_MAP =\n {\n \"0\" => \"UNCHECKED\",\n \"1\" => \"CHECKING\",\n \"2\" => \"UP\",\n \"3\" => \"DOWN\",\n \"4\" => \"FORCED DOWN\",\n \"5\" => \"MAINT\",\n \"6\" => \"ADDRESS DOWN\",\n \"7\" => \"DOWN BY IRULE\",\n \"8\" => \"MARKED DOWN\",\n };\n\n $SESSION_STATUS_MAP = \n {\n \"0\" => \"ENABLED\",\n \"1\" => \"DISABLED\",\n \"2\" => \"FORCED DISABLED\",\n \"3\" => \"ADDRESS DISABLED\",\n };\n\n $sState = $MONITOR_STATE_MAP->{$monitor_state};\n $sSessionStatus = $SESSION_STATUS_MAP->{$session_status}; \n\n if ( (\"UP\" eq $sState) and (\"ENABLED\" eq $sSessionStatus) ) \n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name seems to have recovered and is ready to rock!\";\n }\n else\n {\n $tweet = \"Member $member_ip:$member_port in pool $pool_name is down. Monitor is reporting a monitor/session state = '$sState/$sSessionStatus'\";\n }\n &processTweet($tweet);\n }\n}\n\n#------------------------------------------------------------------------------------------\n# sub processTweet\n#------------------------------------------------------------------------------------------\nsub processTweet()\n{\n my ($tweet) = (@_);\n\n # call curl to submit POST to twitter\n $cmd = \"curl --data-ascii \\\"status=$tweet\\\" --user $TWITTER_UID:$TWITTER_PWD http://twitter.com:80/statuses/update.xml\";\n\n if ( $DEBUG ) { print \"$cmd\\n\"; }\n system($cmd);\n}\n\n#------------------------------------------------------------------------------------------\n# sub SOAP::Transport::HTTP::Client::get_basic_credentials\n#------------------------------------------------------------------------------------------\nsub SOAP::Transport::HTTP::Client::get_basic_credentials\n{\n return \"$BIGIP_UID\" => \"$BIGIP_PWD\";\n}\n\n#------------------------------------------------------------------------------------------\n# sub setupSubscription\n#------------------------------------------------------------------------------------------\nsub setupSubscription()\n{\n my $exists = 0;\n\n my $sProtocol = \"http\";\n if ( $BIGIP_PORT eq 443 ) { $sProtocol = \"https\"; }\n\n $EventSubscription = SOAP::Lite\n -> uri('urn:iControl:Management/EventSubscription')\n -> proxy(\"$sProtocol://$BIGIP:$BIGIP_PORT/iControl/iControlPortal.cgi\");\n eval { $EventSubscription->transport->http_request->header\n (\n 'Authorization' => \n 'Basic ' . MIME::Base64::encode(\"$BIGIP_UID:$BIGIP_PWD\", '')\n ); };\n\n if ( $DEBUG ) { print \"Requesting Subscription List...\\n\"; }\n\n # Get a list of the subscriptions and look for a match.\n $soapResponse = $EventSubscription->get_list();\n if ( !$soapResponse->fault )\n {\n @sub_list = @{$soapResponse->result};\n \n if ( $DEBUG ) { print \"Requesting Subscritpion Details...\\n\"; }\n $soapResponse = $EventSubscription->query\n (\n SOAP::Data->name(id_list => [@sub_list])\n );\n if ( !$soapResponse->fault )\n {\n @SubscriptionStatusList = @{$soapResponse->result};\n @params = $soapResponse->paramsout;\n @SubscriptionDefinitionList = @{@params[0]};\n\n foreach $SubscriptionDefinition (@SubscriptionDefinitionList)\n {\n $id = $SubscriptionDefinition->{\"id\"};\n \n $details = $SubscriptionDefinition->{\"details\"};\n $name = $details->{\"name\"};\n @event_type_list = @{$details->{\"event_type_list\"}};\n $url = $details->{\"url\"};\n \n $url_credentials = $details->{\"url_credentials\"};\n $auth_mode = $url_credentials->{\"auth_mode\"};\n $username = $url_credentials->{\"username\"};\n $password = $url_credentials->{\"password\"};\n \n $ttl = $details->{\"ttl\"};\n $min_events_per_timeslice = $details->{\"min_events_per_timeslice\"};\n $max_timeslice = $details->{\"max_timeslice\"};\n $enabled_state = $details->{\"enabled_state\"};\n\n if ( $DEBUG ) { print \"Comparing subscription ($name, $url)...\\n\"; }\n if ( ($name eq $LISTENER_NAME) && ($url eq \"http://$LISTENER_HOST:$LISTENER_PORT\") )\n {\n if ( $DEBUG ) { print \"Found a match!!!\\n\"; }\n $exists = 1;\n break;\n }\n }\n }\n }\n\n if ( !$exists )\n {\n if ( $DEBUG ) { print \"Subscription doesn't exist, creating one...\\n\"; }\n # No subscription exists, need to create one...\n $name = $LISTENER_NAME;\n\n @event_type_list =\n (\n \"EVENTTYPE_CREATE\",\n \"EVENTTYPE_MODIFY\",\n \"EVENTTYPE_DELETE\",\n \"EVENTTYPE_POOL_MEMBER\"\n );\n\n $url = \"http://$LISTENER_HOST:$LISTENER_PORT\";\n $url_credentials =\n {\n auth_mode => \"AUTHMODE_BASIC\",\n username => $LISTENER_UID,\n password => $LISTENER_PWD,\n };\n $ttl = -1;\n $min_events_per_timeslice = 5;\n $max_timeslice = 10;\n $enabled_state = \"STATE_ENABLED\";\n\n $sub_detail =\n {\n name => $name,\n event_type_list => [@event_type_list],\n url => $url,\n url_credentials => $url_credentials,\n ttl => $ttl,\n min_events_per_timeslice => $min_events_per_timeslice,\n max_timeslice => $max_timeslice,\n enabled_state => $enabled_state\n };\n\n $soapResponse = $EventSubscription->create\n (\n SOAP::Data->name(sub_detail_list => [$sub_detail])\n );\n if ( !$soapResponse->fault )\n {\n @SubscriptionStatusList = @{$soapResponse->result};\n $i = 0;\n foreach $SubscriptionStatus (@SubscriptionStatusList)\n {\n $code = $SubscriptionStatus->{\"code\"};\n $data = $SubscriptionStatus->{\"data\"};\n \n if ( $DEBUG ) { print \"Creation of Subscription $i\\n\"; }\n if ( $DEBUG ) { print \" code: $code\\n\"; }\n if ( $DEBUG ) { print \" data: $data\\n\"; }\n $i++;\n }\n\n $exists = 1;\n }\n } \n return $exists;\n}\n\n#------------------------------------------------------------------------------------------\n# Main program logic\n#------------------------------------------------------------------------------------------\nif ( &setupSubscription() )\n{\n my $daemon = SOAP::Transport::HTTP::Daemon\n -> new (LocalAddr => $LISTENER_HOST, LocalPort => $LISTENER_PORT)\n -> on_action(sub {})\n -> dispatch_with\n (\n {'urn:iControl:Management/EventNotification' => 'Management::EventNotification'}\n );\n\n\n\n print \"Starting HTTP daemon listening on \", $daemon->url, \"\\n\";\n $daemon->handle;\n}\n\n1;
","kudosSumWeight":0,"postTime":"2015-03-09T11:11:52.000-07:00","images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjUuNHwyLjF8b3wxMHxfTlZffDE","node":{"__typename":"Tag","id":"tag:devops","text":"devops","time":"2011-10-19T17:50:55.000-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuNHwyLjF8b3wxMHxfTlZffDI","node":{"__typename":"Tag","id":"tag:iControl","text":"iControl","time":"2022-01-24T02:29:45.068-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuNHwyLjF8b3wxMHxfTlZffDM","node":{"__typename":"Tag","id":"tag:perl","text":"perl","time":"2022-01-24T02:31:41.712-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":10,"rawTeaser":"","introduction":"","currentRevision":{"__ref":"Revision:revision:278038_1"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":268},"read":false,"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":null,"seoDescription":null,"placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[{"__typename":"UserEdge","node":{"__ref":"User:user:131293"}}]},"tkbMessagePolicies":{"__typename":"TkbMessagePolicies","canDoAuthoringActionsOnTkb":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","key":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}}})":{"__typename":"RevisionConnection","totalCount":1}},"Conversation:conversation:278038":{"__typename":"Conversation","id":"conversation:278038","solved":false,"topic":{"__ref":"TkbTopicMessage:message:278038"},"lastPostingActivityTime":"2015-03-09T11:11:52.000-07:00","lastPostTime":"2015-03-09T11:11:52.000-07:00","unreadReplyCount":0,"isSubscribed":false},"ModerationData:moderation_data:278038":{"__typename":"ModerationData","id":"moderation_data:278038","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"Revision:revision:278038_1":{"__typename":"Revision","id":"revision:278038_1","lastEditTime":"2015-03-09T11:11:52.000-07:00"},"CachedAsset:theme:customTheme1-1751558166483":{"__typename":"CachedAsset","id":"theme:customTheme1-1751558166483","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"android-chrome-512x512-1748534255255.png","imageLastModified":"1748534256856","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"F5-devCentral-HR-color-reverse-1750868999153.png","imageLastModified":"1750869001512","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"fluid","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"500","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"#0072B0","primaryBgHoverColor":"hsl(201.10000000000002, 100%, 29.3%)","primaryBgActiveColor":"hsl(201.10000000000002, 100%, 24.2%)","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px #0072B0, 0 0 0 4px rgba(0, 114, 176, 0.2)","secondaryTextColor":"var(--lia-bs-white)","secondaryTextHoverColor":"var(--lia-bs-white)","secondaryTextActiveColor":"var(--lia-bs-white)","secondaryBgColor":"#0072B0","secondaryBgHoverColor":"hsl(201.10000000000002, 100%, 29.3%)","secondaryBgActiveColor":"hsl(201.10000000000002, 100%, 24.2%)","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px #0072B0, 0 0 0 4px rgba(0, 114, 176, 0.2)","tertiaryTextColor":"#0072B0","tertiaryTextHoverColor":"hsl(201.10000000000002, 100%, 32.8%)","tertiaryTextActiveColor":"hsl(201.10000000000002, 100%, 31.1%)","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"rgba(0, 114, 176, 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid rgba(0, 114, 176, 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px #0072B0, 0 0 0 4px rgba(0, 114, 176, 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px #0072B0, 0 0 0 4px rgba(0, 114, 176, 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"DARK","sideContent":"DARK","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"500","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0072B0","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36","#B2D7EB","#66AFD7","#007ABC","#343434","#0E6EB9","#0072B0"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Neusa Next Pro Wide Bold","fontStyle":"NORMAL","fontWeight":"700","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.1","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","tableBgColor":"transparent","tableBorderColor":"var(--lia-bs-gray-700)","tableBorderStyle":"solid","tableCellPaddingX":"5px","tableCellPaddingY":"5px","tableTextColor":"var(--lia-bs-body-color)","tableVerticalAlign":"middle","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Proxima Nova A Medium","fontStyleBase":"NORMAL","fontWeightBase":"500","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.2","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Proxima Nova A Medium","styles":[{"style":"NORMAL","weight":"500","__typename":"FontStyleData"}],"assetNames":["ProximaNovaAMedium-normal-500.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"Neusa Next Pro Wide Bold","styles":[{"style":"NORMAL","weight":"700","__typename":"FontStyleData"}],"assetNames":["NeusaNextProWideBold-normal-700.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1751558165592","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/kbs/TkbMessagePage:board:codeshare-1751558164650":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/kbs/TkbMessagePage:board:codeshare-1751558164650","value":{"id":"TkbMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"message-list","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":true,"showDescription":true,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[{"id":"tkbs.widget.tkbArticleWidget","className":"lia-tkb-container","props":{"contributorListType":"panel","showHelpfulness":false,"showTimestamp":true,"showGuideNavigationSection":true,"showVersion":true,"lazyLoad":false,"editLevel":"CONFIGURE"},"__typename":"QuiltComponent"}],"side":[{"id":"featuredWidgets.widget.featuredContentWidget","className":null,"props":{"instanceId":"featuredWidgets.widget.featuredContentWidget-1702666556326","layoutProps":{"layout":"card","layoutOptions":{"useRepliesCount":false,"useAuthorRank":false,"useTimeToRead":true,"useKudosCount":false,"useViewCount":true,"usePreviewMedia":true,"useBody":false,"useCenteredCardContent":false,"useTags":true,"useTimestamp":false,"useBoardLink":true,"useAuthorLink":false,"useSolvedBadge":true}},"titleSrOnly":false,"showPager":true,"pageSize":3,"lazyLoad":true},"__typename":"QuiltComponent"},{"id":"messages.widget.relatedContentWidget","className":null,"props":{"hideIfEmpty":true,"enablePagination":true,"useTitle":true,"listVariant":{"type":"listGroup"},"pageSize":3,"style":"list","pagerVariant":{"type":"loadMore"},"viewVariant":{"type":"inline","props":{"useRepliesCount":true,"useMedia":true,"useAuthorRank":false,"useNode":true,"useTimeToRead":true,"useSpoilerFreeBody":true,"useKudosCount":true,"useNodeLink":true,"useViewCount":true,"usePreviewMedia":false,"useBody":false,"timeStampType":"postTime","useTags":true,"clampSubjectLines":2,"useBoardIcon":false,"useMessageTimeLink":true,"clampBodyLines":3,"useTextBody":true,"useSolvedBadge":true,"useAvatar":true,"useAuthorLogin":true,"useUnreadCount":true}},"lazyLoad":true,"panelType":"divider"},"__typename":"QuiltComponent"}],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1751558165592","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/kbs/TkbMessagePage-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-pages/kbs/TkbMessagePage-1751558165592","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This article cannot be found","name":"TKB Message Page","section.message-list.title":"","archivedMessageTitle":"This Content Has Been Archived","section.erPqcf.title":"","section.erPqcf.description":"","section.message-list.description":""},"localOverride":false},"CachedAsset:quiltWrapper:f5.prod:Common:1751558165096":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1751558165096","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"#343434","items":[{"id":"custom.widget.GainsightShared","props":{"widgetVisibility":"signedInOnly","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"#F29A36","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":1,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"unset","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-white)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-body-color)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-white)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-white)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-white)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-white)"},"links":{"sideLinks":[],"logoLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"},{"children":[],"linkType":"EXTERNAL","id":"Common-external-link","url":"https://community.f5.com/c/how-do-i","target":"SELF"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"#343434","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"var(--lia-bs-white)"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"#343434","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":true},"backgroundOpacity":100,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1751558165592","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.GainsightShared-en-us-1751558186152":{"__typename":"CachedAsset","id":"component:custom.widget.GainsightShared-en-us-1751558186152","value":{"component":{"id":"custom.widget.GainsightShared","template":{"id":"GainsightShared","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Shared functions for Gainsight integration","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.GainsightShared","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Shared functions for Gainsight integration","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-us-1751558186152":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-us-1751558186152","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-us-1751558186152":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-us-1751558186152","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-us-1751558186152":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-us-1751558186152","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-us-1751558186152":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-us-1751558186152","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1751558165592","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1751558165592","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"CachedAsset:text:en_US-components/tkbs/TkbArticleWidget-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/tkbs/TkbArticleWidget-1751558165592","value":{},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:DevCentralNews":{"__typename":"Tkb","id":"board:DevCentralNews","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:GroupsCategory":{"__typename":"Category","id":"category:GroupsCategory","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:F5-Groups":{"__typename":"Category","id":"category:F5-Groups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CommunityGroups":{"__typename":"Category","id":"category:CommunityGroups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Occasion:board:Events":{"__typename":"Occasion","id":"board:Events","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"occasionPolicies":{"__typename":"OccasionPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Idea:board:Suggestions":{"__typename":"Idea","id":"board:Suggestions","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"ideaPolicies":{"__typename":"IdeaPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:communityarticles":{"__typename":"Tkb","id":"board:communityarticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:security-insights":{"__typename":"Tkb","id":"board:security-insights","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:article-series":{"__typename":"Tkb","id":"board:article-series","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"CachedAsset:text:en_US-components/community/Navbar-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1751558165592","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","Common-external-link":"How Do I...?","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1751558165592","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1751558165592","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1751558165592","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1751558165592","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1751558165592","value":{"place":"Place {name}"},"localOverride":false},"QueryVariables:TopicReplyList:message:278038:1":{"__typename":"QueryVariables","id":"TopicReplyList:message:278038:1","value":{"id":"message:278038","first":10,"sorts":{"postTime":{"direction":"ASC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"ASC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1751558165592","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1751558165592","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1751558165592","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solution","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1751558165592","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1751558165592","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1751558165592","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1751558165592","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1751558165592","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1751558165592","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1751558165592","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1751558165592","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/guides/GuideBottomNavigation-1751558165592","value":{"nav.label":"Previous/Next Page","nav.previous":"Previous","nav.next":"Next"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1751558165592","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1751558165592","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1751558165592","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1751558165592","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1751558165592","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1751558165592","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1751558165592":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1751558165592","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false}}}},"page":"/kbs/TkbMessagePage/TkbMessagePage","query":{"boardId":"codeshare","messageSubject":"perl-twitter-proxy","messageId":"278038"},"buildId":"3XH0qYWYCnEYycuN5W4S8","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","surveysEnabled":true,"openTelemetry":{"clientEnabled":false,"configName":"f5","serviceVersion":"25.4.0","universe":"prod","collector":"http://localhost:4318","logLevel":"error","routeChangeAllowedTime":"5000","headers":"","enableDiagnostic":"false","maxAttributeValueLength":"4095"},"apolloDevToolsEnabled":false,"quiltLazyLoadThreshold":"3"},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["components_customComponent_CustomComponent","components_community_Navbar_NavbarWidget","components_community_Breadcrumb_BreadcrumbWidget","components_tkbs_TkbArticleWidget","components_messages_MessageView_MessageViewStandard","components_messages_ThreadedReplyList","components_customComponent_CustomComponentContent_TemplateContent","components_customComponent_CustomComponentContent_HtmlContent","shared_client_components_common_List_UnwrappedList","components_tags_TagView","components_tags_TagView_TagViewChip","components_customComponent_CustomComponentContent_CustomComponentScripts"],"appGip":true,"scriptLoader":[]}