"}},"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/bash\"}}})":{"__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/bash\"}}})":{"__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\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageListTabs\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageListTabs-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1744046271000"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"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","es-ES"]},"repliesSortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT","localValue":"DEFAULT","possibleValues":["DEFAULT","LIKES","PUBLISH_TIME","REVERSE_PUBLISH_TIME"]}},"deleted":false},"CachedAsset:pages-1744704714440":{"__typename":"CachedAsset","id":"pages-1744704714440","value":[{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"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":1744704714440,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1744704714440,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}","userBanned":"We're sorry, but you have been banned from using this site.","userBannedReason":"You have been banned for the following reason: {reason}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:theme:customTheme1-1744704761434":{"__typename":"CachedAsset","id":"theme:customTheme1-1744704761434","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","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1744046271000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1744046271000","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}},"theme":{"__ref":"Theme:customTheme1"},"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-1744704712036":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:board:codeshare-1744704712036","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:1744732623810":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1744732623810","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1744046271000","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-us-1744704730983":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-us-1744704730983","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-us-1744704730983":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-us-1744704730983","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-us-1744704730983":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-us-1744704730983","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-us-1744704730983":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-us-1744704730983","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1744046271000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1744046271000","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1744046271000","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: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":307},"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":"MjUuM3wyLjF8b3wyNXxfTlZffDE","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:328335":{"__typename":"Conversation","id":"conversation:328335","topic":{"__typename":"TkbTopicMessage","uid":328335},"lastPostingActivityTime":"2024-03-08T14:52:20.339-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:328335":{"__typename":"TkbTopicMessage","subject":"List BIG-IP Next Instance Backups on Central Manager","conversation":{"__ref":"Conversation:conversation:328335"},"id":"message:328335","revisionNum":2,"uid":328335,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:51154"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":133},"postTime":"2024-03-07T16:04:06.872-08:00","lastPublishTime":"2024-03-08T14:52:20.339-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" In the Central Manager GUI, you can create/schedule BIG-IP Next Instance backups, but outside of the listing shown there, you can't download the files from that view if you want to archive them for off-box requirements. Finding them in the Central Manager command line to download them via secure copy (scp) requires some kubernetes-fu knowhow, mainly, interrogating the persistent volume claims and persistent volumes: \n \n kubectl get pvc mbiq-local-storage-pv-claim -o yaml | grep volumeName \n kubectl get pv <volumename result> -o yaml | grep \"path: \" \n \n This script takes the guesswork out of all that and let's you focus on more important things. Example output: \n admin@cm1:~$ ./lbu.sh\n\nBackup path: /var/lib/rancher/k3s/storage/pvc-ae75faee-101e-49eb-89f7-b66542da1281_default_mbiq-local-storage-pv-claim/backup\n\ntotal 3860\n 4 drwxrwxrwx 2 root root 4096 Mar 7 19:33 .\n 4 drwxrwxrwx 7 root root 4096 Feb 2 00:01 ..\n1780 -rw-r--r-- 1 ubuntu lxd 1821728 Feb 28 18:40 3b9ef4d8-0f0b-453d-b350-c8720a30db16.2024-02-28.18-39-59.backup.tar.gz\n 288 -rw-r--r-- 1 ubuntu lxd 292464 Feb 28 18:39 7bf4e3ac-e8a2-44a3-bead-08be6c590071.2024-02-28.18-39-15.backup.tar.gz\n1784 -rw-r--r-- 1 ubuntu lxd 1825088 Mar 7 19:33 7bf4e3ac-e8a2-44a3-bead-08be6c590071.2024-03-07.19-32-56.backup.tar.gz \n \n Script Source ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1339","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:290663":{"__typename":"Conversation","id":"conversation:290663","topic":{"__typename":"TkbTopicMessage","uid":290663},"lastPostingActivityTime":"2023-06-05T22:51:21.972-07:00","solved":false},"User:user:309135":{"__typename":"User","uid":309135,"login":"Vijay_E","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:309135"},"TkbTopicMessage:message:290663":{"__typename":"TkbTopicMessage","subject":"F5 Automation - TCL & Bash","conversation":{"__ref":"Conversation:conversation:290663"},"id":"message:290663","revisionNum":2,"uid":290663,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:309135"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1962},"postTime":"2016-06-27T17:19:39.000-07:00","lastPublishTime":"2023-06-05T22:51:21.972-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This is a really simple way to automate CLI command execution on multiple F5 devices using Bash & TCL scripting. How to use this snippet: On a linux machine that is utilized to connect to the F5 device: \n Create a directory \n mkdir F5_Check \n Within the \"F5_Check\" directory, create the following 3 files: \n F5_Host.txt (This file contains F5's IP address) \n F5_Bash_v1 (This is the bash script used to collect username/password for F5) \n F5_Out_v1.exp (This is the TCL script executes the relevant commands on F5) \n Explanation of the 3 files: \n File Content: F5_Out_v1.exp is provided as code share. This is the main TCL script that is utiliezd to execute CLI commands on multiple F5 devices. \n File Content: F5_Bash_v1 \n #!/bin/bash\n# Collect the username and password for F5 access\necho -n \"Enter the username \"\nread -s -e user\necho -ne '\\n'\necho -n \"Enter the password \"\nread -s -e password\necho -ne '\\n'\n\n# Feed the expect script a device list & the collected username & passwords\nfor device in `cat ~/F5_Check/F5_Host.txt`; do\n ./F5_Out_v1.exp $device $password $user ;\n done\n \n\n File Contents: F5_Host.txt \n This contains the management IP of the F5 devices. \n Example: \n cat F5_Host.txt \n 10.12.12.200\n 10.12.12.201\n 10.12.12.202 \n 10.12.12.203\n Code : #!/usr/bin/expect -f\n\n# Set variables\nset hostname [lindex $argv 0]\nset password [lindex $argv 1]\nset username [lindex $argv 2]\n\n# Log results\nlog_file -a ~/F5_Check/F5LOG.log\n\n# Announce which device we are working on and the time\nsend_user \"\\n\"\nsend_user \">>>>> Working on $hostname @ [exec date] <<<<<\\n\"\nsend_user \"\\n\"\n\n# SSH access to device\nspawn ssh $username@$hostname\n\nexpect {\n\"no)? \" { \nsend \"yes\\n\"\nexpect \"*assword: \"\nsleep 1\nsend \"$password\\r\"\n}\n\"*assword: \" { \nsleep 1\nsend \"$password\\r\"\n }\n}\n\nexpect \"(tmos)#\"\nsend \"sys\\n\"\nexpect \"(tmos.sys)#\"\n\nsend \"show software\\n\"\nexpect \"#\"\nsend \"exit\\n\"\nexpect \"#\"\nsend \"quit\\n\"\n\nexpect \":~\\$\"\nexit Tested this on version: 11.5","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2047","kudosSumWeight":0,"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:287908":{"__typename":"Conversation","id":"conversation:287908","topic":{"__typename":"TkbTopicMessage","uid":287908},"lastPostingActivityTime":"2023-06-05T22:02:08.134-07:00","solved":false},"User:user:261033":{"__typename":"User","uid":261033,"login":"Stanislas_Piro2","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-2.svg?time=0"},"id":"user:261033"},"TkbTopicMessage:message:287908":{"__typename":"TkbTopicMessage","subject":"Use F5 LTM as HTTP Proxy","conversation":{"__ref":"Conversation:conversation:287908"},"id":"message:287908","revisionNum":2,"uid":287908,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:261033"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":11004},"postTime":"2018-05-04T09:52:24.000-07:00","lastPublishTime":"2023-06-05T22:02:08.134-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: LTM product can be used as a HTTP Proxy for servers and PC. \n This code explains minimum requirements to configure proxy feature without SWG module (configurations from Explicit Forward Proxy documentation without documentation ) and without explicit proxy iApp. How to use this snippet: All these commands must be run in bash shell. \n Create HTTP PROXY VIRTUAL SERVER \n Configure variables used in next commands \n Variable HTTPBaseName is used to create : \n Resolver object : RESOLVER_${HTTPBaseName} HTTP profile : http_${HTTPBaseName} virtual server : VS_${HTTPBaseName} \n \n HTTPBaseName=\"HTTP_FORWARD_PROXY\"\nVS_IP=\"192.168.2.80\"\nVS_PORT=\"8080\"\n \n\n create DNS resolver with your DNS server (1.1.1.1 is for demo using cloudflare) \n tmsh create net dns-resolver RESOLVER_${HTTPBaseName} { forward-zones replace-all-with { . { nameservers replace-all-with { 1.1.1.1:domain { } } } } route-domain 0 }\n \n\n create HTTP profile type explicit, using DNS resolver. \n The parameter default-connect-handling allow enables HTTPS connections without SSL inspection \n tmsh create ltm profile http http_${HTTPBaseName} { defaults-from http-explicit explicit-proxy { default-connect-handling allow dns-resolver RESOLVER_${HTTPBaseName} } proxy-type explicit }\n \n\n create HTTP proxy Virtual server \n tmsh create ltm virtual VS_${HTTPBaseName} { destination ${VS_IP}:${VS_PORT} ip-protocol tcp mask 255.255.255.255 profiles replace-all-with { http_${HTTPBaseName} { } tcp } source 0.0.0.0/0 source-address-translation { type automap } translate-address enabled translate-port enabled}\n \n\n ENABLE SSL FORWARD PROXY \n This section is not required to forward HTTPS requests but only to enable SSL inspection on HTTPS requests. Note : Following configuration requires SSL, Forward Proxy License. \n Configure variables used in next commands \n Variable SSLBaseName is used to create : \n certificate / key pair : ${SSLBaseName} Client SSL profile : clientssl_${SSLBaseName} Server SSL profile : serverssl_${SSLBaseName} virtual server : VS_${SSLBaseName} \n \n SSLBaseName=\"SSL_FORWARD_PROXY\"\ndirname=\"/var/tmp\"\nCASubject=\"/C=FR/O=DEMO\\ COMPANY/CN=SSL\\ FORWARD\\ PROXY\\ CA\"\n \n\n Create self-signed certificate for CA purpose (not available in WebUI) \n Self-signed certificates created in WebUI doesn't have CA capability required for SSL FORWARD PROXY. \n openssl genrsa -out ${dirname}/${SSLBaseName}.key 4094\nopenssl req -sha512 -new -x509 -days 3650 -key ${dirname}/${SSLBaseName}.key -out ${dirname}/${SSLBaseName}.crt -subj \"${CASubject}\"\n \n\n Import certificates in TMOS \n tmsh install sys crypto key ${SSLBaseName}.key from-local-file ${dirname}/${SSLBaseName}.key; \ntmsh install sys crypto cert ${SSLBaseName}.crt from-local-file ${dirname}/${SSLBaseName}.crt; \n \n\n After CA Certificate is imported, browse in WebUI, retrieve it and import it in client browsers trusted CA \n Create SSL profiles for SSL FORWARD PROXY \n tmsh create ltm profile client-ssl clientssl_${SSLBaseName} { cert-lookup-by-ipaddr-port disabled defaults-from clientssl mode enabled proxy-ca-cert ${SSLBaseName}.crt proxy-ca-key ${SSLBaseName}.key ssl-forward-proxy enabled }\ntmsh create ltm profile server-ssl serverssl_${SSLBaseName} { defaults-from serverssl ssl-forward-proxy enabled }\n \n\n create SSL FORWARD PROXY Virtual server \n tmsh create ltm virtual VS_${SSLBaseName} { destination 0.0.0.0:https ip-protocol tcp profiles replace-all-with { clientssl_${SSLBaseName} { context clientside } serverssl_${SSLBaseName} { context serverside } http { } tcp { } } source 0.0.0.0/0 translate-address disabled translate-port disabled vlans replace-all-with { http-tunnel } vlans-enabled }\n \n\n Change HTTP EXPLICIT PROXY Default Connect Handling to Deny \n tmsh modify ltm profile http http_${HTTPBaseName} explicit-proxy { default-connect-handling deny }\n \n\n Note : These commands were tested in both 12.1 and 13.1 versions. Code : No Code ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3979","kudosSumWeight":1,"repliesCount":24,"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:276213":{"__typename":"Conversation","id":"conversation:276213","topic":{"__typename":"TkbTopicMessage","uid":276213},"lastPostingActivityTime":"2022-08-04T08:53:46.232-07:00","solved":false},"User:user:117259":{"__typename":"User","uid":117259,"login":"Kiozs_131042","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:117259"},"TkbTopicMessage:message:276213":{"__typename":"TkbTopicMessage","subject":"BIGIP LTM Automated Pool Monitor Flap Troubleshooting Script in Bash","conversation":{"__ref":"Conversation:conversation:276213"},"id":"message:276213","revisionNum":1,"uid":276213,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:117259"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":989},"postTime":"2015-06-17T21:40:40.000-07:00","lastPublishTime":"2015-06-17T21:40:40.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: A bash script is mainly for collecting data when F5 BIG-IP LTM pool member monitor flaps in a period of time and help determine the Root Cause of BIGIP monitor health check failure; \nScript will monitor the LTM logs, if new pool member down message event occurs, script will perform following functions:\n1. Turn on LTM bigd debug ;\n2. Start to tcpdump capture to capture relevant traffics; \n3. Turn off bigd debug and terminate tcpdump process when timer elapse (timer is configurable) \n4. Generate qkview (optinal)\n5. Tar ball full logs files under /var/log/ directory (optinal) \n Script has been tested on v11.x Code : #!/usr/bin/bash\n##########identify the log file that script is monitoring \nfilename=\"/var/log/ltm\"\n##########identify the period of time that debug and tcpdump are running, please change it according to the needs;\ntimer=60\n##########IP address of pool member flaps \npoolMemberIP=\"10.10.10.229\"\n##########self IP address of LTM is usd to send LTM Health Monitor traffics\nltmSelfip=\"10.10.10.248\"\n##########pool member service port number\npoolMemberPort=\"443\"\n##########TMOS command to turn on bigd debug \nturnonBigdDebug=\"tmsh modify sys db bigd.debug value enable\"\n##########TMOS command to turn off bigd debug \nturnoffBigdDebug=\"tmsh modify sys db bigd.debug value disable\"\n##########BASH command to tar BIGIP log files \ntarLogs=\"tar -czpf /var/tmp/logfiles.tar.gz /var/log/*\"\n\n\n\n####### function file check: following code will check if /var/log/ltm exist on the system, \n####### if it exists, script will be running and perform subsequent functions \nif [ -f $filename ]\nthen\n echo \"/var/log/ltm exists and program is running to collect data when BG-IP pool member flaps\"\nelse\n####### if it does not exist, programe will be terminated and log following message \n echo \"no /var/log/ltm file found and program is terminated\"\nexit 0\nfi\n####### function file check ends\n\n###### write timestap to /var/log/ltm for tracking purpose\necho \"$(date) monitoring the log\" >> $filename\n\n###### start to monitor the /var/log/ltm for new events \ntail -f -n 0 $filename | while read -r line\ndo\n\n###### counter for pool down message appears\nhit=$(echo \"$line\" | grep -c \"$poolMemberIP:$poolMemberPort monitor status down\")\n\n#echo $hit\n###### \nif [ \"$hit\" == \"1\" ];\n then\n###### diplay the pool down log event in file /var/log/ltm \n echo $line\n###### show timestamp of debug is on \n echo \"$(date) Turning on system bigddebug\"\n###### turn on bigd debug \n echo $($turnonBigdDebug)\n###### turn on tcpdump capture \n echo $(tcpdump -ni 0.0:nnn -s0 -w /var/tmp/Monitor.pcap port $poolMemberPort and \\(host $poolMemberIP and host $ltmSelfip\\)) &\n###### running timer \n sleep $timer\n###### show timestamp of debug is off \n echo \"$(date) Truning off system bigddebug\"\n###### turn off bigd debug \n echo $($turnoffBigdDebug)\n###### terminate tcpdump process \n echo $(killall tcpdump)\n###### generate qkview, it's an optional function, enable it by remove \"#\" sign\n #echo $(qkview)\n###### tar log files, it's an optional function, enable it by remove \"#\" sign\n #echo $($tarLogs)\n break\n\n#else\n #echo \"Monitor in progress\"\nfi\ndone\n###### show message that programe is end \necho \"$(date) exiting from programe\"\n\n###### exit from the program \nexit 0 Tested this on version: 11.6","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3351","kudosSumWeight":0,"repliesCount":6,"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:289125":{"__typename":"Conversation","id":"conversation:289125","topic":{"__typename":"TkbTopicMessage","uid":289125},"lastPostingActivityTime":"2020-12-22T01:57:52.000-08:00","solved":false},"User:user:175623":{"__typename":"User","uid":175623,"login":"Lee_Sutcliffe","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:175623"},"TkbTopicMessage:message:289125":{"__typename":"TkbTopicMessage","subject":"Quick and dirty shell script to find unused certificates","conversation":{"__ref":"Conversation:conversation:289125"},"id":"message:289125","revisionNum":1,"uid":289125,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:175623"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1904},"postTime":"2019-05-16T00:24:13.000-07:00","lastPublishTime":"2019-05-16T00:24:13.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This has been edited quite a bit since I first posted so it's probably not as quick and dirty as it was before. This in response to a question regarding removing unused certificates https://devcentral.f5.com/questions/how-to-find-the-unused-ssl-certificates-63166 The following bash script will output any installed certificate names to a file, then iterate over each line. If the certificate is not referenced in bigip.conf in either the /config/ or within a partition folder, then it can be reasonably assumed it is not in use and can be safely deleted. The script will give you the option to delete any certs that are not in use and save a UCS archive (just in case) If there are any keys associated with the certificate, this will be deleted too. As the moment, the script will not look for keys without an equivalent cert, e.g. my-cert.key and my-cert.crt. So you many still end up with rouge keys. I'll look to get this updated eventually. There is an array called ignoreCerts ignoreCerts=(\"f5-irule.crt\" \"ca-bundle.crt\")\n Here you can add certificates you may want to ignore. For example, f5-irule.crt is used to sign F5 provided iRules and bigip.conf does not reference it. Add any additional certs to this array to ensure they are not deleted Script can be downloaded directly from GitLab using the link below https://gitlab.com/stratalabs/f5-devcental/snippets/1863498/raw?inline=false How to use this snippet: paste into vi chmod +x myScript.sh ./myScript.sh Code : #!/bin/sh\n\nfunction buildInstalledCertsArray {\n tmsh save sys config partitions all\n tmsh list sys file ssl-cert | awk '/crt/ {print $4}' | sed '/^[[:space:]]*$/d' > /var/tmp/installedCerts.tmp\n\n # iterate over tmp file to create array of used certificates\n while read line; do\n for i in \"${!ignoreCerts[@]}\"; do\n if [[ $line = ${ignoreCerts[$i]} ]]; then\n ignore=\"true\"\n else\n if [[ $ignore != \"true\" ]];then\n ignore=\"\"\n else\n # do not add cert to array if already added\n if [[ ! \" ${instCertsArr[@]} \" =~ \" ${line} \" ]]; then\n instCertsArr+=(\"$line\")\n fi\n fi\n fi\n done\n done /dev/null 2>&1)\n if ! [ -z \"$hasKey\" ];then\n deleteKeys+=(\"${cert%.*}.key\")\n fi\n done\n}\n\nfunction deleteUnusedCerts {\n\n if [ ${#deleteCerts[@]} -eq 0 ]; then\n echo \"-------------------------------------------------------------------------\"\n echo \"There are no unused certificates to delete, existing\"\n echo \"-------------------------------------------------------------------------\"\n exit 0\n else\n echo \"-------------------------------------------------------------------------\"\n echo \"The following keys are not in use can can be deleted:\"\n for cert in \"${deleteCerts[@]}\"; do\n echo \" ${cert}\"\n done\n echo \"-------------------------------------------------------------------------\"\n read -p \"would you like to delete these unused certificates? (y/n)?\" answer\n case ${answer:0:1} in\n y|Y )\n createUcsArchive\n echo \"-------------------------------------------------------------------------\"\n echo \"deleting certs...\"\n for cert in \"${deleteCerts[@]}\"; do\n delete sys file ssl-key $cert\n echo \" $cert\"\n done\n\n if [ ${#deleteKeys[@]} -eq 0 ]; then\n echo \"-------------------------------------------------------------------------\"\n echo \"no associated keys to delete, exiting\"\n exit 0\n else\n echo \"-------------------------------------------------------------------------\"\n echo \"deleting keys...\"\n for key in \"${deleteKeys[@]}\"; do\n delete sys file ssl-key $cert\n echo \"$key\"\n exit 0\n done\n fi\n ;;\n * )\n exit 0\n ;;\n esac\n fi\n}\n\nfunction createUcsArchive {\n echo\n today=`date +%Y-%m-%d.%H.%M.%S`\n echo \"Creating UCS archive auto.${today}.ucs\"\n tmsh save sys ucs ${today}.ucs\n}\n\n# initialise vars\ninstCertsArr=()\ndeleteCerts=()\n\n# ignore certs defined here - f5-irile.crt is used to sign F5 iRules\nignoreCerts=(\"f5-irule.crt\" \"ca-bundle.crt\")\n\n# build installed certificates array - excluding certs to ignore\nbuildInstalledCertsArray\n\n# check if installed certs are used in bigip.conf (including partitions) - ltm sys files are exluded from results\nbuildDeleteCertsArray\n\n# build list of associated keys (not all certs will have keys)\nbuildDeleteKeysArray\n\n# optionally delete unused certs\ndeleteUnusedCerts Tested this on version: No Version Found","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"5078","kudosSumWeight":3,"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:282111":{"__typename":"Conversation","id":"conversation:282111","topic":{"__typename":"TkbTopicMessage","uid":282111},"lastPostingActivityTime":"2020-10-20T19:02:41.000-07:00","solved":false},"User:user:92256":{"__typename":"User","uid":92256,"login":"JG","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-3.svg?time=0"},"id":"user:92256"},"TkbTopicMessage:message:282111":{"__typename":"TkbTopicMessage","subject":"Download a BIG-IP UCS archive with \"curl\".","conversation":{"__ref":"Conversation:conversation:282111"},"id":"message:282111","revisionNum":1,"uid":282111,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:92256"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1579},"postTime":"2019-08-02T00:28:13.000-07:00","lastPublishTime":"2019-08-02T00:28:13.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Download a BIG-IP UCS archive using the program \"curl\" and verifies the output file's signature. Tested on 13.1.1. How to use this snippet: Edit the code to input the hostname of your F5 UI, admin credentials, source UCS file name (defaults to config.ucs), and the output file name. Code : #!/bin/bash\n#\n# Download a UCS archive (across a stable network) with curl.\n#\n#-------------------------------------------------------------------------\n\nF5_HOST='myhost.example.com'\nCREDENTIALS='admin:admin'\nFINAL_FILE='/tmp/config.ucs'\nARCHIVE_NAME_ON_SERVER='config.ucs'\nDEBUG=''\n\n#-------------------------------------------------------------------------\n#\n# Get the md5 checksum for the archive.\n#\n#-------------------------------------------------------------------------\n\nARCHIVE_CHECKSUM=$(curl -sku $CREDENTIALS -X POST -H \"Content-type: application/json\" \\\n -d \"{\\\"command\\\":\\\"run\\\", \\\"utilCmdArgs\\\": \\\"-c '/usr/bin/md5sum /var/local/ucs/$ARCHIVE_NAME_ON_SERVER'\\\"}\" \\\n https://$F5_HOST/mgmt/tm/util/bash | awk -F':' '{print $NF}' | awk -F'\"' '{ print $2 }' | awk '{print $1}')\n\n[ -z \"$ARCHIVE_CHECKSUM\" ] && echo \"Failed to get archive signature. Aborting.\" && exit 1\n[ ! -z \"$DEBUG\" ] && echo \"Archive checksum: $ARCHIVE_CHECKSUM\"\n\n#-------------------------------------------------------------------------\n#\n# Find out the size of the archive and the size of the data packet.\n#\n#-------------------------------------------------------------------------\n\nContent_Range=$(curl -I -kv -u $CREDENTIALS -H 'Content-Type: application/json' -X GET \"https://$F5_HOST/mgmt/shared/file-transfer/ucs-downloads/$ARCHIVE_NAME_ON_SERVER\" 2>/dev/null | grep \"Content-Range: \" | cut -d ' ' -f 2)\n\nFIRST_CONTENT_RANGE=$(echo -n $Content_Range | cut -d '/' -f 1 | tr -d '\\r')\n[ ! -z \"$DEBUG\" ] && echo -n \"FIRST_CONTENT_RANGE: \"\n[ ! -z \"$DEBUG\" ] && echo $FIRST_CONTENT_RANGE\n\nNUMBER_OF_LAST_BYTE=$(echo -n $FIRST_CONTENT_RANGE | cut -d '-' -f 2)\n[ ! -z \"$DEBUG\" ] && echo -n \"NUMBER_OF_LAST_BYTE: \"\n[ ! -z \"$DEBUG\" ] && echo $NUMBER_OF_LAST_BYTE\n\nINITIAL_CONTENT_LENGTH=$NUMBER_OF_LAST_BYTE\nCONTENT_LENGTH=$(($NUMBER_OF_LAST_BYTE+1))\n[ ! -z \"$DEBUG\" ] && echo -n \"CONTENT_LENGTH: \"\n[ ! -z \"$DEBUG\" ] && echo $CONTENT_LENGTH\n\nDFILE_SIZE=$(echo -n $Content_Range | cut -d '/' -f 2 | tr -d '\\r' )\n[ ! -z \"$DEBUG\" ] && echo -n \"DFILE_SIZE: \"\n[ ! -z \"$DEBUG\" ] && echo $DFILE_SIZE\n\nLAST_END_BYTE=$((DFILE_SIZE-1))\n\nCUMULATIVE_NO=0\n[ ! -z \"$DEBUG\" ] && echo \"CUMULATIVE_NO: $CUMULATIVE_NO\"\nSEQ=0\nLAST=0\n\n#-------------------------------------------------------------------------\n#\n# Clean up: Remove the previous output file. \n#\n#-------------------------------------------------------------------------\n\n/bin/rm $FINAL_FILE 2>/dev/null\n\n#-------------------------------------------------------------------------\n#\n# Get the archive file.\n#\n#-------------------------------------------------------------------------\n\nwhile true\ndo\n if [ $LAST -gt 0 ]; then\n [ ! -z \"$DEBUG\" ] && echo 'End of run reached.'\n break\n fi\n\n if [ $SEQ -eq 0 ]; then\n NEXT_RANGE=$FIRST_CONTENT_RANGE\n CUMULATIVE_NO=$NUMBER_OF_LAST_BYTE\n CONTENT_LENGTH=$INITIAL_CONTENT_LENGTH\n else\n START_BYTE=$(($CUMULATIVE_NO+1))\n END_BYTE=$(($START_BYTE + $CONTENT_LENGTH))\n\n if [ $END_BYTE -gt $LAST_END_BYTE ]; then\n [ ! -z \"$DEBUG\" ] && echo \"END_BYTE greater than LAST_END_BYTE: $END_BYTE:$LAST_END_BYTE\"\n LAST=1\n let END_BYTE=$LAST_END_BYTE\n [ ! -z \"$DEBUG\" ] && echo \"Getting the last data packet.\"\n fi\n\n NEXT_RANGE=\"${START_BYTE}-${END_BYTE}\"\n CUMULATIVE_NO=$END_BYTE\n fi\n\n [ ! -z \"$DEBUG\" ] && echo \"NEXT_RANGE: $NEXT_RANGE\"\n\n let SEQ+=1\n [ ! -z \"$DEBUG\" ] && echo \"SEQ: $SEQ\"\n OUTPUT_FILE_NAME=\"/tmp/$$_downloaded_ucs_archive_file_part_$SEQ\";\n\n curl -H \"Content-Range: ${NEXT_RANGE}/${DFILE_SIZE}\" -s -k -u $CREDENTIALS -H 'Content-Type: application/json' -X GET \"https://$F5_HOST/mgmt/shared/file-transfer/ucs-downloads/$ARCHIVE_NAME_ON_SERVER\" -o $OUTPUT_FILE_NAME\n\n cat $OUTPUT_FILE_NAME >> $FINAL_FILE\n /bin/rm $OUTPUT_FILE_NAME\n [ ! -z \"$DEBUG\" ] && echo \"End of loop $SEQ\"\ndone\n\n#-------------------------------------------------------------------------\n#\n# Verify downloaded file.\n#\n#-------------------------------------------------------------------------\n\nFINAL_FILE_CHECKSUM=$(/usr/bin/md5sum $FINAL_FILE | awk '{print $1}')\n\nif [ \"$FINAL_FILE_CHECKSUM\" == \"$ARCHIVE_CHECKSUM\" ]; then\n echo \"Download completed and verified.\"\nelse\n echo \"Downloaded file has incorrect checksum.\"\n exit 1\nfi\n\n# END -------------------------------------------------------------------- Tested this on version: 13.0","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4933","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:286179":{"__typename":"Conversation","id":"conversation:286179","topic":{"__typename":"TkbTopicMessage","uid":286179},"lastPostingActivityTime":"2019-05-04T10:57:07.000-07:00","solved":false},"User:user:402746":{"__typename":"User","uid":402746,"login":"Russell","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-1.svg?time=0"},"id":"user:402746"},"TkbTopicMessage:message:286179":{"__typename":"TkbTopicMessage","subject":"BASH Script to make UCS and FTP off to remote Server","conversation":{"__ref":"Conversation:conversation:286179"},"id":"message:286179","revisionNum":1,"uid":286179,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:402746"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":797},"postTime":"2016-06-08T08:10:16.000-07:00","lastPublishTime":"2016-06-08T08:10:16.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Automate UCS Backup and copy via FTP to remote FTP Server. How to use this snippet: Run as a script to save and ship off a UCS file, via FTP, from the BIGIP Device to a Remote Server. Code : #!/bin/bash\n# set the date variable\nTODAY=$(date +'%Y%m%d')\n\n# Set FTP Remote Hostname or IP\nFTPHOST=\"Your IP\"\n\n# FTP User name and password\nUSER='Your User'\nPASSWORD='your password'\n\n# ID Hostname for Backup File\nhost=\"$HOSTNAME\"\n\n# Used to identify the first 3 letters of the hostname which can be\n# to separted backups on the remote FTP Server by Site ID or Device ID\nfolder=$(echo $HOSTNAME -s|cut -c 1-3)\n\n#run the F5 bigpipe config builder\ncd /var/local/ucs\ntmsh save sys ucs /var/local/ucs/$host.ucs\n#Rename the config.ucs and append the date to the end\nNUM=0\nuntil [ \"$NUM\" -eq 5 ]\ndo\nif [ -f /var/local/ucs/$host.ucs ]\nthen mv $host.ucs $host-$TODAY.ucs ; break\nelse sleep 5\nfi\nNUM=`expr \"$NUM\" + 1`\ndone\n[[ ! -f /var/local/ucs/$host-$TODAY.ucs ]] && exit 1\n\n#Open the FTP connection and move the file\nftp -inv $FTPHOST < Tested this on version: 12.0 ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1100","kudosSumWeight":0,"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:284176":{"__typename":"Conversation","id":"conversation:284176","topic":{"__typename":"TkbTopicMessage","uid":284176},"lastPostingActivityTime":"2019-03-06T20:26:06.000-08:00","solved":false},"User:user:29768":{"__typename":"User","uid":29768,"login":"hoolio","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:29768"},"TkbTopicMessage:message:284176":{"__typename":"TkbTopicMessage","subject":"Windows File Share Monitor SMB CIFS","conversation":{"__ref":"Conversation:conversation:284176"},"id":"message:284176","revisionNum":1,"uid":284176,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:29768"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1027},"postTime":"2015-03-12T15:46:01.000-07:00","lastPublishTime":"2015-03-12T15:46:01.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This external monitor performs a health check of a Windows file share using CIFS/Samba. There is an inbuilt SMB monitor for LTM. However, GTM does not (yet?) have this. \n See the comments in the script for details on how to implement it. Please post any questions about this monitor in the Advanced Design/Config forum Code : #!/bin/bash\n\n# Samba (CIFS) external monitor script\n#\n# Use smbget to perform a health check of an SMB/CIFS pool member IP address and port for LTM or GTM\n#\n# v0.3 - 2011-04-20 - Aaron Hooley - F5 Networks - hooleylists at gmail dot com - Initial version tested on 10.2.1 LTM and GTM\n#\n# Save this script as /usr/bin/monitors/smb_monitor.bash\n# Make executable using chmod 755 /usr/bin/monitors/smb_monitor.bash\n#\n# Example LTM monitor which references this script:\n#\n#monitor smb_external_monitor {\n# defaults from external\n# DEBUG \"1\"\n# FILE \"/share/test.txt\"\n# PASSWORD \"Test123!\"\n# run \"smb_monitor.bash\"\n# SEARCH_STRING \"got it\"\n# USERNAME \"aaron\"\n#}\n#\n# Example GTM monitor which references this script:\n#monitor \"smb_external_monitor\" {\n# defaults from \"external\"\n# interval 10\n# timeout 40\n# probe_interval 1\n# probe_timeout 5\n# probe_num_probes 1\n# probe_num_successes 1\n# dest *:*\n# \"SEARCH_STRING\" \"got it\"\n# \"DEBUG\" \"1\"\n# run \"smb_monitor.bash\"\n# \"USERNAME\" \"aaron\"\n# \"FILE\" \"/share/test.txt\"\n# args \"\"\n# \"PASSWORD\" \"Test123!\"\n# partition \"Common\"\n#}\n\n# Log debug to local0.debug (/var/log/ltm)?\n# Check if a variable named DEBUG exists from the monitor definition\n# This can be set using a monitor variable DEBUG=0 or 1\nif [ -n \"$DEBUG\" ]\nthen\nif [ $DEBUG -eq 1 ]\nthen\nlogger -p local0.debug \"EAV `basename $0` (PID $$): Start of PID $$\"\nlogger -p local0.debug \"EAV `basename $0` (PID $$): \\$DEBUG: $DEBUG\"\nfi\nelse\n# If the monitor config didn't specify debug, enable/disable it here\nDEBUG=0\n#logger -p local0.debug \"EAV `basename $0` (PID $$): \\$DEBUG: $DEBUG\"\nfi\n\n# If user and pass are both not set, then use anonymous/guest access for the server\nif [ \"x$USERNAME\" = \"x\" ] && [ \"x$PASSWORD\" = \"x\" ]\nthen\n GUEST_FLAG=\"--guest\"\n if [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): No username and no password specified, using guest access\"; fi\nelse\n GUEST_FLAG=\"\"\nfi\n\n# Check if a variable named USERNAME exists from the monitor definition\n# This can be set using a monitor variable USERNAME=my_username\nif [ -n \"$USERNAME\" ]\nthen\n if [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Username: $USERNAME\"; fi\nUSERNAME=\"-u $USERNAME\"\nelse\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): No username specified\"; fi\nUSERNAME=''\nfi\n\n# Check if a variable named PASSWORD exists from the monitor definition\n# This can be set using a monitor variable PASSWORD=my_password\nif [ -n \"$PASSWORD\" ]\nthen\n if [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Password: $PASSWORD\"; fi\n# Set the password flag\nPASSWORD=\"-p $PASSWORD\"\nelse\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): No password specified\"; fi\nPASSWORD=''\nfi\n\n# Check if a variable named FILE exists from the monitor definition\n# This can be set using a monitor variable FILE=/path/to/file.txt\nif [ -n \"$FILE\" ]\nthen\n# Replace \\ with / for *nix paths\nFILE=${FILE//\\\\/\\//replacement}\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Checking \\$FILE: $FILE\"; fi\nelse\nFILE=\"/\"\nlogger -p local0.notice \"EAV `basename $0` (PID $$): \\$FILE is not defined, checking smb://$IP/\"\nfi\n\n# Remove IPv6/IPv4 compatibility prefix (LTM passes addresses in IPv6 format)\nIP=`echo $1 | sed 's/::ffff://'`\n\n# Save the port for use in the shell command. smbget doesn't seem to support a port other than 445.\nPORT=$2\nif [ \"$PORT\" != 445 ]\nthen\nlogger -p local0.debug \"EAV `basename $0` (PID $$): Port $PORT will be ignored. This monitor only supports port 445 due to smbget limitation.\"\nfi\n\n# Check if there is a prior instance of the monitor running\npidfile=\"/var/run/`basename $0`.$IP.$PORT.pid\"\nif [ -f $pidfile ]\nthen\nkill -9 `cat $pidfile` > /dev/null 2>&1\nlogger -p local0.debug \"EAV `basename $0` (PID $$): Exceeded monitor interval, needed to kill past check for ${IP}:${PORT} with PID `cat $pidfile`\"\nfi\n\n# Add the current PID to the pidfile\necho \"$$\" > $pidfile\n\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Running for ${IP}:${PORT}\"; fi\n\n# Send the request and check the response. If we have a string to search for, use grep to look for it.\n# Check if a variable named SEARCH_STRING exists from the monitor definition\n# This can be set using a monitor variable SEARCH_STRING=my_string\nif [ -n \"$SEARCH_STRING\" ]\nthen\n SUCCESS_STATUS=0\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Checking ${IP}${FILE} for \"$SEARCH_STRING\" with status of $SUCCESS_STATUS using\\\nsmbget $USERNAME $PASSWORD $GUEST_FLAG --nonprompt --quiet --stdout smb://${IP}${FILE} | grep \\\"$SEARCH_STRING\\\" 1>/dev/null 2>/dev/null\"; \nfi\nsmbget $USERNAME $PASSWORD $GUEST_FLAG --nonprompt --quiet --stdout smb://${IP}${FILE} | grep $SEARCH_STRING 2>&1 > /dev/null\nelse\n SUCCESS_STATUS=1\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Checking ${IP}${FILE} with status of $SUCCESS_STATUS using\\\nsmbget $USERNAME $PASSWORD $GUEST_FLAG --nonprompt --quiet --stdout smb://${IP}${FILE} 1>/dev/null 2>/dev/null\";\nfi\nsmbget $USERNAME $PASSWORD $GUEST_FLAG --nonprompt --quiet --stdout smb://${IP}${FILE} 1>/dev/null 2>/dev/null\nfi\n\n# Check if the command ran successfully\n#\n# For some reason, smbget returns a status of 1 for success which is the opposite of typical commands. See this page (or its cache) for details:\n# http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6828364\n# http://webcache.googleusercontent.com/search?q=cache:Ef3KgrvGnygJ:bugs.opensolaris.org/bugdatabase/view_bug.do%3Fbug_id%3D6828364+&cd=2&hl=en&ct=clnk&gl=us\n#\n# Note that any standard output will result in the script execution being stopped\n# So do any cleanup before echoing to STDOUT\nif [ $? -eq $SUCCESS_STATUS ]\nthen\nrm -f $pidfile\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Succeeded for ${IP}:${PORT}\"; fi\necho \"UP\"\nelse\nrm -f $pidfile\nif [ $DEBUG -eq 1 ]; then logger -p local0.debug \"EAV `basename $0` (PID $$): Failed for ${IP}:${PORT}\"; fi\nfi ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"6580","kudosSumWeight":0,"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:273574":{"__typename":"Conversation","id":"conversation:273574","topic":{"__typename":"TkbTopicMessage","uid":273574},"lastPostingActivityTime":"2018-07-17T04:59:06.000-07:00","solved":false},"User:user:2089":{"__typename":"User","uid":2089,"login":"Kirk_Bauer_1018","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-1.svg?time=0"},"id":"user:2089"},"TkbTopicMessage:message:273574":{"__typename":"TkbTopicMessage","subject":"Super HTTP Monitor","conversation":{"__ref":"Conversation:conversation:273574"},"id":"message:273574","revisionNum":1,"uid":273574,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:2089"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":560},"postTime":"2015-03-12T15:30:18.000-07:00","lastPublishTime":"2015-03-12T15:30:18.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Super HTTP supports GET and POST requests, HTTP 1.0 and 1.1, Host headers, User-Agent headers, HTTP and HTTPS. It supports cookies. It supports authentication (basic, digest, and ntlm). It supports checking through a proxy. Most notably it supports chains of HTTP requests with cookie preservation between them, which I think will be very useful for LTM and GTM allowing you to validate end-to-end functionality. \n Note that this monitor will do just about whatever you need, but if you just want to a simple HTTP monitor try the built-in monitor first. Although this is fairly efficient (i.e. doesn't do more work than it needs to) it can never be anywhere as efficient as the built-in monitor. \n Note that the native HTTP/S monitors now support NTLM / NTLMv2 authentication. How to use this snippet: Create a new file containing the code below in /usr/bin/monitors on the LTM filesystem. Permissions on the file must be 700 or better, giving root rwx access to the file. See comments within the code for documentation. Code : #!/bin/bash\n\n# (c) Copyright 2007 F5 Networks, Inc.\n# Kirk Bauer \n# Version 1.3, Aug 5, 2010\n\n# Revision History\n# 8/5/10: Version 1.3: Fixed problem with cookie parsing\n# 12/16/09: Version 1.2: Fixed problem with NTLM health checks\n# 3/11/07: Version 1.1: Added ability for multiple regexes in MATCH_REGEX\n# 2/28/07: Version 1.0.1: Initial Release\n\n# When defining an external monitor using this script, the argument\n# field may contain the path for the request. In addition a large\n# number of variables may be defined as described below.\n# \n# The argument field can contain an optional path for the request,\n# if nothing is specified the default path of / is assumed. This\n# is also where you can put query parameters. Some examples:\n# /index.asp\n# /verify_user.html?user=testuser \n#\n# This script can retrieve a chain of URLs. This is useful for two\n# scenarios. The first is if you want to check a number of different\n# pages on a site, you can use one custom monitor that checks all of\n# them instead of defining a bunch of separate monitors.\n#\n# The other scenario is when you want to perform a test that requires\n# more than one page in sequence, such as something that tracks state\n# with cookies. In order to do a test login on some sites, for example,\n# you must first go to one URL where you are assigned a cookie, then\n# you must login through another URL with that cookie along with your\n# username/password. This script automatically stores and sends cookies\n# for chains of requests.\n#\n# The next section describes per-request variables. These are options \n# that can be specified a number of times for a number of separate\n# requests. In the most basic case, you must specify the URI_PATH for \n# each request. The only exception is that the last path is taken from\n# the \"argument\" string if URI_PATH is not specified. So, to do three\n# requests in a row, specify:\n# URI_PATH_1=/path/to/request1\n# STATUS_CODE_1=200\n# URI_PATH_2=/path/to/request2\n# STATUS_CODE_2=200\n# URI_PATH=/path/to/request3\n# MATCH_REGEX=\"you are logged in\"\n# \n# It is important to understand that there is always at least one\n# request and that last request uses variables with no number appended\n# to them. All other requests are done in numerical order before that\n# last request. If you have more than 10 requests you need to use\n# 2-digit numbers instead of 1 in the example above.\n#\n#############################################################\n# Per-request Variables\n# (names provided are for the last (possibly only) request,\n# for other requests append a _# on the end as described\n# above).\n#############################################################\n# Define the request:\n# URI_PATH: the full path you want to request, such as /index.html.\n# This is required for every request, except that it need not\n# be defined for the last (sometimes onyl) request if you specify \n# the path in the \"argument\" field. You may include a query string\n# at the end, like /index.html?test=true\n# QUERY_STRING: You may specify the GET query string here instead of\n# appending it to the URI_PATH. Example: \n# name1=value1&name2=value2\n# NODE_ADDR: The IP address to connect to. By default this will be\n# the pool member IP that is being checked. Can also be a hostname\n# if DNS resolution works on the BIG-IP.\n# NODE_PORT: The port to connect to. By default this will be the\n# port of the pool member being checked.\n# PROTOCOL: Either http or https. If not specified, assumed to be \n# http unless the port is 443.\n# POST_DATA: You may define post data to make this a POST request,\n# such as: \n# name1=value1&name2=value2\n# HOST_HEADER: The host header to send to the remote server. Default\n# will be the value of NODE_ADDR.\n# REFERER: The referer URL to send in the request (this variable is\n# misspelled just like the HTTP header is).\n#\n# Authentication options for each request:\n# USERNAME: provide this username to the webserver\n# PASSWORD: provide this password to the webserver\n# AUTHTYPE: \"basic\", \"digest\", or \"ntlm\" (default is basic)\n#\n# The following variables may be defined and determine what constitutes\n# an \"up\" status. If none of these are specified, the script will return\n# \"up\" only if the web server returns a status of 200 (OK). Any or all\n# of these may be specified.\n# HTTPS_HOSTNAME: you may optionally specify the hostname that the\n# certificate should present for https checks.\n# STATUS_CODE: numerical status code to match\n# NOT_STATUS_CODE: numerical status code that shouldn't be matched\n# MATCH_REGEX: regular expression that should be matched in the headers\n# or body. OPTIONAL: multiple regexes to match may be specified using\n# the format:\n# MATCH_REGEX = ®ex1®ex2®ex3\n# If using multiple regexes, you must start the string with & and\n# the regexes themselves cannot contain the & character\n# NOT_MATCH_REGEX: regular expression that should not be matched in the\n# headers or body. \n#\n#############################################################\n# Cookies\n#############################################################\n# You can set any number of cookies by specifying one or more variables\n# named COOKIE_Name. So if you set the variables COOKIE_country = usa\n# and COOKIE_language = en, then the cookie string would be\n# \"Cookie: country=usa; language=en\". These cookies will be sent for\n# every request. If you are doing multiple requests then any cookies\n# sent by the server will replace any existing cookie of the same name\n# in future requests. This script does not consider domain or path\n# but instead just sends all cookies for all requests.\n#\n#############################################################\n# Global Variables\n#############################################################\n# HTTP/HTTPS Options (apply to all requests):\n# USER_AGENT: set to the user agent string you want to send.\n# Default is something similar to:\n# curl/7.15.3 (i686-redhat-linux-gnu) libcurl/7.15.3 OpenSSL/0.9.7i zlib/1.1.4\n# HTTP_VERSION: set to \"1.0\" or \"1.1\", defaults to 1.1.\n# SSL_VERSION: set to \"tlsv1\", \"sslv2\", or \"sslv3\".\n# CIPHERS: override SSL ciphers that can be used (see \"man\n# ciphers\"), default is \"DEFAULT\".\n#\n# Global Proxy Settings (optional):\n# PROXY_HOST: IP address of the proxy to use (or hostname if DNS resolution works)\n# PROXY_PORT: Port to connect to on the proxy (required if PROXY_HOST is specified)\n# PROXY_TYPE: \"http\", \"socks4\", or \"socks5\" (defaults to http)\n# PROXY_AUTHTYPE: \"basic\", \"digest\", or \"ntlm\" (basic is default if a username is specified)\n# PROXY_USERNAME: username to provide to the proxy\n# PROXY_PASSWORD: password to provide to the proxy\n#\n# Other Variables:\n# LOG_FAILURES: set to \"1\" to enable logging of failures which will \n# log monitor failures to /var/log/ltm (viewable in the GUI under\n# System -> Logs -> Local Traffic(tab)\n# LOG_COOKIES: set to \"1\" to log cookie activity to /var/log/ltm (also\n# logs each request as it is made).\n# DEBUG: set to \"1\" to create .output and .trace files in /var/run for\n# each request for debugging purposes.\n\nSCRIPTNAME=${MON_TMPL_NAME:-$0}\n\n# Collect arguments \nglobal_node_ip=$(echo \"$1\" | sed 's/::ffff://')\nglobal_port=\"${2:-80}\"\n[ -z \"$URI_PATH\" ] && URI_PATH=\"${3:-/}\"\n\n# Handle PID file\npidfile=\"/var/run/$SCRIPTNAME.$global_node_ip.$global_port.pid\"\ntmpfile=\"/var/run/$SCRIPTNAME.$global_node_ip.$global_port.tmp\"\n[ -f \"$pidfile\" ] && kill -9 $(cat $pidfile) >/dev/null 2>&1\nrm -f \"$pidfile\" ; echo \"$$\" > \"$pidfile\"\nrm -f \"$tmpfile\"\n\nfail () {\n [ -n \"$LOG_FAILURES\" ] && [ -n \"$*\" ] && logger -p local0.notice \"$SCRIPTNAME($global_node_ip:$global_port): $*\"\n rm -f \"$tmpfile\"\n rm -f \"$pidfile\"\n exit 1\n}\n\nmake_request () {\n # First argument is blank for last request or \"_#\" for others\n local id=\"$1\"\n # Collect the arguments to use for this request, first start with ones\n # that have default values if not specified\n local node_ip=\"$global_node_ip\"\n [ -n \"$(eval echo \\$NODE_ADDR$id)\" ] && node_ip=\"$(eval echo \\$NODE_ADDR$id)\"\n local port=\"$global_port\"\n [ -n \"$(eval echo \\$NODE_PORT$id)\" ] && port=\"$(eval echo \\$NODE_PORT$id)\"\n local protocol=\"http\"\n [ \"$port\" -eq \"443\" ] && protocol=\"https\"\n [ -n \"$(eval echo \\$PROTOCOL$id)\" ] && protocol=\"$(eval echo \\$PROTOCOL$id)\"\n\n # Now the rest come straight from the environment variables\n local authtype=\"$(eval echo \\$AUTHTYPE$id)\"\n local username=\"$(eval echo \\$USERNAME$id)\"\n local password=\"$(eval echo \\$PASSWORD$id)\"\n local host_header=\"$(eval echo \\$HOST_HEADER$id)\"\n local referer=\"$(eval echo \\$REFERER$id)\"\n local uri_path=\"$(eval echo \\$URI_PATH$id)\"\n local query_string=\"$(eval echo \\$QUERY_STRING$id)\"\n [ -n \"$query_string\" ] && query_string=\"?$query_string\"\n local post_data=\"$(eval echo \\$POST_DATA$id)\"\n local https_hostname=\"$(eval echo \\$HTTPS_HOSTNAME$id)\"\n local status_code=\"$(eval echo \\$STATUS_CODE$id)\"\n local not_status_code=\"$(eval echo \\$NOT_STATUS_CODE$id)\"\n local match_regex=\"$(eval echo \\$MATCH_REGEX$id)\"\n local not_match_regex=\"$(eval echo \\$NOT_MATCH_REGEX$id)\"\n\n # Determine what we are checking for\n [ -z \"$match_regex\" ] && [ -z \"$not_match_regex\" ] && [ -z \"$status_code\" ] && [ -z \"$not_status_code\" ] && status_code=200\n\n [ -n \"$https_hostname\" ] && [ \"$protocol\" == \"https\" ] && {\n # The cert will contain a hostname but curl is going by IP so it will fail but give us the hostname in the error\n local actual_ssl_hostname=$(curl $global_args --cacert '/config/ssl/ssl.crt/ca-bundle.crt' \"$protocol://$node_ip:$port$uri_path$query_string\" 2>&1 | sed -n \"s/^.*SSL: certificate subject name '\\(.*\\)' does not match target host name.*$/\\1/p\")\n [ \"$actual_ssl_hostname\" == \"$https_hostname\" ] || fail \"HTTPS Hostname '$actual_ssl_hostname' does not match HTTPS_HOSTNAME$id=$https_hostname\"\n }\n\n # Determine argument string for curl\n local args=\"\"\n [ -n \"$host_header\" ] && args=\"$args --header 'Host: $host_header'\"\n [ -n \"$referer\" ] && args=\"$args --referer '$referer'\"\n [ -n \"$post_data\" ] && args=\"$args --data '$post_data'\"\n # IP used in URL will never match hostname in cert, use HTTPS_HOSTNAME to check separately\n [ \"$protocol\" == \"https\" ] && args=\"$args --insecure\"\n [ -n \"$DEBUG\" ] && args=\"$args --trace-ascii '$tmpfile.trace$id'\"\n\n [ -n \"$username\" ] && {\n # Specify authentication information\n args=\"$args --user '$username:$password'\"\n [ \"$authtype\" == \"digest\" ] && args=\"$args --digest\"\n [ \"$authtype\" == \"ntlm\" ] && args=\"$args --ntlm\"\n }\n # Determine cookies to send, if any\n local cookie_str=\"\"\n for i in ${!COOKIE_*} ; do\n cookie_name=$(echo $i | sed 's/^COOKIE_//')\n cookie_str=\"$cookie_str; $cookie_name=$(eval echo \"$\"$i)\"\n done\n cookie_str=\"$(echo \"$cookie_str\" | sed 's/^; //')\"\n [ -n \"$LOG_COOKIES\" ] && logger -p local0.notice \"$SCRIPTNAME($global_node_ip:$global_port): $protocol://$node_ip:$port$uri_path$query_string: cookie string [$cookie_str]\"\n [ -n \"$cookie_str\" ] && args=\"$args --cookie '$cookie_str'\"\n\n # Make request\n eval curl -i $global_args $args \"'$protocol://$node_ip:$port$uri_path$query_string'\" >\"$tmpfile\" 2>/dev/null || fail \"$protocol://$node_ip:$port$uri_path$query_string: Request failed: $!\"\n [ -n \"$DEBUG\" ] && cp \"$tmpfile\" \"$tmpfile.debug$id\"\n\n # Validate Check Conditions\n [ -n \"$status_code\" ] || [ -n \"$not_status_code\" ] && {\n local actual_status_code=$(head -n 1 \"$tmpfile\" | sed \"s/^HTTP\\/.\\.. \\([0123456789][0123456789][0123456789]\\) .*$/\\1/\")\n [ \"$actual_status_code\" -eq 401 ] && [ \"$authtype\" == \"ntlm\" ] && {\n # Skip past 401 Unauthorized response and look at second response code\n actual_status_code=$(grep '^HTTP/' \"$tmpfile\" | tail -n 1 | sed \"s/^HTTP\\/.\\.. \\([0123456789][0123456789][0123456789]\\) .*$/\\1/\")\n }\n\n [ -n \"$status_code\" ] && [ \"$actual_status_code\" -ne \"$status_code\" ] && fail \"$protocol://$node_ip:$port$uri_path$query_string: Status code ($actual_status_code) not what was expected (STATUS_CODE$id=$status_code)\"\n [ -n \"$not_status_code\" ] && [ \"$not_status_code\" -eq \"$status_code\" ] && fail \"$protocol://$node_ip:$port$uri_path$query_string: Status code ($actual_status_code) was what was not expected (NOT_STATUS_CODE$id=$not_status_code)\"\n }\n [ -n \"$match_regex\" ] && {\n if echo \"$match_regex\" | grep -q '^&' ; then\n IFS=\"&\"\n match_regex=\"$(echo \"$match_regex\" | sed 's/^&//')\"\n for regex in $match_regex ; do\n egrep -q \"$regex\" \"$tmpfile\" || fail \"$protocol://$node_ip:$port$uri_path$query_string: Did not find [MATCH_REGEX$id=$regex] in response\"\n done\n unset IFS\n else\n egrep -q \"$match_regex\" \"$tmpfile\" || fail \"$protocol://$node_ip:$port$uri_path$query_string: Did not find [MATCH_REGEX$id=$match_regex] in response\"\n fi\n }\n [ -n \"$not_match_regex\" ] && egrep -q \"$not_match_regex\" \"$tmpfile\" && fail \"$protocol://$node_ip:$port$uri_path$query_string: Found [NOT_MATCH_REGEX$id=$not_match_regex] in response\"\n\n # Store cookies from response for next request (if any)\n [ -z \"$id\" ] && return\n `sed -n \"s/^Set-Cookie: \\([^=]\\+\\)=\\([^;]\\+\\);.*$/export COOKIE_\\1='\\2';/ip\" \"$tmpfile\"`\n}\n\n# Build global option string\nglobal_args=\"\"\n[ \"$HTTP_VERSION\" == \"1.0\" ] && global_args=\"$global_args --http1.0\"\n[ \"$SSL_VERSION\" == \"tlsv1\" ] && global_args=\"$global_args --tlsv1\"\n[ \"$SSL_VERSION\" == \"sslv2\" ] && global_args=\"$global_args --sslv2\"\n[ \"$SSL_VERSION\" == \"sslv3\" ] && global_args=\"$global_args --sslv3\"\n[ -n \"$USER_AGENT\" ] && global_args=\"$global_args --user-agent '$USER_AGENT'\"\n[ -n \"$CIPHERS\" ] && global_args=\"$global_args --ciphers '$CIPHERS'\"\n[ -n \"$PROXY_HOST\" ] && [ -n \"$PROXY_PORT\" ] && {\n if [ \"$PROXY_TYPE\" == \"socks4\" ] ; then\n global_args=\"$global_args --socks4 '$PROXY_HOST:$PROXY_PORT'\"\n elif [ \"$PROXY_TYPE\" == \"socks5\" ] ; then\n global_args=\"$global_args --socks5 '$PROXY_HOST:$PROXY_PORT'\"\n else\n global_args=\"$global_args --proxy '$PROXY_HOST:$PROXY_PORT'\"\n fi\n [ -n \"$PROXY_USERNAME\" ] && {\n global_args=\"$global_args --proxy-user '$PROXY_USERNAME:$PROXY_PASSWORD'\"\n [ \"$PROXY_AUTHTYPE\" == \"digest\" ] && global_args=\"$global_args --proxy-digest\"\n [ \"$PROXY_AUTHTYPE\" == \"ntlm\" ] && global_args=\"$global_args --proxy-ntlm\"\n }\n}\n\nrequests=\"$(echo ${!URI_PATH_*} | sort)\"\nfor request in $requests ; do\n id=$(echo $request | sed 's/^URI_PATH//') \n make_request \"$id\"\ndone\n# Perform last request\nmake_request \"\"\n\n# If we got here without calling fail() and exiting, status was good\nrm -f \"$tmpfile\"\necho \"up\"\nrm -f \"$pidfile\"\nexit 0 ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"16493","kudosSumWeight":0,"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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1744046271000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1744046271000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1744046271000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1744046271000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1744046271000","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-shared/client/components/common/QueryHandler-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1744046271000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1744046271000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1744046271000","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-components/messages/MessageView/MessageViewInline-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1744046271000","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1744046271000","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-shared/client/components/common/OverflowNav-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1744046271000","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1744046271000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1744046271000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1744046271000","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1744046271000","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1744046271000","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-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1744046271000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"nodeId":"board:codeshare","tagName":"bash"},"buildId":"FP3zsFp6DJl70wDujOvtu","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.3.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":[]}