Example #1
0
        static void Main(string[] args)
        {
            using (TikSession session = new TikSession(TikConnectorType.Api))
            {
                //REMARS - works without access to mikrotik router

                FirewallMangleList dest   = CreateList();
                FirewallMangleList srcTmp = CreateList();

                List <FirewallMangle> src = new List <FirewallMangle>(srcTmp);
                FirewallMangle        additionalMangle = new FirewallMangle()
                {
                    SrcAddress = "192.168.1.4", Action = "allow"
                };
                src.Insert(0, additionalMangle);

                dest.MergeSubset(dest, src, dest.First(), m => m.SrcAddress,
                                 (d, s) => d.Action = s.Action);


                foreach (FirewallMangle mangle in dest)
                {
                    Console.WriteLine(mangle);
                }
                Console.WriteLine("I/U/D/M {0}/{1}/{2}/{3}", dest.NewCount, dest.UpdatedCount, dest.DeletedCount, dest.MovesCount);
                Console.ReadLine();
            }
        }
Example #2
0
        private static FirewallMangleList CreateList()
        {
            FirewallMangleList result = new FirewallMangleList();

            for (int i = 1; i <= 3; i++)
            {
                string         address = string.Format("192.168.1.{0}", i);
                FirewallMangle mangle  = new FirewallMangle()
                {
                    SrcAddress = address, Action = "allow"
                };
                result.Add(mangle);

                mangle.MarkClear(); //workaround
            }

            result.ClearMoves();

            return(result);
        }
Example #3
0
        private static void FirewallMangleMerge(ITikConnection connection)
        {
            //manage just subset before rules marked with comment =START= and =END=

            //Create subset boundaries if not present
            const string startComment = "=START=";
            const string endComment   = "=END=";
            var          startMangle  = connection.LoadSingleOrDefault <FirewallMangle>(connection.CreateParameter("comment", startComment));

            if (startMangle == null)
            {
                startMangle = new FirewallMangle()
                {
                    Chain    = "forward",
                    Action   = FirewallMangle.ActionType.Passthrough,
                    Comment  = startComment,
                    Disabled = true,
                };
                connection.Save(startMangle);
            }
            ;
            var endMangle = connection.LoadSingleOrDefault <FirewallMangle>(connection.CreateParameter("comment", endComment));

            if (endMangle == null)
            {
                endMangle = new FirewallMangle()
                {
                    Chain    = "forward",
                    Action   = FirewallMangle.ActionType.Passthrough,
                    Comment  = endComment,
                    Disabled = true,
                };
                connection.Save(endMangle);
            }
            ;

            //Merge subset between boundaries
            string unique = Guid.NewGuid().ToString();
            List <FirewallMangle> original = connection.LoadAll <FirewallMangle>().SkipWhile(m => m.Comment != startComment).TakeWhile(m => m.Comment != endComment)
                                             .Concat(new List <FirewallMangle> {
                endMangle
            })
                                             .ToList(); //just subset between =START= and =END= (not very elegant but functional and short ;-) )
            List <FirewallMangle> expected = new List <FirewallMangle>();

            expected.Add(startMangle);
            expected.Add(new FirewallMangle()
            {
                Chain         = "forward",
                SrcAddress    = "192.168.1.1",
                Action        = FirewallMangle.ActionType.MarkPacket,
                NewPacketMark = "mark-001",
                Passthrough   = false,
            });
            expected.Add(new FirewallMangle()
            {
                Chain         = "forward",
                SrcAddress    = "192.168.1.2",
                Action        = FirewallMangle.ActionType.MarkPacket,
                NewPacketMark = "mark-002" + "-" + unique,
                Passthrough   = false,
            });
            expected.Add(new FirewallMangle()
            {
                Chain         = "forward",
                SrcAddress    = "192.168.1.3",
                Action        = FirewallMangle.ActionType.MarkPacket,
                NewPacketMark = "mark-003",
                Passthrough   = false,
                Comment       = unique,
            });
            expected.Add(endMangle);

            connection.CreateMerge(expected, original)
            .WithKey(mangle => mangle.SrcAddress + ":" + mangle.Comment) //Use src-address as key
            .Field(q => q.Chain)
            .Field(q => q.SrcAddress)                                    //Do not forget include also key fields !!!
            .Field(q => q.Action)
            .Field(q => q.NewPacketMark)
            .Field(q => q.Passthrough)
            .Field(q => q.Comment)
            .Save();
        }