Note only does the 3 types of classes (string, address and value).
Usage:
.\Update-Class-Value.py --bigip --username <--create|--delete|--list> --class_name --classtype --add -
-delete
ex.
If creating/deleting a class,specify class name and type:
.\Update-Class-Value.py --bigip 192.168.1.245 -username admin --create --classname my_address_class --classtype address
If adding/removing entries to existing class ( will attempt to guess what type ):
For an Address class, use comma seperated string like:
.\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_address_class --addkey "10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0"
or with values:
.\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_address_class --addkey "10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0" --addvalu
e "my_pool_1,my_pool_2"
For an value class, use comma seperated string like:
.\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_value_class --addkey "10000,20000" --addvalue "my_pool_1,my_pool_2"
or with values:
.\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_value_class --addkey "10000,20000"
For an string class, use comma seperated string like:
.\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_string_class --addkey "app1.example.com,app2.example.com"
or with values:
.\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_string_class --addkey "app1.example.com,app2.example.com" --addvalue "my_pool_
1,my_pool_2"
DISCLAIMER: Obviously CSV is a really bad assumption for string class but feel free to modify yourself.
Script
Manage-Class.py
Code :
#!/bin/env python
'''
----------------------------------------------------------------------------
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-2004 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.
----------------------------------------------------------------------------
'''
################## BEGIN DEFINITIONS #########################
def usage():
print "Usage:"
print "%s --bigip -username <--create|--delete|--list> --class_name --classtype --add --delete " % sys.argv[0]
print "\tex."
print "\tIf creating/deleting a class,specify class name and type:"
print "\t\t%s --bigip 192.168.1.245 -username admin --create --classname my_address_class --classtype address" % sys.argv[0]
print "\tIf adding/removing entries to existing class ( will attempt to guess what type ):"
print "\t For an Address class, use comma seperated string like:"
print "\t\t%s --bigip 192.168.1.245 -username admin --classname my_address_class --addkey \"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\"" % sys.argv[0]
print "\t\tor with values:"
print "\t\t%s --bigip 192.168.1.245 -username admin --classname my_address_class --addkey \"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\" --addvalue \"my_pool_1,my_pool_2\"" % sys.argv[0]
print "\t For an value class, use comma seperated string like:"
print "\t\t%s --bigip 192.168.1.245 -username admin --classname my_value_class --addkey \"10000,20000\" --addvalue \"my_pool_1,my_pool_2\"" % sys.argv[0]
print "\t\tor with values:"
print "\t\t%s --bigip 192.168.1.245 -username admin --classname my_value_class --addkey \"10000,20000\"" % sys.argv[0]
print "\t For an string class, use comma seperated string like:"
print "\t\t%s --bigip 192.168.1.245 -username admin --classname my_string_class --addkey \"app1.example.com,app2.example.com\"" % sys.argv[0]
print "\t\tor with values:"
print "\t\t%s --bigip 192.168.1.245 -username admin --classname my_string_class --addkey \"app1.example.com,app2.example.com\" --addvalue \"my_pool_1,my_pool_2\"" % sys.argv[0]
print "DISCLAIMER: Obviously CSV is a really bad assumption for string class but feel free to modify yourself."
def create_class(obj, class_name, class_type):
try:
print "Trying To Create Class" + class_name + " of class type " + class_type
if class_type == "address":
class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')
class_obj.name = class_name
class_obj.members = []
obj.LocalLB.Class.create_address_class( classes = [ class_obj ])
if class_type == "value":
class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')
class_obj.name = class_name
class_obj.members = []
obj.LocalLB.Class.create_value_class( classes = [ class_obj ])
if class_type == "string":
class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')
class_obj.name = class_name
class_obj.members = []
obj.LocalLB.Class.create_string_class( classes = [ class_obj ])
except:
print "Can't create Class: %s" % class_name
traceback.print_exc(file=sys.stdout)
def delete_class(obj, class_name):
try:
obj.LocalLB.Class.delete_class( classes = [ class_name ])
except:
traceback.print_exc(file=sys.stdout)
def add_key(obj, class_name, class_keys):
#only add key if doesn't exist
try:
#Get Type of Class first
class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])
class_type = class_type_seq[0]
#Container for existing Classes/Keys
existing_classes = []
existing_keys = []
if class_type == "CLASS_TYPE_ADDRESS":
#Get Existing Entries
existing_classes = obj.LocalLB.Class.get_address_class( class_names = [ class_name ] )
# Assuming only retrieving one class
for key in existing_classes[0].members:
#Store keys in same string format as input. ex. "10.20.0.0/255.255.0.0"
existing_keys.append( str(key.address) + "/" + str(key.netmask) )
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')
class_members_seq.item = []
address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')
address_class_obj.name = class_name
address_class_obj.members = []
# Change seperator to whatever works for you
key_seq = class_keys.split(",")
for key in key_seq:
(address,netmask) = key.split("/")
address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')
address_entry_obj.address = address
address_entry_obj.netmask = netmask
if key not in existing_keys:
address_class_obj.members.append(address_entry_obj)
class_members_seq.item.append(address_class_obj)
if address_class_obj.members:
obj.LocalLB.Class.add_address_class_member( class_members = class_members_seq )
if class_type == "CLASS_TYPE_STRING":
#Get Existing Entries
existing_classes = obj.LocalLB.Class.get_string_class( class_names = [ class_name ] )
for key in existing_classes[0].members:
existing_keys.append(key)
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')
class_members_seq.item = []
string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')
string_class_obj.name = class_name
string_class_obj.members = []
# Change seperator to whatever works for you
key_seq = class_keys.split(",")
for key in key_seq:
if key not in existing_keys:
string_class_obj.members.append(key)
class_members_seq.item.append(string_class_obj)
if string_class_obj.members:
obj.LocalLB.Class.add_string_class_member( class_members = class_members_seq)
if class_type == "CLASS_TYPE_VALUE":
#Get Existing Entries
existing_classes = obj.LocalLB.Class.get_value_class( class_names = [ class_name ] )
for key in existing_classes[0].members:
existing_keys.append( str(key) )
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')
class_members_seq.item = []
value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')
value_class_obj.name = class_name
value_class_obj.members = []
# Change seperator to whatever works for you
key_seq = class_keys.split(",")
for key in key_seq:
if key not in existing_keys:
print "adding Key : %s" % key
value_class_obj.members.append(key)
class_members_seq.item.append(value_class_obj)
if value_class_obj.members:
obj.LocalLB.Class.add_value_class_member( class_members = class_members_seq)
return class_members_seq
except:
print "Failed to add keys to class: %s" % class_name
traceback.print_exc(file=sys.stdout)
def remove_key(obj, class_name, class_keys):
try:
class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])
class_type = class_type_seq[0]
if class_type == "CLASS_TYPE_ADDRESS":
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')
class_members_seq.item = []
address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')
address_class_obj.name = class_name
address_class_obj.members = []
key_seq = class_keys.split(",")
for entry in key_seq:
(address,netmask) = entry.split("/")
address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')
address_entry_obj.address = address
address_entry_obj.netmask = netmask
address_class_obj.members.append(address_entry_obj)
class_members_seq.item.append(address_class_obj)
obj.LocalLB.Class.delete_address_class_member( class_members = class_members_seq)
if class_type == "CLASS_TYPE_STRING":
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')
class_members_seq.item = []
string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')
string_class_obj.name = class_name
string_class_obj.members = []
key_seq = class_keys.split(",")
for key in key_seq:
string_class_obj.members.append(key)
class_members_seq.item.append(string_class_obj)
obj.LocalLB.Class.delete_string_class_member( class_members = class_members_seq)
if class_type == "CLASS_TYPE_VALUE":
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')
class_members_seq.item = []
value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')
value_class_obj.name = class_name
value_class_obj.members = []
key_seq = class_keys.split(",")
for key in key_seq:
value_class_obj.members.append(key)
class_members_seq.item.append(value_class_obj)
obj.LocalLB.Class.delete_value_class_member( class_members = class_members_seq)
except:
print "Failed to delete keys in class: %s" % class_name
traceback.print_exc(file=sys.stdout)
def get_list(obj):
try:
address_class_list = obj.LocalLB.Class.get_address_class_list()
string_class_list = obj.LocalLB.Class.get_string_class_list()
value_class_list = obj.LocalLB.Class.get_value_class_list()
print "Address Classes:"
for my_class in address_class_list:
print "\t" + my_class
print "String Classes:"
for my_class in string_class_list:
print "\t" + my_class
print "Value Classes:"
for my_class in value_class_list:
print "\t" + my_class
except:
print "Failed to get list of classes"
traceback.print_exc(file=sys.stdout)
def get_members(obj, class_name):
try:
class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])
class_type = class_type_seq[0]
if class_type == "CLASS_TYPE_ADDRESS":
classes_output = obj.LocalLB.Class.get_address_class( class_names = [ class_name ] )
class_values = obj.LocalLB.Class.get_address_class_member_data_value ( class_members = classes_output )
for i in range(len(classes_output)):
print "Class Name: \"" + classes_output[i].name + "\""
print "Class Members: "
print "%-30s" % "key" + "%s" % "value"
print "%-30s" % "-----" + "%s" % "-----"
members = classes_output[i].members
for j in range(len(members)):
key_string = str(members[j].address) + "/" + str(members[j].netmask)
print "%-30s" % key_string + "%s" % class_values[i][j]
if class_type == "CLASS_TYPE_STRING":
classes_output = obj.LocalLB.Class.get_string_class( class_names = [ class_name ] )
class_values = obj.LocalLB.Class.get_string_class_member_data_value ( class_members = classes_output )
for i in range(len(classes_output)):
print "Class Name: \"" + classes_output[i].name + "\""
print "Class Members: "
print "%-30s" % "key" + "%s" % "value"
print "%-30s" % "-----" + "%s" % "-----"
members = classes_output[i].members
for j in range(len(members)):
print "%-30s" % members[j] + "%s" % class_values[i][j]
if class_type == "CLASS_TYPE_VALUE":
classes_output = obj.LocalLB.Class.get_value_class( class_names = [ class_name ] )
class_values = obj.LocalLB.Class.get_value_class_member_data_value ( class_members = classes_output )
for i in range(len(classes_output)):
print "Class Name: \"" + classes_output[i].name + "\""
print "Class Members: "
print "%-30s" % "key" + "%s" % "value"
print "%-30s" % "-----" + "%s" % "-----"
members = classes_output[i].members
for j in range(len(members)):
print "%-30s" % members[j] + "%s" % class_values[i][j]
except:
print "Failed to list class members for class: %s" % class_name
traceback.print_exc(file=sys.stdout)
def add_value( obj, class_name, class_keys, class_values ):
try:
# Change seperator to whatever works for you
values_input_seq = class_values.split(",")
values_seq_seq = obj.LocalLB.Class.typefactory.create('Common.StringSequenceSequence')
values_seq_seq.item = []
values_seq = obj.LocalLB.Class.typefactory.create('Common.StringSequence')
values_seq.item = []
for value in values_input_seq:
values_seq.item.append( value )
values_seq_seq.item.append( values_seq )
#Get Type of Class first
class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])
class_type = class_type_seq[0]
if class_type == "CLASS_TYPE_ADDRESS":
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')
class_members_seq.item = []
address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')
address_class_obj.name = class_name
address_class_obj.members = []
# Change seperator to whatever works for you
key_seq = class_keys.split(",")
for key in key_seq:
(address,netmask) = key.split("/")
address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')
address_entry_obj.address = address
address_entry_obj.netmask = netmask
address_class_obj.members.append(address_entry_obj)
class_members_seq.item.append(address_class_obj)
obj.LocalLB.Class.set_address_class_member_data_value (
class_members = class_members_seq,
values = values_seq_seq
)
if class_type == "CLASS_TYPE_STRING":
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')
class_members_seq.item = []
string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')
string_class_obj.name = class_name
string_class_obj.members = []
# Change seperator to whatever works for you
key_seq = class_keys.split(",")
for key in key_seq:
string_class_obj.members.append(key)
class_members_seq.item.append(string_class_obj)
obj.LocalLB.Class.set_string_class_member_data_value(
class_members = class_members_seq,
values = values_seq_seq
)
if class_type == "CLASS_TYPE_VALUE":
class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')
class_members_seq.item = []
value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')
value_class_obj.name = class_name
value_class_obj.members = []
# Change seperator to whatever works for you
key_seq = class_keys.split(",")
for key in key_seq:
value_class_obj.members.append(key)
class_members_seq.item.append(value_class_obj)
obj.LocalLB.Class.set_value_class_member_data_value (
class_members = class_members_seq,
values = values_seq_seq
)
except:
print "Failed to set values for class keys"
traceback.print_exc(file=sys.stdout)
################## BEGIN MAIN #########################
import os
import sys
import time
import traceback
import getpass
import pycontrol.pycontrol as pc
from optparse import OptionParser
if pc.__version__.startswith('2.0'):
pass
else:
print "Requires pycontrol version 2.x!"
sys.exit()
parser = OptionParser()
parser.add_option("-b", "--bigip", action="store", type="string", dest="bigip")
parser.add_option("-u", "--username", action="store", type="string", dest="uname")
parser.add_option("-c", "--create", action="store_true", dest="Create")
parser.add_option("-d", "--delete", action="store_true", dest="Delete")
parser.add_option("-l", "--list", action="store_true", dest="List")
parser.add_option("-n", "--classname", action="store", type="string", dest="Class")
parser.add_option("-t", "--classtype", action="store", type="string", dest="ClassType")
parser.add_option("-a", "--addkey", action="store", type="string", dest="AddKey")
parser.add_option("-A", "--addvalue", action="store", type="string", dest="AddValue")
parser.add_option("-r", "--removekey", action="store", type="string", dest="RemoveKey")
(options, args) = parser.parse_args()
if options.bigip and options.uname:
print "Enter your password for username: %s" % options.uname
upass = getpass.getpass()
else:
usage()
sys.exit()
b = pc.BIGIP(
hostname = options.bigip,
username = options.uname,
password = upass,
fromurl = True,
wsdls = [ 'LocalLB.Class'])
if options.Create and options.Class and options.ClassType and options.AddKey and options.AddValue:
print "Creating Class: %s" % options.Class
create_class(b, options.Class, options.ClassType )
print "Adding Entries to: %s" % options.Class
class_members_seq = add_key(b, options.Class, options.AddKey)
print "Adding Values:"
add_value(b, class_members_seq, options.AddValue)
elif options.Create and options.Class and options.ClassType:
print "Creating Class: %s" % options.Class
create_class(b, options.Class, options.ClassType )
elif options.Class and options.AddKey and options.AddValue:
print "Adding Key/Values to: %s" % options.Class
add_key(b, options.Class, options.AddKey )
add_value(b, options.Class, options.AddKey, options.AddValue)
elif options.Class and options.AddKey:
print "Adding Keys to: %s" % options.Class
add_key(b, options.Class, options.AddKey )
else:
pass
if options.Delete and options.Class:
print "Deleting Class: %s" % options.Class
delete_class(b, options.Class )
if options.Class and options.RemoveKey:
print "Deleting Entries in: %s" % options.Class
remove_key(b, options.Class, options.RemoveKey)
if options.List:
if options.Class:
get_members(b, options.Class)
else:
print "Getting Full List of Classes"
get_list(b)
"}},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:codeshare\",\"message:278577\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewStandard\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/ThreadedReplyList\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyCallToAction\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/guides/GuideBottomNavigation\"]})":[{"__ref":"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1728320186000"}]},"CachedAsset:pages-1737540121075":{"__typename":"CachedAsset","id":"pages-1737540121075","value":[{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737540121075,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__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}"},"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},"User:user:-1":{"__typename":"User","id":"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":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0","mimeType":"image/png"},"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","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","entityType":"TKB","displayId":"codeshare","nodeType":"board","depth":2,"conversationStyle":"TKB","title":"CodeShare","description":"Have some code. Share some code.","avatar":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}"},"profileSettings":{"__typename":"ProfileSettings","language":null},"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},"boardPolicies":{"__typename":"BoardPolicies","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}},"shortTitle":"CodeShare","isManualSortOrderAvailable":false,"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"repliesProperties":{"__typename":"RepliesProperties","sortOrder":"PUBLISH_TIME","repliesFormat":"threaded"},"tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":true,"tagType":"FREEFORM_AND_PRESET"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMjgtQ3U0RXo2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstMjgtQ3U0RXo2","height":0,"width":0,"mimeType":"image/svg+xml"},"Rank:rank:28":{"__typename":"Rank","id":"rank:28","position":5,"name":"Employee","color":"C20025","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMjgtQ3U0RXo2\"}"},"rankStyle":"OUTLINE"},"User:user:71536":{"__typename":"User","id":"user:71536","uid":71536,"login":"Alex__Applebaum","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-6.svg"},"rank":{"__ref":"Rank:rank:28"},"email":"","messagesCount":44,"biography":null,"topicsCount":18,"kudosReceivedCount":3,"kudosGivenCount":0,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2006-06-12T01:00:00.000-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"TkbTopicMessage:message:278577":{"__typename":"TkbTopicMessage","uid":278577,"subject":"pycontrol v2 - Class Management","id":"message:278577","revisionNum":1,"repliesCount":0,"author":{"__ref":"User:user:71536"},"depth":0,"hasGivenKudo":false,"helpful":null,"board":{"__ref":"Tkb:board:codeshare"},"conversation":{"__ref":"Conversation:conversation:278577"},"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":null},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:278577"},"teaser":"","body":"
Problem this snippet solves:
This pyControl v2 script will help manage classes
How to use this snippet:
This pyControl v2 script will help manage classes
\n
Note only does the 3 types of classes (string, address and value).
\n
Usage:\n.\\Update-Class-Value.py --bigip --username <--create|--delete|--list> --class_name --classtype --add -\n-delete \n ex.\n If creating/deleting a class,specify class name and type:\n .\\Update-Class-Value.py --bigip 192.168.1.245 -username admin --create --classname my_address_class --classtype address\n If adding/removing entries to existing class ( will attempt to guess what type ):\n For an Address class, use comma seperated string like:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_address_class --addkey \"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\"\n or with values:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_address_class --addkey \"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\" --addvalu\ne \"my_pool_1,my_pool_2\"\n For an value class, use comma seperated string like:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_value_class --addkey \"10000,20000\" --addvalue \"my_pool_1,my_pool_2\"\n or with values:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_value_class --addkey \"10000,20000\"\n For an string class, use comma seperated string like:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_string_class --addkey \"app1.example.com,app2.example.com\"\n or with values:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_string_class --addkey \"app1.example.com,app2.example.com\" --addvalue \"my_pool_\n1,my_pool_2\"\nDISCLAIMER: Obviously CSV is a really bad assumption for string class but feel free to modify yourself.\n
\n
Script
\n
Manage-Class.py
Code :
#!/bin/env python\n\n'''\n----------------------------------------------------------------------------\nThe contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5\nSoftware Development Kit for iControl\"; you may not use this file except in\ncompliance with the License. The License is included in the iControl\nSoftware Development Kit.\n\nSoftware distributed under the License is distributed on an \"AS IS\"\nbasis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\nthe License for the specific language governing rights and limitations\nunder the License.\n\nThe Original Code is iControl Code and related documentation\ndistributed by F5.\n\nThe Initial Developer of the Original Code is F5 Networks,\nInc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,\nInc. All Rights Reserved. iControl (TM) is a registered trademark of F5 Networks, Inc.\n\nAlternatively, the contents of this file may be used under the terms\nof the GNU General Public License (the \"GPL\"), in which case the\nprovisions of GPL are applicable instead of those above. If you wish\nto allow use of your version of this file only under the terms of the\nGPL and not to allow others to use your version of this file under the\nLicense, indicate your decision by deleting the provisions above and\nreplace them with the notice and other provisions required by the GPL.\nIf you do not delete the provisions above, a recipient may use your\nversion of this file under either the License or the GPL.\n----------------------------------------------------------------------------\n'''\n\n\n################## BEGIN DEFINITIONS #########################\n\ndef usage():\n print \"Usage:\"\n print \"%s --bigip -username <--create|--delete|--list> --class_name --classtype --add --delete \" % sys.argv[0]\n print \"\\tex.\"\n print \"\\tIf creating/deleting a class,specify class name and type:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --create --classname my_address_class --classtype address\" % sys.argv[0]\n print \"\\tIf adding/removing entries to existing class ( will attempt to guess what type ):\"\n print \"\\t For an Address class, use comma seperated string like:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_address_class --addkey \\\"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\\\"\" % sys.argv[0]\n print \"\\t\\tor with values:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_address_class --addkey \\\"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\\\" --addvalue \\\"my_pool_1,my_pool_2\\\"\" % sys.argv[0]\n print \"\\t For an value class, use comma seperated string like:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_value_class --addkey \\\"10000,20000\\\" --addvalue \\\"my_pool_1,my_pool_2\\\"\" % sys.argv[0]\n print \"\\t\\tor with values:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_value_class --addkey \\\"10000,20000\\\"\" % sys.argv[0]\n print \"\\t For an string class, use comma seperated string like:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_string_class --addkey \\\"app1.example.com,app2.example.com\\\"\" % sys.argv[0]\n print \"\\t\\tor with values:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_string_class --addkey \\\"app1.example.com,app2.example.com\\\" --addvalue \\\"my_pool_1,my_pool_2\\\"\" % sys.argv[0]\n print \"DISCLAIMER: Obviously CSV is a really bad assumption for string class but feel free to modify yourself.\"\n\ndef create_class(obj, class_name, class_type):\n try:\n print \"Trying To Create Class\" + class_name + \" of class type \" + class_type\n if class_type == \"address\":\n class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n class_obj.name = class_name\n class_obj.members = []\n obj.LocalLB.Class.create_address_class( classes = [ class_obj ])\n if class_type == \"value\":\n class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n class_obj.name = class_name\n class_obj.members = []\n obj.LocalLB.Class.create_value_class( classes = [ class_obj ]) \n if class_type == \"string\":\n class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n class_obj.name = class_name\n class_obj.members = []\n obj.LocalLB.Class.create_string_class( classes = [ class_obj ]) \n \n except:\n print \"Can't create Class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n\n\ndef delete_class(obj, class_name):\n try:\n \n obj.LocalLB.Class.delete_class( classes = [ class_name ]) \n\n except:\n traceback.print_exc(file=sys.stdout)\n\n\ndef add_key(obj, class_name, class_keys):\n\n #only add key if doesn't exist\n try:\n\n #Get Type of Class first\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n #Container for existing Classes/Keys\n existing_classes = []\n existing_keys = []\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n\n #Get Existing Entries\n existing_classes = obj.LocalLB.Class.get_address_class( class_names = [ class_name ] )\n # Assuming only retrieving one class\n for key in existing_classes[0].members:\n #Store keys in same string format as input. ex. \"10.20.0.0/255.255.0.0\"\n existing_keys.append( str(key.address) + \"/\" + str(key.netmask) )\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')\n class_members_seq.item = []\n\n address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n address_class_obj.name = class_name\n address_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n\n for key in key_seq:\n (address,netmask) = key.split(\"/\")\n address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')\n address_entry_obj.address = address\n address_entry_obj.netmask = netmask\n\n if key not in existing_keys:\n address_class_obj.members.append(address_entry_obj)\n\n class_members_seq.item.append(address_class_obj)\n\n if address_class_obj.members:\n obj.LocalLB.Class.add_address_class_member( class_members = class_members_seq )\n\n if class_type == \"CLASS_TYPE_STRING\":\n\n #Get Existing Entries\n existing_classes = obj.LocalLB.Class.get_string_class( class_names = [ class_name ] )\n for key in existing_classes[0].members:\n existing_keys.append(key)\n\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')\n class_members_seq.item = []\n\n string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n string_class_obj.name = class_name\n string_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n if key not in existing_keys:\n string_class_obj.members.append(key)\n\n class_members_seq.item.append(string_class_obj)\n\n if string_class_obj.members:\n obj.LocalLB.Class.add_string_class_member( class_members = class_members_seq)\n \n if class_type == \"CLASS_TYPE_VALUE\":\n\n #Get Existing Entries\n existing_classes = obj.LocalLB.Class.get_value_class( class_names = [ class_name ] )\n for key in existing_classes[0].members:\n existing_keys.append( str(key) )\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')\n class_members_seq.item = []\n\n value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n value_class_obj.name = class_name\n value_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n if key not in existing_keys:\n \n print \"adding Key : %s\" % key\n value_class_obj.members.append(key)\n\n class_members_seq.item.append(value_class_obj)\n\n if value_class_obj.members:\n obj.LocalLB.Class.add_value_class_member( class_members = class_members_seq) \n \n return class_members_seq\n \n except:\n print \"Failed to add keys to class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n\n\n\ndef remove_key(obj, class_name, class_keys):\n try:\n\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')\n class_members_seq.item = []\n\n address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n address_class_obj.name = class_name\n address_class_obj.members = []\n\n key_seq = class_keys.split(\",\")\n for entry in key_seq:\n (address,netmask) = entry.split(\"/\")\n address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')\n address_entry_obj.address = address\n address_entry_obj.netmask = netmask\n address_class_obj.members.append(address_entry_obj)\n\n class_members_seq.item.append(address_class_obj)\n\n obj.LocalLB.Class.delete_address_class_member( class_members = class_members_seq)\n\n if class_type == \"CLASS_TYPE_STRING\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')\n class_members_seq.item = []\n\n string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n string_class_obj.name = class_name\n string_class_obj.members = []\n\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n string_class_obj.members.append(key)\n\n class_members_seq.item.append(string_class_obj)\n\n obj.LocalLB.Class.delete_string_class_member( class_members = class_members_seq)\n \n if class_type == \"CLASS_TYPE_VALUE\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')\n class_members_seq.item = []\n\n value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n value_class_obj.name = class_name\n value_class_obj.members = []\n\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n value_class_obj.members.append(key)\n\n class_members_seq.item.append(value_class_obj)\n\n obj.LocalLB.Class.delete_value_class_member( class_members = class_members_seq) \n \n except:\n print \"Failed to delete keys in class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n\ndef get_list(obj):\n try:\n address_class_list = obj.LocalLB.Class.get_address_class_list()\n string_class_list = obj.LocalLB.Class.get_string_class_list()\n value_class_list = obj.LocalLB.Class.get_value_class_list()\n\n print \"Address Classes:\"\n for my_class in address_class_list:\n print \"\\t\" + my_class\n\n print \"String Classes:\"\n for my_class in string_class_list:\n print \"\\t\" + my_class\n\n print \"Value Classes:\"\n for my_class in value_class_list:\n print \"\\t\" + my_class\n\n except:\n print \"Failed to get list of classes\"\n traceback.print_exc(file=sys.stdout)\n\ndef get_members(obj, class_name):\n try:\n\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n \n classes_output = obj.LocalLB.Class.get_address_class( class_names = [ class_name ] )\n class_values = obj.LocalLB.Class.get_address_class_member_data_value ( class_members = classes_output )\n for i in range(len(classes_output)):\n print \"Class Name: \\\"\" + classes_output[i].name + \"\\\"\"\n print \"Class Members: \"\n print \"%-30s\" % \"key\" + \"%s\" % \"value\"\n print \"%-30s\" % \"-----\" + \"%s\" % \"-----\"\n members = classes_output[i].members\n for j in range(len(members)):\n key_string = str(members[j].address) + \"/\" + str(members[j].netmask)\n print \"%-30s\" % key_string + \"%s\" % class_values[i][j]\n\n\n if class_type == \"CLASS_TYPE_STRING\":\n\n classes_output = obj.LocalLB.Class.get_string_class( class_names = [ class_name ] )\n class_values = obj.LocalLB.Class.get_string_class_member_data_value ( class_members = classes_output )\n for i in range(len(classes_output)):\n print \"Class Name: \\\"\" + classes_output[i].name + \"\\\"\"\n print \"Class Members: \"\n print \"%-30s\" % \"key\" + \"%s\" % \"value\"\n print \"%-30s\" % \"-----\" + \"%s\" % \"-----\"\n members = classes_output[i].members\n for j in range(len(members)):\n print \"%-30s\" % members[j] + \"%s\" % class_values[i][j]\n \n if class_type == \"CLASS_TYPE_VALUE\":\n classes_output = obj.LocalLB.Class.get_value_class( class_names = [ class_name ] )\n class_values = obj.LocalLB.Class.get_value_class_member_data_value ( class_members = classes_output )\n for i in range(len(classes_output)):\n print \"Class Name: \\\"\" + classes_output[i].name + \"\\\"\"\n print \"Class Members: \"\n print \"%-30s\" % \"key\" + \"%s\" % \"value\"\n print \"%-30s\" % \"-----\" + \"%s\" % \"-----\"\n members = classes_output[i].members\n for j in range(len(members)):\n print \"%-30s\" % members[j] + \"%s\" % class_values[i][j]\n \n \n except:\n print \"Failed to list class members for class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n \n\n\ndef add_value( obj, class_name, class_keys, class_values ):\n try:\n\n # Change seperator to whatever works for you\n values_input_seq = class_values.split(\",\")\n\n values_seq_seq = obj.LocalLB.Class.typefactory.create('Common.StringSequenceSequence')\n values_seq_seq.item = []\n values_seq = obj.LocalLB.Class.typefactory.create('Common.StringSequence')\n values_seq.item = []\n\n for value in values_input_seq:\n values_seq.item.append( value ) \n \n values_seq_seq.item.append( values_seq )\n\n\n #Get Type of Class first\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')\n class_members_seq.item = []\n\n address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n address_class_obj.name = class_name\n address_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n\n for key in key_seq:\n (address,netmask) = key.split(\"/\")\n address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')\n address_entry_obj.address = address\n address_entry_obj.netmask = netmask\n address_class_obj.members.append(address_entry_obj)\n\n class_members_seq.item.append(address_class_obj)\n\n obj.LocalLB.Class.set_address_class_member_data_value (\n class_members = class_members_seq,\n values = values_seq_seq\n )\n\n\n if class_type == \"CLASS_TYPE_STRING\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')\n class_members_seq.item = []\n\n string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n string_class_obj.name = class_name\n string_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n string_class_obj.members.append(key)\n\n class_members_seq.item.append(string_class_obj)\n\n obj.LocalLB.Class.set_string_class_member_data_value( \n class_members = class_members_seq,\n values = values_seq_seq\n )\n\n \n if class_type == \"CLASS_TYPE_VALUE\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')\n class_members_seq.item = []\n\n value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n value_class_obj.name = class_name\n value_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n value_class_obj.members.append(key)\n\n class_members_seq.item.append(value_class_obj)\n\n obj.LocalLB.Class.set_value_class_member_data_value (\n class_members = class_members_seq,\n values = values_seq_seq\n )\n\n\n\n\n\n except:\n print \"Failed to set values for class keys\"\n traceback.print_exc(file=sys.stdout)\n \n\n################## BEGIN MAIN #########################\n\nimport os\nimport sys\nimport time\nimport traceback\nimport getpass\nimport pycontrol.pycontrol as pc\nfrom optparse import OptionParser\n\nif pc.__version__.startswith('2.0'):\n pass\nelse:\n print \"Requires pycontrol version 2.x!\"\n sys.exit()\n\n\nparser = OptionParser()\nparser.add_option(\"-b\", \"--bigip\", action=\"store\", type=\"string\", dest=\"bigip\")\nparser.add_option(\"-u\", \"--username\", action=\"store\", type=\"string\", dest=\"uname\")\nparser.add_option(\"-c\", \"--create\", action=\"store_true\", dest=\"Create\")\nparser.add_option(\"-d\", \"--delete\", action=\"store_true\", dest=\"Delete\")\nparser.add_option(\"-l\", \"--list\", action=\"store_true\", dest=\"List\")\nparser.add_option(\"-n\", \"--classname\", action=\"store\", type=\"string\", dest=\"Class\")\nparser.add_option(\"-t\", \"--classtype\", action=\"store\", type=\"string\", dest=\"ClassType\")\nparser.add_option(\"-a\", \"--addkey\", action=\"store\", type=\"string\", dest=\"AddKey\")\nparser.add_option(\"-A\", \"--addvalue\", action=\"store\", type=\"string\", dest=\"AddValue\")\nparser.add_option(\"-r\", \"--removekey\", action=\"store\", type=\"string\", dest=\"RemoveKey\")\n\n\n(options, args) = parser.parse_args()\n\nif options.bigip and options.uname:\n print \"Enter your password for username: %s\" % options.uname\n upass = getpass.getpass()\nelse:\n usage()\n sys.exit()\n \n \n\nb = pc.BIGIP(\n hostname = options.bigip,\n username = options.uname,\n password = upass,\n fromurl = True,\n wsdls = [ 'LocalLB.Class'])\n\n\n\n\nif options.Create and options.Class and options.ClassType and options.AddKey and options.AddValue:\n print \"Creating Class: %s\" % options.Class\n create_class(b, options.Class, options.ClassType )\n print \"Adding Entries to: %s\" % options.Class\n class_members_seq = add_key(b, options.Class, options.AddKey)\n print \"Adding Values:\"\n add_value(b, class_members_seq, options.AddValue)\nelif options.Create and options.Class and options.ClassType:\n print \"Creating Class: %s\" % options.Class\n create_class(b, options.Class, options.ClassType )\nelif options.Class and options.AddKey and options.AddValue:\n print \"Adding Key/Values to: %s\" % options.Class\n add_key(b, options.Class, options.AddKey )\n add_value(b, options.Class, options.AddKey, options.AddValue)\nelif options.Class and options.AddKey:\n print \"Adding Keys to: %s\" % options.Class\n add_key(b, options.Class, options.AddKey )\nelse:\n pass\n\nif options.Delete and options.Class:\n print \"Deleting Class: %s\" % options.Class\n delete_class(b, options.Class )\n\nif options.Class and options.RemoveKey:\n print \"Deleting Entries in: %s\" % options.Class\n remove_key(b, options.Class, options.RemoveKey)\n\nif options.List:\n if options.Class:\n get_members(b, options.Class)\n else: \n print \"Getting Full List of Classes\"\n get_list(b)
","body@stringLength":"23972","rawBody":"
Problem this snippet solves:
This pyControl v2 script will help manage classes
How to use this snippet:
This pyControl v2 script will help manage classes
\n
Note only does the 3 types of classes (string, address and value).
\n
Usage:\n.\\Update-Class-Value.py --bigip --username <--create|--delete|--list> --class_name --classtype --add -\n-delete \n ex.\n If creating/deleting a class,specify class name and type:\n .\\Update-Class-Value.py --bigip 192.168.1.245 -username admin --create --classname my_address_class --classtype address\n If adding/removing entries to existing class ( will attempt to guess what type ):\n For an Address class, use comma seperated string like:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_address_class --addkey \"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\"\n or with values:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_address_class --addkey \"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\" --addvalu\ne \"my_pool_1,my_pool_2\"\n For an value class, use comma seperated string like:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_value_class --addkey \"10000,20000\" --addvalue \"my_pool_1,my_pool_2\"\n or with values:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_value_class --addkey \"10000,20000\"\n For an string class, use comma seperated string like:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_string_class --addkey \"app1.example.com,app2.example.com\"\n or with values:\n .\\Update-Class-Value.py --bigip 192.168.1.245 --username admin --classname my_string_class --addkey \"app1.example.com,app2.example.com\" --addvalue \"my_pool_\n1,my_pool_2\"\nDISCLAIMER: Obviously CSV is a really bad assumption for string class but feel free to modify yourself.\n
\n
Script
\n
Manage-Class.py
Code :
#!/bin/env python\n\n'''\n----------------------------------------------------------------------------\nThe contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5\nSoftware Development Kit for iControl\"; you may not use this file except in\ncompliance with the License. The License is included in the iControl\nSoftware Development Kit.\n\nSoftware distributed under the License is distributed on an \"AS IS\"\nbasis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\nthe License for the specific language governing rights and limitations\nunder the License.\n\nThe Original Code is iControl Code and related documentation\ndistributed by F5.\n\nThe Initial Developer of the Original Code is F5 Networks,\nInc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,\nInc. All Rights Reserved. iControl (TM) is a registered trademark of F5 Networks, Inc.\n\nAlternatively, the contents of this file may be used under the terms\nof the GNU General Public License (the \"GPL\"), in which case the\nprovisions of GPL are applicable instead of those above. If you wish\nto allow use of your version of this file only under the terms of the\nGPL and not to allow others to use your version of this file under the\nLicense, indicate your decision by deleting the provisions above and\nreplace them with the notice and other provisions required by the GPL.\nIf you do not delete the provisions above, a recipient may use your\nversion of this file under either the License or the GPL.\n----------------------------------------------------------------------------\n'''\n\n\n################## BEGIN DEFINITIONS #########################\n\ndef usage():\n print \"Usage:\"\n print \"%s --bigip -username <--create|--delete|--list> --class_name --classtype --add --delete \" % sys.argv[0]\n print \"\\tex.\"\n print \"\\tIf creating/deleting a class,specify class name and type:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --create --classname my_address_class --classtype address\" % sys.argv[0]\n print \"\\tIf adding/removing entries to existing class ( will attempt to guess what type ):\"\n print \"\\t For an Address class, use comma seperated string like:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_address_class --addkey \\\"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\\\"\" % sys.argv[0]\n print \"\\t\\tor with values:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_address_class --addkey \\\"10.10.0.0/255.255.0.0,10.20.0.0/255.255.0.0\\\" --addvalue \\\"my_pool_1,my_pool_2\\\"\" % sys.argv[0]\n print \"\\t For an value class, use comma seperated string like:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_value_class --addkey \\\"10000,20000\\\" --addvalue \\\"my_pool_1,my_pool_2\\\"\" % sys.argv[0]\n print \"\\t\\tor with values:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_value_class --addkey \\\"10000,20000\\\"\" % sys.argv[0]\n print \"\\t For an string class, use comma seperated string like:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_string_class --addkey \\\"app1.example.com,app2.example.com\\\"\" % sys.argv[0]\n print \"\\t\\tor with values:\"\n print \"\\t\\t%s --bigip 192.168.1.245 -username admin --classname my_string_class --addkey \\\"app1.example.com,app2.example.com\\\" --addvalue \\\"my_pool_1,my_pool_2\\\"\" % sys.argv[0]\n print \"DISCLAIMER: Obviously CSV is a really bad assumption for string class but feel free to modify yourself.\"\n\ndef create_class(obj, class_name, class_type):\n try:\n print \"Trying To Create Class\" + class_name + \" of class type \" + class_type\n if class_type == \"address\":\n class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n class_obj.name = class_name\n class_obj.members = []\n obj.LocalLB.Class.create_address_class( classes = [ class_obj ])\n if class_type == \"value\":\n class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n class_obj.name = class_name\n class_obj.members = []\n obj.LocalLB.Class.create_value_class( classes = [ class_obj ]) \n if class_type == \"string\":\n class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n class_obj.name = class_name\n class_obj.members = []\n obj.LocalLB.Class.create_string_class( classes = [ class_obj ]) \n \n except:\n print \"Can't create Class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n\n\ndef delete_class(obj, class_name):\n try:\n \n obj.LocalLB.Class.delete_class( classes = [ class_name ]) \n\n except:\n traceback.print_exc(file=sys.stdout)\n\n\ndef add_key(obj, class_name, class_keys):\n\n #only add key if doesn't exist\n try:\n\n #Get Type of Class first\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n #Container for existing Classes/Keys\n existing_classes = []\n existing_keys = []\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n\n #Get Existing Entries\n existing_classes = obj.LocalLB.Class.get_address_class( class_names = [ class_name ] )\n # Assuming only retrieving one class\n for key in existing_classes[0].members:\n #Store keys in same string format as input. ex. \"10.20.0.0/255.255.0.0\"\n existing_keys.append( str(key.address) + \"/\" + str(key.netmask) )\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')\n class_members_seq.item = []\n\n address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n address_class_obj.name = class_name\n address_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n\n for key in key_seq:\n (address,netmask) = key.split(\"/\")\n address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')\n address_entry_obj.address = address\n address_entry_obj.netmask = netmask\n\n if key not in existing_keys:\n address_class_obj.members.append(address_entry_obj)\n\n class_members_seq.item.append(address_class_obj)\n\n if address_class_obj.members:\n obj.LocalLB.Class.add_address_class_member( class_members = class_members_seq )\n\n if class_type == \"CLASS_TYPE_STRING\":\n\n #Get Existing Entries\n existing_classes = obj.LocalLB.Class.get_string_class( class_names = [ class_name ] )\n for key in existing_classes[0].members:\n existing_keys.append(key)\n\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')\n class_members_seq.item = []\n\n string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n string_class_obj.name = class_name\n string_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n if key not in existing_keys:\n string_class_obj.members.append(key)\n\n class_members_seq.item.append(string_class_obj)\n\n if string_class_obj.members:\n obj.LocalLB.Class.add_string_class_member( class_members = class_members_seq)\n \n if class_type == \"CLASS_TYPE_VALUE\":\n\n #Get Existing Entries\n existing_classes = obj.LocalLB.Class.get_value_class( class_names = [ class_name ] )\n for key in existing_classes[0].members:\n existing_keys.append( str(key) )\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')\n class_members_seq.item = []\n\n value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n value_class_obj.name = class_name\n value_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n if key not in existing_keys:\n \n print \"adding Key : %s\" % key\n value_class_obj.members.append(key)\n\n class_members_seq.item.append(value_class_obj)\n\n if value_class_obj.members:\n obj.LocalLB.Class.add_value_class_member( class_members = class_members_seq) \n \n return class_members_seq\n \n except:\n print \"Failed to add keys to class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n\n\n\ndef remove_key(obj, class_name, class_keys):\n try:\n\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')\n class_members_seq.item = []\n\n address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n address_class_obj.name = class_name\n address_class_obj.members = []\n\n key_seq = class_keys.split(\",\")\n for entry in key_seq:\n (address,netmask) = entry.split(\"/\")\n address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')\n address_entry_obj.address = address\n address_entry_obj.netmask = netmask\n address_class_obj.members.append(address_entry_obj)\n\n class_members_seq.item.append(address_class_obj)\n\n obj.LocalLB.Class.delete_address_class_member( class_members = class_members_seq)\n\n if class_type == \"CLASS_TYPE_STRING\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')\n class_members_seq.item = []\n\n string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n string_class_obj.name = class_name\n string_class_obj.members = []\n\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n string_class_obj.members.append(key)\n\n class_members_seq.item.append(string_class_obj)\n\n obj.LocalLB.Class.delete_string_class_member( class_members = class_members_seq)\n \n if class_type == \"CLASS_TYPE_VALUE\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')\n class_members_seq.item = []\n\n value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n value_class_obj.name = class_name\n value_class_obj.members = []\n\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n value_class_obj.members.append(key)\n\n class_members_seq.item.append(value_class_obj)\n\n obj.LocalLB.Class.delete_value_class_member( class_members = class_members_seq) \n \n except:\n print \"Failed to delete keys in class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n\ndef get_list(obj):\n try:\n address_class_list = obj.LocalLB.Class.get_address_class_list()\n string_class_list = obj.LocalLB.Class.get_string_class_list()\n value_class_list = obj.LocalLB.Class.get_value_class_list()\n\n print \"Address Classes:\"\n for my_class in address_class_list:\n print \"\\t\" + my_class\n\n print \"String Classes:\"\n for my_class in string_class_list:\n print \"\\t\" + my_class\n\n print \"Value Classes:\"\n for my_class in value_class_list:\n print \"\\t\" + my_class\n\n except:\n print \"Failed to get list of classes\"\n traceback.print_exc(file=sys.stdout)\n\ndef get_members(obj, class_name):\n try:\n\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n \n classes_output = obj.LocalLB.Class.get_address_class( class_names = [ class_name ] )\n class_values = obj.LocalLB.Class.get_address_class_member_data_value ( class_members = classes_output )\n for i in range(len(classes_output)):\n print \"Class Name: \\\"\" + classes_output[i].name + \"\\\"\"\n print \"Class Members: \"\n print \"%-30s\" % \"key\" + \"%s\" % \"value\"\n print \"%-30s\" % \"-----\" + \"%s\" % \"-----\"\n members = classes_output[i].members\n for j in range(len(members)):\n key_string = str(members[j].address) + \"/\" + str(members[j].netmask)\n print \"%-30s\" % key_string + \"%s\" % class_values[i][j]\n\n\n if class_type == \"CLASS_TYPE_STRING\":\n\n classes_output = obj.LocalLB.Class.get_string_class( class_names = [ class_name ] )\n class_values = obj.LocalLB.Class.get_string_class_member_data_value ( class_members = classes_output )\n for i in range(len(classes_output)):\n print \"Class Name: \\\"\" + classes_output[i].name + \"\\\"\"\n print \"Class Members: \"\n print \"%-30s\" % \"key\" + \"%s\" % \"value\"\n print \"%-30s\" % \"-----\" + \"%s\" % \"-----\"\n members = classes_output[i].members\n for j in range(len(members)):\n print \"%-30s\" % members[j] + \"%s\" % class_values[i][j]\n \n if class_type == \"CLASS_TYPE_VALUE\":\n classes_output = obj.LocalLB.Class.get_value_class( class_names = [ class_name ] )\n class_values = obj.LocalLB.Class.get_value_class_member_data_value ( class_members = classes_output )\n for i in range(len(classes_output)):\n print \"Class Name: \\\"\" + classes_output[i].name + \"\\\"\"\n print \"Class Members: \"\n print \"%-30s\" % \"key\" + \"%s\" % \"value\"\n print \"%-30s\" % \"-----\" + \"%s\" % \"-----\"\n members = classes_output[i].members\n for j in range(len(members)):\n print \"%-30s\" % members[j] + \"%s\" % class_values[i][j]\n \n \n except:\n print \"Failed to list class members for class: %s\" % class_name\n traceback.print_exc(file=sys.stdout)\n \n\n\ndef add_value( obj, class_name, class_keys, class_values ):\n try:\n\n # Change seperator to whatever works for you\n values_input_seq = class_values.split(\",\")\n\n values_seq_seq = obj.LocalLB.Class.typefactory.create('Common.StringSequenceSequence')\n values_seq_seq.item = []\n values_seq = obj.LocalLB.Class.typefactory.create('Common.StringSequence')\n values_seq.item = []\n\n for value in values_input_seq:\n values_seq.item.append( value ) \n \n values_seq_seq.item.append( values_seq )\n\n\n #Get Type of Class first\n class_type_seq = obj.LocalLB.Class.get_class_type( class_names = [ class_name ])\n class_type = class_type_seq[0]\n\n if class_type == \"CLASS_TYPE_ADDRESS\":\n\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClassSequence')\n class_members_seq.item = []\n\n address_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressClass')\n address_class_obj.name = class_name\n address_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n\n for key in key_seq:\n (address,netmask) = key.split(\"/\")\n address_entry_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.AddressEntry')\n address_entry_obj.address = address\n address_entry_obj.netmask = netmask\n address_class_obj.members.append(address_entry_obj)\n\n class_members_seq.item.append(address_class_obj)\n\n obj.LocalLB.Class.set_address_class_member_data_value (\n class_members = class_members_seq,\n values = values_seq_seq\n )\n\n\n if class_type == \"CLASS_TYPE_STRING\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClassSequence')\n class_members_seq.item = []\n\n string_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.StringClass')\n string_class_obj.name = class_name\n string_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n string_class_obj.members.append(key)\n\n class_members_seq.item.append(string_class_obj)\n\n obj.LocalLB.Class.set_string_class_member_data_value( \n class_members = class_members_seq,\n values = values_seq_seq\n )\n\n \n if class_type == \"CLASS_TYPE_VALUE\":\n class_members_seq = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClassSequence')\n class_members_seq.item = []\n\n value_class_obj = obj.LocalLB.Class.typefactory.create('LocalLB.Class.ValueClass')\n value_class_obj.name = class_name\n value_class_obj.members = []\n\n # Change seperator to whatever works for you\n key_seq = class_keys.split(\",\")\n for key in key_seq:\n value_class_obj.members.append(key)\n\n class_members_seq.item.append(value_class_obj)\n\n obj.LocalLB.Class.set_value_class_member_data_value (\n class_members = class_members_seq,\n values = values_seq_seq\n )\n\n\n\n\n\n except:\n print \"Failed to set values for class keys\"\n traceback.print_exc(file=sys.stdout)\n \n\n################## BEGIN MAIN #########################\n\nimport os\nimport sys\nimport time\nimport traceback\nimport getpass\nimport pycontrol.pycontrol as pc\nfrom optparse import OptionParser\n\nif pc.__version__.startswith('2.0'):\n pass\nelse:\n print \"Requires pycontrol version 2.x!\"\n sys.exit()\n\n\nparser = OptionParser()\nparser.add_option(\"-b\", \"--bigip\", action=\"store\", type=\"string\", dest=\"bigip\")\nparser.add_option(\"-u\", \"--username\", action=\"store\", type=\"string\", dest=\"uname\")\nparser.add_option(\"-c\", \"--create\", action=\"store_true\", dest=\"Create\")\nparser.add_option(\"-d\", \"--delete\", action=\"store_true\", dest=\"Delete\")\nparser.add_option(\"-l\", \"--list\", action=\"store_true\", dest=\"List\")\nparser.add_option(\"-n\", \"--classname\", action=\"store\", type=\"string\", dest=\"Class\")\nparser.add_option(\"-t\", \"--classtype\", action=\"store\", type=\"string\", dest=\"ClassType\")\nparser.add_option(\"-a\", \"--addkey\", action=\"store\", type=\"string\", dest=\"AddKey\")\nparser.add_option(\"-A\", \"--addvalue\", action=\"store\", type=\"string\", dest=\"AddValue\")\nparser.add_option(\"-r\", \"--removekey\", action=\"store\", type=\"string\", dest=\"RemoveKey\")\n\n\n(options, args) = parser.parse_args()\n\nif options.bigip and options.uname:\n print \"Enter your password for username: %s\" % options.uname\n upass = getpass.getpass()\nelse:\n usage()\n sys.exit()\n \n \n\nb = pc.BIGIP(\n hostname = options.bigip,\n username = options.uname,\n password = upass,\n fromurl = True,\n wsdls = [ 'LocalLB.Class'])\n\n\n\n\nif options.Create and options.Class and options.ClassType and options.AddKey and options.AddValue:\n print \"Creating Class: %s\" % options.Class\n create_class(b, options.Class, options.ClassType )\n print \"Adding Entries to: %s\" % options.Class\n class_members_seq = add_key(b, options.Class, options.AddKey)\n print \"Adding Values:\"\n add_value(b, class_members_seq, options.AddValue)\nelif options.Create and options.Class and options.ClassType:\n print \"Creating Class: %s\" % options.Class\n create_class(b, options.Class, options.ClassType )\nelif options.Class and options.AddKey and options.AddValue:\n print \"Adding Key/Values to: %s\" % options.Class\n add_key(b, options.Class, options.AddKey )\n add_value(b, options.Class, options.AddKey, options.AddValue)\nelif options.Class and options.AddKey:\n print \"Adding Keys to: %s\" % options.Class\n add_key(b, options.Class, options.AddKey )\nelse:\n pass\n\nif options.Delete and options.Class:\n print \"Deleting Class: %s\" % options.Class\n delete_class(b, options.Class )\n\nif options.Class and options.RemoveKey:\n print \"Deleting Entries in: %s\" % options.Class\n remove_key(b, options.Class, options.RemoveKey)\n\nif options.List:\n if options.Class:\n get_members(b, options.Class)\n else: \n print \"Getting Full List of Classes\"\n get_list(b)
","kudosSumWeight":0,"postTime":"2015-03-09T13:13:27.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":"MjQuMTF8Mi4xfG98MTB8X05WX3wx","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":"MjQuMTF8Mi4xfG98MTB8X05WX3wy","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":"MjQuMTF8Mi4xfG98MTB8X05WX3wz","node":{"__typename":"Tag","id":"tag:python","text":"python","time":"2022-01-24T02:30:07.130-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":11,"rawTeaser":"","introduction":"","currentRevision":{"__ref":"Revision:revision:278577_1"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":193},"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:71536"}}]},"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}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":1}},"Conversation:conversation:278577":{"__typename":"Conversation","id":"conversation:278577","solved":false,"topic":{"__ref":"TkbTopicMessage:message:278577"},"lastPostingActivityTime":"2015-03-09T13:13:27.000-07:00","lastPostTime":"2015-03-09T13:13:27.000-07:00","unreadReplyCount":0,"isSubscribed":false},"ModerationData:moderation_data:278577":{"__typename":"ModerationData","id":"moderation_data:278577","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"Revision:revision:278577_1":{"__typename":"Revision","id":"revision:278577_1","lastEditTime":"2015-03-09T13:13:27.000-07:00"},"CachedAsset:theme:customTheme1-1737540120588":{"__typename":"CachedAsset","id":"theme:customTheme1-1737540120588","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":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","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":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 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 var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 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":"NONE","sideContent":"NONE","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.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__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":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","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":"#0C5C8D","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"],"__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":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":null,"h2FontWeight":null,"h3FontWeight":null,"h4FontWeight":null,"h5FontWeight":null,"h6FontWeight":null,"__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","__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":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__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-components/common/EmailVerification-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1728320186000","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-shared/client/components/common/Loading/LoadingDot-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1728320186000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/kbs/TkbMessagePage:board:codeshare-1737540118863":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/kbs/TkbMessagePage:board:codeshare-1737540118863","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-pages/kbs/TkbMessagePage-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-pages/kbs/TkbMessagePage-1728320186000","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:1737540050581":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1737540050581","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"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,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"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":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","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)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"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"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1728320186000","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.Beta_MetaNav-en-1737540138254":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1737540138254","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"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":[],"dynamicByCoreNode":false,"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-1737540138254":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1737540138254","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"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":[],"dynamicByCoreNode":false,"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-1737540138254":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1737540138254","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"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":[],"dynamicByCoreNode":false,"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-1737540138254":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1737540138254","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"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":[],"dynamicByCoreNode":false,"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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1728320186000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tkbs/TkbArticleWidget-1728320186000","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/customComponent/CustomComponent-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1728320186000","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/community/Navbar-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1728320186000","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","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1728320186000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1728320186000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1728320186000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1728320186000","value":{"place":"Place {name}"},"localOverride":false},"QueryVariables:TopicReplyList:message:278577:1":{"__typename":"QueryVariables","id":"TopicReplyList:message:278577:1","value":{"id":"message:278577","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":true,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1728320186000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1728320186000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1728320186000","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1728320186000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1728320186000","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/guides/GuideBottomNavigation-1728320186000","value":{"nav.label":"Previous/Next Page","nav.previous":"Previous","nav.next":"Next"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1728320186000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1728320186000","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1728320186000","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1728320186000","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1728320186000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1728320186000","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false}}}},"page":"/kbs/TkbMessagePage/TkbMessagePage","query":{"boardId":"codeshare","messageSubject":"pycontrol-v2---class-management","messageId":"278577"},"buildId":"_FASV5DDw52YaqfBDLqsB","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"24.11.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tkbs/TkbArticleWidget/TkbArticleWidget.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx"],"appGip":true,"scriptLoader":[]}