Src/subscription.cs

using System;
using System.IO;
using System.Xml;
using System.Reflection;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Management.Automation;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Subscriptions;
using Microsoft.EnterpriseManagement.Configuration.IO;
using System.Text.RegularExpressions;
 
namespace SMLets
{
    [Cmdlet("Get","SCSMSubscription")]
    public class GetSMSubscriptionCommand : SMCmdletBase
    {
        private string _filter = "Name LIKE '%'";
        [Parameter(ValueFromPipeline=true)]
        public string Filter
        {
            get { return _filter; }
            set { _filter = value; }
        }
        protected override void ProcessRecord()
        {
            ManagementPackRuleCriteria criteria = new ManagementPackRuleCriteria(Filter);
            foreach (WorkflowSubscriptionBase ws in _mg.Subscription.GetSubscriptionsByCriteria(criteria))
            {
                WriteObject(ws);
            }
 
        }
    }
     
    [Cmdlet("Remove","SCSMSubscription", SupportsShouldProcess=true)]
    public class RemoveSMSubscriptionCommand : SMCmdletBase
    {
        private WorkflowSubscription _subscription;
        [Parameter(Position=0,Mandatory=true,ValueFromPipeline=true)]
        public WorkflowSubscription Subscription
        {
            get { return _subscription; }
            set { _subscription = value; }
        }
        protected override void ProcessRecord()
        {
            try
            {
                if ( ShouldProcess(_subscription.Name))
                {
                    _subscription.ManagementGroup.Subscription.DeleteSubscription(_subscription);
                }
            }
            catch ( Exception e )
            {
                WriteError(new ErrorRecord(e, "Unknown error", ErrorCategory.NotSpecified, _subscription));
            }
 
        }
    }
 
    [Cmdlet("New", "SCSMNotificationSubscription")]
    public class NewSMNotificationSubscriptionCommand : SMCmdletBase
    {
        private string _criteria = String.Empty;
        private string _displayname = String.Empty;
        private string _description = String.Empty;
        private OperationTypeEnum _operationtypeenum;
        private OperationType _operationtype;
        private ManagementPackClass _class;
        private EnterpriseManagementObject[] _recipients;
        private ManagementPack _managementpack;
        private ManagementPackObjectTemplate _template;
        private bool _enabled = true;
         
         
        public enum OperationTypeEnum
        {
            Add,
            Update
            //Remove - note supported for now
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory=false)]
        public string Criteria
        {
            get { return _criteria; }
            set { _criteria = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public OperationTypeEnum OperationType
        {
            get { return _operationtypeenum; }
            set { _operationtypeenum = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public ManagementPackClass Class
        {
            get { return _class; }
            set { _class = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public string DisplayName
        {
            get { return _displayname; }
            set { _displayname = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = false)]
        public string Description
        {
            get { return _description; }
            set { _description = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = false)]
        public bool Enabled
        {
            get { return _enabled; }
            set { _enabled = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = false)]
        public EnterpriseManagementObject[] Recipients
        {
            get { return _recipients; }
            set { _recipients = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public ManagementPack ManagementPack
        {
            get { return _managementpack; }
            set { _managementpack = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public ManagementPackObjectTemplate NotificationTemplate
        {
            get { return _template; }
            set { _template = value; }
        }
 
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
 
            switch(_operationtypeenum)
            {
                case OperationTypeEnum.Add:
                    _operationtype = Microsoft.EnterpriseManagement.Subscriptions.OperationType.Add;
                    break;
                case OperationTypeEnum.Update:
                    _operationtype = Microsoft.EnterpriseManagement.Subscriptions.OperationType.Update;
                    break;
            }
        }
 
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
 
            //Create subscription and set configurable properties
            InstanceTypeSubscription instancetypeSubscription = new InstanceTypeSubscription(_operationtype,_class.Id, _criteria );
            NotificationSubscription subscription = new NotificationSubscription(_displayname, _description, instancetypeSubscription);
            subscription.Enabled = _enabled;
            subscription.TemplateIds.Add(_template.Id);
            subscription.Name = SMHelpers.MakeMPElementSafeUniqueIdentifier("NotificationSubscription");
             
            //TODO: Do we need these or do they have defaults set?
            //subscription.MaximumRunningTimeSeconds = 7200;
            //subscription.RetryDelaySeconds = 60;
            //subscription.EnableBatchProcessing = true;
             
            //Add recipient users
            if(_recipients != null)
            {
                foreach(EnterpriseManagementObject recipient in _recipients)
                {
                    subscription.Recipients.Add(new NotificationSubscriptionRecipient(recipient.Id.ToString(), NotificationSubscriptionRecipientType.ToRecipient));
                }
            }
 
            _mg.Subscription.InsertSubscription(_managementpack.Id, subscription);
        }
    }
}