"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/python\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"componentScriptGroups({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/python\"}}})":{"__typename":"ComponentRenderResult","html":""}},"componentScriptGroups({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageListTabs\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageListTabs-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1745262169148"}],"cachedText({\"lastModified\":\"1745262169148\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745262169148"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":null,"possibleValues":["en-US","es-ES"]},"repliesSortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT","localValue":"DEFAULT","possibleValues":["DEFAULT","LIKES","PUBLISH_TIME","REVERSE_PUBLISH_TIME"]}},"deleted":false},"CachedAsset:pages-1745262162659":{"__typename":"CachedAsset","id":"pages-1745262162659","value":[{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501733000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162659,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}","userBanned":"We're sorry, but you have been banned from using this site.","userBannedReason":"You have been banned for the following reason: {reason}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:theme:customTheme1-1745262151684":{"__typename":"CachedAsset","id":"theme:customTheme1-1745262151684","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745262169148","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745262169148","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/tags/TagPage-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1745262169148","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0","mimeType":"image/png"},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","entityType":"CATEGORY","displayId":"CrowdSRC","nodeType":"category","depth":1,"title":"CrowdSRC","shortTitle":"CrowdSRC","parent":{"__ref":"Category:category:top"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","entityType":"TKB","displayId":"codeshare","nodeType":"board","depth":2,"conversationStyle":"TKB","title":"CodeShare","description":"Have some code. Share some code.","avatar":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}"},"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:CrowdSRC"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:zihoc95639"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:CrowdSRC"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}},"canReadNode":{"__typename":"PolicyResult","failureReason":null}},"theme":{"__ref":"Theme:customTheme1"},"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"shortTitle":"CodeShare","tagPolicies":{"__typename":"TagPolicies","canSubscribeTagOnNode":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","args":[]}},"canManageTagDashboard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","args":[]}}}},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:board:codeshare-1745262167287":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:board:codeshare-1745262167287","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:1745262147309":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1745262147309","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"},{"children":[],"linkType":"EXTERNAL","id":"Common-external-link","url":"https://community.f5.com/c/how-do-i","target":"SELF"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745262169148","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-us-1745262174649":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-us-1745262174649","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-us-1745262174649":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-us-1745262174649","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-us-1745262174649":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-us-1745262174649","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-us-1745262174649":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-us-1745262174649","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745262169148","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1745262169148","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1745262169148","value":{"title@userScope:other":"Recent Content","title@userScope:self":"Contributions","title@board:FORUM@userScope:other":"Recent Discussions","title@board:BLOG@userScope:other":"Recent Blogs","emptyDescription":"No content to show","MessageListForNodeByRecentActivityWidgetEditor.nodeScope.label":"Scope","title@instance:1706288370055":"Content Feed","title@instance:1743095186784":"Most Recent Updates","title@instance:1704317906837":"Content Feed","title@instance:1743095018194":"Most Recent Updates","title@instance:1702668293472":"Community Feed","title@instance:1743095117047":"Most Recent Updates","title@instance:1704319314827":"Blog Feed","title@instance:1743095235555":"Most Recent Updates","title@instance:1704320290851":"My Contributions","title@instance:1703720491809":"Forum Feed","title@instance:1743095311723":"Most Recent Updates","title@instance:1703028709746":"Group Content Feed","title@instance:VTsglH":"Content Feed"},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:DevCentralNews":{"__typename":"Tkb","id":"board:DevCentralNews","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:GroupsCategory":{"__typename":"Category","id":"category:GroupsCategory","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:F5-Groups":{"__typename":"Category","id":"category:F5-Groups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CommunityGroups":{"__typename":"Category","id":"category:CommunityGroups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Occasion:board:Events":{"__typename":"Occasion","id":"board:Events","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"occasionPolicies":{"__typename":"OccasionPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Idea:board:Suggestions":{"__typename":"Idea","id":"board:Suggestions","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"ideaPolicies":{"__typename":"IdeaPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:communityarticles":{"__typename":"Tkb","id":"board:communityarticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:security-insights":{"__typename":"Tkb","id":"board:security-insights","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:article-series":{"__typename":"Tkb","id":"board:article-series","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Conversation:conversation:288887":{"__typename":"Conversation","id":"conversation:288887","topic":{"__typename":"TkbTopicMessage","uid":288887},"lastPostingActivityTime":"2025-01-09T05:35:13.957-08:00","solved":false},"User:user:172159":{"__typename":"User","uid":172159,"login":"Leon_Seng","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xNzIxNTktMjA5NDNpQTcyQThGQzE5NUQ0MzZFMg"},"id":"user:172159"},"TkbTopicMessage:message:288887":{"__typename":"TkbTopicMessage","subject":"TACACS+ External Monitor (Python)","conversation":{"__ref":"Conversation:conversation:288887"},"id":"message:288887","revisionNum":2,"uid":288887,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:172159"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1280},"postTime":"2021-09-15T16:22:58.000-07:00","lastPublishTime":"2025-01-09T05:35:13.957-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n This script is an external monitor for TACACS+ that simulates a TACACS+ client authenticating a test user, and marks the status of a pool member as up if the authentication is successful. If the connection is down/times out, or the authentication fails due to invalid account settings, the script marks the pool member status as down. \n \n This is heavily inspired by the Radius External Monitor (Python) by AlanTen. \n How to use this snippet: \n Prerequisite \n \n This script uses the TACACS+ Python client by Ansible (tested on version 2.6). \n \n \n Create the directory /config/eav/tacacs_plus on BIG-IP \n Copy all contents from tacacs_plus package into /config/eav/tacacs_plus. \n \n \n You may also need to download six.py from https://raw.githubusercontent.com/benjaminp/six/master/six.py and place it in /config/eav/tacacs_plus. \n You will need to have a test account provisioned on the TACACS+ server for the script to perform authentication. \n \n \n Installation \n On BIG-IP, import the code snippet below as an External Monitor Program File. \n \n Monitor Configuration \n Set up an External monitor with the imported file, and configure it with the following environment variables: \n \n KEY: TACACS+ server secret \n USER: Username for test account \n PASSWORD: Password for test account \n MOD_PATH: Path to location of Python package tacacs_plus, default: /config/eav \n TIMEOUT: Duration to wait for connectivity to TACACS server to be established, default: 3 \n \n Troubleshooting \n SSH to BIG-IP and run the script locally \n $ cd /config/filestore/files_d/Common_d/external_monitor_d/\n\n# Get name of uploaded file, e.g.:\n$ ls -la\n...\n-rwxr-xr-x. 1 tomcat tomcat 1883 2021-09-17 04:05 :Common:tacacs-monitor_39568_7\n\n# Run the script with the corresponding variables\n$ KEY=<my_tacacs_key> USER=<testuser> PASSWORD=<supersecure> python <external program file, e.g.:Common:tacacs-monitor_39568_7> <TACACS+ server IP> <TACACS+ server port>\n \n \n Code : \n #!/usr/bin/env python\n#\n# Filename : tacacs_plus_mon.py\n# Author : Leon Seng\n# Version : 1.2\n# Date : 2021/09/21\n# Python ver: 2.6+\n# F5 version: 12.1+\n# \n# ========== Installation\n# Import this script via GUI:\n# System > File Management > External Monitor Program File List > Import...\n# Name it however you want.\n# Get, modify and copy the following modules:\n\n# ========== Required modules\n# -- six --\n# https://pypi.org/project/six/\n# Copy six.py into /config/eav\n#\n# -- tacacs_plus --\n# https://pypi.org/project/tacacs_plus/ | https://github.com/ansible/tacacs_plus\n# Copy tacacs_plus directory into /config/eav\n\n# ========== Environment Variables\n# NODE_IP - Supplied by F5 monitor as first argument\n# NODE_PORT - Supplied by F5 monitor as second argument\n# KEY - TACACS+ server secret\n# USER - Username for test account\n# PASSWORD - Password for test account\n# MOD_PATH - Path to location of Python package tacacs_plus, default: /config/eav\n# TIMEOUT - Duration to wait for connectivity to TACACS server to be established, default: 3\n\nimport os\nimport socket\nimport sys\n\nif os.environ.get('MOD_PATH'):\n sys.path.append(os.environ.get('MOD_PATH'))\nelse:\n sys.path.append('/config/eav')\n\n# https://github.com/ansible/tacacs_plus\nfrom tacacs_plus.client import TACACSClient\n\nnode_ip = sys.argv[1]\nnode_port = int(sys.argv[2])\nkey = os.environ.get(\"KEY\")\nuser = os.environ.get(\"USER\")\npassword = os.environ.get(\"PASSWORD\")\ntimeout = int(os.environ.get(\"TIMEOUT\", 3))\n\n# Determine if node IP is IPv4 or IPv6\nfamily = None\ntry:\n socket.inet_pton(socket.AF_INET, node_ip)\n family = socket.AF_INET\nexcept socket.error: # not a valid address\n try:\n socket.inet_pton(socket.AF_INET6, node_ip)\n family = socket.AF_INET6\n except socket.error:\n sys.exit(1)\n\n# Authenticate against TACACS server\nclient = TACACSClient(node_ip, node_port, key, timeout=timeout, family=family)\ntry:\n auth = client.authenticate(user, password)\n if auth.valid:\n print \"up\"\nexcept socket.error:\n # EAV script marks node as DOWN when no output is present\n pass \n Tested this on version: \n 12.1 ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4351","kudosSumWeight":1,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:290993":{"__typename":"Conversation","id":"conversation:290993","topic":{"__typename":"TkbTopicMessage","uid":290993},"lastPostingActivityTime":"2024-11-21T03:23:59.412-08:00","solved":false},"User:user:195323":{"__typename":"User","uid":195323,"login":"Mark_Lloyd","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-7.svg?time=0"},"id":"user:195323"},"TkbTopicMessage:message:290993":{"__typename":"TkbTopicMessage","subject":"Python module to post and retrieve IControl Rest JSON objects for AVR statistics","conversation":{"__ref":"Conversation:conversation:290993"},"id":"message:290993","revisionNum":2,"uid":290993,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:195323"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":402},"postTime":"2016-06-26T14:05:08.000-07:00","lastPublishTime":"2023-06-05T22:51:27.504-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This module simplifies making Python dictionary objects that are converted to IControl rest AVR JSON objects. It also handles making AVR requests and retrieving results as well allowing multiple AVR requests to be queued, posted and retrieved. It also has some basis type checking for the elements of a AVR request. This module requires Bigip 12.1 on the target that statistics are retrieved. How to use this snippet: The main class is rest_avr.avr_req. It is a dictionary class that maps directly to an IControl Rest AVR JSON request as translated by json.dumps. Each dictionary element is an object derived from a customer class for each part of the request. The element classes have add() and clear() functions. if the element class only allows one entry the add() function will replace the existing entry, otherwise it will append the entry to the request element. The rest_avr.avr_req class also has functions to populate the HTTP host and authentication values for the target system. \n rest_avr.avr_req.post_and_response returns the Python representation of the JSON result of the query. \n rest_avr.avr_req.add_to_queue() adds the currently constructed request to a queue of requests to post. \n rest_avr.avr_req.post_and_response_queue() returns a python list of results of queued queries. \n The following code sample constructs, posts and returns results for an AVR statistics request for specific DNS records and a specificrecord type, then queues multiple quests and posts and returns results. \n #!/usr/bin/python\nimport json\nimport sys\nimport time\nimport rest_avr\n\n#print rest_avr.ShowAVRJsonApi\n\n#Populate the url\n\navr_dns_req=rest_avr.avr_req()\navr_dns_req.auth('admin','admin')\navr_dns_req.url_base('10.10.2.113','dns')\n\n#Populate the json object\n\navr_dns_req['analyticsModule'].add('dns')\navr_dns_req['reportFeatures'].add('time-aggregated')\navr_dns_req['entityFilters'].add('domain-name', 'OPERATOR_TYPE_EQUAL', ['test2.test1.com','test1.test1.com'])\navr_dns_req['entityFilters'].add('query-type', 'OPERATOR_TYPE_EQUAL', ['a'])\navr_dns_req['viewMetrics'].add('packets')\navr_dns_req['viewDimensions'].add('domain-name')\navr_dns_req['metricFilters'].add('packets', 'OPERATOR_TYPE_GREATER_THAN', 0)\navr_dns_req['sortByMetrics'].add('packets', 'ascending')\navr_dns_req['pagination'].add(20, 0)\navr_dns_req['timeRange'].add(1461778251000000, None)\n\n#Post and retrieve results.\n\nresult_py=avr_dns_req.post_and_response()\n\nif result_py != None:\n print ('\\n' + result_py['results']['timeAggregated'][0]['dimensions'][0]['value'] + \" \" + result_py['results']['timeAggregated'][0]['metricValues'][0]['value'] + '\\n')\n\nelse:\n print result_py.error_layer\n print result_py.error_code\n print result_py.error_text\n\n# Now add multiple requests to a queue\navr_dns_req.add_to_queue()\n\navr_dns_req['entityFilters'].clear()\navr_dns_req['entityFilters'].add('query-type', 'OPERATOR_TYPE_EQUAL', ['aaaa'])\navr_dns_req.add_to_queue()\n\n#post and retrieve queued results\nresult_py_q=avr_dns_req.post_and_response_queue()\n\nfor result_py in result_py_q:\n\n if result_py != None:\n print ('\\n' + result_py['results']['timeAggregated'][0]['dimensions'][0]['value'] + \" \" + result_py['results']['timeAggregated'][0]['metricValues'][0]['value'] + '\\n')\n else:\n print result_py.error_layer\n print result_py.error_code\n print result_py.error_text\n Code : \"\"\"\nrest_avr provides a python interface to Bigip AVR statistics using the REST API. The main Python rest_avr.avr_req\nobject is a Python dictionary that maps to a JSON object that can be processed with the json.dumps() function\n\nAn IControl Rest AVR JSON request and response can be initiated with avr_req.post_and_response\n\nThe simple description of the API can is available at avr_req.ShowJsonApi()\n\nEach of these modules has a method to add single or multiple elements as appropriate to the specific module.\nOnce these elements are are populated a RestAPI request can be made with results returned as a python\nrepresentation.\n\n\navr_req.auth(user, passw)\navr_req.url_base(host, module)\n\navr_req['analyticsModule'].add(module)\navr_req['analyticsModule'].clear()\n\navr_req['reportFeatures'].add(metric_name, predicate, value)\navr_req['reportFeatures'].clear()\n\navr_req['entityFilters'].add(dimension_name, predicate, values)\navr_req['entityFilters'].clear()\n\navr_req['viewMetrics'].add(metric_name)\navr_req['viewMetrics'].clear()\n\navr_req['viewDimensions'].add(metric_name, order)\navr_req['viewDimensions'].clear()\n\navr_req['metricFilters'].add(metric_name, predicate, valu)\navr_req['metricFilters'].clear()\n\navr_req['sortByMetrics'].add(metric_name, orde)\navr_req['sortByMetrics'].clear()\n\navr_req['pagination'].add(num_results, skip_result)\navr_req['pagination'].clear()\n\navr_req['timeRange'].add(t_from, t_to)\navr_req['timeRange'].clear()\n\n\nAfter a request in constructed a REST API call is initiated with initiated with:\n\navr_req.post_and_response()\n\nThe response is a python dictionary data structure of the results as processed by json.loads\n\n\"\"\"\n\n\n\nfrom copy import deepcopy\nimport requests\nimport json\nimport sys\nimport time\nimport warnings\n\n__author__ = 'Mark Lloyd'\n__version__ = '1.0'\n\n# 05/24/2016\nimport json\nimport requests\nimport time\n\n\nclass BadDictElement(Exception):\n def __init__(self, key, value, expl):\n Exception.__init__(self, '{0} {1} {2} '.format(key, value, expl))\n\n\nclass BadTime(Exception):\n def __init__(self, variable, value):\n Exception.__init__(self, '{0} {1} should be 16 char decimal in microseconds '.format('a', 'b'))\n\n\nclass RequestFailure(Exception):\n def __init__(self, key, value):\n Exception.__init__(self, '{0} {1} '.format(key, value))\n\n\nclass analyticsModule(str):\n \"\"\"\n This class is tied to the structure of the parent class.\n parent() get's the parent object so we can make the string pseudo-mutable.\n accessed from within an avr request\n\n ['analyticsModule'].add(module)\n Adds a single string to analyticsModule element . If one exists it is replaced.\n\n ['analyticsModule'].clear()\n Send a null value to the analyticsModule element.\n\n See rest_avr.ShowAVRJsonApi for more details\n\n\n \"\"\"\n\n def parent(self, parent):\n self.parent = parent\n\n def add(self, module):\n \"\"\"\n avr_req.['analyticsModule'].add(module)\n Adds a single string to analyticsModule element . If one already exists it is replaced.\n This should be the same as the module string in avr_req.url_base.\n \"\"\"\n self.parent['analyticsModule'] = analyticsModule(module)\n self.parent['analyticsModule'].parent = self.parent\n\n def clear(self):\n \"\"\"\n avr_req.['analyticsModule'].add(module)\n replaces the analyticsModule mddule with a null string\n \"\"\"\n self.parent['analyticsModule'] = analyticsModule('')\n self.parent['analyticsModule'].parent = self.parent\n\n\nclass metricFilters(list):\n \"\"\"\n avr_req.['metricFilters'].add(metric_name, predicate, value)\n\n metric name is a string, value is an integer\n\n Valid predicates strings are ['OPERATOR_TYPE_EQUAL', 'OPERATOR_TYPE_NOT_EQUAL', 'OPERATOR_TYPE_GREATER_THAN',\n OPERATOR_TYPE_LOWER_THAN','OPERATOR_TYPE_GREATER_THAN_OR_EQUAL', 'OPERATOR_TYPE_LOWER_THAN_OR_EQUAL'])\n\n avr_req['metricFilters'].clear()\n Clears metricFilters elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n\n \"\"\"\n\n def __init__(self):\n self.append([])\n self.valid_metric_predicate = (\n ['OPERATOR_TYPE_EQUAL', 'OPERATOR_TYPE_NOT_EQUAL', 'OPERATOR_TYPE_GREATER_THAN', 'OPERATOR_TYPE_LOWER_THAN',\n 'OPERATOR_TYPE_GREATER_THAN_OR_EQUAL', 'OPERATOR_TYPE_LOWER_THAN_OR_EQUAL'])\n\n def add(self, metric_name, predicate, value):\n \"\"\"\n avr_req.['metricFilters'].add(metric_name, predicate, value)\n\n metric name is a string, value is an integer\n\n Valid predicates strings are ['OPERATOR_TYPE_EQUAL', 'OPERATOR_TYPE_NOT_EQUAL', 'OPERATOR_TYPE_GREATER_THAN',\n OPERATOR_TYPE_LOWER_THAN','OPERATOR_TYPE_GREATER_THAN_OR_EQUAL', 'OPERATOR_TYPE_LOWER_THAN_OR_EQUAL']\n \"\"\"\n\n if type(value) is not int:\n raise BadDictElement(metric_name, value, 'value should be integer')\n\n if predicate in self.valid_metric_predicate:\n # first check if it is already there\n for metric in self[0]:\n if metric['metricName'] == metric_name:\n metric['predicate'] = predicate\n metric['value'] = value\n return 0\n # if it is not there then just add it.\n self[0].append({'metricName': metric_name, 'predicate': predicate, 'value': value})\n else:\n raise BadDictElement(metric_name, predicate, 'invalid predicate')\n\n def clear(self):\n \"\"\"\n avr_req['metricFilters'].clear()\n Clears metricFilters elements\n \"\"\"\n del self[0][:]\n\n\nclass entityFilters(list):\n \"\"\"\n avr_req.['entityFilters'].add(dimension_name, predicate, values):\n All values are strings\n valid predicate is 'OPERATOR_TYPE_EQUAL'\n\n ['entityFilters'].clear()\n Clears the entityFilters element\n\n See rest_avr.ShowJsonApi for more details\n \"\"\"\n\n def __init__(self):\n self.append([])\n\n def add(self, dimension_name, predicate, values):\n \"\"\"\n avr_req.['entityFilters'].add(dimension_name, predicate, values):\n All values are strings\n valid predicate is 'OPERATOR_TYPE_EQUAL'\n \"\"\"\n if predicate is 'OPERATOR_TYPE_EQUAL':\n # then loop throuth to see if the dimenson name already exists, if so replace\n for entity in self[0]:\n if entity['dimensionName'] == dimension_name:\n entity['predicate'] = predicate\n entity['values'] = values\n return 0\n # if it is not there then just add it.\n self[0].append({'dimensionName': dimension_name, 'predicate': predicate, 'values': values})\n\n else:\n raise BadDictElement(dimension_name, predicate, 'predicate must be OPERATOR_TYPE_EQUAL')\n\n def clear(self):\n \"\"\"\n ['entityFilters'].clear()\n Clears the entityFilters element\n \"\"\"\n del self[0][:]\n\n\nclass reportFeatures(list):\n \"\"\"\n avr_req.['reportFeatures'].add( feature)\n adds report feature string. Multiple features are permitted.\n\n ['reportFeatures'].clear()\n Clears the analyticsModule element.\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def add(self, feature):\n \"\"\"\n avr_req.['reportFeatures'].add( feature)\n adds report feature string. Multiple features are permitted\n .\"\"\"\n if feature not in self:\n self.append(feature)\n\n def clear(self):\n \"\"\"\n ['reportFeatures'].clear()\n Clears the entityFilters element\n \"\"\"\n del self[:]\n\n\nclass sortByMetrics(list):\n \"\"\"\n avr_req.['sortByMetrics'].add(metric_name, order)\n\n valid order names are 'ascending' and 'descending'\n sortByMetrics is optional in an AVR request.\n\n avr_req['sortByMetrics'].clear()\n Clears the sortByMetrics element.\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def __init__(self):\n self.metric_list = []\n\n def add(self, metric_name, order):\n if metric_name not in self.metric_list:\n self.append({'metricName': metric_name, 'order': order})\n self.metric_list.append(metric_name)\n\n def clear(self):\n \"\"\"\n ['sortByMetrics'].clear()\n Clears the sortByMetrics element\n \"\"\"\n del self[:]\n del self.metric_list[:]\n\n\nclass viewDimensions(list):\n \"\"\"\n avr_req.['viewDimensions'].add(dimension_name):\n adds view dimension, only one dimension is allowed\n add will replace element if it already exists\n\n avr_req['viewDimensions'].clear()\n Clears the viewDimensions element.\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def __init__(self):\n self.append([])\n self[0] = {}\n\n def add(self, dimension_name):\n \"\"\"\n avr_req.['viewDimensions'].add(dimension_name):\n adds view dimension string, only one dimension is allowed\n add will replace element if it already exists\n \"\"\"\n self[0]['dimensionName'] = dimension_name\n\n def clear(self, dimension_name):\n \"\"\"\n ['viewDimensions'].clear()\n Clears the viewDimensions element\n \"\"\"\n del self[0][:]\n\n\nclass viewMetrics(list):\n \"\"\"\n avr_req.['viewMetrics'].add(metric_name):\n appends metric_name string to list. The specification\n allows multiple view metric elements\n\n avr_req['viewMetrics'].clear()\n Clears the viewMetrics elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def __init__(self):\n self.metric_list = []\n\n def add(self, metric_name):\n \"\"\"\n avr_req.['viewMetrics'].add(metric_name):\n appends metric_name string to list. The specification\n allows multiple viewMetric elements\n \"\"\"\n\n if metric_name not in self.metric_list:\n self.append({'metricName': metric_name})\n self.metric_list.append(metric_name)\n\n def clear(self):\n \"\"\"\n ['viewMetrics'].clear()\n Clears the viewMetrics elements\n \"\"\"\n del self[:]\n del self.metric_list[:]\n\n\nclass timeRange(dict):\n \"\"\"\n avr_req.['timeRange'].add( t_from, t_to)\n both values are 16 digit numeric value in microseconds\n of unix/linux time. t_to is optional and can be replace by None\n\n timeRange is an optional.\n\n avr_req['timeRange'].clear()\n Clears the timeRange elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def add(self, t_from, t_to):\n \"\"\"\n avr_req.['timeRange'].add( t_from, t_to)\n both values are 16 digit numeric value in microseconds\n of unix/linux time. t_to is optional and can be replace by None\n\n timeRange is optional.\n \"\"\"\n if type(t_from) is long and len(str(t_from)) == 16:\n self['from'] = t_from\n else:\n raise BadTime(t_from + \" is 16 digit numeric value in microseconds\")\n\n if t_to != '' and t_to != 0 and t_to != None:\n if type(t_to) is long and len(str(t_from)) == 16:\n self['to'] = t_to\n else:\n raise BadTime(t_to + \" is 16 digit numeric value in microseconds\")\n else:\n if 'to' in self.keys():\n del self['to']\n\n def clear(self):\n \"\"\"\n ['timeRange'].clear()\n Clears the timeRange element\n \"\"\"\n del self[:]\n\n\nclass pagination(dict):\n \"\"\"\n avr_req.['pagination'].add(num_results, skip_results)\n both are integer values.\n\n avr_req['pagination'].clear()\n Clears the pagination elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def add(self, num_results, skip_results):\n \"\"\"\n avr_req.['pagination'].add(num_results, skip_results)\n both arguments are integers.\n \"\"\"\n if type(num_results) is int:\n self['numberOfResults'] = num_results\n else:\n raise BadDictElement('number of Results ', num_results, 'must be integer')\n if type(skip_results) is int:\n self['skipResults'] = skip_results\n else:\n raise BadDictElement('skipResults ', skip_results, 'must be integer')\n\n def clear(self):\n \"\"\"\n ['pagination'].clear()\n Clears the pagination element\n \"\"\"\n del self[:]\n\n\nclass avr_resp(dict):\n \"\"\"\n python response error is applicable.\n \"\"\"\n\n def __init__(self):\n self.error_layer = None\n self.error_code = None\n self.error_text = None\n\nclass avr_req(dict):\n \"\"\"\n The main class for rest_avr.\n\n avr_req contains a dictionary that maps to the elements of a Icontrol REST AVR request along with capability of\n posting that request and receiving a response.\n\n The dictionary values are object instances of python classes that correspond to the the JSON values of the\n object's name/value pair.\n\n Each value has two public methods:\n\n avr_req.['objectName']add(): adds an element to the appropriate object with type checking.\n If an element allows more then one instance the add function will append the element\n If an element allows only one instance the add function will replace the element\n\n avr_req.['objectName'].clear()r: clears all elements in the object.\n\n printing rest_avr.ShowAVRJsonApi provides documentation for the AVR JASON elements. Further documentation is\n available on devcentral.f5.com\n\n To post an AVR Rest request there are two functions to populate the HTTP/HTTPS request.\n\n avr_req.auth(user, passw):\n provides the username and password\n avr_req.url_base(host, module)\n provides the host and the bigip module AVR queries to construct the URL to make the request.\n\n Then to post the request and return results in a python representation of the JSON response.\n\n avr_req.post_and_response()\n\n \"\"\"\n\n def __init__(self):\n self['analyticsModule'] = analyticsModule()\n self['analyticsModule'].parent = self\n self['pagination'] = pagination()\n self['metricFilters'] = metricFilters()\n self['entityFilters'] = entityFilters()\n self['reportFeatures'] = reportFeatures()\n self['sortByMetrics'] = sortByMetrics()\n self['viewDimensions'] = viewDimensions()\n self['viewMetrics'] = viewMetrics()\n self['timeRange'] = timeRange()\n\n self.avr_session = requests.session()\n self.avr_session.verify = False\n self.avr_session.headers.update({'Content-Type': 'application/json'})\n\n # for multiple queued request handling.\n self.req_queue = []\n self.generate_id = None\n self.done = None\n self.result = None\n self.num_requests = 0\n self.res_queue = []\n\n def post_and_response(self):\n \"\"\"\n returns a python representation of the json response to the request.\n failure returns array ['ERROR','component',error]\n \"\"\"\n\n warnings.filterwarnings(\"ignore\")\n self.generate_request = self.avr_session.post(self.req_url_base + \"/generate-report/\",\n data=json.dumps(self))\n self.generate_request_py = json.loads(self.generate_request.text)\n self.result_guid = self.generate_request_py['id']\n self.results_status_url = self.req_url_base + \"/generate-report/\" + self.result_guid + \"/?$select=status,reportResultsLink\"\n self.results_url = self.req_url_base + \"/report-results/\" + self.result_guid\n self.sleeptime = .5\n for i in range(5):\n time.sleep(self.sleeptime)\n self.sleeptime *= 2 # double backoff period each time.\n\n self.status_results_json = self.avr_session.get(self.results_status_url)\n self.status_results = json.loads(self.status_results_json.text)\n\n if self.status_results['status'] == 'FAILED':\n self.result = avr_resp()\n self.result_error_layer = 'REST'\n self.result_error_code = self.status_results['status']\n self.result.error_text = self.status_results\n\n if self.status_results['status'] == 'FINISHED':\n self.raw_results_url = self.status_results['reportResultsLink']\n self.results_url = self.raw_results_url.replace('localhost', self.host_name)\n self.results = self.avr_session.get(self.results_url)\n\n if self.results.status_code == 200:\n self.result = avr_resp()\n self.result.update(json.loads(self.results.text))\n return self.result\n else:\n self.result = avr_resp()\n self.result.error_layer = 'HTTP'\n self.result.error_code = self.results.status_code\n self.result.error_text = self.results\n return self.result\n\n else:\n\n continue\n\n self.result = avr_resp()\n self.result.error_layer = 'REST_AVR'\n self.result.error_code = '408'\n self.result.error_text = 'TIMEOUT'\n\n\n def auth(self, user, passw):\n \"\"\"\n avr_req.auth(user, passw):\n username and password\n \"\"\"\n self.avr_session.auth = (user, passw)\n\n def url_base(self, host, module):\n \"\"\"\n avr_req.url_base(host, module)\n host and bigip module AVR queries to construct the URL to make the request.\n \"\"\"\n self.host_name = host\n self.req_url_base = 'https://%s/mgmt/tm/analytics/%s' % (host, module)\n self.module_py = {'analyticsModule': module}\n\n def add_to_queue(self):\n \"adds request as currently constructed to queue\"\n self.req_queue.append(deepcopy(self))\n\n def clear_queue(self):\n \"\"\"\"\n clears request queue\n \"\"\"\n del self.req_queue[:]\n\n def post_and_response_queue(self):\n \"\"\"\n posts and sends response to from queue of requests.\n \"\"\"\n warnings.filterwarnings(\"ignore\")\n for req in self.req_queue:\n req.generate_request = req.avr_session.post(req.req_url_base + \"/generate-report/\",\n data=json.dumps(req))\n req.generate_request_py = json.loads(req.generate_request.text)\n req.generate_id = (req.generate_request_py['id'])\n req.results_status_url = self.req_url_base + \"/generate-report/\" + req.generate_id + \"/?$select=status,reportResultsLink\"\n\n self.sleeptime = .5\n self.num_requests = len(self.req_queue)\n\n for i in range(5):\n\n for req in self.req_queue:\n\n if req.done is None:\n\n time.sleep(self.sleeptime)\n self.sleeptime *= 2 # double backoff period each time.\n req.status_results_json = req.avr_session.get(req.results_status_url)\n req.status_results = json.loads(req.status_results_json.text)\n\n if req.status_results['status'] == 'FAILED':\n req.result = avr_resp()\n req.result_error['layer'] = 'REST'\n req.result_error['error'] = req.status_results['status']\n req.result_error['text'] = req.status_results\n if req.status_results['status'] == 'FINISHED':\n req.raw_results_url = req.status_results['reportResultsLink']\n req.results_url = req.raw_results_url.replace('localhost', self.host_name)\n req.results = self.avr_session.get(req.results_url)\n if req.results.status_code == 200:\n req.result = avr_resp()\n req.result.update(json.loads(req.results.text))\n req.done = True\n self.res_queue.append(req.result)\n self.num_requests -= 1\n\n else:\n\n req.result = avr_resp()\n req.result_error.layer = 'HTTP'\n req.result_error.code = req.results.status_code\n req.result_error.text = req.results\n self.res_queue.append(req.result)\n if i == 5:\n if req.result == False:\n req.result = avr_resp()\n req.result.error_layer = 'REST_AVR'\n req.result.error_error = '408'\n req.result.error_text = 'TIMEOUT'\n\n\n if self.num_requests == 0:\n break\n\n\n\n return self.res_queue\n\n\nShowAVRJsonApi = \"\"\"\nreportFeatures\n--------------\nSpecifies the kind of information that appears in a\nresponse from AVR. You may specify one or more of the\nfollowing values:\n\nexisting-entities\ntime-aggregated\ntime-series\nentities-count\n\nviewDimensions\n--------------\nSpecifies the dimensions for which to calculate a report,\nsuch as:\n\n{\"dimensionName\": \"domain-name\"}\n\nYou may only specify a single dimension. You may omit\nthis field in a report generation request.\n\nviewMetrics\n-----------\nSpecifies the list of metrics by which to sort results, such\nas:\n\n{ \"metricName\": \"average-tps\" },\n{ \"metricName\": \"transactions\" }\n\nIf you specify either time-aggregated or\ntime-series features, you must specify one metric in\na report generation request.\n\nsortByMetrics\n--------------\nSpecifies the list of metrics to sort by, such as:\n[{ metricName: \"average-tps\", order:\"descending\" } ]\n\nValid values are ascending and descending. Sorting\nonly applies to the time-aggregated feature. You do\nnot need to specify this field in a report generation request.\n\ntimeRange\n---------\nSpecifies the time range, in microseconds, for which to\ncalculate a report, such as:\n\n{\"from\": 1410420888000000, \"to\": 1410424488000000 }\n\nYou do not need to specify this field in a report generation\nrequest.\n\nentityFilters\n=============\nSpecifies the entities and values for which to calculate a\nreport. You can specify a single entity with a second level\nof dimension filters that describe an aspect of the entity.\nIf you specify multiple entity types, the results include\nonly the entities that match all of the criteria. You do not\nneed to specify this field in a report generation request.\nThe following snippet contains two entities with\ncorresponding values:\n\n[[{\n\"dimensionName\" : \"virtual\",\n\"predicate\": \"OPERATOR_TYPE_EQUAL\",\n\"values : [\"phpAuction_VS_1\"] },\n{\n\"dimensionName : \"response-code\",\n\"predicate\": \"OPERATOR_TYPE_EQUAL\",\n\"values\" : [\"200\"] }\n]]\n\nmetricFilters\n-------------\nSpecifies the metric filters for which to calculate a report,\nsuch as:\n\n[{ \"metricName\": \"transactions\",\n\"predicate\" :\nmetricFilters\n\"OPERATOR_TYPE_GREATER_THAN\" \"value\":\n100 }]\n\nYou do not need to specify this field in a report generation\nrequest. For the existing-entities feature, AVR\nsupports the OPERATOR_TYPE_LIKE predicate. AVR also\nsupports the following predicates:\n\nOPERATOR_TYPE_EQUAL\nOPERATOR_TYPE_NOT_EQUAL\nOPERATOR_TYPE_GREATER_THAN\nOPERATOR_TYPE_LOWER_THAN\nOPERATOR_TYPE_GREATER_THAN_OR_EQUAL\nOPERATOR_TYPE_LOWER_THAN_OR_EQUAL\n\npagination\n----------\nSpecifies the number of results to return, and the number\nof results to skip, such as:\n\n{ numberOfResults : 10, skipResults : 10}\n\nTo see the second set of ten results, use the example\nshown here. AVR does not implement the OData query\nparameters top or skip. In order to see a specific set of\nresults, you must set the number of results to return and\nthen determine how many results to skip. You do not need\nto specify this field in a report generation request.\n\"\"\" Tested this on version: 12.0","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"27262","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:336355":{"__typename":"Conversation","id":"conversation:336355","topic":{"__typename":"TkbTopicMessage","uid":336355},"lastPostingActivityTime":"2024-11-11T15:21:29.350-08:00","solved":false},"User:user:285832":{"__typename":"User","uid":285832,"login":"teoiovine","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-4.svg?time=0"},"id":"user:285832"},"TkbTopicMessage:message:336355":{"__typename":"TkbTopicMessage","subject":"Microsoft 365 IP Steering python Script","conversation":{"__ref":"Conversation:conversation:336355"},"id":"message:336355","revisionNum":1,"uid":336355,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:285832"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":60},"postTime":"2024-11-11T15:21:29.350-08:00","lastPublishTime":"2024-11-11T15:21:29.350-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Hello! Hola! I have created a small and rudimentary script that generates a datagroup with MS 365 IPv4 and v6 addresses to be used by an iRule or policy. There are other scripts that solve this same issue but either they were: based on iRulesLX which forces you to enable iRuleLX only for this, and made me run into issues when upgrading (memory table got filled with nonsense) based on the XML version of the list which MS changed to a JSON file. This script is a super simple bash script that calls another super simple python file, and a couple of helper files. The biggest To Do are: Add a more secure approach to password usage. Right now, it is stored in a parameters file locked away with permissions. There should be a better way. Add support for URLs. You can find the contents here: https://github.com/teoiovine-novared/fetch-office365/tree/main I appreciate advice, (constructive) criticism and questions all the same! Thank you for your time. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"982","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:278576":{"__typename":"Conversation","id":"conversation:278576","topic":{"__typename":"TkbTopicMessage","uid":278576},"lastPostingActivityTime":"2023-06-16T15:40:26.661-07:00","solved":false},"User:user:71536":{"__typename":"User","uid":71536,"login":"Alex__Applebaum","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-6.svg?time=0"},"id":"user:71536"},"TkbTopicMessage:message:278576":{"__typename":"TkbTopicMessage","subject":"Python Bigsuds - License BIG-IP","conversation":{"__ref":"Conversation:conversation:278576"},"id":"message:278576","revisionNum":2,"uid":278576,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:71536"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":394},"postTime":"2015-03-09T13:38:03.000-07:00","lastPublishTime":"2023-06-16T15:40:26.661-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n This bigsuds script will license a BIGIP \n How to use this snippet: \n This bigsuds script will license a BIGIP \n It's a port of some of Erick's: https://devcentral.f5.com/wiki/icontrol.BigIpLicensingCommandLineTool.ashx \n and update of the pycontrol v2: pyControl v2 - License BIGIP - DevCentral \n Still missing the proxy functionality in Erick's though. \n Usage: license-bigip.py --bigip < IP|hostname> --username < username> --server < license_server_hostname> \n --reg_keys < regkeys> --license < license_file> --eula < eula_file>\n \n Ex. From CLI: \n (virt1)user1@desktop:python $./license-bigip.py --help\nUsage: license-bigip.py [options]\n\nOptions:\n -h, --help show this help message and exit\n -b BIGIP, --bigip=BIGIP\n -u UNAME, --username=UNAME\n -s SERVER_HOSTNAME, --server=SERVER_HOSTNAME\n -r REG_KEYS_STRING, --reg_keys=REG_KEYS_STRING\n -l LOCAL_LICENSE_FILE_NAME, --license=LOCAL_LICENSE_FILE_NAME\n -e LOCAL_EULA_FILE_NAME, --eula=LOCAL_EULA_FILE_NAME\n \n \nProviding New Keys: \n(virt1)user1@desktop:python $./license-bigip.py --server activate.f5.com --bigip 10.11.50.201 --username admin --reg_keys \"B6907-36850-30441-96521-8395199\"\nEnter your password for username: admin\nPassword:\nAttempting to get license online.\nLicense server requires you to submit EULA.\nreg keys provided\n['B6907-36850-30441-96521-8395172']\nGetting dossier using keys:['B6907-36850-30441-96521-8395199']\nLicense Found. Attempting to installing License on BIGIP:\nLicense status = STATE_ENABLED\n\nUse Existing Keys:\n(virt1)user1@desktop:python $./license-bigip.py --server activate.f5.com --bigip 10.11.50.201 --username admin \nEnter your password for username: admin\nPassword:\nAttempting to get license online.\nLicense server requires you to submit EULA.\nReg Key list is empty, attempting to retrieve existing keys from the unit\nGetting dossier using keys:[B6907-36850-30441-96521-8395199, P459718-6102942, B273271-7144254, N123537-7304104]\nLicense Found. Attempting to installing License on BIGIP:\nLicense status = STATE_ENABLED\n \n Script \n license-bigip.py \n Code : \n #!/usr/bin/env python\n'''\n----------------------------------------------------------------------------\nThe contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5\nSoftware Development Kit for iControl\"; you may not use this file except in\ncompliance with the License. The License is included in the iControl\nSoftware Development Kit.\n\nSoftware distributed under the License is distributed on an \"AS IS\"\nbasis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\nthe License for the specific language governing rights and limitations\nunder the License.\n\nThe Original Code is iControl Code and related documentation\ndistributed by F5.\n\nThe Initial Developer of the Original Code is F5 Networks,\nInc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,\nInc. All Rights Reserved. iControl (TM) is a registered trademark of F5 Networks, Inc.\n\nAlternatively, the contents of this file may be used under the terms\nof the GNU General Public License (the \"GPL\"), in which case the\nprovisions of GPL are applicable instead of those above. If you wish\nto allow use of your version of this file only under the terms of the\nGPL and not to allow others to use your version of this file under the\nLicense, indicate your decision by deleting the provisions above and\nreplace them with the notice and other provisions required by the GPL.\nIf you do not delete the provisions above, a recipient may use your\nversion of this file under either the License or the GPL.\n----------------------------------------------------------------------------\n'''\n\ndef usage ():\n print \"Usage:\"\n print \"%s --bigip --username --server \\\n --reg_keys --license --eula \" % sys.argv[0]\n print \"ex. \"\n print \" Will attempt to re-license with existing keys on unit using license server activate.f5.com\"\n print \" %s --bigip 192.168.1.245 --username admin\" % sys.argv[0]\n print \" Will attempt to re-license with provided reg_keys CSV string using license server activate.f5.com\"\n print \" %s --bigip 192.168.1.245 --username admin --reg_keys \\\"XXXX-XXXX-XXXX-XXXX,XXXX-XXXX,XXXX-XXXX\\\" \" % sys.argv[0]\n\n\n\n\ndef get_license_from_F5_License_Server ( server_hostname, dossier_string, eula_string, email,\n firstName, lastName, companyName, phone, jobTitle,\n address, city, stateProvince, postalCode, country ):\n\n try:\n\n license_string = \"\"\n # Unfortunately, F5 wsdl on license server references http but F5 only accepts https so as an ugly workaround need to\n # download wsdl, save to disk, replace links http with https, and have SUDS client reference local file instead\n #(eg. url = \"file:///home/admin/f5wsdl.xml\")\n\n download_url = \"https://\" + server_hostname + \"/license/services/urn:com.f5.license.v5b.ActivationService?wsdl\"\n\n # Check to see if there's a copy of wsdl file on disk first\n # Careful with this behavior if you switch server hostnames.\n local_wsdl_file_name = str(server_hostname) + '-f5wsdl-w-https.xml'\n wsdl_data = []\n\n try:\n with open(local_wsdl_file_name, 'r') as fh_wsdl:\n wsdl_data = fh_wsdl.read()\n except:\n print \"Can't find a locally stored WSDL file.\"\n\n\n if not wsdl_data:\n print \"Attempting to fetch wsdl online.\"\n f5wsdl = urllib2.urlopen(download_url)\n newlines = []\n for line in f5wsdl:\n # do the replacing here\n newlines.append(line.replace('http://' + server_hostname , 'https://' + server_hostname))\n\n fh_local = open(local_wsdl_file_name,'w')\n fh_local.writelines(newlines)\n fh_local.close()\n\n # put url going to pass to client in file format\n url = \"file:\" + urllib.pathname2url(os.getcwd()) + \"/\" + local_wsdl_file_name\n\n #Now create client object using wsdl from disk instead of the interwebs.\n client = Client(url)\n\n # NOT using below as will just try actually licensing and fail then if needed\n # try:\n # # ping() method should return string containing date\n # print \"Checking License Service Reachability...\"\n # return_ping_date = client.service.ping()\n # except:\n # print \"License SOAP service unreachable. Check network connectivity.\"\n # return\n\n\n transaction = client.factory.create('ns0:LicenseTransaction')\n # If eula isn't present on first call to getLicense, transaction will fail\n # but it will return a eula after first attempt\n transaction = client.service.getLicense(\n dossier = dossier_string,\n eula = eula_string,\n email = email,\n firstName = firstName ,\n lastName = lastName,\n companyName = companyName,\n phone = phone,\n jobTitle = jobTitle,\n address = address,\n city = city,\n stateProvince = stateProvince,\n postalCode = postalCode,\n country = country,\n )\n\n #Extract the eula offered from first try\n eula_string = transaction.eula\n\n if transaction.state == \"EULA_REQUIRED\":\n #Try again, this time with eula populated\n transaction = client.service.getLicense(\n dossier = dossier_string,\n eula = eula_string,\n email = email,\n firstName = firstName ,\n lastName = lastName,\n companyName = companyName,\n phone = phone,\n jobTitle = jobTitle,\n address = address,\n city = city,\n stateProvince = stateProvince,\n postalCode = postalCode,\n country = country,\n )\n\n if transaction.state == \"LICENSE_RETURNED\":\n license_string = transaction.license\n else:\n print \"Can't retrieve license from Licensing server\"\n print \"License server returned error: Number:\" + str(transaction.fault.faultNumber) + \" Text: \" + str(transaction.fault.faultText)\n\n return license_string\n\n except:\n print \"Can't retrieve License from Server\"\n traceback.print_exc(file=sys.stdout)\n\n\n\ndef get_reg_keys(obj):\n\n try:\n\n reg_keys = []\n reg_keys = obj.Management.LicenseAdministration.get_registration_keys()\n return reg_keys\n\n except:\n print \"Get Reg Keys error. Check log.\"\n traceback.print_exc(file=sys.stdout)\n\n\n\ndef get_dossier (obj, reg_keys ):\n\n try:\n\n dossier_string = obj.Management.LicenseAdministration.get_system_dossier ( reg_keys )\n return dossier_string\n\n except:\n print \"Get Dossier error. Check log.\"\n traceback.print_exc(file=sys.stdout)\n\n\ndef get_eula_file (obj):\n\n try:\n\n eula_char_array = obj.Management.LicenseAdministration.get_eula_file( )\n eula_string = base64.b64decode(eula_char_array)\n return eula_string\n\n except:\n print \"Get eula_file. Check log.\"\n traceback.print_exc(file=sys.stdout)\n\n\n\ndef install_license (obj, license_string ):\n\n try:\n\n license_char_array = base64.b64encode(license_string)\n obj.Management.LicenseAdministration.install_license ( license_file_data = license_char_array )\n\n except:\n print \"Install License error. Check log.\"\n traceback.print_exc(file=sys.stdout)\n\n\ndef get_license_status (obj):\n\n try:\n\n license_status = obj.Management.LicenseAdministration.get_license_activation_status()\n return license_status\n\n except:\n print \"Get License Status error. Check log.\"\n traceback.print_exc(file=sys.stdout)\n\n\n### IMPORT MODULES ###\nimport os\nimport sys\nimport time\nimport traceback\nimport base64\nimport urllib\nimport urllib2\nimport getpass\nfrom suds.client import Client\nfrom optparse import OptionParser\n\nimport bigsuds\n\n\n# from suds import WebFault\n# import logging\n\n# logging.getLogger('suds.client').setLevel(logging.DEBUG)\n# logging.getLogger('suds.metrics').setLevel(logging.DEBUG)\n# logging.getLogger('suds').setLevel(logging.DEBUG)\n\n#### SET CONFIG VARIABLES ####\n\n\n#Misc EULA Variables\nemail = \"example.icontrol@f5.com\"\nfirstName = \"example\"\nlastName = \"iControl\"\ncompanyName = \"F5\"\nphone = \"2062725555\"\njobTitle = \"DEV OPS\"\naddress = \"111 EXAMPLE ICONTROL RD\"\ncity = \"Seattle\"\nstateProvince = \"WA\"\npostalCode = \"98119\"\ncountry = \"United States\"\n\n\nparser = OptionParser()\nparser.add_option(\"-b\", \"--bigip\", action=\"store\", type=\"string\", dest=\"bigips\", default=\"192.168.1.245\")\nparser.add_option(\"-u\", \"--username\", action=\"store\", type=\"string\", dest=\"uname\", default=\"admin\")\nparser.add_option(\"-s\", \"--server\", action=\"store\", type=\"string\", dest=\"server_hostname\", default=\"activate.f5.com\" )\nparser.add_option(\"-r\", \"--reg_keys\", action=\"store\", type=\"string\", dest=\"reg_keys_string\" )\nparser.add_option(\"-l\", \"--license\", action=\"store\", type=\"string\", dest=\"local_license_file_name\")\nparser.add_option(\"-e\", \"--eula\", action=\"store\", type=\"string\", dest=\"local_eula_file_name\")\n(options, args) = parser.parse_args()\n\n### INITIALIZE BIGIP OBJECT ###\n\nif options.bigip and options.uname:\n print \"Enter your password for username: %s\" % options.uname\n upass = getpass.getpass()\nelse:\n usage()\n sys.exit()\n\n#hardcoded so don't have to provide any arguments.\n#print \"Enter your password for username: %s\" % options.uname\n#upass = getpass.getpass()\n\n# Can re-license a list of BIG-IPs IF you don't provide a list of regkeys on CLI. \n# As reg key split function does not accommodate list of keys for multiple devices.\n\nif options.bigips:\nbigip_list = options.bigips.split(\",\")\n\nfor i in bigip_list:\n\nprint \"\\nAttempting to License BIGIP \" + i\n\nreg_keys = []\nlicense_string = \"\"\neula_string = \"\"\nreg_keys_string = \"\"\nlocal_license_file_name = \"\"\nlocal_eula_file_name = \"\"\nserver_hostname = \"authem.f5net.com\"\nuname = \"admin\"\n\nb = bigsuds.BIGIP(\nhostname = i,\nusername = uname,\npassword = upass,\n)\n\n\n########## START MAIN LOGIC ######\n\n\n\nif local_license_file_name:\ntry:\nprint \"Attempting to retrive License from local disk ...\"\nwith open(local_license_file_name, 'r') as fh_license:\nlicense_string = fh_license.read()\n\nexcept:\nprint \"Can't Open license file named: \\\"\" + local_license_file_name + \"\\\" on disk.\"\n#sys.exit()\nprint \"No worries. Will attempt to retrieve one from online.\"\n\n\nif not license_string:\n\nprint \"Attempting to get license online.\"\nprint \"License server requires you to submit EULA.\"\nif options.local_eula_file_name:\nprint \"Attempting to retrive EULA from local disk first...\"\ntry:\nwith open(options.local_eula_file_name, 'r') as fh_eula:\neula_string = fh_eula.read()\n\nexcept:\nprint \"Can't find EULA file named : \\\"\" + options.local_eula_file_name + \"\\\" on disk.\"\nprint \"No worries. Will attempt to retrieve one during transaction with License Server.\"\n\n# Could also try seeing if Target BIG-IP has one stored\n# eula_file = get_eula_file(b)\n\n\nif options.reg_keys_string:\nreg_keys = options.reg_keys_string.split(\",\")\nprint \"reg keys provided\"\nprint reg_keys\n\nif len(reg_keys) < 1:\nprint \"Reg Key list is empty, attempting to retrieve existing keys from the unit\"\nreg_keys = get_reg_keys(b)\n\n\nprint \"Getting dossier using keys:\" + str(reg_keys)\ndossier_string = get_dossier( b, reg_keys )\n# print \"dossier = \" + str(dossier_output)\n\n\nlicense_string = get_license_from_F5_License_Server(\noptions.server_hostname,\ndossier_string,\neula_string,\nemail,\nfirstName,\nlastName,\ncompanyName,\nphone,\njobTitle,\naddress,\ncity,\nstateProvince,\npostalCode,\ncountry\n)\n\nif license_string:\nprint \"License Found. Attempting to installing License on BIGIP:\"\ninstall_license ( b, license_string )\nelse:\nprint \"Sorry. Could not retrieve License. Check your connection\"\n\nlicense_status = get_license_status ( b )\nprint \"License status = \" + str(license_status) \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"15238","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:278589":{"__typename":"Conversation","id":"conversation:278589","topic":{"__typename":"TkbTopicMessage","uid":278589},"lastPostingActivityTime":"2023-06-05T22:33:05.537-07:00","solved":false},"TkbTopicMessage:message:278589":{"__typename":"TkbTopicMessage","subject":"Create CNAME Resource Record in Zone Runner","conversation":{"__ref":"Conversation:conversation:278589"},"id":"message:278589","revisionNum":2,"uid":278589,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:71536"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":583},"postTime":"2015-03-07T14:56:12.000-08:00","lastPublishTime":"2023-06-05T22:33:05.537-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This pyControl v2 script will create a CNAME Record in Zone Runner How to use this snippet: This pyControl v2 script will create a CNAME Record in Zone Runner \n Usage: Create-CNAME-Record.py Code : #!/bin/env python\n\n'''\n----------------------------------------------------------------------------\nThe contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5\nSoftware Development Kit for iControl\"; you may not use this file except in\ncompliance with the License. The License is included in the iControl\nSoftware Development Kit.\n\nSoftware distributed under the License is distributed on an \"AS IS\"\nbasis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\nthe License for the specific language governing rights and limitations\nunder the License.\n\nThe Original Code is iControl Code and related documentation\ndistributed by F5.\n\nThe Initial Developer of the Original Code is F5 Networks,\nInc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,\nInc. All Rights Reserved. iControl (TM) is a registered trademark of F5 Networks, Inc.\n\nAlternatively, the contents of this file may be used under the terms\nof the GNU General Public License (the \"GPL\"), in which case the\nprovisions of GPL are applicable instead of those above. If you wish\nto allow use of your version of this file only under the terms of the\nGPL and not to allow others to use your version of this file under the\nLicense, indicate your decision by deleting the provisions above and\nreplace them with the notice and other provisions required by the GPL.\nIf you do not delete the provisions above, a recipient may use your\nversion of this file under either the License or the GPL.\n----------------------------------------------------------------------------\n'''\nimport sys\nimport pycontrol.pycontrol as pc\nimport time\n\n#######################################################################################\n# Example of how to create a Resource Record in Zone Runner (ex. in this case a CNAME) \n# This example passes in the 'fromurl' keyword as True (default is False), which tells pycontrol\n# to fetch the WSDL from the remote BigIP.\n# For more information:\n# https://devcentral.f5.com/s/wiki/iControl.Management__ResourceRecord__add_cname.ashx\n#######################################################################################\n\n\nif pc.__version__.startswith('2.0'):\n pass\nelse:\n print \"Requires pycontrol version 2.x!\"\n sys.exit()\n\nif len(sys.argv) < 4:\n print \"Usage %s ip_address username password\" % sys.argv[0]\n sys.exit()\n\na = sys.argv[1:]\n\nb = pc.BIGIP(\n hostname = a[0],\n username = a[1],\n password = a[2],\n fromurl = True,\n wsdls = ['Management.ResourceRecord','Management.Zone', 'Management.View'])\n\n# create short cut\nr = b.Management.ResourceRecord\n\n# Variables for USER to fill in\nview = \"external\"\nzone_name = \"gslb.f5lab.com.\"\ndomain_name = \"www.glslb.f5lab.com\"\ncname = \"www.gslb2.f5lab.com\"\nttl = 60\n\n#Start creating required objects\nviewzone_obj = r.typefactory.create('Management.ViewZone')\nviewzone_obj.view_name = view\nviewzone_obj.zone_name = zone_name\n\nview_zone_seq = r.typefactory.create('Management.ViewZoneSequence')\nview_zone_seq.item = viewzone_obj \n\n\ncname_object = r.typefactory.create('Management.CNAMERecord')\ncname_object.domain_name = domain_name\ncname_object.cname = cname\ncname_object.ttl = ttl\n\ncname_object_seq = r.typefactory.create('Management.CNAMERecordSequence')\ncname_object_seq.item = cname_object\ncname_object_seq_seq = r.typefactory.create('Management.CNAMERecordSequenceSequence')\ncname_object_seq_seq.item = cname_object_seq\n\n\nprint \"Creating CNAME RECORD: \" \nprint \" \\\"\" + domain_name + \" \" + str(ttl) + \" IN \" + cname + \"\\\"\\n\"\n\ntry:\n r.add_cname( \n view_zones = view_zone_seq, \n cname_records = cname_object_seq_seq \n )\nexcept Exception, e:\n print \"Error adding Record %s\" % cname_object\n print e\n\n\n\nprint \"Retrieving Resource Records for zone \\\"\" + zone_name + \"\\\":\\n\"\nget_rrs_output = []\n\ntry:\n get_rrs_output = r.get_rrs(\n view_zones = view_zone_seq\n )\n\n\nexcept Exception, e:\n print \"Error retrieving resource records %s\" % zone_name\n print e\n\nfor element in get_rrs_output:\n for resource_record in element:\n print resource_record ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4445","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:277415":{"__typename":"Conversation","id":"conversation:277415","topic":{"__typename":"TkbTopicMessage","uid":277415},"lastPostingActivityTime":"2023-06-05T22:33:02.649-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?time=0"},"id":"user:131293"},"TkbTopicMessage:message:277415":{"__typename":"TkbTopicMessage","subject":"delete_devices","conversation":{"__ref":"Conversation:conversation:277415"},"id":"message:277415","revisionNum":2,"uid":277415,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":294},"postTime":"2015-03-07T15:23:59.000-08:00","lastPublishTime":"2023-06-05T22:33:02.649-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Introduced: EM_v3.0 \n Use the delete_devices API to remove devices currently being managed by an Enterprise Manager. How to use this snippet: Prototype \n Python \n ic.Management.EM.deletedevices(deviceaddresses) \n C#, Java, and Perl \n ic.getManagementEM().delete_devices(deviceAddresses); \n Inputs \n Name Type Description IP addresses String Sequence This parameter specifies the IP addresses or hostnames of the F5 device(s) that you want to delete from the list of managed devices. \n Return values \n There is no explicit return when this API executes successfully. \n Exceptions \n The table lists error categories that Enterprise Manager can raise if the API call fails. \n Exception Name This exception is raised when... AccessDenied The credentials supplied by the client do not satisfy the F5 device's validation requirements.\n OperationFailed The API call causes an operation error. InvalidArgument The API call contains an invalid argument. Code : To view a code sample, click the relevant code type.\nC# (.net)\nJava\nPerl\nPython ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1115","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:277802":{"__typename":"Conversation","id":"conversation:277802","topic":{"__typename":"TkbTopicMessage","uid":277802},"lastPostingActivityTime":"2023-06-05T22:32:59.947-07:00","solved":false},"TkbTopicMessage:message:277802":{"__typename":"TkbTopicMessage","subject":"get_task_status","conversation":{"__ref":"Conversation:conversation:277802"},"id":"message:277802","revisionNum":2,"uid":277802,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":276},"postTime":"2015-03-07T15:36:57.000-08:00","lastPublishTime":"2023-06-05T22:32:59.947-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Introduced : EM_v3.0 \n Use the get_task_status API to determine the current status of a device discovery task. How to use this snippet: Python \n ic.Management.EM.get_task_status(ids = task_ids) \n C#, Java, and Perl \n ic.Management.EM.get_task_status(ids = task_ids); \n Inputs \n Name Type Description tasks String Sequence This parameter specifies the task IDs of the tasks for which you want to know the status. \n Return Values \n Name Type Description task TaskStatus Sequence The ID of the new discovery task. This ID can return the following values:\n TASK_STATUS_UNKNOWN TASK_STATUS_PENDING TASK_STATUS_STARTED TASK_STATUS_FAILED TASK_STATUS_COMPLETE TASK_STATUS_RUNNING TASK_STATUS_CANCELING TASK_STATUS_CANCELED TASK_STATUS_ABANDONED TASK_STATUS_TERMINATED TASK_STATUS_TIMED_OUT TASK_STATUS_RESCHEDULED \n \n Exceptions \n Exception Name This exception is raised when... AccessDenied The credentials supplied by the client do not satisfy the F5 device's validation requirements.\n OperationFailed The API call causes an operation error. InvalidArgument The API call contains an invalid argument. Code : To view a code sample, click the relevant code type.\n\nC# (.net)\nJava\nPerl\nPython ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1295","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:277902":{"__typename":"Conversation","id":"conversation:277902","topic":{"__typename":"TkbTopicMessage","uid":277902},"lastPostingActivityTime":"2023-06-05T22:32:53.824-07:00","solved":false},"TkbTopicMessage:message:277902":{"__typename":"TkbTopicMessage","subject":"LTM Stats via pycontrol version 2","conversation":{"__ref":"Conversation:conversation:277902"},"id":"message:277902","revisionNum":2,"uid":277902,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:131293"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":270},"postTime":"2015-03-07T16:22:40.000-08:00","lastPublishTime":"2023-06-05T22:32:53.824-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This pyControl v2 script prints out status and statistics for LTM virtual servers and pools. How to use this snippet: This pyControl v2 script will print out status and statistics for all LTM virtual servers and pools. \n Usage: ltmStats.py Code : #!/usr/bin/python\n'''\n----------------------------------------------------------------------------\n The contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5\n Software Development Kit for iControl\"; you may not use this file except in\n compliance with the License. The License is included in the iControl\n Software Development Kit.\n\n Software distributed under the License is distributed on an \"AS IS\"\n basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\n the License for the specific language governing rights and limitations\n under the License.\n\n The Original Code is iControl Code and related documentation\n distributed by F5.\n\n The Initial Developer of the Original Code is F5 Networks,\n Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,\n Inc. All Rights Reserved. iControl (TM) is a registered trademark of F5 Networks, Inc.\n\n Alternatively, the contents of this file may be used under the terms\n of the GNU General Public License (the \"GPL\"), in which case the\n provisions of GPL are applicable instead of those above. If you wish\n to allow use of your version of this file only under the terms of the\n GPL and not to allow others to use your version of this file under the\n License, indicate your decision by deleting the provisions above and\n replace them with the notice and other provisions required by the GPL.\n If you do not delete the provisions above, a recipient may use your\n version of this file under either the License or the GPL.\n----------------------------------------------------------------------------\n'''\n__author__ = \"jason.rahm\"\n\ndef get_virtuals(obj):\nvips = obj.get_list()\nstatus = obj.get_object_status(virtual_servers = vips)\n\ncombined = zip(vips,status)\n\nfor x in combined:\nprint \"Virtual: \", x[0]\nprint \"\\t\", x[1].availability_status\nprint \"\\t\", x[1].enabled_status\nprint \"\\t\", x[1].status_description\nprint \"\\n\"*2\n\ndef get_pools(obj):\npools = obj.get_list()\nstatus = obj.get_object_status(pool_names = pools)\n\ncombined = zip(pools,status)\n\nfor x in combined:\nprint \"Pool: \", x[0]\nprint \"\\t\", x[1].availability_status\nprint \"\\t\", x[1].enabled_status\nprint \"\\t\", x[1].status_description\nprint \"\\n\"*2\n\ndef get_virtuals_stats(obj):\nstats = obj.get_all_statistics()\n\nfor x in stats.statistics:\nprint \"Virtual Server: \", x.virtual_server.name\nfor y in x.statistics:\nprint \"\\t%s = %s\" % (y.type, (y.value.high<<32)|y.value.low)\n\ndef get_pools_stats(obj):\nstats = obj.get_all_statistics()\n\nfor x in stats.statistics:\nprint \"Pool: \", x.pool_name\nfor y in x.statistics:\nprint \"\\t%s = %s\" % (y.type, (y.value.high<<32)|y.value.low)\n\nif __name__ == \"__main__\":\n\nimport pycontrol.pycontrol as pc\nimport getpass\nfrom sys import argv\n\n\nif pc.__version__[:3] == '2.0':\npass\nelse:\nprint \"Requires pycontrol version 2.x!\"\nsys.exit()\n\nif len(argv) != 3:\nexit(\"Usage ltmStats.py \")\n\nhost = argv[1]\nuname = argv[2]\nupass = getpass.getpass()\n\nb = pc.BIGIP(\nhostname = host,\nusername = uname,\n password = upass,\n fromurl = True,\n wsdls = ['LocalLB.VirtualServer', 'LocalLB.Pool']\n)\n\nv = b.LocalLB.VirtualServer\np = b.LocalLB.Pool\n\nprint \"Virtual Server status...\\n\"\nget_virtuals(v)\n\nprint \"Virtual Server stats...\\n\"\nget_virtuals_stats(v)\n\nprint \"Pool status...\\n\"\nget_pools(p)\n\nprint \"Pool stats...\\n\"\nget_pools_stats(p) ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3660","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:278683":{"__typename":"Conversation","id":"conversation:278683","topic":{"__typename":"TkbTopicMessage","uid":278683},"lastPostingActivityTime":"2023-06-05T22:05:02.229-07:00","solved":false},"User:user:138550":{"__typename":"User","uid":138550,"login":"Andy_McGrath","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-11.svg?time=0"},"id":"user:138550"},"TkbTopicMessage:message:278683":{"__typename":"TkbTopicMessage","subject":"iRule stats formatter","conversation":{"__ref":"Conversation:conversation:278683"},"id":"message:278683","revisionNum":2,"uid":278683,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:138550"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":285},"postTime":"2018-01-31T06:53:58.000-08:00","lastPublishTime":"2023-06-05T22:05:02.229-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: When you have a load of iRule stats in text format from your F5 device and need to get them into a nicer format. \n The following Python 3 script takes in a text file in the following format: \n ------------------------------------------------------------------------------------------------------\nLtm::Rule Event: /web_testing/test_environment_rule:HTTP_RESPONSE\n------------------------------------------------------------------------------------------------------\nPriority 12\nExecutions \n Total 31686860\n Failures 0\n Aborts 0\nCPU Cycles on Executing\n Average 404058\n Maximum 10703959\n Minimum 264201\n\n (raw) \n------------------------------------------------------------------------------------------------------\nLtm::Rule Event: /web_testing/test_environment_rule:HTTP_REQUEST\n------------------------------------------------------------------------------------------------------\nPriority 899\nExecutions \n Total 31686860\n Failures 0\n Aborts 0\nCPU Cycles on Executing\n Average 404058\n Maximum 10703959\n Minimum 264201\n \n\n Put through the following python script to output a CSV file for further data manipulation. How to use this snippet: Python3 script, to use run the following (can also add in '--o' to define an output file, if not will replace the file extension '.txt' with '.csv' by default): \n python statformating.py --i my_irule_stats.txt\n \n\n output will be something like \n Openning 'my_irule_stats.txt'\nSaving output csv to 'my_irule_stats.csv'\n \n\n Usage/help output: \n usage: statformating.py [-h] [--i INPUT] [--o OUTPUT]\n\noptional arguments:\n -h, --help show this help message and exit\n --i INPUT iRule Stats File input file name\n --o OUTPUT iRule Stats File output csv file name\n Code : import re\nimport os\nimport argparse\n\ndef iruleStatsFormat(inputFile, outputFile):\n print('Openning \\'{}\\''.format(inputFile))\n iruleStats = open(inputFile, 'rt').read()\n\n iruleStats = re.sub(r'[ ]{2,}', ' ', iruleStats)\n iruleStats = re.sub(r'\\n\\s\\(raw\\)\\s{1,}', '', iruleStats)\n iruleStats = re.sub(r'[-]{2,}\\n', '', iruleStats)\n iruleStats = re.sub(r'\\n ', r'\\n', iruleStats)\n iruleStats = re.sub(r'CPU Cycles on Executing\\n', '', iruleStats)\n iruleStats = re.sub(r'Executions \\n', '', iruleStats)\n iruleStats = re.sub(r'\\nPriority (\\d{1,})\\nTotal (\\d{1,})\\nFailures (\\d{1,})\\nAborts (\\d{1,})\\nAverage (\\d{1,})\\nMaximum (\\d{1,})\\nMinimum (\\d{1,})', r'\\t\\1\\t\\2\\t\\3\\t\\4\\t\\5\\t\\6\\t\\7', iruleStats)\n iruleStats = re.sub(r'Ltm::Rule Event: /(.*?)/(.*?):(.*?\\t)', r'\\1\\t\\2\\t\\3', iruleStats)\n iruleStats = re.sub(r'Ltm::Rule Event: (.*?):(.*?\\t)', r'Common\\t\\1\\t\\2', iruleStats)\n iruleStats = re.sub(r'\\n{2,}', r'\\n', iruleStats)\n iruleStats = re.sub(r'\\t', r',', iruleStats)\n print('Saving output csv to \\'{}\\''.format(outputFile))\n with open(outputFile, 'wt') as f:\n print(iruleStats, file=f)\n\nif __name__=='__main__':\n parser = argparse.ArgumentParser()\n parser.add_argument(\"--i\", dest='input', help=\"iRule Stats File input file name\", type=str)\n parser.add_argument(\"--o\", dest='output', help=\"iRule Stats File output csv file name\", type=str, default=\"\")\n args = parser.parse_args()\n\n if args.input and os.path.isfile(args.input):\n if not args.output:\n args.output = args.input[:-3] + 'csv'\n iruleStatsFormat(args.input, args.output)\n else:\n parser.print_help() ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3756","kudosSumWeight":1,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:275748":{"__typename":"Conversation","id":"conversation:275748","topic":{"__typename":"TkbTopicMessage","uid":275748},"lastPostingActivityTime":"2023-06-05T21:51:38.469-07:00","solved":false},"User:user:386096":{"__typename":"User","uid":386096,"login":"tmrlly_378163","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-5.svg?time=0"},"id":"user:386096"},"TkbTopicMessage:message:275748":{"__typename":"TkbTopicMessage","subject":"python f5-vserver-tool","conversation":{"__ref":"Conversation:conversation:275748"},"id":"message:275748","revisionNum":2,"uid":275748,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:386096"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":454},"postTime":"2018-12-12T02:31:13.000-08:00","lastPublishTime":"2023-06-05T21:51:38.469-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: What the tool does: \n List all virtual server, nodes and pools and their assignment for a big-ip system or device group print sync status of a device group assign a pool for a specific virtual server How to use this snippet: Usage \n https://github.com/FalcoSuessgott/f5-vserver-tool \n Print out information \n List virtual server and their assigned pools and their respective nodes \n [user@host ~]$ loadbalancer -l\n Password:\n Virtual Server Pool Pool member\n xxx-8010 xxxx 1.1.1.1:100, 1.1.1.1:200\n xxx-8020 xxxx 1.1.1.1:100, 1.1.1.1:200\n ....`\n \n\n List all virtual server \n [user@host ~]$ loadbalancer --list-vserver\n Password:\n vserver-1\n vserver-2\n vserver-3\n ....` \n \n\n List all pools \n [user@host ~]$ loadbalancer --list-pools\n Password:\n pool-1\n pool-2\n pool-3\n ....\n \n\n List all nodes \n [user@host ~]$ loadbalancer --list-nodes\n Password:\n node1\n node2\n node3\n ....\n \n\n List all virtual server \n [user@host ~]$ loadbalancer --list-vserver\n Password:\n vserver-1\n vserver-2\n vserver-3\n ....\n \n\n Print out sync-status \n [user@host ~]$ loadbalancer --show-sync-status\n Password: \n deviceGroup is currently In Sync\n \n\n Set assign pool1 to vserver1 \n [user@host ~]$ loadbalancer -s vserver1 pool1\n Password: \n Changing pool for \"vserver1\" to \"pool1\"\n Synchronizing new configuration to device group \"devicegroup\"\n devicegroup is In Sync\n \n\n Print out sample config file \n [user@host ~]$ loadbalancer -m\n [AUTH]\n user = \"user\"\n password = \"password\"\n\n [BASIC]\n devicegroup = \"devicegroup\"\n loadbalancer = \"fqdn\"\n Code : https://github.com/FalcoSuessgott/f5-vserver-tool ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1924","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/community/Navbar-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745262169148","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","Common-external-link":"How Do I...?","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745262169148","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745262169148","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745262169148","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745262169148","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-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745262169148","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1745262169148","value":{"success.follow.title":"Following Tag","success.unfollow.title":"Unfollowed Tag","success.follow.message.followAcrossCommunity":"You will be notified when this tag is used anywhere across the community","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745262169148","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745262169148","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1745262169148","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1745262169148","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-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745262169148","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1745262169148","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1745262169148","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745262169148","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745262169148","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745262169148","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-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745262169148","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-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1745262169148","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-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1745262169148","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1745262169148","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1745262169148","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-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1745262169148","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-1745262169148":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745262169148","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"nodeId":"board:codeshare","tagName":"python"},"buildId":"FP3zsFp6DJl70wDujOvtu","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.3.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/ListGroup/ListGroup.tsx","./components/messages/MessageView/MessageView.tsx","./components/messages/MessageView/MessageViewInline/MessageViewInline.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[]}