def create_bot_json(cmd, client, resource_group_name, resource_name, app_password=None, raw_bot_properties=None): if not raw_bot_properties: raw_bot_properties = client.bots.get( resource_group_name=resource_group_name, resource_name=resource_name ) if not app_password: site_name = get_bot_site_name(raw_bot_properties.properties.endpoint) app_settings = get_app_settings( cmd=cmd, resource_group_name=resource_group_name, name=site_name ) app_password = [item['value'] for item in app_settings if item['name'] == 'MicrosoftAppPassword'][0] profile = Profile(cli_ctx=cmd.cli_ctx) return { 'type': 'abs', 'id': raw_bot_properties.name, 'name': raw_bot_properties.properties.display_name, 'appId': raw_bot_properties.properties.msa_app_id, 'appPassword': app_password, 'endpoint': raw_bot_properties.properties.endpoint, 'resourceGroup': str(resource_group_name), 'tenantId': profile.get_subscription(subscription=client.config.subscription_id)['tenantId'], 'subscriptionId': client.config.subscription_id, 'serviceName': resource_name }
def create_bot_json(cmd, client, resource_group_name, resource_name, app_password=None, raw_bot_properties=None): if not raw_bot_properties: raw_bot_properties = client.bots.get( resource_group_name=resource_group_name, resource_name=resource_name ) if not app_password: site_name = get_bot_site_name(raw_bot_properties.properties.endpoint) app_settings = get_app_settings( cmd=cmd, resource_group_name=resource_group_name, name=site_name ) app_password = [item['value'] for item in app_settings if item['name'] == 'MicrosoftAppPassword'][0] profile = Profile(cli_ctx=cmd.cli_ctx) return { 'type': 'abs', 'id': raw_bot_properties.name, 'name': raw_bot_properties.properties.display_name, 'appId': raw_bot_properties.properties.msa_app_id, 'appPassword': app_password, 'endpoint': raw_bot_properties.properties.endpoint, 'resourceGroup': str(resource_group_name), 'tenantId': profile.get_subscription(subscription=client.config.subscription_id)['tenantId'], 'subscriptionId': client.config.subscription_id }
def download_app(cmd, client, resource_group_name, resource_name, file_save_path=None): # pylint: disable=too-many-statements, too-many-locals # get the bot and ensure it's not a registration only bot raw_bot_properties = client.bots.get( resource_group_name=resource_group_name, resource_name=resource_name) if raw_bot_properties.kind == 'bot': raise CLIError( 'Source download is not supported for registration only bots') file_save_path = file_save_path or os.getcwd() if not os.path.isdir(file_save_path): raise CLIError('Path name not valid') folder_path = os.path.join(file_save_path, resource_name) if os.path.exists(folder_path): raise CLIError('The path {0} already exists. Please delete this folder or specify an alternate path'.format(folder_path)) # pylint: disable=line-too-long os.mkdir(folder_path) site_name = get_bot_site_name(raw_bot_properties.properties.endpoint) user_name, password = _get_site_credential(cmd.cli_ctx, resource_group_name, site_name, None) scm_url = _get_scm_url(cmd, resource_group_name, site_name, None) import urllib3 authorization = urllib3.util.make_headers( basic_auth='{0}:{1}'.format(user_name, password)) headers = authorization headers['content-type'] = 'application/json' # if repository folder exists, then get those contents for download import requests response = requests.get(scm_url + '/api/zip/site/clirepo/', headers=authorization) if response.status_code != 200: # try getting the bot from wwwroot instead payload = { 'command': 'PostDeployScripts\\prepareSrc.cmd {0}'.format(password), 'dir': r'site\wwwroot' } response = requests.post(scm_url + '/api/command', data=json.dumps(payload), headers=headers) check_response_status(response) response = requests.get(scm_url + '/api/vfs/site/bot-src.zip', headers=authorization) check_response_status(response) download_path = os.path.join(file_save_path, 'download.zip') with open(os.path.join(file_save_path, 'download.zip'), 'wb') as f: f.write(response.content) import zipfile zip_ref = zipfile.ZipFile(download_path) zip_ref.extractall(folder_path) zip_ref.close() os.remove(download_path) if (os.path.exists( os.path.join(folder_path, 'PostDeployScripts', 'deploy.cmd.template')) and os.path.exists(os.path.join(folder_path, 'deploy.cmd'))): shutil.copyfile( os.path.join(folder_path, 'deploy.cmd'), os.path.join(folder_path, 'PostDeployScripts', 'deploy.cmd.template')) # if the bot contains a bot bot_file_path = os.path.join(folder_path, '{0}.bot'.format(resource_name)) if os.path.exists(bot_file_path): app_settings = get_app_settings( cmd=cmd, resource_group_name=resource_group_name, name=site_name) bot_secret = [ item['value'] for item in app_settings if item['name'] == 'botFileSecret' ] # write a .env file #todo: write an appsettings.json file bot_env = { 'botFileSecret': bot_secret[0], 'botFilePath': '{0}.bot'.format(resource_name), 'NODE_ENV': 'development' } if os.path.exists(os.path.join(folder_path, 'package.json')): with open(os.path.join(folder_path, '.env'), 'w') as f: for key, value in bot_env.items(): f.write('{0}={1}\n'.format(key, value)) else: app_settings_path = os.path.join(folder_path, 'appsettings.json') existing = None if not os.path.exists(app_settings_path): existing = '{}' else: with open(app_settings_path, 'r') as f: existing = json.load(f) with open(os.path.join(app_settings_path), 'w+') as f: for key, value in bot_env.items(): existing[key] = value f.write(json.dumps(existing)) if not bot_secret: bot_env['downloadPath'] = folder_path return bot_env return {'downloadPath': folder_path}