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)); } }
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); }