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