private static Volume ParseVolume(LshwNode volumeNode, PhysicalId diskPhysicalId) { var physicalIdStr = volumeNode.FindSingleValue(TokenType.PhysicalId); var devPath = GetDevPath(volumeNode); if (devPath == null) { return(null); } var uuid = volumeNode.FindSingleValue(TokenType.Serial); var state = volumeNode.FindSingleValue(TokenType.State); var mountPath = volumeNode.FindSingleValue(t => t.Type == TokenType.LogicalName && !t.Value.StartsWith("/dev")) ?? volumeNode.FindSingleValue(TokenType.LastMountPoint); var filesystem = volumeNode.FindSingleValue(TokenType.Filesystem); var physicalId = new PhysicalId(physicalIdStr, diskPhysicalId); var logicalVolumeNodes = volumeNode.Children; var logicalVolumes = logicalVolumeNodes.Select(lv => ParseLogicalVolume(lv, physicalId)).ToList(); var mountOptions = volumeNode.FindSingleValue(TokenType.MountOptions); return(new Volume(physicalId, new DevPath(devPath), new UUID(uuid), state is null ? State.NotMounted : Enum.Parse <State>(state, true), mountPath is null ? null : new MountPath(mountPath), filesystem is null ? null : new Filesystem(filesystem), logicalVolumes, mountOptions is null ? null : new MountOptions(mountOptions))); }
private static LogicalVolume ParseLogicalVolume(LshwNode logicalVolumeNode, PhysicalId volumePhysicalId) { var physicalId = logicalVolumeNode.FindSingleValue(TokenType.PhysicalId); var devPath = GetDevPath(logicalVolumeNode); var uuid = logicalVolumeNode.FindSingleValue(TokenType.Serial); return(new LogicalVolume( new PhysicalId(physicalId, volumePhysicalId), new DevPath(devPath), new UUID(uuid))); }
private PhysicalDisk ParseDisk(LshwNode diskNode) { var product = diskNode.FindSingleValue(TokenType.Product); if (product is null) // not a real disk { return(null); } var volumeNodes = diskNode.Children; var physicalIdStr = diskNode.FindSingleValue(TokenType.PhysicalId); var devPath = GetDevPath(diskNode); var upperPhysicalId = diskNode.Parent.FindSingleValue(TokenType.PhysicalId); var physicalId = CollectPhysicalId(diskNode); var volumes = volumeNodes.Select(v => ParseVolume(v, physicalId)).Where(v => v != null).ToList(); return(new PhysicalDisk(physicalId, new DevPath(devPath), volumes)); }
private static PhysicalId CollectPhysicalId(LshwNode node) { var physIds = new Stack <string>(); string physId; while (node != null && (physId = node.FindSingleValue(TokenType.PhysicalId)) != null) { physIds.Push(physId); node = node.Parent; } PhysicalId res = null; while (physIds.TryPop(out var s)) { res = new PhysicalId(s, res); } return(res); }
private static string GetDevPath(LshwNode node) { return(node.FindSingleValue(t => t.Type == TokenType.LogicalName && t.Value.StartsWith("/dev"))); }