def _prompt_for_parameters(missing_parameters): result = {} for param_name in missing_parameters: prompt_str = 'Please provide a value for \'{}\' (? for help): '.format(param_name) param = missing_parameters[param_name] param_type = param.get('type', 'string') description = 'Missing description' metadata = param.get('metadata', None) if metadata is not None: description = metadata.get('description', description) allowed_values = param.get('allowedValues', None) while True: if allowed_values is not None: ix = prompt_choice_list(prompt_str, allowed_values, help_string=description) result[param_name] = allowed_values[ix] break elif param_type == 'securestring': value = prompt_pass(prompt_str, help_string=description) elif param_type == 'int': int_value = prompt_int(prompt_str, help_string=description) result[param_name] = int_value break elif param_type == 'bool': value = prompt_t_f(prompt_str, help_string=description) result[param_name] = value break else: value = prompt(prompt_str, help_string=description) if len(value) > 0: break return {}
def _prompt_for_parameters(missing_parameters): result = {} for param_name in missing_parameters: prompt_str = 'Please provide a value for \'{}\' (? for help): '.format(param_name) param = missing_parameters[param_name] param_type = param.get('type', 'string') description = 'Missing description' metadata = param.get('metadata', None) if metadata is not None: description = metadata.get('description', description) allowed_values = param.get('allowedValues', None) while True: if allowed_values is not None: ix = prompt_choice_list(prompt_str, allowed_values, help_string=description) result[param_name] = allowed_values[ix] break elif param_type == 'securestring': value = prompt_pass(prompt_str, help_string=description) result[param_name] = value elif param_type == 'int': int_value = prompt_int(prompt_str, help_string=description) result[param_name] = int_value break elif param_type == 'bool': value = prompt_t_f(prompt_str, help_string=description) result[param_name] = value break else: value = prompt(prompt_str, help_string=description) result[param_name] = value if value: break return result
def _create_or_update_env(env_name=None): if not env_name: # TODO Support new env creation print('This feature is coming soon.\n') sys.exit(1) # get the config parser for this env context_config = configparser.SafeConfigParser() context_config.read(os.path.join(CONTEXT_CONFIG_DIR, env_name)) # prompt user to choose cloud for env selected_cloud_index = prompt_choice_list(MSG_PROMPT_WHICH_CLOUD, CLOUD_LIST, default=get_default_from_config( context_config, 'context', 'cloud', CLOUD_LIST)) answers['cloud_prompt'] = selected_cloud_index answers['cloud_options'] = str(CLOUD_LIST) if CLOUD_LIST[selected_cloud_index]['name'] != 'public-azure': # TODO support other clouds print('Support for other clouds is coming soon.\n') sys.exit(1) try: context_config.add_section('context') except configparser.DuplicateSectionError: pass context_config.set('context', 'cloud', CLOUD_LIST[selected_cloud_index]['name']) # TODO when we support other clouds, extend this to a class. Keeping it simple for now. _config_env_public_azure(context_config) # save the config if not os.path.isdir(CONTEXT_CONFIG_DIR): os.makedirs(CONTEXT_CONFIG_DIR) with open(os.path.join(CONTEXT_CONFIG_DIR, env_name), 'w') as configfile: context_config.write(configfile)
def _handle_global_configuration(): # print location of global configuration print(MSG_GLOBAL_SETTINGS_LOCATION.format(GLOBAL_CONFIG_PATH)) if os.path.isfile(ACTIVE_CONTEXT_CONFIG_PATH): # print location of the active env configuration if it exists print( MSG_ACTIVE_CONTEXT_SETTINGS_LOCATION.format( ACTIVE_CONTEXT_CONFIG_PATH)) # set up the config parsers file_config = configparser.SafeConfigParser() config_exists = file_config.read( [GLOBAL_CONFIG_PATH, ACTIVE_CONTEXT_CONFIG_PATH]) global_config = configparser.SafeConfigParser() global_config.read(GLOBAL_CONFIG_PATH) should_modify_global_config = False if config_exists: # print current config and prompt to allow global config modification _print_cur_configuration(file_config) should_modify_global_config = prompt_y_n(MSG_PROMPT_MANAGE_GLOBAL, default='n') answers['modify_global_prompt'] = should_modify_global_config if not config_exists or should_modify_global_config: # no config exists yet so configure global config or user wants to modify global config output_index = prompt_choice_list(MSG_PROMPT_GLOBAL_OUTPUT, OUTPUT_LIST, default=get_default_from_config(global_config, \ 'core', 'output', OUTPUT_LIST)) answers['output_type_prompt'] = output_index answers['output_type_options'] = str(OUTPUT_LIST) allow_telemetry = prompt_y_n(MSG_PROMPT_TELEMETRY, default='y') answers['telemetry_prompt'] = allow_telemetry enable_file_logging = prompt_y_n(MSG_PROMPT_FILE_LOGGING, default='n') # save the global config try: global_config.add_section('core') except configparser.DuplicateSectionError: pass try: global_config.add_section('logging') except configparser.DuplicateSectionError: pass global_config.set('core', 'output', OUTPUT_LIST[output_index]['name']) global_config.set('core', 'collect_telemetry', 'yes' if allow_telemetry else 'no') global_config.set('logging', 'enable_log_file', 'yes' if enable_file_logging else 'no') if not os.path.isdir(GLOBAL_CONFIG_DIR): os.makedirs(GLOBAL_CONFIG_DIR) with open(GLOBAL_CONFIG_PATH, 'w') as configfile: global_config.write(configfile)
def _config_env_public_azure(_): from adal.adal_error import AdalError from azure.cli.core.commands.client_factory import get_mgmt_service_client from azure.mgmt.resource import ResourceManagementClient from azure.cli.core._profile import Profile # Determine if user logged in try: list(get_mgmt_service_client(ResourceManagementClient).resources.list()) except CLIError: # Not logged in login_successful = False while not login_successful: method_index = prompt_choice_list(MSG_PROMPT_LOGIN, LOGIN_METHOD_LIST) answers['login_index'] = method_index answers['login_options'] = str(LOGIN_METHOD_LIST) profile = Profile() interactive = False username = None password = None service_principal = None tenant = None if method_index == 0: # device auth interactive = True elif method_index == 1: # username and password username = prompt('Username: '******'Password: '******'Service principal: ') tenant = prompt('Tenant: ') password = prompt_pass(msg='Client secret: ') elif method_index == 3: # skip return try: profile.find_subscriptions_on_login( interactive, username, password, service_principal, tenant) login_successful = True logger.warning('Login successful!') except AdalError as err: logger.error('Login error!') logger.error(err)
def _config_env_public_azure(_): from adal.adal_error import AdalError from azure.cli.core.commands.client_factory import get_mgmt_service_client from azure.mgmt.resource import ResourceManagementClient from azure.cli.core._profile import Profile # Determine if user logged in try: list( get_mgmt_service_client(ResourceManagementClient).resources.list()) except CLIError: # Not logged in login_successful = False while not login_successful: method_index = prompt_choice_list(MSG_PROMPT_LOGIN, LOGIN_METHOD_LIST) answers['login_index'] = method_index answers['login_options'] = str(LOGIN_METHOD_LIST) profile = Profile() interactive = False username = None password = None service_principal = None tenant = None if method_index == 0: # device auth interactive = True elif method_index == 1: # username and password username = prompt('Username: '******'Password: '******'Service principal: ') tenant = prompt('Tenant: ') password = prompt_pass(msg='Client secret: ') elif method_index == 3: # skip return try: profile.find_subscriptions_on_login(interactive, username, password, service_principal, tenant) login_successful = True logger.warning('Login successful!') except AdalError as err: logger.error('Login error!') logger.error(err)
def _handle_context_configuration(): envs = _get_envs() if envs: should_configure_envs = prompt_y_n(MSG_PROMPT_MANAGE_ENVS, default='n') answers['configure_envs_prompt'] = should_configure_envs if not should_configure_envs: return env_to_configure_index = prompt_choice_list(MSG_PROMPT_WHICH_CONTEXT, envs + \ ['Create new context (not yet supported)']) answers['env_to_configure_prompt'] = env_to_configure_index if env_to_configure_index == len(envs): # The last choice was picked by the user which corresponds to 'create new context' _create_or_update_env() else: # modify existing context _create_or_update_env(envs[env_to_configure_index]) else: # no env exists so create first context _create_or_update_env('default')
def _handle_global_configuration(): # print location of global configuration print(MSG_GLOBAL_SETTINGS_LOCATION.format(GLOBAL_CONFIG_PATH)) # set up the config parsers file_config = get_config_parser() config_exists = file_config.read([GLOBAL_CONFIG_PATH]) global_config = get_config_parser() global_config.read(GLOBAL_CONFIG_PATH) should_modify_global_config = False if config_exists: # print current config and prompt to allow global config modification _print_cur_configuration(file_config) should_modify_global_config = prompt_y_n(MSG_PROMPT_MANAGE_GLOBAL, default='n') answers['modify_global_prompt'] = should_modify_global_config if not config_exists or should_modify_global_config: # no config exists yet so configure global config or user wants to modify global config output_index = prompt_choice_list(MSG_PROMPT_GLOBAL_OUTPUT, OUTPUT_LIST, default=get_default_from_config(global_config, 'core', 'output', OUTPUT_LIST)) answers['output_type_prompt'] = output_index answers['output_type_options'] = str(OUTPUT_LIST) enable_file_logging = prompt_y_n(MSG_PROMPT_FILE_LOGGING, default='n') allow_telemetry = prompt_y_n(MSG_PROMPT_TELEMETRY, default='y') answers['telemetry_prompt'] = allow_telemetry # save the global config try: global_config.add_section('core') except configparser.DuplicateSectionError: pass try: global_config.add_section('logging') except configparser.DuplicateSectionError: pass global_config.set('core', 'output', OUTPUT_LIST[output_index]['name']) global_config.set('core', 'collect_telemetry', 'yes' if allow_telemetry else 'no') global_config.set('logging', 'enable_log_file', 'yes' if enable_file_logging else 'no') set_global_config(global_config)