perl

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

\"F5 ©2024 F5, Inc. All rights reserved.
Trademarks Policies Privacy California Privacy Do Not Sell My Personal Information
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/perl\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"componentScriptGroups({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/perl\"}}})":{"__typename":"ComponentRenderResult","html":"
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageListTabs\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageListTabs-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1744046271000"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":null,"possibleValues":["en-US","es-ES"]},"repliesSortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT","localValue":"DEFAULT","possibleValues":["DEFAULT","LIKES","PUBLISH_TIME","REVERSE_PUBLISH_TIME"]}},"deleted":false},"CachedAsset:pages-1745400944479":{"__typename":"CachedAsset","id":"pages-1745400944479","value":[{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.Learn","type":"COMMUNITY","urlPath":"/c/how-do-i/learn","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501996000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745400944479,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}","userBanned":"We're sorry, but you have been banned from using this site.","userBannedReason":"You have been banned for the following reason: {reason}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:theme:customTheme1-1745400944058":{"__typename":"CachedAsset","id":"theme:customTheme1-1745400944058","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1744046271000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1744046271000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/tags/TagPage-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1744046271000","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:community:zihoc95639-1745400942136":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:community:zihoc95639-1745400942136","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:1745400892220":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1745400892220","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.GainsightShared","props":{"widgetVisibility":"signedInOnly","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"},{"children":[],"linkType":"EXTERNAL","id":"Common-external-link","url":"https://community.f5.com/c/how-do-i","target":"SELF"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1744046271000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.GainsightShared-en-us-1745400961012":{"__typename":"CachedAsset","id":"component:custom.widget.GainsightShared-en-us-1745400961012","value":{"component":{"id":"custom.widget.GainsightShared","template":{"id":"GainsightShared","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Shared functions for Gainsight integration","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.GainsightShared","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Shared functions for Gainsight integration","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-us-1745400961012":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-us-1745400961012","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-us-1745400961012":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-us-1745400961012","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-us-1745400961012":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-us-1745400961012","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-us-1745400961012":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-us-1745400961012","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1744046271000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1744046271000","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1744046271000","value":{"title@userScope:other":"Recent Content","title@userScope:self":"Contributions","title@board:FORUM@userScope:other":"Recent Discussions","title@board:BLOG@userScope:other":"Recent Blogs","emptyDescription":"No content to show","MessageListForNodeByRecentActivityWidgetEditor.nodeScope.label":"Scope","title@instance:1706288370055":"Content Feed","title@instance:1743095186784":"Most Recent Updates","title@instance:1704317906837":"Content Feed","title@instance:1743095018194":"Most Recent Updates","title@instance:1702668293472":"Community Feed","title@instance:1743095117047":"Most Recent Updates","title@instance:1704319314827":"Blog Feed","title@instance:1743095235555":"Most Recent Updates","title@instance:1704320290851":"My Contributions","title@instance:1703720491809":"Forum Feed","title@instance:1743095311723":"Most Recent Updates","title@instance:1703028709746":"Group Content Feed","title@instance:VTsglH":"Content Feed"},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"Articles"},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"TechnicalArticles","nodeType":"board","conversationStyle":"TKB","title":"Technical Articles","shortTitle":"Technical Articles","parent":{"__ref":"Category:category:Articles"}},"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}}},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"CrowdSRC"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"codeshare","nodeType":"board","conversationStyle":"TKB","title":"CodeShare","shortTitle":"CodeShare","parent":{"__ref":"Category:category:CrowdSRC"}},"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:285547":{"__typename":"Conversation","id":"conversation:285547","topic":{"__typename":"TkbTopicMessage","uid":285547},"lastPostingActivityTime":"2024-04-11T13:58:25.820-07:00","solved":false},"User:user:51154":{"__typename":"User","uid":51154,"login":"JRahm","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS01MTE1NC1uYzdSVFk?image-coordinates=0%2C0%2C1067%2C1067"},"id":"user:51154"},"TkbTopicMessage:message:285547":{"__typename":"TkbTopicMessage","subject":"BIG-IP Configuration Conversion Scripts","conversation":{"__ref":"Conversation:conversation:285547"},"id":"message:285547","revisionNum":1,"uid":285547,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:51154"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1736},"postTime":"2011-03-28T09:06:00.000-07:00","lastPublishTime":"2011-03-28T09:06:00.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Kirk Bauer, John Alam, and Pete White created a handful of perl and/or python scripts aimed at easing your migration from some of the “other guys” to BIG-IP. While they aren’t going to map every nook and cranny of the configurations to a BIG-IP feature, they will get you well along the way, taking out as much of the human error element as possible. Links to the codeshare articles below. Cisco ACE (perl) Cisco ACE via tmsh (perl) Cisco ACE (python) Cisco CSS (perl) Cisco CSS via tmsh (perl) Cisco CSM (perl) Citrix Netscaler (perl) Radware via tmsh (perl) Radware (python) ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"651","kudosSumWeight":1,"repliesCount":13,"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?time=0"},"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":311},"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":353},"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:273712":{"__typename":"Conversation","id":"conversation:273712","topic":{"__typename":"TkbTopicMessage","uid":273712},"lastPostingActivityTime":"2023-06-05T22:51:09.789-07:00","solved":false},"User:user:4542":{"__typename":"User","uid":4542,"login":"carldubois_1031","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-12.svg?time=0"},"id":"user:4542"},"TkbTopicMessage:message:273712":{"__typename":"TkbTopicMessage","subject":"BIG-IQ Central Management API automation and programmability - BULK Discovery, Import and Re Import - Perl","conversation":{"__ref":"Conversation:conversation:273712"},"id":"message:273712","revisionNum":2,"uid":273712,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:4542"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1435},"postTime":"2016-06-29T09:19:44.000-07:00","lastPublishTime":"2023-06-05T22:51:09.789-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Summary \n\n In conjunction with the announcement of BIG-IQ 5.0 we are excited to bring the field greater flexibility when centrally managing BIG-IP devices utilizing well defined workflows and the BIG-IQ iControl REST API. We understand that automation and programmability is becoming more the norm these days as the network is evolving into a software defined application aware environment. \n\n This article is an addendum to “BIG-IQ Central Management API automation and programmability – Python” and will demonstrate bulk device trust, discovery to populate resolver groups and import bigip configuration of many BIG-IP device as defined in a csv configuration file. \n\n This automation can be run as a standalone utilities that will run directly in the BIG-IQ shell for adding devices to inventory in a sequential yet automated fashion. \n\n \n API Reference \n\n Trust: https://'bigiq-ip'/mgmt/cm/global/tasks/device-trust \n\n Discovery: https://'bigiq-ip'/mgmt/cm/global/tasks/device-discovey \n\n Import: ADC - https://'bigiq-ip'/mgmt/cm/adc-core/tasks/declare-mgmt-authority \n\n \n Import: Firewall - https://'bigiq-ip'/mgmt/cm/firewall/tasks/declare-mgmt-authority \n\n \n Let’s get started – \n\n When using the BIG-IQ it is suggested to make a directory called scripts under /shared and securely copy this distribution into /shared/scripts/. \n\n \n Contents: \n\n ../config/bulk_discovery.csv \n\n ../src/perl/bulkDiscovery.pl \n\n ../src/perl/bulkReImport.pl \n\n \n Everything is predicated by a main loop which will invoke each task by calling supporting perl subroutines self-contained in the script. All rest calls, using curl (https://curl.haxx.se/), made are highlighted below. \n \n\n Establishment of device trust is completed in the main loop while the process of discovery and import configurations are completed in subroutine blocks within the script. \n\n \n #======================================================\n# Main loop\n# Process trust, discovery, and imports\n#======================================================\nfor $bigip (@bigips) {\n my %postBodyHash = (\"address\"=>$bigiq, \"userName\"=>$user, \"password\"=>$pw,\"clusterName\"=>\"\", \"useBigiqSync\"=>\"false\", \"name\"=>\"trust_$mip\");\n \n my $postBody = encode_json(\\%postBodyHash);\n \n my $trustCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X POST -d \\'$postBody\\' \n https://localhost/mgmt/cm/global/tasks/device-trust\"; \n\n if (discoverModules($bigiq, $machineId)) {\n if (importModules($bigiq)) {\n }\n }\n \n # upgrade the framework if nessasary\n if (handleFrameworkUpdade ($trustTask, $bigip)) {\n }\n} end of all devices \n\n   \n\n \n \n #======================================================\n# Discover specified modules.\n#======================================================\nsub discoverModules {\n my %postBodyHash = (\"moduleList\" => \\@moduleList, \"status\" => \"STARTED\"); \n\n # POST a new discovery task\n $postBodyHash{\"deviceReference\"}{\"link\"} = \"cm/system/machineid-resolver/$machineId\"; \n\n my $newDiscoverTaskCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X POST -d \\'$postBodyJson\\' \\\"https://localhost/mgmt/cm/global/tasks/device-discovery\\\"\";\n} end of discoverModules \n\n #======================================================\n# A subroutine for importing individual module.\n#======================================================\nsub importModule { \n\n # POST a new import task\n$postBodyHash{\"deviceReference\"}{\"link\"} = \"cm/system/machineid-resolver/$machineId\"; \n\n my $postBody = encode_json(\\%postBodyHash); \n\n my $newImportTaskCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X POST -d \\'$postBodyJson\\' \\\"$dmaUrl\\\"\";\n \n# if we ecounter conflicts, we mark them to use BigIQ, patch the task back to started, and poll again \n\n if (($currentStep eq \"PENDING_CONFLICTS\") or ($currentStep eq \"PENDING_CHILD_CONFLICTS\"))\n if (resolveConflicts($mip, $module, $currentStep, $importSelfLink, @conflicts))\n} # end of importModule \n\n#==========================================================\n# sub routine calling importModule to colocate all modules \n#==========================================================\n sub importModules { \n $ltmSuccess = importModule($mip, \"ltm\", \"https://localhost/mgmt/cm/adc-core/tasks/declare-mgmt-authority\", %postBodyHash); \n $asmSuccess = importModule($mip, \"asm\", \"https://localhost/mgmt/cm/asm/tasks/declare-mgmt-authority\", %postBodyHash); \n } \n\n\n\n And last but not least Re Import of BIGIP configuration objects for greater than one BIGIP device. \n\n This script can be run periodically based on Linux cron to ensure your device configurations managed by BIGIQ are up to date. On occasion other Element Management Systems could modify BIGIP object base and BIGIQ should be aware of these changes. \n\n If you refer to the below main loop, the discovery and import call's are the same. So two things actually happen that differs from inital bulk discovery and import. \n\n 1. Trust establishment is removed as it already contains mutaul certificate trust. \n\n 2. We test if the discovery and import tasks exists, if they do we can just PATCH discovery and import tasks to enforce a re import. \n\n That's about it. Refer to the code snippet below. \n\n \n #======================================================\n# Main loop\n# Process Re Discovery, and Imports\n#======================================================\nfor $bigip (@bigips) {\n ## get the device properties\n my $deviceCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X GET https://localhost/mgmt/shared/resolver/device-groups/cm-bigip-allBigIpDevices/devices\";\n ## call disc routine using ip and machine id.\n if (discoverModules($bigiq, $machineId)) {\n ## call import routine using up and machine id.\n if (importModules($bigiq, $machineId)) \n }\n }\n} # end for devices \n\n Just to re iterate the above the discovery and import routines used for Re Import just PATCH the existing task created during inital discovery and import. Here are the PATCH requests. \n\n \n #======================================================\n# Discover specified modules.\n#======================================================\nsub discoverModules {\n ## get the discovery task based on the machineId\n my $findDiscoverTaskCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X GET \\\"https://localhost/mgmt/cm/global/tasks/device-discovery?\\\\\\$filter=deviceReference/link+eq+\\'*$machineId*\\'+and+status+eq+\\'FINISHED\\'\\\"\"; \n\n ## If it exists PATCH the task \n if (defined $discoveryTask->{\"items\"}[0])\n {\n # PATCH the existing discovery task\n my $discoveryTaskSelfLink = $discoveryTask->{\"items\"}[0]->{\"selfLink\"};\n $postBodyJson = encode_json(\\%postBodyHash);\n my $discoverCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X PATCH -d \\'$postBodyJson\\' $discoveryTaskSelfLink\";\n} \n\n #======================================================\n# A subroutine for importing individual module.\n#======================================================\nsub importModule {\n ## get import task based on the machineid\n my $findImportTaskCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X GET \\\"$dmaUrl?\\\\\\$filter=deviceReference/link+eq+\\'*$machineId*\\'\\\"\"; \n\n \n ## If exists PATCH the task\n if (defined $findImportTask->{\"items\"}[0])\n {\n # PATCH the existing import task\n $importTaskLink = $findImportTask->{\"items\"}[0]->{\"selfLink\"}; \n\n my $importCmd = \"curl -s -k -u $bigiqCreds -H \\\"$contType\\\" -X PATCH -d \\'$postBodyJson\\' $importTaskLink\";\n}\n \n#========================================\n# sub routine for calling importModule to collocate all modules.\n#========================================\n sub importModules { \n $ltmSuccess = importModule($mip, $machineId, \"ltm\", \"https://localhost/mgmt/cm/adc-core/tasks/declare-mgmt-authority\", %postBodyHash); \n $asmSuccess = importModule($mip, machineId, \"asm\", \"https://localhost/mgmt/cm/asm/tasks/declare-mgmt-authority\", %postBodyHash); \n\n } \n\n If you are interested in this code for collaboration or solution, seach on key words \"bigiq\" \"api\" \"python\" or \"perl\" in code share section on dev central or here is the reference link:  \n\n https://devcentral.f5.com/s/articles/big-iq-big-ip-rest-api-bulk-device-discovery-perl-972 \n\n We will also create a repository on github for easy accessability. Please visit us soon and often for periodic updates. \n\n\n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"8622","kudosSumWeight":0,"repliesCount":12,"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:278565":{"__typename":"Conversation","id":"conversation:278565","topic":{"__typename":"TkbTopicMessage","uid":278565},"lastPostingActivityTime":"2023-06-05T22:33:57.105-07:00","solved":false},"TkbTopicMessage:message:278565":{"__typename":"TkbTopicMessage","subject":"ARX Volume Info","conversation":{"__ref":"Conversation:conversation:278565"},"id":"message:278565","revisionNum":2,"uid":278565,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":375},"postTime":"2015-02-24T13:34:46.000-08:00","lastPublishTime":"2023-06-05T22:33:57.105-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This example shows how to retrieve all volumes and their configuration on an ARX. \n This script is an example of how to use the iControl interfaces provided by an ARX to retrieve all volumes and their configuration on an ARX. How to use this snippet: ARXVolumeInfo.pl --url --user --pass \n Prerequisites \n SOAP::Lite perl module An F5 ARX system configured with at least one configured namespace. Management access on the ARX must be permitted for HTTP-API and/or HTTPS-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-2010\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 volumes and their configuration on an ARX.\n#\n# Usage: ARXVolumeInfo.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 volume.\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);\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 $namespaceServiceUrl = $url . \"/api/services/Namespace\";\nmy $volumeServiceUrl = $url . \"/api/services/Volume\";\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 Namespace interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $namespaceWsdlUrl = $namespaceServiceUrl . \"?wsdl\";\nmy $volumeWsdlUrl = $volumeServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $namespaceSoap = SOAP::Lite->new(proxy => $namespaceServiceUrl,\n service => $namespaceWsdlUrl);\nmy $volumeSoap = SOAP::Lite->new(proxy => $volumeServiceUrl,\n service => $volumeWsdlUrl);\n\n# Get a list of namespaces configured on the ARX.\nmy $namespaceSoapResult = $namespaceSoap->get_list(getSecurityHeader($user, $pass));\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.\nif ($namespaceSoapResult->fault) {\n printf(STDERR \"SOAP fault encountered:\\n\");\n printf(STDERR \"%s\\n\", $namespaceSoapResult->faultstring);\n exit(1);\n}\n\n# The get_list() call did not fail, so we build a list of namespace\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.\nmy @namespaceList = ($namespaceSoapResult->result, \n $namespaceSoapResult->paramsout);\n\nif ($#namespaceList < 0) {\n print(\"No namespaces.\\n\");\n exit(0);\n}\n\n# We can now look into each namespace for volumes\nfor (my $i = 0; $namespaceList[$i]; $i++) {\n print \"Namespace: $namespaceList[$i]\\n\";\n \n # Get a list of volumes configured on the ARX.\n my $volumeSoapResult = $volumeSoap->get_list(SOAP::Data->name('namespace')\n ->value($namespaceList[$i]),\n getSecurityHeader($user, $pass));\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 ($volumeSoapResult->fault) {\n printf(STDERR \" SOAP fault encountered:\\n\");\n printf(STDERR \" %s\\n\", $volumeSoapResult->faultstring);\n next;\n }\n\n # The get_list() call did not fail, so we build a list of namespace\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 @volumeList = ($volumeSoapResult->result, $volumeSoapResult->paramsout);\n\n # If volume list is not empty, we can use that list to retrieve configuration\n # and status information for all of the volumes using the same list by calling\n # get_definition().\n if ($#volumeList < 0) {\n printf(\" No volumes.\\n\");\n next;\n } \n $volumeSoapResult = $volumeSoap->get_definition(SOAP::Data->name('namespace')\n ->value($namespaceList[$i]),\n SOAP::Data->name('volumes')\n ->value(@volumeList),\n getSecurityHeader($user, $pass));\n \n # As we did for the get_list() call, we need to check for any \n # errors.\n if ($volumeSoapResult->fault) {\n printf(STDERR \"SOAP fault encountered:\\n\");\n printf(STDERR \"%s\\n\", $volumeSoapResult->faultstring);\n exit(1);\n }\n \n \n # If there weren't any errors, then we can print the\n # definitions for each configured namespace.\n my @volumeDefinitions = ($volumeSoapResult->result, $volumeSoapResult->paramsout);\n \n for (my $i = 0; $volumeDefinitions[$i]; $i++) {\n printf(\" Volume: %s\\n\", $volumeDefinitions[$i]->{name});\n printf(\" description : %s\\n\", $volumeDefinitions[$i]->{description});\n printf(\" status : %s\\n\", $volumeDefinitions[$i]->{status});\n printf(\" vpu : %d\\n\", $volumeDefinitions[$i]->{vpu});\n printf(\" failure domain : %s\\n\", $volumeDefinitions[$i]->{failure_domain});\n } \n}\nprint \"\\n\\n\";\n\n#-------------------------------------------------------------------------------\n# End of main program logic\n#-------------------------------------------------------------------------------\n\n\n#-------------------------------------------------------------------------------\n# sub usage\n#-------------------------------------------------------------------------------\nsub usage\n{\n print \"\\nUsage: ARXVolumeInfo.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} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"12421","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:278564":{"__typename":"Conversation","id":"conversation:278564","topic":{"__typename":"TkbTopicMessage","uid":278564},"lastPostingActivityTime":"2023-06-05T22:33:54.028-07:00","solved":false},"TkbTopicMessage:message:278564":{"__typename":"TkbTopicMessage","subject":"Perl ARX Chassis","conversation":{"__ref":"Conversation:conversation:278564"},"id":"message:278564","revisionNum":2,"uid":278564,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":319},"postTime":"2015-02-24T13:37:05.000-08:00","lastPublishTime":"2023-06-05T22:33:54.028-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 chassis configuration, status and statistics on an ARX. How to use this snippet: ARXChassisExample.pl --url --user --pass \n Prerequisites \n SOAP::Lite perl module An F5 ARX system. 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 chassis configuration, status and statistics on an ARX.\n#\n# Usage: ARXChassisExample.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 running release V6.02.000 or later.\n# * Management access on the ARX must be permitted for HTTPs-API or HTTP-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 $chassisServiceUrl = $url . \"/api/services/Chassis\";\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 Chassis interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $chassisWsdlUrl = $chassisServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $chassisSoap = SOAP::Lite->new(proxy => $chassisServiceUrl,\n service => $chassisWsdlUrl);\n\n#-------------------------------------------------------------------------------\n# get_ha_peer\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_ha_peer\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \nour $securityHeader = getSecurityHeader($user, $pass);\n\nmy $chassisSoapResult = $chassisSoap->get_ha_peer($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n print(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_ha_peer\\\" method of the ARX Chassis interface.\\n\\n\";\n\n print \"HA Peer Status:\\n\";\n\n my $chassisHaPeerStatus = $chassisSoapResult->result;\n\n my $peerIp = $chassisHaPeerStatus->{'ip'};\n print \"ip: \", $peerIp, \"\\n\";\n\n my $peerName = $chassisHaPeerStatus->{'name'};\n print \"name: \", $peerName, \"\\n\";\n\n my $peerRole = $chassisHaPeerStatus->{'role'};\n print \"role: \", $peerRole, \"\\n\";\n\n my $peerStatus = $chassisHaPeerStatus->{'status'};\n print \"status: \", $peerStatus, \"\\n\";\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_ha_status\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_ha_status\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_ha_status($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_ha_status\\\" method of the ARX Chassis interface.\\n\\n\";\n\n print \"HA Status:\\n\";\n\n my $chassisHaStatus = $chassisSoapResult->result;\n\n my $haStatusName = $chassisHaStatus->{'name'};\n print \"name: \", $haStatusName, \"\\n\";\n\n my $ip = $chassisHaStatus->{'ip'};\n print \"ip: \", $ip, \"\\n\";\n\n my $role = $chassisHaStatus->{'role'};\n print \"role: \", $role, \"\\n\";\n\n my $status = $chassisHaStatus->{'status'};\n print \"status: \", $status, \"\\n\";\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_health\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_health\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_health($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_health\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my @chassisHealths = ($chassisSoapResult->result, $chassisSoapResult->paramsout);\n\n foreach my $chassisHealth (@chassisHealths) {\n my $date = $chassisHealth->{'date'};\n print \"date: \", $date, \"\\n\";\n\n my $description = $chassisHealth->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $event = $chassisHealth->{'event'};\n print \"event: \", $event, \"\\n\";\n\n my $id = $chassisHealth->{'id'};\n print \"id: \", $id, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_hostname\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_hostname\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_hostname($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_hostname\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my $hostname = $chassisSoapResult->result;\n\n print \"Hostname: $hostname\\n\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_hw_version\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_hw_version\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_hw_version($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_hw_version\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my $hwVersion = $chassisSoapResult->result;\n\n print \"HW Version: $hwVersion\\n\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_model\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_model\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_model($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_model\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my $model = $chassisSoapResult->result;\n\n print \"Model: $model\\n\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_processor_list\n#-------------------------------------------------------------------------------\n\nmy @processorList = ();\n\nprint \"Calling the \\\"get_processor_list\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_processor_list($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_processor_list\\\" method of the ARX Chassis interface.\\n\\n\";\n\n @processorList = ($chassisSoapResult->result, $chassisSoapResult->paramsout);\n\n foreach my $processor (@processorList) {\n my $slot = $processor->{'slot'};\n print \"slot: \", $slot, \"\\n\";\n\n my $proc = $processor->{'processor'};\n print \"processor: \", $proc, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_processor_stats\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_processor_stats\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_processor_stats($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_processor_stats\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my @processorStats = ($chassisSoapResult->result, $chassisSoapResult->paramsout);\n\n foreach my $processorStat (@processorStats) {\n my $processor = $processorStat->{'processor'};\n print \"processor: \", $processor, \"\\n\";\n\n my $cpu1min = $processorStat->{'cpu1min'};\n print \"cpu1min: \", $cpu1min, \"\\n\";\n\n my $cpu5min = $processorStat->{'cpu5min'};\n print \"cpu5min: \", $cpu5min, \"\\n\";\n\n my $freemem = $processorStat->{'freemem'};\n print \"freemem: \", $freemem, \"\\n\";\n\n my $module_type = $processorStat->{'module_type'};\n print \"module_type: \", $module_type, \"\\n\";\n\n my $status = $processorStat->{'status'};\n print \"status: \", $status, \"\\n\";\n\n my $totalmem = $processorStat->{'totalmem'};\n print \"totalmem: \", $totalmem, \"\\n\";\n\n my $uptime = $processorStat->{'uptime'};\n print \"uptime: \", $uptime, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_processor_status\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_processor_status\\\" method of the ARX Chassis interface.\\n\\n\";\n\nif ($#processorList < 0) {\n print(\"The list of processors returned from the call to the \\\"get_list\\\" method of the ARX Chassis interface was empty.\\n\");\n}\nelse {\n my @soapProcessorList = ConvertProcessorIdsToSoapData(\\@processorList);\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n $chassisSoapResult = $chassisSoap->get_processor_status(SOAP::Data->name('processors')->value(@soapProcessorList), \n $securityHeader);\n\n if (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n }\n else {\n print \"Printing the results of the call to the \\\"get_processor_status\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my @processorStatuses = ($chassisSoapResult->result, $chassisSoapResult->paramsout);\n\n foreach my $processorStatus (@processorStatuses) {\n if (exists $processorStatus->{'processor'}) {\n my $processorStatusProc = $processorStatus->{'processor'};\n print \"processor:\\n\";\n\n my $slot = $processorStatusProc->{'slot'};\n print \" slot: \", $slot, \"\\n\";\n\n my $processor = $processorStatusProc->{'processor'};\n print \" processor: \", $processor, \"\\n\";\n print \"\\n\";\n }\n\n my $role = $processorStatus->{'role'};\n print \"role: \", $role, \"\\n\";\n\n my $state = $processorStatus->{'state'};\n print \"state: \", $state, \"\\n\";\n\n my $uptime = $processorStatus->{'uptime'};\n print \"uptime: \", $uptime, \"\\n\";\n\n my $free_memory = $processorStatus->{'free_memory'};\n print \"free_memory: \", $free_memory, \"\\n\";\n\n my $total_memory = $processorStatus->{'total_memory'};\n print \"total_memory: \", $total_memory, \"\\n\";\n\n my $free_swap = $processorStatus->{'free_swap'};\n print \"free_swap: \", $free_swap, \"\\n\";\n\n my $total_swap = $processorStatus->{'total_swap'};\n print \"total_swap: \", $total_swap, \"\\n\";\n\n my $cpu1min = $processorStatus->{'cpu1min'};\n print \"cpu1min: \", $cpu1min, \"\\n\";\n\n my $cpu5min = $processorStatus->{'cpu5min'};\n print \"cpu5min: \", $cpu5min, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\n#-------------------------------------------------------------------------------\n# get_serial\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_serial\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_serial($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_serial\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my $serial = $chassisSoapResult->result;\n\n print \"Serial: $serial\\n\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_storage_status\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_storage_status\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_storage_status($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_storage_status\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my @storageStatuses = ($chassisSoapResult->result, $chassisSoapResult->paramsout);\n\n foreach my $storageStatus (@storageStatuses) {\n my $storageName = $storageStatus->{'name'};\n print \"name: \", $storageName, \"\\n\";\n\n my $free_space = $storageStatus->{'free_space'};\n print \"free_space: \", $free_space, \"\\n\";\n\n my $total_space = $storageStatus->{'total_space'};\n print \"total_space: \", $total_space, \"\\n\";\n\n my $used_space = $storageStatus->{'used_space'};\n print \"used_space: \", $used_space, \"\\n\";\n print \"\\n\";\n }\n\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_sw_version\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_sw_version\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_sw_version($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_sw_version\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my $swVersion = $chassisSoapResult->result;\n\n print \"SW Version: $swVersion\\n\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# get_type\n#-------------------------------------------------------------------------------\n\nprint \"Calling the \\\"get_type\\\" method of the ARX Chassis interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n$chassisSoapResult = $chassisSoap->get_type($securityHeader);\n\nif (defined $chassisSoapResult->fault && $chassisSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($chassisSoapResult->fault) . \"\\n\");\n}\nelse {\n print \"Printing the results of the call to the \\\"get_type\\\" method of the ARX Chassis interface.\\n\\n\";\n\n my $type = $chassisSoapResult->result;\n\n print \"Type: $type\\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: ARXChassisExample.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 ConvertProcessorIdsToSoapData\n{\n my ($idListRef) = @_;\n my @dataArray;\n \n foreach my $id (@$idListRef) {\n my %idHash = %{$id}; \n my $sid = SOAP::Data->name(\"processors\")->value(\\SOAP::Data->value(\n SOAP::Data->name(\"slot\")->value($idHash{'slot'}),\n SOAP::Data->name(\"processor\")->value($idHash{'processor'})));\n push(@dataArray, $sid);\n }\n \n return @dataArray;\n} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"24977","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:278549":{"__typename":"Conversation","id":"conversation:278549","topic":{"__typename":"TkbTopicMessage","uid":278549},"lastPostingActivityTime":"2023-06-05T22:33:50.855-07:00","solved":false},"TkbTopicMessage:message:278549":{"__typename":"TkbTopicMessage","subject":"Perl ARX Export","conversation":{"__ref":"Conversation:conversation:278549"},"id":"message:278549","revisionNum":2,"uid":278549,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":314},"postTime":"2015-02-24T13:41:29.000-08:00","lastPublishTime":"2023-06-05T22:33:50.855-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 exports and their configuration on an ARX. How to use this snippet: ARXExportExample.pl --url --user --pass \n Prerequisites \n SOAP::Lite perl module An F5 ARX system running release V6.02.000 or later. 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 exports and their configuration on an ARX.\n#\n# Usage: ARXExportExample.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 export.\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 $virtualServiceServiceUrl = $url . \"/api/services/VirtualService\";\nmy $exportServiceUrl = $url . \"/api/services/Export\";\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 Export interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $virtualServiceWsdlUrl = $virtualServiceServiceUrl . \"?wsdl\";\nmy $exportWsdlUrl = $exportServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $virtualServiceSoap = SOAP::Lite->new(proxy => $virtualServiceServiceUrl, \n service => $virtualServiceWsdlUrl);\n\nmy $exportSoap = SOAP::Lite->new(proxy => $exportServiceUrl,\n service => $exportWsdlUrl);\n\n# Build a security header \nour $securityHeader = getSecurityHeader($user, $pass);\n\nmy $virtualServiceSoapResult = $virtualServiceSoap->get_list($securityHeader);\n\nif (defined $virtualServiceSoapResult->fault && $virtualServiceSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($virtualServiceSoapResult->fault) . \"\\n\");\n}\n\nmy @virtualServiceList = ($virtualServiceSoapResult->result, \n $virtualServiceSoapResult->paramsout);\n\nif ($#virtualServiceList < 0) {\n print(\"The list of virtual services returned from the call to the \\\"get_list\\\" method of the ARX VirtualService interface was empty.\\n\");\n exit(0);\n}\n\nmy @protocolTypeList = qw(ARX_PROTOCOL_CIFS ARX_PROTOCOL_NFS);\n\nforeach my $virtualService (@virtualServiceList) {\n foreach my $protocolType (@protocolTypeList) {\n print \"##############################################\\n\";\n print \"Virtual Service: $virtualService\\n\";\n print \"Protocol: $protocolType\\n\";\n print \"##############################################\\n\\n\";\n\n print \"Calling the \\\"get_list\\\" method of the ARX Export interface.\\n\\n\";\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n # Get a list of exports configured on the ARX.\n my $exportSoapResult = $exportSoap->get_list2(SOAP::Data->name('virtual_service')->value($virtualService), \n SOAP::Data->name('protocol')->value($protocolType), \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 $exportSoapResult->fault && $exportSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($exportSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_list\\\" method of the ARX Export interface.\\n\\n\";\n\n # The get_list() call did not fail, so we build a list of export\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 @exportList = ($exportSoapResult->result, \n $exportSoapResult->paramsout);\n\n if ($#exportList < 0) {\n print(\"The list of exports returned from the call to the \\\"get_list\\\" method of the ARX Export interface was empty.\\n\");\n exit(0);\n }\n\n # We can now print the list of exports\n print \"Export list:\\n\";\n foreach my $export (@exportList) {\n print \" \", $export, \"\\n\";\n }\n print \"\\n\";\n\n print \"Calling the \\\"get_configuration\\\" method of the ARX Export interface.\\n\\n\";\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n # get export configuration from API\n\n # In addition to printing the list of exports, we can actually\n # use that list to retrieve configuration information\n # for all of the exports using the same list by calling\n # get_configuration().\n $exportSoapResult = $exportSoap->get_configuration(SOAP::Data->name('virtual_service')->value($virtualService), \n SOAP::Data->name('protocol')->value($protocolType), \n SOAP::Data->name('exports')->value(@exportList), \n $securityHeader);\n\n if (defined $exportSoapResult->fault && $exportSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($exportSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_configuration\\\" method of the ARX Export interface.\\n\\n\";\n\n my @exportConfigs = ($exportSoapResult->result, $exportSoapResult->paramsout);\n\n foreach my $exportConfig (@exportConfigs) {\n my $name = $exportConfig->{'name'};\n\n print \"----------------------------------------------\\n\";\n print \"Export: \", $name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"name: \", $name, \"\\n\";\n\n my $description = $exportConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $namespace = $exportConfig->{'namespace'};\n print \"namespace: \", $namespace, \"\\n\";\n\n my $path = $exportConfig->{'path'};\n print \"path: \", $path, \"\\n\";\n\n my $protocol = $exportConfig->{'protocol'};\n print \"protocol: \", $protocol, \"\\n\";\n\n my $file_server_subshare = $exportConfig->{'file_server_subshare'};\n print \"file_server_subshare: \", $file_server_subshare, \"\\n\";\n\n my $hidden = $exportConfig->{'hidden'};\n print \"hidden: \", $hidden, \"\\n\";\n\n my $access_list = $exportConfig->{'access_list'};\n print \"access_list: \", $access_list, \"\\n\";\n print \"\\n\";\n }\n\n print \"Calling the \\\"get_status\\\" method of the ARX Export interface.\\n\\n\";\n\n # Build a security header \n $securityHeader = getSecurityHeader($user, $pass);\n\n # get export status from API\n\n # In addition to printing the list of exports, we can actually\n # use that list to retrieve status information for all of the exports \n # using the same list by calling get_status().\n $exportSoapResult = $exportSoap->get_status(SOAP::Data->name('virtual_service')->value($virtualService), \n SOAP::Data->name('protocol')->value($protocolType), \n SOAP::Data->name('exports')->value(@exportList), \n $securityHeader);\n\n if (defined $exportSoapResult->fault && $exportSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($exportSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_status\\\" method of the ARX Export interface.\\n\\n\";\n\n my @exportStatuses = ($exportSoapResult->result, $exportSoapResult->paramsout);\n\n foreach my $exportStatus (@exportStatuses) {\n my $name = $exportStatus->{'name'};\n\n print \"----------------------------------------------\\n\";\n print \"Export: \", $name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"name: \", $name, \"\\n\";\n\n my $status = $exportStatus->{'status'};\n print \"status: \", $status, \"\\n\";\n\n my $nfs_offline_deny_access = $exportStatus->{'nfs_offline_deny_access'};\n print \"nfs_offline_deny_access: \", $nfs_offline_deny_access, \"\\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: ARXExportExample.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} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"16861","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:278550":{"__typename":"Conversation","id":"conversation:278550","topic":{"__typename":"TkbTopicMessage","uid":278550},"lastPostingActivityTime":"2023-06-05T22:33:48.057-07:00","solved":false},"TkbTopicMessage:message:278550":{"__typename":"TkbTopicMessage","subject":"Perl ARX FileServer","conversation":{"__ref":"Conversation:conversation:278550"},"id":"message:278550","revisionNum":2,"uid":278550,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":340},"postTime":"2015-02-24T13:43:38.000-08:00","lastPublishTime":"2023-06-05T22:33:48.057-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 filer servers and their configurations, statuses and statistics on an ARX. How to use this snippet: ARXFileServerExample.pl --url --user --pass \n Prerequisites \n SOAP::Lite perl module An F5 ARX system running release V6.02.000 or later. 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 file servers and their configurations, statuses and \n# statistics on an ARX.\n#\n# Usage: ARXFileServerExample.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 file server.\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 $fileServerServiceUrl = $url . \"/api/services/FileServer\";\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 FileServer interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $fileServerWsdlUrl = $fileServerServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $fileServerSoap = SOAP::Lite->new(proxy => $fileServerServiceUrl,\n service => $fileServerWsdlUrl);\n\nprint \"Calling the \\\"get_list\\\" method of the ARX FileServer interface.\\n\\n\";\n\n# Build a security header \nour $securityHeader = getSecurityHeader($user, $pass);\n\n# Get a list of file servers configured on the ARX.\nmy $fileServerSoapResult = $fileServerSoap->get_list($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.\nif (defined $fileServerSoapResult->fault && $fileServerSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($fileServerSoapResult->fault) . \"\\n\");\n}\n\nprint \"Printing the results of the call to the \\\"get_list\\\" method of the ARX FileServer interface.\\n\\n\";\n\n# The get_list() call did not fail, so we build a list of file server\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.\nmy @fileServerList = ($fileServerSoapResult->result, \n $fileServerSoapResult->paramsout);\n\nif ($#fileServerList < 0) {\n print(\"The list of file servers returned from the call to the \\\"get_list\\\" method of the ARX FileServer interface was empty.\\n\");\n exit(0);\n}\n\n# We can now print the list of file servers\nprint \"File Servers list:\\n\";\nforeach my $fileServer (@fileServerList) {\n print \" \", $fileServer, \"\\n\";\n}\nprint \"\\n\";\n\nprint \"Calling the \\\"get_configuration\\\" method of the ARX FileServer interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n# get file server configuration from API\n\n# In addition to printing the list of file servers, we can actually\n# use that list to retrieve configuration information\n# for all of the file servers using the same list by calling\n# get_configuration().\n$fileServerSoapResult = $fileServerSoap->get_configuration(SOAP::Data->name('file_servers')->value(@fileServerList),\n $securityHeader);\n\nif (defined $fileServerSoapResult->fault && $fileServerSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($fileServerSoapResult->fault) . \"\\n\");\n}\n\nprint \"Printing the results of the call to the \\\"get_configuration\\\" method of the ARX FileServer interface.\\n\\n\";\n\nmy @fileServerConfigs = ($fileServerSoapResult->result, $fileServerSoapResult->paramsout);\n\nforeach my $fileServerConfig (@fileServerConfigs) {\n my $name = $fileServerConfig->{'name'};\n\n print \"----------------------------------------------\\n\";\n print \"File Server: \", $name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"name: \", $name, \"\\n\";\n\n my $description = $fileServerConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $cifs_port = $fileServerConfig->{'cifs_port'};\n print \"cifs_port: \", $cifs_port, \"\\n\";\n\n my $cifs_connection_limit = $fileServerConfig->{'cifs_connection_limit'};\n print \"cifs_connection_limit: \", $cifs_connection_limit, \"\\n\";\n\n my $nfs_tcp_connections = $fileServerConfig->{'nfs_tcp_connections'};\n print \"nfs_tcp_connections: \", $nfs_tcp_connections, \"\\n\";\n\n my $ip_address = $fileServerConfig->{'ip_address'};\n print \"ip_address: \", $ip_address, \"\\n\";\n\n if (exists $fileServerConfig->{'ip_address_secondary'}) {\n print \"ip_address_secondary:\\n\";\n\n my @ip_address_secondary = ();\n\n if (ref($fileServerConfig->{'ip_address_secondary'}) eq \"ARRAY\") {\n @ip_address_secondary = @{$fileServerConfig->{'ip_address_secondary'}};\n } else {\n @ip_address_secondary = $fileServerConfig->{'ip_address_secondary'};\n }\n\n foreach my $ip_address (@ip_address_secondary) {\n print \" \", $ip_address, \"\\n\";\n }\n\n print \"\\n\";\n }\n\n my $ip_address_management = $fileServerConfig->{'ip_address_management'};\n print \"ip_address_management: \", $ip_address_management, \"\\n\";\n\n my $proxy_user = $fileServerConfig->{'proxy_user'};\n print \"proxy_user: \", $proxy_user, \"\\n\";\n\n my $manage_snapshots = $fileServerConfig->{'manage_snapshots'};\n print \"manage_snapshots: \", $manage_snapshots, \"\\n\";\n\n my $spn = $fileServerConfig->{'spn'};\n print \"spn: \", $spn, \"\\n\";\n\n if (exists $fileServerConfig->{'ignore_names'}) {\n print \"ignore_names:\\n\";\n\n my @ignore_names = ();\n\n if (ref($fileServerConfig->{'ignore_names'}) eq \"ARRAY\") {\n @ignore_names = @{$fileServerConfig->{'ignore_names'}};\n } else {\n @ignore_names = $fileServerConfig->{'ignore_names'};\n }\n\n foreach my $ignore_name (@ignore_names) {\n print \" \", $ignore_name, \"\\n\";\n }\n\n print \"\\n\";\n }\n\n if (exists $fileServerConfig->{'type'}) {\n print \"type:\\n\";\n\n my $fsType = $fileServerConfig->{'type'};\n\n my $type = $fsType->{'type'};\n print \" type: \", $type, \"\\n\";\n\n my $protocol = $fsType->{'protocol'};\n print \" protocol: \", $protocol, \"\\n\";\n\n my $emc_nas_db_path = $fsType->{'emc_nas_db_path'};\n print \" emc_nas_db_path: \", $emc_nas_db_path, \"\\n\";\n\n my $winrm_port = $fsType->{'winrm_port'};\n print \" winrm_port: \", $winrm_port, \"\\n\";\n\n my $windows_cluster = $fsType->{'windows_cluster'};\n print \" windows_cluster: \", $windows_cluster, \"\\n\";\n }\n\n print \"\\n\";\n}\n\nprint \"Calling the \\\"get_status\\\" method of the ARX FileServer interface.\\n\\n\";\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n# get file server configuration from API\n\n# In addition to printing the list of file servers, we can actually\n# use that list to retrieve status information for all of the file servers \n# using the same list by calling get_status().\n$fileServerSoapResult = $fileServerSoap->get_status(SOAP::Data->name('file_servers')->value(@fileServerList),\n $securityHeader);\n\nif (defined $fileServerSoapResult->fault && $fileServerSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($fileServerSoapResult->fault) . \"\\n\");\n}\n\nprint \"Printing the results of the call to the \\\"get_status\\\" method of the ARX FileServer interface.\\n\\n\";\n\nmy @fileServerStatuses = ($fileServerSoapResult->result, $fileServerSoapResult->paramsout);\n\nforeach my $fileServerStatus (@fileServerStatuses) {\n my $name = $fileServerStatus->{'name'};\n\n print \"----------------------------------------------\\n\";\n print \"File Server: \", $name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"name: \", $name, \"\\n\";\n\n my $discovered_spn = $fileServerStatus->{'discovered_spn'};\n print \"discovered_spn: \", $discovered_spn, \"\\n\";\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# End of main program logic\n#-------------------------------------------------------------------------------\n\n\n#-------------------------------------------------------------------------------\n# sub usage\n#-------------------------------------------------------------------------------\nsub usage\n{\n print \"\\nUsage: ARXFileServerExample.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} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"16373","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:278552":{"__typename":"Conversation","id":"conversation:278552","topic":{"__typename":"TkbTopicMessage","uid":278552},"lastPostingActivityTime":"2023-06-05T22:33:41.799-07:00","solved":false},"TkbTopicMessage:message:278552":{"__typename":"TkbTopicMessage","subject":"Perl ARX Namespace","conversation":{"__ref":"Conversation:conversation:278552"},"id":"message:278552","revisionNum":2,"uid":278552,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":325},"postTime":"2015-02-24T13:56:45.000-08:00","lastPublishTime":"2023-06-05T22:33:41.799-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 namespaces and their configuration on an ARX. How to use this snippet: ARXNamespaceExample.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 namespace 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 namespaces and their configuration on an ARX.\n#\n# Usage: ARXNamespaceExample.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 namespace.\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 $namespaceServiceUrl = $url . \"/api/services/Namespace\";\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 Namespace interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $namespaceWsdlUrl = $namespaceServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $namespaceSoap = SOAP::Lite->new(proxy => $namespaceServiceUrl,\n service => $namespaceWsdlUrl);\n\nprint \"Calling the \\\"get_list\\\" method of the ARX Namespace interface.\\n\\n\";\n\n# Get a list of namespaces configured on the ARX.\n\n# Build a security header \nour $securityHeader = getSecurityHeader($user, $pass);\n\nmy $namespaceSoapResult = $namespaceSoap->get_list($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.\nif (defined $namespaceSoapResult->fault && $namespaceSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($namespaceSoapResult->fault) . \"\\n\");\n}\n\nprint \"Printing the results of the call to the \\\"get_list\\\" method of the ARX Namespace interface.\\n\\n\";\n\n# The get_list() call did not fail, so we build a list of namespace\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.\nmy @namespaceList = ($namespaceSoapResult->result, \n $namespaceSoapResult->paramsout);\n\nif ($#namespaceList < 0) {\n print(\"The list of namespaces returned from the call to the \\\"get_list\\\" method of the ARX Namespace interface was empty.\\n\");\n exit(0);\n}\n\n# We can now print the list of namespaces\nprint \"Namespace list:\\n\";\nforeach my $namespace (@namespaceList) {\n print \" \", $namespace, \"\\n\";\n}\nprint \"\\n\";\n\nprint \"Calling the \\\"get_configuration\\\" method of the ARX Namespace interface.\\n\\n\";\n\n# get namespace configuration from API\n\n# Build a security header \n$securityHeader = getSecurityHeader($user, $pass);\n\n# In addition to printing the list of namespaces, we can actually\n# use that list to retrieve configuration information\n# for all of the namespaces using the same list by calling\n# get_configuration().\n$namespaceSoapResult = $namespaceSoap->get_configuration(SOAP::Data->name('namespaces')->value(@namespaceList),\n $securityHeader);\n\nif (defined $namespaceSoapResult->fault && $namespaceSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($namespaceSoapResult->fault) . \"\\n\");\n}\n\nprint \"Printing the results of the call to the \\\"get_configuration\\\" method of the ARX Namespace interface.\\n\\n\";\n\nmy @namespaceConfigs = ($namespaceSoapResult->result, $namespaceSoapResult->paramsout);\n\nforeach my $namespaceConfig (@namespaceConfigs) {\n my $name = $namespaceConfig->{'name'};\n\n print \"----------------------------------------------\\n\";\n print \"Namespace: \", $name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"name: \", $name, \"\\n\";\n\n my $description = $namespaceConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n # Each namespace is configured with support for file access protocols like\n # CIFS and NFS. For single protocol support, it's just a hash with the\n # type and version, but if there are multiple protocols supported, then\n # it's actually an array of hashes, so we need to unwrap it.\n if (exists $namespaceConfig->{'protocols'}) {\n print \"protocols:\\n\";\n\n my @protocols = ();\n\n if (ref($namespaceConfig->{'protocols'}) eq \"ARRAY\") {\n @protocols = @{$namespaceConfig->{'protocols'}};\n } else {\n @protocols = $namespaceConfig->{'protocols'};\n }\n\n foreach my $protocol (@protocols) {\n print \" \", $protocol, \"\\n\";\n }\n\n print \"\\n\";\n }\n\n my $character_encoding_nfs = $namespaceConfig->{'character_encoding_nfs'};\n print \"character_encoding_nfs: \", $character_encoding_nfs, \"\\n\";\n\n my $cifs_anonymous_access = $namespaceConfig->{'cifs_anonymous_access'};\n print \"cifs_anonymous_access: \", $cifs_anonymous_access, \"\\n\";\n\n if (exists $namespaceConfig->{'cifs_authentications'}) {\n print \"cifs_authentications:\\n\";\n\n my @cifs_authentications = ();\n\n if (ref($namespaceConfig->{'cifs_authentications'}) eq \"ARRAY\") {\n @cifs_authentications = @{$namespaceConfig->{'cifs_authentications'}};\n } else {\n @cifs_authentications = $namespaceConfig->{'cifs_authentications'};\n }\n\n foreach my $cifs_authentication (@cifs_authentications) {\n print \" \", $cifs_authentication, \"\\n\";\n }\n\n print \"\\n\";\n }\n\n my $cifs_filer_signatures = $namespaceConfig->{'cifs_filer_signatures'};\n print \"cifs_filer_signatures: \", $cifs_filer_signatures, \"\\n\";\n\n my $ntlm_auth_db = $namespaceConfig->{'ntlm_auth_db'};\n print \"ntlm_auth_db: \", $ntlm_auth_db, \"\\n\";\n\n if (exists $namespaceConfig->{'ntlm_auth_servers'}) {\n print \"ntlm_auth_servers:\\n\";\n\n my @ntlm_auth_servers = ();\n\n if (ref($namespaceConfig->{'ntlm_auth_servers'}) eq \"ARRAY\") {\n @ntlm_auth_servers = @{$namespaceConfig->{'ntlm_auth_servers'}};\n } else {\n @ntlm_auth_servers = $namespaceConfig->{'ntlm_auth_servers'};\n }\n\n foreach my $ntlm_auth_server (@ntlm_auth_servers) {\n print \" \", $ntlm_auth_server, \"\\n\";\n }\n\n print \"\\n\";\n }\n\n my $policy_migration_attempts = $namespaceConfig->{'policy_migration_attempts'};\n print \"policy_migration_attempts: \", $policy_migration_attempts, \"\\n\";\n\n my $policy_migration_delay = $namespaceConfig->{'policy_migration_delay'};\n print \"policy_migration_delay: \", $policy_migration_delay, \"\\n\";\n\n my $policy_migration_retry_delay = $namespaceConfig->{'policy_migration_retry_delay'};\n print \"policy_migration_retry_delay: \", $policy_migration_retry_delay, \"\\n\";\n\n my $policy_treewalk_threads = $namespaceConfig->{'policy_treewalk_threads'};\n print \"policy_treewalk_threads: \", $policy_treewalk_threads, \"\\n\";\n\n my $proxy_user = $namespaceConfig->{'proxy_user'};\n print \"proxy_user: \", $proxy_user, \"\\n\";\n\n if (exists $namespaceConfig->{'sam_references'}) {\n print \"sam_references:\\n\";\n\n my @sam_references = ();\n\n if (ref($namespaceConfig->{'sam_references'}) eq \"ARRAY\") {\n @sam_references = @{$namespaceConfig->{'sam_references'}};\n } else {\n @sam_references = $namespaceConfig->{'sam_references'};\n }\n\n foreach my $sam_reference (@sam_references) {\n my $file_server = $sam_reference->{'file_server'};\n print \" file_server: \", $file_server, \"\\n\";\n\n my $cluster = $sam_reference->{'cluster'};\n print \" cluster: \", $cluster, \"\\n\";\n print \"\\n\";\n }\n }\n\n if (exists $namespaceConfig->{'windows_mgmt_auths'}) {\n print \"windows_mgmt_auths:\\n\";\n\n my @windows_mgmt_auths = ();\n\n if (ref($namespaceConfig->{'windows_mgmt_auths'}) eq \"ARRAY\") {\n @windows_mgmt_auths = @{$namespaceConfig->{'windows_mgmt_auths'}};\n } else {\n @windows_mgmt_auths = $namespaceConfig->{'windows_mgmt_auths'};\n }\n\n foreach my $windows_mgmt_auth (@windows_mgmt_auths) {\n print \" \", $windows_mgmt_auth, \"\\n\";\n }\n\n print \"\\n\";\n }\n\n print \"\\n\";\n}\n\n#-------------------------------------------------------------------------------\n# End of main program logic\n#-------------------------------------------------------------------------------\n\n\n#-------------------------------------------------------------------------------\n# sub usage\n#-------------------------------------------------------------------------------\nsub usage\n{\n print \"\\nUsage: ARXNamespaceExample.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} ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"16646","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:278563":{"__typename":"Conversation","id":"conversation:278563","topic":{"__typename":"TkbTopicMessage","uid":278563},"lastPostingActivityTime":"2023-06-05T22:33:24.148-07:00","solved":false},"TkbTopicMessage:message:278563":{"__typename":"TkbTopicMessage","subject":"Perl ARX Schedule","conversation":{"__ref":"Conversation:conversation:278563"},"id":"message:278563","revisionNum":2,"uid":278563,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:200589"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":334},"postTime":"2015-03-07T13:50:46.000-08:00","lastPublishTime":"2023-06-05T22:33:24.148-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 monitor and manage all schedules on an ARX. How to use this snippet: ARXScheduleExample.pl --url --user --pass \n Prerequisites \n SOAP::Lite perl module An F5 ARX system running release V6.02.000 or later. 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 monitor and manage all schedules on an ARX.\n#\n# Usage: ARXScheduleExample.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 running release V6.02.000 or later.\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;\nuse Time::Local;\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 $scheduleServiceUrl = $url . \"/api/services/Schedule\";\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 Schedule interface and we're \n# interested in using the WSDL 1.1 version.\n#\nmy $scheduleWsdlUrl = $scheduleServiceUrl . \"?wsdl\";\n\n# Now we build our SOAP::Lite object using the service and WSDL\n# URLs\nmy $scheduleSoap = SOAP::Lite->new(proxy => $scheduleServiceUrl,\n service => $scheduleWsdlUrl);\n\nif ($op eq \"get_list\")\n{\n get_list();\n}\nelsif ($op eq \"get_configuration\")\n{\n get_configuration();\n}\nelsif ($op eq \"get_status\")\n{\n get_status();\n}\nelsif ($op eq \"create\")\n{\n create();\n}\nelsif ($op eq \"set_description\")\n{\n set_description();\n}\n\nelsif ($op eq \"set_duration\")\n{\n set_duration();\n}\nelsif ($op eq \"set_interval\")\n{\n set_interval();\n}\nelsif ($op eq \"set_start\")\n{\n set_start();\n}\nelsif ($op eq \"set_stop\")\n{\n set_stop();\n}\nelsif ($op eq \"create_and_configure\")\n{\n create_and_configure();\n}\nelsif ($op eq \"remove\")\n{\n remove();\n}\n\n\n#-------------------------------------------------------------------------------\n# End of main program logic\n#-------------------------------------------------------------------------------\n\n\n#-------------------------------------------------------------------------------\n# sub usage\n#-------------------------------------------------------------------------------\nsub usage\n{\n print \"\\nUsage: ARXScheduleExample.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 ARXSchedule API method that will be called:\\n\";\n print \"\\n\";\n print \" create\\n\";\n print \" create_and_configure\\n\";\n print \" set_description\\n\";\n print \" set_duration\\n\";\n print \" set_interval\\n\";\n print \" set_start\\n\";\n print \" set_stop\\n\";\n print \" get_list\\n\";\n print \" get_configuration\\n\";\n print \" get_status\\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 print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Calling the \\\"create\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->create(SOAP::Data->name('schedule')->value($schedule), \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 $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub create_and_configure\n{\n print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Please specify a description:\\n\\n\";\n chomp(my $description = <>);\n print \"\\n\";\n\n print \"Please specify a duration:\\n\\n\";\n chomp(my $duration = <>);\n print \"\\n\";\n\n print \"Please specify a start time (mm/dd/yyyy:hh:mm):\\n\\n\";\n chomp(my $time = <>);\n my $month = substr($time, 0, 2) - 1;\n my $day = substr($time, 3, 2);\n my $year = substr($time, 6, 4);\n my $hour = substr($time, 11, 2);\n my $minute = substr($time, 14, 2);\n my $start = timelocal(0, $minute, $hour, $day, $month, $year);\n print \"\\n\";\n\n print \"Please specify a stop time (mm/dd/yyyy:hh:mm):\\n\\n\";\n chomp($time = <>);\n $month = substr($time, 0, 2) - 1;\n $day = substr($time, 3, 2);\n $year = substr($time, 6, 4);\n $hour = substr($time, 11, 2);\n $minute = substr($time, 14, 2);\n my $stop = timelocal(0, $minute, $hour, $day, $month, $year);\n print \"\\n\";\n\n print \"Please specify either 'ARX_INTERVAL_UNKNOWN', 'ARX_INTERVAL_MINUTES', 'ARX_INTERVAL_HOURS', 'ARX_INTERVAL_DAYS', 'ARX_INTERVAL_WEEKS', 'ARX_INTERVAL_MONTHS', 'ARX_INTERVAL_QUARTERS', 'ARX_INTERVAL_YEARS', 'ARX_INTERVAL_FIRST_DAY', 'ARX_INTERVAL_LAST_DAY', 'ARX_INTERVAL_HOURS_OF_DAY', 'ARX_INTERVAL_DAYS_OF_WEEK', or 'ARX_INTERVAL_DAYS_OF_MONTH' for the 'interval_type':\\n\\n\";\n chomp(my $intervalType = <>);\n print \"\\n\";\n\n print \"Please specify an 'interval':\\n\\n\";\n chomp(my $interval = <>);\n print \"\\n\";\n\n print \"Calling the \\\"create_and_configure\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\";\n print \"description: $description\\n\";\n print \"duration: $duration\\n\";\n print \"start_time: $start\\n\";\n print \"stop_time: $stop\\n\";\n print \"interval_type: $intervalType\\n\";\n print \"interval: $interval\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->create_and_configure(SOAP::Data->name('configuration' => \\SOAP::Data->value(\n SOAP::Data->name(\"name\" => $schedule), \n SOAP::Data->name(\"description\" => $description), \n SOAP::Data->name(\"duration\" => $duration), \n SOAP::Data->name(\"start_time\" => $start, \n SOAP::Data->name(\"stop_time\" => $stop), \n SOAP::Data->name(\"interval_type\" => $intervalType), \n SOAP::Data->name(\"interval\" => $interval))\n )), \n $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_description\n{\n print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Please specify a description:\\n\\n\";\n chomp(my $description = <>);\n print \"\\n\";\n\n print \"Calling the \\\"set_description\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\";\n print \"description: $description\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->set_description(SOAP::Data->name('schedule')->value($schedule), \n SOAP::Data->name('description')->value($description), \n $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_duration\n{\n print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Please specify a duration:\\n\\n\";\n chomp(my $duration = <>);\n print \"\\n\";\n\n print \"Calling the \\\"set_duration\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\";\n print \"duration: $duration\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->set_duration(SOAP::Data->name('schedule')->value($schedule), \n SOAP::Data->name('duration')->value($duration), \n $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_interval\n{\n print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Please specify either 'ARX_INTERVAL_UNKNOWN', 'ARX_INTERVAL_MINUTES', 'ARX_INTERVAL_HOURS', 'ARX_INTERVAL_DAYS', 'ARX_INTERVAL_WEEKS', 'ARX_INTERVAL_MONTHS', 'ARX_INTERVAL_QUARTERS', 'ARX_INTERVAL_YEARS', 'ARX_INTERVAL_FIRST_DAY', 'ARX_INTERVAL_LAST_DAY', 'ARX_INTERVAL_HOURS_OF_DAY', 'ARX_INTERVAL_DAYS_OF_WEEK', or 'ARX_INTERVAL_DAYS_OF_MONTH' for the 'interval_type':\\n\\n\";\n chomp(my $intervalType = <>);\n print \"\\n\";\n\n print \"Please specify an 'interval':\\n\\n\";\n chomp(my $interval = <>);\n print \"\\n\";\n\n print \"Calling the \\\"set_interval\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\";\n print \"interval_type: $intervalType\\n\";\n print \"interval: $interval\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->set_interval(SOAP::Data->name('schedule')->value($schedule), \n SOAP::Data->name(\"interval_type\" => $intervalType), \n SOAP::Data->name(\"interval\" => $interval), \n $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_start\n{\n print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Please specify a start time (mm/dd/yyyy:hh:mm):\\n\\n\";\n chomp(my $time = <>);\n my $month = substr($time, 0, 2) - 1;\n my $day = substr($time, 3, 2);\n my $year = substr($time, 6, 4);\n my $hour = substr($time, 11, 2);\n my $minute = substr($time, 14, 2);\n my $start = timelocal(0, $minute, $hour, $day, $month, $year);\n print \"\\n\";\n\n print \"Calling the \\\"set_start\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\";\n print \"time: $start\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->set_start(SOAP::Data->name('schedule')->value($schedule), \n SOAP::Data->name('time')->value($start), \n $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub set_stop\n{\n print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Please specify a stop time (mm/dd/yyyy:hh:mm):\\n\\n\";\n chomp(my $time = <>);\n my $month = substr($time, 0, 2) - 1;\n my $day = substr($time, 3, 2);\n my $year = substr($time, 6, 4);\n my $hour = substr($time, 11, 2);\n my $minute = substr($time, 14, 2);\n my $stop = timelocal(0, $minute, $hour, $day, $month, $year);\n print \"\\n\";\n\n print \"Calling the \\\"set_stop\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\";\n print \"time: $stop\\n\\n\";\n\n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->set_stop(SOAP::Data->name('schedule')->value($schedule), \n SOAP::Data->name('time')->value($stop), \n $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n}\n\nsub get_list\n{\n # Get a list of schedules configured on the ARX.\n print \"Calling the \\\"get_list\\\" method of the ARX Schedule interface.\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->get_list($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 $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_list\\\" method of the ARX Schedule interface.\\n\\n\";\n\n # The get_list() call did not fail, so we build a list of schedule\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 @scheduleList = ($scheduleSoapResult->result, \n $scheduleSoapResult->paramsout);\n\n if ($#scheduleList < 0) {\n print(\"The list of schedules returned from the call to the \\\"get_list\\\" method of the ARX Schedule interface was empty.\\n\");\n exit(0);\n }\n\n # We can now print the list of schedules\n print \"Schedule list:\\n\";\n foreach my $schedule (@scheduleList) {\n print \" \", $schedule, \"\\n\";\n }\n\n print \"\\n\";\n}\n\nsub get_configuration\n{\n # Get a list of schedules configured on the ARX.\n print \"Calling the \\\"get_list\\\" method of the ARX Schedule interface.\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->get_list($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 $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_list\\\" method of the ARX Schedule interface.\\n\\n\";\n\n # The get_list() call did not fail, so we build a list of schedule\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 @scheduleList = ($scheduleSoapResult->result, \n $scheduleSoapResult->paramsout);\n\n if ($#scheduleList < 0) {\n print(\"The list of schedules returned from the call to the \\\"get_list\\\" method of the ARX Schedule interface was empty.\\n\");\n exit(0);\n }\n\n # get schedule configuration from API\n print \"Calling the \\\"get_configuration\\\" method of the ARX Schedule interface.\\n\\n\";\n\n # Build a security header\n $securityHeader = getSecurityHeader($user, $pass);\n\n # In addition to printing the list of schedules, we can actually\n # use that list to retrieve configuration information\n # for all of the schedules using the same list by calling\n # get_configuration().\n $scheduleSoapResult = $scheduleSoap->get_configuration(SOAP::Data->name('schedules')->value(@scheduleList), $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_configuration\\\" method of the ARX Schedule interface.\\n\\n\";\n\n my @scheduleConfigs = ($scheduleSoapResult->result, $scheduleSoapResult->paramsout);\n\n foreach my $scheduleConfig (@scheduleConfigs) {\n my $name = $scheduleConfig->{'name'};\n\n print \"----------------------------------------------\\n\";\n print \"Schedule: \", $name, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"name: \", $name, \"\\n\";\n\n my $description = $scheduleConfig->{'description'};\n print \"description: \", $description, \"\\n\";\n\n my $duration = $scheduleConfig->{'duration'};\n print \"duration: \", $duration, \"\\n\";\n\n my $start_time = $scheduleConfig->{'start_time'};\n print \"start_time: \", $start_time, \"\\n\";\n\n my $stop_time = $scheduleConfig->{'stop_time'};\n print \"stop_time: \", $stop_time, \"\\n\";\n\n my $interval_type = $scheduleConfig->{'interval_type'};\n print \"interval_type: \", $interval_type, \"\\n\";\n\n my $interval = $scheduleConfig->{'interval'};\n print \"interval: \", $interval, \"\\n\";\n\n print \"\\n\";\n }\n}\n\nsub get_status\n{\n # Get a list of schedules configured on the ARX.\n print \"Calling the \\\"get_list\\\" method of the ARX Schedule interface.\\n\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->get_list($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 $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_list\\\" method of the ARX Schedule interface.\\n\\n\";\n\n # The get_list() call did not fail, so we build a list of schedule\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 @scheduleList = ($scheduleSoapResult->result, \n $scheduleSoapResult->paramsout);\n\n if ($#scheduleList < 0) {\n print(\"The list of schedules returned from the call to the \\\"get_list\\\" method of the ARX Schedule interface was empty.\\n\");\n exit(0);\n }\n\n # get schedule status from API\n print \"Calling the \\\"get_status\\\" method of the ARX Schedule 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 $scheduleSoapResult = $scheduleSoap->get_status(SOAP::Data->name('schedules')->value(@scheduleList), $securityHeader);\n\n if (defined $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->fault) . \"\\n\");\n }\n\n print \"Printing the results of the call to the \\\"get_status\\\" method of the ARX Schedule interface.\\n\\n\";\n\n my @scheduleStatuses = ($scheduleSoapResult->result, $scheduleSoapResult->paramsout);\n\n foreach my $scheduleStatus (@scheduleStatuses) {\n my $schedule = $scheduleStatus->{'schedule'};\n\n print \"----------------------------------------------\\n\";\n print \"Schedule: \", $schedule, \"\\n\";\n print \"----------------------------------------------\\n\\n\";\n\n print \"schedule: \", $schedule, \"\\n\";\n\n my $status = $scheduleStatus->{'status'};\n print \"status: \", $status, \"\\n\";\n\n if (exists $scheduleStatus->{'previous'}) {\n my $previous = $scheduleStatus->{'previous'};\n print \"previous:\\n\";\n\n my $prevRunTime = $previous->{'run_time'};\n print \" run_time: \", $prevRunTime, \"\\n\";\n\n my $prevEndTime = $previous->{'end_time'};\n print \" end_time: \", $prevEndTime, \"\\n\";\n }\n\n if (exists $scheduleStatus->{'current'}) {\n my $current = $scheduleStatus->{'current'};\n print \"current:\\n\";\n\n my $curRunTime = $current->{'run_time'};\n print \" run_time: \", $curRunTime, \"\\n\";\n\n my $curEndTime = $current->{'end_time'};\n print \" end_time: \", $curEndTime, \"\\n\";\n }\n\n if (exists $scheduleStatus->{'next'}) {\n my $next = $scheduleStatus->{'next'};\n print \"next:\\n\";\n\n my $nextRunTime = $next->{'run_time'};\n print \" run_time: \", $nextRunTime, \"\\n\";\n\n my $nextEndTime = $next->{'end_time'};\n print \" end_time: \", $nextEndTime, \"\\n\";\n }\n\n print \"\\n\";\n }\n}\n\nsub remove\n{\n print \"Please specify a schedule name:\\n\\n\";\n chomp(my $schedule = <>);\n print \"\\n\";\n\n print \"Calling the \\\"remove\\\" method of the ARX Schedule interface with the following parameters:\\n\\n\";\n print \"schedule: $schedule\\n\";\n\n # Build a security header \n my $securityHeader = getSecurityHeader($user, $pass);\n\n my $scheduleSoapResult = $scheduleSoap->remove(SOAP::Data->name('schedule')->value($schedule), \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 $scheduleSoapResult->fault && $scheduleSoapResult->fault) {\n confess(\"SOAP request failed:\\n\" . objdump($scheduleSoapResult->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":"30864","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/community/Navbar-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1744046271000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","Common-external-link":"How Do I...?","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1744046271000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1744046271000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1744046271000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1744046271000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1744046271000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1744046271000","value":{"success.follow.title":"Following Tag","success.unfollow.title":"Unfollowed Tag","success.follow.message.followAcrossCommunity":"You will be notified when this tag is used anywhere across the community","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1744046271000","value":{"title":"Query Handler"},"localOverride":false},"Category:category:top":{"__typename":"Category","id":"category:top","nodeType":"category"},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1744046271000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1744046271000","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1744046271000","value":{"bylineAuthor":"{bylineAuthor}","bylineBoard":"{bylineBoard}","anonymous":"Anonymous","place":"Place {bylineBoard}","gotoParent":"Go to parent {name}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1744046271000","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1744046271000","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1744046271000","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1744046271000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1744046271000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1744046271000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1744046271000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1744046271000","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1744046271000","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1744046271000","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1744046271000","value":{"textTitle":"{count, plural,one {{messageType, select, IDEA{Vote} other{Like}}} other{{messageType, select, IDEA{Votes} other{Likes}}}}","likes":"{count, plural, one{like} other{likes}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1744046271000","value":{"textTitle":"{count, plural,one {{conversationStyle, select, IDEA{Comment} OCCASION{Comment} other{Reply}}} other{{conversationStyle, select, IDEA{Comments} OCCASION{Comments} other{Replies}}}}","comments":"{count, plural, one{Comment} other{Comments}}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1744046271000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"tagName":"perl"},"buildId":"ISAhs0UxT148eG089lpQq","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.3.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/ListGroup/ListGroup.tsx","./components/messages/MessageView/MessageView.tsx","./components/messages/MessageView/MessageViewInline/MessageViewInline.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[]}