Src/Templates.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Collections;
using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Xml;
using System.IO;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Subscriptions;
using Microsoft.EnterpriseManagement.Monitoring;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Configuration.IO;
using Microsoft.EnterpriseManagement.ConnectorFramework;
using System.Text.RegularExpressions;
 
namespace SMLets
{
    #region GetSCSMObjectTemplate
    [Cmdlet(VerbsCommon.Get, "SCSMObjectTemplate", DefaultParameterSetName = "Name")]
    public class GetSCSMObjectTemplateCommand : EntityTypeHelper
    {
        private Guid[] _id = null;
        [Parameter(ParameterSetName = "Id")]
        public Guid[] Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private string[] _displayName = null;
        [Parameter(ParameterSetName = "DisplayName")]
        public string[] DisplayName
        {
            get { return _displayName; }
            set { _displayName = value; }
        }
 
        protected override void ProcessRecord()
        {
            if (ParameterSetName == "Id")
            {
                foreach (Guid i in Id)
                {
                    try { WriteObject(_mg.Templates.GetObjectTemplate(i)); }
                    catch (ObjectNotFoundException e) { WriteError(new ErrorRecord(e, "ObjectTemplate not found", ErrorCategory.ObjectNotFound, Id)); }
                    catch (Exception e) { WriteError(new ErrorRecord(e, "Unknown error", ErrorCategory.NotSpecified, i)); }
                }
            }
 
            else if (ParameterSetName == "DisplayName")
            {
                foreach (string n in DisplayName)
                {
                    Regex r = new Regex(n, RegexOptions.IgnoreCase);
                    foreach (ManagementPackObjectTemplate o in _mg.Templates.GetObjectTemplates())
                    {
                        if (r.Match(o.DisplayName).Success)
                        {
                            WriteObject(o);
                        }
                    }
                }
            }
            else
            {
                if (Name == null)
                {
                    foreach (ManagementPackObjectTemplate ot in _mg.Templates.GetObjectTemplates())
                    {
                        WriteObject(ot);
                    }
                }
                else
                {
                    Regex r = new Regex(Name, RegexOptions.IgnoreCase);
                    foreach (ManagementPackObjectTemplate ot in _mg.Templates.GetObjectTemplates())
                    {
                        if (r.Match(ot.Name).Success) { WriteObject(ot); }
                    }
                }
            }
 
        }
    }
    #endregion
 
    #region NewSCSMObjectTemplate
    [Cmdlet(VerbsCommon.New, "SCSMObjectTemplate", SupportsShouldProcess = true,DefaultParameterSetName="Projection")]
    public class NewSCSMObjectTemplateCommand : SMCmdletBase
    {
        private string _displayName;
        [Parameter(Position=0, Mandatory=true, ValueFromPipeline = true)]
        public string DisplayName
        {
            get { return _displayName; }
            set { _displayName = value; }
        }
 
        private ManagementPack _managementPack;
        [Parameter(Position = 1, Mandatory = true)]
        public ManagementPack ManagementPack
        {
            get { return _managementPack; }
            set
            {
                if (value.Sealed)
                {
                    throw (new ArgumentException("ManagementPack must not be sealed"));
                }
                else
                {
                    _managementPack = value;
                }
            }
        }
        private ManagementPackClass _class;
        [Parameter(Position = 2, Mandatory = true, ParameterSetName = "Class")]
        public ManagementPackClass Class
        {
            get { return _class; }
            set { _class = value; }
        }
        private ManagementPackTypeProjection _projection;
        [Parameter(Position = 2, Mandatory = true, ParameterSetName = "Projection")]
        public ManagementPackTypeProjection Projection
        {
            get { return _projection; }
            set { _projection = value; }
        }
        /*
         * Commented out for now, just create a blank template which can then be modifed at a later date via the
         * UI or cmdlet
         * private Hashtable _templateData;
         * [Parameter(Position = 3)]
         * public Hashtable TemplateData
         * {
         * get { return _templateData; }
         * set { _templateData = value; }
         * }
         */
        private string _name;
        [Parameter]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        private string _description;
        [Parameter]
        public string Description
        {
            get { return _description; }
            set { _description = value; }
        }
        private SwitchParameter _passThru;
        [Parameter]
        public SwitchParameter PassThru
        {
            get { return _passThru; }
            set { _passThru = value; }
        }
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
        }
        protected override void ProcessRecord()
        {
            if (Name == null)
            {
                Name = String.Format("Template.{0:N}", Guid.NewGuid());
            }
            ManagementPackObjectTemplate template = new ManagementPackObjectTemplate(this.ManagementPack, Name);
            template.DisplayName = DisplayName;
            if (Description != null) { template.Description = Description; }
            if (Class != null)
            {
                template.TypeID = Class;
            }
            else
            {
                template.TypeID = Projection;
            }
            if (ShouldProcess(DisplayName))
            {
                this.ManagementPack.AcceptChanges();
            }
            WriteObject(template);
        }
    }
    #endregion
 
    #region SetSCSMObjectTemplate
    [Cmdlet(VerbsCommon.Set, "SCSMObjectTemplate", SupportsShouldProcess = true)]
    public class SetSCSMObjectTemplateCommand : SMCmdletBase
    {
        private EnterpriseManagementObjectProjection[] _projection = null;
        [Parameter(Position = 0, Mandatory = true, ParameterSetName = "P", ValueFromPipeline = true)]
        public EnterpriseManagementObjectProjection[] Projection
        {
            get { return _projection; }
            set { _projection = value; }
        }
 
        private EnterpriseManagementObject[] _object = null;
        [Parameter(Position = 0, Mandatory = true, ParameterSetName = "O", ValueFromPipeline = true)]
        public EnterpriseManagementObject[] Object
        {
            get { return _object; }
            set { _object = value; }
        }
 
        private string _name = null;
        // [Parameter(Position=1,Mandatory=true)]
        // [Parameter(ParameterSetName="Projection")]
        // [Parameter(ParameterSetName="Object")]
        [Parameter]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
 
        private ManagementPackObjectTemplate _template = null;
        // [Parameter(Position=1,Mandatory=true)]
        // [Parameter(ParameterSetName="Projection")]
        // [Parameter(ParameterSetName="Object")]
        [Parameter]
        public ManagementPackObjectTemplate Template
        {
            get { return _template; }
            set { _template = value; }
        }
 
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            if (Template == null && Name != null)
            {
                Regex r = new Regex(Name, RegexOptions.IgnoreCase);
                foreach (ManagementPackObjectTemplate ot in _mg.Templates.GetObjectTemplates())
                {
                    if (r.Match(ot.Name).Success)
                    {
                        Template = ot;
                        return;
                    }
                }
            }
        }
 
        protected override void ProcessRecord()
        {
            try
            {
                if (Object != null)
                {
                    foreach (EnterpriseManagementObject o in Object)
                    {
                        if (ShouldProcess(o[null, "Id"].Value.ToString()))
                        {
                            o.ApplyTemplate(Template);
                            o.Overwrite();
                        }
                    }
                }
                else if (Projection != null)
                {
                    foreach (EnterpriseManagementObjectProjection p in Projection)
                    {
                        if (ShouldProcess(p.Object[null, "Id"].Value.ToString()))
                        {
                            p.ApplyTemplate(Template);
                            p.Overwrite();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                WriteError(new ErrorRecord(e, "ApplyTemplate", ErrorCategory.InvalidOperation, Template));
 
            }
        }
    }
    #endregion
 
}