iControl

241 Topics
"}},"component({\"componentId\":\"custom.widget.Beta_MetaNav\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"tagFollowsForNodes({\"nodeIds\":\"board:codeshare\",\"tagText\":\"iControl\"})":[{"__typename":"TagFollowForNodeResponse","coreNode":{"__ref":"Tkb:board:codeshare"},"follow":null}],"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":"
"}},"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1728320186000"}]},"CachedAsset:pages-1737020476965":{"__typename":"CachedAsset","id":"pages-1737020476965","value":[{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1737020476965,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"CachedAsset:theme:customTheme1-1737020476533":{"__typename":"CachedAsset","id":"theme:customTheme1-1737020476533","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":null,"h2FontWeight":null,"h3FontWeight":null,"h4FontWeight":null,"h5FontWeight":null,"h6FontWeight":null,"__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1728320186000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1728320186000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-pages/tags/TagPage-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1728320186000","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0","mimeType":"image/png"},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","entityType":"CATEGORY","displayId":"CrowdSRC","nodeType":"category","depth":1,"title":"CrowdSRC","shortTitle":"CrowdSRC","parent":{"__ref":"Category:category:top"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","entityType":"TKB","displayId":"codeshare","nodeType":"board","depth":2,"conversationStyle":"TKB","title":"CodeShare","description":"Have some code. Share some code.","avatar":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi04Ny0xOTQ1NWk4ODNCOUNEMkFDNDZCQjI0\"}"},"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:CrowdSRC"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:zihoc95639"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:CrowdSRC"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}},"canReadNode":{"__typename":"PolicyResult","failureReason":null}},"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"shortTitle":"CodeShare","tagPolicies":{"__typename":"TagPolicies","canSubscribeTagOnNode":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","args":[]}},"canManageTagDashboard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","args":[]}}}},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:board:codeshare-1737020474670":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:board:codeshare-1737020474670","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:1737020422786":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1737020422786","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1728320186000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-1737020491748":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1737020491748","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-1737020491748":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1737020491748","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-1737020491748":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1737020491748","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-1737020491748":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1737020491748","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1728320186000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1728320186000","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1728320186000","value":{"title@userScope:other":"Recent Content","title@userScope:self":"Contributions","title@board:FORUM@userScope:other":"Recent Discussions","title@board:BLOG@userScope:other":"Recent Blogs","emptyDescription":"No content to show","MessageListForNodeByRecentActivityWidgetEditor.nodeScope.label":"Scope","title@instance:1706288370055":"Content Feed","title@instance:1704319314827":"Blog Feed","title@instance:1704317906837":"Content Feed","title@instance:1702668293472":"Community Feed","title@instance:1704320290851":"My Contributions","title@instance:1703720491809":"Forum Feed","title@instance:1703028709746":"Group Content Feed","title@instance:VTsglH":"Content Feed"},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:DevCentralNews":{"__typename":"Tkb","id":"board:DevCentralNews","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:GroupsCategory":{"__typename":"Category","id":"category:GroupsCategory","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:F5-Groups":{"__typename":"Category","id":"category:F5-Groups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CommunityGroups":{"__typename":"Category","id":"category:CommunityGroups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Occasion:board:Events":{"__typename":"Occasion","id":"board:Events","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"occasionPolicies":{"__typename":"OccasionPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Idea:board:Suggestions":{"__typename":"Idea","id":"board:Suggestions","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"ideaPolicies":{"__typename":"IdeaPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:communityarticles":{"__typename":"Tkb","id":"board:communityarticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:security-insights":{"__typename":"Tkb","id":"board:security-insights","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:article-series":{"__typename":"Tkb","id":"board:article-series","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Conversation:conversation: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"},"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":375},"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:285134":{"__typename":"Conversation","id":"conversation:285134","topic":{"__typename":"TkbTopicMessage","uid":285134},"lastPostingActivityTime":"2024-11-19T10:20:29.113-08:00","solved":false},"User:user:325385":{"__typename":"User","uid":325385,"login":"Patrik_Jonsson","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0zMjUzODUtMTY0MjJpNDQzQTkxREQwMjBDODY4NQ"},"id":"user:325385"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDZpQUNENUE4MDgyRkFCNEJFNg?revision=12\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDZpQUNENUE4MDgyRkFCNEJFNg?revision=12","title":"Patrik_Jonsson_0-1666904878537.png","associationType":"BODY","width":3456,"height":1434,"altText":"Patrik_Jonsson_0-1666904878537.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDdpNEM5NENFMEJEQUZBNEM1RA?revision=12\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDdpNEM5NENFMEJEQUZBNEM1RA?revision=12","title":"Patrik_Jonsson_1-1666904947099.png","associationType":"BODY","width":3444,"height":642,"altText":"Patrik_Jonsson_1-1666904947099.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDhpMTY5QkUzRjM3OUJCOTM0Rg?revision=12\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDhpMTY5QkUzRjM3OUJCOTM0Rg?revision=12","title":"Patrik_Jonsson_2-1666905155620.png","associationType":"BODY","width":3456,"height":1144,"altText":"Patrik_Jonsson_2-1666905155620.png"},"TkbTopicMessage:message:285134":{"__typename":"TkbTopicMessage","subject":"BIG-IP Report","conversation":{"__ref":"Conversation:conversation:285134"},"id":"message:285134","revisionNum":12,"uid":285134,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:325385"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":13501},"postTime":"2021-04-21T22:59:41.000-07:00","lastPublishTime":"2024-10-16T08:53:25.201-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n Overview \n This is a script which will generate a report of the BIG-IP LTM configuration on all your load balancers making it easy to find information and get a comprehensive overview of virtual servers and pools connected to them. \n This information is used to relay information to NOC and developers to give them insight in where things are located and to be able to plan patching and deploys. I also use it myself as a quick way get information or gather data used as a foundation for RFC's, ie get a list of all external virtual servers without compression profiles. \n The script has been running on 13 pairs of load balancers, indexing over 1200 virtual servers for several years now and the report is widely used across the company and by many companies and governments across the world. \n It's easy to setup and use and only requires auditor (read-only) permissions on your devices. \n Demo/Preview \n Interactive demo \n http://loadbalancing.se/bigipreportdemo/ \n Screen shots \n The main report: \n The device overview: \n Certificate details: \n How to use this snippet: \n Installation instructions \n BigipReport REST \n This is the only branch we're updating since middle of 2020 and it supports 12.x and upwards (maybe even 11.6). \n \n Downloads: https://loadbalancing.se/downloads/bigipreport-v5.7.13.zip \n Documentation, installation instructions and troubleshooting: https://loadbalancing.se/bigipreport-rest/\n Docker support \n https://loadbalancing.se/2021/01/05/running-bigipreport-on-docker/ \n Kubernetes support \n https://loadbalancing.se/2021/04/16/bigipreport-on-kubernetes/ \n BIG-IP Report (Legacy) \n Older version of the report that only runs on Windows and is depending on a Powershell plugin originally written by Joe Pruitt (F5) \n BIG-IP Report (only download this if you have v10 devices): \n https://loadbalancing.se/downloads/bigipreport-5.4.0-beta.zip \n iControl Snapin \n https://loadbalancing.se/downloads/f5-icontrol.zip \n Documentation and Installation Instructions \n https://loadbalancing.se/bigip-report/ \n Upgrade instructions \n Protect the report using APM and active directory \n Written by DevCentral member Shann_P: \n https://loadbalancing.se/2018/04/08/protecting-bigip-report-behind-an-apm-by-shannon-poole/ \n Got issues/problems/feedback? \n Still have issues? Drop a comment below. We usually reply quite fast. Any bugs found, issues detected or ideas contributed makes the report better for everyone, so it's always appreciated. \n --- \n Join us on Discord: https://discord.gg/7JJvPMYahA \n Code : \n BigIP Report \n Tested this on version: \n 12, 13, 14, 15, 16 \n \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2647","kudosSumWeight":20,"repliesCount":96,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjQuMTF8Mi4xfG98MjV8X05WX3wx","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDZpQUNENUE4MDgyRkFCNEJFNg?revision=12\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTF8Mi4xfG98MjV8X05WX3wy","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDdpNEM5NENFMEJEQUZBNEM1RA?revision=12\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTF8Mi4xfG98MjV8X05WX3wz","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODUxMzQtMjAzNDhpMTY5QkUzRjM3OUJCOTM0Rg?revision=12\"}"}}],"totalCount":3,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:283528":{"__typename":"Conversation","id":"conversation:283528","topic":{"__typename":"TkbTopicMessage","uid":283528},"lastPostingActivityTime":"2024-07-11T00:24:14.735-07:00","solved":false},"User:user:190002":{"__typename":"User","uid":190002,"login":"G-Rob","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xOTAwMDItMjE1NDVpQzdCNEVGMTE0QUVGRkI3OA"},"id":"user:190002"},"TkbTopicMessage:message:283528":{"__typename":"TkbTopicMessage","subject":"Generate private key w/ CSR via iControl REST","conversation":{"__ref":"Conversation:conversation:283528"},"id":"message:283528","revisionNum":1,"uid":283528,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:190002"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1994},"postTime":"2019-08-13T06:10:41.000-07:00","lastPublishTime":"2019-08-13T06:10:41.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Generate a private key w/ CSR How to use this snippet: To create a private key with a CSR via iControl REST:   POST URL: https://10.1.1.165/mgmt/tm/sys/crypto/key Use the data below as your payload. For the name field, it must end in .key or you will get a false 404! Code : { \n\"name\":\"www.testing.com.key\", \n\"commonName\":\"www.testing.com\", \n\"keySize\":\"4096\", \n\"keyType\":\"rsa-private\", \n\"options\":[{\"gen-csr\":\"www.testing.com\"}], \n\"organization\":\"Let It Snow Corp.\", \n\"ou\":\"Ice Engineering\", \n\"city\":\"Calhoun\", \n\"state\":\"AZ\", \n\"admin-email-address\":\"jerry@letit.snow\", \n\"email-address\":\"beth@letit.snow\", \n\"subject-alternative-name\":\"DNS:www.testing.com\", \n\"challenge-password\":\"myP4ssword\" \n} Tested this on version: 13.0","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"791","kudosSumWeight":3,"repliesCount":11,"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"},"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":369},"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:278551":{"__typename":"Conversation","id":"conversation:278551","topic":{"__typename":"TkbTopicMessage","uid":278551},"lastPostingActivityTime":"2023-06-06T12:24:46.271-07:00","solved":false},"User:user:200589":{"__typename":"User","uid":200589,"login":"wangh_97509","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-8.svg"},"id":"user:200589"},"TkbTopicMessage:message:278551":{"__typename":"TkbTopicMessage","subject":"Perl ARX ManualMigrateRule","conversation":{"__ref":"Conversation:conversation:278551"},"id":"message:278551","revisionNum":3,"uid":278551,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":306},"postTime":"2015-02-24T13:46:44.000-08:00","lastPublishTime":"2023-06-06T12:24:46.271-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This script is an example of how to use the iControl interfaces provided by an ARX to use manual migration rule to migrate files on an ARX. How to use this snippet: ARXManualMigrateRuleExample.pl --url --user --pass \n Prerequisites \n SOAP::Lite perl module An F5 ARX system running release V6.02.000 or later and configured with at least one manual migrate rule. Management access on the ARX must be permitted for HTTPs-API or HTTP-API services. Code : #!/usr/bin/perl\n#-------------------------------------------------------------------------------\n# The contents of this file are subject to the \"END USER LICENSE AGREEMENT \n# FOR F5 Software Development Kit for iControl\"; you may not use this file \n# except in compliance with the License. The License is included in the \n# iControl 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-2012\n# F5 Networks, Inc. All Rights Reserved. iControl (TM) is a registered \n# 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# Description\n#\n# This script is an example of how to use the iControl interfaces provided by\n# an ARX to use manual migration rule to migrate files on an ARX.\n#\n# Usage: ARXManualMigrateRuleExample.pl --url --user --pass --op \n#\n# Prerequisites:\n#\n# This script requires the following:\n#\n# * SOAP::Lite perl module\n# * An F5 ARX system configured with at least one configured manual migrate rule.\n# * Management access on the ARX must be permitted for HTTP-API and HTTPS-API\n# services.\n#\n# For more information on ARX configuration, please consult the\n# documentation that was provided with your ARX system.\n#-------------------------------------------------------------------------------\n\n# SOAP::Lite lets us send SOAP requests and parse them\nuse SOAP::Lite\n autotype => 0,\n default_ns => 'urn:iControl';\n\n# If you need to debug problems with your script, you can use the +trace \n# option with SOAP::Lite and it will print the XML sent to and received from\n# the server:\n#\n# use SOAP::Lite\n# autotype => 0,\n# default_ns => 'urn:iControl' + trace;\n\n# Getopt::Long lets us easily parse command line options\nuse Getopt::Long;\n\nuse POSIX qw(strftime);\n\nuse Carp;\n\nuse strict;\nuse warnings;\n\n#-------------------------------------------------------------------------------\n# Main program logic\n#-------------------------------------------------------------------------------\n\nour ($url, $user, $pass, $op);\n\n# Load command line options - if the load fails, then we print the usage\n# instructions and exit.\nif (!GetOptions(\"url=s\" => \\$url,\n \"user=s\" => \\$user,\n \"pass=s\" => \\$pass,\n \"op=s\" => \\$op)) {\n usage();\n exit(1);\n}\n\n# If any arguments were skipped, print the usage instructions and exit.\nif (!defined $url || !defined $user || !defined $pass || !defined $op) {\n usage();\n exit(1);\n}\n\n# The service path for interface \"Interface\" is this:\n#\n# http:// : /api/services/Interface\n#\nmy $manualMigrateRuleServiceUrl = $url . \"/api/services/ManualMigrateRule\";\n\n# In order for SOAP to access a web service, it needs to read the WSDL\n# for the interface you want to use. The WSDL file for an interface\n# called \"Interface\" is available via http/https on the ARX at:\n#\n# http:// : /api/services/Interface?wsdl\n#\n# If you need a WSDL 2.0 version, that is also available at:\n#\n# http:// : /arx-api/wsdl/Interface.wsdl2\n#\n# In this case, we're using the ManualMigrateRule interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $manualMigrateRuleWsdlUrl = $manualMigrateRuleServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $manualMigrateRuleSoap = SOAP::Lite->new(proxy => $manualMigrateRuleServiceUrl,\n service => $manualMigrateRuleWsdlUrl);\n\nprint \"Please specify a namespace:\\n\\n\";\nchomp(my $namespace = <>);\nprint \"\\n\";\n\nprint \"Please specify a volume:\\n\\n\";\nchomp(my $volume = <>);\nprint \"\\n\";\n\nif ($op eq \"get_list\")\n{\n get_list($namespace, $volume);\n}\nelsif ($op eq \"get_configuration\")\n{\n get_configuration($namespace, $volume);\n}\nelsif ($op eq \"get_status\")\n{\n get_status($namespace, $volume);\n}\nelsif ($op eq \"create\")\n{\n create($namespace, $volume);\n}\nelsif ($op eq \"set_migrate_close_file\")\n{\n set_migrate_close_file($namespace, $volume);\n}\n\nelsif ($op eq \"set_report\")\n{\n set_report($namespace, $volume);\n}\nelsif ($op eq \"set_enable\")\n{\n set_enable($namespace, $volume);\n}\nelsif ($op eq \"create_and_configure\")\n{\n create_and_configure($namespace, $volume);\n}\nelsif ($op eq \"remove\")\n{\n remove($namespace, $volume);\n}\nelsif ($op eq \"migrate_files\")\n{\n migrate_files($namespace, $volume);\n}\n\n\n#-------------------------------------------------------------------------------\n# End of main program logic\n#-------------------------------------------------------------------------------\n\n\n#-------------------------------------------------------------------------------\n# sub usage\n#-------------------------------------------------------------------------------\nsub usage\n{\n print \"\\nUsage: ARXManualMigrateRuleExample.pl --url --user --pass --op \\n\";\n print \"\\n\";\n print \"Argument Description\\n\";\n print \"-------- -----------\\n\";\n print \"--url The base URL of the web service on the ARX. Both http and https\\n\";\n print \" are supported. The format is:\\n\";\n print \"\\n\";\n print \" http(s):// : \\n\";\n print \"\\n\";\n print \" : DNS resolvable hostname or IP address\\n\";\n print \" : 83 for http or 843 for https\\n\";\n print \"\\n\";\n print \"--user The username for authentication.\\n\";\n print \"--pass The password for authentication.\\n\";\n print \"\\n\";\n print \"--op The ARXManualMigrateRule API method that will be called:\\n\";\n print \"\\n\";\n print \" create\\n\";\n print \" create_and_configure\\n\";\n print \" set_migrate_close_file\\n\";\n print \" set_report\\n\";\n print \" set_enable\\n\";\n print \" get_list\\n\";\n print \" get_configuration\\n\";\n print \" get_status\\n\";\n print \" migrate_files\\n\";\n print \" remove\\n\";\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# sub getSecurityHeader(user, pass)\n#\n# This subroutine builds a security header that will be used for\n# authentication. This type of security header is required for all calls to\n# iControl::ARX interfaces, so it makes sense to have this subroutine stored in\n# a library for common access.\n#-------------------------------------------------------------------------------\nsub getSecurityHeader\n{\n my $user = shift;\n my $pass = shift;\n my $now = time();\n my $then = time() + 60;\n my $created = strftime(\"%Y-%m-%dT%H:%M:%S\", gmtime($now)) . 'Z';\n my $expires = strftime(\"%Y-%m-%dT%H:%M:%S\", gmtime($then)) . 'Z';\n\n my $secExt = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';\n my $secUtil = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';\n my $securityHeader = SOAP::Header->name(\"wsse:Security\")->attr(\n {\n 'xmlns:wsse'=> $secExt,\n 'xmlns:wsu'=> $secUtil\n }\n );\n my $timestamp = SOAP::Data->name(\"wsu:Timestamp\" =>\n \\SOAP::Data->value(\n SOAP::Data->name('wsu:Created')->value($created)\n ->type(''),\n SOAP::Data->name('wsu:Expires')->value($expires)\n ->type('')));\n my $usernameTokenType = \n \"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\";\n my $usernameToken = SOAP::Data->name(\"wsse:UsernameToken\" =>\n \\SOAP::Data->value(\n SOAP::Data->name('wsse:Username')->value($user)\n ->type(''),\n SOAP::Data->name('wsse:Password')->value($pass)\n ->type('')\n ->attr({'Type'=>$usernameTokenType})));\n\n $securityHeader->value(\\SOAP::Data->value($timestamp, $usernameToken));\n\n return $securityHeader;\n}\n\nsub create\n{\n my ($namespace, $volume) = @_;\n\n print \"Please specify a rule name:\\n\\n\";\n chomp(my $manualMigrateRule = <>);\n print \"\\n\";\n\n print \"Calling the \\\"create\\\" method of the ARX ManualMigrateRule interface with the following parameters:\\n\\n\";\n print \"namespace: $namespace\\n\";\n print \"volume: $volume\\n\";\n print \"rule: $manualMigrateRule\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->create(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rule')->value($manualMigrateRule), \n $securityHeader);\n\n # Check if there were any faults encountered during the operation.\n # We find this by checking if the fault member of the result object\n # is set. If there is a fault, then we can print the detailed \n # fault text using the faultstring member of the result object.\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub create_and_configure\n{\n my ($namespace, $volume) = @_;\n\n print \"Please specify a rule name:\\n\\n\";\n chomp(my $manualMigrateRule = <>);\n print \"\\n\";\n\n print \"Please specify a report prefix:\\n\\n\";\n chomp(my $prefix = <>);\n print \"\\n\";\n\n print \"Please specify either 'true' or 'false' for 'verbose':\\n\\n\";\n chomp(my $verbose = <>);\n print \"\\n\";\n\n print \"Please specify either 'ARX_POLICY_REPORT_DELETE_UNKNOWN', 'ARX_POLICY_REPORT_DELETE_EMPTY', or 'ARX_POLICY_REPORT_ERROR_ONLY' for 'delete_report':\\n\\n\";\n chomp(my $delete_report = <>);\n print \"\\n\";\n\n print \"Please specify either 'ARX_POLICY_REPORT_INTERVAL_UNKNOWN', 'ARX_POLICY_REPORT_INTERVAL_HOURLY', or 'ARX_POLICY_REPORT_INTERVAL_DAILY' for 'interval':\\n\\n\";\n chomp(my $interval = <>);\n print \"\\n\";\n\n print \"Please specify either 'true' or 'false' for 'migrate_close_file':\\n\\n\";\n chomp(my $migrateCloseFileValue = <>);\n print \"\\n\";\n\n print \"Please specify files to be included in the 'exclude_file_set':\\n\\n\";\n chomp(my $excludeFileSetValue = <>);\n print \"\\n\";\n\n print \"Please specify either 'true' or 'false' for 'enable':\\n\\n\";\n chomp(my $enable = <>);\n print \"\\n\";\n\n if ($migrateCloseFileValue ne \"true\" && $migrateCloseFileValue ne \"false\") {\n confess(\"migrate_close_file value must be either 'true' or 'false'.\\n\");\n }\n\n my $baseReport = SOAP::Data->name('report' => \\SOAP::Data->value(SOAP::Data->name('prefix' => $prefix), \n SOAP::Data->name('verbose' => $verbose), \n SOAP::Data->name('delete_report' => $delete_report)));\n\n my $intervalReport = SOAP::Data->name('report' => \\SOAP::Data->value(SOAP::Data->name('interval' => $interval), $baseReport));\n\n my $migrateCloseFile = SOAP::Data->name('migrate_close_file' => \\SOAP::Data->value(SOAP::Data->name('migrate_close_file' => $migrateCloseFileValue), \n SOAP::Data->name('exclude_file_set' => $excludeFileSetValue)));\n\n my $configuration = SOAP::Data->name('configuration' => \\SOAP::Data->value(SOAP::Data->name('rule_name' => $manualMigrateRule), \n SOAP::Data->name('enable' => $enable), \n SOAP::Data->name('report' => $intervalReport), \n $migrateCloseFile));\n\n print \"Calling the \\\"create_and_configure\\\" method of the ARX ManualMigrateRule interface with the following parameters:\\n\\n\";\n print \"namespace: $namespace\\n\";\n print \"volume: $volume\\n\";\n print \"rule_name: $manualMigrateRule\\n\";\n print \"enable: $enable\\n\";\n print \"report:\\n\";\n print \" interval: $interval\\n\";\n print \" report: \\n\";\n print \" prefix: $prefix\\n\";\n print \" verbose: $verbose\\n\";\n print \" delete_report: $delete_report\\n\";\n print \"migrate_close_file:\\n\";\n print \" migrate_close_file: $migrateCloseFileValue\\n\";\n print \" exclude_file_set: $excludeFileSetValue\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->create_and_configure(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n $configuration, \n $securityHeader);\n\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_migrate_close_file\n{\n my ($namespace, $volume) = @_;\n\n print \"Please specify a rule name:\\n\\n\";\n chomp(my $manualMigrateRule = <>);\n print \"\\n\";\n\n print \"Please specify either 'true' or 'false' for 'migrate_close_file':\\n\\n\";\n chomp(my $migrateCloseFileValue = <>);\n print \"\\n\";\n\n print \"Please specify files to be included in the 'exclude_file_set':\\n\\n\";\n chomp(my $excludeFileSetValue = <>);\n print \"\\n\";\n\n if ($migrateCloseFileValue ne \"true\" && $migrateCloseFileValue ne \"false\") {\n confess(\"migrate_close_file value must be either 'true' or 'false'.\\n\");\n }\n\n my $migrateCloseFile = SOAP::Data->name('migrate_close_file' => \\SOAP::Data->value(SOAP::Data->name('migrate_close_file' => $migrateCloseFileValue), \n SOAP::Data->name('exclude_file_set' => $excludeFileSetValue)));\n\n print \"Calling the \\\"set_migrate_close_file\\\" method of the ARX ManualMigrateRule interface with the following parameters:\\n\\n\";\n print \"namespace: $namespace\\n\";\n print \"volume: $volume\\n\";\n print \"rule: $manualMigrateRule\\n\";\n print \"migrate_close_file:\\n\";\n print \" migrate_close_file: $migrateCloseFileValue\\n\";\n print \" exclude_file_set: $excludeFileSetValue\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->set_migrate_close_file(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rule')->value($manualMigrateRule), \n $migrateCloseFile, \n $securityHeader);\n\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_report\n{\n my ($namespace, $volume) = @_;\n\n print \"Please specify a rule name:\\n\\n\";\n chomp(my $manualMigrateRule = <>);\n print \"\\n\";\n\n print \"Please specify a report prefix:\\n\\n\";\n chomp(my $prefix = <>);\n print \"\\n\";\n\n print \"Please specify either 'true' or 'false' for 'verbose':\\n\\n\";\n chomp(my $verbose = <>);\n print \"\\n\";\n\n print \"Please specify either 'ARX_POLICY_REPORT_DELETE_UNKNOWN', 'ARX_POLICY_REPORT_DELETE_EMPTY', or 'ARX_POLICY_REPORT_ERROR_ONLY' for 'delete_report':\\n\\n\";\n chomp(my $delete_report = <>);\n print \"\\n\";\n\n print \"Please specify either 'ARX_POLICY_REPORT_INTERVAL_UNKNOWN', 'ARX_POLICY_REPORT_INTERVAL_HOURLY', or 'ARX_POLICY_REPORT_INTERVAL_DAILY' for 'interval':\\n\\n\";\n chomp(my $interval = <>);\n print \"\\n\";\n\n my $baseReport = SOAP::Data->name('report' => \\SOAP::Data->value(SOAP::Data->name('prefix' => $prefix), \n SOAP::Data->name('verbose' => $verbose), \n SOAP::Data->name('delete_report' => $delete_report)));\n\n my $intervalReport = SOAP::Data->name('report' => \\SOAP::Data->value(SOAP::Data->name('interval' => $interval), $baseReport));\n\n print \"Calling the \\\"set_report\\\" method of the ARX ManualMigrateRule interface with the following parameters:\\n\\n\";\n print \"namespace: $namespace\\n\";\n print \"volume: $volume\\n\";\n print \"rule: $manualMigrateRule\\n\";\n print \"report:\\n\";\n print \" interval: $interval\\n\";\n print \" report: \\n\";\n print \" prefix: $prefix\\n\";\n print \" verbose: $verbose\\n\";\n print \" delete_report: $delete_report\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->set_report(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rule')->value($manualMigrateRule), \n $intervalReport, \n $securityHeader);\n\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_enable\n{\n my ($namespace, $volume) = @_;\n\n print \"Please specify a rule name:\\n\\n\";\n chomp(my $manualMigrateRule = <>);\n print \"\\n\";\n\n print \"Please specify either 'true' or 'false' for 'enable':\\n\\n\";\n chomp(my $enable = <>);\n print \"\\n\";\n\n print \"Calling the \\\"set_enable\\\" method of the ARX ManualMigrateRule interface with the following parameters:\\n\\n\";\n print \"namespace: $namespace\\n\";\n print \"volume: $volume\\n\";\n print \"rule: $manualMigrateRule\\n\";\n print \"enable: $enable\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->set_enable(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rule')->value($manualMigrateRule), \n SOAP::Data->name('enable' => $enable), \n $securityHeader);\n\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub get_list\n{\n my ($namespace, $volume) = @_;\n\n # Get a list of manual migrate rules configured on the ARX.\n print \"Calling the \\\"get_list\\\" method of the ARX ManualMigrateRule interface.\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->get_list(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n $securityHeader);\n\n # Check if there were any faults encountered during the operation.\n # We find this by checking if the fault member of the result object\n # is set. If there is a fault, then we can print the detailed \n # fault text using the faultstring member of the result object.\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_list\\\" method of the ARX ManualMigrateRule interface.\\n\\n\";\n\n # The get_list() call did not fail, so we build a list of manual migrate rule\n # names from the result. Note that the full result is a\n # concatenation of the result and paramsout members of the SOAP\n # result object.\n my @manualMigrateRuleList = ($manualMigrateRuleSoapResult->result, \n $manualMigrateRuleSoapResult->paramsout);\n\n if ($#manualMigrateRuleList < 0) {\n print(\"The list of manual migrate rules returned from the call to the \\\"get_list\\\" method of the ARX ManualMigrateRule interface was empty.\\n\");\n exit(0);\n }\n\n # We can now print the list of manual migrate rules\n print \"Manual Migrate Rule list:\\n\";\n foreach my $mmr (@manualMigrateRuleList) {\n print \" \", $mmr, \"\\n\";\n }\n}\n\nsub get_configuration\n{\n my ($namespace, $volume) = @_;\n\n # Get a list of manual migrate rules configured on the ARX.\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->get_list(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n $securityHeader);\n\n # Check if there were any faults encountered during the operation.\n # We find this by checking if the fault member of the result object\n # is set. If there is a fault, then we can print the detailed \n # fault text using the faultstring member of the result object.\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n\n # The get_list() call did not fail, so we build a list of manual migrate rule\n # names from the result. Note that the full result is a\n # concatenation of the result and paramsout members of the SOAP\n # result object.\n my @manualMigrateRuleList = ($manualMigrateRuleSoapResult->result, \n $manualMigrateRuleSoapResult->paramsout);\n\n if ($#manualMigrateRuleList < 0) {\n print(\"The list of manual migrate rules returned from the call to the \\\"get_list\\\" method of the ARX ManualMigrateRule interface was empty.\\n\");\n exit(0);\n }\n\n # get manual migrate rule configuration from API\n print \"Calling the \\\"get_configuration\\\" method of the ARX ManualMigrateRule interface.\\n\\n\";\n\n # Build a security header\n $securityHeader = getSecurityHeader($user, $pass);\n\n # In addition to printing the list of manual migrate rules, we can actually\n # use that list to retrieve configuration information\n # for all of the manual migrate rules using the same list by calling\n # get_configuration().\n $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->get_configuration(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rules')->value(@manualMigrateRuleList), \n $securityHeader);\n\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_configuration\\\" method of the ARX ManualMigrateRule interface.\\n\\n\";\n\n my @manualMigrateRuleConfigs = ($manualMigrateRuleSoapResult->result, $manualMigrateRuleSoapResult->paramsout);\n\n foreach my $manualMigrateRuleConfig (@manualMigrateRuleConfigs) {\n my $rule_name = $manualMigrateRuleConfig->{'rule_name'};\n\n print \"----------------------------------------------\\n\";\n print \"Manual Migrate Rule: \", $rule_name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"rule_name: \", $rule_name, \"\\n\";\n\n my $enable = $manualMigrateRuleConfig->{'enable'};\n print \"enable: \", $enable, \"\\n\";\n\n if (exists $manualMigrateRuleConfig->{'report'}) {\n my $interval_report_config = $manualMigrateRuleConfig->{'report'};\n print \"report:\\n\";\n\n my $interval = $interval_report_config->{'interval'};\n print \" interval: \", $interval, \"\\n\";\n\n if (exists $interval_report_config->{'report'}) {\n my $base_report_config = $interval_report_config->{'report'};\n print \" report:\\n\";\n\n my $prefix = $base_report_config->{'prefix'};\n print \" prefix: \", $prefix, \"\\n\";\n\n my $verbose = $base_report_config->{'verbose'};\n print \" verbose: \", $verbose, \"\\n\";\n\n my $delete_report = $base_report_config->{'delete_report'};\n print \" delete_report: \", $delete_report, \"\\n\";\n }\n }\n\n if (exists $manualMigrateRuleConfig->{'migrate_close_file'}) {\n my $migrate_close_file_config = $manualMigrateRuleConfig->{'migrate_close_file'};\n print \"migrate_close_file:\\n\";\n\n my $migrate_close_file = $migrate_close_file_config->{'migrate_close_file'};\n print \" migrate_close_file: \", $migrate_close_file, \"\\n\";\n\n my $exclude_file_set = $migrate_close_file_config->{'exclude_file_set'};\n print \" exclude_file_set: \", $exclude_file_set, \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\nsub get_status\n{\n my ($namespace, $volume) = @_;\n\n # Get a list of manual migrate rules configured on the ARX.\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->get_list(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n $securityHeader);\n\n # Check if there were any faults encountered during the operation.\n # We find this by checking if the fault member of the result object\n # is set. If there is a fault, then we can print the detailed \n # fault text using the faultstring member of the result object.\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n\n # The get_list() call did not fail, so we build a list of manual migrate rule\n # names from the result. Note that the full result is a\n # concatenation of the result and paramsout members of the SOAP\n # result object.\n my @manualMigrateRuleList = ($manualMigrateRuleSoapResult->result, \n $manualMigrateRuleSoapResult->paramsout);\n\n if ($#manualMigrateRuleList < 0) {\n print(\"The list of manual migrate rules returned from the call to the \\\"get_list\\\" method of the ARX ManualMigrateRule interface was empty.\\n\");\n exit(0);\n }\n\n # get manual migrate rule status from API\n print \"Calling the \\\"get_status\\\" method of the ARX ManualMigrateRule interface.\\n\\n\";\n\n # Build a security header\n $securityHeader = getSecurityHeader($user, $pass);\n\n # In addition to printing the list of volumes, we can actually\n # use that list to retrieve status information for all of the volumes \n # using the same list by calling get_status().\n $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->get_status(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rules')->value(@manualMigrateRuleList), \n $securityHeader);\n\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_status\\\" method of the ARX ManualMigrateRule interface.\\n\\n\";\n\n my @manualMigrateRuleStatuses = ($manualMigrateRuleSoapResult->result, $manualMigrateRuleSoapResult->paramsout);\n\n foreach my $manualMigrateRuleStatus (@manualMigrateRuleStatuses) {\n my $mmr_status_rule_name = $manualMigrateRuleStatus->{'rule_name'};\n\n print \"----------------------------------------------\\n\";\n print \"Manual Migrate Rule: \", $mmr_status_rule_name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"rule_name: \", $mmr_status_rule_name, \"\\n\";\n\n my $available_request_slots = $manualMigrateRuleStatus->{'available_request_slots'};\n print \"available_request_slots: \", $available_request_slots, \"\\n\";\n\n }\n}\n\nsub migrate_files\n{\n my ($namespace, $volume) = @_;\n\n print \"Please specify a rule name:\\n\\n\";\n chomp(my $manualMigrateRule = <>);\n print \"\\n\";\n\n print \"Please specify a file list:\\n\\n\";\n chomp(my $fileList = <>);\n my @fileListArray = ($fileList);\n print \"\\n\";\n\n print \"Please specify a target share (hit to specify a target share farm instead):\\n\\n\";\n chomp(my $share = <>);\n print \"\\n\";\n\n print \"Please specify a target share farm (hit if a target share was previously specified):\\n\\n\";\n chomp(my $shareFarm = <>);\n print \"\\n\";\n\n print \"Calling the \\\"migrate_files\\\" method of the ARX ManualMigrateRule interface with the following parameters:\\n\\n\";\n print \"namespace: $namespace\\n\";\n print \"volume: $volume\\n\";\n print \"rule: $manualMigrateRule\\n\";\n print \"files: $fileList\\n\";\n print \"share: $share\\n\";\n print \"share_farm: $shareFarm\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->migrate_files(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rule')->value($manualMigrateRule), \n SOAP::Data->name('files')->value(@fileListArray), \n SOAP::Data->name('share')->value($share), \n SOAP::Data->name('share_farm')->value($shareFarm), \n $securityHeader);\n\n # Check if there were any faults encountered during the operation.\n # We find this by checking if the fault member of the result object\n # is set. If there is a fault, then we can print the detailed \n # fault text using the faultstring member of the result object.\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub remove\n{\n my ($namespace, $volume) = @_;\n\n print \"Please specify a rule name:\\n\\n\";\n chomp(my $manualMigrateRule = <>);\n print \"\\n\";\n\n print \"Calling the \\\"remove\\\" method of the ARX ManualMigrateRule interface with the following parameters:\\n\\n\";\n print \"namespace: $namespace\\n\";\n print \"volume: $volume\\n\";\n print \"rule: $manualMigrateRule\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $manualMigrateRuleSoapResult = $manualMigrateRuleSoap->remove(SOAP::Data->name('namespace')->value($namespace), \n SOAP::Data->name('volume')->value($volume), \n SOAP::Data->name('rule')->value($manualMigrateRule), \n $securityHeader);\n\n # Check if there were any faults encountered during the operation.\n # We find this by checking if the fault member of the result object\n # is set. If there is a fault, then we can print the detailed \n # fault text using the faultstring member of the result object.\n if (defined $manualMigrateRuleSoapResult->fault && $manualMigrateRuleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($manualMigrateRuleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub objdump\n{\n my ($obj, $indent) = @_;\n my $content = '';\n\n if (!defined $obj) {\n return $content;\n }\n\n if (!defined $indent) {\n $indent = ' ';\n }\n\n my $type = ref $obj;\n\n if (!defined $type || $type eq '' || $type eq 'SCALAR') {\n $content = $content . $indent . $obj . \"\\n\";\n }\n elsif ($type eq 'ARRAY') {\n foreach my $node (@$obj) {\n $content = $content . objdump($node, $indent);\n }\n }\n else {\n my $key;\n my $value;\n\n while (($key, $value) = each %$obj) {\n my $type2 = ref $value;\n if (!defined $type2 || $type2 eq '' || $type2 eq 'SCALAR') {\n $content = $content . $indent . \"\\'$key\\' => $value;\\n\";\n }\n else {\n $content = $content . $indent . \"\\'$key\\' => {\\n\";\n $content = $content . objdump($value, $indent.' ');\n $content = $content . $indent . \"}\\n\";\n }\n }\n }\n\n return $content;\n} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"37078","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:278561":{"__typename":"Conversation","id":"conversation:278561","topic":{"__typename":"TkbTopicMessage","uid":278561},"lastPostingActivityTime":"2023-06-06T12:24:41.964-07:00","solved":false},"TkbTopicMessage:message:278561":{"__typename":"TkbTopicMessage","subject":"Perl ARX Network","conversation":{"__ref":"Conversation:conversation:278561"},"id":"message:278561","revisionNum":3,"uid":278561,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":348},"postTime":"2015-02-24T13:58:22.000-08:00","lastPublishTime":"2023-06-06T12:24:41.964-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This script is an example of how to use the iControl interfaces provided by an ARX to retrieve all networks and their configurations, statuses and statistics on an ARX. How to use this snippet: ARXNetworkExample.pl --url --user --pass \n Prerequisites \n SOAP::Lite perl module An F5 ARX system running release V6.02.000 or later and configured with at least one configured network. Management access on the ARX must be permitted for HTTPs-API or HTTP-API services. Code : #!/usr/bin/perl\n#-------------------------------------------------------------------------------\n# The contents of this file are subject to the \"END USER LICENSE AGREEMENT \n# FOR F5 Software Development Kit for iControl\"; you may not use this file \n# except in compliance with the License. The License is included in the \n# iControl 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-2012\n# F5 Networks, Inc. All Rights Reserved. iControl (TM) is a registered \n# 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# Description\n#\n# This script is an example of how to use the iControl interfaces provided by\n# an ARX to retrieve all networks and their configurations, statuses and\n# statistics on an ARX.\n#\n# Usage: ARXNetworkExample.pl --url --user --pass \n#\n# Prerequisites:\n#\n# This script requires the following:\n#\n# * SOAP::Lite perl module\n# * An F5 ARX system configured with at least one configured network.\n# * Management access on the ARX must be permitted for HTTP-API and HTTPS-API\n# services.\n#\n# For more information on ARX configuration, please consult the\n# documentation that was provided with your ARX system.\n#-------------------------------------------------------------------------------\n\n# SOAP::Lite lets us send SOAP requests and parse them\nuse SOAP::Lite\n autotype => 0,\n default_ns => 'urn:iControl';\n\n# If you need to debug problems with your script, you can use the +trace \n# option with SOAP::Lite and it will print the XML sent to and received from\n# the server:\n#\n# use SOAP::Lite\n# autotype => 0,\n# default_ns => 'urn:iControl' + trace;\n\n# Getopt::Long lets us easily parse command line options\nuse Getopt::Long;\n\nuse POSIX qw(strftime);\n\nuse Carp;\n\nuse strict;\nuse warnings;\n\n#-------------------------------------------------------------------------------\n# Main program logic\n#-------------------------------------------------------------------------------\n\nour ($url, $user, $pass);\n\n# Load command line options - if the load fails, then we print the usage\n# instructions and exit.\nif (!GetOptions(\"url=s\" => \\$url,\n \"user=s\" => \\$user,\n \"pass=s\" => \\$pass)) {\n usage();\n exit(1);\n}\n\n# If any arguments were skipped, print the usage instructions and exit.\nif (!defined $url || !defined $user || !defined $pass) {\n usage();\n exit(1);\n}\n\n# The service path for interface \"Interface\" is this:\n#\n# http:// : /api/services/Interface\n#\nmy $networkServiceUrl = $url . \"/api/services/Network\";\n\n# In order for SOAP to access a web service, it needs to read the WSDL\n# for the interface you want to use. The WSDL file for an interface\n# called \"Interface\" is available via http/https on the ARX at:\n#\n# http:// : /api/services/Interface?wsdl\n#\n# If you need a WSDL 2.0 version, that is also available at:\n#\n# http:// : /arx-api/wsdl/Interface.wsdl2\n#\n# In this case, we're using the Network interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $networkWsdlUrl = $networkServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $networkSoap = SOAP::Lite->new(proxy => $networkServiceUrl,\n service => $networkWsdlUrl);\n\n#-------------------------------------------------------------------------------\n# get_list\n#-------------------------------------------------------------------------------\n\nmy @networkList = ();\n\nprint \"Calling the \\\"get_list\\\" method of the ARX Network interface.\\n\\n\";\n\n# Build a security header \nour $securityHeader = getSecurityHeader($user, $pass);\n\nmy $networkSoapResult = $networkSoap->get_list($securityHeader);\n\nif (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_list\\\" method of the ARX Network interface.\\n\\n\";\n\n @networkList = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n if ($#networkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_list\\\" method of the ARX Network interface was empty.\\n\");\n }\n else {\n print \"Networks:\\n\";\n\n foreach my $network (@networkList) {\n print \"$network\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_stats\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_stats\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#networkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_stats(SOAP::Data->name('interface_ids')->value(@networkList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_stats\\\" method of the ARX Network interface.\\n\\n\";\n\n my @networkStats = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $networkStat (@networkStats) {\n my $id = $networkStat->{'id'};\n\n print \"----------------------------------------------\\n\";\n print \"Network: \", $id, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"id: \", $id, \"\\n\";\n\n my $collisions = $networkStat->{'collisions'};\n print \"collisions: \", $collisions, \"\\n\";\n\n my $crc_errors = $networkStat->{'crc_errors'};\n print \"crc_errors: \", $crc_errors, \"\\n\";\n\n my $discarded = $networkStat->{'discarded'};\n print \"discarded: \", $discarded, \"\\n\";\n\n\n my $rx_broadcast = $networkStat->{'rx_broadcast'};\n print \"rx_broadcast: \", $rx_broadcast, \"\\n\";\n\n my $rx_multicast = $networkStat->{'rx_multicast'};\n print \"rx_multicast: \", $rx_multicast, \"\\n\";\n\n my $rx_octets = $networkStat->{'rx_octets'};\n print \"rx_octets: \", $rx_octets, \"\\n\";\n\n my $rx_total = $networkStat->{'rx_total'};\n print \"rx_total: \", $rx_total, \"\\n\";\n\n my $rx_unicast = $networkStat->{'rx_unicast'};\n print \"rx_unicast: \", $rx_unicast, \"\\n\";\n\n my $tx_broadcast = $networkStat->{'tx_broadcast'};\n print \"tx_broadcast: \", $tx_broadcast, \"\\n\";\n\n my $tx_multicast = $networkStat->{'tx_multicast'};\n print \"tx_multicast: \", $tx_multicast, \"\\n\";\n\n my $tx_octets = $networkStat->{'tx_octets'};\n print \"tx_octets: \", $tx_octets, \"\\n\";\n\n my $tx_total = $networkStat->{'tx_total'};\n print \"tx_total: \", $tx_total, \"\\n\";\n\n my $tx_unicast = $networkStat->{'tx_unicast'};\n print \"tx_unicast: \", $tx_unicast, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_gigabit_interface_list\n#-------------------------------------------------------------------------------\n\nmy @gigabitNetworkList = ();\n\nprint \"Calling the \\\"get_gigabit_interface_list\\\" method of the ARX Network interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$networkSoapResult = $networkSoap->get_gigabit_interface_list($securityHeader);\n\nif (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_gigabit_interface_list\\\" method of the ARX Network interface.\\n\\n\";\n\n @gigabitNetworkList = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n if ($#gigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_gigabit_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n }\n else {\n print \"Gigabit Network Ports:\\n\";\n\n foreach my $gigabitNetworkPort (@gigabitNetworkList) {\n my $slot = $gigabitNetworkPort->{'slot'};\n print \"slot: \", $slot, \"\\n\";\n\n my $port = $gigabitNetworkPort->{'port'};\n print \"port: \", $port, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_gigabit_interface_configuration\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_gigabit_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#gigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_gigabit_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n my @soapGigabitNetworkList = ConvertNetworkPortToSoapData(\\@gigabitNetworkList);\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_gigabit_interface_configuration(SOAP::Data->name('ports')->value(@soapGigabitNetworkList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_gigabit_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n my @gigabitInterfaceConfigs = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $gigabitInterfaceConfig (@gigabitInterfaceConfigs) {\n if (exists $gigabitInterfaceConfig->{'port'}) {\n my $gigabitInterfacePort = $gigabitInterfaceConfig->{'port'};\n\n my $slot = $gigabitInterfacePort->{'slot'};\n my $port = $gigabitInterfacePort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Gigabit Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $description = $gigabitInterfaceConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $flow_control_receive = $gigabitInterfaceConfig->{'flow_control_receive'};\n print \"flow_control_receive: \", $flow_control_receive, \"\\n\";\n\n my $flow_control_send = $gigabitInterfaceConfig->{'flow_control_send'};\n print \"flow_control_send: \", $flow_control_send, \"\\n\";\n\n my $redundancy_protocol = $gigabitInterfaceConfig->{'redundancy_protocol'};\n print \"redundancy_protocol: \", $redundancy_protocol, \"\\n\";\n\n my $speed = $gigabitInterfaceConfig->{'speed'};\n print \"speed: \", $speed, \"\\n\";\n\n my $enable = $gigabitInterfaceConfig->{'enable'};\n print \"enable: \", $enable, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_gigabit_interface_status\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_gigabit_interface_status\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#gigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_gigabit_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n my @soapGigabitNetworkList = ConvertNetworkPortToSoapData(\\@gigabitNetworkList);\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_gigabit_interface_status(SOAP::Data->name('ports')->value(@soapGigabitNetworkList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_gigabit_interface_status\\\" method of the ARX Network interface.\\n\\n\";\n\n my @gigabitInterfaceStatuses = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $gigabitInterfaceStatus (@gigabitInterfaceStatuses) {\n if (exists $gigabitInterfaceStatus->{'port'}) {\n my $gigabitInterfacePort = $gigabitInterfaceStatus->{'port'};\n\n my $slot = $gigabitInterfacePort->{'slot'};\n my $port = $gigabitInterfacePort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Gigabit Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $type = $gigabitInterfaceStatus->{'type'};\n print \"type: \", $type, \"\\n\";\n\n my $mode = $gigabitInterfaceStatus->{'mode'};\n print \"mode: \", $mode, \"\\n\";\n\n my $enabled = $gigabitInterfaceStatus->{'enabled'};\n print \"enabled: \", $enabled, \"\\n\";\n\n my $link_status = $gigabitInterfaceStatus->{'link_status'};\n print \"link_status: \", $link_status, \"\\n\";\n\n my $speed = $gigabitInterfaceStatus->{'speed'};\n print \"speed: \", $speed, \"\\n\";\n\n my $mac = $gigabitInterfaceStatus->{'mac'};\n print \"mac: \", $mac, \"\\n\";\n\n my $accept_all_frame = $gigabitInterfaceStatus->{'accept_all_frame'};\n print \"accept_all_frame: \", $accept_all_frame, \"\\n\";\n\n my $mtu_size = $gigabitInterfaceStatus->{'mtu_size'};\n print \"mtu_size: \", $mtu_size, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_ten_gigabit_interface_list\n#-------------------------------------------------------------------------------\n\nmy @tenGigabitNetworkList = ();\n\nprint \"Calling the \\\"get_ten_gigabit_interface_list\\\" method of the ARX Network interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$networkSoapResult = $networkSoap->get_ten_gigabit_interface_list($securityHeader);\n\nif (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_ten_gigabit_interface_list\\\" method of the ARX Network interface.\\n\\n\";\n\n @tenGigabitNetworkList = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n if ($#tenGigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_ten_gigabit_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n }\n else {\n print \"Ten Gigabit Network Ports:\\n\";\n\n foreach my $tenGigabitNetworkPort (@tenGigabitNetworkList) {\n my $slot = $tenGigabitNetworkPort->{'slot'};\n print \"slot: \", $slot, \"\\n\";\n\n my $port = $tenGigabitNetworkPort->{'port'};\n print \"port: \", $port, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_ten_gigabit_interface_configuration\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_ten_gigabit_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#tenGigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_ten_gigabit_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n my @soapTenGigabitNetworkList = ConvertNetworkPortToSoapData(\\@tenGigabitNetworkList);\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_ten_gigabit_interface_configuration(SOAP::Data->name('ports')->value(@soapTenGigabitNetworkList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_ten_gigabit_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n my @tenGigabitInterfaceConfigs = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $tenGigabitInterfaceConfig (@tenGigabitInterfaceConfigs) {\n if (exists $tenGigabitInterfaceConfig->{'port'}) {\n my $tenGigabitInterfacePort = $tenGigabitInterfaceConfig->{'port'};\n\n my $slot = $tenGigabitInterfacePort->{'slot'};\n my $port = $tenGigabitInterfacePort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Ten Gigabit Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $description = $tenGigabitInterfaceConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $flow_control_receive = $tenGigabitInterfaceConfig->{'flow_control_receive'};\n print \"flow_control_receive: \", $flow_control_receive, \"\\n\";\n\n my $flow_control_send = $tenGigabitInterfaceConfig->{'flow_control_send'};\n print \"flow_control_send: \", $flow_control_send, \"\\n\";\n\n my $redundancy_protocol = $tenGigabitInterfaceConfig->{'redundancy_protocol'};\n print \"redundancy_protocol: \", $redundancy_protocol, \"\\n\";\n\n my $enable = $tenGigabitInterfaceConfig->{'enable'};\n print \"enable: \", $enable, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_ten_gigabit_interface_status\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_ten_gigabit_interface_status\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#tenGigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_ten_gigabit_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n my @soapTenGigabitNetworkList = ConvertNetworkPortToSoapData(\\@tenGigabitNetworkList);\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_ten_gigabit_interface_status(SOAP::Data->name('ports')->value(@soapTenGigabitNetworkList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_ten_gigabit_interface_status\\\" method of the ARX Network interface.\\n\\n\";\n\n my @tenGigabitInterfaceStatuses = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $tenGigabitInterfaceStatus (@tenGigabitInterfaceStatuses) {\n if (exists $tenGigabitInterfaceStatus->{'port'}) {\n my $tenGigabitInterfacePort = $tenGigabitInterfaceStatus->{'port'};\n\n my $slot = $tenGigabitInterfacePort->{'slot'};\n my $port = $tenGigabitInterfacePort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Ten Gigabit Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $type = $tenGigabitInterfaceStatus->{'type'};\n print \"type: \", $type, \"\\n\";\n\n my $mode = $tenGigabitInterfaceStatus->{'mode'};\n print \"mode: \", $mode, \"\\n\";\n\n my $enabled = $tenGigabitInterfaceStatus->{'enabled'};\n print \"enabled: \", $enabled, \"\\n\";\n\n my $link_status = $tenGigabitInterfaceStatus->{'link_status'};\n print \"link_status: \", $link_status, \"\\n\";\n\n my $speed = $tenGigabitInterfaceStatus->{'speed'};\n print \"speed: \", $speed, \"\\n\";\n\n my $mac = $tenGigabitInterfaceStatus->{'mac'};\n print \"mac: \", $mac, \"\\n\";\n\n my $accept_all_frame = $tenGigabitInterfaceStatus->{'accept_all_frame'};\n print \"accept_all_frame: \", $accept_all_frame, \"\\n\";\n\n my $mtu_size = $tenGigabitInterfaceStatus->{'mtu_size'};\n print \"mtu_size: \", $mtu_size, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_interface_spanning_tree_configuration\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_interface_spanning_tree_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#gigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_interface_spanning_tree_configuration\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n my @soapGigabitNetworkList = ConvertNetworkPortToSoapData(\\@gigabitNetworkList);\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_interface_spanning_tree_configuration(SOAP::Data->name('ports')->value(@soapGigabitNetworkList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_interface_spanning_tree_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n my @networkIfSpanningTreeConfigs = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $networkIfSpanningTreeConfig (@networkIfSpanningTreeConfigs) {\n if (exists $networkIfSpanningTreeConfig->{'port'}) {\n my $networkIfSpanningTreePort = $networkIfSpanningTreeConfig->{'port'};\n\n my $slot = $networkIfSpanningTreePort->{'slot'};\n my $port = $networkIfSpanningTreePort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Gigabit Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $spanning_tree_cost = $networkIfSpanningTreeConfig->{'spanning_tree_cost'};\n print \"spanning_tree_cost: \", $spanning_tree_cost, \"\\n\";\n\n my $spanning_tree_priority = $networkIfSpanningTreeConfig->{'spanning_tree_priority'};\n print \"spanning_tree_priority: \", $spanning_tree_priority, \"\\n\";\n\n my $spanning_tree_edgeport = $networkIfSpanningTreeConfig->{'spanning_tree_edgeport'};\n print \"spanning_tree_edgeport: \", $spanning_tree_edgeport, \"\\n\";\n\n my $spanning_tree_force_migration = $networkIfSpanningTreeConfig->{'spanning_tree_force_migration'};\n print \"spanning_tree_force_migration: \", $spanning_tree_force_migration, \"\\n\";\n\n my $spanning_tree_enable = $networkIfSpanningTreeConfig->{'spanning_tree_enable'};\n print \"spanning_tree_enable: \", $spanning_tree_enable, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_interface_spanning_tree_configuration\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_interface_spanning_tree_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#tenGigabitNetworkList < 0) {\n print(\"The list of networks returned from the call to the \\\"get_interface_spanning_tree_configuration\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n my @soapTenGigabitNetworkList = ConvertNetworkPortToSoapData(\\@tenGigabitNetworkList);\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_interface_spanning_tree_configuration(SOAP::Data->name('ports')->value(@soapTenGigabitNetworkList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_interface_spanning_tree_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n my @networkIfSpanningTreeConfigs = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $networkIfSpanningTreeConfig (@networkIfSpanningTreeConfigs) {\n if (exists $networkIfSpanningTreeConfig->{'port'}) {\n my $networkIfSpanningTreePort = $networkIfSpanningTreeConfig->{'port'};\n\n my $slot = $networkIfSpanningTreePort->{'slot'};\n my $port = $networkIfSpanningTreePort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Ten Gigabit Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $spanning_tree_cost = $networkIfSpanningTreeConfig->{'spanning_tree_cost'};\n print \"spanning_tree_cost: \", $spanning_tree_cost, \"\\n\";\n\n my $spanning_tree_priority = $networkIfSpanningTreeConfig->{'spanning_tree_priority'};\n print \"spanning_tree_priority: \", $spanning_tree_priority, \"\\n\";\n\n my $spanning_tree_edgeport = $networkIfSpanningTreeConfig->{'spanning_tree_edgeport'};\n print \"spanning_tree_edgeport: \", $spanning_tree_edgeport, \"\\n\";\n\n my $spanning_tree_force_migration = $networkIfSpanningTreeConfig->{'spanning_tree_force_migration'};\n print \"spanning_tree_force_migration: \", $spanning_tree_force_migration, \"\\n\";\n\n my $spanning_tree_enable = $networkIfSpanningTreeConfig->{'spanning_tree_enable'};\n print \"spanning_tree_enable: \", $spanning_tree_enable, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_mgmt_interface_configuration\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_mgmt_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$networkSoapResult = $networkSoap->get_mgmt_interface_configuration($securityHeader);\n\nif (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_mgmt_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n my $mgmtIfConfig = $networkSoapResult->result;\n\n if (exists $mgmtIfConfig->{'port'}) {\n my $mgmtIfPort = $mgmtIfConfig->{'port'};\n\n my $slot = $mgmtIfPort->{'slot'};\n my $port = $mgmtIfPort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Management Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $description = $mgmtIfConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $ip_address = $mgmtIfConfig->{'ip_address'};\n print \"ip_address: \", $ip_address, \"\\n\";\n\n my $ip_mask = $mgmtIfConfig->{'ip_mask'};\n print \"ip_mask: \", $ip_mask, \"\\n\";\n\n my $speed = $mgmtIfConfig->{'speed'};\n print \"speed: \", $speed, \"\\n\";\n\n my $enable = $mgmtIfConfig->{'enable'};\n print \"enable: \", $enable, \"\\n\";\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_mgmt_interface_status\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_mgmt_interface_status\\\" method of the ARX Network interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$networkSoapResult = $networkSoap->get_mgmt_interface_status($securityHeader);\n\nif (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_mgmt_interface_status\\\" method of the ARX Network interface.\\n\\n\";\n\n my $mgmtIfStatus = $networkSoapResult->result;\n\n if (exists $mgmtIfStatus->{'port'}) {\n my $mgmtIfPort = $mgmtIfStatus->{'port'};\n\n my $slot = $mgmtIfPort->{'slot'};\n my $port = $mgmtIfPort->{'port'};\n\n print \"----------------------------------------------\\n\";\n print \"Management Interface: slot: \", $slot, \", port: \", $port, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"port:\\n\";\n print \" slot: \", $slot, \"\\n\";\n print \" port: \", $port, \"\\n\";\n }\n\n my $type = $mgmtIfStatus->{'type'};\n print \"type: \", $type, \"\\n\";\n\n my $mode = $mgmtIfStatus->{'mode'};\n print \"mode: \", $mode, \"\\n\";\n\n my $enabled = $mgmtIfStatus->{'enabled'};\n print \"enabled: \", $enabled, \"\\n\";\n\n my $link_status = $mgmtIfStatus->{'link_status'};\n print \"link_status: \", $link_status, \"\\n\";\n\n my $speed = $mgmtIfStatus->{'speed'};\n print \"speed: \", $speed, \"\\n\";\n\n my $mac = $mgmtIfStatus->{'mac'};\n print \"mac: \", $mac, \"\\n\";\n\n my $accept_all_frame = $mgmtIfStatus->{'accept_all_frame'};\n print \"accept_all_frame: \", $accept_all_frame, \"\\n\";\n\n my $mtu_size = $mgmtIfStatus->{'mtu_size'};\n print \"mtu_size: \", $mtu_size, \"\\n\";\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_vlan_interface_list\n#-------------------------------------------------------------------------------\n\nmy @vlanList = ();\n\nprint \"Calling the \\\"get_vlan_interface_list\\\" method of the ARX Network interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$networkSoapResult = $networkSoap->get_vlan_interface_list($securityHeader);\n\nif (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_vlan_interface_list\\\" method of the ARX Network interface.\\n\\n\";\n\n @vlanList = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n if ($#vlanList < 0) {\n print(\"The list of VLAN interfaces returned from the call to the \\\"get_vlan_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n }\n else {\n print \"VLAN Interfaces:\\n\";\n\n foreach my $vlan (@vlanList) {\n print \"$vlan\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_vlan_interface_configuration\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_vlan_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#vlanList < 0) {\n print(\"The list of VLAN interfaces returned from the call to the \\\"get_vlan_interface_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_vlan_interface_configuration(SOAP::Data->name('ids')->value(@vlanList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_vlan_interface_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n my @vlanConfigs = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $vlanConfig (@vlanConfigs) {\n my $id = $vlanConfig->{'id'};\n\n print \"----------------------------------------------\\n\";\n print \"VLAN Interface: \", $id, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"id: \", $id, \"\\n\";\n\n my $description = $vlanConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $ip_address = $vlanConfig->{'ip_address'};\n print \"ip_address: \", $ip_address, \"\\n\";\n\n my $ip_mask = $vlanConfig->{'ip_mask'};\n print \"ip_mask: \", $ip_mask, \"\\n\";\n\n my $redundancy = $vlanConfig->{'redundancy'};\n print \"redundancy: \", $redundancy, \"\\n\";\n\n my $enable = $vlanConfig->{'enable'};\n print \"enable: \", $enable, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_ip_proxy_list\n#-------------------------------------------------------------------------------\n\nmy @ipProxyList = ();\n\nprint \"Calling the \\\"get_ip_proxy_list\\\" method of the ARX Network interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$networkSoapResult = $networkSoap->get_ip_proxy_list($securityHeader);\n\nif (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_ip_proxy_list\\\" method of the ARX Network interface.\\n\\n\";\n\n @ipProxyList = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n if ($#ipProxyList < 0) {\n print(\"The list of IP Proxies returned from the call to the \\\"get_ip_proxy_list\\\" method of the ARX Network interface was empty.\\n\");\n }\n else {\n print \"IP Proxies:\\n\";\n\n foreach my $ipProxy (@ipProxyList) {\n print \"$ipProxy\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_ip_proxy_configuration\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_ip_proxy_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#ipProxyList < 0) {\n print(\"The list of IP Proxies returned from the call to the \\\"get_ip_proxy_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_ip_proxy_configuration(SOAP::Data->name('ip_address')->value(@ipProxyList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_ip_proxy_configuration\\\" method of the ARX Network interface.\\n\\n\";\n\n my @ipProxyConfigs = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $ipProxyConfig (@ipProxyConfigs) {\n my $proxy_address = $ipProxyConfig->{'proxy_address'};\n\n print \"----------------------------------------------\\n\";\n print \"IP Proxy Address: \", $proxy_address, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"proxy_address: \", $proxy_address, \"\\n\";\n\n my $mask = $ipProxyConfig->{'mask'};\n print \"mask: \", $mask, \"\\n\";\n\n my $mac = $ipProxyConfig->{'mac'};\n print \"mac: \", $mac, \"\\n\";\n\n if (exists $ipProxyConfig->{'processor'}) {\n my $ipProxyProc = $ipProxyConfig->{'processor'};\n print \"processor:\\n\";\n\n my $slot = $ipProxyProc->{'slot'};\n print \" slot: \", $slot, \"\\n\";\n\n my $processor = $ipProxyProc->{'processor'};\n print \" processor: \", $processor, \"\\n\";\n print \"\\n\";\n }\n\n my $vlan = $ipProxyConfig->{'vlan'};\n print \"vlan: \", $vlan, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_ip_proxy_status\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_ip_proxy_status\\\" method of the ARX Network interface.\\n\\n\";\n\nif ($#ipProxyList < 0) {\n print(\"The list of IP Proxies returned from the call to the \\\"get_ip_proxy_list\\\" method of the ARX Network interface was empty.\\n\");\n}\nelse {\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $networkSoapResult = $networkSoap->get_ip_proxy_status(SOAP::Data->name('ip_address')->value(@ipProxyList), \n $securityHeader);\n\n if (defined $networkSoapResult->fault && $networkSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($networkSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_ip_proxy_status\\\" method of the ARX Network interface.\\n\\n\";\n\n my @ipProxyStatuses = ($networkSoapResult->result, $networkSoapResult->paramsout);\n\n foreach my $ipProxyStatus (@ipProxyStatuses) {\n my $proxy_address = $ipProxyStatus->{'proxy_address'};\n print \"proxy_address: \", $proxy_address, \"\\n\";\n\n my $mac = $ipProxyStatus->{'mac'};\n print \"mac: \", $mac, \"\\n\";\n\n my $owner = $ipProxyStatus->{'owner'};\n print \"owner: \", $owner, \"\\n\";\n\n my $in_use_by = $ipProxyStatus->{'in_use_by'};\n print \"in_use_by: \", $in_use_by, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n\n#-------------------------------------------------------------------------------\n# End of main program logic\n#-------------------------------------------------------------------------------\n\n\n#-------------------------------------------------------------------------------\n# sub usage\n#-------------------------------------------------------------------------------\nsub usage\n{\n print \"\\nUsage: ARXNetworkExample.pl --url --user --pass \\n\";\n print \"\\n\";\n print \"Argument Description\\n\";\n print \"-------- -----------\\n\";\n print \"--url The base URL of the web service on the ARX. Both http and https\\n\";\n print \" are supported. The format is:\\n\";\n print \"\\n\";\n print \" http(s):// : \\n\";\n print \"\\n\";\n print \" : DNS resolvable hostname or IP address\\n\";\n print \" : 83 for http or 843 for https\\n\";\n print \"\\n\";\n print \"--user The username for authentication.\\n\";\n print \"--pass The password for authentication.\\n\";\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# sub getSecurityHeader(user, pass)\n#\n# This subroutine builds a security header that will be used for\n# authentication. This type of security header is required for all calls to\n# iControl::ARX interfaces, so it makes sense to have this subroutine stored in\n# a library for common access.\n#-------------------------------------------------------------------------------\nsub getSecurityHeader\n{\n my $user = shift;\n my $pass = shift;\n my $now = time();\n my $then = time() + 60;\n my $created = strftime(\"%Y-%m-%dT%H:%M:%S\", gmtime($now)) . 'Z';\n my $expires = strftime(\"%Y-%m-%dT%H:%M:%S\", gmtime($then)) . 'Z';\n\n my $secExt = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';\n my $secUtil = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';\n my $securityHeader = SOAP::Header->name(\"wsse:Security\")->attr(\n {\n 'xmlns:wsse'=> $secExt,\n 'xmlns:wsu'=> $secUtil\n }\n );\n my $timestamp = SOAP::Data->name(\"wsu:Timestamp\" =>\n \\SOAP::Data->value(\n SOAP::Data->name('wsu:Created')->value($created)\n ->type(''),\n SOAP::Data->name('wsu:Expires')->value($expires)\n ->type('')));\n my $usernameTokenType = \n \"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\";\n my $usernameToken = SOAP::Data->name(\"wsse:UsernameToken\" =>\n \\SOAP::Data->value(\n SOAP::Data->name('wsse:Username')->value($user)\n ->type(''),\n SOAP::Data->name('wsse:Password')->value($pass)\n ->type('')\n ->attr({'Type'=>$usernameTokenType})));\n\n $securityHeader->value(\\SOAP::Data->value($timestamp, $usernameToken));\n\n return $securityHeader;\n}\n\nsub objdump\n{\n my ($obj, $indent) = @_;\n my $content = '';\n\n if (!defined $obj) {\n return $content;\n }\n\n if (!defined $indent) {\n $indent = ' ';\n }\n\n my $type = ref $obj;\n\n if (!defined $type || $type eq '' || $type eq 'SCALAR') {\n $content = $content . $indent . $obj . \"\\n\";\n }\n elsif ($type eq 'ARRAY') {\n foreach my $node (@$obj) {\n $content = $content . objdump($node, $indent);\n }\n }\n else {\n my $key;\n my $value;\n\n while (($key, $value) = each %$obj) {\n my $type2 = ref $value;\n if (!defined $type2 || $type2 eq '' || $type2 eq 'SCALAR') {\n $content = $content . $indent . \"\\'$key\\' => $value;\\n\";\n }\n else {\n $content = $content . $indent . \"\\'$key\\' => {\\n\";\n $content = $content . objdump($value, $indent.' ');\n $content = $content . $indent . \"}\\n\";\n }\n }\n }\n\n return $content;\n}\n\nsub ConvertNetworkPortToSoapData\n{\n my ($portListRef) = @_;\n my @dataArray;\n \n foreach my $port (@$portListRef) {\n my $sport = SOAP::Data->name(\"ports\")->value(\\SOAP::Data->value(\n SOAP::Data->name(\"slot\")->value($port->{'slot'}),\n SOAP::Data->name(\"port\")->value($port->{'port'})));\n push(@dataArray, $sport);\n }\n \n return @dataArray;\n} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"47572","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:275018":{"__typename":"Conversation","id":"conversation:275018","topic":{"__typename":"TkbTopicMessage","uid":275018},"lastPostingActivityTime":"2023-06-05T22:59:52.303-07:00","solved":false},"User:user:207843":{"__typename":"User","uid":207843,"login":"Theo_12742","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-8.svg"},"id":"user:207843"},"TkbTopicMessage:message:275018":{"__typename":"TkbTopicMessage","subject":"python bigsuds - Get Orphaned iRules","conversation":{"__ref":"Conversation:conversation:275018"},"id":"message:275018","revisionNum":2,"uid":275018,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:207843"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":207},"postTime":"2016-01-20T13:56:07.000-08:00","lastPublishTime":"2023-06-05T22:59:52.303-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This python bigsuds script will get a list of all iRules that are not associated with a virtual server (orphaned). How to use this snippet: orphanedrules.py <hostname> <username>\n \n\n Script will prompt for password. \n Script \n orphanedrules.py Code : #!/usr/bin/env python\n\n__author__ = 'buzzsurfr'\n__version__ = '0.1'\n\ndef get_orphaned_rules(obj, recursive = True):\n'''\nGets a list of orphaned rules.\n\nPrototype\nString [] get_orphaned_rules(\nBIGIP.bigip obj,\nbool recursive = True\n);\n\nParameters\nobj of type BIGIP.bigip contains the established connection.\nrecursive of type boolean indicates whether to perform a recursive search throughout the entire configuration. Defaults to True.\n\nReturn Type\nString [] containing the list of all orphaned rules.\n'''\n\n# Get current values to override for search\nactive_folder = obj.System.Session.get_active_folder()\nrecursive_query_state = obj.System.Session.get_recursive_query_state()\n\n# Enable fully-recursive search\nif recursive:\nobj.System.Session.set_active_folder('/')\nobj.System.Session.set_recursive_query_state(\"STATE_ENABLED\")\n\n# Get list of iRules\nrules = obj.LocalLB.Rule.get_list()\n\n# Create starting list of orphaned iRules. These will be removed from\n# list as they are found to be in use.\norphaned_rules = rules\n\n# Get list of all iRules associated on virtual servers\nvs_rules = obj.LocalLB.VirtualServer.get_rule(obj.LocalLB.VirtualServer.get_list())\n\n# Check each virtual server for iRules and remove from orphaned if exists\nfor virtual_server in vs_rules:\nfor rule in virtual_server:\nif rule['rule_name'] in rules:\n# If found, remove from orphaned_rules\norphaned_rules.remove(rule['rule_name'])\n\n# Reset values overridden for search\nif recursive:\nobj.System.Session.set_active_folder(active_folder)\nobj.System.Session.set_recursive_query_state(recursive_query_state)\n\nreturn orphaned_rules\n\n# Instance Mode (Run as script)\nif __name__ == \"__main__\":\n\n# Standard Library\nimport sys\n\n# Related Third-Party\nimport getpass\n\n# Local Application/Library Specific\nimport bigsuds\n\nif len(sys.argv) < 3:\nprint \"\\n\\n\\tUsage: %s ip_address username\" % sys.argv[0]\nsys.exit()\n\n# Get password from CLI\nuserpass = getpass.getpass()\n\n# Connect to BIG-IP\ntry:\nbigconn = bigsuds.BIGIP(\nhostname = sys.argv[1],\nusername = sys.argv[2],\npassword = userpass\n)\nexcept Exception as e:\nprint e\n\norphans = get_orphaned_rules(bigconn)\n\nprint \"Orphaned iRules\"\nfor orphan in orphans:\nprint \"\\t\" + orphan Tested this on version: 11.5","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2538","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:275020":{"__typename":"Conversation","id":"conversation:275020","topic":{"__typename":"TkbTopicMessage","uid":275020},"lastPostingActivityTime":"2023-06-05T22:59:14.486-07:00","solved":false},"TkbTopicMessage:message:275020":{"__typename":"TkbTopicMessage","subject":"python bigsuds - Reverse Lookup (Node -> Pool)","conversation":{"__ref":"Conversation:conversation:275020"},"id":"message:275020","revisionNum":2,"uid":275020,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:207843"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":194},"postTime":"2016-02-01T06:20:20.000-08:00","lastPublishTime":"2023-06-05T22:59:14.486-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This python bigsuds script prints the list of pools using a specific node. How to use this snippet: rlookup-node.py <hostname> <username> <nodename>\n \n\n This will only search the Common partition. Code : #!/usr/bin/env python\n\n__author__ = 'buzzsurfr'\n__version__ = '0.1'\n\n# Standard Library\nimport sys\nimport re\n\n# Related Third-Party\nimport getpass\n\n# Local Application/Library Specific\nimport bigsuds\n\nif len(sys.argv) < 4:\nprint \"\\n\\n\\tUsage: %s host user node\" % sys.argv[0]\nsys.exit()\n\n# Get login password from CLI\nuserpass = getpass.getpass()\n\n# Connect to BIG-IP\nb = bigsuds.BIGIP(sys.argv[1], sys.argv[2], userpass)\n\n# Get list of pools and pool members\npools = b.LocalLB.Pool.get_list()\npool_members = b.LocalLB.Pool.get_member_v2(pools)\n\n# Node to search for\nnode = sys.argv[3]\nif len(node) < 8 or node[:8] != '/Common/':\nnode = '/Common/'+node\nprint \"Pools using Node \"+node\n\n# Iterate through pool member list (has a list of members per pool referenced) looking for node\nfor i, pool in enumerate(pool_members):\n for member in pool:\n if node == member['address']:\n print \"\\t\"+pools[i] Tested this on version: 11.5","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1217","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:275022":{"__typename":"Conversation","id":"conversation:275022","topic":{"__typename":"TkbTopicMessage","uid":275022},"lastPostingActivityTime":"2023-06-05T22:59:02.540-07:00","solved":false},"TkbTopicMessage:message:275022":{"__typename":"TkbTopicMessage","subject":"python bigsuds - Reverse Lookup (Pool -> Virtual Server)","conversation":{"__ref":"Conversation:conversation:275022"},"id":"message:275022","revisionNum":2,"uid":275022,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:207843"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":233},"postTime":"2016-02-02T10:52:57.000-08:00","lastPublishTime":"2023-06-05T22:59:02.540-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This python bigsuds script prints the list of virtual servers using a specific pool. How to use this snippet: rlookup-pool.py <hostname> <username> <poolname>\n \n\n This will only search the Common partition. This also does not check for policies or iRules that may change the value of pool. Code : #!/usr/bin/env python\n\n__author__ = 'buzzsurfr'\n__version__ = '0.1'\n\n# Standard Library\nimport sys\nimport re\n\n# Related Third-Party\nimport getpass\n\n# Local Application/Library Specific\nimport bigsuds\n\nif len(sys.argv) < 4:\nprint \"\\n\\n\\tUsage: %s host user pool\" % sys.argv[0]\nsys.exit()\n\n# Get login password from CLI\nuserpass = getpass.getpass()\n\n# Connect to BIG-IP\nb = bigsuds.BIGIP(sys.argv[1], sys.argv[2], userpass)\n\npool = sys.argv[3]\nif len(pool) < 8 or pool[:8] != '/Common/':\npool = '/Common/'+pool\nprint \"Virtual Servers using Pool \"+pool\n\n# Get list of pools and pool members\nvirtual_servers = b.LocalLB.VirtualServer.get_list()\nvs_pools = b.LocalLB.VirtualServer.get_default_pool_name(virtual_servers)\n\n# Iterate through pool member list (has a list of members per pool referenced) looking for node\nfor i, vs_pool in enumerate(vs_pools):\n if pool == vs_pool:\n print \"\\t\"+virtual_servers[i] Tested this on version: 11.5","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1308","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:275009":{"__typename":"Conversation","id":"conversation:275009","topic":{"__typename":"TkbTopicMessage","uid":275009},"lastPostingActivityTime":"2023-06-05T22:54:35.079-07:00","solved":false},"TkbTopicMessage:message:275009":{"__typename":"TkbTopicMessage","subject":"python bigsuds - Connect to Active Device","conversation":{"__ref":"Conversation:conversation:275009"},"id":"message:275009","revisionNum":2,"uid":275009,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:207843"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":224},"postTime":"2016-05-13T20:48:34.000-07:00","lastPublishTime":"2023-06-05T22:54:35.079-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Connects to the active member of a Device Group regardless of the original hostname. Can be used as a function or as a command-line call. How to use this snippet: bigip-active.py <hostname> <username>\n \n\n \n Script will prompt for password. \n Code : #!/usr/bin/env python\n#\n# bigip_active: Connects to the active member of a Device Group regardless of\n# the original hostname.\n\n__author__ = 'buzzsurfr'\n__version__ = '0.1'\n\n# Standard Library\nimport sys\nimport itertools\n\n# Related Third-Party\nimport getpass\n\n# Local Application/Library Specific\nimport bigsuds\n\ndef bigip_active(hostname, username='admin', password='admin', debug=False, cachedir=None, verify=False, timeout=90):\n# Connect to specified BIG-IP\nb = bigsuds.BIGIP(hostname, username, password, debug, cachedir, verify, timeout)\n\n# Determine whether device is active\nif(b.Management.DeviceGroup.get_failover_status()['status'] != 'ACTIVE'):\nlocal_device = b.Management.Device.get_local_device()\nnew_device = False\nfor device in list(set(itertools.chain.from_iterable(b.Management.DeviceGroup.get_device(b.Management.DeviceGroup.get_list())))).remove(local_device):\nif(b.Management.Device.get_failover_state(device) == 'HA_STATE_ACTIVE'):\nnew_device = device\nif(new_device):\nprint b.Management.Device.get_local_device()[8:]+\" is not active. Switching to \"+new_device[8:]\nb = bigsuds.BIGIP(new_device[8:], username, password, debug, cachedir, verify, timeout)\nreturn b\n\nif __name__ == '__main__':\nbigip_active(sys.argv[1], sys.argv[2], getpass.getpass()) Tested this on version: 11.5","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1605","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1728320186000","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/community/Navbar-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1728320186000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1728320186000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1728320186000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1728320186000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1728320186000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1728320186000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1728320186000","value":{"success.follow.title":"Following Tag","success.unfollow.title":"Unfollowed Tag","success.follow.message.followAcrossCommunity":"You will be notified when this tag is used anywhere across the communtiy","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1728320186000","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1728320186000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1728320186000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1728320186000","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1728320186000","value":{"bylineAuthor":"{bylineAuthor}","bylineBoard":"{bylineBoard}","anonymous":"Anonymous","place":"Place {bylineBoard}","gotoParent":"Go to parent {name}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1728320186000","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1728320186000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1728320186000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1728320186000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1728320186000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1728320186000","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1728320186000","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1728320186000","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1728320186000","value":{"textTitle":"{count, plural,one {{messageType, select, IDEA{Vote} other{Like}}} other{{messageType, select, IDEA{Votes} other{Likes}}}}","likes":"{count, plural, one{like} other{likes}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1728320186000","value":{"textTitle":"{count, plural,one {{conversationStyle, select, IDEA{Comment} OCCASION{Comment} other{Reply}}} other{{conversationStyle, select, IDEA{Comments} OCCASION{Comments} other{Replies}}}}","comments":"{count, plural, one{Comment} other{Comments}}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1728320186000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"messages.widget.messagelistfornodebyrecentactivitywidget-tab-main-messages-list-for-tag-widget-0":"mostRecent","nodeId":"board:codeshare","tagName":"iControl"},"buildId":"OKtI0OLKuXmERTJKBVqYX","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"24.11.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.tsx","../shared/client/components/common/List/ListGroup/ListGroup.tsx","./components/messages/MessageView/MessageView.tsx","./components/messages/MessageView/MessageViewInline/MessageViewInline.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx"],"appGip":true,"scriptLoader":[]}