public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); SiteConfig siteConfig = webApp.SiteConfig; var accessRestrictionList = TargetScmSite ? siteConfig.ScmIpSecurityRestrictions : siteConfig.IpSecurityRestrictions; IpSecurityRestriction ipSecurityRestriction = null; IDictionary <string, IList <string> > httpHeader = null; if (HttpHeader != null) { httpHeader = ConvertHeaderHashtable(HttpHeader); } int intPriority = checked ((int)Priority); switch (ParameterSetName) { case IpAddressParameterSet: ipSecurityRestriction = new IpSecurityRestriction(IpAddress, null, null, null, null, Action, null, intPriority, Name, Description, httpHeader); accessRestrictionList.Add(ipSecurityRestriction); break; case ServiceTagParameterSet: ipSecurityRestriction = new IpSecurityRestriction(ServiceTag, null, null, null, null, Action, "ServiceTag", intPriority, Name, Description, httpHeader); accessRestrictionList.Add(ipSecurityRestriction); break; case SubnetNameParameterSet: case SubnetIdParameterSet: var Subnet = ParameterSetName == SubnetNameParameterSet ? SubnetName : SubnetId; //Fetch RG of given SubNet var subNetResourceGroupName = CmdletHelpers.GetSubnetResourceGroupName(DefaultContext, Subnet, VirtualNetworkName); //If unble to fetch SubNet rg from above step, use the input RG to get validation error from api call. subNetResourceGroupName = !String.IsNullOrEmpty(subNetResourceGroupName) ? subNetResourceGroupName : ResourceGroupName; var subnetResourceId = CmdletHelpers.ValidateSubnet(Subnet, VirtualNetworkName, subNetResourceGroupName, DefaultContext.Subscription.Id); if (!IgnoreMissingServiceEndpoint) { CmdletHelpers.VerifySubnetDelegation(subnetResourceId); } ipSecurityRestriction = new IpSecurityRestriction(null, null, subnetResourceId, null, null, Action, null, intPriority, Name, Description, httpHeader); accessRestrictionList.Add(ipSecurityRestriction); break; } if (ShouldProcess(WebAppName, $"Adding Access Restriction Rule for Web App '{WebAppName}'")) { // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, WebAppName, SlotName, siteConfig); if (PassThru) { // Refresh object to get the final state webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); var accessRestrictionSettings = new PSAccessRestrictionConfig(ResourceGroupName, WebAppName, webApp.SiteConfig, SlotName); WriteObject(accessRestrictionSettings); } } } }
protected override void ProcessRecord() { base.ProcessRecord(); var webapp = new PSSite(WebsitesClient.GetWebApp(resourceGroupName, webAppName, slot)); WriteObject(CmdletHelpers.GetHostNameSslStatesFromSiteResponse(webapp, Name)); }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); User user = WebsitesClient.GetPublishingCredentials(ResourceGroupName, Name, Slot); HttpResponseMessage r; string deployUrl; string deploymentStatusUrl = user.ScmUri + "/api/deployments/latest"; if (ArchivePath.ToLower().EndsWith("war")) { deployUrl = user.ScmUri + "/api/wardeploy?isAsync=true"; } else if (ArchivePath.ToLower().EndsWith("zip") || ArchivePath.ToLower().EndsWith("jar")) { deployUrl = user.ScmUri + "/api/zipdeploy?isAsync=true"; } else { throw new Exception("Unknown archive type."); } Action zipDeployAction = () => { using (var s = File.OpenRead(ArchivePath)) { HttpClient client = new HttpClient(); var byteArray = Encoding.ASCII.GetBytes(user.PublishingUserName + ":" + user.PublishingPassword); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); HttpContent fileContent = new StreamContent(s); fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data"); r = client.PostAsync(deployUrl, fileContent).Result; int numChecks = 0; do { Thread.Sleep(TimeSpan.FromSeconds(2)); r = client.GetAsync(deploymentStatusUrl).Result; numChecks++; } while (r.StatusCode == HttpStatusCode.Accepted && numChecks < NumStatusChecks); if (r.StatusCode == HttpStatusCode.Accepted && numChecks >= NumStatusChecks) { var rec = new ErrorRecord(new Exception("Maximum status polling time exceeded. Deployment is still in progress."), string.Empty, ErrorCategory.OperationTimeout, null); WriteError(rec); } else if (r.StatusCode != HttpStatusCode.OK) { var rec = new ErrorRecord(new Exception("Deployment failed with status code " + r.StatusCode), string.Empty, ErrorCategory.InvalidResult, null); WriteError(rec); } } }; ConfirmAction(this.Force.IsPresent, $"Contents of {ArchivePath} will be deployed to the web app {Name}.", "The web app has been deployed.", Name, zipDeployAction); PSSite app = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, Slot)); WriteObject(app); }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, null)); SiteConfig siteConfig = webApp.SiteConfig; //Check for Rule existance with the given name. var givenRampUpRuleObj = siteConfig.Experiments.RampUpRules.FirstOrDefault(item => item.Name == RuleName); if (givenRampUpRuleObj != null) { if (this.ShouldProcess(this.RuleName, string.Format("Deleting Routing Rule for slot - '{0}' from Web Application - {1}", this.RuleName, this.WebAppName))) { //Remove the rule siteConfig.Experiments.RampUpRules.Remove(givenRampUpRuleObj); // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, WebAppName, null, siteConfig, null, null, null); if (PassThru.IsPresent) { WriteObject(true); } } } else { throw new ValidationMetadataException(string.Format(Properties.Resources.UpdateAndGetRoutingRuleErrorMessage, RuleName, WebAppName)); } } }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); CloningInfo cloningInfo = null; if (SourceWebApp != null) { cloningInfo = new CloningInfo { SourceWebAppId = SourceWebApp.Id, SourceWebAppLocation = SourceWebApp.Location, CloneCustomHostNames = !IgnoreCustomHostNames.IsPresent, CloneSourceControl = !IgnoreSourceControl.IsPresent, ConfigureLoadBalancing = false, AppSettingsOverrides = AppSettingsOverrides == null ? null : AppSettingsOverrides.Cast <DictionaryEntry>().ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.ToString(), StringComparer.Ordinal) }; cloningInfo = new PSCloningInfo(cloningInfo); } var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, null)); var site = new PSSite(WebsitesClient.CreateWebApp(ResourceGroupName, Name, Slot, webApp.Location, AppServicePlan == null?webApp.ServerFarmId : AppServicePlan, cloningInfo, AseName, AseResourceGroupName)); UpdateConfigIfNeeded(site); }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); string deletedSiteId = string.IsNullOrEmpty(DeletedId) ? GetDeletedSiteResourceId() : DeletedId; ResolveTargetParameters(); DeletedAppRestoreRequest restoreReq = new DeletedAppRestoreRequest() { DeletedSiteId = deletedSiteId, RecoverConfiguration = !this.RestoreContentOnly, UseDRSecondary = UseDisasterRecovery }; Action restoreAction = () => WebsitesClient.RestoreDeletedWebApp(TargetResourceGroupName, TargetName, TargetSlot, restoreReq); if (WebsitesClient.WebAppExists(TargetResourceGroupName, TargetName, TargetSlot)) { ConfirmAction(this.Force.IsPresent, "Target web app contents will be overwritten with the contents of the deleted app.", "The deleted app has been restored.", TargetName, restoreAction); } else { if (string.IsNullOrEmpty(TargetAppServicePlanName)) { throw new Exception("Target app " + TargetName + " does not exist. Specify TargetAppServicePlanName for it to be created automatically."); } AppServicePlan plan = WebsitesClient.GetAppServicePlan(TargetResourceGroupName, TargetAppServicePlanName); if (plan == null) { throw new Exception("Target App Service Plan " + TargetAppServicePlanName + " not found in target Resource Group " + TargetResourceGroupName); } try { Action createRestoreAction = () => { WebsitesClient.CreateWebApp(TargetResourceGroupName, TargetName, TargetSlot, plan.Location, TargetAppServicePlanName, null, string.Empty, string.Empty); restoreAction(); }; string confirmMsg = string.Format("This web app will be created. App Name: {0}, Resource Group: {1}", TargetName, TargetResourceGroupName); if (!string.IsNullOrEmpty(TargetSlot)) { confirmMsg += ", Slot: " + TargetSlot; } ConfirmAction(this.Force.IsPresent, confirmMsg, "The deleted app has been restored.", TargetName, createRestoreAction); } catch (Exception e) { WebsitesClient.RemoveWebApp(TargetResourceGroupName, TargetName, TargetSlot, true, true, false); throw e; } } PSSite restoredApp = new PSSite(WebsitesClient.GetWebApp(TargetResourceGroupName, TargetName, TargetSlot)); WriteObject(restoredApp); }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(Name)) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, SlotName)); var accessRestrictionConfig = new PSAccessRestrictionConfig(ResourceGroupName, Name, webApp.SiteConfig, SlotName); WriteObject(accessRestrictionConfig); } }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, null)); SiteConfig siteConfig = webApp.SiteConfig; //Check for Rule existance with the given name. var givenRampUpRuleObj = siteConfig.Experiments.RampUpRules.FirstOrDefault(item => item.Name == RuleName); if (givenRampUpRuleObj != null) { WriteObject(givenRampUpRuleObj); } else { throw new ValidationMetadataException(string.Format(Properties.Resources.UpdateAndGetRoutingRuleErrorMessage, RuleName, WebAppName)); } } }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); bool inheritConfig = false; switch (ParameterSetName) { case InputValuesParameterSet: inheritConfig = ScmSiteUseMainSiteRestrictionConfig; break; case InputObjectParameterSet: inheritConfig = InputObject.ScmSiteUseMainSiteRestrictionConfig; ResourceGroupName = InputObject.ResourceGroupName; Name = InputObject.WebAppName; SlotName = InputObject.SlotName; break; } string updateActionText = inheritConfig ? "" : "not "; if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(Name)) { if (ShouldProcess(Name, $"Update Scm Site of WebApp '{Name}' to {updateActionText}use Main Site Access Restriction Config")) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, SlotName)); SiteConfig siteConfig = webApp.SiteConfig; if (siteConfig.ScmIpSecurityRestrictionsUseMain != inheritConfig) { siteConfig.ScmIpSecurityRestrictionsUseMain = inheritConfig; // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, Name, SlotName, siteConfig); } if (PassThru) { var accessRestrictionConfig = new PSAccessRestrictionConfig(ResourceGroupName, Name, webApp.SiteConfig, SlotName); WriteObject(accessRestrictionConfig); } } } }
public PSSite GetWebApp(string resourceGroupName, string webSiteName, string slotName) { Site site = null; string qualifiedSiteName; site = CmdletHelpers.ShouldUseDeploymentSlot(webSiteName, slotName, out qualifiedSiteName) ? WrappedWebsitesClient.WebApps().GetSlot(resourceGroupName, webSiteName, slotName) : WrappedWebsitesClient.WebApps().Get(resourceGroupName, webSiteName); GetWebAppConfiguration(resourceGroupName, webSiteName, slotName, site); PSSite psSite = new PSSite(site); var AzureStorageAccounts = CmdletHelpers.ShouldUseDeploymentSlot(webSiteName, slotName, out qualifiedSiteName) ? GetAzureStorageAccounts(resourceGroupName, webSiteName, slotName, true) : GetAzureStorageAccounts(resourceGroupName, webSiteName, null, false); psSite.AzureStoragePath = AzureStorageAccounts?.Properties.ConvertToWebAppAzureStorageArray(); return(psSite); }
protected override void ProcessRecord() { base.ProcessRecord(); ConfirmAction( Force.IsPresent, string.Format(Properties.Resources.RemovingWebAppSSLBinding, Name), Properties.Resources.RemoveWebAppSSLBinding, Name, () => { var webapp = new PSSite(WebsitesClient.GetWebApp(resourceGroupName, webAppName, slot)); var hostNameSslStates = CmdletHelpers.GetHostNameSslStatesFromSiteResponse(webapp, Name).ToList(); if (hostNameSslStates.Count > 0) { var thumbprint = hostNameSslStates[0].Thumbprint; WebsitesClient.UpdateHostNameSslState(resourceGroupName, webAppName, slot, webapp.Location, Name, SslState.Disabled, null); if (!DeleteCertificate.HasValue || DeleteCertificate.Value) { var certificateResourceGroup = CmdletHelpers.GetResourceGroupFromResourceId(webapp.ServerFarmId); var certificates = CmdletHelpers.GetCertificates(this.ResourcesClient, this.WebsitesClient, certificateResourceGroup, thumbprint); if (certificates.Length > 0) { try { WebsitesClient.RemoveCertificate(certificateResourceGroup, certificates[0].Name); } catch (System.Exception e) { // This exception is thrown when there are other Ssl bindings using this certificate. Let's swallow it and continue. if (!e.Message.Contains("Conflict")) { throw e; } } } } } }); }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); var sourceApp = new PSSite(WebsitesClient.GetWebApp(InputObject.ResourceGroupName, InputObject.Name, InputObject.Slot)); SnapshotRecoverySource source = new SnapshotRecoverySource() { Location = sourceApp.Location, Id = sourceApp.Id }; SnapshotRestoreRequest recoveryReq = new SnapshotRestoreRequest() { Overwrite = true, SnapshotTime = this.InputObject.SnapshotTime.ToString("o"), RecoverConfiguration = this.RecoverConfiguration, IgnoreConflictingHostNames = true, RecoverySource = source }; Action recoverAction = () => WebsitesClient.RestoreSnapshot(ResourceGroupName, Name, Slot, recoveryReq); ConfirmAction(this.Force.IsPresent, "Web app contents will be overwritten with the contents of the snapshot.", "The snapshot has been restored.", Name, recoverAction); }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { if (ShouldProcess(WebAppName, $"Removing Access Restriction Rule '{Name}' from Web App '{WebAppName}'")) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); SiteConfig siteConfig = webApp.SiteConfig; var accessRestrictionList = TargetScmSite ? siteConfig.ScmIpSecurityRestrictions : siteConfig.IpSecurityRestrictions; IpSecurityRestriction ipSecurityRestriction = null; bool accessRestrictionExists = false; foreach (var accessRestriction in accessRestrictionList) { if (accessRestriction.Name.ToLowerInvariant() == Name.ToLowerInvariant()) { ipSecurityRestriction = accessRestriction; accessRestrictionExists = true; break; } } if (accessRestrictionExists) { accessRestrictionList.Remove(ipSecurityRestriction); } // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, WebAppName, SlotName, siteConfig); if (PassThru) { // Refresh object to get the final state webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); var accessRestrictionConfig = new PSAccessRestrictionConfig(ResourceGroupName, WebAppName, webApp.SiteConfig, SlotName); WriteObject(accessRestrictionConfig); } } } }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); if (string.IsNullOrEmpty(AppServicePlan)) { var app = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, Slot)); this.AppServicePlan = app.ServerFarmId.Split('/').Last(); } RestoreRequest request = new RestoreRequest() { StorageAccountUrl = this.StorageAccountUrl, BlobName = this.BlobName, SiteName = CmdletHelpers.GenerateSiteWithSlotName(Name, Slot), Overwrite = this.Overwrite.IsPresent, AppServicePlan = this.AppServicePlan, IgnoreConflictingHostNames = this.IgnoreConflictingHostNames.IsPresent, Databases = this.Databases, OperationType = BackupRestoreOperationType.Default }; // The id here does not actually matter. It is an artifact of the CSM API requirements. It should be possible // to restore from a backup that is no longer stored in our Backups table. WebsitesClient.RestoreSite(ResourceGroupName, Name, Slot, "1", request); }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, null)); SiteConfig siteConfig = webApp.SiteConfig; if (RoutingRule != null) { var routingRule = CmdletHelpers.ConvertToStringDictionary(RoutingRule); RampUpRule rampUpRule = new RampUpRule(); foreach (var item in routingRule) { CmdletHelpers.SetObjectProperty(rampUpRule, item.Key, item.Value); } //Check for Rule existance with the given name. var givenRampUpRuleObj = siteConfig.Experiments.RampUpRules.FirstOrDefault(item => item.Name == rampUpRule.Name); if (givenRampUpRuleObj == null) { if (this.ShouldProcess(this.WebAppName, string.Format("Creating a new Routing Rule for slot '{0}' in Web Application - {1}.", rampUpRule.Name, this.WebAppName))) { //Add the given rule to the existing config siteConfig.Experiments.RampUpRules.Add(rampUpRule); // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, WebAppName, null, siteConfig, null, null, null); //var app = WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, null); //WriteObject(app.SiteConfig.Experiments.RampUpRules.FirstOrDefault(rule => rule.Name == rampUpRule.Name)); WriteObject(rampUpRule); } } else { throw new ValidationMetadataException(string.Format(Properties.Resources.AddRoutingRuleErrorMessage, rampUpRule.Name, WebAppName)); } } } }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); SiteConfig siteConfig = null; Site site = null; string location = null; IDictionary <string, string> tags = null; switch (ParameterSetName) { case ParameterSet1Name: WebApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, null)); location = WebApp.Location; tags = WebApp.Tags; var parameters = new HashSet <string>(MyInvocation.BoundParameters.Keys, StringComparer.OrdinalIgnoreCase); if (parameters.Any(p => CmdletHelpers.SiteConfigParameters.Contains(p))) { siteConfig = new SiteConfig { DefaultDocuments = parameters.Contains("DefaultDocuments") ? DefaultDocuments : null, NetFrameworkVersion = parameters.Contains("NetFrameworkVersion") ? NetFrameworkVersion : null, PhpVersion = parameters.Contains("PhpVersion") ? PhpVersion.ToLower() == "off" ? "" : PhpVersion : null, RequestTracingEnabled = parameters.Contains("RequestTracingEnabled") ? (bool?)RequestTracingEnabled : null, HttpLoggingEnabled = parameters.Contains("HttpLoggingEnabled") ? (bool?)HttpLoggingEnabled : null, DetailedErrorLoggingEnabled = parameters.Contains("DetailedErrorLoggingEnabled") ? (bool?)DetailedErrorLoggingEnabled : null, HandlerMappings = parameters.Contains("HandlerMappings") ? HandlerMappings : null, ManagedPipelineMode = parameters.Contains("ManagedPipelineMode") ? (ManagedPipelineMode?)Enum.Parse(typeof(ManagedPipelineMode), ManagedPipelineMode) : null, WebSocketsEnabled = parameters.Contains("WebSocketsEnabled") ? (bool?)WebSocketsEnabled : null, Use32BitWorkerProcess = parameters.Contains("Use32BitWorkerProcess") ? (bool?)Use32BitWorkerProcess : null, AutoSwapSlotName = parameters.Contains("AutoSwapSlotName") ? AutoSwapSlotName : null, NumberOfWorkers = parameters.Contains("NumberOfWorkers") ? NumberOfWorkers : WebApp.SiteConfig.NumberOfWorkers }; } Hashtable appSettings = AppSettings ?? new Hashtable(); if (siteConfig == null) { siteConfig = WebApp.SiteConfig; } //According to current implementation if AppSettings parameter is provided we are overriding existing AppSettings if (WebApp.SiteConfig.AppSettings != null && AppSettings == null) { foreach (var setting in WebApp.SiteConfig.AppSettings) { appSettings[setting.Name] = setting.Value; } } if (ContainerImageName != null) { string dockerImage = CmdletHelpers.DockerImagePrefix + ContainerImageName; if (WebApp.IsXenon.GetValueOrDefault()) { siteConfig.WindowsFxVersion = dockerImage; } else if (WebApp.Reserved.GetValueOrDefault()) { siteConfig.LinuxFxVersion = dockerImage; } } if (ContainerRegistryUrl != null) { appSettings[CmdletHelpers.DocerRegistryServerUrl] = ContainerRegistryUrl; } if (ContainerRegistryUser != null) { appSettings[CmdletHelpers.DocerRegistryServerUserName] = ContainerRegistryUser; } if (ContainerRegistryPassword != null) { appSettings[CmdletHelpers.DocerRegistryServerPassword] = ContainerRegistryPassword.ConvertToString(); } if (parameters.Contains("EnableContainerContinuousDeployment")) { if (EnableContainerContinuousDeployment) { appSettings[CmdletHelpers.DockerEnableCI] = "true"; } else { appSettings.Remove(CmdletHelpers.DockerEnableCI); } } // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, location, Name, null, siteConfig, appSettings.ConvertToStringDictionary(), ConnectionStrings.ConvertToConnectionStringDictionary(), AzureStoragePath.ConvertToAzureStorageAccountPathPropertyDictionary()); //Update WebApp object after configuration update WebApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, null)); if (parameters.Any(p => CmdletHelpers.SiteParameters.Contains(p))) { site = new Site { Location = location, Tags = tags, ServerFarmId = WebApp.ServerFarmId, Identity = parameters.Contains("AssignIdentity") ? AssignIdentity ? new ManagedServiceIdentity("SystemAssigned", null, null) : new ManagedServiceIdentity("None", null, null) : WebApp.Identity, HttpsOnly = parameters.Contains("HttpsOnly") ? HttpsOnly : WebApp.HttpsOnly }; WebsitesClient.UpdateWebApp(ResourceGroupName, location, Name, null, WebApp.ServerFarmId, new PSSite(site)); } if (parameters.Contains("AppServicePlan")) { // AzureStorage path is not a part of the back end siteObject, but if the PSSite Object is given as an input, so simply set this to null WebApp.AzureStoragePath = null; WebsitesClient.UpdateWebApp(ResourceGroupName, location, Name, null, AppServicePlan, WebApp); } if (parameters.Contains("HostNames")) { WebsitesClient.AddCustomHostNames(ResourceGroupName, location, Name, HostNames); } break; case ParameterSet2Name: // Web app is direct or pipeline input string servicePlanName; string rg; location = WebApp.Location; siteConfig = WebApp.SiteConfig; // Update web app configuration WebsitesClient.UpdateWebAppConfiguration( ResourceGroupName, location, Name, null, siteConfig, WebApp.SiteConfig == null ? null : WebApp.SiteConfig .AppSettings .ToDictionary( nvp => nvp.Name, nvp => nvp.Value, StringComparer.OrdinalIgnoreCase), WebApp.SiteConfig?.ConnectionStrings .ToDictionary( nvp => nvp.Name, nvp => new ConnStringValueTypePair { Type = nvp.Type.Value, Value = nvp.ConnectionString }, StringComparer.OrdinalIgnoreCase)); CmdletHelpers.TryParseAppServicePlanMetadataFromResourceId(WebApp.ServerFarmId, out rg, out servicePlanName); // AzureStorage path is not a part of the back end siteObject, but if the PSSite Object is given as an input, we will some value for this WebApp.AzureStoragePath = null; WebsitesClient.UpdateWebApp(ResourceGroupName, location, Name, null, servicePlanName, WebApp); WebsitesClient.AddCustomHostNames(ResourceGroupName, location, Name, WebApp.HostNames.ToArray()); break; } WriteObject(new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, Name, null))); }
protected override void ProcessRecord() { if (ParameterSetName != ParameterSet1Name && ParameterSetName != ParameterSet2Name && ParameterSetName != ParameterSet3Name && ParameterSetName != ParameterSet4Name) { throw new ValidationMetadataException("Please input web app and certificate."); } if (ParameterSetName == ParameterSet3Name || ParameterSetName == ParameterSet4Name) { CmdletHelpers.ExtractWebAppPropertiesFromWebApp(WebApp, out resourceGroupName, out webAppName, out slot); } else { resourceGroupName = ResourceGroupName; webAppName = WebAppName; slot = Slot; } string thumbPrint = null; var webapp = new PSSite(WebsitesClient.GetWebApp(resourceGroupName, webAppName, slot)); switch (ParameterSetName) { case ParameterSet1Name: case ParameterSet3Name: var certificateBytes = File.ReadAllBytes(CertificateFilePath); var certificateDetails = new X509Certificate2(certificateBytes, CertificatePassword); var certificateName = GenerateCertName(certificateDetails.Thumbprint, webapp.HostingEnvironmentProfile != null ? webapp.HostingEnvironmentProfile.Name : null, webapp.Location, resourceGroupName); var certificate = new Certificate( webapp.Location, pfxBlob: certificateBytes, password: CertificatePassword, hostingEnvironmentProfile: (webapp.HostingEnvironmentProfile != null) ? webapp.HostingEnvironmentProfile : null); var certificateResourceGroup = CmdletHelpers.GetResourceGroupFromResourceId(webapp.ServerFarmId); try { WebsitesClient.CreateCertificate(certificateResourceGroup, certificateName, certificate); } catch (CloudException e) { // This exception is thrown when certificate already exists. Let's swallow it and continue. if (e.Response.StatusCode != HttpStatusCode.Conflict) { throw; } } thumbPrint = certificateDetails.Thumbprint; break; case ParameterSet2Name: case ParameterSet4Name: thumbPrint = Thumbprint; break; } WriteObject(CmdletHelpers.GetHostNameSslStatesFromSiteResponse( WebsitesClient.UpdateHostNameSslState( resourceGroupName, webAppName, slot, webapp.Location, Name, SslState.HasValue ? SslState.Value : Management.WebSites.Models.SslState.SniEnabled, thumbPrint), Name)); }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { string certName = null; HttpStatusCode statusCode = HttpStatusCode.OK; var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, Slot)); var location = webApp.Location; var certificate = new Certificate( webApp.Location, type: "Microsoft.Web/certificates", canonicalName: HostName, password: "", serverFarmId: webApp.ServerFarmId); PSCertificate createdCertdetails = new PSCertificate(certificate); if (this.ShouldProcess(this.WebAppName, string.Format($"Creating an App service managed certificate for Web App '{WebAppName}'"))) { try { //Default certName is HostName certName = Name != null ? Name : HostName; createdCertdetails = new PSCertificate(WebsitesClient.CreateCertificate(ResourceGroupName, certName, certificate)); } catch (DefaultErrorResponseException e) { statusCode = e.Response.StatusCode; // 'Conflict' exception is thrown when certificate already exists. Let's swallow it and continue. //'Accepted' exception is thrown by default for create cert method. if (e.Response.StatusCode != HttpStatusCode.Conflict && e.Response.StatusCode != HttpStatusCode.Accepted) { throw; } if (e.Response.StatusCode == HttpStatusCode.Accepted) { var poll_url = e.Response.Headers["Location"].FirstOrDefault(); var token = WebsitesClient.GetAccessToken(DefaultContext); HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token.AccessToken); HttpResponseMessage r; int numChecks = 0; do { Thread.Sleep(TimeSpan.FromSeconds(5)); r = client.GetAsync(poll_url).Result; numChecks++; } while (r.StatusCode == HttpStatusCode.Accepted && numChecks < NumStatusChecks); if (r.StatusCode == HttpStatusCode.Accepted && numChecks >= NumStatusChecks) { var rec = new ErrorRecord(new Exception(string.Format($"The creation of the managed certificate '{this.HostName}' is taking longer than expected." + $" Please re-try the operation '{CreateInputCommand()}'")), string.Empty, ErrorCategory.OperationTimeout, null); WriteError(rec); } } } createdCertdetails = new PSCertificate(WebsitesClient.GetCertificate(ResourceGroupName, certName)); //Add only when user is opted for Binding if (AddBinding) { WebsitesClient.UpdateHostNameSslState(ResourceGroupName, WebAppName, Slot, webApp.Location, HostName, SslState.HasValue ? SslState.Value : Management.WebSites.Models.SslState.SniEnabled, createdCertdetails.Thumbprint); } WriteObject(createdCertdetails); } } }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { if (ShouldProcess(WebAppName, $"Removing Access Restriction Rule from Web App '{WebAppName}'")) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); SiteConfig siteConfig = webApp.SiteConfig; var accessRestrictionList = TargetScmSite ? siteConfig.ScmIpSecurityRestrictions : siteConfig.IpSecurityRestrictions; IpSecurityRestriction ipSecurityRestriction = null; bool accessRestrictionExists = false; foreach (var accessRestriction in accessRestrictionList) { if (!string.IsNullOrWhiteSpace(Name)) { if (!string.IsNullOrWhiteSpace(accessRestriction.Name) && accessRestriction.Name.ToLowerInvariant() == Name.ToLowerInvariant() && accessRestriction.Action.ToLowerInvariant() == Action.ToLowerInvariant()) { ipSecurityRestriction = accessRestriction; accessRestrictionExists = true; break; } } else if (!string.IsNullOrWhiteSpace(IpAddress)) { if (!string.IsNullOrWhiteSpace(accessRestriction.IpAddress) && accessRestriction.IpAddress.ToLowerInvariant() == IpAddress.ToLowerInvariant() && accessRestriction.Action.ToLowerInvariant() == Action.ToLowerInvariant()) { if (!string.IsNullOrWhiteSpace(Name)) { if (!string.IsNullOrWhiteSpace(accessRestriction.Name) && accessRestriction.Name.ToLowerInvariant() == Name.ToLowerInvariant() && accessRestriction.Action.ToLowerInvariant() == Action.ToLowerInvariant()) { continue; } } ipSecurityRestriction = accessRestriction; accessRestrictionExists = true; break; } } else if (!string.IsNullOrWhiteSpace(SubnetId) || (!string.IsNullOrWhiteSpace(SubnetName) && !string.IsNullOrWhiteSpace(VirtualNetworkName))) { var subnet = !string.IsNullOrWhiteSpace(SubnetId) ? SubnetId : SubnetName; var subnetResourceId = CmdletHelpers.ValidateSubnet(subnet, VirtualNetworkName, ResourceGroupName, DefaultContext.Subscription.Id); if (!string.IsNullOrWhiteSpace(accessRestriction.VnetSubnetResourceId) && accessRestriction.VnetSubnetResourceId.ToLowerInvariant() == subnetResourceId.ToLowerInvariant() && accessRestriction.Action.ToLowerInvariant() == Action.ToLowerInvariant()) { if (!string.IsNullOrWhiteSpace(Name)) { if (!string.IsNullOrWhiteSpace(accessRestriction.Name) && accessRestriction.Name.ToLowerInvariant() == Name.ToLowerInvariant() && accessRestriction.Action.ToLowerInvariant() == Action.ToLowerInvariant()) { continue; } } ipSecurityRestriction = accessRestriction; accessRestrictionExists = true; break; } } } if (accessRestrictionExists) { accessRestrictionList.Remove(ipSecurityRestriction); } // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, WebAppName, SlotName, siteConfig); if (PassThru) { // Refresh object to get the final state webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); var accessRestrictionConfig = new PSAccessRestrictionConfig(ResourceGroupName, WebAppName, webApp.SiteConfig, SlotName); WriteObject(accessRestrictionConfig); } } } }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { string kvId = string.Empty, kvRgName = string.Empty, kvSubscriptionId = string.Empty; var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, Slot)); var location = webApp.Location; var serverFarmId = webApp.ServerFarmId; var keyvaultResources = this.ResourcesClient.ResourceManagementClient.FilterResources(new FilterResourcesOptions { ResourceType = "Microsoft.KeyVault/Vaults" }).ToArray(); foreach (var kv in keyvaultResources) { if (kv.Name == KeyVaultName) { kvId = kv.Id; kvRgName = kv.ResourceGroupName; break; } } if (string.IsNullOrEmpty(kvId)) { kvId = KeyVaultName; if (CmdletHelpers.IsValidAKVResourceId(kvId)) { var details = CmdletHelpers.GetResourceDetailsFromResourceId(kvId); kvRgName = details.ResourceGroupName; KeyVaultName = details.ResourceName; kvSubscriptionId = details.Subscription; } else //default to AppService RG { kvRgName = ResourceGroupName; } } var kvpermission = CmdletHelpers.CheckServicePrincipalPermissions(this.ResourcesClient, this.KeyvaultClient, kvRgName, KeyVaultName, kvSubscriptionId); var lnk = "https://azure.github.io/AppService/2016/05/24/Deploying-Azure-Web-App-Certificate-through-Key-Vault.html"; if (kvpermission.ToLower() != "get") { WriteWarning("Unable to verify Key Vault permissions."); WriteWarning("You may need to grant Microsoft.Azure.WebSites service principal the Secret:Get permission"); WriteWarning(string.Format("Find more details here: '{0}'", lnk)); } Certificate kvc = null; var certificate = new Certificate( location: location, keyVaultId: kvId, password: "", keyVaultSecretName: CertName, serverFarmId: serverFarmId ); if (this.ShouldProcess(this.WebAppName, string.Format($"Importing keyvault certificate for Web App '{WebAppName}'"))) { try { kvc = WebsitesClient.CreateCertificate(ResourceGroupName, CertName, certificate); } catch (DefaultErrorResponseException e) { if (e.Response.StatusCode != HttpStatusCode.Conflict) { throw e; } } } WriteObject(kvc); } }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); SiteConfig siteConfig = webApp.SiteConfig; var accessRestrictionList = TargetScmSite ? siteConfig.ScmIpSecurityRestrictions : siteConfig.IpSecurityRestrictions; IpSecurityRestriction ipSecurityRestriction = null; IDictionary <string, IList <string> > httpHeader = null; if (HttpHeader != null) { httpHeader = ConvertHeaderHashtable(HttpHeader); } int intPriority = checked ((int)Priority); switch (ParameterSetName) { case IpAddressParameterSet: CheckDuplicateIPRestriction(IpAddress, accessRestrictionList); ipSecurityRestriction = new IpSecurityRestriction(IpAddress, null, null, null, null, Action, null, intPriority, Name, Description, httpHeader); accessRestrictionList.Add(ipSecurityRestriction); break; case ServiceTagParameterSet: CheckDuplicateIPRestriction(ServiceTag, accessRestrictionList); ipSecurityRestriction = new IpSecurityRestriction(ServiceTag, null, null, null, null, Action, "ServiceTag", intPriority, Name, Description, httpHeader); accessRestrictionList.Add(ipSecurityRestriction); break; case SubnetNameParameterSet: case SubnetIdParameterSet: var subnet = ParameterSetName == SubnetNameParameterSet ? SubnetName : SubnetId; //Fetch RG of given SubNet var subNetResourceGroupName = NetworkClient.GetSubnetResourceGroupName(subnet, VirtualNetworkName); //If unble to fetch SubNet rg from above step, use the input RG to get validation error from api call. subNetResourceGroupName = !String.IsNullOrEmpty(subNetResourceGroupName) ? subNetResourceGroupName : ResourceGroupName; var subnetResourceId = NetworkClient.ValidateSubnet(subnet, VirtualNetworkName, subNetResourceGroupName, DefaultContext.Subscription.Id); CheckDuplicateServiceEndpointRestriction(subnetResourceId, accessRestrictionList); if (!IgnoreMissingServiceEndpoint) { var subnetSubcriptionId = CmdletHelpers.GetSubscriptionIdFromResourceId(subnetResourceId); if (subnetSubcriptionId != DefaultContext.Subscription.Id) { throw new Exception("Service endpoint cannot be validated. Subnet is in another subscription. Use -IgnoreMissingServiceEndpoint and manually verify that 'Microsoft.Web' service endpoint is enabled on the subnet."); } var serviceEndpointServiceName = "Microsoft.Web"; var serviceEndpointLocations = new List <string>() { "*" }; NetworkClient.EnsureSubnetServiceEndpoint(subnetResourceId, serviceEndpointServiceName, serviceEndpointLocations); } ipSecurityRestriction = new IpSecurityRestriction(null, null, subnetResourceId, null, null, Action, null, intPriority, Name, Description, httpHeader); accessRestrictionList.Add(ipSecurityRestriction); break; } if (ShouldProcess(WebAppName, $"Adding Access Restriction Rule for Web App '{WebAppName}'")) { // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, WebAppName, SlotName, siteConfig); if (PassThru) { // Refresh object to get the final state webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); var accessRestrictionSettings = new PSAccessRestrictionConfig(ResourceGroupName, WebAppName, webApp.SiteConfig, SlotName); WriteObject(accessRestrictionSettings); } } } }
public async Task CreateWithSimpleParameters(IAsyncCmdlet adapter) { var parameters = new Parameters(this); var client = new WebClient(DefaultContext); var output = await client.RunAsync(client.SubscriptionId, parameters, adapter); output.SiteConfig = WebsitesClient .WrappedWebsitesClient .WebApps() .GetConfiguration(output.ResourceGroup, output.Name) .ConvertToSiteConfig(); try { var appSettings = WebsitesClient .WrappedWebsitesClient .WebApps() .ListApplicationSettings(output.ResourceGroup, output.Name); output.SiteConfig.AppSettings = appSettings .Properties .Select(s => new NameValuePair { Name = s.Key, Value = s.Value }) .ToList(); var connectionStrings = WebsitesClient.WrappedWebsitesClient.WebApps().ListConnectionStrings( output.ResourceGroup, output.Name); output.SiteConfig.ConnectionStrings = connectionStrings .Properties .Select(s => new ConnStringInfo() { Name = s.Key, ConnectionString = s.Value.Value, Type = s.Value.Type }).ToList(); } catch { //ignore if this call fails as it will for reader RBAC } string userName = null, password = null; try { var scmHostName = output.EnabledHostNames.FirstOrDefault(s => s.Contains(".scm.")); if (!string.IsNullOrWhiteSpace(scmHostName)) { var profile = await WebsitesClient.WrappedWebsitesClient.WebApps.ListPublishingProfileXmlWithSecretsAsync(output.ResourceGroup, output.Name, new CsmPublishingProfileOptions { Format = "WebDeploy" }); var doc = new XmlDocument(); doc.Load(profile); userName = doc.SelectSingleNode("//publishProfile[@publishMethod=\"MSDeploy\"]/@userName").Value; password = doc.SelectSingleNode("//publishProfile[@publishMethod=\"MSDeploy\"]/@userPWD").Value; var newOutput = new PSSite(output) { GitRemoteUri = $"https://{scmHostName}", GitRemoteUsername = userName, GitRemotePassword = SecureStringExtensions.ConvertToSecureString(password) }; output = newOutput; var git = new GitCommand(SessionState.Path, GitRepositoryPath); var repository = await git.VerifyGitRepository(); if (repository != null) { if (!await git.CheckExistence()) { adapter.WriteWarning(git.InstallationInstructions); } else if (!string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password)) { await git.AddRemoteRepository("azure", $"https://{userName}:{password}@{scmHostName}"); adapter.WriteVerbose(Properties.Resources.GitRemoteMessage); newOutput.GitRemoteName = "azure"; } } } } catch (Exception exception) { // do not write errors for problems with adding git repository var repoPath = GitRepositoryPath ?? SessionState?.Path?.CurrentFileSystemLocation?.Path; adapter.WriteWarning(string.Format( Properties.Resources.GitRemoteAddFailure, repoPath, exception.Message)); } adapter.WriteObject(output); }
public override void ExecuteCmdlet() { if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName)) { var webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); SiteConfig siteConfig = webApp.SiteConfig; var accessRestrictionList = TargetScmSite ? siteConfig.ScmIpSecurityRestrictions : siteConfig.IpSecurityRestrictions; IpSecurityRestriction ipSecurityRestriction = null; bool accessRestrictionExists = false; int intPriority = checked ((int)Priority); switch (ParameterSetName) { case IpAddressParameterSet: foreach (var accessRestriction in accessRestrictionList) { if (accessRestriction.IpAddress != null && accessRestriction.IpAddress == IpAddress && accessRestriction.Action.ToLowerInvariant() == Action.ToLowerInvariant()) { accessRestrictionExists = true; accessRestriction.Name = Name; accessRestriction.Priority = intPriority; accessRestriction.Description = Description; break; } } if (!accessRestrictionExists) { ipSecurityRestriction = new IpSecurityRestriction(IpAddress, null, null, null, null, Action, null, intPriority, Name, Description); accessRestrictionList.Add(ipSecurityRestriction); } break; case SubnetNameParameterSet: case SubnetIdParameterSet: var Subnet = ParameterSetName == SubnetNameParameterSet ? SubnetName : SubnetId; //Fetch RG of given SubNet var subNetResourceGroupName = CmdletHelpers.GetSubnetResourceGroupName(DefaultContext, Subnet, VirtualNetworkName); //If unble to fetch SubNet rg from above step, use the input RG to get validation error from api call. subNetResourceGroupName = !String.IsNullOrEmpty(subNetResourceGroupName) ? subNetResourceGroupName : ResourceGroupName; var subnetResourceId = CmdletHelpers.ValidateSubnet(Subnet, VirtualNetworkName, subNetResourceGroupName, DefaultContext.Subscription.Id); if (!IgnoreMissingServiceEndpoint) { CmdletHelpers.VerifySubnetDelegation(subnetResourceId); } foreach (var accessRestriction in accessRestrictionList) { if (accessRestriction.VnetSubnetResourceId != null && accessRestriction.VnetSubnetResourceId.ToLowerInvariant() == subnetResourceId.ToLowerInvariant() && accessRestriction.Action.ToLowerInvariant() == Action.ToLowerInvariant()) { accessRestrictionExists = true; accessRestriction.Name = Name; accessRestriction.Priority = intPriority; accessRestriction.Description = Description; break; } } if (!accessRestrictionExists) { ipSecurityRestriction = new IpSecurityRestriction(null, null, subnetResourceId, null, null, Action, null, intPriority, Name, Description); accessRestrictionList.Add(ipSecurityRestriction); } break; } string updateAction = accessRestrictionExists ? "Updating" : "Adding"; if (ShouldProcess(WebAppName, $"{updateAction} Access Restriction Rule '{Name}' for Web App '{WebAppName}'")) { // Update web app configuration WebsitesClient.UpdateWebAppConfiguration(ResourceGroupName, webApp.Location, WebAppName, SlotName, siteConfig); if (PassThru) { // Refresh object to get the final state webApp = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, SlotName)); var accessRestrictionSettings = new PSAccessRestrictionConfig(ResourceGroupName, WebAppName, webApp.SiteConfig, SlotName); WriteObject(accessRestrictionSettings); } } } }
public async Task CreateWithSimpleParameters(ICmdletAdapter adapter) { ResourceGroupName = ResourceGroupName ?? Name; AppServicePlan = AppServicePlan ?? Name; string planResourceGroup = ResourceGroupName; string planName = AppServicePlan; var rgStrategy = ResourceGroupStrategy.CreateResourceGroupConfig(ResourceGroupName); ResourceConfig <ResourceGroup> planRG = rgStrategy; if (MyInvocation.BoundParameters.ContainsKey(nameof(AppServicePlan))) { if (!TryGetServerFarmFromResourceId(AppServicePlan, out planResourceGroup, out planName)) { planResourceGroup = ResourceGroupName; planName = AppServicePlan; } planRG = ResourceGroupStrategy.CreateResourceGroupConfig(planResourceGroup); } else { var farm = await GetDefaultServerFarm(Location); if (farm != null) { planResourceGroup = farm.ResourceGroup; planName = farm.Name; planRG = ResourceGroupStrategy.CreateResourceGroupConfig(planResourceGroup); } } var farmStrategy = planRG.CreateServerFarmConfig(planResourceGroup, planName); var siteStrategy = rgStrategy.CreateSiteConfig(farmStrategy, Name); var client = new WebClient(DefaultContext); var current = await siteStrategy.GetStateAsync(client, default(CancellationToken)); if (!MyInvocation.BoundParameters.ContainsKey(nameof(Location))) { Location = current.GetLocation(siteStrategy) ?? "East US"; } var engine = new SdkEngine(DefaultContext.Subscription.Id); var target = siteStrategy.GetTargetState(current, engine, Location); var endState = await siteStrategy.UpdateStateAsync(client, target, default(CancellationToken), adapter, adapter.ReportTaskProgress); var output = endState.Get(siteStrategy) ?? current.Get(siteStrategy); output.SiteConfig = WebsitesClient.WrappedWebsitesClient.WebApps().GetConfiguration(output.ResourceGroup, output.Name).ConvertToSiteConfig(); try { var appSettings = WebsitesClient.WrappedWebsitesClient.WebApps().ListApplicationSettings(output.ResourceGroup, output.Name); output.SiteConfig.AppSettings = appSettings.Properties.Select(s => new NameValuePair { Name = s.Key, Value = s.Value }).ToList(); var connectionStrings = WebsitesClient.WrappedWebsitesClient.WebApps().ListConnectionStrings(output.ResourceGroup, output.Name); output.SiteConfig.ConnectionStrings = connectionStrings .Properties .Select(s => new ConnStringInfo() { Name = s.Key, ConnectionString = s.Value.Value, Type = s.Value.Type }).ToList(); } catch { //ignore if this call fails as it will for reader RBAC } string userName = null, password = null; try { var scmHostName = output.EnabledHostNames.FirstOrDefault(s => s.Contains(".scm.")); if (!string.IsNullOrWhiteSpace(scmHostName)) { var profile = await WebsitesClient.WrappedWebsitesClient.WebApps.ListPublishingProfileXmlWithSecretsAsync(output.ResourceGroup, output.Name, new CsmPublishingProfileOptions { Format = "WebDeploy" }); var doc = new XmlDocument(); doc.Load(profile); userName = doc.SelectSingleNode("//publishProfile[@publishMethod=\"MSDeploy\"]/@userName").Value; password = doc.SelectSingleNode("//publishProfile[@publishMethod=\"MSDeploy\"]/@userPWD").Value; var newOutput = new PSSite(output) { GitRemoteUri = $"https://{scmHostName}", GitRemoteUsername = userName, GitRemotePassword = SecureStringExtensions.ConvertToSecureString(password) }; output = newOutput; var git = new GitCommand(adapter.SessionState.Path, GitRepositoryPath); var repository = await git.VerifyGitRepository(); if (repository != null) { if (!await git.CheckExistence()) { adapter.WriteWarningAsync(git.InstallationInstructions); } else if (!string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password)) { await git.AddRemoteRepository("azure", $"https://{userName}:{password}@{scmHostName}"); adapter.WriteVerboseAsync(Microsoft.Azure.Commands.WebApps.Properties.Resources.GitRemoteMessage); newOutput.GitRemoteName = "azure"; } } } } catch (Exception exception) { // do not write errors for problems with adding git repository var repoPath = GitRepositoryPath ?? adapter?.SessionState?.Path?.CurrentFileSystemLocation?.Path; adapter.WriteWarningAsync(String.Format(Microsoft.Azure.Commands.WebApps.Properties.Resources.GitRemoteAddFailure, repoPath, exception.Message)); } adapter.WriteObjectAsync(output); }