additional device details

This commit is contained in:
Gary Sharp
2020-12-04 15:51:23 +11:00
parent 486ce17857
commit af4a94870e
22 changed files with 1584 additions and 231 deletions
@@ -258,5 +258,105 @@ namespace Disco.Services
device.SetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyDiskDrives, json);
}
/// <summary>
/// Gets the Bios Device Detail Value
/// </summary>
public static List<Bios> Bios(this IEnumerable<DeviceDetail> details)
{
var json = details.GetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyBios);
if (string.IsNullOrEmpty(json))
return null;
return JsonConvert.DeserializeObject<List<Bios>>(json);
}
/// <summary>
/// Sets the Bios Device Detail Value
/// </summary>
public static void Bios(this IEnumerable<DeviceDetail> details, Device device, List<Bios> bios)
{
var json = default(string);
if (bios != null && bios.Count > 0)
json = JsonConvert.SerializeObject(bios);
device.SetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyBios, json);
}
/// <summary>
/// Gets the Base Board Device Detail Value
/// </summary>
public static List<BaseBoard> BaseBoard(this IEnumerable<DeviceDetail> details)
{
var json = details.GetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyBaseBoard);
if (string.IsNullOrEmpty(json))
return null;
return JsonConvert.DeserializeObject<List<BaseBoard>>(json);
}
/// <summary>
/// Sets the Base Board Device Detail Value
/// </summary>
public static void BaseBoard(this IEnumerable<DeviceDetail> details, Device device, List<BaseBoard> baseBoard)
{
var json = default(string);
if (baseBoard != null && baseBoard.Count > 0)
json = JsonConvert.SerializeObject(baseBoard);
device.SetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyBaseBoard, json);
}
/// <summary>
/// Gets the Computer System Device Detail Value
/// </summary>
public static List<ComputerSystem> ComputerSystem(this IEnumerable<DeviceDetail> details)
{
var json = details.GetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyComputerSystem);
if (string.IsNullOrEmpty(json))
return null;
return JsonConvert.DeserializeObject<List<ComputerSystem>>(json);
}
/// <summary>
/// Sets the Computer System Device Detail Value
/// </summary>
public static void ComputerSystem(this IEnumerable<DeviceDetail> details, Device device, List<ComputerSystem> computerSystem)
{
var json = default(string);
if (computerSystem != null && computerSystem.Count > 0)
json = JsonConvert.SerializeObject(computerSystem);
device.SetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyComputerSystem, json);
}
/// <summary>
/// Gets the Batteries Device Detail Value
/// </summary>
public static List<Battery> Batteries(this IEnumerable<DeviceDetail> details)
{
var json = details.GetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyBatteries);
if (string.IsNullOrEmpty(json))
return null;
return JsonConvert.DeserializeObject<List<Battery>>(json);
}
/// <summary>
/// Sets the Batteries Device Detail Value
/// </summary>
public static void Batteries(this IEnumerable<DeviceDetail> details, Device device, List<Battery> batteries)
{
var json = default(string);
if (batteries != null && batteries.Count > 0)
json = JsonConvert.SerializeObject(batteries);
device.SetDetail(DeviceDetail.ScopeHardware, DeviceDetail.HardwareKeyBatteries, json);
}
}
}
@@ -454,6 +454,12 @@ namespace Disco.Services.Devices.Enrolment
}
// store hardware audit information
if (Request.Hardware.Bios?.Count > 0)
RepoDevice.DeviceDetails.Bios(RepoDevice, Request.Hardware.Bios);
if (Request.Hardware.BasebBoard?.Count > 0)
RepoDevice.DeviceDetails.BaseBoard(RepoDevice, Request.Hardware.BasebBoard);
if (Request.Hardware.ComputerSystem?.Count > 0)
RepoDevice.DeviceDetails.ComputerSystem(RepoDevice, Request.Hardware.ComputerSystem);
if (Request.Hardware.Processors?.Count > 0)
RepoDevice.DeviceDetails.Processors(RepoDevice, Request.Hardware.Processors);
if (Request.Hardware.PhysicalMemory?.Count > 0)
@@ -462,6 +468,8 @@ namespace Disco.Services.Devices.Enrolment
RepoDevice.DeviceDetails.DiskDrives(RepoDevice, Request.Hardware.DiskDrives);
if (Request.Hardware.NetworkAdapters?.Count > 0)
RepoDevice.DeviceDetails.NetworkAdapters(RepoDevice, Request.Hardware.NetworkAdapters);
if (Request.Hardware.Batteries?.Count > 0)
RepoDevice.DeviceDetails.Batteries(RepoDevice, Request.Hardware.Batteries);
if (adMachineAccount == null)
{
@@ -26,6 +26,12 @@ namespace Disco.Services.Devices.Exporting
// materialize device details
records.ForEach(r =>
{
if (Options.DetailBios)
r.DeviceDetailBios = r.DeviceDetails.Bios();
if (Options.DetailBaseBoard)
r.DeviceDetailBaseBoard = r.DeviceDetails.BaseBoard();
if (Options.DetailComputerSystem)
r.DeviceDetailComputerSystem = r.DeviceDetails.ComputerSystem();
if (Options.DetailProcessors)
r.DeviceDetailProcessors = r.DeviceDetails.Processors();
if (Options.DetailMemory)
@@ -41,6 +47,8 @@ namespace Disco.Services.Devices.Exporting
r.DeviceDetailWlanMacAddresses = r.DeviceDetails.WLanMacAddress()?.Split(';').Select(a => a.Trim()).ToList();
}
}
if (Options.DetailBatteries)
r.DeviceDetailBatteries = r.DeviceDetails.Batteries();
});
TaskStatus.UpdateStatus(40, "Building metadata and database query");
@@ -239,8 +247,9 @@ namespace Disco.Services.Devices.Exporting
var lanAdapterMaxCount = Math.Max(1, records.Max(r => r.DeviceDetailNetworkAdapters?.Count(a => !a.IsWlanAdapter) ?? r.DeviceDetailLanMacAddresses?.Count ?? 0));
var wlanAdapterMaxCount = Math.Max(1, records.Max(r => r.DeviceDetailNetworkAdapters?.Count(a => a.IsWlanAdapter) ?? r.DeviceDetailWlanMacAddresses?.Count ?? 0));
var certificateMaxCount = Math.Max(1, records.Max(r => r.DeviceCertificates?.Count() ?? 0));
var batteriesMaxCount = Math.Max(1, records.Max(r => r.DeviceDetailBatteries?.Count ?? 0));
var allAssessors = BuildRecordAccessors(processorMaxCount, memoryMaxCount, diskDriveMaxCount, lanAdapterMaxCount, wlanAdapterMaxCount, certificateMaxCount);
var allAssessors = BuildRecordAccessors(processorMaxCount, memoryMaxCount, diskDriveMaxCount, lanAdapterMaxCount, wlanAdapterMaxCount, certificateMaxCount, batteriesMaxCount);
return typeof(DeviceExportOptions).GetProperties()
.Where(p => p.PropertyType == typeof(bool))
@@ -262,7 +271,7 @@ namespace Disco.Services.Devices.Exporting
}).ToList();
}
private static Dictionary<string, List<DeviceExportFieldMetadata>> BuildRecordAccessors(int processorMaxCount, int memoryMaxCount, int diskDriveMaxCount, int lanAdapterMaxCount, int wlanAdapterMaxCount, int certificateMaxCount)
private static Dictionary<string, List<DeviceExportFieldMetadata>> BuildRecordAccessors(int processorMaxCount, int memoryMaxCount, int diskDriveMaxCount, int lanAdapterMaxCount, int wlanAdapterMaxCount, int certificateMaxCount, int batteriesMaxCount)
{
const string DateFormat = "yyyy-MM-dd";
const string DateTimeFormat = DateFormat + " HH:mm:ss";
@@ -343,6 +352,80 @@ namespace Disco.Services.Devices.Exporting
metadata.Add(nameof(DeviceExportOptions.Certificates), certificateFields);
// Details
var biosFields = new List<DeviceExportFieldMetadata>()
{
new DeviceExportFieldMetadata("BIOSManufacturer", "BIOS Manufacturer", typeof(string), r => r.DeviceDetailBios?.FirstOrDefault()?.Manufacturer, csvStringEncoded),
new DeviceExportFieldMetadata("BIOSSerialNumber", "BIOS Serial Number", typeof(string), r => r.DeviceDetailBios?.FirstOrDefault()?.SerialNumber, csvStringEncoded),
new DeviceExportFieldMetadata("BIOSVersion", "BIOS Version", typeof(string), r => {
var bios = r.DeviceDetailBios?.FirstOrDefault();
if (bios?.SMBIOSBIOSVersion != null)
return $"{bios.SMBIOSBIOSVersion} {bios.SMBIOSMajorVersion}.{bios.SMBIOSMinorVersion}";
else
return null;
}, csvStringEncoded),
new DeviceExportFieldMetadata("BIOSSystemVersion", "BIOS System Version", typeof(string), r => {
var bios = r.DeviceDetailBios?.FirstOrDefault();
if (bios?.SystemBiosMajorVersion.HasValue ?? false)
return $"{bios.SystemBiosMajorVersion}.{bios.SystemBiosMinorVersion}";
else
return null;
}, csvStringEncoded),
new DeviceExportFieldMetadata("BIOSReleaseDate", "BIOS Release Date", typeof(DateTime), r => r.DeviceDetailBios?.FirstOrDefault()?.ReleaseDate, csvNullableDateTimeEncoded),
};
metadata.Add(nameof(DeviceExportOptions.DetailBios), biosFields);
var baseBoardFields = new List<DeviceExportFieldMetadata>()
{
new DeviceExportFieldMetadata("BaseBoardManufacturer", "Base Board Manufacturer", typeof(string), r => r.DeviceDetailBaseBoard?.FirstOrDefault()?.Manufacturer, csvStringEncoded),
new DeviceExportFieldMetadata("BaseBoardModel", "Base Board Model", typeof(string), r => r.DeviceDetailBaseBoard?.FirstOrDefault()?.Model, csvStringEncoded),
new DeviceExportFieldMetadata("BaseBoardProduct", "Base Board Product", typeof(string), r => r.DeviceDetailBaseBoard?.FirstOrDefault()?.Product, csvStringEncoded),
new DeviceExportFieldMetadata("BaseBoardPartNumber", "Base Board Part Number", typeof(string), r => r.DeviceDetailBaseBoard?.FirstOrDefault()?.PartNumber, csvStringEncoded),
new DeviceExportFieldMetadata("BaseBoardSKU", "Base Board SKU", typeof(string), r => r.DeviceDetailBaseBoard?.FirstOrDefault()?.SKU, csvStringEncoded),
new DeviceExportFieldMetadata("BaseBoardSerialNumber", "Base Board Serial Number", typeof(string), r => r.DeviceDetailBaseBoard?.FirstOrDefault()?.SerialNumber, csvStringEncoded),
new DeviceExportFieldMetadata("BaseBoardConfigOptions", "Base Board Config Options", typeof(string), r => {
var baseBoard = r.DeviceDetailBaseBoard?.FirstOrDefault();
if (baseBoard?.ConfigOptions != null)
return string.Join("; ", baseBoard.ConfigOptions);
else
return null;
}, csvStringEncoded),
new DeviceExportFieldMetadata("BaseBoardVersion", "Base Board Version", typeof(string), r => r.DeviceDetailBaseBoard?.FirstOrDefault()?.Version, csvStringEncoded),
};
metadata.Add(nameof(DeviceExportOptions.DetailBaseBoard), baseBoardFields);
var computerSystemFields = new List<DeviceExportFieldMetadata>()
{
new DeviceExportFieldMetadata("ComputerSystemDescription", "System Description", typeof(string), r => r.DeviceDetailComputerSystem?.FirstOrDefault()?.Description, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemPCSystemType", "System Form Factor", typeof(string), r => r.DeviceDetailComputerSystem?.FirstOrDefault()?.PCSystemType, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemSystemType", "System Type", typeof(string), r => r.DeviceDetailComputerSystem?.FirstOrDefault()?.SystemType, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemPrimaryOwnerName", "System Primary Owner Name", typeof(string), r => r.DeviceDetailComputerSystem?.FirstOrDefault()?.PrimaryOwnerName, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemPrimaryOwnerContact", "System Primary Owner Contact", typeof(string), r => r.DeviceDetailComputerSystem?.FirstOrDefault()?.PrimaryOwnerContact, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemChassisSKU", "System Chassis SKU", typeof(string), r => r.DeviceDetailComputerSystem?.FirstOrDefault()?.ChassisSKUNumber, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemSystemSKU", "System SKU", typeof(string), r => r.DeviceDetailComputerSystem?.FirstOrDefault()?.SystemSKUNumber, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemOEMReference", "System OEM Reference", typeof(string), r => {
var computerSystem = r.DeviceDetailComputerSystem?.FirstOrDefault();
if (computerSystem?.OEMStringArray != null)
return string.Join("; ", computerSystem.OEMStringArray);
else
return null;
}, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemCurrentTimeZone", "System Time Zone", typeof(string), r => {
var computerSystem = r.DeviceDetailComputerSystem?.FirstOrDefault();
if (computerSystem?.CurrentTimeZone.HasValue ?? false)
return $"{computerSystem.CurrentTimeZone.Value / 60:00}:{Math.Abs(computerSystem.CurrentTimeZone.Value % 60):00}";
else
return null;
}, csvStringEncoded),
new DeviceExportFieldMetadata("ComputerSystemRoles", "System Roles", typeof(string), r => {
var computerSystem = r.DeviceDetailComputerSystem?.FirstOrDefault();
if (computerSystem?.Roles != null)
return string.Join("; ", computerSystem.Roles);
else
return null;
}, csvStringEncoded),
};
metadata.Add(nameof(DeviceExportOptions.DetailComputerSystem), computerSystemFields);
var processorFields = new List<DeviceExportFieldMetadata>(processorMaxCount * 6);
for (int i = 0; i < processorMaxCount; i++)
{
@@ -410,6 +493,20 @@ namespace Disco.Services.Devices.Exporting
metadata.Add(nameof(DeviceExportOptions.DetailACAdapter), new List<DeviceExportFieldMetadata>() { new DeviceExportFieldMetadata(nameof(DeviceExportOptions.DetailACAdapter), typeof(string), r => r.DeviceDetails.Where(dd => dd.Key == DeviceDetail.HardwareKeyACAdapter).Select(dd => dd.Value).FirstOrDefault(), csvStringEncoded) });
metadata.Add(nameof(DeviceExportOptions.DetailBattery), new List<DeviceExportFieldMetadata>() { new DeviceExportFieldMetadata(nameof(DeviceExportOptions.DetailBattery), typeof(string), r => r.DeviceDetails.Where(dd => dd.Key == DeviceDetail.HardwareKeyBattery).Select(dd => dd.Value).FirstOrDefault(), csvStringEncoded) });
var batteriesFields = new List<DeviceExportFieldMetadata>(processorMaxCount * 6);
for (int i = 0; i < batteriesMaxCount; i++)
{
var v = i;
var index = i + 1;
batteriesFields.Add(new DeviceExportFieldMetadata($"Batteries{index}Name", $"Battery {index} Name", typeof(string), r => r.DeviceDetailBatteries?.Skip(v).FirstOrDefault()?.Name, csvStringEncoded));
batteriesFields.Add(new DeviceExportFieldMetadata($"Batteries{index}Description", $"Battery {index} Description", typeof(string), r => r.DeviceDetailBatteries?.Skip(v).FirstOrDefault()?.Description, csvStringEncoded));
batteriesFields.Add(new DeviceExportFieldMetadata($"Batteries{index}Availability", $"Battery {index} Availability", typeof(string), r => r.DeviceDetailBatteries?.Skip(v).FirstOrDefault()?.Availability, csvStringEncoded));
batteriesFields.Add(new DeviceExportFieldMetadata($"Batteries{index}Chemistry", $"Battery {index} Chemistry", typeof(string), r => r.DeviceDetailBatteries?.Skip(v).FirstOrDefault()?.Chemistry, csvStringEncoded));
batteriesFields.Add(new DeviceExportFieldMetadata($"Batteries{index}DesignVoltage", $"Battery {index} Design Voltage", typeof(long), r => r.DeviceDetailBatteries?.Skip(v).FirstOrDefault()?.DesignVoltage, csvToStringEncoded));
batteriesFields.Add(new DeviceExportFieldMetadata($"Batteries{index}DesignCapacity", $"Battery {index} Design Capacity", typeof(int), r => r.DeviceDetailBatteries?.Skip(v).FirstOrDefault()?.DesignCapacity, csvToStringEncoded));
batteriesFields.Add(new DeviceExportFieldMetadata($"Batteries{index}FullChargeCapacity", $"Battery {index} Capacity", typeof(int), r => r.DeviceDetailBatteries?.Skip(v).FirstOrDefault()?.FullChargeCapacity, csvToStringEncoded));
}
metadata.Add(nameof(DeviceExportOptions.DetailBatteries), batteriesFields);
metadata.Add(nameof(DeviceExportOptions.DetailKeyboard), new List<DeviceExportFieldMetadata>() { new DeviceExportFieldMetadata(nameof(DeviceExportOptions.DetailKeyboard), typeof(string), r => r.DeviceDetails.Where(dd => dd.Key == DeviceDetail.HardwareKeyKeyboard).Select(dd => dd.Value).FirstOrDefault(), csvStringEncoded) });
return metadata;
@@ -78,13 +78,13 @@ namespace Disco.Services
return $"{speed:N0} MHz";
}
public static string SizeFriendly(this DiskDrive diskDrive) => ByteSizeToFriendly(diskDrive.Size);
public static string SizeFriendly(this DiskDrivePartition partition) => ByteSizeToFriendly(partition.Size);
public static string SizeFriendly(this DiskLogical disk) => ByteSizeToFriendly(disk.Size);
public static string FreeSpaceFriendly(this DiskLogical disk) => ByteSizeToFriendly(disk.FreeSpace);
public static string SizeFriendly(this DiskDrive diskDrive) => ByteSizeToFriendly(diskDrive.Size ?? 0);
public static string SizeFriendly(this DiskDrivePartition partition) => ByteSizeToFriendly(partition.Size ?? 0);
public static string SizeFriendly(this DiskLogical disk) => ByteSizeToFriendly(disk.Size ?? 0);
public static string FreeSpaceFriendly(this DiskLogical disk) => ByteSizeToFriendly(disk.FreeSpace ?? 0);
public static string SpeedFriendly(this NetworkAdapter networkAdapter) => SpeedPacketBitsToFriendly(networkAdapter.Speed);
public static string CapacityFriendly(this PhysicalMemory physicalMemory) => ByteSizeToFriendly(physicalMemory.Capacity);
public static string MaxClockSpeedFriendly(this Processor processor) => SpeedMegahertzToFriendly(processor.MaxClockSpeed);
public static string CapacityFriendly(this PhysicalMemory physicalMemory) => ByteSizeToFriendly(physicalMemory.Capacity ?? 0);
public static string MaxClockSpeedFriendly(this Processor processor) => SpeedMegahertzToFriendly(processor.MaxClockSpeed ?? 0);
}
}