Example #1
0
class InteractiveClient(object):
    def __init__(self, authType, cloudType):
        self.__cloudType = cloudType
        self.__managementResource = cloudType.endpoints.management
        self.__graphResource = cloudType.endpoints.active_directory_graph_resource_id
        self.__tenantIdList = []
        self.__tenantObject = None
        self.__subscriptionClient = None
        self.__subscriptionList = []
        self.__selectedSubscriptionList = []
        self.__registerProviders = None
        self.__allSubscriptions = False
        self.__authType = authType
        self.__config = Config(None, str(uuid.uuid4()), [], True, None,
                               IDENTIFIER_URL, self.__cloudType.name, [],
                               False)
        self.__credentials = None

    def __getInput(self, line):
        name = raw_input(line + ": ")
        type(name)
        if len(name.strip()) == 0:
            return self.__getInput(line)
        elif name.strip() == "exit":
            exit(0)
        else:
            return name

    def __getPasswordInput(self, line):
        name = getpass.getpass(prompt=line + ": ")
        type(name)
        if len(name.strip()) == 0:
            return self.__getPasswordInput(line)
        elif name.strip() == "exit":
            exit(0)
        else:
            return name

    def __getNumberInput(self, line):
        number = self.__getInput(line)
        try:
            return int(number)
        except:
            self.__getNumberInput(line)

    def run(self):
        self.getUserNamePasswordCredentials()
        # self.getClientSecret()
        self.selectTenants()
        self.getUpdateApp()
        self.selectSubscriptions()
        if len(self.__selectedSubscriptionList) > 0:
            self.shouldRegisterProviders()
        self.review()
        cont = self.getYesNoPrompt("Do You Want to continue? (YES/NO)")
        if not cont:
            print "Aborting.."
            exit(1)
        self.runApp()

    def getUserNamePasswordCredentials(self):
        credentials = {"type": self.__authType}
        credentials[KEY_USERNAME] = self.__getInput("Enter UserName")
        if self.__authType == CREDENTIALS_TYPE_USER_PASS:
            credentials[KEY_PASSWORD] = self.__getPasswordInput(
                "Enter Password")
        self.__credentials = credentials
        self.__config.setCredentials(credentials)

    def getUpdateApp(self):
        credentialsProvider = CredentialsProviderFactory.getCredentialsProvider(
            self.__config)
        appUtil = AppUtil(credentialsProvider)
        appId = appUtil.getAppId()

        if appId != None:
            print "\n\nYou already have a Lacework App Setup"
            self.__config.setIsUpdateApp(
                self.getYesNoPrompt(
                    "Do You Want to update an existing app? (YES/NO)"))
            if not self.__config.isUpdateApp():
                print "Please delete the existing App to create a new one. Aborting for now..."
                exit(1)

    def getClientSecret(self):
        name = raw_input(
            "Get Client Secret (Optional). Not used for existing Apps: ")
        type(name)
        if len(name.strip()) == 0:
            self.__clientSecret = str(uuid.uuid4())
        elif name.strip() == "exit":
            exit(0)
        elif len(name.strip()) < 10:
            self.getClientSecret()

    def review(self):
        printBold(
            "\n\n------------------------------------------------------------------------------------------------------------------"
        )
        printBold("\n\nOverview")
        self.printTenants([self.__tenantObject])
        printBold("\n\nSelected Subscriptions: ")
        self.printSubscriptions(self.__selectedSubscriptionList)
        printBold("\n\nUpdate Permission for existing App: ")
        print str(self.__config.isUpdateApp())
        if len(self.__selectedSubscriptionList) > 0:
            printBold("\n\nProviders Required")
            self.printProviders()
        printBold(
            "\n\n------------------------------------------------------------------------------------------------------------------"
        )

    def shouldRegisterProviders(self):
        print "\n\nWe need some providers to be registered in the selected subscriptions in order to add compliance evaluations for them: \n"
        self.printProviders()
        self.__registerProviders = self.getYesNoPrompt(
            "Do you Want to register the providers? (YES/NO)")

    def printProviders(self):
        print "\nList Of Providers Required\n"
        prettyTable = PrettyTable(["No.", "Namespace"])
        i = 1
        for provider in PROVIDER_REGISTRATION_LIST:
            prettyTable.add_row([str(i), provider])
            i += 1
        print prettyTable
        if self.__registerProviders != None:
            printBold("\n\nRegister Providers : ")
            print str(self.__registerProviders)

    def getYesNoPrompt(self, line):
        input = self.__getInput(line)
        if input.lower() == "yes":
            return True
        elif input.lower() == "no":
            return False
        else:
            self.getYesNoPrompt(line)

    def selectSubscriptions(self):
        self.fetchSubscriptions()
        self.printSubscriptions(self.__subscriptionList)
        self.__selectSubscriptions()

    def fetchSubscriptions(self):
        self.__subscriptionClient = SubscriptionClient(
            credentials=CredentialsProviderFactory.getCredentialsForResource(
                self.__config, self.__managementResource))
        for subscription in self.__subscriptionClient.subscriptions.list():
            if str(subscription.state) == 'SubscriptionState.enabled':
                self.__subscriptionList.append(subscription)

    def printSubscriptions(self, subscriptionList):
        prettyTable = PrettyTable(["No.", "Subscription Id", "Display Name"])
        i = 1
        print "\nList Of Available Subscriptions\n"
        for subscription in subscriptionList:
            prettyTable.add_row([
                str(i), subscription.subscription_id, subscription.display_name
            ])
            i += 1
        print prettyTable

    def __selectSubscriptions(self):
        if len(self.__subscriptionList) == 0:
            print "\n No Subscriptions found in tenant: " + self.__config.getTenantId(
            )
            return
        line = "\n Please provide comma separated Subscription No. (eg. 1,3,4) or 'ALL' for all subscriptions"
        subString = self.__getInput(line)
        if subString == "ALL":
            self.__allSubscriptions = True
            self.__selectedSubscriptionList = self.__subscriptionList
            self.__config.setAllSubscriptions(True)
        else:
            self.__config.setAllSubscriptions(False)
            try:
                subsIndexList = [x.strip() for x in subString.split(',')]
                for index in subsIndexList:
                    indexNum = int(index)
                    if indexNum < 1 or indexNum > len(self.__subscriptionList):
                        self.__selectSubscriptions()
                        return
                for index in subsIndexList:
                    indexNum = int(index)
                    if indexNum >= 1 and indexNum <= len(
                            self.__subscriptionList):
                        self.__selectedSubscriptionList.append(
                            self.__subscriptionList[indexNum - 1])
                        self.__config.getSubscriptionList().append(
                            self.__subscriptionList[indexNum -
                                                    1].subscription_id)
            except Exception as e:
                self.__selectSubscriptions()

    def selectTenants(self):
        self.fetchTenants()
        self.printTenants(self.__tenantIdList)
        self.__selectTenant()

    def printTenants(self, tenantIdList):
        prettyTable = PrettyTable(["No.", "Tenant Id", "DisplayName"])
        i = 1
        print "\nTenants\n"
        for tenant in tenantIdList:
            prettyTable.add_row([
                str(i), tenant["tenant"],
                tenant["details"]["value"][0]["displayName"]
            ])
            i += 1
        print prettyTable

    def __selectTenant(self):
        tenantNo = self.__getNumberInput("\nSelect Tenant No. from " + str(1) +
                                         " - " + str(len(self.__tenantIdList)))
        try:
            if tenantNo >= 1 and tenantNo <= len(self.__tenantIdList):
                tenantNo = tenantNo - 1
                self.__tenantObject = self.__tenantIdList[tenantNo]
                self.__config.setTenantId(self.__tenantObject["tenant"])
                print "\n Selected tenant: " + self.__config.getTenantId()
                return
            else:
                self.__selectTenant()
        except:
            self.__selectTenant()

    def fetchTenants(self):
        config = Config(self.__credentials, None, [], True, None, "",
                        self.__cloudType.name, [], True)
        self.__subscriptionClient = SubscriptionClient(
            CredentialsProviderFactory.getCredentialsForResource(
                config, self.__managementResource))
        for tenant in self.__subscriptionClient.tenants.list():
            config = Config(self.__credentials, None, [], True,
                            str(tenant.tenant_id), "", self.__cloudType.name,
                            [], True)

            tenantId = config.getTenantId()
            credentials = CredentialsProviderFactory.getCredentialsForResource(
                config, self.__graphResource)

            tenantUtil = TenantUtil(credentials, tenantId)

            tenantProperties = tenantUtil.getAdProperties()
            if tenantProperties:
                self.__tenantIdList.append({
                    "tenant": tenantId,
                    "details": tenantProperties
                })
            else:
                logging.warn(
                    "Could not get Tenant description for tenant Id: " +
                    tenantId)
        if len(self.__tenantIdList) == 0:
            print "No Tenants Found"
            exit(1)

    def runApp(self):
        config = self.__config
        appManager = AppManager(config, self.__registerProviders)
        appManager.run()