Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }