public void TestRangeCount2() { List <PortOrRange> input = new List <PortOrRange> { new PortOrRange(80), new PortOrRange(81), new PortOrRange(82, 83), new PortOrRange(85), new PortOrRange(86, 90), new PortOrRange(180) }; Assert.AreEqual(1, PortRangeHelpers.CountRequiredMultiports(input)); }
public void TestRangeCount5() { List <PortOrRange> input = new List <PortOrRange> { }; for (int i = 0; i < 8; i++) { input.Add(new PortOrRange((uint)(100 * i), (uint)((100 * i) + 1))); } Assert.AreEqual(2, PortRangeHelpers.CountRequiredMultiports(input)); }
public void TestCompress6() { List <PortOrRange> input = new List <PortOrRange> { new PortOrRange(80), new PortOrRange(81), new PortOrRange(82, 83), new PortOrRange(85), new PortOrRange(86, 90) }; List <PortOrRange> output = new List <PortOrRange> { new PortOrRange(80, 83), new PortOrRange(85, 90) }; List <PortOrRange> actual = PortRangeHelpers.CompressRanges(input); CollectionAssert.AreEqual(output, actual); }
/// <summary> /// Add the rules /// </summary> /// <param name="ruleSet"></param> /// <param name="system"></param> /// <param name="rules"></param> /// <param name="chainName"></param> /// <param name="key"></param> /// <returns>an IPTables rule if the output is singular</returns> private IpTablesRule OutputRulesForGroup(IpTablesRuleSet ruleSet, IpTablesSystem system, List <IpTablesRule> rules, string chainName, TKey key) { if (rules.Count == 0) { return(null); } int count = 0, ruleCount = 0; List <PortOrRange> ranges = new List <PortOrRange>(); IpTablesRule rule1 = null; var firstCore = rules[0].GetModule <CoreModule>("core"); int ruleIdx = 1; Action buildRule = () => { //Console.WriteLine("t2"); if (ranges.Count == 0) { throw new IpTablesNetException("this should not happen"); } rule1 = IpTablesRule.Parse(_baseRule, system, ruleSet.Chains); //Core Module var ruleCore = rule1.GetModuleOrLoad <CoreModule>("core"); ruleCore.Protocol = firstCore.Protocol; if (firstCore.TargetMode == TargetMode.Goto && !String.IsNullOrEmpty(firstCore.Goto)) { ruleCore.Goto = firstCore.Goto; } else if (firstCore.TargetMode == TargetMode.Jump && !String.IsNullOrEmpty(firstCore.Jump)) { ruleCore.Jump = firstCore.Jump; } //Comment Module var ruleComment = rule1.GetModuleOrLoad <CommentModule>("comment"); ruleComment.CommentText = _commentPrefix + "|" + chainName + "|" + ruleIdx; // Create just one rule if there is only one set of multiports if (ruleCount == 1 && ranges.Count == 1 && _setJump != null) { _setJump(rule1, key); rule1.Chain = ruleSet.Chains.GetChainOrDefault(_chain, _table); } else { rule1.Chain = ruleSet.Chains.GetChainOrDefault(chainName, _table); } //Console.WriteLine(rule1.GetActionCommandParamters()); _setPort(rule1, new List <PortOrRange>(ranges)); ruleSet.AddRule(rule1); ruleIdx++; }; List <PortOrRange> ports = rules.Select(rule => _extractPort(rule)).ToList(); PortRangeHelpers.SortRangeFirstLowHigh(ports); ports = PortRangeHelpers.CompressRanges(ports); ruleCount = PortRangeHelpers.CountRequiredMultiports(ports); foreach (var e in ports) { if (!_ipset && (count == 14 && e.IsRange() || count == 15)) { buildRule(); count = 0; ranges.Clear(); } ranges.Add(e); if (e.IsRange()) { count += 2; } else { count++; } } if (ranges.Count != 0) { buildRule(); } if (ruleCount != 1 || ranges.Count != 1) { return(null); } return(rule1); }