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);
                    }
                }
            }
        }
Exemple #2
0
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            var webapp = new PSSite(WebsitesClient.GetWebApp(resourceGroupName, webAppName, slot));

            WriteObject(CmdletHelpers.GetHostNameSslStatesFromSiteResponse(webapp, Name));
        }
Exemple #3
0
        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));
                }
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
 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);
                    }
                }
            }
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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;
                                }
                            }
                        }
                    }
                }
            });
        }
Exemple #12
0
        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);
        }
Exemple #13
0
        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);
                    }
                }
            }
        }
Exemple #14
0
        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)));
        }
Exemple #17
0
        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));
        }
Exemple #18
0
        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);
                    }
                }
            }
        }
Exemple #20
0
        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);
                    }
                }
            }
        }
Exemple #22
0
        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);
        }
Exemple #23
0
        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);
                    }
                }
            }
        }
Exemple #24
0
        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);
        }