using System; using System.Collections.Generic; using System.Linq; using System.Text; using Intel.Management.Wsman; using System.Collections.ObjectModel; using System.Management.Automation; namespace Intel.Management.Module { public class StorageAdminItem : DriveContainer { private class EnterpriseAcl : DriveItem { StorageAdminItem _storageItem; string _entName; public EnterpriseAcl(string name, StorageAdminItem item) : base(name, "StorageACL") { _storageItem = item; IManagedInstance outObj = _storageItem.GetEaclEntry(_name); _entName = outObj.GetProperty("EnterpriseName").ToString(); } public override string Name { get { return _entName; } } public override void RemoveItem( bool force) { _storageItem.RemoveEaclEntry(_name); _storageItem.RemoveEnterpriseItem(this); } } public class EnterpriseContainer : DriveContainer { StorageAdminItem _storageItem; public EnterpriseContainer(StorageAdminItem item) : base("Enterprises") { _storageItem = item; _items = null; } public override DriveItem[] GetChildItems(bool force) { if (_items == null || force ) { IManagedInstance outObj = _storageItem.GetEaclList(); List list = new List(); IWsmanItem handles = outObj.GetProperty("Handles"); if (handles!= null) { foreach (IWsmanItem handle in handles) { list.Add(new EnterpriseAcl(handle.ToString(), _storageItem)); } } list.Sort(_defaultComparer); _items = list.ToArray(); } return _items; } public override DriveItem NewItem( string name, string type, object newItem, object newParamaters, bool force) { string handle= _storageItem.AddEaclEntry(name); EnterpriseAcl result = new EnterpriseAcl(handle, _storageItem); _storageItem.AddEnterpriseItem(result); return result; } } public class PartnerAcl : DriveItem { StorageAdminItem _storageItem; Dictionary _props; public PartnerAcl(Dictionary props, StorageAdminItem item) : base(props["ApplicationName"].ToString(), "ParnterAcl") { _props = props; _storageItem = item; } public override string[] Properties { get { return _props.Keys.ToArray(); } } public override object GetProperty(Collection propList,bool force) { return GetProperties(_props, propList); } public override void SetProperty(PSObject propertyValue, bool force) { _storageItem.UpdateFpaclEntry(_props["Handle"].ToString(), propertyValue.Properties["TotalAllocationSize"].Value.ToString()); _props["TotalAllocationSize"] = propertyValue.Properties["TotalAllocationSize"].Value.ToString(); } public override void RemoveItem( bool force) { _storageItem.RemoveFpaclEntry(_props["Handle"].ToString()); _storageItem.RemovePartnerItem(this); } } public class PartnerDynamicParameters { public PartnerDynamicParameters() { _maxSize=48*1024; //default to 48K storage } [Parameter(Mandatory = true,Position = 0, HelpMessage = "An application name that can be used in subsequent storage operations")] public string NewApplication { get { return _app; } set { _app = value; } } [Parameter(Mandatory = true, Position = 1, HelpMessage = "The name of the vendor supplying the Application")] public string VendorName { get { return _vendor; } set { _vendor = value; } } [Parameter(Mandatory = false, Position = 2, HelpMessage = "Maximum size in bytes the application can allocate. Must be a multiple of 4KB")] public uint TotalAllocationSize { get { return _maxSize; } set { uint blocksize = (value / (4 * 1024)); blocksize = blocksize * (4 * 1024); if (value > blocksize) blocksize = blocksize + (4 * 1024); _maxSize = blocksize; } } private string _vendor; private string _app; private uint _maxSize; } public class VendorContainer : DriveContainer { StorageAdminItem _storageItem; public VendorContainer(string name, StorageAdminItem item) : base(name) { _storageItem = item; } public VendorContainer(string handle, Dictionary props, StorageAdminItem item) : base(props["VendorName"].ToString()) { _storageItem = item; List list = new List(); if (_items != null) list.AddRange(_items); list.Add( new PartnerAcl(props,_storageItem) ); _items = list.ToArray(); } public void RemovePartnerItem(PartnerAcl item) { List list = new List(); if (_items != null) list.AddRange(_items); if (list.Remove(item)) _items = list.ToArray(); } } public class PartnerContainer : DriveContainer { StorageAdminItem _storageItem; //PartnerDynamicParameters _commandParameters = null; public PartnerContainer(StorageAdminItem item) : base("Partners") { _storageItem = item; _items = null; } public override DriveItem[] GetChildItems(bool force) { if (_items == null || force) { IManagedInstance outObj = _storageItem.GetFpaclList(); List list = new List(); IWsmanItem handles = outObj.GetProperty("Handles"); if (handles != null) { foreach (IWsmanItem handle in handles) { IManagedInstance entryObj = _storageItem.GetFpaclEntry(handle.ToString()); string vendorName= entryObj.GetProperty("VendorName").ToString(); Dictionary props = new Dictionary(StringComparer.OrdinalIgnoreCase); props.Add("ApplicationName",entryObj.GetProperty("ApplicationName").ToString()); props.Add("TotalAllocationSize",uint.Parse(entryObj.GetProperty("TotalAllocationSize").ToString())); props.Add("VendorName", vendorName); props.Add("IsPartner", bool.Parse(entryObj.GetProperty("IsPartner").ToString())); props.Add("AttrType", uint.Parse(entryObj.GetProperty("AttrType").ToString())); props.Add("Handle", uint.Parse(handle.ToString())); DriveContainer vendorItem = list.Find(delegate(DriveContainer item) { return string.Compare(item.Name, vendorName, true) == 0; }); if (vendorItem == null) { vendorItem = new VendorContainer(vendorName, _storageItem); list.Add(vendorItem); } vendorItem.AddChildItem(new PartnerAcl( props, _storageItem)); } } _items = list.ToArray(); } return _items; } public void RemovePartnerItem(PartnerAcl item) { foreach (VendorContainer vendor in _items) { vendor.RemovePartnerItem(item); } } } public class RegisteredAppItem : DriveItem { StorageAdminItem _storageItem; Dictionary _props; public RegisteredAppItem(string name, StorageAdminItem item) : base(name, "RegistredApplication") { _props = new Dictionary(StringComparer.OrdinalIgnoreCase); _props.Add("AttrType", null); _props.Add("UUID", null); _props.Add("VendorName", null); _props.Add("ApplicationName", null); _props.Add("EnterpriseName", null); _props.Add("CurrentAllocationSize", null); _props.Add("ActiveSession", null); _props.Add("Partner", null); _storageItem = item; } public override string[] Properties { get { return _props.Keys.ToArray(); } } public override object GetProperty(Collection propList, bool force) { //public uint32 AdminGetApplicationAttributes([IN]uint32 Handle, [OUT]uint32 AttrType, [OUT]uint8 UUID[16], [OUT]string VendorName, [OUT]string ApplicationName, [OUT]string EnterpriseName, [OUT]uint32 CurrentAllocationSize, [OUT]boolean ActiveSession, [OUT]boolean Partner) if (_props["ApplicationName"] == null) { IManagedInstance outObj = _storageItem.GetApplicationAttributes(_name); _props["VendorName"] = outObj.GetProperty("VendorName").ToString(); //convert UUID to string Guid uuid = new Guid(Convert.FromBase64String(outObj.GetProperty("UUID").ToString())); _props["UUID"] = uuid.ToString(); _props["ApplicationName"] = outObj.GetProperty("ApplicationName").ToString(); _props["EnterpriseName"] = outObj.GetProperty("EnterpriseName").ToString(); _props["CurrentAllocationSize"] = uint.Parse(outObj.GetProperty("CurrentAllocationSize").ToString()); _props["ActiveSession"] = bool.Parse(outObj.GetProperty("ActiveSession").ToString()); _props["Partner"] = bool.Parse(outObj.GetProperty("Partner").ToString()); _props["AttrType"] = uint.Parse(outObj.GetProperty("AttrType").ToString()); } return GetProperties(_props, propList); } public override void SetProperty(PSObject propertyValue, bool force) { _storageItem.UpdateFpaclEntry(_name, propertyValue.Properties["TotalAllocationSize"].Value.ToString()); } } public class RegisteredAppsContainer : DriveContainer { StorageAdminItem _storageItem; public RegisteredAppsContainer(StorageAdminItem item) : base("RegisteredApps") { _storageItem = item; _items = null; } public override DriveItem[] GetChildItems(bool force) { if (_items == null || force) { IManagedInstance outObj = _storageItem.GetRegisteredApps(); List list = new List(); IWsmanItem handles = outObj.GetProperty("ApplicationHandles"); if (handles != null) { foreach (IWsmanItem handle in handles) { list.Add(new RegisteredAppItem(handle.ToString(), _storageItem)); } } _items = list.ToArray(); } return _items; } } public Dictionary _props; IManagedReference _storageAdminRef; EnterpriseContainer _enterprises; PartnerContainer _partners; public StorageAdminItem(AmtDriveInfo info) : base("Storage") { // define Storeage admin properties _props = new Dictionary(StringComparer.OrdinalIgnoreCase); _props.Add("TotalStorage",null); _props.Add("TotalAllocatedStorage",null); _props.Add("MaxPartnerStorage",null); _props.Add("TotalPartnerAllocatedStorage",null); _props.Add("MaxNonPartnerStorage",null); _props.Add("MaxFpaclEntries",null); _props.Add("MaxAslEntries",null); _props.Add("MaxEaclEntries",null); _props.Add("MaxGroupsPerBlock",null); _props.Add("MaxMembersPerGroup",null); _props.Add("MaxNonPartnerTotalAllocationSize",null); _enterprises = new EnterpriseContainer(this); _partners = new PartnerContainer(this); //define Admin storage DriveItem[] storageItems = { _enterprises, _partners, new RegisteredAppsContainer(this), }; _items = storageItems; _storageAdminRef = info.WsmanConnection.NewReference("AMT_ThirdPartyDataStorageAdministrationService"); } private void RemoveEnterpriseItem(DriveItem item) { _enterprises.RemoveChildItem(item); } private void AddEnterpriseItem(DriveItem item) { _enterprises.AddChildItem(item); } private void RemovePartnerItem(PartnerAcl partner) { _partners.RemovePartnerItem(partner); } public override string[] Properties { get { return _props.Keys.ToArray(); } } private IManagedInstance GetGlobalStorageAttributes() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("GetGlobalStorageAttributes"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance SetGlobalStorageAttributes(string name, string value) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("SetGlobalStorageAttributes"); inputObj.SetProperty(name, value); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetEaclEntry(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("GetStorageEaclEntry"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetFpaclEntry(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("GetStorageAllocEntry"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetEaclList() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("EnumerateStorageEaclEntries"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetFpaclList() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("EnumerateStorageAllocEntries"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetRegisteredApps() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AdminGetRegisteredApplications"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } private string AddEaclEntry(string name) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AddStorageEaclEntry"); inputObj.SetProperty("EnterpriseName",name); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj.GetProperty("Handle").ToString(); } private string AddFpaclEntry(string appName, string vendor, string size) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AddStorageFpaclEntry"); inputObj = _storageAdminRef.CreateMethodInput("AddStorageFpaclEntry"); inputObj.SetProperty("AttrType","1"); inputObj.SetProperty("ApplicationName",appName); inputObj.SetProperty("VendorName",vendor); inputObj.SetProperty("IsPartner", "true"); inputObj.SetProperty("TotalAllocationSize",size); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj.GetProperty("Handle").ToString(); } private void RemoveEaclEntry(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("RemoveStorageEaclEntry"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); } private void RemoveFpaclEntry(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("RemoveStorageFpaclEntry"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); } private void UpdateFpaclEntry(string handle, string newSize) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("UpdateStorageFpaclEntry"); inputObj.SetProperty("Handle", handle); inputObj.SetProperty("NewAllocationSize", newSize); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); } private IManagedInstance GetApplicationAttributes(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AdminGetApplicationAttributes"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageItem.StorageOperationException.CheckResult(outObj); return outObj; } public override object GetProperty(Collection propList, bool force) { IManagedInstance outObj = this.GetGlobalStorageAttributes(); foreach (string propName in _props.Keys.ToArray()) { _props[propName] = uint.Parse(outObj.GetProperty(propName).ToString()); } return GetProperties(_props, propList); } public override void SetProperty(PSObject propertyValue, bool force) { string name=null; string value=null; foreach (PSPropertyInfo propInfo in propertyValue.Properties) { name=propInfo.Name; value = propInfo.Value.ToString(); } if (name == null || (string.Compare("MaxPartnerStorage", name, true) != 0 && string.Compare("MaxNonPartnerTotalAllocationSize", name, true) != 0)) new ArgumentException(); SetGlobalStorageAttributes(name, value); } } }