public static int Run(Options opts) { RunHelpers(opts); if (opts.Paths.Count() < 2) { Logger.Error("A RAID with only one disk sounds a bit useless, doesn't it?"); return(INVALID_ARGUMENT); } if (!kRaidTypes.Keys.Any(t => t.Equals(opts.RaidType, StringComparison.OrdinalIgnoreCase))) { Logger.Error("Could not determined RAID type of \"{0}\"", opts.RaidType); Logger.Error("Supported RAID types are: {0}", string.Join(", ", kRaidTypes.Keys)); return(INVALID_ARGUMENT); } var raidType = kRaidTypes[opts.RaidType.ToLower()]; AbstractSoftRaidStream raidStream = null; var rawOffsets = opts.Offsets; var offsets = new List <long>(); foreach (var rawOffset in opts.Offsets) { offsets.Add(ParseSizeString(rawOffset)); } if (raidType == "0") { raidStream = new SoftRaid0Stream(); } else if (raidType == "1") { raidStream = new SoftRaid1Stream(); } else if (raidType == "jbod") { raidStream = new SoftJbodStream(); if (opts.JbodSizes.Count() != (opts.Paths.Count() - 1)) { Logger.Error("A JBOD-array requires a amount of [ Paths - 1 ] -j/--jbod options to be set"); return(INVALID_ARGUMENT); } } else { Logger.Error("RAID-type {0} is not implemented yet", raidType); return(NOT_IMPLEMENTED); } var jbodSizes = new List <long>(); foreach (var rawJbodSize in opts.JbodSizes) { jbodSizes.Add(ParseSizeString(rawJbodSize)); } raidStream.StripeSize = opts.StripeSize; var paths = new List <string>(opts.Paths); var jbodSizeLeft = opts.Size; for (int i = 0; i < paths.Count; i++) { var pathStream = OpenPathUncached(paths[i], FileMode.Create, FileAccess.ReadWrite, FileShare.Read); var offset = 0L; if (offsets.Count > 0) { if (i < offsets.Count) { offset = offsets[i]; } else { offset = offsets[offsets.Count - 1]; } } if (raidType == "jbod") { var jbodSize = 0L; if (i != paths.Count - 1) { jbodSize = jbodSizes[i]; } else { jbodSize = jbodSizeLeft; } jbodSizeLeft -= jbodSize; pathStream = new FixedLengthStream(pathStream, jbodSize, true); } if (offset > 0) { pathStream = new OffsetableStream(pathStream, offset); } raidStream.AddStream(pathStream); } raidStream.Open(); if (FormatStream(opts.FileSystem, raidStream, opts.Size, "nDiscUtils Image") == null) { return(INVALID_ARGUMENT); } Cleanup(raidStream); WaitForUserExit(); return(SUCCESS); }
public static int Run(Options opts) { RunHelpers(opts); if (opts.Paths.Count() < 2) { Logger.Error("A RAID with only one disk sounds a bit useless, doesn't it?"); return(INVALID_ARGUMENT); } if (!MakeRaidImage.kRaidTypes.Keys.Any(t => t.Equals(opts.RaidType, StringComparison.OrdinalIgnoreCase))) { Logger.Error("Could not determined RAID type of \"{0}\"", opts.RaidType); Logger.Error("Supported RAID types are: {0}", string.Join(", ", MakeRaidImage.kRaidTypes.Keys)); return(INVALID_ARGUMENT); } var raidType = MakeRaidImage.kRaidTypes[opts.RaidType.ToLower()]; AbstractSoftRaidStream raidStream = null; var rawOffsets = opts.Offsets; var offsets = new List <long>(); foreach (var rawOffset in opts.Offsets) { offsets.Add(ParseSizeString(rawOffset)); } if (raidType == "0") { raidStream = new SoftRaid0Stream(); } else if (raidType == "1") { raidStream = new SoftRaid1Stream(); } else if (raidType == "jbod") { raidStream = new SoftJbodStream(); if (opts.JbodSizes.Count() != opts.Paths.Count()) { Logger.Error("A JBOD-array requires a amount of [ Paths ] -j/--jbod options to be set"); return(INVALID_ARGUMENT); } } else { Logger.Error("RAID-type {0} is not implemented yet", raidType); return(NOT_IMPLEMENTED); } raidStream.StripeSize = opts.StripeSize; var paths = new List <string>(opts.Paths); for (int i = 0; i < paths.Count; i++) { var pathStream = OpenPathUncached(paths[i], FileMode.Open, FileAccess.ReadWrite, FileShare.Read); var offset = 0L; if (offsets.Count > 0) { if (i < offsets.Count) { offset = offsets[i]; } else { offset = offsets[offsets.Count - 1]; } } if (raidType == "jbod") { pathStream = new FixedLengthStream(pathStream, ParseSizeString(opts.JbodSizes.ElementAt(i)), true); } if (offset > 0) { pathStream = new OffsetableStream(pathStream, offset); } if (pathStream is FixedLengthStream fixedStream) { var geometry = FindGeometry(fixedStream); fixedStream.SetLength(geometry.TotalSectorsLong * geometry.BytesPerSector); } raidStream.AddStream(pathStream); } raidStream.Open(); MountStream(raidStream, opts); Cleanup(raidStream); WaitForUserExit(); return(SUCCESS); }