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.Amt { public class StorageAdmin { class EnterpriseAcl : DriveItem { StorageAdmin _stgAdmin; uint _handle; static string[] _properties = { "Handle" }; public EnterpriseAcl(string handle, StorageAdmin stgAdmin) : base(handle,ManagedValueType.Acl) { _stgAdmin = stgAdmin; IManagedInstance outObj = _stgAdmin.GetEaclEntry(handle); _name = outObj.GetProperty("EnterpriseName").ToString(); _handle = uint.Parse(handle); } public override string[] Properties { get { return _properties; } } public override object GetProperty(Collection propList, bool force) { foreach (string propName in propList) { if (string.Compare(propName, _properties[0], true) != 0) throw new PSArgumentException(); } return _handle; } public override void RemoveItem(object dynamicParams, bool force) { _stgAdmin.RemoveEaclEntry(_handle.ToString()); _stgAdmin.RemoveItem(this); } } class EnterpriseContainer : DriveContainer { StorageAdmin _stgAdmin; public EnterpriseContainer(StorageAdmin stgAdmin) : base("Enterprises") { _stgAdmin = stgAdmin; _items = null; } public override ManagedItem[] GetChildItems(bool force) { if (_items == null || force ) { IManagedInstance outObj = _stgAdmin.GetEaclList(); List list = new List(); IWsmanItem handles = outObj.GetProperty("Handles"); if (handles!= null) { foreach (IWsmanItem handle in handles) { list.Add(new EnterpriseAcl(handle.ToString(), _stgAdmin)); } } list.Sort(_defaultComparer); _items = list.ToArray(); } return _items; } public override ManagedItem NewItem( string name, string type, object newItem, object dynamicParams, bool force) { if (!name.Equals(string.Empty)) { string handle = _stgAdmin.AddEaclEntry(name); EnterpriseAcl result = new EnterpriseAcl(handle, _stgAdmin); AddChildItem(result); return result; } return this; } } public class PartnerAclDynamicParameters { public PartnerAclDynamicParameters() { _maxSize=48*1024; //default to 48K storage } [Parameter(Mandatory = false, Position = 0, HelpMessage = "Maximum size in bytes the partner can allocate")] 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; } } uint _maxSize; } class PartnerAcl : DriveItem { StorageAdmin _stgAdmin; PartnerAclDynamicParameters _dynamicParams; Dictionary _props; public PartnerAcl(Dictionary props, StorageAdmin stgAdmin) : base(props["ApplicationName"].ToString(), ManagedValueType.Acl) { _props = props; _stgAdmin = stgAdmin; } 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) { _stgAdmin.UpdateFpaclEntry(_props["Handle"].ToString(), propertyValue.Properties["TotalAllocationSize"].Value.ToString()); _props["TotalAllocationSize"] = propertyValue.Properties["TotalAllocationSize"].Value.ToString(); } public override void RemoveItem( object dynamicParams,bool force) { _stgAdmin.RemoveFpaclEntry(_props["Handle"].ToString()); _stgAdmin.RemoveItem(this); } public override ManagedItem NewItem(string name, string type, object newItem, object dynamicParams, bool force) { PartnerAclDynamicParameters localParams = _dynamicParams; _dynamicParams=null; if (name.Equals(string.Empty) && !_dynamicParams.TotalAllocationSize.Equals(_props["TotalAllocationSize"])) { _stgAdmin.UpdateFpaclEntry(_props["Handle"].ToString(), localParams.TotalAllocationSize.ToString()); _props["TotalAllocationSize"] = localParams.TotalAllocationSize; } return base.NewItem(name, type, newItem,dynamicParams, force); } public override object NewItemDynamicParameters(string itemTypeName, object newItemValue) { return _dynamicParams = new PartnerAclDynamicParameters(); } } class VendorContainer : DriveContainer { StorageAdmin _stgAdmin; public VendorContainer(string name, StorageAdmin stgAdmin) : base(name) { _stgAdmin = stgAdmin; } public VendorContainer(string handle, Dictionary props, StorageAdmin stgAdmin) : base(props["VendorName"].ToString()) { _stgAdmin = stgAdmin; List list = new List(); if (_items != null) list.AddRange(_items); list.Add( new PartnerAcl(props,_stgAdmin) ); _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(); } } class PartnerContainer : DriveContainer { StorageAdmin _stgAdmin; PartnerAclDynamicParameters _dynamicParams = null; public PartnerContainer(StorageAdmin stgAdmin) : base("Partners") { _stgAdmin = stgAdmin; _items = null; } public override ManagedItem[] GetChildItems(bool force) { if (_items == null || force) { IManagedInstance outObj = _stgAdmin.GetFpaclList(); List list = new List(); IWsmanItem handles = outObj.GetProperty("Handles"); if (handles != null) { foreach (IWsmanItem handle in handles) { IManagedInstance entryObj = _stgAdmin.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())); AddPartner(list, props); } } list.Sort(_defaultComparer); _items = list.ToArray(); } return _items; } private PartnerAcl AddPartner(List list, Dictionary props) { PartnerAcl result = null; string vendorName = props["VendorName"].ToString(); //find the vendor container using anynomous delegate DriveContainer vendorItem = (DriveContainer)list.Find( delegate(ManagedItem item) { return string.Compare(item.Name, vendorName, true) == 0; } ); // No vendor container so add one if (vendorItem == null) { vendorItem = new VendorContainer(vendorName, _stgAdmin); list.Add(vendorItem); } result = new PartnerAcl(props, _stgAdmin); vendorItem.AddChildItem(result); return result; } public override ManagedItem NewItem(string name, string type, object newItem,object dynamicParams, bool force) { PartnerAclDynamicParameters localParams = _dynamicParams; _dynamicParams=null; char[] pathChar = { '\\', '/' }; string[] names = name.Split(pathChar, StringSplitOptions.RemoveEmptyEntries); if (names.Length == 2) { Dictionary props = new Dictionary(StringComparer.OrdinalIgnoreCase); props.Add("ApplicationName", names[1]); props.Add("TotalAllocationSize", localParams.TotalAllocationSize); props.Add("VendorName", names[0]); props.Add("IsPartner", true); props.Add("AttrType", (uint)1); string handle = _stgAdmin.AddFpaclEntry(names[1], names[0], localParams.TotalAllocationSize.ToString()); props.Add("Handle", uint.Parse(handle)); List list = new List(); if (_items != null) list.AddRange(_items); PartnerAcl result = AddPartner(list, props); _items = list.ToArray(); return result; } return base.NewItem(name, type, newItem, dynamicParams, force); } public override object NewItemDynamicParameters(string itemTypeName, object newItemValue) { return _dynamicParams = new PartnerAclDynamicParameters(); } public void RemovePartnerItem(PartnerAcl item) { foreach (VendorContainer vendor in _items) { vendor.RemovePartnerItem(item); } } } class RegisteredItem : DriveItem { StorageAdmin _stgAdmin; Dictionary _props; public RegisteredItem(string name, StorageAdmin stgAdmin) : base(name, "StorgeApplication") { _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); _props.Add("Handle", null); _stgAdmin = stgAdmin; } public override string[] Properties { get { return _props.Keys.ToArray(); } } public override object GetProperty(Collection propList, bool force) { if (_props["ApplicationName"] == null) { IManagedInstance outObj = _stgAdmin.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()); _props["Handle"] = uint.Parse(_name); } return GetProperties(_props, propList); } public override void SetProperty(PSObject propertyValue, bool force) { foreach (PSPropertyInfo propInfo in propertyValue.Properties) { if (string.Compare(propInfo.Name, "TotalAllocationSize", true) != 0) throw new PSArgumentException(); _stgAdmin.UpdateFpaclEntry(propInfo.Name, propertyValue.Properties[propInfo.Name].Value.ToString()); _props[propInfo.Name] = (uint)propertyValue.Properties[propInfo.Name].Value; } } public override void RemoveItem(object dynamicParams,bool force) { _stgAdmin.RemoveApplication(_name); //base.RemoveItem(force); } } class RegistrationsContainer : DriveContainer { StorageAdmin _stgAdmin; public RegistrationsContainer(StorageAdmin stgAdmin) : base("Registrations") { _stgAdmin = stgAdmin; _items = null; } public override ManagedItem[] GetChildItems(bool force) { if (_items == null || force) { IManagedInstance outObj = _stgAdmin.GetRegisteredApps(); List list = new List(); IWsmanItem handles = outObj.GetProperty("ApplicationHandles"); if (handles != null) { foreach (IWsmanItem handle in handles) { list.Add(new RegisteredItem(handle.ToString(), _stgAdmin)); } } _items = list.ToArray(); } return _items; } } class AdminRoot : DriveContainer { StorageAdmin _stgAdmin; string[] _properties; public AdminRoot(StorageAdmin stgAdmin) : base("Third Party Data Storage") { _stgAdmin = stgAdmin; _items = null; } public override ManagedItem[] GetChildItems(bool force) { if (_items == null) { List list = new List(); list.Add(new EnterpriseContainer(_stgAdmin)); list.Add(new PartnerContainer(_stgAdmin)); list.Add(new RegistrationsContainer(_stgAdmin)); list.Sort(_defaultComparer); _items = list.ToArray(); } return _items; } public override string[] Properties { get { if (_properties == null) { String[] props = {"TotalStorage", "TotalAllocatedStorage", "MaxPartnerStorage", "TotalPartnerAllocatedStorage", "MaxNonPartnerStorage", "MaxFpaclEntries", "MaxAslEntries", "MaxEaclEntries", "MaxGroupsPerBlock", "MaxMembersPerGroup", "MaxNonPartnerTotalAllocationSize",}; _properties = props; } return _properties; } } public override object GetProperty(Collection propList, bool force) { IManagedInstance outObj = _stgAdmin.GetGlobalStorageAttributes(); Dictionary props = new Dictionary(); foreach (string propName in Properties) { props.Add(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 PSArgumentException(); _stgAdmin.SetGlobalStorageAttributes(name, value); } } IManagedReference _storageAdminRef; AdminRoot _root; public StorageAdmin(WsmanConnection conn) { //_items = null; _storageAdminRef = conn.NewReference("AMT_ThirdPartyDataStorageAdministrationService"); _root = new AdminRoot(this); } public ManagedItem RootFolder { get { return _root; } } private bool RemoveItem(DriveItem item) { return _root.RemoveChildItem(item, true); } private IManagedInstance GetGlobalStorageAttributes() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("GetGlobalStorageAttributes"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.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); StorageManager.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetEaclEntry(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("GetStorageEaclEntry"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetFpaclEntry(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("GetStorageAllocEntry"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetEaclList() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("EnumerateStorageEaclEntries"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetFpaclList() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("EnumerateStorageAllocEntries"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.StorageOperationException.CheckResult(outObj); return outObj; } private IManagedInstance GetRegisteredApps() { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AdminGetRegisteredApplications"); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.StorageOperationException.CheckResult(outObj); return outObj; } private string AddEaclEntry(string name) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AddStorageEaclEntry"); inputObj.SetProperty("EnterpriseName",name); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.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); StorageManager.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); StorageManager.StorageOperationException.CheckResult(outObj); } private void RemoveFpaclEntry(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("RemoveStorageFpaclEntry"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.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); StorageManager.StorageOperationException.CheckResult(outObj); } private void RemoveApplication(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AdminRemoveApplication"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.StorageOperationException.CheckResult(outObj); } private IManagedInstance GetApplicationAttributes(string handle) { IManagedInstance inputObj = _storageAdminRef.CreateMethodInput("AdminGetApplicationAttributes"); inputObj.SetProperty("Handle", handle); IManagedInstance outObj = _storageAdminRef.InvokeMethod(inputObj); StorageManager.StorageOperationException.CheckResult(outObj); return outObj; } } }