"}},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":""}},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"tagFollowsForNodes({\"nodeIds\":\"board:codeshare\",\"tagText\":\"management\"})":[{"__typename":"TagFollowForNodeResponse","coreNode":{"__ref":"Tkb:board:codeshare"},"follow":null}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1728320186000"}]},"CachedAsset:pages-1737018917396":{"__typename":"CachedAsset","id":"pages-1737018917396","value":[{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737018917396,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"CachedAsset:theme:customTheme1-1737018916981":{"__typename":"CachedAsset","id":"theme:customTheme1-1737018916981","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":null,"h2FontWeight":null,"h3FontWeight":null,"h4FontWeight":null,"h5FontWeight":null,"h6FontWeight":null,"__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1728320186000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1728320186000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-pages/tags/TagPage-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1728320186000","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0","mimeType":"image/png"},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","entityType":"CATEGORY","displayId":"CrowdSRC","nodeType":"category","depth":1,"title":"CrowdSRC","shortTitle":"CrowdSRC","parent":{"__ref":"Category:category:top"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","entityType":"TKB","displayId":"codeshare","nodeType":"board","depth":2,"conversationStyle":"TKB","title":"CodeShare","description":"Have some code. Share some code.","avatar":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}"},"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:CrowdSRC"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:zihoc95639"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:CrowdSRC"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}},"canReadNode":{"__typename":"PolicyResult","failureReason":null}},"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"shortTitle":"CodeShare","tagPolicies":{"__typename":"TagPolicies","canSubscribeTagOnNode":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","args":[]}},"canManageTagDashboard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","args":[]}}}},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:board:codeshare-1737018915377":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:board:codeshare-1737018915377","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:1737018862803":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1737018862803","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1728320186000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-1737018932245":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1737018932245","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-1737018932245":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1737018932245","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-1737018932245":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1737018932245","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-1737018932245":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1737018932245","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1728320186000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1728320186000","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1728320186000","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:1704319314827":"Blog Feed","title@instance:1704317906837":"Content Feed","title@instance:1702668293472":"Community Feed","title@instance:1704320290851":"My Contributions","title@instance:1703720491809":"Forum Feed","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:277561":{"__typename":"Conversation","id":"conversation:277561","topic":{"__typename":"TkbTopicMessage","uid":277561},"lastPostingActivityTime":"2020-03-12T10:52:29.000-07:00","solved":false},"User:user:131293":{"__typename":"User","uid":131293,"login":"CodeCentral_194","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-10.svg"},"id":"user:131293"},"TkbTopicMessage:message:277561":{"__typename":"TkbTopicMessage","subject":"Create Pools/Vips with tmsh via MS-Excel script","conversation":{"__ref":"Conversation:conversation:277561"},"id":"message:277561","revisionNum":1,"uid":277561,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":999},"postTime":"2015-03-12T16:52:42.000-07:00","lastPublishTime":"2015-03-12T16:52:42.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This spreadsheet Excel is useful to create VIPs, pools, nodes, policy, etc. \n It is also included script for ASM. The AFM script, I ended up not using and therefore I have not tested very well. I decided to share because it might help someone to gain some time to configure the BigIP. How to use this snippet: Fill the information and then get a script. So, connect by ssh and in the tmsh, paste the script (preferably in blocks, slowly for reasons of buffer length), then, if we have success, give us some time to do other steps... ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"567","kudosSumWeight":0,"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:273903":{"__typename":"Conversation","id":"conversation:273903","topic":{"__typename":"TkbTopicMessage","uid":273903},"lastPostingActivityTime":"2017-02-26T03:37:06.000-08:00","solved":false},"User:user:4991":{"__typename":"User","uid":4991,"login":"Colin_Stubbs_10","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"},"id":"user:4991"},"TkbTopicMessage:message:273903":{"__typename":"TkbTopicMessage","subject":"BIG-IP backup script with SCP transfer","conversation":{"__ref":"Conversation:conversation:273903"},"id":"message:273903","revisionNum":1,"uid":273903,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:4991"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":999},"postTime":"2015-03-12T16:25:23.000-07:00","lastPublishTime":"2015-03-12T16:25:23.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: BIP-IP backup script with SCP transfer option. First version works with 10.2 (bigpipe) command. Second version works with 11.2 (tmsh). 11.2 version also contains some logic fixes. \n This script creates tar.bz2 archives which include a .ucs file and a .scf of the F5's configuration. \n It optionally stores them locally and/or transfers them to a remote system using SCP. Code : #!/bin/bash\n# f5backup.sh\n# Copyright (C) 2010 Colin Stubbs \n# Changes to 11.2.x (tmsh syntax) and additional logic by Tim Davies \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU General Public License for more details.\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <>\n#\n# Additional files you'll need to create, example content:\n#\n# # /etc/cron.d/f5backup\n# SHELL=/bin/bash\n# PATH=/sbin:/bin:/usr/sbin:/usr/bin\n# MAILTO=user@somewhere\n# HOME=/var/tmp\n# 0 0 * * * root /bin/bash /var/local/bin/f5backup.sh 1>/var/tmp/f5backup.log 2>&1\n# # EOF\n#\n# # /root/.ssh/f5archive_config\n#\n# Host *\n# User f5archive\n# PasswordAuthentication no\n# StrictHostKeyChecking yes\n# IdentityFile /root/.ssh/f5archive_dsa\n# Port 22\n# Protocol 2\n# Ciphers aes128-cbc,aes192-cbc,aes256-cbc\n# UserKnownHostsFile /root/.ssh/f5archive_host\n# \n# # EOF\n#\n# REQUIRES:\n# F5 BIG-IP 11.2.x\n\n# Debug ? Set to non-blank if so.\nDEBUG=''\n\n# Current date/time stamp\nDATETIME=\"`date +%Y%m%d%H%M%S`\"\n\n# Base f5backup.sh working directory\nOUT_DIR='/var/tmp'\n\n# Unique temporary output location\nTEMP_DIR=\"`mktemp -d ${OUT_DIR}/f5backup.XXXXXXXXXX`\"\n\n# Backup options\n# Export a UCS archive\nDO_UCS='x'\n# Export a single config file\nDO_SCF='x'\n# Export SCF with oneline bigpipe statements\nDO_SCF_ONELINE='x'\n\n# Use SCP with pubkey to export to remote system\nDO_SCP_EXPORT=1\n\n# SCP options must be set if you want to use this\nSCP_OPTIONS=\"\"\n# Destination list, can be a list of username:IPorHostname if you want to\n# transfer to multiple destinations. Same public key used for auth to all.\n# ** MAKE SURE YOU INCLUDE :<%DIRECTORY%> HERE\nSCP_DESTINATION=\"f5archive@10.50.108.12:\"\n# All SCP options should be encapsulated in a special config file\nSCP_CONFIG=\"/root/.ssh/f5archive_config\"\n\n# UCS output location\nUCS_FILE=\"${TEMP_DIR}/ucs.${DATETIME}.backup\"\n\n# Encrypt UCS archive with passphrase\n# ** If blank this will not be used\nUCS_PASSPHRASE=''\n\n# SCF output location\nSCF_FILE=\"${TEMP_DIR}/scf.${DATETIME}.backup\"\n\n# tar output location\nTAR_FILE=\"${TEMP_DIR}/scf.${DATETIME}.backup.tar\"\n# Local archive location\n# ** If this variable is blank, or the destination is not writable then\n# this script will not copy the backup to the local archive.\nLOCAL_ARCHIVE=\"/var/local/backups\"\n\n# Remove all older local backups than this many days\nLOCAL_CLEANUP_DAYS=7\n\n# Name of compressed backup archive to produce\nOUTPUT_FILE=\"f5backup-${HOSTNAME}-${DATETIME}.tar.bz2\"\n\nif [ \"${DEBUG}x\" != \"x\" ] ; then\n for i in HOSTNAME DATETIME OUT_DIR TEMP_DIR DO_UCS DO_SCF DO_SCF_ONELINE DO_SCP_EXPORT SCP_DESTINATION SCP_OPTIONS SCP_CONFIG ASM_POLICY_LIST UCS_FILE UCS_PASSPHRASE SCF_FILE LOCAL_ARCHIVE OUTPUT_FILE ; do\n eval var=\\$$i\n echo \"${i} = $var\"\n done\nfi\n\nfunction usage {\n echo \"Usage: f5backup.sh\"\n exit 0\n}\n\nfunction export_scf() {\n if [ \"${DEBUG}x\" != \"x\" ] ; then echo \"in ${FUNCNAME}(${*})\" ; fi\n if [ \"${DO_SCF}x\" != \"x\" ] ; then\n if [ \"${DO_SCF_ONELINE}x}\" != \"x\" ] ; then\n tmsh save sys config one-line file \"${SCF_FILE}\"\n else\n tmsh save sys config one-line file \"${SCF_FILE}\"\n fi\n fi\n}\n\nfunction export_ucs() {\n if [ \"${DEBUG}x\" != \"x\" ] ; then echo \"in ${FUNCNAME}(${*})\" ; fi\n if [ \"${DO_UCS}x\" != \"x\" ] ; then\n if [ \"${UCS_PASSPHRASE}x\" != \"x\" ] ; then\n tmsh save sys ucs \"${UCS_FILE}\" passphrase \"${UCS_PASSPHRASE}\"\n else\n tmsh save sys ucs \"${UCS_FILE}\"\n fi\n fi\n}\n\nfunction create_backup() {\n if [ \"${DEBUG}x\" != \"x\" ] ; then echo \"in ${FUNCNAME}(${*})\" ; fi\n tar -v -j -c -f \"${OUT_DIR}/${OUTPUT_FILE}\" -C \"${TEMP_DIR}\" .\n}\n\n# Transfer backup archive to offsite location/s\nfunction backup_remote() {\n if [ \"${DEBUG}x\" != \"x\" ] ; then echo \"in ${FUNCNAME}(${*})\" ; fi\n if [ -f \"${OUT_DIR}/${OUTPUT_FILE}\" ] ; then\n if [ \"${DO_SCP_EXPORT}x\" != \"x\" ] ; then\n\n echo \"Copying to remote archive ${SCP_DESTINATION}${OUTPUT_FILE}\"\n\n if [ \"${DEBUG}x\" != \"x\" ] ; then echo \"Exec: /usr/bin/scp ${SCP_OPTIONS} -F ${SCP_CONFIG} ${OUT_DIR}/${OUTPUT_FILE} ${SCP_DESTINATION}\" ; fi\n /usr/bin/scp ${SCP_OPTIONS} -F \"${SCP_CONFIG}\" \"${OUT_DIR}/${OUTPUT_FILE}\" \"${SCP_DESTINATION}\" || echo \"Error: SCP ${OUT_DIR}/${OUTPUT_FILE} ${SCP_DESTINATION} failed!\"\n\n fi\n else\n echo \"Error: ${OUT_DIR}/${OUTPUT_FILE} doesn't exist, something has gone wrong!\"\n fi\n}\n\nfunction backup_local() {\n if [ \"${DEBUG}x\" != \"x\" ] ; then echo \"in ${FUNCNAME}(${*})\" ; fi\n if [ \"${LOCAL_ARCHIVE}x\" != \"x\" ] ; then\n\n echo \"Copying to local archive ${LOCAL_ARCHIVE}/${OUTPUT_FILE}\"\n\n if [ ! -d \"${LOCAL_ARCHIVE}\" ] ; then\n mkdir \"${LOCAL_ARCHIVE}\"\n if [ ${?} -ne 0 ] ; then\n echo \"Error: ${LOCAL_ARCHIVE} doesn't exist and I can't create it.\"\n fi\n fi\n\n mv -f \"${OUT_DIR}/${OUTPUT_FILE}\" \"${LOCAL_ARCHIVE}\"/\n\n find \"${LOCAL_ARCHIVE}\" -type f -mtime +${LOCAL_CLEANUP_DAYS} -exec rm -v -f {} \\;\n fi\n}\n\n# Cleanup what this script has done\nfunction cleanup() {\n if [ \"${DEBUG}x\" != \"x\" ] ; then echo \"in ${FUNCNAME}(${*})\" ; fi\n rm -rf ${TEMP_DIR}\nif [ -f \"${OUT_DIR}/${OUTPUT_FILE}\" ] ; then\n rm -f \"${OUT_DIR}/${OUTPUT_FILE}\"\n fi\n}\n\n# Sanity checking\n# 1. Must be run as root\nif [ \"`id -u`x\" != \"0x\" ] ; then\n echo \"Error: You need to run this script as root.\"\n exit 1\nfi\n\n# 2. Command line args\n# not applicable yet\n\n# 3. Temp dir must exist\nif [ ! -d \"${TEMP_DIR}\" ] ; then\n echo \"Error: ${TEMP_DIR} was not created for some reason. Fix this issue and try again.\"\n exit 1\nfi\n\necho \"${0} start `date +%Y%m%d%H%M%S`\"\n\nexport_ucs\nexport_scf\n\ncreate_backup\n\nbackup_remote\nbackup_local\n\ncleanup\n\necho \"${0} finish `date +%Y%m%d%H%M%S`\"\n\n# EOF Tested this on version: 11.2","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"6560","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:278567":{"__typename":"Conversation","id":"conversation:278567","topic":{"__typename":"TkbTopicMessage","uid":278567},"lastPostingActivityTime":"2015-03-12T16:28:41.000-07:00","solved":false},"User:user:31528":{"__typename":"User","uid":31528,"login":"Wes_98712","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-12.svg"},"id":"user:31528"},"TkbTopicMessage:message:278567":{"__typename":"TkbTopicMessage","subject":"BIG-IP Backup Scripts","conversation":{"__ref":"Conversation:conversation:278567"},"id":"message:278567","revisionNum":1,"uid":278567,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:31528"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":825},"postTime":"2015-03-12T16:28:41.000-07:00","lastPublishTime":"2015-03-12T16:28:41.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: A set of scripts that can manage F5 configuration backups, runs on a scheduler, currently geared towards a Windows Server for remote backups. Requires SSH and passwordless key-based authentication. \n All files backed up are date stamped with the current day and can be used to perform a b config load and restore the appliances to a different state. \n There are 2 scripts as follows: \n f5confbkp.pl (runs on the BIG-IP). Uses b config save to save a copy under /var/tmp/f5configs f5getconf.pl (runs on a Windows server, modify the script if you want to run it on a UNIX system). Uses the key pair generated above to remote scp the files off of the F5's to a directory structure, in the scripts example that is e:\\f5backups.) \n Key Exchange Setup \n Note: Only required for backup from a remote system. Generate a set of keys without a passphrase. (Reference ssh-keygen for details on generating keys). Take the id_dsa.pub key and put that into the /root/.ssh/authorized_keys file on the BIG-IP's you want to back up. Permissions on the authorized_keys file must be set to 644. Test your ssh connections from the remote system to ensure the account you are using on the remote backup server can ssh into the F5's you are backing up without getting prompted, as this will cause the script to fail otherwise. \n Cron job setup \n Setup the cronjob on the BIG-IP's. A job similar to the following will run the f5confbkp.pl script every day at 1 \n 30 1 * /usr/bin/perl /root/scripts/f5confbkp.pl \n #!/usr/bin/perl\n# ------------------------------------ #\n# Name: f5getconf.pl\n# Purpose: Using SSH key based authentication gets the most current date stamped ucs file\n# Compatible: v4X and v9X versions of BigIP appliances, Windows 2k/2k3 or any Unix system\n# Requirements: On Windows cygwin (including ssh service installed)\n# SSH Key gen with no password for passwordless authentication\n# Requires that you connect and accept the key finger print before running\n# as a cron or via the Windows scheduler, otherwise it will stick trying to\n# connect via SCP.\n# Also requires an F5hosts.txt with the following entries:\n# bigipname (Case sensitive) IP Address. Example:\n# noc-f5-somehostname 10.0.1.1\n# noc-f5-somehostnameb 10.0.1.2\n#\n# Version: 2.0\n# Author: Wes North\n# Currently geared for: Windows 2k/2k3\n# ------------------------------------ #\n\n#Get LocalTime\nuse Net::Telnet; #to test the socket before trying to SCP\nuse Sys::Hostname;\n\n@T=localtime();\n$year = $T[5] + 1900;\n$month = $T[4] + 1;\n$day = $T[3];\nif ($T[2] > 12) {\n $hour = $T[2] - 12;\n $time = \"$hour$T[1]PM\";\n} else {\n $hour = $T[2];\n $time = \"$hour$T[1]AM\";\n}\nif ($month < 10) {\n $month = \"0$month\";\n}\nif ($day < 10) {\n $day = \"0$day\";\n}\n\n$date = \"$year$month$day\"; #returns yyyymmdd\n$bakfile = \"${hostname}-${date}.ucs\";\n$destdrive = qq!E:\\\\!;\n$destdir = qq!${destdrive}f5backups!;\nif (!-d $destdir) {\n `mkdir $destdir`;\n}\n$errdir = qq!$destdir\\\\errors!;\nif (!-d $errdir) {\n `mkdir $errdir`;\n}\n\n$errfile = \"$errdir/debug.log\";\nopen (ERROR, \">>$errfile\") || die \"Cannot open $errfile because $!\\n\";\n\n#Get the current backup file for the F5 running config\n$cathosts = qq!cmd \\/c type f5hosts.txt!;\n@f5list = split '\\n', `$cathosts`;\nforeach $f5 (@f5list) {\n next if ($f5 =~ /^\\#/);\n $errnum = \"\";\n @sepline = split ' ', $f5;\n $hostname = $sepline[0];\n $ip = $sepline[1];\n $connection=Net::Telnet->new(Timeout => 2, Host => \"$ip\", port=>22, Errmode => sub {&error;}); \n if ($errnum ne \"\") {\n print ERROR \"$month\\/$day\\/$year: $ip is not accessible $!\\n\";\n next;\n }\n $bkfile = qq!${hostname}-${date}.ucs!;\n $putdir = qq!${destdir}\\\\$hostname!;\n if (!-d $putdir) {\n `mkdir $putdir`;\n }\n $getdir = qq!/var/tmp/f5configs!;\n $getfile = qq!${getdir}/${bkfile}!;\n #Replace the directory path and private key file reference with your own.\n $scpcmd = qq!cmd \\/c scp -i \"/cygdrive/c/Documents\\ and\\ Settings//.ssh/id_dsa\" \\\nroot\\@${ip}\\:${getfile} /cygdrive//f5backups/${hostname}/${bkfile}!;\n $Error = 0;\n $Error += system($scpcmd);\n if ($Error > 0) {\n print ERROR \"$month\\/$day\\/$year: $scp command failed $!\\n\";\n} else {\n print ERROR \"$month\\/$day\\/$year: scp command for $hostname at $ip was successful\\n\";\n }\n}\nclose ERROR;\n\n#Cheesy and can be done differently, I didn't have a whole lot of time, so I settled for something like this.\nsub error { \n $errnum = 1;\n return $errnum;\n #print \"Connection Failed!\\n\"; \n}\n\nexit 0;\n\n Code : #!/usr/bin/perl\n# ------------------------------------ #\n# Name: f5confbkp.pl\n# Purpose: without the enterprise management appliance, this can be run as a cron to backup configs from F5 appliances\n# Compatible: v4X and v9X versions of BigIP appliances\n# Requirements: Enough space to store ucs files, and really nothing else, it uses the builtin perl binaries\n#\n# Version: 2.0\n# Author: Wes North\n# Currently geared for: Any version that supports b config save\n# ------------------------------------ #\n\n#Get LocalTime\n#\nuse Sys::Hostname;\n#Locatime section, cheesy but have to set specific month and hour values\n@T=localtime();\n$year = $T[5] + 1900;\n$month = $T[4] + 1;\n$day = $T[3];\nif ($T[2] > 12) {\n $hour = $T[2] - 12;\n $time = \"$hour$T[1]PM\";\n} else {\n $hour = $T[2];\n $time = \"$hour$T[1]AM\";\n}\nif ($month < 10) {\n $month = \"0$month\";\n}\nif ($day < 10) {\n $day = \"0$day\";\n}\n\n$date = \"$year$month$day\"; #returns yyyymmdd\n$fqdn = hostname(); #returns node.domain.suffix\n@n = split '\\.', $fqdn;\n$hostname = $n[0];\n#$bakfile = \"${hostname}-${date}_${time}.ucs\";\n$bakfile = \"${hostname}-${date}.ucs\";\n$errdir = \"/var/tmp/f5configs\";\nif (!-d $errdir) {\n `mkdir $errdir`;\n}\n$errfile = \"$errdir/$date-Error.log\";\nopen (ERROR, \">>$errfile\") || die \"Cannot open $errfile because $!\\n\";\n\n#Create a backup file for the F5 running config\n$bcmd = \"b config save\";\n$path = \"/var/tmp\";\n$f5cmd = \"${bcmd} ${path}/f5configs/${bakfile} >> /dev/null 2>&1 &\";\nif (-f \"$path/f5configs/$bakfile\") {\n print ERROR \"$month\\/$day\\/$year: $bakfile already exists exiting $0\\n\";\n exit 1;\n} else {\n $possiblefile = \"$path/f5configs/$hostname-*\";\n $ls = `ls $path/f5configs | grep .ucs`;\n if ($ls ne \"\" ) {\n @files = split '\\n', $ls;\n foreach (@files) {\n $rm = qq!rm -rf \"$path/f5configs/$_\"!;\n `$rm`;\n }\n }\n $Error = 0;\n $Error += system($f5cmd);\n if ($Error != 0) {\n print ERROR \"$month\\/$day\\/$year: $f5cmd command failed for $hostname\\n\";\n exit 1;\n } else {\n print ERROR \"$month\\/$day\\/$year: $f5cmd command completed successfully\\n\";\n }\n}\nclose ERROR;\nexit 0; ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"7194","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:277526":{"__typename":"Conversation","id":"conversation:277526","topic":{"__typename":"TkbTopicMessage","uid":277526},"lastPostingActivityTime":"2015-07-05T03:11:14.000-07:00","solved":false},"TkbTopicMessage:message:277526":{"__typename":"TkbTopicMessage","subject":"ringdump","conversation":{"__ref":"Conversation:conversation:277526"},"id":"message:277526","revisionNum":1,"uid":277526,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":700},"postTime":"2015-03-12T16:38:58.000-07:00","lastPublishTime":"2015-03-12T16:38:58.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: loop a tcpdump until a log message is seen Code : # Updated: 10/16/06\n\n#!/usr/bin/perl\n## VERSION v0.9b\n\nuse strict;\n\n\n################\n# tcpdump settings\n##########\n\nmy %SETTINGS = (\n external => { filter => \"port 443\" },\n internal => { filter => \"port 80\" },\n lo0 => { filter => \"port 80\" },\n);\n\nmy $SNAPLEN = 4352;\n\n################\n# script settings\n######\n\n# free space checking\nmy $FREE_SPACE_CHECK_INTERVAL = 1; # check free space every this number of seconds\nmy $MIN_FREE_SPACE = 5; # minimum percent space left on parition\nmy $CAPTURE_LOCATION = $ARGV[0];\n\n# file rotation settings\nmy $CAPTURES_TO_ROTATE = 4; # tcpdump capture files to rotate\nmy $DESIRED_CAPTURE_SIZE = 15; # megabytes per capture file before rotating\nmy $OVERLAP_DURING_ROTATE = 5; # seconds to overlap previous capture while starting a new one\nmy $CAPTURE_CHECK_INTERVAL = 1; # how often (seconds) to check the size of capture files for rotating\n\n# trigger settings - time (run tcpdumps for x seconds)\n#my $TRIGGER = \"time-based\";\nmy $TIME_TO_CAPTURE = 300;\n\n# trigger settings - log-message (stop tcpdump when log message is received)\nmy $TRIGGER = \"log-message based\";\nmy $LOG_FILE = \"/var/log/messages\";\nmy $LOG_MESSAGE = \"no space in response line\";\nmy $FOUND_MESSAGE_WAIT = 5; # how many seconds to gather tcpdumps after we match the log message\n\n# misc\nmy $IDLE_TIMER = 5; # if ! receiving log entries, how long before checking if log is rotated\nmy $MAX_ROTATED_LINES = 10000; # max lines to read from file we're re-reading because it's been rotated\nmy $PID_FILE = \"/var/run/ring_dump.pid\";\nmy $DEBUG = 0; # 0/1\n\n\n\n\n####################################################\n# END OF THINGS THAT SHOULD NEED TO BE CONFIGURED\n####################################################\n\n\n\n########\n# set defaults\n###\n\n$SNAPLEN ||= 4352;\n$TRIGGER ||= \"time\";\n$CAPTURE_LOCATION ||= \"/var/tmp\";\n$TIME_TO_CAPTURE ||= 60;\n$FREE_SPACE_CHECK_INTERVAL ||= 5;\n$CAPTURES_TO_ROTATE ||= 3;\n$DESIRED_CAPTURE_SIZE ||= 10;\n$OVERLAP_DURING_ROTATE ||= 5;\n$CAPTURE_CHECK_INTERVAL ||= 5;\n$MIN_FREE_SPACE ||= 5;\n$LOG_FILE ||= \"/var/log/messages\";\n$LOG_MESSAGE ||= \"FAILED\";\n$FOUND_MESSAGE_WAIT ||= 5;\n$IDLE_TIMER ||= 5;\n$PID_FILE ||= \"/var/run/ring_dump.pid\";\n$DEBUG ||= 0;\n\nunless (-d $CAPTURE_LOCATION) {\n print \"$CAPTURE_LOCATION isn't a directory, using /mnt instead\\n\\n\";\n $CAPTURE_LOCATION = \"/mnt\";\n}\n\nif (! -r $LOG_FILE) {\n die \"Can't read \\\"$LOG_FILE\\\", EXIT\\n\";\n}\n\n# insert code to find tcpdump instead of relying on path HERE:\n\nmy $tcpdump = \"/usr/sbin/tcpdump\";\n\n\n######\n# misc global variable declaration\n##########\n\nmy($answer, $interface, $pid, $tail_child, $F_LOG);\nmy($current_size, $current_inode, $last_size, $last_inode);\n\nmy @child_pids;\nmy $ppid = $$;\nmy $min_megabytes = $CAPTURES_TO_ROTATE * $DESIRED_CAPTURE_SIZE;\n\n$current_size = $current_inode = $last_size = $last_inode = 0;\n$|++;\n\n\n###########\n# functions\n#######\n\n\n# exit function that does does necessary child handling\n\nsub finish {\n $_ = shift();\n if (defined($_) && $_ ne \"\") {\n print;\n }\n\n foreach $interface (keys( %SETTINGS )) {\n push(@child_pids, $SETTINGS{$interface}{pid});\n }\n\n $DEBUG && print \"INTERRUPT: sending SIGINT and SIGTERM to: \", join(\" \", @child_pids), \"\\n\";\n kill(2, @child_pids);\n sleep(1);\n kill(15, @child_pids);\n $DEBUG && print \"INTERRUPT: done, unlink pidfile and exit\\n\";\n\n unlink($PID_FILE);\n exit(0);\n}\n\n$SIG{INT} = sub { finish(); };\n\n\n# report usage on CAPTURE_LOCATION's MB free from df\n\nsub free_megabytes {\n my $partition = shift();\n $partition ||= $CAPTURE_LOCATION;\n\n my $free_megabytes;\n\n $DEBUG && print \"free_megabytes(): capture partition is $partition\\n\";\n\n open(DF, \"df $partition|\");\n\n # discard the first line;\n $_ = ;\n\n # parse the usage out of the second line\n $_ = ;\n $free_megabytes = (split)[3];\n $free_megabytes = int($free_megabytes / 1024);\n\n close(DF);\n\n $DEBUG && print \"free_megabytes(): finished reading df, output is: $free_megabytes\\n\";\n\n $free_megabytes;\n}\n\n\n# report usage on CAPTURE_LOCATION's % usage from df\n\nsub free_percent {\n my $partition = shift();\n $partition ||= $CAPTURE_LOCATION;\n\n my $free_percent;\n\n $DEBUG && print \"free_percent(): capture partition is $partition\\n\";\n\n open(DF, \"df $partition|\");\n\n # discard the first line;\n $_ = ;\n\n # parse the usage out of the second line\n $_ = ;\n $free_percent = (split)[4];\n chop($free_percent); ## chop off '%'\n $free_percent = (100 - $free_percent);\n\n close(DF);\n\n $DEBUG && print \"free_percent(): finished reading df, output is: $free_percent\\n\";\n\n $free_percent;\n}\n\n\n# simple sub to send SIGHUP to syslogd\n\nsub restart_syslogd () {\n if (-f \"/var/run/syslog.pid\") {\n open(PIDFILE, \";\n chomp;\n\n kill(1, ($_));\n\n 1;\n}\n\n\n# simple wrapper to start tcpdumps, assuming obvious globals\n\nsub start_tcpdump {\n my $interface = shift();\n my $capture_file = shift();\n my $filter = shift();\n\n my @cmd = (\"$tcpdump\", \"-s$SNAPLEN\", \"-i$interface\", \"-w$capture_file\", \"$filter\");\n\n $DEBUG || open(STDERR, \">/dev/null\");\n $DEBUG && print \"start_tcpdump(): about to start: \", join(\" \", @cmd), \"\\n\";\n\n exec($cmd[0], @cmd[1..$#cmd]) ||\n print \"start_tcpdump(): FAILED to start: \", join(\" \", @cmd), \", command not found\\n\";\n $DEBUG || close(STDERR);\n\n exit(1);\n}\n\n\n# sub to see how much space a given capture file is using (to decide to rotate or not)\n\nsub capture_space ($) {\n my $capture_file = shift();\n my $size = ( stat($capture_file) )[7];\n\n $DEBUG && print \"capture_space(): size of $capture_file is $size\\n\";\n\n # return size of argument in megabytes, but don't divide by zero\n if ($size == 0) {\n return 0;\n } else {\n return ($size / 1048576);\n }\n}\n\n\n# gives user the option to create a MFS\n\nsub create_mfs () {\n if (-d $CAPTURE_LOCATION) {\n $DEBUG && print \"create_mfs(): directory $CAPTURE_LOCATION exists\\n\";\n } else {\n mkdir($CAPTURE_LOCATION, oct(0755)) || die \"FAILED to create $CAPTURE_LOCATION\\n\";\n print \"Capture directory ($CAPTURE_LOCATION) did not exist, so it was created\\n\";\n }\n\n # figure out the partition CAPTURE_LOCATION is on. This is cheap... fixme\n my $partition = $CAPTURE_LOCATION;\n $partition =~ s!(/[A-z0-9]*)/{0,1}.*!$1!g;\n\n open(MOUNT, \"mount|\") || die \"FAILED to run \\\"mount\\\": !$\\n\";\n while ( ) {\n next unless ((split())[2] =~ /^$partition$/);\n\n $DEBUG && print \"create_mfs(): partition: $partition is already mounted, return\\n\";\n\n # return 1 if it's already mounted\n return 1;\n }\n close(MOUNT);\n\n print \"Mount a Memory File System (MFS) on ${CAPTURE_LOCATION}? [y/n]: \";\n\n my $answer = ;\n\n if (lc($answer) =~ \"y\") {\n print \"Enter size of MFS in blocks (200000 = 100M), or just press enter for 100M: \";\n\n chomp (my $mfs_size = );\n $mfs_size = 200000 if ($mfs_size eq \"\");\n\n print \"Allocating $mfs_size blocks to $CAPTURE_LOCATION for MFS\\n\";\n system(\"mount_mfs -s $mfs_size $CAPTURE_LOCATION\");\n\n if (($? >> 8) != 0) {\n print \"an error occurring trying to mount the MFS filesystem, exit status: $?\\n\";\n 0;\n } else {\n print \"MFS file system established\\n\\n\";\n 1;\n }\n }\n}\n\n\nsub fork_to_background ($) {\n my $cmd = shift();\n\n my $pid = fork();\n\n if ($pid == 0) {\n exec($cmd) || die \"exec() failed: $!\\n\";\n } else {\n return($pid);\n }\n}\n\n\nsub popen_read ($) {\n my $cmd = shift();\n my $child;\n\n $DEBUG && print \"Background: \\\"$cmd\\\"\\n\";\n\n pipe(READLOG, WRITELOG);\n select(READLOG); $|++; select(WRITELOG); $|++; select(STDOUT);\n\n ## dup STDOUT and STDERR\n open(T_STDOUT, \">&STDOUT\");\n open(T_STDERR, \">&STDERR\");\n\n ## redir STDOUT to pipe for child\n open(STDOUT, \">&WRITELOG\");\n open(STDERR, \">&WRITELOG\");\n\n $child = fork_to_background($cmd);\n\n ## close STDOUT, STDERR and FILE\n close(STDOUT); close(STDERR);\n\n ## re-open STDOUT as normal and close dup\n open(STDOUT, \">&T_STDOUT\"); close(T_STDOUT);\n open(STDERR, \">&T_STDERR\"); close(T_STDERR);\n\n return($child, \\*READLOG);\n}\n\n\nsub open_log ($$) {\n my $LOG_FILE = shift();\n my $lines = shift();\n\n if (defined($F_LOG) && defined(fileno($F_LOG)) ) {\n $DEBUG && print \"Killing child before closing LOG\\n\";\n kill(15, $tail_child);\n waitpid($tail_child, 0);\n\n $DEBUG && print \"Closing LOG\\n\";\n close($F_LOG);\n }\n\n $DEBUG && print \"Opening \\\"$LOG_FILE\\\"\\n\";\n\n ($tail_child, $F_LOG) = popen_read(\"tail -n $lines -f $LOG_FILE\");\n push(@child_pids, $tail_child);\n\n 1;\n}\n\n\n## check to see if log is rotated, returns true if rotated\n\nsub is_rotated ($) {\n my $LOG_FILE = shift();\n \n $DEBUG && print \"enter is_rotated()\\n\";\n \n ($current_inode, $current_size) = (stat($LOG_FILE))[1,7];\n \n if (($last_size != 0) && ($last_size > $current_size)) {\n $DEBUG && print \"File is now smaller. File must have been rotated\\n\";\n $last_size = $current_size;\n $last_inode = $current_inode;\n \n open_log($LOG_FILE, $MAX_ROTATED_LINES) || die \"open_log $LOG_FILE failed: $!\\n\";\n return(1);\n \n } elsif (($last_inode != 0) && ($last_inode != $current_inode)) {\n $DEBUG && print \"Inode changed. File must have been rotated\\n\";\n $last_inode = $current_inode;\n $last_size = $current_size;\n \n open_log($LOG_FILE, $MAX_ROTATED_LINES) || die \"open_log $LOG_FILE failed: $!\\n\";\n return(1);\n \n }\n\n ($last_inode, $last_size) = ($current_inode, $current_size);\n\n 0;\n}\n\n\n\n\n###########\n# MAIN\n########\n\nif (free_megabytes() < $min_megabytes) {\n print \"free space on $CAPTURE_LOCATION is below ${min_megabytes}MB, you must create a Memory File System or choose another location to gather tcpdumps\\n\";\n goto MUST_MFS;\n}\n\n######### GET USER INPUT ###############\n\nif (free_percent() < $MIN_FREE_SPACE) {\n print \"free space on $CAPTURE_LOCATION is below ${MIN_FREE_SPACE}%, you must create a Memory File System or choose another location to gather tcpdumps\\n\";\n\nMUST_MFS:\n # require the user to create a MFS if they don't have enough free space\n exit(1) unless (create_mfs());\n} else {\n create_mfs();\n}\n\nif (free_percent() < $MIN_FREE_SPACE || free_megabytes() < $min_megabytes) {\n print \"it appears the Memory File System is in place, but there is still insufficient space, exiting\\n\";\n exit(1);\n}\n\nprint \"capturing to $CAPTURE_LOCATION using the following interfaces and filters:\\n\";\n\nforeach $interface (keys( %SETTINGS )) {\n system(\"ifconfig $interface >/dev/null 2>&1\");\n\n if ( ($? >> 8) != 0) {\n $DEBUG && print \"couldn't ifconfig $interface, removing from list\\n\";\n delete( $SETTINGS{$interface} );\n } else {\n print \" $interface: $SETTINGS{$interface}{filter}\\n\";\n }\n}\n\nprint \"does this look right? [y/n]: \";\n\n$answer = ;\nexit unless lc($answer) =~ \"y\";\n\n\n####### DAEMONIZE #############\nchdir(\"/\");\nexit unless (fork() == 0);\n \n \n# kill old self, write pid file\nif (-f $PID_FILE) {\n open(PIDFILE, \"<$PID_FILE\");\n kill(15, );\n close(PIDFILE);\n}\n\nopen(PIDFILE, \">$PID_FILE\");\nsyswrite(PIDFILE, $$);\nclose(PIDFILE);\n\n\n\n########### START PROCESSING ###############\n\nforeach $interface (keys( %SETTINGS )) {\n my $filter = $SETTINGS{$interface}{filter};\n $pid = fork();\n $SETTINGS{$interface}{rotate_number} = 1;\n\n if (!defined($pid)) {\n print \"fork() failed! exiting\\n\";\n exit 1;\n }\n\n if ($pid == 0) {\n start_tcpdump(\n $interface,\n \"$CAPTURE_LOCATION/${interface}.dump.$SETTINGS{$interface}{rotate_number}\",\n $filter\n );\n\n exit 1;\n } else {\n $SETTINGS{$interface}{pid} = $pid;\n print \"started tcpdump as pid $pid on \\\"$interface\\\" filtered as \\\"$filter\\\"\\n\";\n }\n}\n\n\n\n######\n# fork off a process to keep an eye on free space\n########\n\n$pid = fork();\n\nif ($pid == 0) {\n while (1) {\n my $sleep_return = sleep($FREE_SPACE_CHECK_INTERVAL);\n $DEBUG && ($sleep_return != $FREE_SPACE_CHECK_INTERVAL) && print \"WARN: free_percent() loop: sleep returned $sleep_return instead of $FREE_SPACE_CHECK_INTERVAL !\\n\";\n\n if (free_percent() < $MIN_FREE_SPACE) {\n print \"WARN: free space is below ${MIN_FREE_SPACE}%, killing main script\\n\";\n\n kill(2, $ppid);\n sleep(1);\n kill(15, $ppid);\n\n print \"WARN: sent SIGTERM to $ppid (main script), exiting\\n\";\n exit 1;\n } else {\n $DEBUG && print \"free_percent(): space is fine, continue\\n\";\n }\n }\n} else {\n push(@child_pids, $pid);\n $DEBUG && print \"started free_percent watcher as: $pid\\n\";\n}\n\n\n######\n# fork off a process to rotate capture files as necessary\n########\n\n$pid = fork();\n\nif ($pid == 0) {\n my $capture_file;\n\n while (1) {\n my $sleep_return = sleep($CAPTURE_CHECK_INTERVAL);\n $DEBUG && ($sleep_return != $CAPTURE_CHECK_INTERVAL) && print \"WARN: start_tcpdump() loop: sleep returned $sleep_return instead of $CAPTURE_CHECK_INTERVAL !\\n\";\n\n foreach $interface (keys( %SETTINGS )) {\n if (capture_space(\"$CAPTURE_LOCATION/${interface}.dump.$SETTINGS{$interface}{rotate_number}\") >= $DESIRED_CAPTURE_SIZE) {\n\n if ($SETTINGS{$interface}{rotate_number} == $CAPTURES_TO_ROTATE) {\n print \"reached maximum number of captures to rotate: $CAPTURES_TO_ROTATE, starting over at 1\\n\";\n $SETTINGS{$interface}{rotate_number} = 1;\n } else {\n $SETTINGS{$interface}{rotate_number}++;\n }\n\n print \"rotating capture file: ${interface}.dump, new extension .$SETTINGS{$interface}{rotate_number}\\n\";\n\n $pid = fork();\n\n if ($pid == 0) {\n start_tcpdump(\n $interface,\n \"$CAPTURE_LOCATION/${interface}.dump.$SETTINGS{$interface}{rotate_number}\",\n $SETTINGS{$interface}{filter},\n );\n\n exit 0;\n }\n push(@child_pids, $pid);\n\n # get some overlap in the two files\n sleep($OVERLAP_DURING_ROTATE);\n\n # kill the old tcpdump\n kill(2, $SETTINGS{$interface}{pid});\n $DEBUG && print \"sent SIGINT to $interface: $SETTINGS{$interface}{pid}, new pid $pid\\n\";\n\n # record the new pid\n $SETTINGS{$interface}{pid} = $pid;\n } else {\n $DEBUG && print \"capture file doesn't need to be rotated yet: ${interface}.dump\\n\";\n }\n }\n\n # Reap any zombies from old tcpdumps\n $DEBUG && print \"start_tcpdump() loop: \\@child_pids = (\", join(' ', @child_pids), \")\\n\";\n while (1) {\n use POSIX \":sys_wait_h\";\n my $child = waitpid(-1, WNOHANG);\n if (defined $child and $child > 0) {\n # remove PID from @child_pids\n @child_pids = grep {$_ != $child} @child_pids;\n $DEBUG && print \"start_tcpdump() loop: reaped child PID $child\\n\";\n } else {\n # no one to reap\n last;\n }\n }\n }\n} else {\n push(@child_pids, $pid);\n $DEBUG && print \"started capture file watcher as: $pid\\n\";\n}\n\n\n################\n# watch triggers (time or log based)\n####################\n\n$SIG{TERM} = sub { finish(); };\n\nif (lc($TRIGGER) =~ /time/) {\n print \"time-based trigger, will capture for $TIME_TO_CAPTURE seconds\\n\";\n\n sleep($TIME_TO_CAPTURE);\n\n print \"captured for $TIME_TO_CAPTURE seconds, stopping tcpdumps\\n\";\n\n} elsif (lc($TRIGGER) =~ /log/) {\n print \"log-based trigger, waiting for \\\"$LOG_MESSAGE\\\" in \\\"$LOG_FILE\\\"\\n\";\n\n # creates global $F_LOG filehandle of $LOG_FILE\n open_log($LOG_FILE, 0) || finish(\"open_log $LOG_FILE failed: $!\\n\");\n\n # flush syslogd's buffers (avoid never getting the message due to \"last message repeated....\")\n restart_syslogd() || finish(\"Restarting syslogd failed, EXIT\\n\");\n\n # tail -f the log and wait for message\n while (1) {\n # reap any zombies during each loop\n my $return;\n\n while (1) {\n use POSIX \":sys_wait_h\";\n my $child = waitpid(-1, WNOHANG);\n if (defined $child and $child > 0) {\n $DEBUG && print \"log trigger loop: reaped child PID $child\\n\";\n } else {\n # no one to reap\n last;\n }\n }\n\n eval {\n $SIG{ALRM} = sub { die(\"ALRM\\n\"); };\n \n alarm($IDLE_TIMER);\n $_ = <$F_LOG>;\n alarm(0);\n };\n \n if ($@) {\n # this only occurs if we're idle for $IDLE_TIMER seconds because no new log entries are occuring\n \n $@ = undef;\n is_rotated($LOG_FILE);\n \n next;\n }\n \n $DEBUG && print \"in LOG reading loop, current line: \\\"$_\\\"\\n\";\n\n if (/$LOG_MESSAGE/) {\n $DEBUG && print \"Current line matches: \\\"$LOG_MESSAGE\\\"\\n\";\n\n last;\n }\n \n $DEBUG && print \"no match, next\\n\";\n }\n\n print \"received log message, sleeping $FOUND_MESSAGE_WAIT seconds then stopping tcpdumps\\n\";\n sleep($FOUND_MESSAGE_WAIT);\n}\n\n\n# figure out current tcpdump child_pids and push them onto the list\n\nforeach $interface (keys( %SETTINGS )) {\n push(@child_pids, $SETTINGS{$interface}{pid});\n}\n\n\n# kill all tcpdumps + free space watcher + capture file rotator -- doesn't return\nfinish();\n\n0;\n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"17768","kudosSumWeight":0,"repliesCount":1,"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:273923":{"__typename":"Conversation","id":"conversation:273923","topic":{"__typename":"TkbTopicMessage","uid":273923},"lastPostingActivityTime":"2017-09-11T13:55:49.000-07:00","solved":false},"User:user:5791":{"__typename":"User","uid":5791,"login":"dwertz_104302","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-9.svg"},"id":"user:5791"},"TkbTopicMessage:message:273923":{"__typename":"TkbTopicMessage","subject":"BIG-IP Backup Script In Bash","conversation":{"__ref":"Conversation:conversation:273923"},"id":"message:273923","revisionNum":1,"uid":273923,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:5791"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":699},"postTime":"2015-03-12T16:27:19.000-07:00","lastPublishTime":"2015-03-12T16:27:19.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: A script that can backup F5 configurations, runs daily, and FTP's the backup to a defined remote server. You will need to change the ftphost, user and password variables to reflect the FTP server you are connecting to as well as change the directory where the script has \"cd /F5/JAX1\" to reflect the clients directory structure. \n Cron job setup \n To ensure a daily backup, save the script source below in /etc/cron.daily: Code : #!/bin/bash\n# set the date variable\ntoday=$(date +'%Y%m%d') \nftphost=\"ADD FTP IP HERE\"\nuser=\"ADD FTP USERNAME HERE\"\npassword=\"ADD FTP PASSWORD HERE\"\n#run the F5 bigpipe config builder\ncd /\nbigpipe config save /config.ucs\n#Rename the config.ucs and append the date to the end\nNUM=0\nuntil [ \"$NUM\" -eq 5 ]\ndo\nif [ -f /config.ucs ]\nthen mv config.ucs config-$today.ucs ; break\nelse sleep 5\nfi\nNUM=`expr \"$NUM\" + 1`\ndone\n[[ ! -f /config-$today.ucs ]] && exit 1\n#Open the FTP connection and move the file\nftp -in < ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"986","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}}},"Conversation:conversation:277923":{"__typename":"Conversation","id":"conversation:277923","topic":{"__typename":"TkbTopicMessage","uid":277923},"lastPostingActivityTime":"2021-06-22T16:24:08.000-07:00","solved":false},"User:user:3005":{"__typename":"User","uid":3005,"login":"Mohamed_Lrhazi_","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"},"id":"user:3005"},"TkbTopicMessage:message:277923":{"__typename":"TkbTopicMessage","subject":"Syslog NG Email Configuration","conversation":{"__ref":"Conversation:conversation:277923"},"id":"message:277923","revisionNum":1,"uid":277923,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:3005"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":648},"postTime":"2015-03-12T16:41:39.000-07:00","lastPublishTime":"2015-03-12T16:41:39.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: We describe here how to setup syslog-ng to send syslog messages via email. There is an AskF5 solution - SOL3667: Configuring SNMP trap alerts to send email notifications - which describes how to configure messages to be emailed via alertd and which is the only supported way. This procedure provides full control over the form of the email and the messages being sent, but is not supported. A supported alternative is to configure syslog-ng to forward messages to another server where you could apply any customizations you need, including what we describe here. How to use this snippet: Simply copy the configuration script source below to a text editor, edit to fit your environment, then install the configuration following the procedure detailed in this article: LTM 9.4.2+: Custom Syslog Configuration \n Please note the following: \n \n (Enable and disable by removing or inserting hash/comment marks at the beginning of the line.) \n 5.With a Postfix destination enabled, the Postfix server process will accept the mail and inject into the queue even if the Postfix system is unable to send mail. Next time Postfix is enabled, all queued mail will be delivered. If you've been testing without Postfix running, you might want to take advantage of these commands to manage the queue before bringing the service up: \n To inspect the Postfix queue use the command: postqueu –p To forcibly empty the queue: postsuper -dALL \n How it works \n When syslog-ng first parses the production version of this configuration, it starts the program specified in the d_email destination stanza (/usr/sbin/sendmail –bs), which is the Postfix SMTP server running in standalone daemon mode. \n When a message arrives that matches the filter, syslog-ng will use the template to compose the message and feed it via SMTP to Postfix. \n You have full access to every aspect of the email via the template. You can set the subject, the body, add any extra headers you wish, such as X-headers. You can insert any of the syslog-ng defined macros anywhere you like. For more information, please see the The syslog-ng Administrator Guide \n If for whatever reason the SMTP server process exits, syslog-ng will restart it, but only one copy is ever executed concurrently. Code : syslog include \"\n\ntemplate t_smtp {\n template_escape(no);\n template(\\\"NOOP\nHELO localhost\nMAIL From: \nRCPT To: \nDATA\nDate: $R_STAMP\nFrom: \nTo: \nSubject: \n\n$S_DATE [$FACILITY:$PRIORITY] $MSG\n.\n\\\");\n\n};\n\nfilter f_test {\n match(\\\" \\\") ;\n};\n\n# destination #1 - to logfile for initial stanza development\n# Disable in production\ndestination d_logfile { \n file(\\\"/var/log/syslog-email-config.log\\\"\n );\n};\n\n# destination #2 - to email with postfix logging for debugging mail transport issues\n# Disable in production\n#destination d_logfile_email {\n# program(\\\"/usr/sbin/sendmail -bs > /var/log/syslog-ng-sendmail.log 2>&1\\\"\n# ts_format(\\\"rfc3339\\\")\n# template(t_smtp)\n# );\n#};\n\n# destination #3 - to email for production\n# Enable only after validating filters and mail transport are operating as expected\n#destination d_email {\n# program(\\\"/usr/sbin/sendmail -bs\\\" ts_format(\\\"rfc3339\\\") template(t_smtp));\n#};\n\n\nlog {\n source(local);source(s_bcm56xxd);source(s_tomcat4);source(s_tmm);\n destination(d_logfile);\n# destination(d_logfile_email);\n# destination(d_email);\n filter(f_test);\n};\n\" ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3442","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:277502":{"__typename":"Conversation","id":"conversation:277502","topic":{"__typename":"TkbTopicMessage","uid":277502},"lastPostingActivityTime":"2015-03-12T16:32:11.000-07:00","solved":false},"TkbTopicMessage:message:277502":{"__typename":"TkbTopicMessage","subject":"BIG-IP Remote Interface Bandwidth Monitor","conversation":{"__ref":"Conversation:conversation:277502"},"id":"message:277502","revisionNum":1,"uid":277502,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":435},"postTime":"2015-03-12T16:32:11.000-07:00","lastPublishTime":"2015-03-12T16:32:11.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This script polls the BIG-IP via SNMP and displays the current bandwidth utilization for one or all interfaces. How to use this snippet: Install script on remote system with appropriate permissions. Make sure Perl and the Net::SNMP perl module are installed. Code : #!/usr/bin/perl -w\n# This code is not supported by F5 Network and is offered under the GNU General Public License. Use at your own risk.\n\nuse strict;\nuse Net::SNMP qw(:snmp);\n\nmy ($host, $snmp_comm, $interval, $int);\n\nif (! @ARGV) {\n print \"Please enter the LTM host name or IP: \";\n chomp ($host = );\n print \"\\nPlease enter the LTM SNMP Community String: \";\n chomp ($snmp_comm = );\n print \"\\nPlease enter the polling interval for calculating the delta: \";\n chomp ($interval = );\n print \"\\nPlease enter the interface you wish to poll (Enter 0 for all interfaces): \";\n chomp ($int = );\n} else {\n my $usage = \"ltm_intStat.pl \";\n\n die \"Usage: $usage\\n\" if $#ARGV != 3;\n\n $host = $ARGV[0];\n $snmp_comm = $ARGV[1];\n $interval = $ARGV[2];\n $int = $ARGV[3];\n chomp ($host , $snmp_comm , $interval, $int);\n}\n\nmy $allInts_OID = \".1.3.6.1.4.1.3375.2.1.2.4.1.2.1.1\";\nmy $ltm_InBytes_Index = \"1.3.6.1.4.1.3375.2.1.2.4.4.3.1.3.\";\nmy $ltm_OutBytes_Index = \"1.3.6.1.4.1.3375.2.1.2.4.4.3.1.5.\";\n\nmy ($session, $error) = Net::SNMP->session(\n -hostname => $host,\n -community => $snmp_comm,\n -port => 161,\n -version => 'snmpv2c',\n -nonblocking => 0\n );\n\nif (!defined $session) {\n print \"Received no SNMP response from $host\\n\";\n print STDERR \"Error: $error\\n\";\n exit -1;\n }\n \nif ($int eq 0) {\n\n my $allInts = $session->get_table ( -baseoid => $allInts_OID );\n my %int_table = %{$allInts};\n print \"\\n\\n\";\n \n foreach my $key (sort keys %int_table){\n \n #Convert interface name to OID string\n my @chars = unpack(\"C\" x length($int_table{$key}),$int_table{$key});\n my $int_length = length( $int_table{$key} );\n unshift(@chars, $int_length);\n my $int_oid = join('.' , @chars);\n \n #Build OID from index & interface\n my $ltm_intBytesIn = $ltm_InBytes_Index . $int_oid;\n my $ltm_intBytesOut = $ltm_OutBytes_Index . $int_oid;\n\n #Get first instance\n my $oids_1 = $session->get_request(\n -varbindlist =>\n [$ltm_intBytesIn, $ltm_intBytesOut] );\n \n # Wait for second poll\n sleep $interval;\n\n #Get second instance\n my $oids_2 = $session->get_request(\n -varbindlist =>\n [$ltm_intBytesIn, $ltm_intBytesOut] );\n\n #Calculate Rates\n my $rate_in = ($oids_2->{$ltm_intBytesIn} - $oids_1->{$ltm_intBytesIn})*8 / ($interval*1000000);\n my $rate_out = ($oids_2->{$ltm_intBytesOut} - $oids_1->{$ltm_intBytesOut})*8 / ($interval*1000000);\n my $rate_total = $rate_in + $rate_out;\n \n #Trim to 4 decimal places\n $rate_in =~s/(^\\d{1,}\\.\\d{4})(.*$)/$1/;\n $rate_out =~s/(^\\d{1,}\\.\\d{4})(.*$)/$1/;\n $rate_total =~s/(^\\d{1,}\\.\\d{4})(.*$)/$1/;\n\n #Print Results\n print \"Interface $int_table{$key} rate (Mbits/sec)\";\n print \"\\n\\n\\t$rate_in (IN)\\n\";\n print \"\\t$rate_out (OUT)\\n\";\n print \"\\t$rate_total (TOTAL)\\n\\n\"; \n }\n} else {\n \n #Convert interface name to OID string\n my @chars = unpack(\"C\" x length($int),$int);\n my $int_length = length( $int );\n unshift(@chars, $int_length);\n my $int_oid = join('.' , @chars);\n \n #Build OID from index & interface\n my $ltm_intBytesIn = $ltm_InBytes_Index . $int_oid;\n my $ltm_intBytesOut = $ltm_OutBytes_Index . $int_oid;\n\n #Get first instance\n my $oids_1 = $session->get_request(\n -varbindlist =>\n [$ltm_intBytesIn, $ltm_intBytesOut] );\n\n sleep $interval;\n\n #Get second instance\n my $oids_2 = $session->get_request(\n -varbindlist =>\n [$ltm_intBytesIn, $ltm_intBytesOut] );\n\n #Calculate Rates\n my $rate_in = ($oids_2->{$ltm_intBytesIn} - $oids_1->{$ltm_intBytesIn})*8 / ($interval*1000000);\n my $rate_out = ($oids_2->{$ltm_intBytesOut} - $oids_1->{$ltm_intBytesOut})*8 / ($interval*1000000);\n my $rate_total = $rate_in + $rate_out;\n \n #Trim to 4 decimal places\n $rate_in =~s/(^\\d{1,}\\.\\d{4})(.*$)/$1/;\n $rate_out =~s/(^\\d{1,}\\.\\d{4})(.*$)/$1/;\n $rate_total = ~s/(^\\d{1,}\\.\\d{4})(.*$)/$1/;\n\n #Print Results\n print \"Interface $int rate (Mbits/sec)\";\n print \"\\n\\n\\t$rate_in (IN)\\n\";\n print \"\\t$rate_out (OUT)\\n\";\n print \"\\t$rate_total (TOTAL)\\n\\n\";\n \n} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4873","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:277505":{"__typename":"Conversation","id":"conversation:277505","topic":{"__typename":"TkbTopicMessage","uid":277505},"lastPostingActivityTime":"2017-03-23T09:06:53.000-07:00","solved":false},"TkbTopicMessage:message:277505":{"__typename":"TkbTopicMessage","subject":"BIG-IP Multi Host CPU Monitor","conversation":{"__ref":"Conversation:conversation:277505"},"id":"message:277505","revisionNum":1,"uid":277505,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":411},"postTime":"2015-03-12T16:29:33.000-07:00","lastPublishTime":"2015-03-12T16:29:33.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This script polls the BIG-IP via SNMP and displays the current CPU utilization for each processor and the global utilization for all processors. How to use this snippet: Install script on remote system with appropriate permissions. Make sure Perl and the Net::SNMP perl module are installed. Code : #!/usr/bin/perl -w\n# This code is not supported by F5 Network and is offered under the GNU General Public License. Use at your own risk.\n\nuse strict;\nuse Net::SNMP qw(:snmp);\n\nmy ($host, $snmp_comm);\n\n$host = $ARGV[0];\n$snmp_comm = $ARGV[1];\nchomp ($host , $snmp_comm);\n\nmy $cpuIndex = \".1.3.6.1.4.1.3375.2.1.7.5.2.1.2.1.48\";\n\nmy $cpuUsageRatio5s = \".1.3.6.1.4.1.3375.2.1.7.5.2.1.19.1.48.\";\nmy $cpuUsageRatio1m = \".1.3.6.1.4.1.3375.2.1.7.5.2.1.27.1.48.\";\nmy $cpuUsageRatio5m = \".1.3.6.1.4.1.3375.2.1.7.5.2.1.35.1.48.\";\n\nmy $gcpuUsageRatio5s = \".1.3.6.1.4.1.3375.2.1.1.2.20.21.0\";\nmy $gcpuUsageRatio1m = \".1.3.6.1.4.1.3375.2.1.1.2.20.29.0\";\nmy $gcpuUsageRatio5m = \".1.3.6.1.4.1.3375.2.1.1.2.20.37.0\";\n\nmy ($session, $error) = Net::SNMP->session(\n -hostname => $host,\n -community => $snmp_comm,\n -port => 161,\n -version => 'snmpv2c',\n -nonblocking => 0\n );\n\nif (!defined $session) {\n print \"Received no SNMP response from $host\\n\";\n print STDERR \"Error: $error\\n\";\n exit -1;\n }\n \nmy $allCPU = $session->get_table ( -baseoid => $cpuIndex );\nmy %cpu_table = %{$allCPU};\nmy $x = 0;\n\nprint \"\\n\\nCPU Utilization:\\t5s\\t1m\\t5m\\n\\n\";\n\nforeach my $key (sort keys %cpu_table) {\nmy @oid_index = split(/\\./, $key);\nmy $ltm_cpu5s = $cpuUsageRatio5s . $oid_index[-1];\nmy $ltm_cpu1m = $cpuUsageRatio1m . $oid_index[-1];\nmy $ltm_cpu5m = $cpuUsageRatio5m . $oid_index[-1];\n\nmy $oid_ratios = $session->get_request(\n-varbindlist =>\n[$ltm_cpu5s, $ltm_cpu1m, $ltm_cpu5m] );\n\nprint \"\\tCPU$x\\t\\t$oid_ratios->{$ltm_cpu5s}\\t$oid_ratios->{$ltm_cpu1m}\\t$oid_ratios->{$ltm_cpu5m}\\n\";\n\n$x++;\n}\n\nmy $oid_gratios = $session->get_request(\n-varbindlist =>\n[$gcpuUsageRatio5s, $gcpuUsageRatio1m, $gcpuUsageRatio5m] );\n\nprint \"\\tGlobal\\t\\t$oid_gratios->{$gcpuUsageRatio5s}\\t$oid_gratios->{$gcpuUsageRatio1m}\\t$oid_gratios->{$gcpuUsageRatio5m}\\n\\n\\n\"; ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2338","kudosSumWeight":0,"repliesCount":1,"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:284161":{"__typename":"Conversation","id":"conversation:284161","topic":{"__typename":"TkbTopicMessage","uid":284161},"lastPostingActivityTime":"2017-03-06T11:22:57.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"},"id":"user:29768"},"TkbTopicMessage:message:284161":{"__typename":"TkbTopicMessage","subject":"ASM All Policy Export","conversation":{"__ref":"Conversation:conversation:284161"},"id":"message:284161","revisionNum":1,"uid":284161,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:29768"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":299},"postTime":"2015-03-12T16:24:51.000-07:00","lastPublishTime":"2015-03-12T16:24:51.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: ASM all policy export v1.4 - 15 Aug 2007 \n Writes out the active policy for each ASM web application to a gzip'd tar archive (see usage subrouting for details) \n Tested on BIG-IP ASM versions: 9.2.4, 9.4.0, 9.4.1 \n Aaron Hooley - LODOGA Security Limited (hooleylists at gmail dot com) Code : #!/usr/bin/perl \n#\n# ASM policy export\n# v1.4 - 15 Aug 2007\n#\n# Writes out the active policy for each ASM web application to a gzip'd tar archive\n# (see usage subrouting for details)\n#\n# Tested on BIG-IP ASM versions: 9.2.4, 9.4.0, 9.4.1\n#\n# Aaron Hooley - LODOGA Security Limited (hooleylists@gmail.com)\n#\n\nuse strict;\nuse warnings;\nuse DBI;\nuse lib '/ts/packages/';\nuse GenUtils qw//;\nuse POSIX qw/strftime/;\nuse File::Path;\n# pass_through: all unknown options are left in @ARGV\nuse Getopt::Long qw(:config pass_through);\nuse File::Basename;\n\n$SIG{PIPE} = 'IGNORE';\n\nuse constant DEBUG => 1; # 1 = log debug messages to standard out; 0 = don't use debug\nuse constant OUTPUT_DIR => '/shared/asm_all_policy_export/output/'; # Default output directory for finalized compressed tar archive containing each output file\n\n# options below these shouldn't need to be modified\n\nuse constant UCS_DIR => '/var/local/ucs/'; # If writing output file as a UCS for access to files via the GUI, use the UCS directory\nuse constant TMP_DIR => '/shared/tmp/'; # Temporary directory to write the individual policies to\nuse constant VERSION_FILE => '/VERSION'; # File which contains BIG-IP version info\nuse constant LOCK_FILE => '/ts/lock/asm_all_policy_export.lock'; # Lock file used to ensure only one copy of the script is executing at a time\nuse constant USERS_CFG_FILE => '/ts/common/users.cfg'; # System file containing user and database details\nuse constant VERSION_FILE => '/VERSION'; # System file which contains BIG-IP version info\nuse constant DRIVER => GenUtils::cfg_get_config_item(USERS_CFG_FILE, 'DATABASE', 'Driver');\nuse constant DCC => GenUtils::cfg_get_config_item(USERS_CFG_FILE, 'DATABASE', 'Name');\nuse constant PLC => GenUtils::cfg_get_config_item(USERS_CFG_FILE, 'POLICY_DATABASE', 'Name');\nuse constant DB_USER => GenUtils::cfg_get_config_item(USERS_CFG_FILE, 'DATABASE', 'User');\nuse constant F5_EXPORT_SCRIPT => '/ts/tools/import_export_policy.pl';\n\n# Stop this script if ASM is not licensed\ncheck_license();\n\n# Create a lock so only one instance of script runs at a time\nmy ($lock_sub,$unlock_sub,$cleanup_lock_sub) = \n GenUtils::lock_factory(LOCK_FILE)\n or fatal_error(\"Cannot open lockfile '\".LOCK_FILE.\"': $!\");\n$lock_sub->();\n\n# Stop the script if the F5 single policy export script doesn't exist\nif (not (-e F5_EXPORT_SCRIPT)){\n fatal_error(qq{Cannot access F5 export script: }.F5_EXPORT_SCRIPT.\"\\n\\n\");\n}\n\n# Get command line options if the script was called correctly\n# Return variables (and their default values) are: debug ('not_set'), output_path ('not_set'), output_file ('not_set'), use_ucs_dir (0)\n# As the handle_commandline_arguments subroutine handles the help flag itself, we don't need to consider it\nmy %args = handle_commandline_arguments();\n\n# Set the debug level to the higher level of the constant and command line interface (CLI) option. See usage for debug levels.\nmy $debug = $args{debug};\nif ($debug eq 'not_set') {\n $debug = DEBUG;\n}\nprint \"Verbose debug enabled\\n\" if $debug > 1;\n\n# Get MySQL password (and verify the BIG-IP version is supported by this script)\nmy $mysql_pass = get_mysql_password();\n\n# Verify required config items were read successfully\nif (not defined DRIVER or not defined DCC or not defined PLC or not defined DB_USER or not defined $mysql_pass){\n fatal_error(qq{Problems accessing database users configuration file\\n\\n});\n}\n\n# Get current timestamp for output filename, formatted as %Y-%m-%d_%H-%M-%S\nmy $date = get_date();\n\n# Set output directory according to CLI option or default from constant.\n# If use_ucs_dir option is enabled, ignore any other setting for the path of the output and use UCS_DIR constant value\nmy $use_ucs_dir = 0;\nmy $output_path;\n\n# Check if the CLI option for using the UCS dir is set\nif ($args{use_ucs_dir}==1){\n # It is; so we're writing out the output file to the UCS directory\n $use_ucs_dir = 1;\n $output_path = UCS_DIR;\n} elsif ($args{output_path} ne 'not_set' and length($args{output_path}) > 1){\n # UCS option wasn't set, and another output path was set via CLI option\n $output_path= $args{output_path};\n} else {\n # UCS option wasn't set and no output path was specified in CLI option, so use the default path from the constant\n $output_path = OUTPUT_DIR;\n}\n# Add a trailing slash to the output path if it's not there already\nif (substr($output_path,-1,1) ne \"/\") {\n $output_path .= \"/\";\n}\n\n# Create the output path if it doesn't exist already (skip this for the UCS path as it has to already exist)\nif (not $use_ucs_dir){\n make_output_path($output_path);\n}\n\n# Set the output fully qualified filename according to CLI if set, else default to the constant value\nmy $output_file;\nif ($args{output_file} eq 'not_set' or length($args{output_file})==0){\n # Output file wasn't specified in CLI option, so use the default\n $output_file = build_output_filename_with_path($output_path, $date);\n} else {\n # An output file was specified in the CLI option so use that for the filename\n $output_file = $output_path.$args{output_file};\n}\n\n# Append .ucs to the filename if using the UCS path for output, so the GUI will present it in the archive list.\n# Check that the filename doesn't already end in .ucs\nif ($use_ucs_dir==1 and not ($output_file =~ /.*?\\.ucs$/i)){\n $output_file .= \".ucs\";\n}\n\n# Check if mysql is up. If not, start it\nmy $restore_mysql_to_prior_state = check_mysql(); \n\n# Run the export subroutine \nexport();\n\n# Stop mysql if it wasn't running before we started \n$restore_mysql_to_prior_state->(); \n\n# Release the lock\n$unlock_sub->();\n$cleanup_lock_sub->();\nexit;\n\n#\n# Main subroutine which exports the active policies and writes the output to a compressed tar archive\n#\nsub export {\n\n # Initialize an array to store the full path/filename for the individual exported policies \n my @exported_filenames;\n\n # SQL query to retrieve the names of each web app, the active policy name and the active policy ID\n my $sql_statement = qq{\n SELECT a.domain_name AS 'Web App', p.name AS 'Policy', p.id AS 'POLICY.ID'\n FROM DCC.ACCOUNTS a INNER JOIN PLC.PL_POLICIES p\n ON a.active_policy_id = p.id;\n };\n\n # Connect to mysql database\n my $dbh = connect_to_db($mysql_pass);\n\n # Prepare the SQL statement\n my $sth = $dbh->prepare($sql_statement) \n or fatal_error(qq{Problems preparing sql: |$sql_statement|: $DBI::errstr\\n\\n});\n\n # Execute the SQL statement\n $sth->execute()\n or fatal_error(qq{Problems executing sql: |$sql_statement|: $DBI::errstr\\n\\n}); \n\n print $sth->rows().\" active policies in resultset\\n\" if $debug > 1;\n\n # Loop through each web app and export the active policy using the F5 export policy script\n while (my @row = $sth->fetchrow_array()) {\n\n # Parse the three column values for this record\n my ($webapp, $policy_name, $policy_id) = @row;\n\n print \"\\$webapp = $webapp; \\$policy_name = $policy_name, \\$policy_id = $policy_id\\n\" if $debug > 1;\n\n # Build file name for a single policy\n my $single_policy = $webapp.'_'.$policy_name.'_'.$date.'.plc';\n\n # Add current single policy file to the array of files\n push (@exported_filenames, $single_policy);\n\n # Call the F5 supplied policy export command:\n # /ts/tools/import_export_policy.pl -a ACTION -p POLICY_ID -f OUTPUT_FILE\n # example: /ts/tools/import_export_policy.pl -a export -p 1 -f /shared/tmp/policy_export/my-web-app_policy-name_2007-08-01_12-00-00.plc\n my @export_cmd = ( 'nice -n 19', F5_EXPORT_SCRIPT, '-a export', '-p', $policy_id, '-f', TMP_DIR.$single_policy);\n print \"@export_cmd \\n\" if $debug > 1;\n\n # Run the export command for a single policy\n my $out = `@export_cmd`; \n print \"policy export result: $out\\n\" if $debug > 1;\n\n if (not ($out =~ \"successfully\")){\n fatal_error( qq/Failed to export policy using '@export_cmd'\\n\\n/ );\n }\n }\n\n # tar up the files (uses 'nice -n 19' to lower the CPU priority for the tar'ing)\n my @tar_cmd = ( 'nice -n 19 tar', '-z', '-c', '-f', $output_file, '-C', TMP_DIR, @exported_filenames);\n\n print @tar_cmd if $debug > 1;\n\n system(\"@tar_cmd\") == 0\n or fatal_error( qq/Failed to create tar using '@tar_cmd'/ );\n\n # Clean up temp files\n cleanup(@exported_filenames);\n\n # Report success with the output file name\n print \"Exported \".$sth->rows().\" policies to \" . $output_file . \"\\n\" if $debug > 0; \n\n # Log a successful message to syslog\n GenUtils::ts_syslog( 'info', 'All active ASM policies exported to %s', $output_file );\n\n}\n\n#\n# Other subroutines\n#\n\nsub get_mysql_password {\n\n # Verify BIG-IP version is supported and get MySQL password based on version\n my $bigip_version = get_bigip_version();\n\n # Initialize a variable to store the MySQL password. MySQL password is different between (9.2.x/9.3.x) and 9.4.x+\n my $mysql_pass;\n\n # If version is 9.4.x use F5 function get_mysql_password\n if (substr($bigip_version,0,3) eq \"9.4\"){ \n $mysql_pass = GenUtils::get_mysql_password();\n } elsif (substr($bigip_version,0,3) eq \"9.2\" or substr($bigip_version,0,3) eq \"9.3\"){\n # For 9.2.x and 9.3.x, get it from the users.cfg file\n $mysql_pass = GenUtils::cfg_get_config_item(USERS_CFG_FILE, 'DATABASE', 'Password');\n } else {\n # Parsed version was unknown, so kill the script\n fatal_error(qq{Version $bigip_version unknown\\n\\n});\n }\n print \"\\$mysql_pass: $mysql_pass\\n\" if $debug > 1;\n return $mysql_pass;\n}\n\n\nsub build_output_filename_with_path {\n\n # Build the path/filename for the output file. Expect the path and date as parameters.\n my ($output_path, $date) = @_;\n\n # Get BIG-IP hostname\n my $bigip_hostname = get_bigip_hostname();\n\n # Build name of output tar ball with fully qualified path\n return ($output_path . $bigip_hostname.\"_policy-export_$date.tgz\");\n}\n\nsub get_bigip_hostname {\n # Get the BIG-IP hostname\n my $hostname = `hostname`;\n if (not defined $hostname){\n fatal_error(qq{Cannot get BIG-IP hostname using hostname command});\n } else {\n chomp($hostname);\n return $hostname;\n }\n}\nsub get_bigip_version {\n # Get the BIG-IP version to determine how to get MySQL root password\n my $version;\n\n # Check if version file exists\n if (-f VERSION_FILE){\n # Open the version file or stop script\n open (my $fh, '<', VERSION_FILE) \n or fatal_error(qq{get_bigip_version: cannot open version file }.VERSION_FILE);\n # Read in the contents of the version file\n while (<$fh>){\n # Do case insensitive search for \"version: xxx\" and get the match from a backreference ($1)\n if ($_ =~ /^version:\\s+(\\S+)$/i){\n $version = $1;\n print \"get_bigip_version: \\$version: $version\\n\" if $debug > 1;\n }\n }\n if (not $version){\n # Kill the script as we couldn't parse the version\n fatal_error(qq{get_bigip_version: Could not parse version from: }.VERSION_FILE.\"\\n\");\n }\n close $fh;\n } else {\n fatal_error(qq{get_bigip_version: version file does not exist: }.VERSION_FILE);\n }\n return (\"$version\");\n}\n\nsub cleanup {\n # Clean up temp files used during policy export\n\n print \"Cleaning up\\n\" if $debug > 1;\n my (@files_to_cleanup) = @_;\n\n foreach my $file (@files_to_cleanup) {\n if ( -e TMP_DIR.$file ) {\n print \"Deleting temp file: \" . TMP_DIR . $file . \"\\n\" if $debug > 1;\n unlink TMP_DIR.$file\n or warn qq/Failed to remove file '/. TMP_DIR . $file . qq/': $!/;\n }\n }\n}\n\nsub check_mysql {\n # Is mysql running?\n my $mysql_was_up = GenUtils::check_mysql();\n return sub {\n GenUtils::stop_mysql() unless $mysql_was_up;\n };\n}\n\nsub connect_to_db {\n # Open database connection\n #my $mysql_pass = @_;\n my $database = 'DCC';\n my $dbh = DBI->connect( \n \"DBI:\".DRIVER.\":\".$database, \n DB_USER, \n $mysql_pass, {\n PrintError => 0,\n RaiseError => 0,\n FetchHashKeyName => 'NAME_lc',\n } \n ) or fatal_error( \"Cannot connect to $database: $DBI::errstr\\n\" );\n return $dbh;\n}\n\nsub check_license {\n # Kill script if ASM isn't licensed\n if ( not GenUtils::is_ts_licensed() ) {\n GenUtils::ts_syslog( 'info', 'ASM support is not enabled' );\n fatal_error(qq{ASM is not licensed. Aborting script.\\n});\n }\n}\n\nsub get_date {\n # Get date in format year-month-day_hour-minute-second\n return POSIX::strftime( \"%Y-%m-%d_%H-%M-%S\", localtime );\n}\n\nsub make_output_path {\n # Create the output path if it doesn't exist already\n my ($output_path) = @_;\n\n if (not (-d $output_path)){\n eval { mkpath($output_path) };\n if ($@) {\n fatal_error(qq{Could not create path $output_path: $@\\n});\n } else {\n print \"make_output_path: made path $output_path\" if $debug > 1;\n }\n }\n}\n\nsub fatal_error {\n # Write error details to syslog and exit script\n my ($msg,%args) = @_;\n GenUtils::ts_syslog('err', \"%s\", $msg);\n print $msg;\n exit(1);\n}\n\nsub handle_commandline_arguments {\n\n # Set some default values for the options\n my %arguments = ();\n $arguments{debug} = 'not_set';\n $arguments{output_path} = 'not_set';\n $arguments{output_file} = 'not_set';\n $arguments{use_ucs_dir} = 0;\n $arguments{help} = 0;\n \n # Parse the options from the command line\n my $options = GetOptions (\n \"debug|d:i\" => \\$arguments{debug}, # match for debug or d as an integer\n \"output_path|p:s\" => \\$arguments{output_path}, # match on output_path or p as a string\n \"output_filename|f:s\" => \\$arguments{output_file}, # match on output_file or f as a string\n \"use_ucs_directory|u\" => \\$arguments{use_ucs_dir}, # match on use_ucs_directory or u, binary type\n \"help|h\" => \\$arguments{help}, # match on help or h, binary type\n );\n # Debug printing of options \n if ($arguments{debug} ne 'not_set' and $arguments{debug} > 1){\n while (my ($key, $value) = each(%arguments)){\n print $key.\": \".$value.\"\\n\";\n }\n if (@ARGV){\n print \"extra args found: \\n\"; \n print \"@ARGV\\n\";\n }\n }\n\n # print the usage info if the options couldn't be parsed, help option was enabled, unknown options were used, or the output_path doesn't start with a /\n if ($arguments{help}){\n print \"Help option set\\n\".usage();\n } elsif (@ARGV) {\n print \"Unparsed options set: \\n\";\n print \"@ARGV\\n\";\n print usage();\n } elsif ($arguments{output_path} ne \"not_set\" and substr($arguments{output_path},0,1) ne \"/\"){\n print \"output_file value must start with a forward slash\\n\".usage();\n } else {\n return %arguments;\n }\n}\n\nsub usage {\n # stop the script if this sub is called, as we're just printing the options for calling the script\n\n # get script name \n my ($script_name, $gar, $bage) = File::Basename::fileparse($0);\n die (qq{\n--------------------------------------------------------------\nNAME\n $script_name \n - ASM all policy export\n\n Write out each active policy to a single compressed tar archive\n\nDESCRIPTION\n $script_name\n - Write out the policy that is marked as active for each ASM web application.\n Each policy is exported from the internal database and written to a combined\n gzip compressed tar archive. The output path and filename can be configured \n using command line options or in constants defined in the script.\n \nOPTIONS\n -d --debug\n 0 - print nothing to standard output\n 1 - print output filenames to standard output\n 2 - print verbose logging to standard ouput\n\n Note: values greater than 2 are considered as 2\n\n Default: 1\n\n -p --output_path\n String containing the directory to write the output file. If the path does not exist it will be created.\n Must start with a leading forward slash.\n\n Note: this option is ignored if the -u/--use_ucs_dir option is enabled\n\n Default: }.OUTPUT_DIR.qq{\n\n -f --output_filename\n String containing the name of the output file.\n\n Note: if the -u/--use_ucs_dir option is enabled, the file extension \".ucs\" \n will be appended to the filename if not already present.\n\n Default: BIGIP_HOSTNAME_policy-export_DATE.tgz\n\n -u --use_ucs_directory\n If enabled, the output file will be written to the UCS directory with a file extension of \".ucs\". \n This allows access to the output file via the BIG-IP admin GUI under System >> Archives.\n\n Note: use of this option overrides the use of the -f/--output_dir option\n\n Default: Disabled\n\n -h --help\n Print this help menu\n\nEXAMPLES\n $script_name -d 2 -p /path/to/ -f output.tgz\n\n Use debug level 2, write output to the specified path and file\n\n $script_name --debug 2 --ucs --output_filename asm_policy_export.tgz.ucs\n\nUse debug level 2, write output archive to the UCS directory with the specified filename.\n\n--------------------------------------------------------------\n});\n} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"18494","kudosSumWeight":0,"repliesCount":1,"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:277492":{"__typename":"Conversation","id":"conversation:277492","topic":{"__typename":"TkbTopicMessage","uid":277492},"lastPostingActivityTime":"2023-06-05T22:31:58.855-07:00","solved":false},"TkbTopicMessage:message:277492":{"__typename":"TkbTopicMessage","subject":"Action On Log","conversation":{"__ref":"Conversation:conversation:277492"},"id":"message:277492","revisionNum":2,"uid":277492,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":280},"postTime":"2015-03-12T16:20:56.000-07:00","lastPublishTime":"2023-06-05T22:31:58.855-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Perl script that runs as a daemon to watch a log file (like tail in the background), and runs a command when a certain message is found. Smart enough to keep working when log files get rotated, etc. Very handy when you need to run a command to start gathering debugging data or recover from failure that is indicated by a log message. How to use this snippet: Note that when the script is first started it sends SIGHUP to syslogd (or syslog-ng if present) which causes the daemons to reload their configuration files and flush their log buffers. This is needed in case the message you want to find is currently being suppressed by \"last message repeated XX times\". \n The script is configured by editing the first 3 variables at the top of the script that specify the log file to watch via $LOG_FILE, log message to look for via $LOG_MESSAGE, and the action to take via $ACTION (i.e. command to run). \n The $LOG_MESSAGE to match is a regular expression matched against each new line in the log file like this: \n if (/$LOG_MESSAGE/) \n So if you specify a simple $LOG_MESSAGE like this: $LOG_MESSAGE = \"test string\"; \n This would match so long as any part of the log line contained \"test string\". So \"foobar test string asdf\" would still match \"test string\". \n There are 2 additional (optional) configuration parameters after the first 3 that specify how often to check if the log file has been rotated via $IDLE_TIMER, and how many lines to read when re-opening a log file that has been rotated via $MAX_ROTATED_LINES. \n The script can be tested like so: \n Determine which facility/severity messages are sent to /var/log/messages based on your syslog.conf or syslog-ng.conf. In my case, uucp.notice goes there. \n Start the script with default settings: \n perl action_on_log.pl \n \n The default action is to append a string to a file named \"/var/tmp/mylog.txt\", so first cat this file and make sure it's empty: \n cat /var/tmp/mylog.txt \n \n Now send the log messages the script is checking for: \n logger -p uucp.notice \"foo watchdog bar\" \n \n Repeat step #3 -- this time you'll see that the file exists and contains the expected message. \n \n You can stop the daemon like so: \n kill $(cat /var/run/action_on_log.pid)\n \n\n OS Support \n Older versions of this script have been tested against a fairly wide variety of unix-like platforms with great success, including BSDi 3.x, FreeBSD 4.x, Linux (2.4.x-era and current 2.6.x-era distros). Some have reported success running this script directly on BIG-IP 4.x and 9.x, though obviously F5 wouldn't support doing so. \n (Modify $LOG_FILE, $LOG_MESSAGE, and $ACTION as appropriate, and optionally $IDLE_TIMER, and $MAX_ROTATE_LINES) Code : #!/usr/bin/perl\n## VERSION v0.5\n\nuse warnings;\nuse strict;\n\n\n################\n# script settings\n######\n\nmy $LOG_FILE = \"/var/log/messages\";\nmy $LOG_MESSAGE = \"watchdog\";\nmy $ACTION = \"echo log message found >> /var/tmp/mylog.txt\";\n\n\n# misc\nmy $IDLE_TIMER = 5; # if ! receiving log entries, how long before checking if log is rotated\nmy $MAX_ROTATED_LINES = 500; # max lines to read from file we're re-reading because it's been rotated\nmy $DEBUG = 0; # 0/1\n\n####################################################\n# END OF THINGS THAT SHOULD BE CONFIGURED\n####################################################\n\n\n\n########\n# set defaults\n###\nmy($PID_FILE);\n\n$LOG_FILE ||= \"/var/log/messages\";\n$LOG_MESSAGE ||= \"FAILED\";\n$IDLE_TIMER ||= 5;\n$PID_FILE ||= \"/var/run/action_on_log.pid\";\n$DEBUG ||= 0;\n\n######\n# misc global variable declaration\n##########\n\nmy($TAIL_CHILD_PID, $TAIL_OUTPUT_PIPE);\nmy($CURRENT_SIZE, $CURRENT_INODE, $LAST_SIZE, $LAST_INODE);\n\n$CURRENT_SIZE = $CURRENT_INODE = 0;\n$LAST_SIZE = $LAST_INODE = -1;\n\n$|++;\n\n\n###########\n# functions\n#######\n\n\n# exit function that does does necessary child handling\n\nsub finish () {\n if (defined $TAIL_CHILD_PID && $TAIL_CHILD_PID != 0) {\n\n $DEBUG && print \"INTERRUPT: sending SIGINT and SIGTERM to: $TAIL_CHILD_PID\\n\";\n kill(2, $TAIL_CHILD_PID);\n sleep(1);\n kill(15, $TAIL_CHILD_PID);\n waitpid($TAIL_CHILD_PID, 0);\n }\n $DEBUG && print \"INTERRUPT: unlink pidfile and exit\\n\";\n\n unlink($PID_FILE);\n exit(0);\n}\n\n$SIG{INT} = sub { finish(); };\n\n\n# simple sub to send SIGHUP to syslogd\n\nsub restart_syslogd () {\n if (-f \"/var/run/syslog.pid\") {\n open(PIDFILE, \";\n chomp;\n\n kill(1, ($_));\n\n 1;\n}\n\n\nsub fork_to_background ($) {\n my $cmd = shift();\n\n my $pid = fork();\n\n if ($pid == 0) {\n exec($cmd) || die \"exec() failed: $!\\n\";\n } else {\n return($pid);\n }\n}\n\n\nsub popen_read ($) {\n my $cmd = shift();\n my $child;\n\n $DEBUG && print \"Background: \\\"$cmd\\\"\\n\";\n\n pipe(READLOG, WRITELOG);\n select(READLOG); $|++; select(WRITELOG); $|++; select(STDOUT);\n\n ## dup STDOUT and STDERR\n open(T_STDOUT, \">&STDOUT\");\n open(T_STDERR, \">&STDERR\");\n\n ## redir STDOUT to pipe for child\n open(STDOUT, \">&WRITELOG\");\n open(STDERR, \">&WRITELOG\");\n\n $child = fork_to_background($cmd);\n\n ## close STDOUT and STDERR inherited by child\n close(STDOUT); close(STDERR);\n\n ## re-open STDOUT as normal for this process and close dup\n open(STDOUT, \">&T_STDOUT\"); close(T_STDOUT);\n open(STDERR, \">&T_STDERR\"); close(T_STDERR);\n\n return($child, \\*READLOG);\n}\n\n\nsub open_log ($$) {\n my $LOG_FILE = shift();\n my $lines = shift();\n\n if (defined($TAIL_OUTPUT_PIPE) &&\n defined(fileno($TAIL_OUTPUT_PIPE)) &&\n $TAIL_CHILD_PID != 0) {\n $DEBUG && print \"Killing tail child pid $TAIL_CHILD_PID before closing LOG\\n\";\n kill(15, $TAIL_CHILD_PID);\n waitpid($TAIL_CHILD_PID, 0);\n $TAIL_CHILD_PID = 0;\n\n $DEBUG && print \"Closing LOG\\n\";\n close($TAIL_OUTPUT_PIPE);\n }\n\n if (! -f $LOG_FILE) {\n $DEBUG && print \"Log file \\\"$LOG_FILE\\\" not found\\n\";\n $TAIL_OUTPUT_PIPE = undef;\n return 0;\n }\n\n $DEBUG && print \"Opening \\\"$LOG_FILE\\\"\\n\";\n ($TAIL_CHILD_PID, $TAIL_OUTPUT_PIPE) = popen_read(\"tail -n $lines -f $LOG_FILE\");\n\n 1;\n}\n\n\n## check to see if log is rotated, returns true if rotated\n\nsub is_rotated ($) {\n my $LOG_FILE = shift();\n\n $DEBUG && print \"enter is_rotated()\\n\";\n\n ($CURRENT_INODE, $CURRENT_SIZE) = (stat($LOG_FILE))[1,7];\n\n if (!defined $CURRENT_INODE || !defined $CURRENT_SIZE) {\n $CURRENT_INODE = 0;\n $CURRENT_SIZE = 0;\n }\n\n if (($LAST_SIZE > 0) && ($LAST_SIZE > $CURRENT_SIZE)) {\n $DEBUG && print \"File is smaller. File must have been rotated\\n\";\n ($LAST_INODE, $LAST_SIZE) = ($CURRENT_INODE, $CURRENT_SIZE);\n open_log($LOG_FILE, $MAX_ROTATED_LINES);\n return(1);\n\n } elsif (($LAST_INODE > 0) && ($LAST_INODE != $CURRENT_INODE)) {\n $DEBUG && print \"Inode changed. File must have been rotated\\n\";\n ($LAST_INODE, $LAST_SIZE) = ($CURRENT_INODE, $CURRENT_SIZE);\n open_log($LOG_FILE, $MAX_ROTATED_LINES);\n return(1);\n } elsif ($LAST_INODE == 0 && $LAST_SIZE == 0) {\n $DEBUG && print \"Size and inode were 0 last time. File must have been removed\\n\";\n ($LAST_INODE, $LAST_SIZE) = ($CURRENT_INODE, $CURRENT_SIZE);\n open_log($LOG_FILE, $MAX_ROTATED_LINES);\n return(1);\n }\n\n ($LAST_INODE, $LAST_SIZE) = ($CURRENT_INODE, $CURRENT_SIZE);\n\n 0;\n}\n\n\n\n\n###########\n# MAIN\n########\n\n####### DAEMONIZE #############\nchdir(\"/\");\nexit unless (fork() == 0);\n\n\n# kill old self, write pid file\nif (-f $PID_FILE) {\n open(PIDFILE, \"<$PID_FILE\");\n kill(15, );\n close(PIDFILE);\n}\n\nopen(PIDFILE, \">$PID_FILE\");\nsyswrite(PIDFILE, $$);\nclose(PIDFILE);\n\n\n\n## set handler for SIGTERM (regular kill)\n$SIG{TERM} = sub { finish(); };\n\n\n################\n# watch log-based trigger\n####################\n\nprint \"\\nWaiting for \\\"$LOG_MESSAGE\\\" in \\\"$LOG_FILE\\\". Will run:\\n\\\"$ACTION\\\"\\n\";\n\n# creates global $TAIL_OUTPUT_PIPE filehandle of $LOG_FILE\nopen_log($LOG_FILE, 0);\n\n# flush syslogd's buffers (avoid never getting the message due to \"last message repeated....\")\nrestart_syslogd();\n\nLOOP:\n# tail -f the log and wait for message\nwhile (1) {\n if (!defined($TAIL_OUTPUT_PIPE) || !defined(fileno($TAIL_OUTPUT_PIPE)) ) {\n # this suggests the file was removed while we were using it...\n sleep($IDLE_TIMER);\n is_rotated($LOG_FILE);\n next;\n }\n\n eval {\n $SIG{ALRM} = sub { die(\"ALRM\\n\"); };\n\n alarm($IDLE_TIMER);\n $_ = readline($TAIL_OUTPUT_PIPE);\n alarm(0);\n };\n\n if ($@) {\n # this only occurs if we're idle for $IDLE_TIMER seconds because no new log entries are occuring\n\n $@ = undef;\n is_rotated($LOG_FILE);\n\n next;\n }\n\n chop();\n $DEBUG && print \"in LOG reading loop, current line: \\\"$_\\\"\\n\";\n\n if (/$LOG_MESSAGE/) {\n $DEBUG && print \"Current line matches: \\\"$LOG_MESSAGE\\\"\\n\";\n last;\n }\n\n $DEBUG && print \"no match, next\\n\";\n}\n\n## log message found: DO SOMETHING\nsystem($ACTION);\ngoto LOOP;\n\n\n# kill all children; doesn't return\nfinish();\n\n0; ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"10100","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1728320186000","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/community/Navbar-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1728320186000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1728320186000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1728320186000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1728320186000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1728320186000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1728320186000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1728320186000","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 communtiy","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1728320186000","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1728320186000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1728320186000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1728320186000","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1728320186000","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1728320186000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1728320186000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1728320186000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1728320186000","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1728320186000","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1728320186000","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-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1728320186000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"messages.widget.messagelistfornodebyrecentactivitywidget-tab-main-messages-list-for-tag-widget-0":"mostViewed","nodeId":"board:codeshare","tagName":"management"},"buildId":"OKtI0OLKuXmERTJKBVqYX","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"24.11.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.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"],"appGip":true,"scriptLoader":[]}