Ejemplo n.º 1
0
        public override InitialSessionState GetInitialSessionState(PSSessionConfigurationData sessionConfigurationData, PSSenderInfo senderInfo, string configProviderId)
        {
            Tracer tracer = new Tracer();

            tracer.Correlate();
            if (sessionConfigurationData != null)
            {
                if (senderInfo != null)
                {
                    if (!string.IsNullOrEmpty(configProviderId))
                    {
                        if (Interlocked.CompareExchange(ref PSWorkflowSessionConfiguration._modulesLoaded, 1, 0) == 0)
                        {
                            try
                            {
                                PSWorkflowConfigurationProvider configuration = WorkflowJobSourceAdapter.GetInstance().GetPSWorkflowRuntime().Configuration;
                                if (configuration != null)
                                {
                                    configuration.Populate(sessionConfigurationData.PrivateData, configProviderId, senderInfo);
                                    if (sessionConfigurationData.ModulesToImport != null)
                                    {
                                        foreach (string modulesToImport in sessionConfigurationData.ModulesToImport)
                                        {
                                            PSWorkflowSessionConfiguration.InitialSessionState.ImportPSModulesFromPath(modulesToImport);
                                        }
                                    }
                                }
                                else
                                {
                                    throw new InvalidOperationException("PSWorkflowConfigurationProvider is null");
                                }
                            }
                            catch (Exception exception)
                            {
                                Interlocked.CompareExchange(ref PSWorkflowSessionConfiguration._modulesLoaded, 0, 1);
                                throw;
                            }
                        }
                        if (configProviderId.ToLower(CultureInfo.InvariantCulture).Equals("http://schemas.microsoft.com/powershell/microsoft.windows.servermanagerworkflows"))
                        {
                            PSSessionConfigurationData.IsServerManager = true;
                        }
                        return(PSWorkflowSessionConfiguration.InitialSessionState);
                    }
                    else
                    {
                        throw new ArgumentNullException("configProviderId");
                    }
                }
                else
                {
                    throw new ArgumentNullException("senderInfo");
                }
            }
            else
            {
                throw new ArgumentNullException("sessionConfigurationData");
            }
        }
Ejemplo n.º 2
0
        internal void Save(WorkflowStoreComponents components, Dictionary <string, object> WorkflowContext)
        {
            Collection <object> componentsToSave = new Collection <object>();

            if ((components & WorkflowStoreComponents.JobState) == WorkflowStoreComponents.JobState)
            {
                componentsToSave.Add(PSWorkflowInstance.State);
            }

            if (WorkflowContext != null)
            {
                componentsToSave.Add(WorkflowContext);
            }

            if (((components & WorkflowStoreComponents.Definition) == WorkflowStoreComponents.Definition) &&
                (PSWorkflowInstance.PSWorkflowDefinition != null))
            {
                componentsToSave.Add(PSWorkflowInstance.PSWorkflowDefinition);
            }

            if (((components & WorkflowStoreComponents.TerminatingError) == WorkflowStoreComponents.TerminatingError) &&
                (PSWorkflowInstance.Error != null))
            {
                if (!WorkflowJobSourceAdapter.GetInstance().IsShutdownInProgress)
                {
                    if (PSWorkflowInstance.Error.GetType() != typeof(RemoteException))
                    {
                        componentsToSave.Add(PSWorkflowInstance.Error);
                    }
                }
            }

            if (((components & WorkflowStoreComponents.Metadata) == WorkflowStoreComponents.Metadata) &&
                (PSWorkflowInstance.PSWorkflowContext != null))
            {
                componentsToSave.Add(PSWorkflowInstance.PSWorkflowContext);
            }

            if (((components & WorkflowStoreComponents.Streams) == WorkflowStoreComponents.Streams) &&
                (PSWorkflowInstance.Streams != null))
            {
                componentsToSave.Add(PSWorkflowInstance.Streams);
            }

            if (((components & WorkflowStoreComponents.ActivityState) == WorkflowStoreComponents.ActivityState) &&
                (PSWorkflowInstance.RemoteActivityState != null))
            {
                componentsToSave.Add(PSWorkflowInstance.RemoteActivityState);
            }

            if (((components & WorkflowStoreComponents.Timer) == WorkflowStoreComponents.Timer) &&
                PSWorkflowInstance.Timer != null)
            {
                componentsToSave.Add(PSWorkflowInstance.Timer);
            }

            DoSave(componentsToSave);
        }
Ejemplo n.º 3
0
        private DefinitionCache()
        {
            activitiesCleanupIntervalMSec = WorkflowJobSourceAdapter.GetInstance().GetPSWorkflowRuntime().Configuration.ActivitiesCacheCleanupIntervalMSec;

            _cleanupTimer           = new System.Timers.Timer(activitiesCleanupIntervalMSec);
            _cleanupTimer.Elapsed  += HandleCleanupTimerElapsed;
            _cleanupTimer.AutoReset = false;
            _cleanupTimer.Start();
        }
Ejemplo n.º 4
0
        internal void Save(WorkflowStoreComponents components, Dictionary <string, object> WorkflowContext)
        {
            Collection <object> objs = new Collection <object>();

            if ((components & WorkflowStoreComponents.JobState) == WorkflowStoreComponents.JobState)
            {
                objs.Add(this.PSWorkflowInstance.State);
            }
            if (WorkflowContext != null)
            {
                objs.Add(WorkflowContext);
            }
            if ((components & WorkflowStoreComponents.Definition) == WorkflowStoreComponents.Definition && this.PSWorkflowInstance.PSWorkflowDefinition != null)
            {
                objs.Add(this.PSWorkflowInstance.PSWorkflowDefinition);
            }
            if ((components & WorkflowStoreComponents.TerminatingError) == WorkflowStoreComponents.TerminatingError && this.PSWorkflowInstance.Error != null && !WorkflowJobSourceAdapter.GetInstance().IsShutdownInProgress&& this.PSWorkflowInstance.Error.GetType() != typeof(RemoteException))
            {
                objs.Add(this.PSWorkflowInstance.Error);
            }
            if ((components & WorkflowStoreComponents.Metadata) == WorkflowStoreComponents.Metadata && this.PSWorkflowInstance.PSWorkflowContext != null)
            {
                objs.Add(this.PSWorkflowInstance.PSWorkflowContext);
            }
            if ((components & WorkflowStoreComponents.Streams) == WorkflowStoreComponents.Streams && this.PSWorkflowInstance.Streams != null)
            {
                objs.Add(this.PSWorkflowInstance.Streams);
            }
            if ((components & WorkflowStoreComponents.Timer) == WorkflowStoreComponents.Timer && this.PSWorkflowInstance.Timer != null)
            {
                objs.Add(this.PSWorkflowInstance.Timer);
            }
            this.DoSave(objs);
        }
Ejemplo n.º 5
0
        private IEnumerable <Job2> CreateJobsFromWorkflows(IEnumerable <Job2> workflowJobs, bool returnParents)
        {
            object                  obj  = null;
            string                  str  = null;
            string                  str1 = null;
            Guid                    guid;
            bool                    item;
            DynamicActivity         workflow;
            bool                    flag;
            ContainerParentJob      containerParentJob;
            Dictionary <Guid, Job2> guids = new Dictionary <Guid, Job2>();
            List <Job2>             job2s = new List <Job2>();

            if (workflowJobs != null)
            {
                foreach (Job2 workflowJob in workflowJobs)
                {
                    PSWorkflowJob      pSWorkflowJob      = workflowJob as PSWorkflowJob;
                    PSWorkflowInstance pSWorkflowInstance = pSWorkflowJob.PSWorkflowInstance;
                    if (!pSWorkflowInstance.JobStateRetrieved || pSWorkflowInstance.PSWorkflowContext.JobMetadata == null || pSWorkflowInstance.PSWorkflowContext.JobMetadata.Count == 0 || !WorkflowJobSourceAdapter.GetJobInfoFromMetadata(pSWorkflowInstance, out str1, out str, out guid) || !pSWorkflowInstance.PSWorkflowContext.JobMetadata.TryGetValue("ParentInstanceId", out obj))
                    {
                        continue;
                    }
                    Guid guid1 = (Guid)obj;
                    if (returnParents && !guids.ContainsKey(guid1))
                    {
                        if (!pSWorkflowInstance.PSWorkflowContext.JobMetadata.TryGetValue("ParentName", out obj))
                        {
                            continue;
                        }
                        string str2 = (string)obj;
                        if (!pSWorkflowInstance.PSWorkflowContext.JobMetadata.TryGetValue("ParentCommand", out obj))
                        {
                            continue;
                        }
                        string        str3          = (string)obj;
                        JobIdentifier jobIdentifier = base.RetrieveJobIdForReuse(guid1);
                        if (jobIdentifier != null)
                        {
                            containerParentJob = new ContainerParentJob(str3, str2, jobIdentifier, "PSWorkflowJob");
                        }
                        else
                        {
                            containerParentJob = new ContainerParentJob(str3, str2, guid1, "PSWorkflowJob");
                        }
                        ContainerParentJob containerParentJob1 = containerParentJob;
                        if (pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("ParentSessionId"))
                        {
                            pSWorkflowInstance.PSWorkflowContext.JobMetadata["ParentSessionId"] = containerParentJob1.Id;
                        }
                        guids.Add(guid1, containerParentJob1);
                    }
                    if (pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("Id"))
                    {
                        pSWorkflowInstance.PSWorkflowContext.JobMetadata["Id"] = workflowJob.Id;
                    }
                    if (pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("ProcessId"))
                    {
                        pSWorkflowInstance.PSWorkflowContext.JobMetadata["ProcessId"] = Process.GetCurrentProcess().Id;
                    }
                    workflowJob.StartParameters = new List <CommandParameterCollection>();
                    CommandParameterCollection commandParameterCollection = new CommandParameterCollection();
                    WorkflowJobSourceAdapter.AddStartParametersFromCollection(pSWorkflowInstance.PSWorkflowContext.WorkflowParameters, commandParameterCollection);
                    WorkflowJobSourceAdapter.AddStartParametersFromCollection(pSWorkflowInstance.PSWorkflowContext.PSWorkflowCommonParameters, commandParameterCollection);
                    if (!pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("WorkflowTakesPrivateMetadata"))
                    {
                        if (pSWorkflowInstance.PSWorkflowDefinition != null)
                        {
                            workflow = pSWorkflowInstance.PSWorkflowDefinition.Workflow as DynamicActivity;
                        }
                        else
                        {
                            workflow = null;
                        }
                        DynamicActivity dynamicActivity = workflow;
                        if (dynamicActivity == null)
                        {
                            flag = false;
                        }
                        else
                        {
                            flag = dynamicActivity.Properties.Contains("PSPrivateMetadata");
                        }
                        item = flag;
                    }
                    else
                    {
                        item = (bool)pSWorkflowInstance.PSWorkflowContext.JobMetadata["WorkflowTakesPrivateMetadata"];
                    }
                    if (pSWorkflowInstance.PSWorkflowContext.PrivateMetadata != null && pSWorkflowInstance.PSWorkflowContext.PrivateMetadata.Count > 0 && !item)
                    {
                        Hashtable hashtables = new Hashtable();
                        foreach (KeyValuePair <string, object> privateMetadatum in pSWorkflowInstance.PSWorkflowContext.PrivateMetadata)
                        {
                            hashtables.Add(privateMetadatum.Key, privateMetadatum.Value);
                        }
                        commandParameterCollection.Add(new CommandParameter("PSPrivateMetadata", hashtables));
                    }
                    workflowJob.StartParameters.Add(commandParameterCollection);
                    if (!returnParents)
                    {
                        job2s.Add(workflowJob);
                    }
                    else
                    {
                        ((ContainerParentJob)guids[guid1]).AddChildJob(workflowJob);
                    }
                    if (pSWorkflowJob.WorkflowInstanceLoaded)
                    {
                        continue;
                    }
                    pSWorkflowJob.RestoreFromWorkflowInstance(pSWorkflowInstance);
                }
                if (returnParents)
                {
                    foreach (Job2 value in guids.Values)
                    {
                        PSSQMAPI.InitiateWorkflowStateDataTracking(value);
                    }
                    job2s.AddRange(guids.Values);
                }
                return(job2s);
            }
            else
            {
                return(job2s);
            }
        }
Ejemplo n.º 6
0
 static WorkflowJobSourceAdapter()
 {
     WorkflowJobSourceAdapter.Instance = new WorkflowJobSourceAdapter();
 }
Ejemplo n.º 7
0
 public override IList <Job2> GetJobsByFilter(Dictionary <string, object> filter, bool recurse)
 {
     if (filter != null)
     {
         object[] objArray = new object[1];
         objArray[0] = filter;
         this._tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "WorkflowJobSourceAdapter: Getting Workflow jobs by filter: {0}", objArray));
         this.PopulateJobRepositoryIfRequired();
         Dictionary <string, object> strs = new Dictionary <string, object>(filter, StringComparer.CurrentCultureIgnoreCase);
         bool flag  = false;
         bool flag1 = true;
         if (strs.Keys.Count != 0)
         {
             var keys = strs.Keys;
             if (keys.Any <string>((string key) => {
                 if (key.Equals("Id", StringComparison.OrdinalIgnoreCase) || key.Equals("InstanceId", StringComparison.OrdinalIgnoreCase) || key.Equals("Name", StringComparison.OrdinalIgnoreCase) || key.Equals("Command", StringComparison.OrdinalIgnoreCase))
                 {
                     return(false);
                 }
                 else
                 {
                     return(!key.Equals("State", StringComparison.OrdinalIgnoreCase));
                 }
             }
                                   ))
             {
                 flag1 = false;
             }
         }
         else
         {
             flag1 = false;
         }
         List <Job2> job2s = new List <Job2>();
         if (flag1)
         {
             List <ContainerParentJob> items = this._jobRepository.GetItems();
             List <Job2> job2s1 = WorkflowJobSourceAdapter.SearchJobsOnV2Parameters(items, strs);
             items.Clear();
             if (job2s1.Count > 0)
             {
                 job2s.AddRange(job2s1);
             }
         }
         if (recurse)
         {
             if (strs.ContainsKey("Id"))
             {
                 flag = true;
             }
             if (flag)
             {
                 strs.Add("ProcessId", Process.GetCurrentProcess().Id);
             }
             if (strs.ContainsKey("State"))
             {
                 strs.Remove("State");
             }
             this.LoadWorkflowInstancesFromStore();
             IEnumerable <Job2> jobs = this.GetJobManager().GetJobs(WorkflowFilterTypes.All, strs);
             if (!filter.ContainsKey("State"))
             {
                 job2s.AddRange(jobs);
             }
             else
             {
                 List <Job2> list = jobs.Where <Job2>((Job2 job) => job.JobStateInfo.State == (JobState)LanguagePrimitives.ConvertTo(filter["State"], typeof(JobState), CultureInfo.InvariantCulture)).ToList <Job2>();
                 job2s.AddRange(list);
             }
         }
         List <Job2> job2s2 = new List <Job2>();
         foreach (Job2 job2 in job2s)
         {
             if (job2 as ContainerParentJob == null || job2s2.Contains(job2))
             {
                 PSWorkflowJob      pSWorkflowJob = job2 as PSWorkflowJob;
                 ContainerParentJob item          = this._jobRepository.GetItem((Guid)pSWorkflowJob.JobMetadata["ParentInstanceId"]);
                 if (job2s2.Contains(item))
                 {
                     continue;
                 }
                 job2s2.Add(item);
             }
             else
             {
                 job2s2.Add(job2);
             }
         }
         return(job2s2);
     }
     else
     {
         throw new ArgumentNullException("filter");
     }
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="sessionConfigurationData"></param>
        /// <param name="senderInfo"></param>
        /// <param name="configProviderId"></param>
        /// <returns></returns>
        public override InitialSessionState GetInitialSessionState(PSSessionConfigurationData sessionConfigurationData, PSSenderInfo senderInfo, string configProviderId)
        {
            Tracer structuredTracer = new Tracer();

            structuredTracer.Correlate();

            if (sessionConfigurationData == null)
            {
                throw new ArgumentNullException("sessionConfigurationData");
            }

            if (senderInfo == null)
            {
                throw new ArgumentNullException("senderInfo");
            }

            if (string.IsNullOrEmpty(configProviderId))
            {
                throw new ArgumentNullException("configProviderId");
            }

            if (Interlocked.CompareExchange(ref _modulesLoaded, ModulesLoaded, ModulesNotLoaded) == ModulesNotLoaded)
            {
                // it is sufficient if Populate() is called the first time and
                // modules are loaded once

                try
                {
                    IsWorkflowTypeEndpoint = true;

                    PSWorkflowConfigurationProvider workflowConfiguration = WorkflowJobSourceAdapter.GetInstance().GetPSWorkflowRuntime().Configuration;
                    if (workflowConfiguration == null)
                    {
                        throw new InvalidOperationException("PSWorkflowConfigurationProvider is null");
                    }

                    workflowConfiguration.Populate(sessionConfigurationData.PrivateData, configProviderId, senderInfo);

                    // now get all the modules in the specified path and import the same
                    if (sessionConfigurationData.ModulesToImport != null)
                    {
                        foreach (var module in sessionConfigurationData.ModulesToImport)
                        {
                            ModuleSpecification moduleSpec = null;
                            if (ModuleSpecification.TryParse(module, out moduleSpec))
                            {
                                var modulesToImport = new Collection <ModuleSpecification> {
                                    moduleSpec
                                };
                                InitialSessionState.ImportPSModule(modulesToImport);
                            }
                            else
                            {
                                InitialSessionState.ImportPSModule(new[] { Environment.ExpandEnvironmentVariables(module) });
                            }
                        }
                    }

                    // Start the workflow job manager, if not started, to add an event handler for zero active sessions changed events
                    // This is required to auto shutdown the workflow type shared process when no workflow jobs have scheduled/inprogress and when no active sessions
                    WorkflowJobSourceAdapter.GetInstance().GetJobManager();
                }
                catch (Exception)
                {
                    // if there is an exception in either Populate() or Importing modules
                    // we consider that it is not loaded
                    Interlocked.CompareExchange(ref _modulesLoaded, ModulesNotLoaded, ModulesLoaded);
                    throw;
                }
            }

            if (configProviderId.ToLower(CultureInfo.InvariantCulture).Equals("http://schemas.microsoft.com/powershell/microsoft.windows.servermanagerworkflows"))
            {
                PSSessionConfigurationData.IsServerManager = true;
            }

            return(InitialSessionState);
        }