application delivery

561 Topics
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_MetaNav\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/application%20delivery\"}}})":{"__typename":"ComponentRenderResult","html":"
 
 
 
 
 

\"F5 ©2024 F5, Inc. All rights reserved.
Trademarks Policies Privacy California Privacy Do Not Sell My Personal Information
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/application%20delivery\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"componentScriptGroups({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/application%20delivery\"}}})":{"__typename":"ComponentRenderResult","html":"
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1743097588000"}],"cachedText({\"lastModified\":\"1743097588000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1743097588000"}]},"CachedAsset:pages-1742463725698":{"__typename":"CachedAsset","id":"pages-1742463725698","value":[{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.Learn","type":"COMMUNITY","urlPath":"/c/how-do-i/learn","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501996000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463725698,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"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":null,"possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"CachedAsset:theme:customTheme1-1742463725282":{"__typename":"CachedAsset","id":"theme:customTheme1-1742463725282","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":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__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-shared/client/components/common/Loading/LoadingDot-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1743097588000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1743097588000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/tags/TagPage-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1743097588000","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"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"},"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}},"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"shortTitle":"CodeShare","tagPolicies":{"__typename":"TagPolicies","canSubscribeTagOnNode":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","args":[]}},"canManageTagDashboard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","args":[]}}}},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:board:codeshare-1743097589977":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:board:codeshare-1743097589977","value":{"id":"TagPage","container":{"id":"Common","headerProps":{"removeComponents":["community.widget.bannerWidget"],"__typename":"QuiltContainerSectionProps"},"items":[{"id":"tag-header-widget","layout":"ONE_COLUMN","bgColor":"var(--lia-bs-white)","showBorder":"BOTTOM","sectionEditLevel":"LOCKED","columnMap":{"main":[{"id":"tags.widget.TagsHeaderWidget","__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"},{"id":"messages-list-for-tag-widget","layout":"ONE_COLUMN","columnMap":{"main":[{"id":"messages.widget.messageListForNodeByRecentActivityWidget","props":{"viewVariant":{"type":"inline","props":{"useUnreadCount":true,"useViewCount":true,"useAuthorLogin":true,"clampBodyLines":3,"useAvatar":true,"useBoardIcon":false,"useKudosCount":true,"usePreviewMedia":true,"useTags":false,"useNode":true,"useNodeLink":true,"useTextBody":true,"truncateBodyLength":-1,"useBody":true,"useRepliesCount":true,"useSolvedBadge":true,"timeStampType":"conversation.lastPostingActivityTime","useMessageTimeLink":true,"clampSubjectLines":2}},"panelType":"divider","useTitle":false,"hideIfEmpty":false,"pagerVariant":{"type":"loadMore"},"style":"list","showTabs":true,"tabItemMap":{"default":{"mostRecent":true,"mostRecentUserContent":false,"newest":false},"additional":{"mostKudoed":true,"mostViewed":true,"mostReplies":false,"noReplies":false,"noSolutions":false,"solutions":false}}},"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"}],"__typename":"QuiltContainer"},"__typename":"Quilt"},"localOverride":false},"CachedAsset:quiltWrapper:f5.prod:Common:1742463635942":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1742463635942","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"},{"children":[],"linkType":"EXTERNAL","id":"Common-external-link","url":"https://community.f5.com/c/how-do-i","target":"SELF"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__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-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1743097588000","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-1742463741107":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1742463741107","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-1742463741107":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1742463741107","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-1742463741107":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1742463741107","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-1742463741107":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1742463741107","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1743097588000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1743097588000","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1743097588000","value":{"title@userScope:other":"Recent Content","title@userScope:self":"Contributions","title@board:FORUM@userScope:other":"Recent Discussions","title@board:BLOG@userScope:other":"Recent Blogs","emptyDescription":"No content to show","MessageListForNodeByRecentActivityWidgetEditor.nodeScope.label":"Scope","title@instance:1706288370055":"Content Feed","title@instance:1743095186784":"Most Recent Updates","title@instance:1704317906837":"Content Feed","title@instance:1743095018194":"Most Recent Updates","title@instance:1702668293472":"Community Feed","title@instance:1743095117047":"Most Recent Updates","title@instance:1704319314827":"Blog Feed","title@instance:1743095235555":"Most Recent Updates","title@instance:1704320290851":"My Contributions","title@instance:1703720491809":"Forum Feed","title@instance:1743095311723":"Most Recent Updates","title@instance:1703028709746":"Group Content Feed","title@instance:VTsglH":"Content Feed"},"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}}},"Conversation:conversation:285134":{"__typename":"Conversation","id":"conversation:285134","topic":{"__typename":"TkbTopicMessage","uid":285134},"lastPostingActivityTime":"2025-03-03T19:46:31.801-08:00","solved":false},"User:user:325385":{"__typename":"User","uid":325385,"login":"Patrik_Jonsson","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0zMjUzODUtMTY0MjJpNDQzQTkxREQwMjBDODY4NQ"},"id":"user:325385"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDZpQUNENUE4MDgyRkFCNEJFNg?revision=12\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDZpQUNENUE4MDgyRkFCNEJFNg?revision=12","title":"Patrik_Jonsson_0-1666904878537.png","associationType":"BODY","width":3456,"height":1434,"altText":"Patrik_Jonsson_0-1666904878537.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDdpNEM5NENFMEJEQUZBNEM1RA?revision=12\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDdpNEM5NENFMEJEQUZBNEM1RA?revision=12","title":"Patrik_Jonsson_1-1666904947099.png","associationType":"BODY","width":3444,"height":642,"altText":"Patrik_Jonsson_1-1666904947099.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDhpMTY5QkUzRjM3OUJCOTM0Rg?revision=12\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDhpMTY5QkUzRjM3OUJCOTM0Rg?revision=12","title":"Patrik_Jonsson_2-1666905155620.png","associationType":"BODY","width":3456,"height":1144,"altText":"Patrik_Jonsson_2-1666905155620.png"},"TkbTopicMessage:message:285134":{"__typename":"TkbTopicMessage","subject":"BIG-IP Report","conversation":{"__ref":"Conversation:conversation:285134"},"id":"message:285134","revisionNum":12,"uid":285134,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:325385"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":13987},"postTime":"2021-04-21T22:59:41.000-07:00","lastPublishTime":"2024-10-16T08:53:25.201-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n Overview \n This is a script which will generate a report of the BIG-IP LTM configuration on all your load balancers making it easy to find information and get a comprehensive overview of virtual servers and pools connected to them. \n This information is used to relay information to NOC and developers to give them insight in where things are located and to be able to plan patching and deploys. I also use it myself as a quick way get information or gather data used as a foundation for RFC's, ie get a list of all external virtual servers without compression profiles. \n The script has been running on 13 pairs of load balancers, indexing over 1200 virtual servers for several years now and the report is widely used across the company and by many companies and governments across the world. \n It's easy to setup and use and only requires auditor (read-only) permissions on your devices. \n Demo/Preview \n Interactive demo \n http://loadbalancing.se/bigipreportdemo/ \n Screen shots \n The main report: \n The device overview: \n Certificate details: \n How to use this snippet: \n Installation instructions \n BigipReport REST \n This is the only branch we're updating since middle of 2020 and it supports 12.x and upwards (maybe even 11.6). \n \n Downloads: https://loadbalancing.se/downloads/bigipreport-v5.7.13.zip \n Documentation, installation instructions and troubleshooting: https://loadbalancing.se/bigipreport-rest/\n Docker support \n https://loadbalancing.se/2021/01/05/running-bigipreport-on-docker/ \n Kubernetes support \n https://loadbalancing.se/2021/04/16/bigipreport-on-kubernetes/ \n BIG-IP Report (Legacy) \n Older version of the report that only runs on Windows and is depending on a Powershell plugin originally written by Joe Pruitt (F5) \n BIG-IP Report (only download this if you have v10 devices): \n https://loadbalancing.se/downloads/bigipreport-5.4.0-beta.zip \n iControl Snapin \n https://loadbalancing.se/downloads/f5-icontrol.zip \n Documentation and Installation Instructions \n https://loadbalancing.se/bigip-report/ \n Upgrade instructions \n Protect the report using APM and active directory \n Written by DevCentral member Shann_P: \n https://loadbalancing.se/2018/04/08/protecting-bigip-report-behind-an-apm-by-shannon-poole/ \n Got issues/problems/feedback? \n Still have issues? Drop a comment below. We usually reply quite fast. Any bugs found, issues detected or ideas contributed makes the report better for everyone, so it's always appreciated. \n --- \n Join us on Discord: https://discord.gg/7JJvPMYahA \n Code : \n BigIP Report \n Tested this on version: \n 12, 13, 14, 15, 16 \n \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2647","kudosSumWeight":20,"repliesCount":97,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDZpQUNENUE4MDgyRkFCNEJFNg?revision=12\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDdpNEM5NENFMEJEQUZBNEM1RA?revision=12\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDhpMTY5QkUzRjM3OUJCOTM0Rg?revision=12\"}"}}],"totalCount":3,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:276866":{"__typename":"Conversation","id":"conversation:276866","topic":{"__typename":"TkbTopicMessage","uid":276866},"lastPostingActivityTime":"2025-02-24T10:09:51.294-08:00","solved":false},"User:user:283614":{"__typename":"User","uid":283614,"login":"Ken_Bocchino_49","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-7.svg?time=0"},"id":"user:283614"},"TkbTopicMessage:message:276866":{"__typename":"TkbTopicMessage","subject":"UDP TCP Packet Duplication","conversation":{"__ref":"Conversation:conversation:276866"},"id":"message:276866","revisionNum":1,"uid":276866,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:283614"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":7484},"postTime":"2015-03-11T15:04:02.000-07:00","lastPublishTime":"2015-03-11T15:04:02.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This iApp provides full configuration of UDP/TCP packet duplication. It is commonly used to duplicate Syslog, SNMP Traps, Netflow, and Sflow data streams to multiple vendor solutions or customers. It also provides fault tolerance capabilities within each duplicated destination. By pointing Network devices, Appliances, and Servers to a VIP distributing network management traffic modifying distribution of streams can be done in one centralized location. UDP packets retain the original source address when sending to the destination locations. \n Notes: \n Prior to 11.5 you must add an IPv6 address to any interface to allow for HSL traffic to be sent to the distribution virtual fdf5::1/64 fdf5::2/64 for an HA pair would do it.* TCP traffic does not maintain original source Internal F5 Resources can demo this solution within the UDF environment using the blueprint named \"Traffic Duplication Demo\" \n Contributed by: Ken Bocchino 20200807 - Updated to v2.2 How to use this snippet: ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1038","kudosSumWeight":6,"repliesCount":39,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:339690":{"__typename":"Conversation","id":"conversation:339690","topic":{"__typename":"TkbTopicMessage","uid":339690},"lastPostingActivityTime":"2025-02-11T09:30:31.497-08:00","solved":false},"User:user:139981":{"__typename":"User","uid":139981,"login":"kenT","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-4.svg?time=0"},"id":"user:139981"},"TkbTopicMessage:message:339690":{"__typename":"TkbTopicMessage","subject":"Performance optimalization of message based load balancing.","conversation":{"__ref":"Conversation:conversation:339690"},"id":"message:339690","revisionNum":1,"uid":339690,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:139981"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"Performance optimalization of message based load balancing.","metrics":{"__typename":"MessageMetrics","views":24},"postTime":"2025-02-11T09:30:31.497-08:00","lastPublishTime":"2025-02-11T09:30:31.497-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" There are several benefits to message based load balancing (mblb) rather than the traditional connection based load balancing, as described in Load-Balancing Syslog Messages Part 1. This implementation works well, however in a high volume logging environment it may be beneficial to consider multi-message based load balancing (mmblb) to enhance performance. At the core of the message-based load balancing there is an iRule which carves out new-line separated messages from the TCP stream and submits them to a load balancing decision. The \"original\" iRule: when CLIENT_ACCEPTED {\n TCP::collect\n}\nwhen CLIENT_DATA {\n set minimum_message_length 1\n while { [TCP::payload] contains \"\\x0a\" && [TCP::payload length] > $minimum_message_length } {\n set m [getfield [TCP::payload] \"\\x0a\" 1]\n set length [expr [string length $m] + 1]\n TCP::release $length\n TCP::notify request\n }\n TCP::collect\n} This iRule will carve out log messages one by one and for each log message perform a load balancing decision. With respect to performance this does not scale well. By modifying the \"original\" iRule, a multi-message based load balancing (mmblb) iRule has been developed. The main changes are: 1) Expanding the TCP collect frame size to fit more messages for processing. 2) Instead of carving message by message, finding the last new-line character and load balance all messages up to this point. The \"modified\" iRule (mmblb) using collection size of 150KB (configurable): when CLIENT_ACCEPTED {\n TCP::collect 150000\n}\n \nwhen CLIENT_DATA {\n set mess [TCP::payload]\n # string last function will return -1 if no new-line character found in $mess \n set messlength [expr [string last \"\\x0a\" $mess] + 1]\n if { $messlength > 0 } {\n TCP::release $messlength\n TCP::notify request\n }\n TCP::collect 150000\n} This iRule (mmblb) allows for multiple log messages, determined by the TCP collection size, to be carved out in one chunk and then one load balancing decision before collecting more data from the TCP stream. Note that the pool member data volume statistics will be more uneven for smaller data volumes (KB/MB) until larger volume sizes are displayed (GB+). For a specific set of test messages, the modified iRule (mmblb) significantly reduced the number of Executions and number of Instruction Cycles according to internal resource statistics. This iRule is successfully deployed in a 5B+ log messages per day environment using a F5 cluster and 5 virtual Rsyslog backend servers. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2551","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:285358":{"__typename":"Conversation","id":"conversation:285358","topic":{"__typename":"TkbTopicMessage","uid":285358},"lastPostingActivityTime":"2025-01-27T12:12:54.020-08:00","solved":false},"User:user:51154":{"__typename":"User","uid":51154,"login":"JRahm","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS01MTE1NC1uYzdSVFk?image-coordinates=0%2C0%2C1067%2C1067"},"id":"user:51154"},"TkbTopicMessage:message:285358":{"__typename":"TkbTopicMessage","subject":"snmp-check external monitor","conversation":{"__ref":"Conversation:conversation:285358"},"id":"message:285358","revisionNum":2,"uid":285358,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:51154"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2001},"postTime":"2020-03-16T14:28:50.000-07:00","lastPublishTime":"2025-01-27T12:12:54.020-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n This external monitor script runs an snmpget to pool members and marks the members up or down based upon the result. Specifically created for this GTM/APM use case, but can be modified as needed. \n How to use this snippet: \n copy the contents of this file into /config/monitors/snmp-check, and then in the external monitor configuration, reference the monitor and provide the following variable key/value pairs: \n   \n result=<result> \n community=<community> \n OID=<oid> \n Code : \n #!/bin/sh\n\n#\n# (c) Copyright 1996-2005 F5 Networks, Inc.\n#\n# This software is confidential and may contain trade secrets that are the\n# property of F5 Networks, Inc. No part of the software may be disclosed\n# to other parties without the express written consent of F5 Networks, Inc.\n# It is against the law to copy the software. No part of the software may\n# be reproduced, transmitted, or distributed in any form or by any means,\n# electronic or mechanical, including photocopying, recording, or information\n# storage and retrieval systems, for any purpose without the express written\n# permission of F5 Networks, Inc. Our services are only available for legal\n# users of the program, for instance in the event that we extend our services\n# by offering the updating of files via the Internet.\n#\n# @(#) $Id: sample_monitor,v 1.3 2005/02/04 18:47:17 saxon Exp $\n#\n#\n# these arguments supplied automatically for all external pingers:\n# $1 = IP (nnn.nnn.nnn.nnn notation or hostname)\n# $2 = port (decimal, host byte order)\n# $3 and higher = additional arguments\n#\n# $MONITOR_NAME = name of the monitor\n#\n# In this sample script, $3 is the regular expression\n#\n\n#These lines are required to control the process ID of the monitor\npidfile=\"/var/run/$MONITOR_NAME.$1..$2.pid\"\n\nif [ -f $pidfile ]\nthen\n kill -9 `cat $pidfile` > /dev/null 2>&1\nfi\n\necho \"$$\" > $pidfile\n\n#Since version9 uses the ipv6 native version of the IP address, parse that down\n#for usage\n\nnode_ip=`echo $1 | sed 's/::ffff://'`\n\n#Log the variables for debugging\n#echo IP= $node_ip Port =$2 OID= $OID comm= $community result= $result >> /var/tmp/test\n\n#Create a variable called answer that contains the result of the snmpwalk.\nanswer=`snmpget $node_ip -c $community -O v $OID | awk '{print $2}'`\n\n#Log the answer for debugging\n#echo Answer= $answer >> /var/tmp/test\n\n\nif [ $answer -lt $result ]\nthen\n echo \"up\"\nfi\n\nrm -f $pidfile \n   \n Tested this on version: \n No Version Found ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2517","kudosSumWeight":2,"repliesCount":5,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:273908":{"__typename":"Conversation","id":"conversation:273908","topic":{"__typename":"TkbTopicMessage","uid":273908},"lastPostingActivityTime":"2025-01-27T12:04:22.371-08:00","solved":false},"User:user:6658":{"__typename":"User","uid":6658,"login":"pauld_104632","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-8.svg?time=0"},"id":"user:6658"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzM5MDgtNDk1N2kyMzREQ0E4MEJERjY1OUM3?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzM5MDgtNDk1N2kyMzREQ0E4MEJERjY1OUM3?revision=2","title":"0151T000003d9E6QAI.png","associationType":"BODY","width":705,"height":377,"altText":"null"},"TkbTopicMessage:message:273908":{"__typename":"TkbTopicMessage","subject":"VIPRION external monitor","conversation":{"__ref":"Conversation:conversation:273908"},"id":"message:273908","revisionNum":2,"uid":273908,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:6658"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":306},"postTime":"2015-03-12T15:44:24.000-07:00","lastPublishTime":"2025-01-27T12:04:22.371-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n This VIPRION specific external monitor script is written in bash and utilizes TMSH to extend the built-in monitoring functionality of BIG-IP version 10.2.3. This write-up assumes the reader has working knowledge writing BIG-IP LTM external monitors. The following link is a great starting point LTM External Monitors: The Basics | DevCentral \n Logical network diagram: \n NOTE: The monitor is written to meet very specific environmental requirements. Therefore, your implementation may vary greatly. This post is inteded to show you some requirements for writing external monitors on the VIPRION platform while offering some creative ways to extend the functionality of external monitors using TMSH. \n The VIPRION acts as a hop in the default path of traffic destined for the Internet. Specific application flows are vectored to optimization servers and all other traffic is passed to the next hop router (Router C) toward the Internet. Router A and Router C are BGP neighbors through the VIPRION. Router B is a BGP neighbor with the VIPRION via ZebOS. A virtual address has route health injection enabled. The script monitors a user defined (agrument to the script) pool and transitions into the failed state when the available pool member count drops below a threshold value (argument to the script). \n In the failed state the following actions are performed once, effectively stopping client traffic flow through the VIPRION. \n \n Two virtual servers (arguments to the script) are disable to stop traffic through VIPRION. \n A virtual address (argument to the script) is disabled to disable route health injection of the address. \n All non Self-IP BGP connections are found in the connection table and deleted. \n \n NOTE: Manual intervention is required to enable virtual servers and virtual address when the monitor transitions from failed state to successful state before normal traffic flows will proceed. \n How to use this snippet: \n The monitor definition: \n monitor eavbgpv3 { defaults from external interval 20 timeout 61 args \"poolhttp 32 vsforward1 vsforward2 10.10.10.1\"v DEBUG \"0\"v run \"rhi_v3.bsh\" } \n This external monitor is configured to check for available members in the pool \"poolhttp\". When the available members falls below 32 the monitor transistions into the failed state and disables the virtual servers \"vsforward1\" and \"vs_forward2\" and disables the virtual address \"10.10.10.1\". When the available pool members increases above 32 neither the virtuals servers nor the virtual address is enabled. This will require manual intervention. The external monitor is assigned to a phantom pool with a single member \"1.1.1.1:4353\". No traffic is sent to the pool member. This pool and pool member are in place so the operator can see the current status of the external monitor. \n The Pool definition: \n pool bgpmonitor { monitor all eavbgp_v3 members 1.1.1.1:f5-iquery {} } \n You can download the script here: rhi_v3.bsh \n CODE: \n #!/bin/bash\n# (c) Copyright 1996-2007 F5 Networks, Inc.\n#\n# This software is confidential and may contain trade secrets that are the\n# property of F5 Networks, Inc. No part of the software may be disclosed\n# to other parties without the express written consent of F5 Networks, Inc.\n# It is against the law to copy the software. No part of the software may\n# be reproduced, transmitted, or distributed in any form or by any means,\n# electronic or mechanical, including photocopying, recording, or information\n# storage and retrieval systems, for any purpose without the express written\n# permission of F5 Networks, Inc. Our services are only available for legal\n# users of the program, for instance in the event that we extend our services\n# by offering the updating of files via the Internet.\n#\n# author: Paul DeHerrera pauld@f5.com\n#\n# these arguments supplied automatically for all external monitors:\n# $1 = IP (nnn.nnn.nnn.nnn notation or hostname)\n# $2 = port (decimal, host byte order) -- not used in this monitor, assumes default port 53\n#\n# these arguments must be supplied in the monitor configuration:\n# $3 = name of pool to monitor\n# $4 = threshold value of the pool. If the available pool member count drops below this value the monitor will respond in 'failed' state\n# $5 = first Virtual server to disable\n# $6 = second Virtual server to disable\n# $7 = first Virtual address to disable\n# $8 = second Virtual address to disable\n### Check for the 'DEBUG' variable, set it here if not present.\n\n# is the DEBUG variable passed as a variable?\nif [ -z \"$DEBUG\" ]\nthen\n # If the monitor config didn't specify debug as a variable then enable/disable it here\n DEBUG=0\nfi\n\n### If Debug is on, output the script start time to /var/log/ltm\n\n# capture and log (when debug is on) a timestamp when this eav starts\nexport ST=`date +%Y%m%d-%H:%M:%S`\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): started at $ST\" | logger -p local0.debug; fi\n\n### Do not execute this script within the first 300 seconds after BIG-IP boot. This is a customer specific requirement\n\n# this section is used to introduce a delay of 300 seconds after system boot before executing this eav for the first time\nBOOT_DATE=`who -b | grep -i 'system boot' | awk {'print $3 \" \" $4 \" \" $5'}`\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): boot_date: ($BOOT_DATE)\" | logger -p local0.debug; fi\nEPOCH_DATE=`date -d \"$BOOT_DATE\" +%s`\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): epoch_date: ($EPOCH_DATE)\" | logger -p local0.debug; fi\nEPOCH_DATE=$((${EPOCH_DATE}+300))\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): epoch_date +300: ($EPOCH_DATE)\" | logger -p local0.debug; fi\nCUR_DATE=`date +%s`\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): current_date: ($CUR_DATE)\" | logger -p local0.debug; fi\n\nif [ $CUR_DATE -ge $EPOCH_DATE ]\n then\n\n### Assign a value to variables. The VIPRION requires some commands to be executed on the Primary slot as you will see later in this script\n\n# export some variables\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): exporting variables...\" | logger -p local0.debug; fi\nexport REMOTEUSER=\"root\"\nexport HOME=\"/root\"\nexport IP=`echo $1 | sed 's/::ffff://'`\nexport PORT=$2\nexport POOL=$3\nexport MEMBER_THRESHOLD=$4\nexport VIRTUAL_SERVER1=$5\nexport VIRTUAL_SERVER2=$6\nexport VIRTUAL_ADDRESS1=$7\nexport VIRTUAL_ADDRESS2=$8\nexport PIDFILE=\"/var/run/`basename $0`.$IP.$PORT.pid\"\nexport TRACKING_FILENAME=/var/tmp/rhi_bsh_monitor_status\nexport PRIMARY_SLOT=`tmsh list sys db cluster.primary.slot | grep -i 'value' | sed -e 's/\\\"//g' | awk {'print $NF'}`\n\n### Output the Primary slot to /var/log/ltm\n\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): the primary blade is in slot number: ($PRIMARY_SLOT)...\" | logger -p local0.debug; fi\n\n### This section is for debugging only. Check to see if this script is executing on the Primary blade and output to /var/log/ltm\n\nif [ $DEBUG -eq 1 ]; then export PRIMARY_BLADE=`tmsh list sys db cluster.primary | grep -i \"value\" | sed -e 's/\\\"//g' | awk {'print $NF'}`; fi\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): is this monitor executing on the primary blade: ($PRIMARY_BLADE)\" | logger -p local0.debug; fi\n\n### Standard EAV check to see if an instance of this script is already running for the memeber. If so, kill the previous instance and output to /var/log/ltm\n\n# is there already an instance of this EAV running for this member?\nif [ -f $PIDFILE ]\nthen\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): pid file is present, killing process...\" | logger -p local0.debug; fi\n kill -9 `cat $PIDFILE` > /dev/null 2>&1\n echo \"EAV `basename $0` ($$): exceeded monitor interval, needed to kill ${IP}:${PORT} with PID `cat $PIDFILE`\" | logger -p local0.error\nfi\n\n### Create a new pid file to track this instance of the monitor for the current member\n\n# create a pidfile\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): creating new pid file...\" | logger -p local0.debug; fi\necho \"$$\" > $PIDFILE\n\n### Export variables for available pool members and total pool members\n\n# export more variables (these require tmsh)\nexport AVAILABLE=`tmsh show /ltm pool $POOL members all-properties | grep -i \"Availability\" | awk {'print $NF'} | grep -ic \"available\"`\nexport TOTAL_POOL_MEMBERS=`tmsh show /ltm pool $POOL members all-properties | grep -c \"Pool Member\"`\nlet \"AVAILABLE-=1\"\n\n### If Debug is on, output some variables to /var/log/ltm - helps with troubleshooting\n\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): Pool ($POOL) has ($AVAILABLE) available of ($TOTAL_POOL_MEMBERS) total members.\" | logger -p local0.debug; fi\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): Pool ($POOL) threshold = ($MEMBER_THRESHOLD) members. Virtual server1 ($VIRTUAL_SERVER1) and Virtual server2 ($VIRTUAL_SERVER2)\" | logger -p local0.debug; fi\nif [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): Member Threshold ($MEMBER_THRESHOLD)\" | logger -p local0.debug; fi\n\n### If the available members is less than the threshold then we are in a 'failed' state.\n\n# main monitor logic\nif [ \"$AVAILABLE\" -lt \"$MEMBER_THRESHOLD\" ]\nthen\n\n### If Debug is on, output status to /var/log/ltm \n\n ### notify log - below threshold and disabling virtual server1\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): AVAILABLE < MEMBER_THRESHOLD, disabling the virtual server...\" | logger -p local0.debug; fi\n\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disabling Virtual Server 1 ($VIRTUAL_SERVER1)\" | logger -p local0.debug; fi\n\n### Disable the first virtual server, which may exist in an administrative partition. For version 10.2.3 (possibly others) the script is required to change the 'update-partition' before disabling the virtual server. To accomplish this we first determine the administrative partition name where the virtual is configured then we build a list construct to execute both commands consecutively. \n\n ### disable virtual server 1\n\n### obtain the administrative partition for the virtual. if no administrative partition is found, assume common\n export VS1_PART=`tmsh list ltm virtual $VIRTUAL_SERVER1 | grep 'partition' | awk {'print $NF'}`\n if [ -z ${VS1_PART} ]; then\n### no administrative partition was found so execute a list construct to change the update-partition to Common and disable the virtual server consecutively\n export DISABLE1=`ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT \"tmsh modify cli admin-partitions update-partition Common && tmsh modify /ltm virtual $VIRTUAL_SERVER1 disabled\"`\n### If Debug is on, output the command to /var/log/ltm\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disable cmd1: ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT 'tmsh modify cli admin-partitions update-partition Common && tmsh modify /ltm virtual $VIRTUAL_SERVER1 disabled'\" | logger -p local0.debug; fi\n else\n### the administrative partition was found so execute a list construct to change the update-partition and disable the virtual server consecutively. The command is sent to the primary slot via SSH\n export DISABLE1=`ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT \"tmsh modify cli admin-partitions update-partition $VS1_PART && tmsh modify /ltm virtual $VIRTUAL_SERVER1 disabled\"`\n### If Debug is on, output the command to /var/log/ltm\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disable cmd1: ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT 'tmsh modify cli admin-partitions update-partition $VS1_PART && tmsh modify /ltm virtual $VIRTUAL_SERVER1 disabled'\" | logger -p local0.debug; fi\n fi\n\n### If Debug is on, output status to /var/log/ltm \n\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disabling Virtual Server 2 ($VIRTUAL_SERVER2)\" | logger -p local0.debug; fi\n\n### Disable the second virtual server. This section is the same as above, so I will skip the detailed comments here.\n\n ### disable virtual server 2\n export VS2_PART=`tmsh list ltm virtual $VIRTUAL_SERVER2 | grep 'partition' | awk {'print $NF'}`\n if [ -z ${VS2_PART} ]; then\n export DISABLE2=`ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT \"tmsh modify cli admin-partitions update-partition Common && tmsh modify /ltm virtual $VIRTUAL_SERVER2 disabled\"`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disable cmd2: ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT 'tmsh modify cli admin-partitions update-partition Common && tmsh modify /ltm virtual $VIRTUAL_SERVER2 disabled'\" | logger -p local0.debug; fi\n else\n export DISABLE2=`ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT \"tmsh modify cli admin-partitions update-partition $VS2_PART && tmsh modify /ltm virtual $VIRTUAL_SERVER2 disabled\"`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disable cmd2: ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT 'tmsh modify cli admin-partitions update-partition $VS2_PART && tmsh modify ltm virtual $VIRTUAL_SERVER2 disabled'\" | logger -p local0.debug; fi\n fi\n\n ### notify log - disconnecting all BGP connection\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): Pool ($POOL) disconnecting all BGP connections...\" | logger -p local0.debug; fi\n\n ### acquire a list of self IPs\n SELF_IPS=(`tmsh list net self | grep 'net self' | sed -e 's/\\//\\ /g' | awk {'print $3'}`)\n ### start to build our TMSH command excluding self IPs\n BGP_CONNS=\"tmsh show sys conn cs-server-port 179 | sed -e 's/\\:/\\ /g' | egrep -v '\"\n COUNT=1\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 1 - ${BGP_CONNS}\" | logger -p local0.debug; fi\n\n ### loop through the self IPs\n for ip in \"${SELF_IPS[@]}\"\n do\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 2 - ${ip}\" | logger -p local0.debug; fi\n\n ### continue to build our TMSH command - append self IPs to ignore\n if [ ${COUNT} -gt 1 ]\n then\n BGP_CONNS=${BGP_CONNS}\"|${ip}\"\n else\n BGP_CONNS=${BGP_CONNS}\"${ip}\"\n fi\n (( COUNT++ ))\n done\n\n ### if debug is on log a message with the TMSH command up until this point\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 3 - ${BGP_CONNS}\" | logger -p local0.debug; fi\n ### finish the TMSH command to show BGP connections not including self IPs\n BGP_CONNS=${BGP_CONNS}\"' | egrep -v 'Sys|Total' | awk {'print \\$1'}\"\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 4 - ${BGP_CONNS}\" | logger -p local0.debug; fi\n ### gather all BGP connection not including those to self IPs\n DISCONNS=(`eval $BGP_CONNS`)\n DISCMD=''\n NEWCOUNT=1\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 5 - ${DISCONNS}\" | logger -p local0.debug; fi\n ### loop through the resulting BGP connections and build another TMSH command to delete these connections from the connection table\n for newip in \"${DISCONNS[@]}\"\n do\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 6\" | logger -p local0.debug; fi\n if [ ${NEWCOUNT} -gt 1 ]\n then\n DISCMD=${DISCMD}\" && tmsh delete sys connection cs-client-addr ${newip} cs-server-port 179\"\n else\n DISCMD=${DISCMD}\"tmsh delete sys connection cs-client-addr ${newip} cs-server-port 179\"\n fi\n (( NEWCOUNT++ ))\n done\n ### if debug is on log the command we just assembled\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 7 - ${DISCMD}\" | logger -p local0.debug; fi\n ### One the primary slot execute the command to delete the non self IP BGP connections.\n export CONNECTIONS=`ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT \"${DISCMD}\"`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): BGP Step 8 - $CONNECTIONS\" | logger -p local0.debug; fi\n ### disable virtual address 1\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): VA1 ($VIRTUAL_ADDRESS1)\" | logger -p local0.debug; fi\n if [ ! -z \"$VIRTUAL_ADDRESS1\" ]; then\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disabling Virtual Address 1 ($VIRTUAL_ADDRESS1)\" | logger -p local0.debug; fi\n export VA1_PART=`tmsh list ltm virtual-address $VIRTUAL_ADDRESS1 | grep 'partition' | awk {'print $NF'}`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): cmd: ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT tmsh modify cli admin-partitions update-partition $VA1_PART && tmsh modify /ltm virtual-address $VIRTUAL_ADDRESS1 enabled no \" | logger -p local0.debug; fi\n export VA2_UPCMD=`ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT \"tmsh modify cli admin-partitions update-partition $VA1_PART && tmsh modify /ltm virtual-address $VIRTUAL_ADDRESS1 enabled no\"`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): virtual address 1 disabled?\" | logger -p local0.debug; fi\n fi\n ### disable virtual address 2\n if [ ! -z \"$VIRTUAL_ADDRESS2\" ]; then\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): disabling Virtual Address 2 ($VIRTUAL_ADDRESS2)\" | logger -p local0.debug; fi\n export VA2_PART=`tmsh list ltm virtual-address $VIRTUAL_ADDRESS2 | grep 'partition' | awk {'print $NF'}`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): update-partition - $VA2_PART\" | logger -p local0.debug; fi\n export VA2_UPCMD=`ssh -o StrictHostKeyChecking=no root\\@slot$PRIMARY_SLOT \"tmsh modify cli admin-partitions update-partition $VA2_PART && tmsh modify /ltm virtual-address $VIRTUAL_ADDRESS2 enabled no\"`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): cmd: virtual address 2 disabled?\" | logger -p local0.debug; fi\n fi\n ### track number of times this monitor has failed\n if [ -e \"$TRACKING_FILENAME\" ]\n then\n export COUNT=`cat $TRACKING_FILENAME`\n export NEW_COUNT=$((${COUNT}+1))\n echo $NEW_COUNT > $TRACKING_FILENAME\n else\n echo 1 > $TRACKING_FILENAME\n export NEW_COUNT=1\n fi\n ### notify log - failure count\n echo \"EAV `basename $0` ($$): Pool $POOL only has $AVAILABLE available of $TOTAL_POOL_MEMBERS total members, failing site. Virtual servers ($VIRTUAL_SERVER1 and $VIRTUAL_SERVER2) will be disabled and all connections with destination port 179 will be terminated. Virtual servers must be manually enabled after pool $MEMBER_THRESHOLD or more pool members are available. This monitor has failed $NEW_COUNT times.\" | logger -p local0.debug\n\n # remove the pidfile\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): removing the pidfile...\" | logger -p local0.debug; fi\n export PIDBGONE=`rm -f $PIDFILE`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): pidfile has been removed ($PIDBGONE)\" | logger -p local0.debug; fi\n export END=`date +%Y%m%d-%H:%M:%S`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): stopped at $END\" | logger -p local0.debug; fi\nelse\n if [ -e \"$TRACKING_FILENAME\" ]\n then\n ### log the status\n echo \"EAV `basename $0` ($$): Pool $POOL has $AVAILABLE members of $TOTAL_POOL_MEMBERS total members. No change to virtual servers ($VIRTUAL_SERVER1 and $VIRTUAL_SERVER2). No change to port 179 connections. Virtual servers must be manually enabled to pass traffic if they are disabled.\" | logger -p local0.debug\n rm -f $TRACKING_FILENAME\n fi\n ### remove the pidfile\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): removing the pidfile...\" | logger -p local0.debug; fi\n export PIDBGONE=`rm -f $PIDFILE`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): pidfile has been removed ($PIDBGONE)\" | logger -p local0.debug; fi\n export END=`date +%Y%m%d-%H:%M:%S`\n if [ $DEBUG -eq 1 ]; then echo \"EAV `basename $0` ($$): stopped at $END\" | logger -p local0.debug; fi\n echo \"UP\"\nfi\n\nfi ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"19877","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzM5MDgtNDk1N2kyMzREQ0E4MEJERjY1OUM3?revision=2\"}"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:281983":{"__typename":"Conversation","id":"conversation:281983","topic":{"__typename":"TkbTopicMessage","uid":281983},"lastPostingActivityTime":"2025-01-22T21:53:02.801-08:00","solved":false},"User:user:58212":{"__typename":"User","uid":58212,"login":"jaikumar_f5","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-11.svg?time=0"},"id":"user:58212"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODE5ODMtMTUyOTZpODJCODQ1MUI3RThBNzExNw?revision=4\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODE5ODMtMTUyOTZpODJCODQ1MUI3RThBNzExNw?revision=4","title":"0151T000002dhuTQAQ.png","associationType":"BODY","width":1571,"height":292,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODE5ODMtMTA4NDFpRDgyNDhCQjk3MTU5NkYyRQ?revision=4\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODE5ODMtMTA4NDFpRDgyNDhCQjk3MTU5NkYyRQ?revision=4","title":"0151T000002dhuUQAQ.png","associationType":"BODY","width":1497,"height":291,"altText":null},"TkbTopicMessage:message:281983":{"__typename":"TkbTopicMessage","subject":"Export Virtual Server Configuration in CSV - tmsh cli script","conversation":{"__ref":"Conversation:conversation:281983"},"id":"message:281983","revisionNum":4,"uid":281983,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:58212"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":9083},"postTime":"2020-05-02T19:41:18.000-07:00","lastPublishTime":"2023-10-24T07:42:47.195-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n This is a simple cli script used to collect all the virtuals name, its VIP details, Pool names, members, all Profiles, Irules, persistence associated to each, in all partitions. A sample output would be like below, \n \n  One can customize the code to extract other fields available too. The same logic can be allowed to pull information's from profiles stats, certificates etc. \n   \n Update: 5th Oct 2020 \n   \n Added Pool members capture in the code. After the Pool-Name, Pool-Members column will be found. \n If a pool does not have members - field not present: \"members\" will shown in the respective Pool-Members column. \n If a pool itself is not bound to the VS, then Pool-Name, Pool-Members will have none in the respective columns. \n   \n Update: 21st Jan 2021 \n   \n Added logic to look for multiple partitions & collect configs \n   \n Update: 12th Feb 2021 \n   \n Added logic to add persistence to sheet. \n   \n Update: 26th May 2021 \n   \n Added logic to add state & status to sheet. \n   \n Update: 24th Oct 2023 \n Added logic to add hostname, Pool Status, Total-Connections & Current-Connections. \n Note: The codeshare has multiple version, use the latest version alone. The reason to keep the other versions is for end users to understand & compare, thus helping them to modify to their own requirements. Hope it helps. \n   \n How to use this snippet: \n Login to the LTM, create your script by running the below commands and paste the code provided in snippet \n   \n tmsh create cli script virtual-details \n   \n So when you list it, it should look something like below, \n   \n [admin@labltm:Active:Standalone] ~ # tmsh list cli script virtual-details\ncli script virtual-details {\nproc script::run {} {\n  puts \"Virtual Server,Destination,Pool-Name,Profiles,Rules\"\n  foreach { obj } [tmsh::get_config ltm virtual all-properties] {\n    set profiles [tmsh::get_field_value $obj \"profiles\"]\n    set remprof [regsub -all {\\n} [regsub -all \"  context\" [join $profiles \"\\n\"] \"context\"] \" \"]\n    set profilelist [regsub -all \"profiles \" $remprof \"\"]\n    puts \"[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],[tmsh::get_field_value $obj \"pool\"],$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n  }\n}\n  total-signing-status not-all-signed\n}\n[admin@labltm:Active:Standalone] ~ # \n   \n   \n And you can run the script like below, \n tmsh run cli script virtual-details > /var/tmp/virtual-details.csv \n   \n And get the output from the saved file, \n cat /var/tmp/virtual-details.csv \n   \n Old Codes: \n cli script virtual-details {\nproc script::run {} {\n puts \"Virtual Server,Destination,Pool-Name,Profiles,Rules\"\n foreach { obj } [tmsh::get_config ltm virtual all-properties] {\n set profiles [tmsh::get_field_value $obj \"profiles\"]\n set remprof [regsub -all {\\n} [regsub -all \" context\" [join $profiles \"\\n\"] \"context\"] \" \"]\n set profilelist [regsub -all \"profiles \" $remprof \"\"]\n puts \"[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],[tmsh::get_field_value $obj \"pool\"],$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n }\n}\n total-signing-status not-all-signed\n}\n\n###===================================================\n###2.0\n###UPDATED CODE BELOW\n### DO NOT MIX ABOVE CODE & BELOW CODE TOGETHER\n###===================================================\n\ncli script virtual-details {\nproc script::run {} {\n puts \"Virtual Server,Destination,Pool-Name,Pool-Members,Profiles,Rules\"\n foreach { obj } [tmsh::get_config ltm virtual all-properties] {\n set poolname [tmsh::get_field_value $obj \"pool\"]\n set profiles [tmsh::get_field_value $obj \"profiles\"]\n set remprof [regsub -all {\\n} [regsub -all \" context\" [join $profiles \"\\n\"] \"context\"] \" \"]\n set profilelist [regsub -all \"profiles \" $remprof \"\"]\n if { $poolname != \"none\" }{\n set poolconfig [tmsh::get_config /ltm pool $poolname]\n foreach poolinfo $poolconfig {\n if { [catch { set member_name [tmsh::get_field_value $poolinfo \"members\" ]} err] } {\n set pool_member $err\n puts \"[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n } else {\n set pool_member \"\"\n set member_name [tmsh::get_field_value $poolinfo \"members\" ]\n foreach member $member_name {\n append pool_member \"[lindex $member 1] \"\n }\n puts \"[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n }\n }\n } else {\n puts \"[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,none,$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n }\n }\n}\n total-signing-status not-all-signed\n}\n\n\n###===================================================\n### Version 3.0\n### UPDATED CODE BELOW FOR MULTIPLE PARTITION \n### DO NOT MIX ABOVE CODE & BELOW CODE TOGETHER\n###===================================================\ncli script virtual-details {\nproc script::run {} {\n puts \"Partition,Virtual Server,Destination,Pool-Name,Pool-Members,Profiles,Rules\"\n foreach all_partitions [tmsh::get_config auth partition] {\n set partition \"[lindex [split $all_partitions \" \"] 2]\"\n tmsh::cd /$partition\n foreach { obj } [tmsh::get_config ltm virtual all-properties] {\n set poolname [tmsh::get_field_value $obj \"pool\"]\n set profiles [tmsh::get_field_value $obj \"profiles\"]\n set remprof [regsub -all {\\n} [regsub -all \" context\" [join $profiles \"\\n\"] \"context\"] \" \"]\n set profilelist [regsub -all \"profiles \" $remprof \"\"]\n if { $poolname != \"none\" }{\n set poolconfig [tmsh::get_config /ltm pool $poolname]\n foreach poolinfo $poolconfig {\n if { [catch { set member_name [tmsh::get_field_value $poolinfo \"members\" ]} err] } {\n set pool_member $err\n puts \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n } else {\n set pool_member \"\"\n set member_name [tmsh::get_field_value $poolinfo \"members\" ]\n foreach member $member_name {\n append pool_member \"[lindex $member 1] \"\n }\n puts \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n }\n }\n } else {\n puts \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,none,$profilelist,[tmsh::get_field_value $obj \"rules\"]\"\n }\n }\n }\n}\n total-signing-status not-all-signed\n}\n\n###===================================================\n### Version 4.0\n### UPDATED CODE BELOW FOR CAPTURING PERSISTENCE\n### DO NOT MIX ABOVE CODE & BELOW CODE TOGETHER\n###===================================================\ncli script virtual-details {\nproc script::run {} {\n puts \"Partition,Virtual Server,Destination,Pool-Name,Pool-Members,Profiles,Rules,Persist\"\n foreach all_partitions [tmsh::get_config auth partition] {\n set partition \"[lindex [split $all_partitions \" \"] 2]\"\n tmsh::cd /$partition\n foreach { obj } [tmsh::get_config ltm virtual all-properties] {\n set poolname [tmsh::get_field_value $obj \"pool\"]\n set profiles [tmsh::get_field_value $obj \"profiles\"]\n set remprof [regsub -all {\\n} [regsub -all \" context\" [join $profiles \"\\n\"] \"context\"] \" \"]\n set profilelist [regsub -all \"profiles \" $remprof \"\"]\n\t\t\tset persist [lindex [lindex [tmsh::get_field_value $obj \"persist\"] 0] 1]\n\t\t\tif { $poolname != \"none\" }{\n set poolconfig [tmsh::get_config /ltm pool $poolname]\n foreach poolinfo $poolconfig {\n if { [catch { set member_name [tmsh::get_field_value $poolinfo \"members\" ]} err] } {\n set pool_member $err\n puts \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist\"\n } else {\n set pool_member \"\"\n set member_name [tmsh::get_field_value $poolinfo \"members\" ]\n foreach member $member_name {\n append pool_member \"[lindex $member 1] \"\n }\n puts \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist\"\n }\n }\n } else {\n puts \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,none,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist\"\n }\n }\n }\n}\n total-signing-status not-all-signed\n}\n\n###===================================================\n### 5.0\n### UPDATED CODE BELOW\n### DO NOT MIX ABOVE CODE & BELOW CODE TOGETHER\n###===================================================\ncli script virtual-details {\nproc script::run {} {\nputs \"Partition,Virtual Server,Destination,Pool-Name,Pool-Members,Profiles,Rules,Persist,Status,State\"\nforeach all_partitions [tmsh::get_config auth partition] {\nset partition \"[lindex [split $all_partitions \" \"] 2]\"\ntmsh::cd /$partition\nforeach { obj } [tmsh::get_config ltm virtual all-properties] {\nforeach { status } [tmsh::get_status ltm virtual [tmsh::get_name $obj]] {\nset vipstatus [tmsh::get_field_value $status \"status.availability-state\"]\nset vipstate [tmsh::get_field_value $status \"status.enabled-state\"]\n}\nset poolname [tmsh::get_field_value $obj \"pool\"]\nset profiles [tmsh::get_field_value $obj \"profiles\"]\nset remprof [regsub -all {\\n} [regsub -all \" context\" [join $profiles \"\\n\"] \"context\"] \" \"]\nset profilelist [regsub -all \"profiles \" $remprof \"\"]\nset persist [lindex [lindex [tmsh::get_field_value $obj \"persist\"] 0] 1]\nif { $poolname != \"none\" }{\nset poolconfig [tmsh::get_config /ltm pool $poolname]\nforeach poolinfo $poolconfig {\nif { [catch { set member_name [tmsh::get_field_value $poolinfo \"members\" ]} err] } {\nset pool_member $err\nputs \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist,$vipstatus,$vipstate\"\n} else {\nset pool_member \"\"\nset member_name [tmsh::get_field_value $poolinfo \"members\" ]\nforeach member $member_name {\nappend pool_member \"[lindex $member 1] \"\n}\nputs \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist,$vipstatus,$vipstate\"\n}\n}\n} else {\nputs \"$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,none,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist,$vipstatus,$vipstate\"\n}\n}\n}\n}\ntotal-signing-status not-all-signed\n} \n Latest Code: \n   \n cli script virtual-details {\nproc script::run {} {\nset hostconf [tmsh::get_config /sys global-settings hostname]\nset hostname [tmsh::get_field_value [lindex $hostconf 0] hostname]\nputs \"Hostname,Partition,Virtual Server,Destination,Pool-Name,Pool-Status,Pool-Members,Profiles,Rules,Persist,Status,State,Total-Conn,Current-Conn\"\nforeach all_partitions [tmsh::get_config auth partition] {\nset partition \"[lindex [split $all_partitions \" \"] 2]\"\ntmsh::cd /$partition\nforeach { obj } [tmsh::get_config ltm virtual all-properties] {\nforeach { status } [tmsh::get_status ltm virtual [tmsh::get_name $obj]] {\nset vipstatus [tmsh::get_field_value $status \"status.availability-state\"]\nset vipstate [tmsh::get_field_value $status \"status.enabled-state\"]\nset total_conn [tmsh::get_field_value $status \"clientside.tot-conns\"]\nset curr_conn [tmsh::get_field_value $status \"clientside.cur-conns\"]\n}\nset poolname [tmsh::get_field_value $obj \"pool\"]\nset profiles [tmsh::get_field_value $obj \"profiles\"]\nset remprof [regsub -all {\\n} [regsub -all \" context\" [join $profiles \"\\n\"] \"context\"] \" \"]\nset profilelist [regsub -all \"profiles \" $remprof \"\"]\nset persist [lindex [lindex [tmsh::get_field_value $obj \"persist\"] 0] 1]\nif { $poolname != \"none\" }{\nforeach { p_status } [tmsh::get_status ltm pool $poolname] {\nset pool_status [tmsh::get_field_value $p_status \"status.availability-state\"]\n}\nset poolconfig [tmsh::get_config /ltm pool $poolname]\nforeach poolinfo $poolconfig {\nif { [catch { set member_name [tmsh::get_field_value $poolinfo \"members\" ]} err] } {\nset pool_member $err\nputs \"$hostname,$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_status,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist,$vipstatus,$vipstate,$total_conn,$curr_conn\"\n} else {\nset pool_member \"\"\nset member_name [tmsh::get_field_value $poolinfo \"members\" ]\nforeach member $member_name {\nappend pool_member \"[lindex $member 1] \"\n}\nputs \"$hostname,$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,$pool_status,$pool_member,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist,$vipstatus,$vipstate,$total_conn,$curr_conn\"\n}\n}\n} else {\nputs \"$hostname,$partition,[tmsh::get_name $obj],[tmsh::get_field_value $obj \"destination\"],$poolname,none,none,$profilelist,[tmsh::get_field_value $obj \"rules\"],$persist,$vipstatus,$vipstate,$total_conn,$curr_conn\"\n}\n}\n}\n}\n} \n   \n   \n Tested this on version: \n 13.0 \n \n   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"14308","kudosSumWeight":9,"repliesCount":26,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODE5ODMtMTUyOTZpODJCODQ1MUI3RThBNzExNw?revision=4\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODE5ODMtMTA4NDFpRDgyNDhCQjk3MTU5NkYyRQ?revision=4\"}"}}],"totalCount":2,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:298680":{"__typename":"Conversation","id":"conversation:298680","topic":{"__typename":"TkbTopicMessage","uid":298680},"lastPostingActivityTime":"2025-01-16T23:10:50.982-08:00","solved":false},"User:user:126518":{"__typename":"User","uid":126518,"login":"Juergen_Mang","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xMjY1MTgtbDFwdUZs?image-coordinates=19%2C0%2C1004%2C984"},"id":"user:126518"},"TkbTopicMessage:message:298680":{"__typename":"TkbTopicMessage","subject":"Decrypting TLS with the tcpdump sslprovider","conversation":{"__ref":"Conversation:conversation:298680"},"id":"message:298680","revisionNum":1,"uid":298680,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:126518"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1364},"postTime":"2022-07-20T12:18:55.547-07:00","lastPublishTime":"2022-07-20T12:18:55.547-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" I will share my script to decrypt TLS on the F5 v15+. You do not need to change any TLS oder cipher settings, have access to private keys or add special iRules. It should work out of the box with all TLS versions. It uses the information that the tcpdump sslprovider from F5 writes into the dump. The script itself and the usage is documented in the GitHub repository. https://github.com/JuergenMang/f5-tls-decrypt Feel free to propose enhancements to the documentation or script itself. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"495","kudosSumWeight":4,"repliesCount":2,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:306690":{"__typename":"Conversation","id":"conversation:306690","topic":{"__typename":"TkbTopicMessage","uid":306690},"lastPostingActivityTime":"2025-01-16T04:16:36.835-08:00","solved":false},"User:user:16006":{"__typename":"User","uid":16006,"login":"xuwen","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xNjAwNi0yMTc2MGlGMjI4NUU0RTUxNjQ1RUJD"},"id":"user:16006"},"TkbTopicMessage:message:306690":{"__typename":"TkbTopicMessage","subject":"GTM type A and AAAA wideip NetworkMap to generate a json with python f5-sdk","conversation":{"__ref":"Conversation:conversation:306690"},"id":"message:306690","revisionNum":4,"uid":306690,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:16006"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2274},"postTime":"2022-12-16T05:36:31.249-08:00","lastPublishTime":"2022-12-18T18:32:55.237-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Code is community submitted, community supported, and recognized as ‘Use At Your Own Risk’. Short Description GTM type A and AAAA NetworkMap to a json with python f5-sdk, code support check AS3 wideip. test well in BIGIP VE V14.1.5 and V16.1.2, code should work on version V12+ BIGIP Important:  gtm/ltm server name can not contains character \":\" and \"\\\" and \"/\" and gtm server virtual server name(VS NAME) also can not contains character \":\" and \"\\\",  because I use fullPath.split(':')  to read GTM-Server Name and Virtual server name(correct example such as \"fullPath\":\"/Common/DC-2-GTM-ipv4:/Common/vs_cmcc_99_22\" ) otherwise it will raise HTTP 404, below is the error format example: GTM Server name ZSCTEST:DC-1-LTM-ZSC-ipv4 GTM Server Virtual Server Name(VS NAME) test:vs \"name\":\"ZSCTEST\\\\:DC-1-LTM-ZSC-ipv4:test:vs\",\"partition\":\"Common\",\"fullPath\":\"/Common/ZSCTEST\\\\:DC-1-LTM-ZSC-ipv4:test:vs\" Problem solved by this Code Snippet collect GTM type A and AAAA data and generate a json file How to use this Code Snippet Firstly, install python f5 sdk pip install f5-sdk Secondly, modify the following IP, account and password corresponding to your BIGIP GTM device           mgmt = ManagementRoot('192.168.5.109', 'admin', 'xt32112300')           python f5-sdk send a GET request to GTM in the form of  ~partition~name, but the format of the GET request for the AS3 published wideip should be ~partition~Folder~name, so when retrieving the AS3 published wideip, the URL constructed will report HTTP 404. After reading the error source code  sitepackages\\icontrol\\session.py There is a function def _ validate_ name_ partition_ Subpath (element):           def _validate_name_partition_subpath(element):\n # '/' and '~' are illegal characters in most cases, however there are\n # few exceptions (GTM Regions endpoint being one of them where the\n # validation of name should not apply.\n \"\"\"\n if '~' in element:\n error_message =\\\n \"instance names and partitions cannot contain '~', but it's: %s\"\\\n % element\n raise InvalidInstanceNameOrFolder(error_message)\n \"\"\"           the determination of whether the name carries the character ~ will cause the structure of AS3 name=i.subPath + '~' + i.name doesn't work. so, delete the judgment of  ~  or use \"\"\" \"\"\" notes code will support AS3 wideip check Finally, if the code runs no error, it will generate a \"F5-GTM-Wideip-XXX(date format)-NetworkMap.json\" file in your local working directory Code Snippet Meta Information Version: 1.0 Coding Language: python Full Code Snippet           from f5.bigip import ManagementRoot\nimport json\nimport time\n\nwideip_NetworkMap = {}\nmgmt = ManagementRoot('192.168.5.109', 'admin', 'xt32112300')\ngtm_wideip = []\n\"\"\"\nauthor: xuwen\nemail: 1099061067@qq.com\ndate: 2022/12/16\n\"\"\"\n# GTM A Wideip\nfor i in mgmt.tm.gtm.wideips.a_s.get_collection():\n try:\n type_A_wideip = mgmt.tm.gtm.wideips.a_s.a.load(name=i.subPath + '~' + i.name if hasattr(i, 'subPath') else i.name, partition=i.partition)\n except Exception as e:\n print('type A widip name {} error msg is '.format(i.name) + str(e))\n else:\n gtm_A_wideip = {}\n type_A_wideip_name = i.name\n type_A_wideip_partition = i.partition\n if hasattr(type_A_wideip, 'aliases'):\n gtm_A_wideip['aliases'] = type_A_wideip.aliases\n\n if hasattr(type_A_wideip, 'rules'):\n gtm_A_wideip['iRules'] = type_A_wideip.rules\n\n if hasattr(type_A_wideip, 'enabled'):\n gtm_A_wideip['enabled'] = True\n else:\n gtm_A_wideip['disabled'] = True\n if hasattr(type_A_wideip, 'subPath'):\n gtm_A_wideip['subPath'] = type_A_wideip.subPath\n\n gtm_A_wideip.update(name=type_A_wideip_name, partition=type_A_wideip_partition, wideip_type='A',\n poolLbMode=type_A_wideip.poolLbMode, persistence=type_A_wideip.persistence,\n lastResortPool=type_A_wideip.lastResortPool, fullPath=type_A_wideip.fullPath)\n # print(gtm_A_wideip)\n if hasattr(type_A_wideip, 'pools'):\n gtm_A_wideip['pools'] = []\n for pool_name in type_A_wideip.pools:\n gtm_A_pool = {}\n # gtm_A_pool_name = pool_name['name']\n gtm_A_pool['name'] = pool_name['name']\n gtm_A_pool['partition'] = pool_name['partition']\n gtm_A_pool['type'] = 'A'\n gtm_A_pool['order'] = pool_name['order']\n gtm_A_pool['ratio'] = pool_name['ratio']\n if 'subPath' in pool_name.keys():\n gtm_A_pool['subPath'] = pool_name['subPath']\n gslb_A_pool = mgmt.tm.gtm.pools.a_s.a.load(name=pool_name['subPath'] + '~' + pool_name['name'], partition=pool_name['partition'])\n # gslb_A_pool = mgmt.tm.gtm.pools.a_s.a.load(name=pool_name['subPath'] + '~' + pool_name['name'] if 'subPath' in pool_name.keys() else pool_name['name'], partition=pool_name['partition'])\n else:\n gslb_A_pool = mgmt.tm.gtm.pools.a_s.a.load(name=pool_name['name'], partition=pool_name['partition'])\n gtm_A_pool['fullPath'] = gslb_A_pool.fullPath\n gtm_A_pool['ttl'] = gslb_A_pool.ttl\n gtm_A_pool['loadBalancingMode'] = gslb_A_pool.loadBalancingMode\n gtm_A_pool['alternateMode'] = gslb_A_pool.alternateMode\n gtm_A_pool['fallbackMode'] = gslb_A_pool.fallbackMode\n gtm_A_pool['fallbackIp'] = gslb_A_pool.fallbackIp\n gtm_A_pool['Members'] = []\n\n # gslb_pool_members_vs_name_list = [str(mem.raw) for mem in gslb_A_pool.members_s.get_collection()]\n gslb_pool_members_vs_fullPath_list = [(mem.memberOrder, mem.fullPath, mem.ratio) for mem in\n gslb_A_pool.members_s.get_collection()]\n for pool_memberOrder, pool_member_fullPath, pool_member_ratio in gslb_pool_members_vs_fullPath_list:\n # print(pool_member_fullPath)\n # \"fullPath\":\"/Common/DC-2-GTM-ipv4:/Common/vs_cmcc_99_22\"\n gtm_server_name = pool_member_fullPath.split(':')[0]\n gtm_pool_members_member_name = pool_member_fullPath.split(':')[1]\n dc_gtm_virtualserver = mgmt.tm.gtm.servers.server.load(name=gtm_server_name.split('/')[2],\n partition=gtm_server_name.split('/')[1])\n\n virtualservers_virtualserver = dc_gtm_virtualserver.virtual_servers_s.virtual_server.load(\n name=gtm_pool_members_member_name\n )\n virtualserver_destination = virtualservers_virtualserver.destination\n virtualserver_Member_Address = virtualserver_destination.split(':')[0]\n virtualserver_Service_Port = virtualserver_destination.split(':')[1]\n gtm_A_pool['Members'].append({\n 'Member': gtm_pool_members_member_name,\n 'Member Order': pool_memberOrder,\n 'ratio': pool_member_ratio,\n 'Member Address': virtualserver_Member_Address,\n 'Service Port': virtualserver_Service_Port,\n 'Translation Address': virtualservers_virtualserver.translationAddress,\n 'Translation Service Port': virtualservers_virtualserver.translationPort\n })\n gtm_A_wideip['pools'].append(gtm_A_pool)\n\n if hasattr(type_A_wideip, 'poolsCname'):\n gtm_A_wideip['poolsCname'] = []\n for pool_name in type_A_wideip.poolsCname:\n gtm_A_cnamepool = {}\n # gtm_A_pool_name = pool_name['name']\n gtm_A_cnamepool['name'] = pool_name['name']\n gtm_A_cnamepool['partition'] = pool_name['partition']\n gtm_A_cnamepool['type'] = 'CNAME'\n gtm_A_cnamepool['order'] = pool_name['order']\n gtm_A_cnamepool['ratio'] = pool_name['ratio']\n if 'subPath' in pool_name.keys():\n gtm_A_cnamepool['subPath'] = pool_name['subPath']\n gslb_A_cnamepool = mgmt.tm.gtm.pools.cnames.cname.load(name=pool_name['subPath'] + '~' + pool_name['name'], partition=pool_name['partition'])\n\n else:\n gslb_A_cnamepool = mgmt.tm.gtm.pools.cnames.cname.load(name=pool_name['name'], partition=pool_name['partition'])\n gtm_A_cnamepool['fullPath'] = gslb_A_cnamepool.fullPath\n gtm_A_cnamepool['ttl'] = gslb_A_cnamepool.ttl\n gtm_A_cnamepool['loadBalancingMode'] = gslb_A_cnamepool.loadBalancingMode\n gtm_A_cnamepool['alternateMode'] = gslb_A_cnamepool.alternateMode\n gtm_A_cnamepool['fallbackMode'] = gslb_A_cnamepool.fallbackMode\n gtm_A_cnamepool['Members'] = []\n gslb_pool_members_domainname_fullPath_list = [(mem.name, mem.memberOrder, mem.fullPath, mem.ratio)\n for mem in gslb_A_cnamepool.members_s.get_collection()]\n for pool_member_name, pool_memberOrder, pool_member_fullPath, pool_member_ratio in gslb_pool_members_domainname_fullPath_list:\n gtm_A_cnamepool['Members'].append({\n 'Member': pool_member_name,\n 'Member Order': pool_memberOrder,\n 'ratio': pool_member_ratio,\n 'fullPath': pool_member_fullPath\n })\n gtm_A_wideip['poolsCname'].append(gtm_A_cnamepool)\n # print(gtm_A_wideip)\n gtm_wideip.append(gtm_A_wideip)\n\n\n# GTM AAAA Wideip\nfor i in mgmt.tm.gtm.wideips.aaaas.get_collection():\n try:\n type_AAAA_wideip = mgmt.tm.gtm.wideips.aaaas.aaaa.load(name=i.subPath + '~' + i.name if hasattr(i, 'subPath') else i.name, partition=i.partition)\n except Exception as e:\n print('type AAAA widip name {} error msg is '.format(i.name) + str(e))\n else:\n gtm_AAAA_wideip = {}\n type_AAAA_wideip_name = i.name\n type_AAAA_wideip_partition = i.partition\n if hasattr(type_AAAA_wideip, 'aliases'):\n gtm_AAAA_wideip['aliases'] = type_AAAA_wideip.aliases\n\n if hasattr(type_AAAA_wideip, 'rules'):\n gtm_AAAA_wideip['iRules'] = type_AAAA_wideip.rules\n\n if hasattr(type_AAAA_wideip, 'enabled'):\n gtm_AAAA_wideip['enabled'] = True\n else:\n gtm_AAAA_wideip['disabled'] = True\n if hasattr(type_AAAA_wideip, 'subPath'):\n gtm_AAAA_wideip['subPath'] = type_AAAA_wideip.subPath\n\n gtm_AAAA_wideip.update(name=type_AAAA_wideip_name, partition=type_AAAA_wideip_partition, wideip_type='AAAA',\n poolLbMode=type_AAAA_wideip.poolLbMode, persistence=type_AAAA_wideip.persistence,\n lastResortPool=type_AAAA_wideip.lastResortPool, fullPath=type_AAAA_wideip.fullPath)\n\n if hasattr(type_AAAA_wideip, 'pools'):\n gtm_AAAA_wideip['pools'] = []\n for pool_name in type_AAAA_wideip.pools:\n gtm_AAAA_pool = {}\n # gtm_A_pool_name = pool_name['name']\n gtm_AAAA_pool['name'] = pool_name['name']\n gtm_AAAA_pool['partition'] = pool_name['partition']\n gtm_AAAA_pool['type'] = 'AAAA'\n gtm_AAAA_pool['order'] = pool_name['order']\n gtm_AAAA_pool['ratio'] = pool_name['ratio']\n if 'subPath' in pool_name.keys():\n gtm_AAAA_pool['subPath'] = pool_name['subPath']\n gslb_AAAA_pool = mgmt.tm.gtm.pools.aaaas.aaaa.load(name=pool_name['subPath'] + '~' + pool_name['name'], partition=pool_name['partition'])\n\n else:\n gslb_AAAA_pool = mgmt.tm.gtm.pools.aaaas.aaaa.load(name=pool_name['name'], partition=pool_name['partition'])\n gtm_AAAA_pool['fullPath'] = gslb_AAAA_pool.fullPath\n gtm_AAAA_pool['ttl'] = gslb_AAAA_pool.ttl\n gtm_AAAA_pool['loadBalancingMode'] = gslb_AAAA_pool.loadBalancingMode\n gtm_AAAA_pool['alternateMode'] = gslb_AAAA_pool.alternateMode\n gtm_AAAA_pool['fallbackMode'] = gslb_AAAA_pool.fallbackMode\n gtm_AAAA_pool['fallbackIp'] = gslb_AAAA_pool.fallbackIp\n gtm_AAAA_pool['Members'] = []\n\n # gslb_pool_members_vs_name_list = [str(mem.raw) for mem in gslb_A_pool.members_s.get_collection()]\n gslb_pool_members_vs_fullPath_list = [(mem.memberOrder, mem.fullPath, mem.ratio) for mem in\n gslb_AAAA_pool.members_s.get_collection()]\n for pool_memberOrder, pool_member_fullPath, pool_member_ratio in gslb_pool_members_vs_fullPath_list:\n # print(pool_member_fullPath)\n # \"fullPath\":\"/Common/DC-2-GTM-ipv4:/Common/vs_cmcc_99_22\"\n gtm_server_name = pool_member_fullPath.split(':')[0]\n gtm_pool_members_member_name = pool_member_fullPath.split(':')[1]\n dc_gtm_virtualserver = mgmt.tm.gtm.servers.server.load(name=gtm_server_name.split('/')[2],\n partition=gtm_server_name.split('/')[1])\n\n virtualservers_virtualserver = dc_gtm_virtualserver.virtual_servers_s.virtual_server.load(\n name=gtm_pool_members_member_name\n )\n virtualserver_destination = virtualservers_virtualserver.destination\n virtualserver_Member_Address = virtualserver_destination.split('.')[0]\n virtualserver_Service_Port = virtualserver_destination.split('.')[1]\n gtm_AAAA_pool['Members'].append({\n 'Member': gtm_pool_members_member_name,\n 'Member Order': pool_memberOrder,\n 'ratio': pool_member_ratio,\n 'Member Address': virtualserver_Member_Address,\n 'Service Port': virtualserver_Service_Port,\n 'Translation Address': virtualservers_virtualserver.translationAddress,\n 'Translation Service Port': virtualservers_virtualserver.translationPort\n })\n gtm_AAAA_wideip['pools'].append(gtm_AAAA_pool)\n\n if hasattr(type_AAAA_wideip, 'poolsCname'):\n gtm_AAAA_wideip['poolsCname'] = []\n for pool_name in type_AAAA_wideip.poolsCname:\n gtm_AAAA_cnamepool = {}\n\n gtm_AAAA_cnamepool['name'] = pool_name['name']\n gtm_AAAA_cnamepool['partition'] = pool_name['partition']\n gtm_AAAA_cnamepool['type'] = 'CNAME'\n gtm_AAAA_cnamepool['order'] = pool_name['order']\n gtm_AAAA_cnamepool['ratio'] = pool_name['ratio']\n if 'subPath' in pool_name.keys():\n gtm_AAAA_cnamepool['subPath'] = pool_name['subPath']\n gslb_AAAA_cnamepool = mgmt.tm.gtm.pools.cnames.cname.load(name=pool_name['subPath'] + '~' + pool_name['name'], partition=pool_name['partition'])\n\n else:\n gslb_AAAA_cnamepool = mgmt.tm.gtm.pools.cnames.cname.load(name=pool_name['name'], partition=pool_name['partition'])\n gtm_AAAA_cnamepool['fullPath'] = gslb_AAAA_cnamepool.fullPath\n gtm_AAAA_cnamepool['ttl'] = gslb_AAAA_cnamepool.ttl\n gtm_AAAA_cnamepool['loadBalancingMode'] = gslb_AAAA_cnamepool.loadBalancingMode\n gtm_AAAA_cnamepool['alternateMode'] = gslb_AAAA_cnamepool.alternateMode\n gtm_AAAA_cnamepool['fallbackMode'] = gslb_AAAA_cnamepool.fallbackMode\n gtm_AAAA_cnamepool['Members'] = []\n gslb_pool_members_domainname_fullPath_list = [(mem.name, mem.memberOrder, mem.fullPath, mem.ratio)\n for mem in gslb_AAAA_cnamepool.members_s.get_collection()]\n for pool_member_name, pool_memberOrder, pool_member_fullPath, pool_member_ratio in gslb_pool_members_domainname_fullPath_list:\n gtm_AAAA_cnamepool['Members'].append({\n 'Member': pool_member_name,\n 'Member Order': pool_memberOrder,\n 'ratio': pool_member_ratio,\n 'fullPath': pool_member_fullPath\n })\n gtm_AAAA_wideip['poolsCname'].append(gtm_AAAA_cnamepool)\n # print(gtm_AAAA_wideip)\n gtm_wideip.append(gtm_AAAA_wideip)\n\n\ngtm_networkmap = {}\ngtm_networkmap.update(wideips=gtm_wideip)\nprint(gtm_networkmap)\n\nwith open(r\"./F5-GTM-Wideip-{}-NetworkMap.json\".format(time.strftime(\"%Y-%m-%d\", time.localtime())), \"w\") as f:\n f.write(json.dumps(gtm_networkmap, indent=4, ensure_ascii=False))             ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"17554","kudosSumWeight":2,"repliesCount":7,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:288887":{"__typename":"Conversation","id":"conversation:288887","topic":{"__typename":"TkbTopicMessage","uid":288887},"lastPostingActivityTime":"2025-01-09T05:35:13.957-08:00","solved":false},"User:user:172159":{"__typename":"User","uid":172159,"login":"Leon_Seng","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xNzIxNTktMjA5NDNpQTcyQThGQzE5NUQ0MzZFMg"},"id":"user:172159"},"TkbTopicMessage:message:288887":{"__typename":"TkbTopicMessage","subject":"TACACS+ External Monitor (Python)","conversation":{"__ref":"Conversation:conversation:288887"},"id":"message:288887","revisionNum":2,"uid":288887,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:172159"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1264},"postTime":"2021-09-15T16:22:58.000-07:00","lastPublishTime":"2025-01-09T05:35:13.957-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n This script is an external monitor for TACACS+ that simulates a TACACS+ client authenticating a test user, and marks the status of a pool member as up if the authentication is successful. If the connection is down/times out, or the authentication fails due to invalid account settings, the script marks the pool member status as down. \n   \n This is heavily inspired by the Radius External Monitor (Python) by AlanTen. \n How to use this snippet: \n Prerequisite \n \n This script uses the TACACS+ Python client by Ansible (tested on version 2.6). \n \n \n Create the directory /config/eav/tacacs_plus on BIG-IP \n Copy all contents from tacacs_plus package into /config/eav/tacacs_plus. \n \n \n You may also need to download six.py from https://raw.githubusercontent.com/benjaminp/six/master/six.py and place it in /config/eav/tacacs_plus. \n You will need to have a test account provisioned on the TACACS+ server for the script to perform authentication. \n \n   \n Installation \n On BIG-IP, import the code snippet below as an External Monitor Program File. \n   \n Monitor Configuration \n Set up an External monitor with the imported file, and configure it with the following environment variables: \n   \n KEY: TACACS+ server secret \n USER: Username for test account \n PASSWORD: Password for test account \n MOD_PATH: Path to location of Python package tacacs_plus, default: /config/eav \n TIMEOUT: Duration to wait for connectivity to TACACS server to be established, default: 3 \n   \n Troubleshooting \n SSH to BIG-IP and run the script locally \n $ cd /config/filestore/files_d/Common_d/external_monitor_d/\n\n# Get name of uploaded file, e.g.:\n$ ls -la\n...\n-rwxr-xr-x. 1 tomcat tomcat 1883 2021-09-17 04:05 :Common:tacacs-monitor_39568_7\n\n# Run the script with the corresponding variables\n$ KEY=<my_tacacs_key> USER=<testuser> PASSWORD=<supersecure> python <external program file, e.g.:Common:tacacs-monitor_39568_7> <TACACS+ server IP> <TACACS+ server port>\n \n   \n Code : \n #!/usr/bin/env python\n#\n# Filename : tacacs_plus_mon.py\n# Author : Leon Seng\n# Version : 1.2\n# Date : 2021/09/21\n# Python ver: 2.6+\n# F5 version: 12.1+\n# \n# ========== Installation\n# Import this script via GUI:\n# System > File Management > External Monitor Program File List > Import...\n# Name it however you want.\n# Get, modify and copy the following modules:\n\n# ========== Required modules\n# -- six --\n# https://pypi.org/project/six/\n# Copy six.py into /config/eav\n#\n# -- tacacs_plus --\n# https://pypi.org/project/tacacs_plus/ | https://github.com/ansible/tacacs_plus\n# Copy tacacs_plus directory into /config/eav\n\n# ========== Environment Variables\n# NODE_IP - Supplied by F5 monitor as first argument\n# NODE_PORT - Supplied by F5 monitor as second argument\n# KEY - TACACS+ server secret\n# USER - Username for test account\n# PASSWORD - Password for test account\n# MOD_PATH - Path to location of Python package tacacs_plus, default: /config/eav\n# TIMEOUT - Duration to wait for connectivity to TACACS server to be established, default: 3\n\nimport os\nimport socket\nimport sys\n\nif os.environ.get('MOD_PATH'):\n sys.path.append(os.environ.get('MOD_PATH'))\nelse:\n sys.path.append('/config/eav')\n\n# https://github.com/ansible/tacacs_plus\nfrom tacacs_plus.client import TACACSClient\n\nnode_ip = sys.argv[1]\nnode_port = int(sys.argv[2])\nkey = os.environ.get(\"KEY\")\nuser = os.environ.get(\"USER\")\npassword = os.environ.get(\"PASSWORD\")\ntimeout = int(os.environ.get(\"TIMEOUT\", 3))\n\n# Determine if node IP is IPv4 or IPv6\nfamily = None\ntry:\n socket.inet_pton(socket.AF_INET, node_ip)\n family = socket.AF_INET\nexcept socket.error: # not a valid address\n try:\n socket.inet_pton(socket.AF_INET6, node_ip)\n family = socket.AF_INET6\n except socket.error:\n sys.exit(1)\n\n# Authenticate against TACACS server\nclient = TACACSClient(node_ip, node_port, key, timeout=timeout, family=family)\ntry:\n auth = client.authenticate(user, password)\n if auth.valid:\n print \"up\"\nexcept socket.error:\n # EAV script marks node as DOWN when no output is present\n pass \n Tested this on version: \n 12.1 ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4351","kudosSumWeight":1,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:275325":{"__typename":"Conversation","id":"conversation:275325","topic":{"__typename":"TkbTopicMessage","uid":275325},"lastPostingActivityTime":"2024-12-20T07:02:18.606-08:00","solved":false},"User:user:267334":{"__typename":"User","uid":267334,"login":"alankila_3017","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-9.svg?time=0"},"id":"user:267334"},"TkbTopicMessage:message:275325":{"__typename":"TkbTopicMessage","subject":"Request Client Certificate And Pass To Application","conversation":{"__ref":"Conversation:conversation:275325"},"id":"message:275325","revisionNum":1,"uid":275325,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:267334"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1737},"postTime":"2015-03-18T14:46:30.000-07:00","lastPublishTime":"2015-03-18T14:46:30.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: We are using BigIP to dynamically request a client certificate. This example differs from the others available in that it actually passes the x509 certificate to the server for processing using a custom http header. \n The sequence of event listeners required to accomplish this feat is: HTTP_REQUEST, which invokes CLIENTSSL_HANDSHAKE, which is followed by HTTP_REQUEST_SEND \n The reason is that CLIENTSSL_HANDSHAKE occurs after HTTP_REQUEST event is processed entirely, but HTTP_REQUEST_SEND occurs after it. The certificate appears in PEM encoding and is slightly mangled; you need to emit newlines to get back into proper PEM format: \n -----BEGIN CERTIFICATE------\nMabcdefghj...\n-----END CERTIFICATE-----\n \n This certificate can be converted to DER encoding by jettisoning the BEGIN and END markers and doing base64 decode on the string. Code : # Initialize the variables on new client tcp session.\nwhen CLIENT_ACCEPTED {\n set collecting 0\n set renegtried 0\n}\n\n# Runs for each new http request\nwhen HTTP_REQUEST {\n # /_hst name and ?_hst=1 parameter triggers client cert renegotiation\n if { $renegtried == 0\n and [SSL::cert count] == 0\n and ([HTTP::uri] matches_regex {^[^?]*/_hst(\\?|/|$)} \n or [HTTP::uri] matches_regex {[?&]_hst=1(&|$)}) } {\n\n# Collecting means buffering the request. The collection goes on\n# until SSL::renegotiate occurs, which happens after the HTTP\n# request has been received. The maximum data buffered by collect\n# is 1-4 MB.\nHTTP::collect\n set collecting 1\n SSL::cert mode request\n SSL::renegotiate\n }\n}\n\n# After a handshake, we log that we have tried it. This is to prevent\n# constant attempts to renegotiate the SSL session. I'm not sure of this\n# feature; this may in fact be a mistake, but we can change it at any time.\n# It is transparent if we do: the connections only work slower. It would,\n# however, make BigIP detect inserted smartcards immediately. Right answer\n# depends on the way the feature is used by applications.\nwhen CLIENTSSL_HANDSHAKE {\n if { $collecting == 1 } {\n set renegtried 1\n# Release allows the request processing to occur normally from this\n# point forwards. The next event to fire is HTTP_REQUEST_SEND.\nHTTP::release\n }\n}\n\n# Inject headers based on earlier renegotiations, if any.\nwhen HTTP_REQUEST_SEND {\n clientside {\n# Security: reject any user-submitted headers by our magic names.\nHTTP::header remove \"X-ENV-SSL_CLIENT_CERTIFICATE\"\nHTTP::header remove \"X-ENV-SSL_CLIENT_CERTIFICATE_FAILED\"\n\n# if certificate is available, send it. Otherwise, send a header\n# indicating a failure, if we have already attempted a renegotiate.\nif { [SSL::cert count] > 0 } {\n HTTP::header insert \"X-ENV-SSL_CLIENT_CERTIFICATE\" [X509::whole [SSL::cert 0]]\n} elseif { $renegtried == 1 } {\n # This header has some debug value: if the FAILED header is not\n # present, BigIP is probably not configured to do client certs\n # at all.\n HTTP::header insert \"X-ENV-SSL_CLIENT_CERTIFICATE_FAILED\" \"true\"\n}\n }\n} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3091","kudosSumWeight":1,"repliesCount":3,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/community/Navbar-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1743097588000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","Common-external-link":"How Do I...?","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1743097588000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1743097588000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1743097588000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1743097588000","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-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1743097588000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1743097588000","value":{"success.follow.title":"Following Tag","success.unfollow.title":"Unfollowed Tag","success.follow.message.followAcrossCommunity":"You will be notified when this tag is used anywhere across the community","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1743097588000","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1743097588000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1743097588000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1743097588000","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1743097588000","value":{"bylineAuthor":"{bylineAuthor}","bylineBoard":"{bylineBoard}","anonymous":"Anonymous","place":"Place {bylineBoard}","gotoParent":"Go to parent {name}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097588000","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1743097588000","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/users/UserLink-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1743097588000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1743097588000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1743097588000","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/MessageTime-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1743097588000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1743097588000","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1743097588000","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1743097588000","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1743097588000","value":{"textTitle":"{count, plural,one {{messageType, select, IDEA{Vote} other{Like}}} other{{messageType, select, IDEA{Votes} other{Likes}}}}","likes":"{count, plural, one{like} other{likes}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1743097588000","value":{"textTitle":"{count, plural,one {{conversationStyle, select, IDEA{Comment} OCCASION{Comment} other{Reply}}} other{{conversationStyle, select, IDEA{Comments} OCCASION{Comments} other{Replies}}}}","comments":"{count, plural, one{Comment} other{Comments}}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1743097588000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1743097588000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"nodeId":"board:codeshare","tagName":"application delivery"},"buildId":"q_bLpq2mflH0BeZigxpj6","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.2.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/ListGroup/ListGroup.tsx","./components/messages/MessageView/MessageView.tsx","./components/messages/MessageView/MessageViewInline/MessageViewInline.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[]}