Esempio n. 1
0
 public static int RunSingleArgs(string[] args)
 {
     if (args[0] == "-m" || args[0] == "--minimize")
     {
         return(Minimize.PerformMinimize(args));
     }
     else if (args[0] == "-d" || args[0] == "--derange")
     {
         return(Derange.PerformDerange(args));
     }
     else if (args[0] == "-s" || args[0] == "--split")
     {
         return(Split.PerformSplit(args));
     }
     else if (args[0] == "-r" || args[0] == "--resize")
     {
         return(Resize.PerformResize(args));
     }
     else if (args[0] == "-e" || args[0] == "--enumerate")
     {
         return(Enumerate.PerformEnumerate(args));
     }
     else
     {
         return(ShowNet.PerformShowNet(args));
     }
 }
Esempio n. 2
0
        public static int PerformSplit(string[] args)
        {
            if (args.Length < 3)
            {
                Program.UsageAndExit();
            }

            var ipv4Match = Program.IPv4WithCidrRegex.Match(args[1]);

            if (ipv4Match.Success)
            {
                Tuple <IPv4Address, IPv4Network> addressAndNet = Program.ParseIPv4CidrSpec(ipv4Match);
                if (addressAndNet == null)
                {
                    return(1);
                }

                Console.WriteLine("Subnet to split:");
                ShowNet.OutputIPv4Network(addressAndNet.Item2, addressAndNet.Item2.BaseAddress);
                Console.WriteLine();

                BigInteger[] splits = ParseHostCountSpecs(args);
                if (splits == null)
                {
                    return(1);
                }

                IPNetwork <IPv4Address>[] subnets = SplitSubnet(addressAndNet.Item2, splits,
                                                                (addr, cidr) => new IPv4Network(addr, cidr));
                if (subnets == null)
                {
                    Console.WriteLine("Not enough addresses available for this split.");
                    return(0);
                }

                foreach (Tuple <BigInteger, IPNetwork <IPv4Address> > splitAndSubnet in splits.Zip(subnets, Tuple.Create))
                {
                    Console.WriteLine("Subnet for {0} hosts:", splitAndSubnet.Item1);
                    ShowNet.OutputIPv4Network(splitAndSubnet.Item2);
                    Console.WriteLine();
                }

                Console.WriteLine("Unused networks:");
                var maxUsedAddress = subnets
                                     .Select(s => s.LastAddressOfSubnet)
                                     .Max();
                var nextUnusedAddress = maxUsedAddress.Add(1);
                List <IPNetwork <IPv4Address> > unusedSubnets = Derange.RangeToSubnets(nextUnusedAddress,
                                                                                       addressAndNet.Item2.LastAddressOfSubnet, (addr, cidr) => new IPv4Network(addr, cidr));

                foreach (IPNetwork <IPv4Address> unusedSubnet in unusedSubnets)
                {
                    Console.WriteLine("{0}/{1}", unusedSubnet.BaseAddress, unusedSubnet.CidrPrefix.Value);
                }

                return(0);
            }

            var ipv6Match = Program.IPv6WithCidrRegex.Match(args[1]);

            if (ipv6Match.Success)
            {
                Tuple <IPv6Address, IPv6Network> addressAndNet = Program.ParseIPv6CidrSpec(ipv6Match);
                if (addressAndNet == null)
                {
                    return(1);
                }

                Console.WriteLine("Subnet to split:");
                ShowNet.OutputIPv6Network(addressAndNet.Item2, addressAndNet.Item2.BaseAddress);

                BigInteger[] splits = ParseHostCountSpecs(args);
                if (splits == null)
                {
                    return(1);
                }

                IPNetwork <IPv6Address>[] subnets = SplitSubnet(addressAndNet.Item2, splits,
                                                                (addr, cidr) => new IPv6Network(addr, cidr));
                if (subnets == null)
                {
                    Console.WriteLine("Not enough addresses available for this split.");
                    return(0);
                }

                foreach (Tuple <BigInteger, IPNetwork <IPv6Address> > splitAndSubnet in splits.Zip(subnets, Tuple.Create))
                {
                    Console.WriteLine("Subnet for {0} hosts:", splitAndSubnet.Item1);
                    ShowNet.OutputIPv6Network(addressAndNet.Item2);
                    Console.WriteLine();
                }

                Console.WriteLine("Unused networks:");
                var maxUsedAddress = subnets
                                     .Select(s => s.LastAddressOfSubnet)
                                     .Max();
                var nextUnusedAddress = maxUsedAddress.Add(1);
                List <IPNetwork <IPv6Address> > unusedSubnets = Derange.RangeToSubnets(nextUnusedAddress,
                                                                                       addressAndNet.Item2.SubnetMask, (addr, cidr) => new IPv6Network(addr, cidr));

                foreach (IPNetwork <IPv6Address> unusedSubnet in unusedSubnets)
                {
                    Console.WriteLine("{0}/{1}", unusedSubnet.BaseAddress, unusedSubnet.CidrPrefix.Value);
                }

                return(0);
            }

            Console.Error.WriteLine("Failed to parse {0} as a subnet specification.", args[1]);
            return(1);
        }