diff --git a/AddPortMapForm.cs b/AddPortMapForm.cs index 66ecf50..9895a74 100644 --- a/AddPortMapForm.cs +++ b/AddPortMapForm.cs @@ -13,6 +13,7 @@ namespace MeshCentralRouter public partial class AddPortMapForm : Form { private MeshCentralServer meshcentral; + private NodeClass selectedNode = null; public AddPortMapForm(MeshCentralServer meshcentral) { @@ -25,34 +26,48 @@ namespace MeshCentralRouter public int getRemotePort() { return (int)remoteNumericUpDown.Value; } public int getAppId() { return (int)appComboBox.SelectedIndex; } public NodeClass getNode() { return (NodeClass)nodeComboBox.SelectedItem; } + public void setNode(NodeClass node) { selectedNode = node; } private void AddPortMapForm_Load(object sender, EventArgs e) { - // Fill the groups - groupComboBox.Items.Clear(); - foreach (string meshid in meshcentral.meshes.Keys) + if (selectedNode == null) { - MeshClass mesh = meshcentral.meshes[meshid]; - if (mesh.type == 2) + // Fill the groups + groupComboBox.Items.Clear(); + foreach (string meshid in meshcentral.meshes.Keys) { - int nodeCount = 0; - foreach (string nodeid in meshcentral.nodes.Keys) + MeshClass mesh = meshcentral.meshes[meshid]; + if (mesh.type == 2) { - NodeClass node = meshcentral.nodes[nodeid]; - if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; } + int nodeCount = 0; + foreach (string nodeid in meshcentral.nodes.Keys) + { + NodeClass node = meshcentral.nodes[nodeid]; + if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; } + } + if (nodeCount > 0) { groupComboBox.Items.Add(mesh); } } - if (nodeCount > 0) { groupComboBox.Items.Add(mesh); } } - } - // Set default selection - if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; } - appComboBox.SelectedIndex = 1; - fillNodesInDropDown(); + // Set default selection + if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; } + appComboBox.SelectedIndex = 1; + fillNodesInDropDown(); + } else { + groupComboBox.Items.Add(selectedNode.mesh); + groupComboBox.SelectedIndex = 0; + groupComboBox.Enabled = false; + nodeComboBox.Items.Add(selectedNode); + nodeComboBox.SelectedIndex = 0; + nodeComboBox.Enabled = false; + appComboBox.SelectedIndex = 1; + } } private void fillNodesInDropDown() { + if (selectedNode != null) return; + MeshClass mesh = (MeshClass)groupComboBox.SelectedItem; // Fill the nodes dropdown diff --git a/AddRelayMapForm.cs b/AddRelayMapForm.cs index 6ddfc97..9f562ce 100644 --- a/AddRelayMapForm.cs +++ b/AddRelayMapForm.cs @@ -14,6 +14,7 @@ namespace MeshCentralRouter public partial class AddRelayMapForm : Form { private MeshCentralServer meshcentral; + private NodeClass selectedNode = null; public AddRelayMapForm(MeshCentralServer meshcentral) { @@ -28,32 +29,47 @@ namespace MeshCentralRouter public string getRemoteIP() { return remoteIpTextBox.Text; } public int getAppId() { return (int)appComboBox.SelectedIndex; } public NodeClass getNode() { return (NodeClass)nodeComboBox.SelectedItem; } + public void setNode(NodeClass node) { selectedNode = node; } private void AddRelayMapForm_Load(object sender, EventArgs e) { - // Fill the groups - groupComboBox.Items.Clear(); - foreach (string meshid in meshcentral.meshes.Keys) + if (selectedNode == null) { - MeshClass mesh = meshcentral.meshes[meshid]; - if (mesh.type == 2) { - int nodeCount = 0; - foreach (string nodeid in meshcentral.nodes.Keys) { - NodeClass node = meshcentral.nodes[nodeid]; - if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; } + // Fill the groups + groupComboBox.Items.Clear(); + foreach (string meshid in meshcentral.meshes.Keys) + { + MeshClass mesh = meshcentral.meshes[meshid]; + if (mesh.type == 2) + { + int nodeCount = 0; + foreach (string nodeid in meshcentral.nodes.Keys) + { + NodeClass node = meshcentral.nodes[nodeid]; + if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; } + } + if (nodeCount > 0) { groupComboBox.Items.Add(mesh); } } - if (nodeCount > 0) { groupComboBox.Items.Add(mesh); } } - } - // Set default selection - if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; } - appComboBox.SelectedIndex = 1; - fillNodesInDropDown(); + // Set default selection + if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; } + appComboBox.SelectedIndex = 1; + fillNodesInDropDown(); + } else { + groupComboBox.Items.Add(selectedNode.mesh); + groupComboBox.SelectedIndex = 0; + groupComboBox.Enabled = false; + nodeComboBox.Items.Add(selectedNode); + nodeComboBox.SelectedIndex = 0; + nodeComboBox.Enabled = false; + appComboBox.SelectedIndex = 1; + } } private void fillNodesInDropDown() { + if (selectedNode != null) return; MeshClass mesh = (MeshClass)groupComboBox.SelectedItem; // Fill the nodes dropdown diff --git a/DeviceUserControl.resx b/DeviceUserControl.resx index 5fb69c2..188e742 100644 --- a/DeviceUserControl.resx +++ b/DeviceUserControl.resx @@ -322,6 +322,12 @@ 313, 17 + + 149, 22 + + + Set RDP port... + 150, 26 @@ -355,12 +361,6 @@ 6 - - 149, 22 - - - Set RDP port... - 17, 17 @@ -369,7 +369,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAy - mgAAAk1TRnQBSQFMAgEBCAEAAWgBAAFoAQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI + mgAAAk1TRnQBSQFMAgEBCAEAAXABAAFwAQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI AwABlgMAAQEBAAEQBQABYAHq/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A @@ -1037,7 +1037,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4 - mgAAAk1TRnQBSQFMAgEBCAEAAXABAAFwAQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI + mgAAAk1TRnQBSQFMAgEBCAEAAXgBAAF4AQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI AwABlgMAAQEBAAEQBQABYAHq/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A @@ -1706,6 +1706,12 @@ 468, 17 + + 178, 22 + + + Use Alternate Port... + 179, 26 @@ -1739,12 +1745,6 @@ 5 - - 178, 22 - - - Use Alternate Port... - Top, Right @@ -1833,7 +1833,7 @@ 6, 13 - 433, 60 + 429, 56 setRDPPortToolStripMenuItem diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 812051f..b5d41ba 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -110,6 +110,19 @@ this.saveMappingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openMapFileDialog = new System.Windows.Forms.OpenFileDialog(); this.saveMapFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.devicesListView = new System.Windows.Forms.ListView(); + this.devicesImageList = new System.Windows.Forms.ImageList(this.components); + this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.stateColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.devicesContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.httpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.httpsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.rdpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.scpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); + this.addMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addRelayMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.panel5.SuspendLayout(); this.mainPanel.SuspendLayout(); this.mainTabControl.SuspendLayout(); @@ -138,6 +151,7 @@ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.trayIconContextMenuStrip.SuspendLayout(); this.mappingsContextMenuStrip.SuspendLayout(); + this.devicesContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // // panel5 @@ -535,6 +549,7 @@ resources.ApplyResources(this.devicesPanel, "devicesPanel"); this.devicesPanel.BackColor = System.Drawing.SystemColors.ControlLightLight; this.devicesPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.devicesPanel.Controls.Add(this.devicesListView); this.devicesPanel.Controls.Add(this.noSearchResultsLabel); this.devicesPanel.Controls.Add(this.noDevicesLabel); this.devicesPanel.Name = "devicesPanel"; @@ -719,6 +734,117 @@ this.saveMapFileDialog.DefaultExt = "mcrouter"; resources.ApplyResources(this.saveMapFileDialog, "saveMapFileDialog"); // + // devicesListView + // + this.devicesListView.BackColor = System.Drawing.SystemColors.Window; + this.devicesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.nameColumnHeader, + this.stateColumnHeader}); + this.devicesListView.ContextMenuStrip = this.devicesContextMenuStrip; + this.devicesListView.FullRowSelect = true; + this.devicesListView.GridLines = true; + this.devicesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.devicesListView.LargeImageList = this.devicesImageList; + resources.ApplyResources(this.devicesListView, "devicesListView"); + this.devicesListView.MultiSelect = false; + this.devicesListView.Name = "devicesListView"; + this.devicesListView.SmallImageList = this.devicesImageList; + this.devicesListView.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.devicesListView.UseCompatibleStateImageBehavior = false; + this.devicesListView.View = System.Windows.Forms.View.Details; + this.devicesListView.DoubleClick += new System.EventHandler(this.devicesListView_DoubleClick); + // + // devicesImageList + // + this.devicesImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("devicesImageList.ImageStream"))); + this.devicesImageList.TransparentColor = System.Drawing.Color.Transparent; + this.devicesImageList.Images.SetKeyName(0, "icons01.png"); + this.devicesImageList.Images.SetKeyName(1, "icons01t.png"); + this.devicesImageList.Images.SetKeyName(2, "icons02.png"); + this.devicesImageList.Images.SetKeyName(3, "icons02t.png"); + this.devicesImageList.Images.SetKeyName(4, "icons03.png"); + this.devicesImageList.Images.SetKeyName(5, "icons03t.png"); + this.devicesImageList.Images.SetKeyName(6, "icons04.png"); + this.devicesImageList.Images.SetKeyName(7, "icons04t.png"); + this.devicesImageList.Images.SetKeyName(8, "icons05.png"); + this.devicesImageList.Images.SetKeyName(9, "icons05t.png"); + this.devicesImageList.Images.SetKeyName(10, "icons06.png"); + this.devicesImageList.Images.SetKeyName(11, "icons06t.png"); + this.devicesImageList.Images.SetKeyName(12, "icons07.png"); + this.devicesImageList.Images.SetKeyName(13, "icons07t.png"); + this.devicesImageList.Images.SetKeyName(14, "icons08.png"); + this.devicesImageList.Images.SetKeyName(15, "icons08t.png"); + // + // nameColumnHeader + // + resources.ApplyResources(this.nameColumnHeader, "nameColumnHeader"); + // + // stateColumnHeader + // + resources.ApplyResources(this.stateColumnHeader, "stateColumnHeader"); + // + // devicesContextMenuStrip + // + this.devicesContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addMapToolStripMenuItem, + this.addRelayMapToolStripMenuItem, + this.toolStripMenuItem3, + this.httpToolStripMenuItem, + this.httpsToolStripMenuItem, + this.rdpToolStripMenuItem, + this.sshToolStripMenuItem, + this.scpToolStripMenuItem}); + this.devicesContextMenuStrip.Name = "devicesContextMenuStrip"; + resources.ApplyResources(this.devicesContextMenuStrip, "devicesContextMenuStrip"); + this.devicesContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.devicesContextMenuStrip_Opening); + // + // httpToolStripMenuItem + // + this.httpToolStripMenuItem.Name = "httpToolStripMenuItem"; + resources.ApplyResources(this.httpToolStripMenuItem, "httpToolStripMenuItem"); + this.httpToolStripMenuItem.Click += new System.EventHandler(this.httpToolStripMenuItem_Click); + // + // httpsToolStripMenuItem + // + this.httpsToolStripMenuItem.Name = "httpsToolStripMenuItem"; + resources.ApplyResources(this.httpsToolStripMenuItem, "httpsToolStripMenuItem"); + this.httpsToolStripMenuItem.Click += new System.EventHandler(this.httpsToolStripMenuItem_Click); + // + // rdpToolStripMenuItem + // + this.rdpToolStripMenuItem.Name = "rdpToolStripMenuItem"; + resources.ApplyResources(this.rdpToolStripMenuItem, "rdpToolStripMenuItem"); + this.rdpToolStripMenuItem.Click += new System.EventHandler(this.rdpToolStripMenuItem_Click); + // + // sshToolStripMenuItem + // + this.sshToolStripMenuItem.Name = "sshToolStripMenuItem"; + resources.ApplyResources(this.sshToolStripMenuItem, "sshToolStripMenuItem"); + this.sshToolStripMenuItem.Click += new System.EventHandler(this.sshToolStripMenuItem_Click); + // + // scpToolStripMenuItem + // + this.scpToolStripMenuItem.Name = "scpToolStripMenuItem"; + resources.ApplyResources(this.scpToolStripMenuItem, "scpToolStripMenuItem"); + this.scpToolStripMenuItem.Click += new System.EventHandler(this.scpToolStripMenuItem_Click); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + resources.ApplyResources(this.toolStripMenuItem3, "toolStripMenuItem3"); + // + // addMapToolStripMenuItem + // + resources.ApplyResources(this.addMapToolStripMenuItem, "addMapToolStripMenuItem"); + this.addMapToolStripMenuItem.Name = "addMapToolStripMenuItem"; + this.addMapToolStripMenuItem.Click += new System.EventHandler(this.addMapToolStripMenuItem_Click); + // + // addRelayMapToolStripMenuItem + // + this.addRelayMapToolStripMenuItem.Name = "addRelayMapToolStripMenuItem"; + resources.ApplyResources(this.addRelayMapToolStripMenuItem, "addRelayMapToolStripMenuItem"); + this.addRelayMapToolStripMenuItem.Click += new System.EventHandler(this.addRelayMapToolStripMenuItem_Click); + // // MainForm // resources.ApplyResources(this, "$this"); @@ -762,6 +888,7 @@ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.trayIconContextMenuStrip.ResumeLayout(false); this.mappingsContextMenuStrip.ResumeLayout(false); + this.devicesContextMenuStrip.ResumeLayout(false); this.ResumeLayout(false); } @@ -847,6 +974,19 @@ private System.Windows.Forms.ToolStripMenuItem saveMappingsToolStripMenuItem; private System.Windows.Forms.OpenFileDialog openMapFileDialog; private System.Windows.Forms.SaveFileDialog saveMapFileDialog; + private System.Windows.Forms.ListView devicesListView; + private System.Windows.Forms.ImageList devicesImageList; + private System.Windows.Forms.ColumnHeader nameColumnHeader; + private System.Windows.Forms.ColumnHeader stateColumnHeader; + private System.Windows.Forms.ContextMenuStrip devicesContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem httpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem httpsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem rdpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sshToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem scpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addMapToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addRelayMapToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3; } } diff --git a/MainForm.cs b/MainForm.cs index 9546016..6a7ef66 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -49,6 +49,7 @@ namespace MeshCentralRouter public Process installProcess = null; public string acceptableCertHash = null; public ArrayList mappingsToSetup = null; + public bool deviceListViewMode = true; public void setRegValue(string name, string value) { try { Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Open Source\MeshCentral Router", name, value); } catch (Exception) { } @@ -170,6 +171,7 @@ namespace MeshCentralRouter int argflags = 0; foreach (string arg in this.args) { + if (arg.ToLower() == "-oldstyle") { deviceListViewMode = false; } if (arg.ToLower() == "-install") { hookRouter(); forceExit = true; return; } if (arg.ToLower() == "-uninstall") { unHookRouter(); forceExit = true; return; } if (arg.ToLower() == "-debug") { debug = true; } @@ -231,6 +233,20 @@ namespace MeshCentralRouter //scanner.MulticastPing(); if (autoLogin || (authLoginUrl != null)) { nextButton1_Click(null, null); } + + // Setup the device list view panel + if (deviceListViewMode) + { + devicesListView.Top = 0; + devicesListView.Left = 0; + devicesListView.Width = devicesPanel.Width; + devicesListView.Height = devicesPanel.Height; + devicesListView.Visible = true; + devicesPanel.AutoScroll = false; + toolStripMenuItem2.Visible = false; + sortByNameToolStripMenuItem.Visible = false; + sortByGroupToolStripMenuItem.Visible = false; + } } private void updatePanel1(object sender, EventArgs e) @@ -369,133 +385,193 @@ namespace MeshCentralRouter private void updateDeviceList() { string search = searchTextBox.Text.ToLower(); - devicesPanel.SuspendLayout(); - - // Untag all devices - foreach (Control c in devicesPanel.Controls) + if (deviceListViewMode) { - if (c.GetType() == typeof(DeviceUserControl)) { ((DeviceUserControl)c).present = false; } - } + devicesListView.SuspendLayout(); + devicesListView.Items.Clear(); - /* - lock (meshcentral.nodes) - { - // Add any missing devices ArrayList controlsToAdd = new ArrayList(); - foreach (MeshClass mesh in meshcentral.meshes.Values) + if (meshcentral.nodes != null) { - if (mesh.type == 2) + foreach (NodeClass node in meshcentral.nodes.Values) { - foreach (NodeClass node in meshcentral.nodes.Values) + if (node.agentid == -1) { continue; } + ListViewItem device; + if (node.listitem == null) { - if ((node.control == null) && (node.meshid == mesh.meshid)) + device = new ListViewItem(node.name); + device.SubItems.Add(node.getStateString()); + device.Tag = node; + node.listitem = device; + } else { + device = node.listitem; + device.SubItems[0].Text = node.name; + device.SubItems[1].Text = node.getStateString(); + } + + if ((node.meshid != null) && meshcentral.meshes.ContainsKey(node.meshid)) { node.mesh = (MeshClass)meshcentral.meshes[node.meshid]; } + if ((showGroupNamesToolStripMenuItem.Checked) && (node.mesh != null)) { + device.SubItems[0].Text = node.mesh.name + " - " + node.name; + } else { + device.SubItems[0].Text = node.name; + } + + bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((node.conn & 1) != 0)); + int imageIndex = (node.icon - 1) * 2; + if ((node.conn & 1) == 0) { imageIndex++; } + device.ImageIndex = imageIndex; + if (connVisible && ((search == "") || (device.SubItems[0].Text.ToLower().IndexOf(search) >= 0))) { controlsToAdd.Add(device); } + } + + // Add all controls at once to make it fast. + if (controlsToAdd.Count > 0) { + devicesListView.Items.AddRange((ListViewItem[])controlsToAdd.ToArray(typeof(ListViewItem))); + } + } + + devicesListView.ResumeLayout(); + } + else + { + devicesPanel.SuspendLayout(); + + // Untag all devices + foreach (Control c in devicesPanel.Controls) + { + if (c.GetType() == typeof(DeviceUserControl)) { ((DeviceUserControl)c).present = false; } + } + + /* + lock (meshcentral.nodes) + { + // Add any missing devices + ArrayList controlsToAdd = new ArrayList(); + foreach (MeshClass mesh in meshcentral.meshes.Values) + { + if (mesh.type == 2) + { + foreach (NodeClass node in meshcentral.nodes.Values) { - // Add a new device - DeviceUserControl device = new DeviceUserControl(); - device.mesh = mesh; - device.node = node; - device.parent = this; - device.Dock = DockStyle.Top; - device.present = true; - node.control = device; - device.UpdateInfo(); - device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0); - controlsToAdd.Add(device); - } - else - { - // Tag the device as present - if (node.control != null) + if ((node.control == null) && (node.meshid == mesh.meshid)) { - node.control.present = true; - node.control.UpdateInfo(); + // Add a new device + DeviceUserControl device = new DeviceUserControl(); + device.mesh = mesh; + device.node = node; + device.parent = this; + device.Dock = DockStyle.Top; + device.present = true; + node.control = device; + device.UpdateInfo(); + device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0); + controlsToAdd.Add(device); + } + else + { + // Tag the device as present + if (node.control != null) + { + node.control.present = true; + node.control.UpdateInfo(); + } } } } } + + // Add all controls at once to make it fast. + if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); } } + */ - // Add all controls at once to make it fast. - if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); } - } - */ - - ArrayList controlsToAdd = new ArrayList(); - if (meshcentral.nodes != null) - { - foreach (NodeClass node in meshcentral.nodes.Values) + ArrayList controlsToAdd = new ArrayList(); + if (meshcentral.nodes != null) { - if (node.agentid == -1) { continue; } - if (node.control == null) + foreach (NodeClass node in meshcentral.nodes.Values) { - // Add a new device - DeviceUserControl device = new DeviceUserControl(); - if ((node.meshid != null) && meshcentral.meshes.ContainsKey(node.meshid)) { device.mesh = (MeshClass)meshcentral.meshes[node.meshid]; } - device.node = node; - device.parent = this; - device.Dock = DockStyle.Top; - device.present = true; - node.control = device; - device.UpdateInfo(); - device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0); - controlsToAdd.Add(device); - } - else - { - // Tag the device as present - if (node.control != null) + if (node.agentid == -1) { continue; } + if (node.control == null) { - node.control.present = true; - node.control.UpdateInfo(); + // Add a new device + DeviceUserControl device = new DeviceUserControl(); + if ((node.meshid != null) && meshcentral.meshes.ContainsKey(node.meshid)) { device.mesh = (MeshClass)meshcentral.meshes[node.meshid]; } + device.node = node; + device.parent = this; + device.Dock = DockStyle.Top; + device.present = true; + node.control = device; + device.UpdateInfo(); + device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0); + controlsToAdd.Add(device); + } + else + { + // Tag the device as present + if (node.control != null) + { + node.control.present = true; + node.control.UpdateInfo(); + } } } } - } - // Add all controls at once to make it fast. - if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); } + // Add all controls at once to make it fast. + if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); } - // Clear all untagged devices - bool removed; - do { - removed = false; - foreach (Control c in devicesPanel.Controls) { - if ((c.GetType() == typeof(DeviceUserControl)) && ((DeviceUserControl)c).present == false) { - devicesPanel.Controls.Remove(c); c.Dispose(); removed = true; + // Clear all untagged devices + bool removed; + do + { + removed = false; + foreach (Control c in devicesPanel.Controls) + { + if ((c.GetType() == typeof(DeviceUserControl)) && ((DeviceUserControl)c).present == false) + { + devicesPanel.Controls.Remove(c); c.Dispose(); removed = true; + } + } + } while (removed == true); + + // Filter devices + int visibleDevices = 0; + foreach (Control c in devicesPanel.Controls) + { + if (c.GetType() == typeof(DeviceUserControl)) + { + NodeClass n = ((DeviceUserControl)c).node; + bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0)); + if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0))) + { + c.Visible = connVisible; + visibleDevices++; + } + else + { + c.Visible = false; + } } } - } while (removed == true); - // Filter devices - int visibleDevices = 0; - foreach (Control c in devicesPanel.Controls) { - if (c.GetType() == typeof(DeviceUserControl)) { - NodeClass n = ((DeviceUserControl)c).node; - bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0)); - if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0))) { - c.Visible = connVisible; - visibleDevices++; - } else { - c.Visible = false; - } + // Sort devices + ArrayList sortlist = new ArrayList(); + foreach (Control c in devicesPanel.Controls) { if (c.GetType() == typeof(DeviceUserControl)) { sortlist.Add(c); } } + if (sortByNameToolStripMenuItem.Checked) + { + DeviceComparer comp = new DeviceComparer(); + sortlist.Sort(comp); } - } + else + { + DeviceGroupComparer comp = new DeviceGroupComparer(); + sortlist.Sort(comp); + } + remoteAllDeviceControls(); + devicesPanel.Controls.AddRange((DeviceUserControl[])sortlist.ToArray(typeof(DeviceUserControl))); - // Sort devices - ArrayList sortlist = new ArrayList(); - foreach (Control c in devicesPanel.Controls) { if (c.GetType() == typeof(DeviceUserControl)) { sortlist.Add(c); } } - if (sortByNameToolStripMenuItem.Checked) { - DeviceComparer comp = new DeviceComparer(); - sortlist.Sort(comp); - } else { - DeviceGroupComparer comp = new DeviceGroupComparer(); - sortlist.Sort(comp); + devicesPanel.ResumeLayout(); + noDevicesLabel.Visible = (sortlist.Count == 0); + noSearchResultsLabel.Visible = ((sortlist.Count > 0) && (visibleDevices == 0)); } - remoteAllDeviceControls(); - devicesPanel.Controls.AddRange((DeviceUserControl[])sortlist.ToArray(typeof(DeviceUserControl))); - - devicesPanel.ResumeLayout(); - noDevicesLabel.Visible = (sortlist.Count == 0); - noSearchResultsLabel.Visible = ((sortlist.Count > 0) && (visibleDevices == 0)); } private void remoteAllDeviceControls() @@ -758,6 +834,16 @@ namespace MeshCentralRouter private void addButton_Click(object sender, EventArgs e) { AddPortMapForm form = new AddPortMapForm(meshcentral); + + if (sender == null) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + form.setNode(node); + } + if (form.ShowDialog(this) == DialogResult.OK) { // Add a new port map @@ -875,6 +961,16 @@ namespace MeshCentralRouter private void addRelayMapButton_Click(object sender, EventArgs e) { AddRelayMapForm form = new AddRelayMapForm(meshcentral); + + if (sender == null) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + form.setNode(node); + } + if (form.ShowDialog(this) == DialogResult.OK) { // Add a new port map @@ -962,30 +1058,37 @@ namespace MeshCentralRouter private void searchTextBox_TextChanged(object sender, EventArgs e) { - // Filter devices - int visibleDevices = 0; - int deviceCount = 0; - string search = searchTextBox.Text.ToLower(); - foreach (Control c in devicesPanel.Controls) - { - if (c.GetType() == typeof(DeviceUserControl)) + if (deviceListViewMode) { + // Filter devices + updateDeviceList(); + } else { + // Filter devices + int visibleDevices = 0; + int deviceCount = 0; + string search = searchTextBox.Text.ToLower(); + foreach (Control c in devicesPanel.Controls) { - deviceCount++; - NodeClass n = ((DeviceUserControl)c).node; - bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0)); - if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0))) + if (c.GetType() == typeof(DeviceUserControl)) { - //if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0)) { - c.Visible = connVisible; - visibleDevices++; - } else { - c.Visible = false; + deviceCount++; + NodeClass n = ((DeviceUserControl)c).node; + bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0)); + if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0))) + { + //if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0)) { + c.Visible = connVisible; + visibleDevices++; + } + else + { + c.Visible = false; + } } } - } - noDevicesLabel.Visible = (deviceCount == 0); - noSearchResultsLabel.Visible = ((deviceCount > 0) && (visibleDevices == 0)); + noDevicesLabel.Visible = (deviceCount == 0); + noSearchResultsLabel.Visible = ((deviceCount > 0) && (visibleDevices == 0)); + } } private void devicesTabControl_SelectedIndexChanged(object sender, EventArgs e) @@ -1166,7 +1269,8 @@ namespace MeshCentralRouter { // Find the node string nodeId = (string)x["nodeId"]; - NodeClass node = meshcentral.nodes[nodeId]; + NodeClass node = null; + try { node = meshcentral.nodes[nodeId]; } catch (Exception) { } if (node == null) continue; // Add a new port map @@ -1245,6 +1349,102 @@ namespace MeshCentralRouter try { loadMappingFile(File.ReadAllText(s[0]), 2); } catch (Exception) { } } + private void devicesContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { e.Cancel = true; return; } // Device not selected + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { e.Cancel = true; return; } // Agent not connected on this device + if (node.agentid < 6) + { + // Windows OS + sshToolStripMenuItem.Visible = false; + scpToolStripMenuItem.Visible = false; + rdpToolStripMenuItem.Visible = true; + } + else + { + // Other OS + sshToolStripMenuItem.Visible = true; + scpToolStripMenuItem.Visible = true; + rdpToolStripMenuItem.Visible = false; + } + } + + private void httpToolStripMenuItem_Click(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + QuickMap(1, 80, 1, node); // HTTP + } + + private void httpsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + QuickMap(1, 443, 2, node); // HTTPS + } + + private void rdpToolStripMenuItem_Click(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + int rdpport = 3389; + if (node.rdpport != 0) { rdpport = node.rdpport; } + QuickMap(1, rdpport, 3, node); // RDP + } + + private void sshToolStripMenuItem_Click(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + QuickMap(1, 22, 4, node); // Putty + } + + private void scpToolStripMenuItem_Click(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + QuickMap(1, 22, 5, node); // WinSCP + } + + private void addMapToolStripMenuItem_Click(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + addButton_Click(null, null); + } + + private void addRelayMapToolStripMenuItem_Click(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + addRelayMapButton_Click(null, null); + } + + private void devicesListView_DoubleClick(object sender, EventArgs e) + { + if (devicesListView.SelectedItems.Count != 1) { return; } + ListViewItem selecteditem = devicesListView.SelectedItems[0]; + NodeClass node = (NodeClass)selecteditem.Tag; + if ((node.conn & 1) == 0) { return; } // Agent not connected on this device + addButton_Click(null, null); + } + /* private delegate void displayMessageHandler(string msg, int buttons, string extra, int progress); private void displayMessage(string msg, int buttons = 0, string extra = "", int progress = 0) diff --git a/MainForm.resx b/MainForm.resx index 0e5c25b..aec4c1f 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -1323,6 +1323,240 @@ True + + Name + + + 250 + + + State + + + 198 + + + 161, 56 + + + Segoe UI, 9pt, style=Bold + + + 163, 22 + + + Add &Map... + + + 163, 22 + + + Add &Relay Map... + + + 160, 6 + + + 163, 22 + + + HTTP + + + 163, 22 + + + HTTPS + + + 163, 22 + + + RDP + + + 163, 22 + + + SSH + + + 163, 22 + + + SCP + + + 164, 164 + + + devicesContextMenuStrip + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 56 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADg + HQAAAk1TRnQBSQFMAgEBEAEAARgBAAEIAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABUAMAAQEBAAEYBgABPP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AJYAA/0D+AP3A/sD/yEAA/0D+gP5 + A/wD/xgAAfoB+wH6A/4qAAP9A/8tAAP7A88D1QPbA88D1AO+A9QYAAP8A90D4APjA90D4APUA+MSAAP8 + AZEBjwF9AU4BaAEhAfQB9QH0JAAD/gPRA8YD+ioAAcYCxwHPAtAB2ALZA90DywPBA68DmgP3FQAD2APd + A+ID4wPaA9UDzAPAA/kMAAP/AVgBbwEyAWMBcwE/ASwBMwEgAU8BYQEvAbABugGhHgAD/wPIA8kDvAPF + A+IhAAP/A/ABugK7ArYBtwPAAdIC0wOrA4YDgQOiA94D/wwAA/8D9APTA9AD1APfA8oDtgOyA8QD6QP/ + CQABaAF9AUMBTwFnASMBUgFpASkBowGmAZ0DLgFKAVYBNgFbAXABPgP5GAADzQbGA9gDvAPDA8kD/A8A + A/YC0wHUArYBtwKbAZ0BpwGWAYQBtAGPAWcBwAGOAVYBtgGAAUUByQG6AagBxgHJAcoCqgGsAqcBqQKv + AbABwQGxAa0BvwK6A/oD+QPjA9EDwgO9A7YDtAOtA9AD2QPKA8gDzAPNA9MD/AYAAXoBjAFfAUMBWwE0 + AUIBTgErASkBLgEXAUcBYQEaAVMBcwFYATYBbwF8AUcBVQEqAWIBZwFVAa4BrQGsEgAD0wPEA8EDuwPE + BsoDwgPHA+AMAAK5AbwBrQGBAU4BtQGAAUQBwgGGAUUBxQGKAUkBxwGLAUoBxgGLAUkBxQGJAUkBxwGj + AXoBxwK8AbcBfQF2AbMBRQE3AaYBGQEIAaYBGgEJAcIBqQGmA/ED1AOuA60DrwmyA7ADwAPTA7IDmAaC + A8gD9gMAAZkBpQGIAVMBaAEqAT8BUAEhAR8BIQETAUoBYgEfAUYBXwEZAUcBYgEmAUUBXgEZAVsBaQFB + AVMBYAF4ASwBRAFpAYoBjwF5A/0JAAPdA8YDwQO6BsQDxQPEA8YDyAPCA9ID/gYAA+kBsgF/AUYBswGB + AUcBugGCAUQBvwGGAUcByQGOAUoB1QGTAUkB3QGVAUcBygGRAVIBtwGpAagBuAF6AXMBsgFTAUcBsgEz + ASEBtAEqARcByAGaAZMD1wPwCa0DrwOyA7UDtgO1A8gDsgOfA40DiwPCA+UB0QHWAc0BQAFUASUBQQFb + AS4BKQEvARcBRQFeARkBRAFdARkBRAFcARkBRAFFATsBQAE+ATsBQwFbARgBQgFSASIBeQF4AW0BFQIS + AUYBVQEoAdIB1gHMAwAD7gPCA8MDuwnDA8ADvwPDA8EDzAO3A8ID7AMAA/0BuQGEAUgBrwF+AUcBsAF/ + AUYBtgGCAUgB5gGYAUMB8wGfAUMB+QGkAUcB7QGfAUcBqQKlAcABigGCAboBYgFXAbwBSAE3Ab0BOwEo + AcoBegFtAasCrAP9A68GrAOuA7YDugO8A7oDxgO6A6YDmQOTA7IDyQP/AW8BfgGBAScBKQEoAUgBWAEs + ATwBSQErAUMBWwEYAUIBWgEYAR8CHAEeARoBHAFGAVwBHwE6AU0BPAEPAQ4BDQFCAUQBMQFXAU8BSQGx + AakBowFfAW8BPwP/A9ADuwPDA8AGwwa5A8MDwQO2A8ADwgPZA8gDAAG5AYQBSQGoAXkBQwGrAXwBRgG4 + AYMBSAH9Aa0BUQH+AbABWAH/AbYBZQH+AbkBaQGxAa4BrwHIAZkBkwG/AXEBZgHDAVsBTAHEAUsBOgHH + AVYBQwOlAwADrwOpA6oDrgPAA8MDxgPIA8sDwgOtA6IDmwOfA8YGAAHbAd8B4AFWAWABZgEnAS8BJwFL + AVwBRgFBAVgBIgFFAVsBJAFCAVgBIQFCAVkBOAFTAV0BQAFEAVgBIQFWAU8BSAGUAYoBhAGhAZcBkAGs + AaQBngYAA/IDyAO8A8UMwwPEBsMD0QPUA9gDAAGzAYIBSgGpAXgBQAGoAXoBRQHCAYkBSAH+AcABewH9 + AcIBgAH2AcMBiwHqAcUBmgHKAskBywGiAZ0BwgF8AXMBxwFqAVwByQFZAUgBxwFKATYDuQMAA64DqAOq + A7ADzQPOA9ED0gPaA8YDsgOqA6IDmgPRCQAD/gHAAcYByAF4AZMBewEGAZ4B1AEZAV0BZQFBAVgBOQE/ + AVIBHgEfARwBHgE+AVEBHQFuAWcBXwGhAZcBkAGhAZcBkAGhAZgBkQkAA/4D6QPXA9kDxgPDA8EDuQPB + A8gG1APVAwABwAGeAXcBqwF3ATwBqgF7AUQBzgGYAVoB5gG2AYAB2QGzAYgB1wG8AaEB4gHTAcwB4AHJ + AcUB1AGqAaQBxwGDAXkByQF3AWkBygFnAVYByAFeAUoDzQMAA74DpwOqA7gGygPQA98D2gPLA7gDsAOo + A6UD3A8AAdEB0wHZAUMB6gH8AS0BzQHtAYYBXwE6AVUBWwEnAVkBcgFbAVUBTgFIAW8BaAFiAagBoQGb + Ab8BuwG3A/8PAAPuA+0D5QPFA8MDygPCA8kD1wPiA/8DAAPkAeMC3gHqAeMB4QHgAtoB1AGbAZMB0QGR + AYkB0wGIAX4B1QGAAXQB1wF8AW4B2AGYAY8B1AGRAYgBzgGCAXYBygFwAWIByQFsAVwD5AMAA+wD6APq + A+QDwwO+A7oDtgO0A8IDvgO2A60DqgPoDwABagFmAXEB8QLzAdIBwAGtAcEBjgFhAbgBhQFZAU0BYAFL + AWsBZQFfAbcBrwGoAakBogGbAe0C7BIAA8wD+QPmA9EDzwPFA8kD2wPXA/YPAAHjAeIB4wGoASsBGwG0 + ATUBJAG9AToBJwHBAS4BFwHLAVEBPwHLAXUBaQHLAXMBZgHKAXIBZAHKAW4BYAHJAWgBVwHtAeoB6QwA + A+sDigOPA5IDjAOeA7ADrwOuA60DqgPrFQAD/AHzAfAB7QP+A/sD/wHfAd0B2wHCAcABvhsAA/4D+AP/ + A/0DAAPvA+YSAAPtAZoBFgEGAagBEwEAAbMBFgEBAb0BHAEEAb8BWgFIAc0BkgGHAdEBtAGuAdcByAHE + Ad0C2gPsA/IMAAPyCX8DgwOiA74D0APZA+QD8AP1bAAD+AHFAcQBxQPkA/UD+wP9A/8bAAP6A9kD7QP4 + A/wD/gP//wD/AP8AIQAD9QPrA88DuAOsA98eAAP5A/QD5QPeA9oD6yQAA+8D6QPjA+okAAP1A/MD6gP0 + FQAD7gPRAawCrQG2ArQBzAHHAcYBxwLBAUkBkQFlAZUClAOJA6sD9A8AA/MD5QPbA90D4gPgA9AD0wPR + A9oD+RIAA/UBqgGrAaoBUgFRAVMBOAE7ATcBGwEhARoDoQOkAZ0BngGfAbMCtAPkEgAD+gPeA8QDvgO6 + A9cD2APWA90D8AwAA+sByALFAegC3wH0AuoB8ALmAeEB2AHZAcwCxgFtAZoBeAGYApcDoAOOA4QD4AkA + A/AD4QPqA+0D7APnA+ID0wPVA9cD0gPPA+wJAAPgAYoBiwGKASYBLgEgAwMBCwEPAQkBKQEgARoBUgFB + ATUDswPBAYgCiQGEAYUBhgGbApwDrgkAA+0D0gO8A7QDtgO5A8AD3QPhA9ED0APWA9sJAAPNAdQC0AHl + At4B8gLoAfYC7AHgAtkBoQKfAqoBqwPJA+YDxgOWA5IDrQP7AwAD5APlA+kD7QPuA+cD1wPaA+MD7APi + A9QD0wPaA/0DAAOCAWABXgFdAWIBTAFCAYkBgQF6AcUBwwHCAdIC0AHPAc4BzQHKAsgBxALDAb4CvQO8 + AasCrAOFAqsBrAP6AwADzwPHA8IDzwPhA+UD5APjA+EG3wPaA88D2gP9AwADzwGuAqwBpQKmAsoBywHn + AegB6gHWAdcC2QHWAdQB4gHeAdoBzAHIAcQBvAG5AbgBxQLEA+MDugOhA9UDAAPlA9oD2QPjA+wG5wPp + A+ID3gPhA+oD3gPXA+YDAALjAeIB2QHXAdYB4gHfAd4B4gHfAd4B4QHeAt0B2wHaAdgC1QHUAdIB0QHP + As0CswGyAZwBmwGcA7MDxAKEAYUDuwMAA+oD5wnpA+gD5gPlA+QD3APWA9wD4QPQA94GAAP3AuwB7QHw + AfIB9AT1AvYD7QPlA90B1QLWAdAC0QKuAa0B1AHTAdQD2wP5BgAD+wPuA+8G8APuA+wD6QPnA+UD2wPm + A+kD/AkAAe0C6wHpAuUB5wHkAeMBtAKzAbYBtAG1Aa8CrgGiAaABoQGfAqACmwGcA5sDoQO1A+8JAAPv + BusD3APdA9sG1wbVA9cD3QPwDwAD8gHrAewB7QHzAfUB9gHSAdMB1AHRAtIB4gHkAeUB2ALZAdMC1APb + A+0SAAP2A+8D8APnA+YD6wPoA+YD7QPyFQAB6wLpAeAC3QGzArIBnQGcAZ0DrAPXA+sbAAPwA+kD3APW + A9sD6gPx/wD/AP8A/wCfAAP5AdsC2gG6ArcBngKZAa0BqAGqAb8BvgG/A+8bAAP8A+gD3gPVA9kD4AP1 + eAABrQGqAasBnAGXAZUBoQGbAZoBogGcApsBkgGRAbUBrQGuAaQBnwGgA8QD5hUAA9oD1AbWA9MD2wPX + A+ED7BsAA/EBqgGpAacCaQFnA+8kAAP4A9kDyAP4GwAD1AG9AbwBvQHPAc0BzAHXAdYB1QHfAd4B3QGl + AZ8BoAG0Aa4BsQG1AbABsQK3AbYD3wPuDwAD5gPfA+QD5gPpA9cG2wPeA+kD7g8AAtQB0wGGAYUBgwJv + AW0CSgFLA1gDkwNeAYgBhwGGGAAD6wPPA8oDwQPGA9QDxgPRGAADzQPOAbkBuAG3A+AB3gLdAc4BzAHN + AcgBxgHIAb8CvQOnA+wD9AP6DAAG5APeA+oD6QPkA+ID3wPaA+4D8AP8DAAD6AOWA9ID4wPkA8wD+QOV + An4BfQP4EgAD8wPVA+YG6wPjA/ID1QPPA/sSAALAAcEBwwK/AbwBpwGfAakBewFrAZgBWAFEAYIBNAEc + AXsBKQEQAawBhQF6A7UVAAbgA9kDzgPFA74DvAPRA94VAAPpA+cD6gboA88D6gPcA64D4QPvDwAD8wPs + A+0G7APkA+0D6QPbA+oD9A8AAcYBtAGvAcMBZgFJAbMBWQE9AaQBTAEyAZ4BSwEyAYwBOQEgAYYBNAEa + Aa0BhgF6ArQBsxUAA90DyQPGBsMDvwO+A9ED3hUAA+kB6wLqA+4D7APrA9AD1QPGA7gD9gP8DwAD8wPt + A+4G7QPlA+YD4QPeA/oD/g8AAb0BqgGkAckBbAFOAbsBYAFDAa0BVAE4AaQBTwE0AZoBRgEsAZMBPwEl + Aa8BiAF7AbYBtQGzFQAD2QPKA8cGxAPCA8AD0QPdFQAD6QPuA/IG8APRA78DsgO7FQAD8wPuCe8D5QPg + A9wD3xUAAbgBoAGYAdEBcAFTAcQBZwFKAbsBYwFHAa4BVQE5AakBUwE5AaMBSwEwAa4BhAF3AbUBtAGx + FQAD1wPLA8kDyAPFA8QDwwPQA90VAAPpA/ED9gb0A9IDrQOqA7wVAAPzA+8D8QbwA+YD2wPaA98VAAG3 + AZkBkQHYAXkBWwHPAXEBUwHLAXUBWwG9AWEBRQG4AV4BQwGzAVkBPQGtAYEBcwK0AbEVAAPVA80DywPM + BscDxQPPA90VAAPpA/QD+gb4A88DqQOqA70VAAPzA/AD8gbxA+UD2QPaA+AVAAG9AZ8BlgHlAY8BdQHe + AYcBbAHXAYEBZgHNAXUBWgHHAW8BUwHFAWwBUAGxAYcBeQG4AbcBthUAA9cD0wPRA88DzAPLA8oD0APe + FQAD6QL1AfQD/QP8A/0DzgOpA6oDvhUAA/MD8AnzA+QD2QPaA+ASAAP5AcoBqQGfAe0BnQGFAesBogGL + AeIBkgF5AeABkQF4AdgBgQFmAdUBfgFjAbkBjwGCAboBuQG4EgAD/APaA9YD2AbTA88DzgPSA98VAAPp + A+8BdwGcAXkBrQG6Aa4DzgPTA6kDqgO+FQAD8wPuA9QD3QPkA+YD2QPaA+ASAAPzAdgBtgGrAfIBsgGf + AfIBtQGiAewBpQGOAesBngGIAeMBjAFyAeIBiAFuAcABlQGIArwBuxIAA/gD3QPcA90D2APXA9ID0QPU + A98VAAPqA/IC7gHvBugD5wO2A6sDwBUAA/QD7wPuCewD3QPaA+ESAAPyAdoBuQGuAfUBxAG0AfQBwwGy + AfIBtwGlAfABpQGPAe4BlQF6Ae0BkQF1AcEBlgGHAr0BvBIAA/cD3gbhA90D2QPUA9MD1APgFQAD8APo + AdcC1gG5AbgBtwGtAawBqgGsAasBqQG5AbgBtwK1AbQDzRUAA/YD7APnA94G2gPeA90D5BIAA/EBswGk + AaEBrAGgAZsBowGbAZkBoAGcAZsBpQGkAaIBqwGsAasBrgKvAa0BrgGtA7QSAAP3A9gD1wbWA9gD2gPb + A9oD3R4AA/cD9SoAA/sD+h4AA/0B1AHMAccByAHDAb8BwwHAAb0BcQJuAdIBzgHJAcQBvQG5AckBwQG9 + AeUC4wP8EgAD/gPkA+ED4APKA+QD3wPgA+sD/v8A/wAD9APTA9cDzAPBA+gD9QP2GAAD+QPmA+cD5APg + A/IG+hgAA/EBqwGlAaQBzAG/AbgBqAKmJAAD+APYA+AD2RUAA/AD8gP4AwAD9QO9A88D3APNA78GpgPH + A+kGAAb3A/sDAAP5A+AD5APpA+QD4AbYA+ID7AkAA/IB2QLYAbcCsgHSAswB/AH5AfUB7AHiAdgB5QHW + AcQB3gHKAbEBhgGAAXsD9RIAA/cD7APcA+MD8gPqA+YD4gPOA/oMAAHQAs8BhAKDA3gDlQO9A+4DswO5 + A7sDogN6A5sDxAPaA+0DAAPlA88DzQPUA98D9QPcA94D3wPYA80D1QPhA+gD9AMAAcoDyQLDAegC4wHY + AtcDhgN1AYUCgwGHAX4BeAFNAT4BOgE8ASkBJQFEATYBNQE6AjYDtAkAA+MD4QPrA+cD0APMBs8DvwO7 + Br4D4wkAAcICwQGbApYDigOdA54DrgO3ArABsQKQAZIBlAGYAZwBswKwAcMBkgGLAcEBnwGbA/MGAAPh + A9QD0QbWA9sD3QPbA9ID1QPbA9QD2AP5BgAB5wLiAd0C1gHTAc8B0AGWApQBYAJcAUgCQAFJAT4BPAFH + AToBNgFEATMBLwFKATwBOQFUAksBYgFMATcBjgKNA9QGAAPqA+cD5QPVA8YDwAO/A74DvQO/BsID0gPm + BgABvwK+AZwClwOeAp0BngGGAZYBkAKgAaIBnwF3AXUBkgEyASoBlgEYAREBpQEfARABrgEoARUBtgEt + ARoBwAF2AWwD4QYAA98D1QbWA9MD1wPNA8EGvQO+A78DzgPqCQAD/AHIAsMBZgFhAWIBTQFIAUcBWAFR + AVABaQFjAWIBXgJaAUECPwFEAkEBVQJWAUkBUAFRAWgBWQFUAc0CzAkAA/4D4QPHA8EDwwPHA8UGwAPE + A8MDxQPkBgABuAK3AZsClwOvAbEBsgGzAYYBDwEHAYcBEgELAYQBDAEBAZMBDwEAAaMBEwEAAcMBSgE4 + AdEBVQFAAdgBWQFEAdUBbAFZAcoCywYAA90D1APbA9wDugO7A7oDuwO8A8QDxgPHA8sD4w8AA/wD+QPC + AVsBXwFgA2QBnAFoAVEBxAFMARwBzQFBAQYBxgE6AQUBzwFIAQ0B1QHMAccPAAP+A/wD4QPGA8cDyAPE + A8IDwQPDA+QGAAO2AZ0CmgO4A70BlQE3ATABlwEwASkBkAEPAQIBpAETAQABtQEVAQAB4AF8AWsB6AGA + AW4B7gGFAXIB7AGAAWwBtwK4BgAD3QPVA90D3wPAA74DuwO8A70DzgPQA9ED0APeEgAB5gHhAeABrwEp + AQYBrAEvAQ8BtAE6ARgBvgFDAR8BxwFJASIB0AFaATEB0QFTASsB1wFVASkBzQG5AbASAAPwA74DvwPB + A8IDwwPHA8UDxgPeBgABtAK1AZgBlgGXA70DxgGcAVUBUQGsAVIBSQGfAREBAAGyARQBAAHIARsBAwHx + AaYBmQH3AacBmQH8AasBnQH+AaMBkQG1AbYBtwYAA90D1APfA+IDxwPFA7wDvQO/BtoD2wPZA90SAAHv + AfIB8wG2AUcBKgG3AUsBLwG4AUABIgHBAUQBJAHMAUoBKQHeAXYBVgHjAXsBWAHlAXgBUQHQAaIBjxIA + A/QGwwPBA8IDxAPNA84DzQPYBgAD3QHRAdIB0wHLAcwBzQHMAs0BqAF8AXkBoQEpARwBswEWAQAB0QEd + AQAB7AEwAQ4B/wHHAboB/wHMAbwB/wHRAb8B/wHPAbkBwALBBgAD7QPoBuQDzwO/A70DvwPDA+ID4wPl + A+QD4BUAAb0BXwFHAcEBXQFFAcMBTgEzAc0BUgE1AdkBYgFDAekBlgF8Ae0BnAF/Ae4BmAF3AeABlQF1 + A/oSAAbHA8UDxgPJA9QD1gPVA9QD/A8AAb0BrQGrAaMBEwEBAb4BGQEAAdwBIAEAAfkBawFOAf8B3gHV + Af8B4QHXAf8B5gHbAf8B5wHdAdwC2wP9DwAD2wO8A74DwAPMA+kD6gPrA+wD6AP+EgABwgF1AWEBwQFa + AUIBzwFeAUMB3wFmAUgB7QGEAWkB9AG3AaMB8gG0AZwB8QGzAZcB6wGkAX4D+RIAA80DxgPIA8oD0QPd + BtwD2AP8DwACzgHPAaYBEgEAAcQBGwEAAeMBHwEAAf8BsAGgAfsBzgG/Ae8BxgG1AeoBxQG1AegBzwHF + Ae8B7gHvA/oPAAPkA7wDvgPAA9wD5APiA+ED5APzA/wSAAHCAYsBfQHKAWMBTQHaAW0BVQHpAXQBWQH3 + AbYBpAH2AcwBvAH1AcUBsgHzAcMBrwH0AbwBoAHiAuESAAPSA8kDywPNA94D5AbhA94D6g8AAeAC4QG0 + AZ0BnAHKAcMBwgHjAeQB5QHvAvAD8h4AA+8D2APiA+sG9yEAAcYBrAGmAc4BbgFaAd8BfAFnAfABgQFq + AfcBzgHCAekBxQG4AdoBvgGzAdUBxQG+AdoB1QHSA98SAAPbA8sDzgPQA+QD4QPfA+ED5gPpcgAC5AHj + Ad8B1QHUAe0B7AHrA/UD9iEAA+8D5wPuBvr/AJAAAUIBTQE+BwABPgMAASgDAAFAAwABUAMAAQEBAAEB + BQABgAECFgAD/4EABf8BBwH/AQcB+QH/AfkB/wH8AQMB/AEDAfAB/wHwAf8B/AEBAfwBAQHgAX8B4AF/ + AfABAAHwAQAB4AEfAeABHwQAAcABDwHAAQ8EAAGAAQMBgAEDBQABAQEAAQEIAAGAAQABgAEAAcABAAHA + AQABgAEAAYABAAHgAQAB4AEAAYABAAGAAQAB+AEAAfgBAAGAAQABgAEAAfgBAQH4AQEB8AEAAfABAAH+ + AQMB/gETAfABAAHwAQAE/wHwAR8B8AEfIP8B+AEfAfgBHwH+AR8B/gEfAcABBwHAAQcB4AEHAeABBwGA + AQMBgAEDAYABAwGAAQMBgAEAAYABAAGAAQABgAEAAYABAAGAAQABgAEAAYABAAHAAQABwAEAAeABAAHg + AQAB+AEBAfgBAQH8AQcB/AEHMP8B/AEHAfwBBwT/AfgBAwH4AQMB/gEfAf4BHwHwAQEB8AEBAfABDwHw + AQ8B8AEAAfABAAHwAQMB8AEDAfABBwHwAQcB8AEBAfABAQHwAQcB8AEHAfABAQHwAQEB8AEHAfABBwHw + AQcB8AEHAfABBwHwAQcB8AEHAfABBwHwAQcB8AEHAfABBwHwAQcB8AEHAfABBwHwAQcB8AEHAeABBwHg + AQcB8AEHAfABBwHgAQcB4AEHAfABBwHwAQcB4AEHAeABBwHwAQcB8AEHAeABBwHgAQcB/gF/Af4BfwHg + AQcB4AEHFP8B/gEBAf4BAQH+AR8B/gEfAcQBAAHEAQAB4AEHAeABBwGAAQABgAEAAYABAwGAAQMBgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBwAEBAcABAQGAAQEBgAEBAfABAQHwAQEBgAEBAYABAQH4AQEB+AEB + AYABAQGAAQEB+AEBAfgBAQGAAQEBgAEBAfwBAAH8AQAB+AEAAfgBAAH8AQAB/AEAAfgBAAH4AQAB/AEA + AfwBAAH4AR8B+AEfAfwBAAH8AQAE/wH8AR8B/AEfEP8L + + + + 10, 4 + + + 446, 210 + + + 6 + + + False + + + devicesListView + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + devicesPanel + + + 0 + Top, Left, Right @@ -1336,7 +1570,7 @@ 2, 88 - 458, 52 + 454, 52 5 @@ -1360,7 +1594,7 @@ devicesPanel - 0 + 1 Top, Left, Right @@ -1375,7 +1609,7 @@ 2, 88 - 458, 52 + 454, 52 4 @@ -1396,7 +1630,7 @@ devicesPanel - 1 + 2 0, 0 @@ -1465,7 +1699,7 @@ 2, 79 - 458, 52 + 454, 52 4 @@ -1953,7 +2187,7 @@ Click "Add" to get started. $this - 3 + 4 17, 17 @@ -5535,6 +5769,72 @@ Click "Add" to get started. System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + devicesImageList + + + System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + nameColumnHeader + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + stateColumnHeader + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + httpToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + httpsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + rdpToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + sshToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scpToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addMapToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addRelayMapToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + MainForm diff --git a/MeshMapper.cs b/MeshMapper.cs index b0cb910..9e4065c 100644 --- a/MeshMapper.cs +++ b/MeshMapper.cs @@ -521,10 +521,12 @@ namespace MeshCentralRouter private void ProcessWsBuffer(byte[] data, int offset, int len, int op) { - //parent.Debug("#" + counter + ": Websocket frag data: " + acclen); - if ((tunneling == false) && (data[offset] == 'c')) + int opcode = op & 0x0F; // 1 == String, 2 == Binary + + parent.Debug("#" + counter + ": Websocket frag data: " + acclen + ", opcode: " + opcode); + if ((tunneling == false) && (opcode == 1) && (data[offset] == 'c')) { - parent.Debug("#" + counter + ": Websocket get server 'c' confirmation."); + parent.Debug("#" + counter + ": Websocket got server 'c' confirmation."); // Server confirmed connection, start reading the TCP stream //Console.Write("WS-Relay Connect\r\n"); @@ -541,7 +543,12 @@ namespace MeshCentralRouter tunneling = true; } } - else + else if ((tunneling == true) && (opcode == 1)) + { + string text = UTF8Encoding.UTF8.GetString(data, offset, len); + parent.Debug("#" + counter + ": Websocket got text frame: " + text); + } + else if ((tunneling == true) && (opcode == 2)) { if (client != null) { @@ -552,10 +559,14 @@ namespace MeshCentralRouter else if (uclient != null) { // Write: WS --> UDP - if (uendpoint != null) { - if (offset == 0) { + if (uendpoint != null) + { + if (offset == 0) + { try { uclient.Send(data, len, uendpoint); } catch (Exception) { } - } else { + } + else + { byte[] data2 = new byte[len]; Array.Copy(data, offset, data2, 0, len); try { uclient.Send(data2, len, uendpoint); } catch (Exception) { } diff --git a/NodeClass.cs b/NodeClass.cs index dd0d497..c2b32c6 100644 --- a/NodeClass.cs +++ b/NodeClass.cs @@ -1,8 +1,9 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Text; +using System.Windows.Forms; using System.Threading.Tasks; +using System.Collections.Generic; namespace MeshCentralRouter { @@ -16,10 +17,24 @@ namespace MeshCentralRouter public int conn; public int rdpport; public ulong rights; + public MeshClass mesh; + public ListViewItem listitem; public DeviceUserControl control; public Dictionary links; public override string ToString() { return name; } + + public string getStateString() + { + string status = ""; + if ((conn & 1) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.Agent; } + if ((conn & 2) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.CIRA; } + if ((conn & 4) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.AMT; } + if ((conn & 8) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.Relay; } + if ((conn & 16) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.MQTT; } + if (status == "") { status = Properties.Resources.Offline; } + return status; + } } public class MeshClass