예제 #1
0
        public void UpdateMapping()
        {
            if (_enabled)
            {
                TunnelModel[] tunnels = GlobalVars.SQL.GetAll();
                var           dict    = tunnels.Where(x => x.Enabled).ToDictionary(x => x.SrcPort, x => x);

                // Удалить тунели которых больше нет в бд или выключены.
                int[] toDelete = _dict.Keys.Except(dict.Keys).ToArray();
                foreach (int srcPort in toDelete)
                {
                    var listener = _dict[srcPort];
                    _dict.Remove(srcPort);
                    listener.Abort();
                }

                // Обновить отличающиеся.
                var join = _dict.Join(dict, x => x.Key, y => y.Key, (x, y) => new
                {
                    Before = x.Value,
                    After  = y.Value
                });

                foreach (var pair in join)
                {
                    if (!pair.Before.Mac.Equals(pair.After.Mac))
                    {
                        pair.Before.Mac = pair.After.Mac;
                    }

                    if (!pair.Before.DstEndPoint.Equals(pair.After.DstEndPoint))
                    {
                        pair.Before.DstEndPoint = pair.After.DstEndPoint;
                    }
                }

                // Добавить новые тунели.
                int[] toAdd = dict.Keys.Except(_dict.Keys).ToArray();
                foreach (int srcPort in toAdd)
                {
                    var m        = dict[srcPort];
                    var listener = new Listener(this, m.ID, m.SrcPort, m.DstEndPoint, m.Mac, m.Description);
                    _dict.Add(m.SrcPort, listener);
                    listener.Listen();
                    NewListener?.Invoke(this, listener);
                }
            }
        }
예제 #2
0
        public void EnableTunnels()
        {
            if (!_enabled)
            {
                _enabled = true;

                var listeners = GlobalVars.SQL.GetAll();
                foreach (var m in listeners.Where(x => x.Enabled))
                {
                    var listener = new Listener(this, m.ID, m.SrcPort, m.DstEndPoint, m.Mac, m.Description);
                    _dict.Add(m.SrcPort, listener);
                    listener.Listen();
                    NewListener?.Invoke(this, listener);
                }
            }
        }