Exemplo n.º 1
0
 public EditGroupForm(TreeView treeView, bool rename = false)
 {
     InitializeComponent();
     this.rename = rename;
     if (rename)
     {
         Text         = "Edit Saved Route Group";
         button1.Text = "Save";
         Config.SavedRouteNode editNode = Global.Config.SavedRoutes.GetSelectedNode(treeView);
         textBox1.Text     = editNode.Name;
         checkBox1.Checked = ((Config.SavedRouteGroup)editNode).AutoLoadOnStartup;
     }
     else
     {
         Text         = "Create Saved Route Group";
         button1.Text = "Create";
     }
     this.treeView = treeView;
 }
Exemplo n.º 2
0
        async void UpdateRoutes(CancellationTokenSource cts)
        {
            try
            {
                while (!cts.IsCancellationRequested)
                {
                    listView1.BeginUpdate();
                    List <Iphlpapi.Route>        routes         = Iphlpapi.GetRoutes(Iphlpapi.FAMILY.AF_UNSPEC);
                    List <Config.SavedRouteItem> savedRoutes    = Global.Config.SavedRoutes.GetRoutes(Global.Config.SavedRoutes.Nodes[0]);
                    Config.SavedRouteNode        selectedNode   = Global.Config.SavedRoutes.GetSelectedNode(treeView1);
                    List <Config.SavedRouteItem> selectedRoutes = Global.Config.SavedRoutes.GetRoutes(selectedNode);
                    // add/update items
                    foreach (Iphlpapi.Route route in routes)
                    {
                        if (route.IPVersion == 4 && comboBox1.SelectedIndex == 1 ||
                            route.IPVersion == 6 && comboBox1.SelectedIndex == 0)
                        {
                            continue;
                        }
                        // skip disconnected interfaces
                        if (Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).Count() == 0 &&
                            route.InterfaceIndex != 1)
                        {
                            continue;
                        }
                        // calculate route metric
                        if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1)
                        {
                            if (route.InterfaceIndex != 1)
                            {
                                route.Metric += Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).FirstOrDefault().InterfaceMetric;
                            }
                            else
                            {
                                route.Metric += NetworkInterface.Loopback.InterfaceMetric;
                            }
                        }
                        bool   found = false;
                        string ifIndex;
                        if (route.InterfaceIndex == 1)
                        {
                            ifIndex = route.InterfaceIndex.ToString() + " (" + NetworkInterface.Loopback.Name + ")";
                        }
                        else
                        {
                            ifIndex = route.InterfaceIndex.ToString() + " (" + Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).FirstOrDefault().Name + ")";
                        }
                        // filter routes
                        bool filter = false;
                        if (checkBox1.Checked)
                        {
                            if (selectedRoutes.Find(i =>
                                                    i.Destination == route.Destination &&
                                                    i.Prefix == route.Prefix &&
                                                    i.Gateway == route.Gateway &&
                                                    (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) &&
                                                     Global.NetworkInterfaces[i.InterfaceGuid].Index == route.InterfaceIndex ||
                                                     NetworkInterface.Loopback.Guid == i.InterfaceGuid &&
                                                     NetworkInterface.Loopback.Index == route.InterfaceIndex)) == null)
                            {
                                filter = true;
                            }
                        }
                        // TODO: update routes with all matching saved routes using Find()
                        // update existing items
                        foreach (ListViewItem item in listView1.Items)
                        {
                            if (item.SubItems[0].Text == route.Destination &&
                                item.SubItems[1].Text == route.Prefix &&
                                item.SubItems[2].Text == route.Gateway &&
                                item.SubItems[3].Text == ifIndex)
                            {
                                item.SubItems[4].Text = route.Age.ToString();
                                item.SubItems[5].Text = route.Metric.ToString();
                                Config.SavedRouteItem savedRoute = savedRoutes.Find(i =>
                                                                                    i.Destination == route.Destination &&
                                                                                    i.Prefix == route.Prefix &&
                                                                                    i.Gateway == route.Gateway &&
                                                                                    (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) &&
                                                                                     Global.NetworkInterfaces[i.InterfaceGuid].Index == route.InterfaceIndex ||
                                                                                     NetworkInterface.Loopback.Guid == i.InterfaceGuid &&
                                                                                     NetworkInterface.Loopback.Index == route.InterfaceIndex));
                                if (savedRoute != null)
                                {
                                    item.SubItems[6].Text = savedRoute.Name;
                                }
                                else
                                {
                                    item.SubItems[6].Text = "";
                                }
                                found = true;
                                break;
                            }
                        }

                        if (found || filter)
                        {
                            continue;
                        }
                        listView1.Items.Add(new ListViewItem(new string[] { route.Destination, route.Prefix, route.Gateway, ifIndex, route.Age.ToString(), route.Metric.ToString(), "" }));
                    }
                    // delete items
                    foreach (ListViewItem item in listView1.Items)
                    {
                        string ifIndex = Regex.Replace(item.SubItems[3].Text, @"^(\d+) .*$", "$1");
                        // filter routes
                        bool filter = false;
                        if (checkBox1.Checked)
                        {
                            if (selectedRoutes.Find(i =>
                                                    i.Destination == item.SubItems[0].Text &&
                                                    i.Prefix == item.SubItems[1].Text &&
                                                    i.Gateway == item.SubItems[2].Text &&
                                                    (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) &&
                                                     Global.NetworkInterfaces[i.InterfaceGuid].Index.ToString() == ifIndex ||
                                                     NetworkInterface.Loopback.Guid == i.InterfaceGuid &&
                                                     NetworkInterface.Loopback.Index.ToString() == ifIndex)) == null)
                            {
                                filter = true;
                            }
                        }
                        if (routes.Find((i) =>
                                        i.Destination == item.SubItems[0].Text &&
                                        i.Prefix == item.SubItems[1].Text &&
                                        i.Gateway == item.SubItems[2].Text &&
                                        i.InterfaceIndex.ToString() == ifIndex) == null ||
                            item.SubItems[0].Text.Contains(':') && comboBox1.SelectedIndex == 0 ||
                            !item.SubItems[0].Text.Contains(':') && comboBox1.SelectedIndex == 1 ||
                            filter)
                        {
                            item.Remove();
                        }
                    }
                    foreach (ColumnHeader column in listView1.Columns)
                    {
                        column.Width = -2;
                    }
                    listView1.EndUpdate();
                    await TaskEx.Delay(1000);
                }
            }
            catch { }
        }
Exemplo n.º 3
0
        public LoadForm(TreeView treeView)
        {
            InitializeComponent();
            this.treeView = treeView;
            // resize
            Size      minimumSize     = ClientSize;
            Rectangle screenRectangle = RectangleToScreen(ClientRectangle);
            int       titleBarHeight  = screenRectangle.Top - Top;
            int       borderThickness = screenRectangle.Left - Left;
            Rectangle workingArea     = Screen.GetWorkingArea(this);
            Size      clientSize      = new Size();

            if (minimumSize.Width > workingArea.Width - 2 * borderThickness)
            {
                clientSize.Width = workingArea.Width - 2 * borderThickness;
            }
            else
            {
                clientSize.Width = minimumSize.Width;
            }
            if (minimumSize.Height > workingArea.Height - titleBarHeight - borderThickness)
            {
                clientSize.Height = workingArea.Height - titleBarHeight - borderThickness;
            }
            else
            {
                clientSize.Height = minimumSize.Height;
            }
            AutoScrollMinSize = new System.Drawing.Size(minimumSize.Width, minimumSize.Height);
            ClientSize        = new Size(clientSize.Width, clientSize.Height);
            // load routes
            IPAddress ipAddress = new IPAddress(0);

            Config.SavedRouteNode loadNode = Global.Config.SavedRoutes.GetSelectedNode(treeView);
            loadRoutes   = Global.Config.SavedRoutes.GetRoutes(loadNode);
            activeRoutes = Iphlpapi.GetRoutes(Iphlpapi.FAMILY.AF_UNSPEC);
            foreach (Config.SavedRouteItem item in loadRoutes)
            {
                string interfaceIndex = "Not connected";
                int    ifIndex        = 0;
                string status         = "Not loaded";
                if (ValidateRoute(ref item.Destination, ref item.Prefix, ref item.Gateway, item.IPVersion))
                {
                    if (Global.NetworkInterfaces.ContainsKey(item.InterfaceGuid) &&
                        (item.IPVersion == 4 && Global.NetworkInterfaces[item.InterfaceGuid].IPv4Enabled ||
                         item.IPVersion == 6 && Global.NetworkInterfaces[item.InterfaceGuid].IPv6Enabled))
                    {
                        interfaceIndex = Global.NetworkInterfaces[item.InterfaceGuid].Index.ToString() +
                                         " (" + Global.NetworkInterfaces[item.InterfaceGuid].Name + " - ";
                        ifIndex = Global.NetworkInterfaces[item.InterfaceGuid].Index;
                        if (item.IPVersion == 4)
                        {
                            loadIPv4++;
                            if (Global.NetworkInterfaces[item.InterfaceGuid].IPv4Address.Count > 0)
                            {
                                interfaceIndex += Global.NetworkInterfaces[item.InterfaceGuid].IPv4Address[0].Address;
                            }
                            else
                            {
                                interfaceIndex += "0.0.0.0";
                            }
                        }
                        else
                        {
                            loadIPv6++;
                            if (Global.NetworkInterfaces[item.InterfaceGuid].IPv6Address.All.Count > 0)
                            {
                                interfaceIndex += Global.NetworkInterfaces[item.InterfaceGuid].IPv6Address.All[0].Address;
                            }
                            else
                            {
                                interfaceIndex += "::";
                            }
                        }
                        interfaceIndex += ")";
                    }
                    else if (NetworkInterface.Loopback.Guid == item.InterfaceGuid &&
                             Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 &&
                             (item.IPVersion == 4 && NetworkInterface.Loopback.IPv4Enabled ||
                              item.IPVersion == 6 && NetworkInterface.Loopback.IPv6Enabled))
                    {
                        interfaceIndex = "1 (" + NetworkInterface.Loopback.Name + " - ";
                        ifIndex        = 1;
                        if (item.IPVersion == 4)
                        {
                            loadIPv4++;
                            interfaceIndex += "127.0.0.1)";
                        }
                        else
                        {
                            loadIPv6++;
                            interfaceIndex += "::1)";
                        }
                    }
                    else
                    {
                        if (item.IPVersion == 4)
                        {
                            loadIPv4++;
                            NotConnectedIPv4Interfaces++;
                        }
                        else
                        {
                            loadIPv6++;
                            NotConnectedIPv6Interfaces++;
                        }
                    }
                    if (activeRoutes.Find(i =>
                                          i.IPVersion == item.IPVersion &&
                                          IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) &&
                                          (i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix)) &&
                                          IPAddress.Parse(i.Gateway).Equals(IPAddress.Parse(item.Gateway)) &&
                                          i.InterfaceIndex == ifIndex) != null)
                    {
                        status = "Active";
                    }
                    else if (activeRoutes.Find(i =>
                                               i.IPVersion == item.IPVersion &&
                                               IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) &&
                                               (i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix)) &&
                                               IPAddress.Parse(i.Gateway).Equals(IPAddress.Parse(item.Gateway))) != null)
                    {
                        status = "Active on a different interface";
                        if (item.IPVersion == 4)
                        {
                            NotActiveIPv4Routes++;
                        }
                        else
                        {
                            NotActiveIPv6Routes++;
                        }
                    }
                    else if (activeRoutes.Find(i =>
                                               i.IPVersion == item.IPVersion &&
                                               IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) &&
                                               (i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix))
                                               ) != null)
                    {
                        status = "Active with a different gateway";
                        if (item.IPVersion == 4)
                        {
                            NotActiveIPv4Routes++;
                        }
                        else
                        {
                            NotActiveIPv6Routes++;
                        }
                    }
                    else
                    {
                        if (item.IPVersion == 4)
                        {
                            NotActiveIPv4Routes++;
                        }
                        else
                        {
                            NotActiveIPv6Routes++;
                        }
                    }
                }
                else
                {
                    if (item.IPVersion == 4)
                    {
                        loadIPv4++;
                        NotActiveIPv4Routes++;
                        NotConnectedIPv4Interfaces++;
                    }
                    else
                    {
                        loadIPv6++;
                        NotActiveIPv6Routes++;
                        NotConnectedIPv6Interfaces++;
                    }
                }
                ListViewItem lvItem = new ListViewItem(new string[] {
                    item.Destination,
                    item.Prefix,
                    item.Gateway,
                    interfaceIndex,
                    item.Metric.ToString(),
                    item.Name,
                    status
                });
                lvItem.Tag = item;
                listView1.Items.Add(lvItem).Checked = true;
            }
            foreach (ColumnHeader column in listView1.Columns)
            {
                column.Width = -2;
            }
            // load configs
            defaultInterfaceMode.SelectedIndex   = 0;
            defaultIPv4GatewayMode.SelectedIndex = 3;
            defaultIPv6GatewayMode.SelectedIndex = 3;

            foreach (NetworkInterface nic in Global.NetworkInterfaces.Values)
            {
                if (nic.IPv4Enabled)
                {
                    defaultIPv4Interface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " +
                                                   (nic.IPv4Address.Count > 0 ? nic.IPv4Address.FirstOrDefault().Address : "0.0.0.0"));
                }
            }
            if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1)
            {
                if (NetworkInterface.Loopback.IPv4Enabled)
                {
                    defaultIPv4Interface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - 127.0.0.1)");
                }
            }

            foreach (NetworkInterface nic in Global.NetworkInterfaces.Values)
            {
                if (nic.IPv6Enabled)
                {
                    defaultIPv6Interface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " +
                                                   (nic.IPv6Address.All.Count > 0 ? nic.IPv6Address.All.FirstOrDefault().Address : "0.0.0.0"));
                }
            }
            if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1)
            {
                if (NetworkInterface.Loopback.IPv6Enabled)
                {
                    defaultIPv6Interface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - ::1)");
                }
            }
        }