protected void PopulateDistributionStatus(PsCompliancePolicyBase psPolicy, PolicyStorage policyStorage)
 {
     if (ExPolicyConfigProvider.IsFFOOnline)
     {
         PolicySettingStatusHelpers.PopulatePolicyDistributionStatus(psPolicy, policyStorage, base.DataSession, this, this.executionLogger);
     }
 }
 protected override void InternalProcessRecord()
 {
     TaskLogger.LogEnter();
     if (this.RetryDistribution)
     {
         this.RetryPolicyDistribution();
     }
     else
     {
         foreach (BindingStorage bindingStorage in this.PsPolicyPresentationObject.StorageBindings)
         {
             if (bindingStorage.AppliedScopes.Any <ScopeStorage>())
             {
                 base.DataSession.Save(bindingStorage);
                 base.WriteVerbose(Strings.VerboseSaveBindingStorageObjects(bindingStorage.ToString(), this.PsPolicyPresentationObject.Name));
             }
             else
             {
                 base.DataSession.Delete(bindingStorage);
                 base.WriteVerbose(Strings.VerboseDeleteBindingStorageObjects(bindingStorage.ToString(), this.PsPolicyPresentationObject.Name));
             }
         }
         IEnumerable <RuleStorage> enumerable = Utils.LoadRuleStoragesByPolicy(base.DataSession, this.DataObject, this.RootId);
         foreach (RuleStorage ruleStorage in enumerable)
         {
             base.WriteVerbose(Strings.VerboseLoadRuleStorageObjectsForPolicy(ruleStorage.ToString(), this.DataObject.ToString()));
         }
         Utils.ThrowIfRulesInPolicyAreTooAdvanced(enumerable, this.DataObject, this, base.DataSession as IConfigurationSession);
         base.InternalProcessRecord();
         PolicySettingStatusHelpers.CheckNotificationResultsAndUpdateStatus(this, (IConfigurationSession)base.DataSession, this.OnNotifyChanges());
     }
     TaskLogger.LogExit();
 }
        protected override void InternalProcessRecord()
        {
            TaskLogger.LogEnter();
            this.RuleStorages = Utils.LoadRuleStoragesByPolicy(base.DataSession, base.DataObject, this.RootId);
            IList <BindingStorage> list = Utils.LoadBindingStoragesByPolicy(base.DataSession, base.DataObject);

            foreach (RuleStorage ruleStorage in this.RuleStorages)
            {
                base.WriteVerbose(Strings.VerboseLoadRuleStorageObjectsForPolicy(ruleStorage.ToString(), base.DataObject.ToString()));
            }
            if (!this.ShouldSoftDeleteObject())
            {
                Utils.RemovePolicyStorageBase(base.DataSession, new WriteVerboseDelegate(base.WriteVerbose), this.RuleStorages);
                Utils.RemovePolicyStorageBase(base.DataSession, new WriteVerboseDelegate(base.WriteVerbose), list);
            }
            else
            {
                list = null;
            }
            base.InternalProcessRecord();
            if (this.ShouldSoftDeleteObject())
            {
                PolicySettingStatusHelpers.CheckNotificationResultsAndUpdateStatus(this, (IConfigurationSession)base.DataSession, this.OnNotifyChanges(list, this.RuleStorages));
            }
            TaskLogger.LogExit();
        }
Example #4
0
 protected override void InternalProcessRecord()
 {
     TaskLogger.LogEnter();
     base.InternalProcessRecord();
     PolicySettingStatusHelpers.CheckNotificationResultsAndUpdateStatus(this, (IConfigurationSession)base.DataSession, this.OnNotifyChanges());
     TaskLogger.LogExit();
 }
        public static PolicyApplyStatus GetPolicyDistributionStatus(PolicyStorage policyStorage, IList <BindingStorage> bindingStorages, IConfigDataProvider dataSession, out List <PolicyDistributionErrorDetails> distributionErrors, out DateTime?lastStatusUpdateTime)
        {
            ArgumentValidator.ThrowIfNull("policyStorage", policyStorage);
            ArgumentValidator.ThrowIfNull("bindingStorages", bindingStorages);
            ArgumentValidator.ThrowIfNull("dataSession", dataSession);
            PolicySettingStatusHelpers policySettingStatusHelpers = new PolicySettingStatusHelpers(dataSession, null, null);

            return(policySettingStatusHelpers.CalculatePolicyDistributionStatus(policyStorage, bindingStorages, dataSession, out distributionErrors, out lastStatusUpdateTime));
        }
 private void HandleNotificationErrors(string notificationError, IEnumerable <ChangeNotificationData> syncData)
 {
     if (!string.IsNullOrEmpty(notificationError))
     {
         base.WriteWarning(notificationError);
         AggregatedNotificationClients.SetNotificationResults(syncData, notificationError);
         PolicySettingStatusHelpers.CheckNotificationResultsAndUpdateStatus(this, (IConfigurationSession)base.DataSession, syncData);
     }
 }
        public static void PopulatePolicyDistributionStatus(PsCompliancePolicyBase psPolicy, PolicyStorage policyStorage, IConfigDataProvider dataSession, Task task = null, ExecutionLog logger = null)
        {
            ArgumentValidator.ThrowIfNull("psPolicy", psPolicy);
            ArgumentValidator.ThrowIfNull("policyStorage", policyStorage);
            ArgumentValidator.ThrowIfNull("dataSession", dataSession);
            PolicySettingStatusHelpers            policySettingStatusHelpers = new PolicySettingStatusHelpers(dataSession, task, logger);
            List <PolicyDistributionErrorDetails> value;
            DateTime?lastStatusUpdateTime;

            psPolicy.DistributionStatus   = policySettingStatusHelpers.CalculatePolicyDistributionStatus(policyStorage, psPolicy.StorageBindings, dataSession, out value, out lastStatusUpdateTime);
            psPolicy.LastStatusUpdateTime = lastStatusUpdateTime;
            psPolicy.DistributionResults  = new MultiValuedProperty <PolicyDistributionErrorDetails>(value);
        }
        private bool CalculatePolicyDistributionStatus(IEnumerable <UnifiedPolicyStorageBase> storageObjects, Workload?appliedWorkload, ref List <PolicyDistributionErrorDetails> distributionErrors, ref DateTime?lastStatusUpdateTime)
        {
            bool result = false;

            if (storageObjects != null)
            {
                foreach (UnifiedPolicyStorageBase unifiedPolicyStorageBase in storageObjects)
                {
                    IEnumerable <UnifiedPolicySettingStatus> statuses = PolicySettingStatusHelpers.LoadSyncStatuses(this.dataSession, Utils.GetUniversalIdentity(unifiedPolicyStorageBase), unifiedPolicyStorageBase.GetType().Name);
                    if (this.CalculatePolicyDistributionStatus(unifiedPolicyStorageBase, (appliedWorkload != null) ? appliedWorkload.Value : unifiedPolicyStorageBase.Workload, statuses, ref distributionErrors, ref lastStatusUpdateTime))
                    {
                        result = true;
                    }
                }
            }
            return(result);
        }
        private Dictionary <Workload, List <ChangeNotificationData> > GenerateSyncsForFailedBindings()
        {
            Dictionary <Workload, List <ChangeNotificationData> > dictionary = new Dictionary <Workload, List <ChangeNotificationData> >();

            using (IEnumerator <BindingStorage> enumerator = this.PsPolicyPresentationObject.StorageBindings.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    BindingStorage bindingStorage = enumerator.Current;
                    IEnumerable <UnifiedPolicySettingStatus> source = PolicySettingStatusHelpers.LoadSyncStatuses(base.DataSession, Utils.GetUniversalIdentity(bindingStorage), typeof(BindingStorage).Name);
                    bool flag = false;
                    if (source.Any((UnifiedPolicySettingStatus s) => SetCompliancePolicyBase.HasDistributionFailed(bindingStorage, s)))
                    {
                        flag = true;
                        bindingStorage.PolicyVersion = CombGuidGenerator.NewGuid();
                        if (!dictionary.ContainsKey(bindingStorage.Workload))
                        {
                            dictionary[bindingStorage.Workload] = new List <ChangeNotificationData>();
                        }
                        dictionary[bindingStorage.Workload].Add(AggregatedNotificationClients.CreateChangeData(bindingStorage.Workload, bindingStorage));
                    }
                    List <ChangeNotificationData> list = this.GenerateSyncsForFailedScopes(bindingStorage.AppliedScopes);
                    list.AddRange(this.GenerateSyncsForFailedScopes(bindingStorage.RemovedScopes));
                    if (list.Any <ChangeNotificationData>())
                    {
                        if (!dictionary.ContainsKey(bindingStorage.Workload))
                        {
                            dictionary[bindingStorage.Workload] = new List <ChangeNotificationData>();
                        }
                        dictionary[bindingStorage.Workload].AddRange(list);
                        if (!flag)
                        {
                            flag = true;
                            bindingStorage.PolicyVersion = CombGuidGenerator.NewGuid();
                            base.DataSession.Save(bindingStorage);
                            dictionary[bindingStorage.Workload].Add(AggregatedNotificationClients.CreateChangeData(bindingStorage.Workload, bindingStorage));
                        }
                    }
                    if (flag)
                    {
                        base.DataSession.Save(bindingStorage);
                    }
                }
            }
            return(dictionary);
        }
 protected override void InternalProcessRecord()
 {
     TaskLogger.LogEnter();
     this.PsPolicyPresentationObject.UpdateStorageProperties(this, base.DataSession as IConfigurationSession, true);
     base.InternalProcessRecord();
     foreach (BindingStorage bindingStorage in this.PsPolicyPresentationObject.StorageBindings)
     {
         base.DataSession.Save(bindingStorage);
         base.WriteVerbose(Strings.VerboseSaveBindingStorageObjects(bindingStorage.ToString(), this.PsPolicyPresentationObject.ToString()));
     }
     if (!base.HasErrors)
     {
         this.WriteResult();
     }
     PolicySettingStatusHelpers.CheckNotificationResultsAndUpdateStatus(this, (IConfigurationSession)base.DataSession, this.OnNotifyChanges());
     TaskLogger.LogExit();
 }
        private List <ChangeNotificationData> GenerateSyncsForFailedScopes(IEnumerable <ScopeStorage> scopeStorages)
        {
            List <ChangeNotificationData> list = new List <ChangeNotificationData>();

            foreach (ScopeStorage scopeStorage in scopeStorages)
            {
                IEnumerable <UnifiedPolicySettingStatus> enumerable = PolicySettingStatusHelpers.LoadSyncStatuses(base.DataSession, Utils.GetUniversalIdentity(scopeStorage), typeof(ScopeStorage).Name);
                foreach (UnifiedPolicySettingStatus status in enumerable)
                {
                    if (SetCompliancePolicyBase.HasDistributionFailed(scopeStorage, status))
                    {
                        scopeStorage.PolicyVersion = CombGuidGenerator.NewGuid();
                        list.Add(AggregatedNotificationClients.CreateChangeData(scopeStorage.Workload, scopeStorage));
                    }
                }
            }
            return(list);
        }
		protected override void WriteResult(IConfigurable dataObject)
		{
			PsCompliancePolicyBase psCompliancePolicyBase = this.CreatePolicyByScenario(dataObject as PolicyStorage);
			if (psCompliancePolicyBase != null)
			{
				psCompliancePolicyBase.StorageBindings = Utils.LoadBindingStoragesByPolicy(base.DataSession, dataObject as PolicyStorage);
				foreach (BindingStorage bindingStorage in psCompliancePolicyBase.StorageBindings)
				{
					base.WriteVerbose(Strings.VerboseLoadBindingStorageObjects(bindingStorage.ToString(), psCompliancePolicyBase.ToString()));
				}
				psCompliancePolicyBase.PopulateTaskProperties(this, base.DataSession as IConfigurationSession);
				if (psCompliancePolicyBase.ReadOnly)
				{
					this.WriteWarning(Strings.WarningTaskPolicyIsTooAdvancedToRead(psCompliancePolicyBase.Name));
				}
				PolicySettingStatusHelpers.PopulatePolicyDistributionStatus(psCompliancePolicyBase, dataObject as PolicyStorage, base.DataSession, this, this.executionLogger);
				base.WriteResult(psCompliancePolicyBase);
			}
		}
        internal bool CalculatePolicyDistributionStatus(UnifiedPolicyStorageBase storage, Workload appliedWorkload, IEnumerable <UnifiedPolicySettingStatus> statuses, ref List <PolicyDistributionErrorDetails> distributionErrors, ref DateTime?lastStatusUpdateTime)
        {
            bool flag = false;
            Dictionary <Workload, UnifiedPolicySettingStatus> dictionary = new Dictionary <Workload, UnifiedPolicySettingStatus>();
            Guid policyVersion = storage.PolicyVersion;

            foreach (UnifiedPolicySettingStatus unifiedPolicySettingStatus in statuses)
            {
                this.WriteVerbose(Strings.VerboseDumpStatusObject(unifiedPolicySettingStatus.Container, unifiedPolicySettingStatus.SettingType, storage.Guid.ToString(), storage.PolicyVersion.ToString(), ((UnifiedPolicyErrorCode)unifiedPolicySettingStatus.ErrorCode).ToString(), unifiedPolicySettingStatus.ObjectVersion.ToString()), false);
                if (unifiedPolicySettingStatus.ObjectVersion == policyVersion)
                {
                    Workload workloadFromString = PolicySettingStatusHelpers.GetWorkloadFromString(unifiedPolicySettingStatus.Container);
                    if (!dictionary.ContainsKey(workloadFromString))
                    {
                        dictionary.Add(workloadFromString, unifiedPolicySettingStatus);
                    }
                }
            }
            IEnumerable <Workload> enumerable = Enum.GetValues(typeof(Workload)).Cast <Workload>();

            foreach (Workload workload in enumerable)
            {
                if (workload != Workload.None && appliedWorkload.HasFlag(workload))
                {
                    UnifiedPolicySettingStatus unifiedPolicySettingStatus2;
                    dictionary.TryGetValue(workload, out unifiedPolicySettingStatus2);
                    PolicyDistributionErrorDetails policyDistributionErrorDetails = this.CreatePolicyDistributionError(workload, storage, unifiedPolicySettingStatus2);
                    flag = (flag || (unifiedPolicySettingStatus2 == null && policyDistributionErrorDetails == null));
                    if (policyDistributionErrorDetails != null)
                    {
                        distributionErrors.Add(policyDistributionErrorDetails);
                    }
                    if (unifiedPolicySettingStatus2 != null && (lastStatusUpdateTime == null || lastStatusUpdateTime.Value < unifiedPolicySettingStatus2.WhenProcessedUTC))
                    {
                        lastStatusUpdateTime = new DateTime?(unifiedPolicySettingStatus2.WhenProcessedUTC);
                    }
                }
            }
            return(flag);
        }
        protected override void InternalValidate()
        {
            Utils.ThrowIfNotRunInEOP();
            Utils.ValidateNotForestWideOrganization(base.CurrentOrganizationId);
            base.InternalValidate();
            if (this.DataObject.IsModified(ADObjectSchema.Name) && Utils.LoadPolicyStorages(base.DataSession, this.DataObject.Scenario).Any((PolicyStorage p) => p.Name.Equals((string)this.DataObject[ADObjectSchema.Name], StringComparison.InvariantCultureIgnoreCase)))
            {
                throw new CompliancePolicyAlreadyExistsException((string)this.DataObject[ADObjectSchema.Name]);
            }
            if (base.Fields.IsModified("Enabled") && this.Enabled)
            {
                IEnumerable <RuleStorage> enumerable = Utils.LoadRuleStoragesByPolicy(base.DataSession, this.DataObject, Utils.GetRootId(base.DataSession));
                foreach (RuleStorage ruleStorage in enumerable)
                {
                    base.WriteVerbose(Strings.VerboseLoadRuleStorageObjectsForPolicy(ruleStorage.ToString(), this.DataObject.ToString()));
                }
                if (enumerable.Any((RuleStorage x) => !x.IsEnabled))
                {
                    this.WriteWarning(Strings.WarningPolicyContainsDisabledRules(this.DataObject.Name));
                }
            }
            if (!this.RetryDistribution)
            {
                this.ValidateBindingParameter();
                return;
            }
            List <PolicyDistributionErrorDetails> source;
            DateTime?dateTime;

            PolicySettingStatusHelpers.GetPolicyDistributionStatus(this.DataObject, Utils.LoadBindingStoragesByPolicy(base.DataSession, this.DataObject), base.DataSession, out source, out dateTime);
            if (!source.Any((PolicyDistributionErrorDetails error) => error.ResultCode != UnifiedPolicyErrorCode.PolicySyncTimeout))
            {
                this.WriteWarning(Strings.ErrorCompliancePolicyHasNoObjectsToRetry(this.DataObject.Name));
                this.IsRetryDistributionAllowed = false;
                return;
            }
            this.IsRetryDistributionAllowed = true;
        }
        private Dictionary <Workload, List <ChangeNotificationData> > GenerateSyncsForFailedRules(IEnumerable <Workload> workloads)
        {
            Dictionary <Workload, List <ChangeNotificationData> > dictionary = new Dictionary <Workload, List <ChangeNotificationData> >();
            IList <RuleStorage> list = Utils.LoadRuleStoragesByPolicy(base.DataSession, this.DataObject, Utils.GetRootId(base.DataSession));

            foreach (RuleStorage storageObject in list)
            {
                IEnumerable <UnifiedPolicySettingStatus> syncStatuses             = PolicySettingStatusHelpers.LoadSyncStatuses(base.DataSession, Utils.GetUniversalIdentity(storageObject), typeof(RuleStorage).Name);
                Dictionary <Workload, List <ChangeNotificationData> > dictionary2 = SetCompliancePolicyBase.GenerateSyncs(syncStatuses, workloads, base.DataSession, storageObject, ConfigurationObjectType.Rule);
                foreach (Workload key in dictionary2.Keys)
                {
                    if (dictionary.ContainsKey(key))
                    {
                        dictionary[key].AddRange(dictionary2[key]);
                    }
                    else
                    {
                        dictionary[key] = dictionary2[key];
                    }
                }
            }
            return(dictionary);
        }
        private Dictionary <Workload, List <ChangeNotificationData> > GenerateSyncsForFailedPolicies(IEnumerable <Workload> workloads)
        {
            IEnumerable <UnifiedPolicySettingStatus> syncStatuses = PolicySettingStatusHelpers.LoadSyncStatuses(base.DataSession, Utils.GetUniversalIdentity(this.DataObject), typeof(PolicyStorage).Name);

            return(SetCompliancePolicyBase.GenerateSyncs(syncStatuses, workloads, base.DataSession, this.DataObject, ConfigurationObjectType.Policy));
        }
        internal PolicyDistributionErrorDetails CreatePolicyDistributionError(Workload singleWorkload, UnifiedPolicyStorageBase storage, UnifiedPolicySettingStatus status)
        {
            bool flag = false;
            UnifiedPolicyErrorCode errorCode = UnifiedPolicyErrorCode.Unknown;
            string   empty                 = string.Empty;
            DateTime lastErrorTime         = DateTime.UtcNow;
            string   additionalDiagnostics = string.Empty;

            if (status == null)
            {
                if (storage is ScopeStorage)
                {
                    flag                  = true;
                    errorCode             = UnifiedPolicyErrorCode.PolicySyncTimeout;
                    empty                 = string.Empty;
                    lastErrorTime         = DateTime.UtcNow;
                    additionalDiagnostics = (this.includeDiagnosticInfo ? Strings.DiagnoseMissingStatusForScope(storage.WhenChangedUTC.Value) : string.Empty);
                }
                else if (storage.WhenChangedUTC != null)
                {
                    DateTime dateTime = storage.WhenChangedUTC.Value.Add(PolicySettingStatusHelpers.policySyncTimeoutInterval);
                    if (dateTime < DateTime.UtcNow)
                    {
                        flag                  = true;
                        errorCode             = UnifiedPolicyErrorCode.PolicySyncTimeout;
                        empty                 = string.Empty;
                        lastErrorTime         = dateTime;
                        additionalDiagnostics = (this.includeDiagnosticInfo ? Strings.DiagnosePendingStatusTimeout(storage.WhenChangedUTC.Value, PolicySettingStatusHelpers.policySyncTimeoutInterval) : string.Empty);
                    }
                }
            }
            else if (status.ErrorCode != 0)
            {
                flag                  = true;
                errorCode             = (UnifiedPolicyErrorCode)status.ErrorCode;
                empty                 = string.Empty;
                lastErrorTime         = status.WhenProcessedUTC;
                additionalDiagnostics = (this.includeDiagnosticInfo ? status.AdditionalDiagnostics : string.Empty);
            }
            if (flag)
            {
                return(new PolicyDistributionErrorDetails(this.GetStorageObjectName(storage), storage.Guid, PolicySettingStatusHelpers.GetConfigurationObjectTypeFromString(storage.GetType().Name), singleWorkload, errorCode, empty, lastErrorTime, additionalDiagnostics));
            }
            return(null);
        }