commit 28af5dc64c36a6e1cf0a7bfb24c7406cfd2eeb5d Author: wixy Date: Mon Apr 1 08:17:56 2019 +0800 init diff --git a/.vs/Ultron.Ngrok/v15/.suo b/.vs/Ultron.Ngrok/v15/.suo new file mode 100644 index 0000000..8cd851e Binary files /dev/null and b/.vs/Ultron.Ngrok/v15/.suo differ diff --git a/Ultron.Ngrok.sln b/Ultron.Ngrok.sln new file mode 100644 index 0000000..09705ee --- /dev/null +++ b/Ultron.Ngrok.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ultron.Ngrok", "Ultron.Ngrok\Ultron.Ngrok.csproj", "{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Ultron.Ngrok.v12.suo b/Ultron.Ngrok.v12.suo new file mode 100644 index 0000000..8cd851e Binary files /dev/null and b/Ultron.Ngrok.v12.suo differ diff --git a/Ultron.Ngrok/App.config b/Ultron.Ngrok/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/Ultron.Ngrok/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Ultron.Ngrok/Form/AboutBox.Designer.cs b/Ultron.Ngrok/Form/AboutBox.Designer.cs new file mode 100644 index 0000000..81ca93a --- /dev/null +++ b/Ultron.Ngrok/Form/AboutBox.Designer.cs @@ -0,0 +1,172 @@ +namespace Ultron.Ngrok +{ + partial class AboutBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox)); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.logoPictureBox = new System.Windows.Forms.PictureBox(); + this.labelProductName = new System.Windows.Forms.Label(); + this.labelVersion = new System.Windows.Forms.Label(); + this.labelCopyright = new System.Windows.Forms.Label(); + this.textBoxDescription = new System.Windows.Forms.TextBox(); + this.okButton = new System.Windows.Forms.Button(); + this.tableLayoutPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 2; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); + this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); + this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); + this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); + this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); + this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); + this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 6; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.89362F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.31206F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.89362F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 6.382979F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 26.24113F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 24.11348F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(417, 141); + this.tableLayoutPanel.TabIndex = 0; + // + // logoPictureBox + // + this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image"))); + this.logoPictureBox.Location = new System.Drawing.Point(3, 3); + this.logoPictureBox.Name = "logoPictureBox"; + this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); + this.logoPictureBox.Size = new System.Drawing.Size(131, 135); + this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.logoPictureBox.TabIndex = 12; + this.logoPictureBox.TabStop = false; + // + // labelProductName + // + this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelProductName.Location = new System.Drawing.Point(143, 0); + this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelProductName.MaximumSize = new System.Drawing.Size(0, 16); + this.labelProductName.Name = "labelProductName"; + this.labelProductName.Size = new System.Drawing.Size(271, 16); + this.labelProductName.TabIndex = 19; + this.labelProductName.Text = "产品名称"; + this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelVersion + // + this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelVersion.Location = new System.Drawing.Point(143, 20); + this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelVersion.MaximumSize = new System.Drawing.Size(0, 16); + this.labelVersion.Name = "labelVersion"; + this.labelVersion.Size = new System.Drawing.Size(271, 16); + this.labelVersion.TabIndex = 0; + this.labelVersion.Text = "版本"; + this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelCopyright + // + this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelCopyright.Location = new System.Drawing.Point(143, 42); + this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 16); + this.labelCopyright.Name = "labelCopyright"; + this.labelCopyright.Size = new System.Drawing.Size(271, 16); + this.labelCopyright.TabIndex = 21; + this.labelCopyright.Text = "版权"; + this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // textBoxDescription + // + this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxDescription.Location = new System.Drawing.Point(143, 73); + this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); + this.textBoxDescription.Multiline = true; + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.ReadOnly = true; + this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxDescription.Size = new System.Drawing.Size(271, 29); + this.textBoxDescription.TabIndex = 23; + this.textBoxDescription.TabStop = false; + this.textBoxDescription.Text = "说明"; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.okButton.Location = new System.Drawing.Point(339, 117); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 21); + this.okButton.TabIndex = 24; + this.okButton.Text = "确定(&O)"; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // AboutBox + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(435, 157); + this.Controls.Add(this.tableLayoutPanel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutBox"; + this.Padding = new System.Windows.Forms.Padding(9, 8, 9, 8); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "AboutBox"; + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.PictureBox logoPictureBox; + private System.Windows.Forms.Label labelProductName; + private System.Windows.Forms.Label labelVersion; + private System.Windows.Forms.Label labelCopyright; + private System.Windows.Forms.TextBox textBoxDescription; + private System.Windows.Forms.Button okButton; + } +} diff --git a/Ultron.Ngrok/Form/AboutBox.cs b/Ultron.Ngrok/Form/AboutBox.cs new file mode 100644 index 0000000..5b50bd7 --- /dev/null +++ b/Ultron.Ngrok/Form/AboutBox.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Ultron.Ngrok +{ + partial class AboutBox : Form + { + public AboutBox() + { + InitializeComponent(); + this.Text = String.Format("关于 {0}", AssemblyTitle); + this.labelProductName.Text = AssemblyProduct; + this.labelVersion.Text = String.Format("版本 {0}", AssemblyVersion); + this.labelCopyright.Text = AssemblyCopyright; + this.textBoxDescription.Text = AssemblyDescription; + } + + #region 程序集特性访问器 + + public string AssemblyTitle + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); + if (attributes.Length > 0) + { + AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; + if (titleAttribute.Title != "") + { + return titleAttribute.Title; + } + } + return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); + } + } + + public string AssemblyVersion + { + get + { + return Assembly.GetExecutingAssembly().GetName().Version.ToString(); + } + } + + public string AssemblyDescription + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyDescriptionAttribute)attributes[0]).Description; + } + } + + public string AssemblyProduct + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyProductAttribute)attributes[0]).Product; + } + } + + public string AssemblyCopyright + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; + } + } + + public string AssemblyCompany + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCompanyAttribute)attributes[0]).Company; + } + } + #endregion + + private void okButton_Click(object sender, EventArgs e) + { + this.Close(); + } + + } +} diff --git a/Ultron.Ngrok/Form/AboutBox.resx b/Ultron.Ngrok/Form/AboutBox.resx new file mode 100644 index 0000000..43d2af5 --- /dev/null +++ b/Ultron.Ngrok/Form/AboutBox.resx @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/Ultron.Ngrok/Form/SettingForm.Designer.cs b/Ultron.Ngrok/Form/SettingForm.Designer.cs new file mode 100644 index 0000000..6998991 --- /dev/null +++ b/Ultron.Ngrok/Form/SettingForm.Designer.cs @@ -0,0 +1,276 @@ +namespace Ultron.Ngrok +{ + partial class SettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.TunnelConfigGroupBox = new System.Windows.Forms.GroupBox(); + this.enableCBX = new System.Windows.Forms.CheckBox(); + this.ipTB = new System.Windows.Forms.TextBox(); + this.delButton = new System.Windows.Forms.Button(); + this.addButton = new System.Windows.Forms.Button(); + this.portTB = new System.Windows.Forms.TextBox(); + this.tunnelNameTB = new System.Windows.Forms.TextBox(); + this.subdomainTB = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.tunnelTypeLabelPort = new System.Windows.Forms.Label(); + this.subdomainLBL = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.tunnelTypeLabel = new System.Windows.Forms.Label(); + this.tunnelTypeCMB = new System.Windows.Forms.ComboBox(); + this.tunnelListBox = new System.Windows.Forms.ListBox(); + this.saveButton = new System.Windows.Forms.Button(); + this.TunnelConfigGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // TunnelConfigGroupBox + // + this.TunnelConfigGroupBox.Controls.Add(this.enableCBX); + this.TunnelConfigGroupBox.Controls.Add(this.ipTB); + this.TunnelConfigGroupBox.Controls.Add(this.delButton); + this.TunnelConfigGroupBox.Controls.Add(this.addButton); + this.TunnelConfigGroupBox.Controls.Add(this.portTB); + this.TunnelConfigGroupBox.Controls.Add(this.tunnelNameTB); + this.TunnelConfigGroupBox.Controls.Add(this.subdomainTB); + this.TunnelConfigGroupBox.Controls.Add(this.label1); + this.TunnelConfigGroupBox.Controls.Add(this.label2); + this.TunnelConfigGroupBox.Controls.Add(this.label5); + this.TunnelConfigGroupBox.Controls.Add(this.tunnelTypeLabelPort); + this.TunnelConfigGroupBox.Controls.Add(this.subdomainLBL); + this.TunnelConfigGroupBox.Controls.Add(this.label3); + this.TunnelConfigGroupBox.Controls.Add(this.tunnelTypeLabel); + this.TunnelConfigGroupBox.Controls.Add(this.tunnelTypeCMB); + this.TunnelConfigGroupBox.Controls.Add(this.tunnelListBox); + this.TunnelConfigGroupBox.Location = new System.Drawing.Point(12, 12); + this.TunnelConfigGroupBox.Name = "TunnelConfigGroupBox"; + this.TunnelConfigGroupBox.Size = new System.Drawing.Size(291, 201); + this.TunnelConfigGroupBox.TabIndex = 8; + this.TunnelConfigGroupBox.TabStop = false; + this.TunnelConfigGroupBox.Text = "通道配置"; + // + // enableCBX + // + this.enableCBX.AutoSize = true; + this.enableCBX.Location = new System.Drawing.Point(193, 154); + this.enableCBX.Name = "enableCBX"; + this.enableCBX.Size = new System.Drawing.Size(15, 14); + this.enableCBX.TabIndex = 10; + this.enableCBX.UseVisualStyleBackColor = true; + // + // ipTB + // + this.ipTB.Location = new System.Drawing.Point(193, 100); + this.ipTB.Name = "ipTB"; + this.ipTB.Size = new System.Drawing.Size(92, 21); + this.ipTB.TabIndex = 9; + // + // delButton + // + this.delButton.Location = new System.Drawing.Point(76, 172); + this.delButton.Name = "delButton"; + this.delButton.Size = new System.Drawing.Size(50, 23); + this.delButton.TabIndex = 1; + this.delButton.Text = "删除"; + this.delButton.UseVisualStyleBackColor = true; + this.delButton.Click += new System.EventHandler(this.delButton_Click); + // + // addButton + // + this.addButton.Location = new System.Drawing.Point(6, 172); + this.addButton.Name = "addButton"; + this.addButton.Size = new System.Drawing.Size(50, 23); + this.addButton.TabIndex = 1; + this.addButton.Text = "新增"; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.addButton_Click); + // + // portTB + // + this.portTB.Location = new System.Drawing.Point(193, 127); + this.portTB.Name = "portTB"; + this.portTB.Size = new System.Drawing.Size(92, 21); + this.portTB.TabIndex = 9; + // + // tunnelNameTB + // + this.tunnelNameTB.Location = new System.Drawing.Point(193, 20); + this.tunnelNameTB.Name = "tunnelNameTB"; + this.tunnelNameTB.Size = new System.Drawing.Size(92, 21); + this.tunnelNameTB.TabIndex = 9; + // + // subdomainTB + // + this.subdomainTB.Location = new System.Drawing.Point(193, 47); + this.subdomainTB.Name = "subdomainTB"; + this.subdomainTB.Size = new System.Drawing.Size(92, 21); + this.subdomainTB.TabIndex = 9; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(158, 154); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(29, 12); + this.label1.TabIndex = 8; + this.label1.Text = "启用"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(158, 130); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(29, 12); + this.label2.TabIndex = 8; + this.label2.Text = "端口"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(158, 24); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(29, 12); + this.label5.TabIndex = 8; + this.label5.Text = "名称"; + // + // tunnelTypeLabelPort + // + this.tunnelTypeLabelPort.AutoSize = true; + this.tunnelTypeLabelPort.Location = new System.Drawing.Point(134, 50); + this.tunnelTypeLabelPort.Name = "tunnelTypeLabelPort"; + this.tunnelTypeLabelPort.Size = new System.Drawing.Size(53, 12); + this.tunnelTypeLabelPort.TabIndex = 8; + this.tunnelTypeLabelPort.Text = "远程端口"; + this.tunnelTypeLabelPort.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.tunnelTypeLabelPort.Visible = false; + // + // subdomainLBL + // + this.subdomainLBL.AutoSize = true; + this.subdomainLBL.Location = new System.Drawing.Point(146, 50); + this.subdomainLBL.Name = "subdomainLBL"; + this.subdomainLBL.Size = new System.Drawing.Size(41, 12); + this.subdomainLBL.TabIndex = 8; + this.subdomainLBL.Text = "子域名"; + this.subdomainLBL.Visible = false; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(146, 103); + this.label3.Name = "label3"; + this.label3.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.label3.Size = new System.Drawing.Size(41, 12); + this.label3.TabIndex = 7; + this.label3.Text = "IP地址"; + // + // tunnelTypeLabel + // + this.tunnelTypeLabel.AutoSize = true; + this.tunnelTypeLabel.Location = new System.Drawing.Point(134, 77); + this.tunnelTypeLabel.Name = "tunnelTypeLabel"; + this.tunnelTypeLabel.Size = new System.Drawing.Size(53, 12); + this.tunnelTypeLabel.TabIndex = 7; + this.tunnelTypeLabel.Text = "通道类型"; + // + // tunnelTypeCMB + // + this.tunnelTypeCMB.FormattingEnabled = true; + this.tunnelTypeCMB.Items.AddRange(new object[] { + "TCP", + "HTTP"}); + this.tunnelTypeCMB.Location = new System.Drawing.Point(193, 74); + this.tunnelTypeCMB.Name = "tunnelTypeCMB"; + this.tunnelTypeCMB.Size = new System.Drawing.Size(92, 20); + this.tunnelTypeCMB.TabIndex = 6; + this.tunnelTypeCMB.SelectedIndexChanged += new System.EventHandler(this.tunnelTypeCMB_SelectedIndexChanged); + // + // tunnelListBox + // + this.tunnelListBox.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tunnelListBox.FormattingEnabled = true; + this.tunnelListBox.ItemHeight = 14; + this.tunnelListBox.Location = new System.Drawing.Point(6, 20); + this.tunnelListBox.Name = "tunnelListBox"; + this.tunnelListBox.Size = new System.Drawing.Size(120, 144); + this.tunnelListBox.TabIndex = 5; + this.tunnelListBox.SelectedIndexChanged += new System.EventHandler(this.tunnelListBox_SelectedValueChanged); + // + // saveButton + // + this.saveButton.Location = new System.Drawing.Point(228, 219); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(75, 23); + this.saveButton.TabIndex = 1; + this.saveButton.Text = "保存"; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // SettingForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(309, 247); + this.Controls.Add(this.TunnelConfigGroupBox); + this.Controls.Add(this.saveButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SettingForm"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "设置"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.SettingForm_FormClosed); + this.TunnelConfigGroupBox.ResumeLayout(false); + this.TunnelConfigGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox TunnelConfigGroupBox; + private System.Windows.Forms.CheckBox enableCBX; + private System.Windows.Forms.TextBox ipTB; + private System.Windows.Forms.Button delButton; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.TextBox portTB; + private System.Windows.Forms.TextBox tunnelNameTB; + private System.Windows.Forms.TextBox subdomainTB; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label subdomainLBL; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label tunnelTypeLabel; + private System.Windows.Forms.ComboBox tunnelTypeCMB; + private System.Windows.Forms.ListBox tunnelListBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label tunnelTypeLabelPort; + } +} \ No newline at end of file diff --git a/Ultron.Ngrok/Form/SettingForm.cs b/Ultron.Ngrok/Form/SettingForm.cs new file mode 100644 index 0000000..492bb43 --- /dev/null +++ b/Ultron.Ngrok/Form/SettingForm.cs @@ -0,0 +1,332 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Ultron.Ngrok.Model; +using Ultron.Ngrok.Properties; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; + +namespace Ultron.Ngrok +{ + public partial class SettingForm : Form + { + public delegate void WriteLog(string message); + + public event WriteLog WriteLogToForm; + + /// + /// 配置 + /// + public Config ServerConfig { get; set; } + + /// + /// 配置文件 + /// + public string ConfigFile { get; set; } + + /// + /// 执行命令 + /// + public string ExecuteCommand { get; set; } + + /// + /// 执行文件名 + /// + public string ExeFile { get; set; } + + public SettingForm() + { + InitializeComponent(); + + InitFile(); + + InitConfig(); + + LoadConfig(); + } + + public void InitFile() + { + string path = System.IO.Directory.GetCurrentDirectory(); + string ngrokFile = string.Empty; + if (Environment.Is64BitOperatingSystem)//判断是否为64位操作系统 + { + ngrokFile = path + @"\ngrok_x64.exe"; + if (!File.Exists(ngrokFile)) + { + FileStream str = new FileStream(ngrokFile, FileMode.OpenOrCreate); + str.Write(Resources.ngrok_x64, 0, Resources.ngrok_x64.Length); + str.Close(); + } + ExeFile = "ngrok_x64"; + } + else + { + ngrokFile = path + @"\ngrok_x86.exe"; + if (!File.Exists(ngrokFile)) + { + FileStream str = new FileStream(ngrokFile, FileMode.OpenOrCreate); + str.Write(Resources.ngrok_x86, 0, Resources.ngrok_x86.Length); + str.Close(); + } + ExeFile = "ngrok_x86"; + } + } + + /// + /// 初始化配置文件 + /// + public void InitConfig() + { + string path = System.IO.Directory.GetCurrentDirectory(); + + ConfigFile = path + @"\ngrok.cfg"; + if (!File.Exists(ConfigFile)) + { + FileStream fs1 = new FileStream(ConfigFile, FileMode.Create, FileAccess.Write);//创建写入文件 + StreamWriter sw = new StreamWriter(fs1); + + ServerConfig = new Config + { + ServerAddr = "ngrok.aaqbee.com:8083", + TrustHostRootCerts = false, + Tunnels = new Dictionary() + }; + Tunnel httpTunnel = new Tunnel + { + SubDomain = "test", + TunnelName = "test", + Proto = new Dictionary(), + Enable = true, + TunnelID = Guid.NewGuid().ToString() + }; + httpTunnel.Proto.Add("http", "127.0.0.1:5000"); + ServerConfig.Tunnels.Add(httpTunnel.TunnelID, httpTunnel); + Tunnel tcpTunnel = new Tunnel + { + TunnelName = "mstsc", + RemotePort = 33099, + Proto = new Dictionary(), + Enable = true, + TunnelID = Guid.NewGuid().ToString() + }; + tcpTunnel.Proto.Add("tcp", "127.0.0.1:1433"); + ServerConfig.Tunnels.Add(tcpTunnel.TunnelID, tcpTunnel); + + var serializer = new Serializer(); + serializer.Serialize(sw, ServerConfig); + sw.Close(); + fs1.Close(); + } + else + { + string configText = File.ReadAllText(ConfigFile, Encoding.UTF8); + var input = new StringReader(configText); + var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention()); + ServerConfig = deserializer.Deserialize(input); + } + + this.tunnelListBox.DisplayMember = "TunnelName"; + this.tunnelListBox.ValueMember = "TunnelID"; + } + + /// + /// 加载配置文件 + /// + public void LoadConfig() + { + tunnelListBox.Items.Clear(); + foreach(var item in ServerConfig.Tunnels) + { + tunnelListBox.Items.Add(item.Value); + } + if (tunnelListBox.Items.Count>0) + tunnelListBox.SelectedIndex = 0; + + string tunnelName = string.Empty; + foreach (var item in ServerConfig.Tunnels.Where(p => p.Value.Enable)) + { + tunnelName += " " + item.Key; + } + + ExecuteCommand = ExeFile + ".exe -config ngrok.cfg start" + tunnelName; + } + + public void ReLoadConfig() + { + string configText = File.ReadAllText(ConfigFile, Encoding.UTF8); + var input = new StringReader(configText); + var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention()); + ServerConfig = deserializer.Deserialize(input); + + LoadConfig(); + } + + /// + /// 通道类型选择 + /// + /// + /// + private void tunnelTypeCMB_SelectedIndexChanged(object sender, EventArgs e) + { + ComboBox cmb = sender as ComboBox; + + if (cmb.SelectedItem.ToString() == "HTTP") + { + subdomainLBL.Visible = true; + tunnelTypeLabelPort.Visible = false; + subdomainTB.KeyPress -= subdomainTB_KeyPress; + } + else + { + tunnelTypeLabelPort.Visible = true; + subdomainLBL.Visible = false; + subdomainTB.KeyPress += subdomainTB_KeyPress; + } + } + + /// + /// 子域名框按键释放 + /// + /// + /// + void subdomainTB_KeyPress(object sender, KeyPressEventArgs e) + { + //阻止从键盘输入键 + e.Handled = true; + if((e.KeyChar>='0' && e.KeyChar <='9') || e.KeyChar == '\b') + e.Handled = false; + } + + /// + /// 切换通道 + /// + /// + /// + private void tunnelListBox_SelectedValueChanged(object sender, EventArgs e) + { + ListBox lbx = sender as ListBox; + + if(lbx != null && lbx.SelectedItem != null) + { + Tunnel tunl = lbx.SelectedItem as Tunnel; + tunnelNameTB.Text = tunl.TunnelName; + tunnelTypeCMB.Text = tunl.Proto.ContainsKey("http") ? "HTTP" : "TCP"; + if (tunnelTypeCMB.Text == "HTTP") + { + subdomainLBL.Visible = true; + tunnelTypeLabelPort.Visible = false; + subdomainTB.Text = tunl.SubDomain; + } + else + { + tunnelTypeLabelPort.Visible = true; + subdomainLBL.Visible = false; + subdomainTB.Text = tunl.RemotePort.ToString(); + } + string ipPort = tunl.Proto.FirstOrDefault().Value; + + ipTB.Text = ipPort.Substring(0, ipPort.IndexOf(":")); + portTB.Text = ipPort.Substring(ipPort.IndexOf(":")+1); + + enableCBX.Checked = tunl.Enable; + } + } + + /// + /// 删除 + /// + /// + /// + private void delButton_Click(object sender, EventArgs e) + { + ListBox lbx = tunnelListBox as ListBox; + + if (lbx != null && lbx.SelectedItem != null) + { + Tunnel tunl = lbx.SelectedItem as Tunnel; + ServerConfig.Tunnels.Remove(tunl.TunnelID); + //SaveConfig(); + } + LoadConfig(); + } + + /// + /// 新增 + /// + /// + /// + private void addButton_Click(object sender, EventArgs e) + { + Tunnel tunl = new Tunnel + { + RemotePort = 33000, + Proto = new Dictionary(), + Enable = true, + TunnelID = Guid.NewGuid().ToString(), + TunnelName = "新增通道" + }; + tunl.Proto.Add("tcp", "127.0.0.1:80"); + ServerConfig.Tunnels.Add(tunl.TunnelID, tunl); + LoadConfig(); + tunnelListBox.SelectedItem = tunl; + } + + /// + /// 保存 + /// + /// + /// + private void saveButton_Click(object sender, EventArgs e) + { + if (tunnelListBox != null && tunnelListBox.SelectedItem != null) + { + Tunnel tunl = tunnelListBox.SelectedItem as Tunnel; + if (tunnelTypeCMB.Text == "HTTP") + { + tunl.Proto.Clear(); + tunl.Proto.Add("http", ipTB.Text + ":" + portTB.Text); + tunl.SubDomain = subdomainTB.Text; + } + else + { + tunl.Proto.Clear(); + tunl.Proto.Add("tcp", ipTB.Text + ":" + portTB.Text); + tunl.RemotePort = Int32.Parse(subdomainTB.Text); + } + tunl.TunnelName = tunnelNameTB.Text; + tunl.Enable = enableCBX.Checked; + + SaveConfig(); + + LoadConfig(); + } + WriteLogToForm("保存成功"); + this.Close(); + } + public void SaveConfig() + { + FileStream fs1 = new FileStream(ConfigFile, FileMode.OpenOrCreate, FileAccess.Write); + fs1.Seek(0, SeekOrigin.Begin); + fs1.SetLength(0); //清空文件 + var serializer = new Serializer(); + StreamWriter sw = new StreamWriter(fs1); + serializer.Serialize(sw, ServerConfig); + sw.Close(); + fs1.Close(); + } + + private void SettingForm_FormClosed(object sender, FormClosedEventArgs e) + { + ReLoadConfig(); + } + + } +} diff --git a/Ultron.Ngrok/Form/SettingForm.resx b/Ultron.Ngrok/Form/SettingForm.resx new file mode 100644 index 0000000..61bc649 --- /dev/null +++ b/Ultron.Ngrok/Form/SettingForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file diff --git a/Ultron.Ngrok/FormMain.Designer.cs b/Ultron.Ngrok/FormMain.Designer.cs new file mode 100644 index 0000000..35c4d57 --- /dev/null +++ b/Ultron.Ngrok/FormMain.Designer.cs @@ -0,0 +1,142 @@ +namespace Ultron.Ngrok +{ + partial class FormMain + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain)); + this.cmdLogTextArea = new System.Windows.Forms.TextBox(); + this.startBtn = new System.Windows.Forms.Button(); + this.endBtn = new System.Windows.Forms.Button(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.设置ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.帮助ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.关于ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // cmdLogTextArea + // + this.cmdLogTextArea.BackColor = System.Drawing.SystemColors.Window; + this.cmdLogTextArea.ForeColor = System.Drawing.SystemColors.InfoText; + this.cmdLogTextArea.Location = new System.Drawing.Point(12, 28); + this.cmdLogTextArea.Multiline = true; + this.cmdLogTextArea.Name = "cmdLogTextArea"; + this.cmdLogTextArea.ReadOnly = true; + this.cmdLogTextArea.Size = new System.Drawing.Size(339, 129); + this.cmdLogTextArea.TabIndex = 0; + // + // startBtn + // + this.startBtn.Location = new System.Drawing.Point(12, 163); + this.startBtn.Name = "startBtn"; + this.startBtn.Size = new System.Drawing.Size(75, 23); + this.startBtn.TabIndex = 1; + this.startBtn.Text = "启动"; + this.startBtn.UseVisualStyleBackColor = true; + this.startBtn.Click += new System.EventHandler(this.startBtn_Click); + // + // endBtn + // + this.endBtn.Enabled = false; + this.endBtn.Location = new System.Drawing.Point(276, 163); + this.endBtn.Name = "endBtn"; + this.endBtn.Size = new System.Drawing.Size(75, 23); + this.endBtn.TabIndex = 2; + this.endBtn.Text = "结束"; + this.endBtn.UseVisualStyleBackColor = true; + this.endBtn.Click += new System.EventHandler(this.endBtn_Click); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.设置ToolStripMenuItem, + this.帮助ToolStripMenuItem, + this.关于ToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(362, 25); + this.menuStrip1.TabIndex = 4; + this.menuStrip1.Text = "menuStrip1"; + // + // 设置ToolStripMenuItem + // + this.设置ToolStripMenuItem.Name = "设置ToolStripMenuItem"; + this.设置ToolStripMenuItem.Size = new System.Drawing.Size(44, 21); + this.设置ToolStripMenuItem.Text = "设置"; + this.设置ToolStripMenuItem.Click += new System.EventHandler(this.设置ToolStripMenuItem_Click); + // + // 帮助ToolStripMenuItem + // + this.帮助ToolStripMenuItem.Name = "帮助ToolStripMenuItem"; + this.帮助ToolStripMenuItem.Size = new System.Drawing.Size(44, 21); + this.帮助ToolStripMenuItem.Text = "帮助"; + this.帮助ToolStripMenuItem.Click += new System.EventHandler(this.帮助ToolStripMenuItem_Click); + // + // 关于ToolStripMenuItem + // + this.关于ToolStripMenuItem.Name = "关于ToolStripMenuItem"; + this.关于ToolStripMenuItem.Size = new System.Drawing.Size(44, 21); + this.关于ToolStripMenuItem.Text = "关于"; + this.关于ToolStripMenuItem.Click += new System.EventHandler(this.关于ToolStripMenuItem_Click); + // + // FormMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(362, 194); + this.Controls.Add(this.endBtn); + this.Controls.Add(this.startBtn); + this.Controls.Add(this.cmdLogTextArea); + this.Controls.Add(this.menuStrip1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; + this.MaximizeBox = false; + this.Name = "FormMain"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "uNgrok"; + this.Load += new System.EventHandler(this.FormMain_Load); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + public System.Windows.Forms.TextBox cmdLogTextArea; + private System.Windows.Forms.Button startBtn; + private System.Windows.Forms.Button endBtn; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem 帮助ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem 关于ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem 设置ToolStripMenuItem; + } +} + diff --git a/Ultron.Ngrok/FormMain.cs b/Ultron.Ngrok/FormMain.cs new file mode 100644 index 0000000..9b2609c --- /dev/null +++ b/Ultron.Ngrok/FormMain.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Diagnostics; +using System.Reflection; +using System.Resources; +using System.Threading; +using System.Text.RegularExpressions; +using System.IO; +using System.Net.NetworkInformation; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; +using Ultron.Ngrok.Utils; +using Ultron.Ngrok.Model; +using Ultron.Ngrok.Properties; + +namespace Ultron.Ngrok +{ + public partial class FormMain : Form + { + CmdUtils cmd = new CmdUtils(); + + SettingForm setting; + + public FormMain() + { + //引用资源处理 + AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; + + //初始化 + InitializeComponent(); + + //初始化配置 + InitSetting(); + } + + Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) + { + string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", ""); + dllName = dllName.Replace(".", "_"); + if (dllName.EndsWith("_resources")) return null; + ResourceManager rm = new ResourceManager(GetType().Namespace + ".Properties.Resources", Assembly.GetExecutingAssembly()); + byte[] bytes = (byte[])rm.GetObject(dllName); + return Assembly.Load(bytes); + } + + public void CheckProcessAndKill(string processName) + { + Process[] proces = Process.GetProcessesByName(processName); + foreach (var item in proces) + { + WriteLog("检测到进程:" + item.ProcessName + ",ID:" + item.Id + ""); + item.Kill(); + WriteLog("结束进程:" + item.Id + ""); + } + } + + public void CheckProcessAndKill(int id) + { + Process proces = Process.GetProcessById(id); + if (proces != null) + { + WriteLog("检测到进程:" + proces.ProcessName + ",ID:" + proces.Id + ""); + proces.Kill(); + WriteLog("结束进程:" + proces.Id + ""); + } + } + + public void InitSetting() + { + setting = new SettingForm(); + setting.WriteLogToForm += WriteLog; + } + + private void InitCmd() { + //创建CMD + cmd.ProcessMessageEvent += DealMessage; + cmd.ProcessKilled += cmd_Exited; + } + + private void startBtn_Click(object sender, EventArgs e) + { + //网络检测 + NetworkUtils.CheckServeStatus(this); + cmd.SendMsg(setting.ExecuteCommand); + + startBtn.Enabled = false; + endBtn.Enabled = true; + } + + private void endBtn_Click(object sender, EventArgs e) + { + CheckProcessAndKill(setting.ExeFile); + cmd.CloseCmd(); + startBtn.Enabled = true; + endBtn.Enabled = false; + } + + private void 关于ToolStripMenuItem_Click(object sender, EventArgs e) + { + AboutBox about = new AboutBox(); + about.ShowDialog(); + } + + private void FormMain_Load(object sender, EventArgs e) + { + //进程检测 + CheckProcessAndKill(setting.ExeFile); + + //初始化CMD + new Thread(new ThreadStart(InitCmd)).Start(); + + } + + public void DealMessage(int proId,string message) + { + if (message.StartsWith("Server failed to allocate tunnel")) + { + if (message.Contains("address already in use")) + { + string tcpErr = message.Substring(message.IndexOf("listen tcp")); + WriteLog(tcpErr); + int domainIndex = message.IndexOf("0.0.0.0:") + 8; + int portIndex = message.IndexOf(": bind:"); + string port = message.Substring(domainIndex, portIndex - domainIndex); + MessageBox.Show("通道分配失败,端口:" + port + "已被使用!"); + } + else if (message.Contains("is already registered")) + { + string tcpErr = message.Substring(message.IndexOf("The tunnel ")); + WriteLog(tcpErr); + int domainIndex = message.IndexOf("http://"); + int strIndex = message.IndexOf("is already"); + string domain = message.Substring(domainIndex, strIndex - domainIndex); + MessageBox.Show("通道分配失败,域名:" + domain + "已被使用!"); + } + + CheckProcessAndKill(proId); + startBtn.Enabled = true; + endBtn.Enabled = false; + } + else + { + if (message.Contains("Microsoft Windows") || message.Contains("Microsoft Corporation") || message.Contains(".exe -config ngrok.cfg start")) + return; + WriteLog(message); + } + } + + public void WriteLog(string message) + { + StringBuilder sb = new StringBuilder(cmdLogTextArea.Text); + cmdLogTextArea.Text = sb.AppendLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss ") + message).ToString(); + cmdLogTextArea.SelectionStart = cmdLogTextArea.Text.Length; + cmdLogTextArea.ScrollToCaret(); + } + + public void cmd_Exited(object sender, EventArgs e) + { + WriteLog("结束运行!"); + startBtn.Enabled = true; + endBtn.Enabled = false; + } + + private void 设置ToolStripMenuItem_Click(object sender, EventArgs e) + { + setting.ReLoadConfig(); + setting.ShowDialog(); + } + + private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e) + { + } + } +} diff --git a/Ultron.Ngrok/FormMain.resx b/Ultron.Ngrok/FormMain.resx new file mode 100644 index 0000000..dd8cdf7 --- /dev/null +++ b/Ultron.Ngrok/FormMain.resx @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAMMOAADDDgAAAAAAAAAA + AAA/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//QEBA/0BAQP8/Pz//QUFB/0BAQP8/Pz//QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/87Ozv/PDw8/0BAQP81NTX/OTk5/0BAQP86Ojr/PT09/z8/P/9AQED/Pz8//z8/ + P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z4+Pv8+Pj7/Pz8//0dHR/9ERET/Ojo6/3Fxcf9cXFz/Nzc3/0tLS/9FRUX/Pz8//z09 + Pf8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//0BAQP9AQED/Pj4+/0FBQf8vLy//ioqK/4mJif8sLCz/qKio/3l5ef8yMjL/ra2t/2ho + aP8xMTH/R0dH/z09Pf9BQUH/QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/9AQED/Ozs7/zU1Nf9sbGz/paWl/0JCQv+Ojo7/sbGx/5mZmf+rq6v/p6en/52d + nf+3t7f/ZmZm/1tbW/+zs7P/UlJS/zU1Nf88PDz/QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/ + P/8/Pz//Pz8//z8/P/8/Pz//QEBA/zw8PP9SUlL/Pj4+/0NDQ/+0tLT/s7Oz/7e3t/+3t7f/urq6/7Oz + s/+1tbX/urq6/7e3t/+2trb/ubm5/5+fn/8uLi7/UlJS/0pKSv89PT3/Pz8//z8/P/8/Pz//Pz8//z8/ + P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/9BQUH/Ojo6/5iYmP+pqan/k5OT/7u7u/+9vb3/r6+v/5qa + mv+MjIz/h4eH/4iIiP+QkJD/oqKi/7a2tv+9vb3/tbW1/4qKiv/AwMD/d3d3/zY2Nv9BQUH/Pz8//z8/ + P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//zw8PP8vLy//SEhI/8LCwv/IyMj/vb29/5yc + nP+EhIT/eHh4/2xsbP9fX1//Y2Nj/3BwcP98fHz/i4uL/6urq//CwsL/zMzM/6Wlpf8wMDD/ODg4/zw8 + PP9AQED/Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//0FBQf82Njb/fn5+/62trf+Wlpb/ycnJ/8HB + wf+bm5v/ioqK/25ubv9MTEz/QUFB/zw8PP89PT3/QUFB/1JSUv93d3f/jY2N/62trf/Jycn/wMDA/46O + jv+9vb3/XFxc/zo6Ov9AQED/Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//QEBA/zk5Of9GRkb/qqqq/9bW + 1v/Kysr/q6ur/5SUlP9lZWX/Pj4+/z09Pf8/Pz//QEBA/0BAQP8+Pj7/PT09/0FBQf92dnb/m5ub/7y8 + vP/Nzc3/1tbW/4qKiv87Ozv/PDw8/0BAQP8/Pz//Pz8//z4+Pv8/Pz//Pz8//0BAQP88PDz/Tk5O/0VF + Rf+ZmZn/2dnZ/8HBwf+srKz/rKys/0RERP8vLy//QEBA/0JCQv8/Pz//QEBA/0NDQ/87Ozv/LCws/2tr + a/+0tLT/rq6u/83Nzf/U1NT/ZWVl/0tLS/9HR0f/PT09/z8/P/8/Pz//Pj4+/z8/P/8/Pz//QUFB/zU1 + Nf+UlJT/39/f/9PT0//W1tb/xsbG/7W1tf+tra3/vr6+/3l5ef82Njb/NDQ0/0FBQf89PT3/Ly8v/0tL + S/+dnZ3/vLy8/6ioqP+8vLz/zMzM/9bW1v/T09P/39/f/2tra/83Nzf/QUFB/z8/P/8+Pj7/Pz8//z8/ + P/8/Pz//QEBA/y8vL/96enr/4uLi/9PT0//X19f/mJiY/z09Pf+Dg4P/zc3N/7+/v/9kZGT/NDQ0/z4+ + Pv+Li4v/09PT/7Kysv9bW1v/TU1N/8TExP/U1NT/29vb/87Ozv9MTEz/Nzc3/0BAQP8/Pz//Pz8//z4+ + Pv8/Pz//Pz8//z8/P/9CQkL/WVlZ/5ubm//k5OT/2dnZ/+Tk5P96enr/MzMz/zk5Of9MTEz/oKCg/+fn + 5/+Ojo7/vLy8/9fX1/91dXX/PT09/zo6Ov87Ozv/uLi4/+Pj4//d3d3/1tbW/3l5ef9RUVH/PT09/0BA + QP8/Pz//Pj4+/z8/P/9AQED/PT09/0dHR//S0tL/6enp/9/f3//f39//8PDw/3V1df81NTX/Q0ND/zs7 + O/81NTX/cXFx/8fHx/+tra3/S0tL/zU1Nf8/Pz//QkJC/zc3N/+2trb/7u7u/97e3v/f39//7+/v/6Oj + o/82Njb/QUFB/z8/P/8+Pj7/Pz8//z8/P/8/Pz//QkJC/zQ0NP95eXn/7u7u/9/f3//6+vr/iYmJ/zIy + Mv9CQkL/QUFB/z8/P/84ODj/4eHh/5KSkv8tLS3/RERE/0BAQP8/Pz//PT09/87Ozv/x8fH/5OTk/9XV + 1f9FRUX/Pz8//0BAQP8/Pz//Pz8//z4+Pv8/Pz//Pz8//0BAQP89PT3/TExM/6qqqv/t7e3/4ODg//j4 + +P+4uLj/MzMz/0JCQv8/Pz//Pz8//z4+Pv/d3d3/lpaW/zIyMv9CQkL/QEBA/zo6Ov9UVFT/7u7u/+np + 6f/l5eX/4+Pj/4SEhP9ERET/Pj4+/z8/P/8/Pz//Pj4+/z8/P/8/Pz//QUFB/zQ0NP+hoaH/3d3d/9/f + 3//n5+f/5+fn/+zs7P9WVlb/Nzc3/0NDQ/8+Pj7/Ozs7/9nZ2f+SkpL/MTEx/0FBQf9ERET/Li4u/5yc + nP/4+Pj/4eHh/+vr6//S0tL/3Nzc/21tbf82Njb/QUFB/z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pj4+/0ZG + Rv8oKCj/np6e//X19f/d3d3/6Ojo/729vf83Nzf/Ojo6/0NDQ/88PDz/zs7O/42Njf81NTX/RUVF/y4u + Lv9jY2P/5eXl/97e3v/l5eX/7u7u/1hYWP8wMDD/Q0ND/z4+Pv8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/ + P/9BQUH/ODg4/2tra//h4eH/9fX1/+np6f/T09P/3Nzc/66urv9ERET/MDAw/zAwMP/BwcH/gICA/ycn + J/8zMzP/ampq/9TU1P/V1dX/3d3d/+3t7f/09PT/wsLC/0pKSv88PDz/QEBA/z8/P/8/Pz//Pj4+/z8/ + P/8/Pz//Pz8//0FBQf81NTX/gYGB/56env+Li4v/7Ozs/+Xl5f/Ly8v/zMzM/8DAwP+BgYH/X19f/8PD + w/+ampr/YWFh/6CgoP/Ozs7/xsbG/9jY2P/v7+//0dHR/2tra/+rq6v/VlZW/zo6Ov9AQED/Pz8//z8/ + P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//0BAQP86Ojr/LCws/2JiYv/x8fH/8/Pz/+rq6v/Ozs7/vr6+/8LC + wv/BwcH/urq6/729vf/CwsL/v7+//8HBwf/a2tr/7e3t//j4+P/Ly8v/Ojo6/zIyMv89PT3/QEBA/z8/ + P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//0JCQv84ODj/ubm5/7CwsP+MjIz/5ubm/+/v + 7//i4uL/z8/P/8HBwf/CwsL/vr6+/8bGxv/W1tb/6urq//Hx8f/MzMz/b29v/8/Pz/9/f3//Nzc3/0JC + Qv8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv9ISEj/NjY2/1ZW + Vv/o6Oj/xsbG/93d3f/p6en/8fHx/+fn5//r6+v/8fHx/+fn5//Nzc3/zs7O/8nJyf8zMzP/QUFB/0JC + Qv8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/82Njb/dnZ2/7CwsP8xMTH/p6en/9nZ2f+bm5v/2NjY/7+/v/+enp7/5+fn/2ZmZv9HR0f/t7e3/1BQ + UP86Ojr/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//0BAQP86Ojr/Ozs7/zQ0NP+fn5//kZGR/yAgIP/Kysr/hYWF/yUlJf+2trb/cnJy/zQ0 + NP86Ojr/PT09/0BAQP8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/8/Pz//Pz8//0BAQP9AQED/QEBA/0BAQP9BQUH/Pz8//15eXv9TU1P/PT09/z8/ + P/8+Pj7/QEBA/0BAQP8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/ + P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/9AQED/OTk5/zs7 + O/9AQED/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+ + Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/9AQED/QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/ + P/8/Pz//Pz8//z8/P/8+Pj7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/Ultron.Ngrok/Model/Config.cs b/Ultron.Ngrok/Model/Config.cs new file mode 100644 index 0000000..28942d2 --- /dev/null +++ b/Ultron.Ngrok/Model/Config.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using YamlDotNet.Serialization; + +namespace Ultron.Ngrok.Model +{ + public class Config + { + [YamlMember(Alias = "http_proxy")] + public string HttpProxy { get; set; } + + [YamlMember(Alias = "server_addr")] + public string ServerAddr { get; set; } + + [YamlMember(Alias = "inspect_addr")] + public string InspectAddr { get; set; } + + [YamlMember(Alias = "trust_host_root_certs")] + public bool TrustHostRootCerts { get; set; } + + [YamlMember(Alias = "version")] + public string Version { get; set; } + + [YamlMember(Alias = "auth_token")] + public string AuthToken { get; set; } + + [YamlMember(Alias = "tunnels")] + public Dictionary Tunnels { get; set; } + } + + public class Tunnel + { + [YamlMember(Alias = "tunnel_id")] + public string TunnelID { get; set; } + + [YamlMember(Alias = "tunnel_name")] + public string TunnelName { get; set; } + + [YamlMember(Alias = "subdomain")] + public string SubDomain { get; set; } + + [YamlMember(Alias = "hostname")] + public string HostName { get; set; } + + [YamlMember(Alias = "proto")] + public Dictionary Proto { get; set; } + + [YamlMember(Alias = "auth")] + public string Auth { get; set; } + + [YamlMember(Alias = "remote_port")] + public int RemotePort { get; set; } + + [YamlMember(Alias = "enable")] + public bool Enable { get; set; } + } +} diff --git a/Ultron.Ngrok/Program.cs b/Ultron.Ngrok/Program.cs new file mode 100644 index 0000000..e3840cb --- /dev/null +++ b/Ultron.Ngrok/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Ultron.Ngrok +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormMain()); + } + } +} diff --git a/Ultron.Ngrok/Properties/AssemblyInfo.cs b/Ultron.Ngrok/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..54ac24a --- /dev/null +++ b/Ultron.Ngrok/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Ultron.Ngrok")] +[assembly: AssemblyDescription("内网穿透工具")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Ultron.Ngrok")] +[assembly: AssemblyCopyright("Copyright © WangYu 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("84c08c82-cabc-46af-b99a-7057abbc994d")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Ultron.Ngrok/Properties/Resources.Designer.cs b/Ultron.Ngrok/Properties/Resources.Designer.cs new file mode 100644 index 0000000..61f5f95 --- /dev/null +++ b/Ultron.Ngrok/Properties/Resources.Designer.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Ultron.Ngrok.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Ultron.Ngrok.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 使用此强类型资源类,为所有资源查找 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] ngrok_x64 { + get { + object obj = ResourceManager.GetObject("ngrok_x64", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] ngrok_x86 { + get { + object obj = ResourceManager.GetObject("ngrok_x86", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] YamlDotNet { + get { + object obj = ResourceManager.GetObject("YamlDotNet", resourceCulture); + return ((byte[])(obj)); + } + } + } +} diff --git a/Ultron.Ngrok/Properties/Resources.resx b/Ultron.Ngrok/Properties/Resources.resx new file mode 100644 index 0000000..05a859a --- /dev/null +++ b/Ultron.Ngrok/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\ngrok_x64.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\ngrok_x86.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\YamlDotNet.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Ultron.Ngrok/Properties/Settings.Designer.cs b/Ultron.Ngrok/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e7e21cf --- /dev/null +++ b/Ultron.Ngrok/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Ultron.Ngrok.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Ultron.Ngrok/Properties/Settings.settings b/Ultron.Ngrok/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Ultron.Ngrok/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Ultron.Ngrok/Resources/YamlDotNet.dll b/Ultron.Ngrok/Resources/YamlDotNet.dll new file mode 100644 index 0000000..16c4737 Binary files /dev/null and b/Ultron.Ngrok/Resources/YamlDotNet.dll differ diff --git a/Ultron.Ngrok/Resources/icon.ico b/Ultron.Ngrok/Resources/icon.ico new file mode 100644 index 0000000..a9a90e2 Binary files /dev/null and b/Ultron.Ngrok/Resources/icon.ico differ diff --git a/Ultron.Ngrok/Resources/ngrok_x64.exe b/Ultron.Ngrok/Resources/ngrok_x64.exe new file mode 100644 index 0000000..2b861ca Binary files /dev/null and b/Ultron.Ngrok/Resources/ngrok_x64.exe differ diff --git a/Ultron.Ngrok/Resources/ngrok_x86.exe b/Ultron.Ngrok/Resources/ngrok_x86.exe new file mode 100644 index 0000000..7d941ab Binary files /dev/null and b/Ultron.Ngrok/Resources/ngrok_x86.exe differ diff --git a/Ultron.Ngrok/Ultron.Ngrok.csproj b/Ultron.Ngrok/Ultron.Ngrok.csproj new file mode 100644 index 0000000..9f28079 --- /dev/null +++ b/Ultron.Ngrok/Ultron.Ngrok.csproj @@ -0,0 +1,162 @@ + + + + + Debug + AnyCPU + {D44A2DC3-FADD-47E7-A311-35C4B3404DFF} + WinExe + Properties + Ultron.Ngrok + uNgrok + v4.5 + 512 + false + 发布\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Resources\icon.ico + + + + + + + + + + + + + + ..\packages\YamlDotNet.3.8.0\lib\net35\YamlDotNet.dll + True + False + + + + + Form + + + AboutBox.cs + + + Form + + + FormMain.cs + + + + + + Form + + + SettingForm.cs + + + + + AboutBox.cs + + + FormMain.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingForm.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + False + Microsoft .NET Framework 4.5 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + + \ No newline at end of file diff --git a/Ultron.Ngrok/Ultron.Ngrok.csproj.user b/Ultron.Ngrok/Ultron.Ngrok.csproj.user new file mode 100644 index 0000000..e1fb9e1 --- /dev/null +++ b/Ultron.Ngrok/Ultron.Ngrok.csproj.user @@ -0,0 +1,14 @@ + + + + 发布\ + + + + + + zh-CN + false + ProjectFiles + + \ No newline at end of file diff --git a/Ultron.Ngrok/Utils/CmdUtils.cs b/Ultron.Ngrok/Utils/CmdUtils.cs new file mode 100644 index 0000000..8ff75a0 --- /dev/null +++ b/Ultron.Ngrok/Utils/CmdUtils.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Ultron.Ngrok.Utils +{ + public class CmdUtils + { + public delegate void ProcessInfomation(int id, string message); + + public event ProcessInfomation ProcessMessageEvent; + public event EventHandler ProcessKilled; + + Process cmd = new Process(); + + public bool IsInited = false; + + public CmdUtils() + { + Control.CheckForIllegalCrossThreadCalls = false; + + } + + public void Init() + { + cmd = new Process();//创建进程对象 + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.FileName = "cmd.exe";//设定需要执行的命令 + startInfo.Arguments = "";//“/C”表示执行完命令后马上退出 + startInfo.UseShellExecute = false;//不使用系统外壳程序启动 + startInfo.RedirectStandardInput = true;//不重定向输入 + startInfo.RedirectStandardOutput = true; //重定向输出 + startInfo.CreateNoWindow = false;//不创建窗口 + + cmd.StartInfo = startInfo; + + cmd.EnableRaisingEvents = true; + + cmd.OutputDataReceived -= new DataReceivedEventHandler(OutputHandler); + cmd.OutputDataReceived += new DataReceivedEventHandler(OutputHandler); + cmd.Exited += ProcessKilled; + + cmd.Start(); + cmd.BeginOutputReadLine(); + } + + void cmd_Exited(object sender, EventArgs e) + { + + } + + private void OutputHandler(object sender, DataReceivedEventArgs e) + { + if (!String.IsNullOrEmpty(e.Data)) + { + ProcessMessageEvent(cmd.Id, e.Data); + } + } + + public void SendMsg(string cmdStr) + { + ProcessMessageEvent(0, "开始运行..."); + if (!IsInited || cmd.HasExited) + { + cmd = new Process();//创建进程对象 + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.FileName = "cmd.exe";//设定需要执行的命令 + startInfo.Arguments = "";//“/C”表示执行完命令后马上退出 + startInfo.UseShellExecute = false;//不使用系统外壳程序启动 + startInfo.RedirectStandardInput = true;//不重定向输入 + startInfo.RedirectStandardOutput = true; //重定向输出 + startInfo.CreateNoWindow = false;//不创建窗口 + + cmd.StartInfo = startInfo; + + cmd.EnableRaisingEvents = true; + + cmd.OutputDataReceived -= new DataReceivedEventHandler(OutputHandler); + cmd.OutputDataReceived += new DataReceivedEventHandler(OutputHandler); + + cmd.Exited += ProcessKilled; + cmd.Start(); + cmd.BeginOutputReadLine(); + + IsInited = true; + } + cmd.StandardInput.WriteLine(cmdStr); + } + + public void CloseCmd() + { + if (cmd != null && !cmd.HasExited) + cmd.Kill() ; + } + } +} diff --git a/Ultron.Ngrok/Utils/NetworkUtils.cs b/Ultron.Ngrok/Utils/NetworkUtils.cs new file mode 100644 index 0000000..237a6a6 --- /dev/null +++ b/Ultron.Ngrok/Utils/NetworkUtils.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Ultron.Ngrok.Utils +{ + public class NetworkUtils + { + + public static string url = "www.baidu.com;www.sina.com;www.163.com;ngrok.aaqbee.com"; + + public static string[] urls = url.Split(new char[] { ';' }); + + public static FormMain fm = null; + + public static void RwiteLog(string message) + { + StringBuilder sb = new StringBuilder(NetworkUtils.fm.cmdLogTextArea.Text); + NetworkUtils.fm.cmdLogTextArea.Text = sb.AppendLine(message).ToString(); + NetworkUtils.fm.cmdLogTextArea.SelectionStart = fm.cmdLogTextArea.Text.Length; + NetworkUtils.fm.cmdLogTextArea.ScrollToCaret(); + } + /// + /// 检测网络连接状态 + /// + /// + public static void CheckServeStatus(FormMain form) + { + Control.CheckForIllegalCrossThreadCalls = false; + + NetworkUtils.fm = form; + + int errCount = 0;//ping时连接失败个数 + + NetworkUtils.RwiteLog("开始检测网络..."); + + string checkMsg = string.Empty; + + if (!LocalConnectionStatus()) + { + checkMsg = "网络异常--无连接"; + } + else if (!MyPing(urls, out errCount)) + { + if ((double)errCount / urls.Length >= 0.3) + { + checkMsg = "网络异常--连接多次无响应"; + } + else + { + checkMsg = "网络不稳定"; + } + } + else + { + checkMsg = "网络正常"; + } + NetworkUtils.RwiteLog(checkMsg); + NetworkUtils.RwiteLog("网络检测结束..."); + } + + private const int INTERNET_CONNECTION_MODEM = 1; + private const int INTERNET_CONNECTION_LAN = 2; + + + [System.Runtime.InteropServices.DllImport("winInet.dll")] + private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved); + /// + /// 判断本地的连接状态 + /// + /// + private static bool LocalConnectionStatus() + { + System.Int32 dwFlag = new Int32(); + if (!InternetGetConnectedState(ref dwFlag, 0)) + { + NetworkUtils.RwiteLog("本地连接状态--未连网!"); + return false; + } + else + { + if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0) + { + //NetworkUtils.RwiteLog("本地连接状态--采用调制解调器上网。"); + return true; + } + else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0) + { + //NetworkUtils.RwiteLog("本地连接状态--采用网卡上网。"); + return true; + } + } + return false; + } + + /// + /// Ping命令检测网络是否畅通 + /// + /// URL数据 + /// ping时连接失败个数 + /// + public static bool MyPing(string[] urls, out int errorCount) + { + bool isconn = true; + Ping ping = new Ping(); + errorCount = 0; + try + { + PingReply pr; + for (int i = 0; i < urls.Length; i++) + { + pr = ping.Send(urls[i]); + if (pr.Status != IPStatus.Success) + { + isconn = false; + errorCount++; + } + //NetworkUtils.RwiteLog("Ping " + urls[i] + " " + pr.Status.ToString()); + } + } + catch + { + isconn = false; + errorCount = urls.Length; + } + //if (errorCount > 0 && errorCount < 3) + // isconn = true; + return isconn; + } + } +}