diff --git a/.vs/MDserver/v14/.suo b/.vs/MDserver/v14/.suo
index cdd60db..b80862c 100644
Binary files a/.vs/MDserver/v14/.suo and b/.vs/MDserver/v14/.suo differ
diff --git a/MDserver/AboutForm.Designer.cs b/MDserver/AboutForm.Designer.cs
index 4a26093..67f8cf3 100644
--- a/MDserver/AboutForm.Designer.cs
+++ b/MDserver/AboutForm.Designer.cs
@@ -83,11 +83,15 @@ private void InitializeComponent()
this.Controls.Add(this.label2);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.KeyPreview = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutForm";
this.ShowIcon = false;
this.Text = "MDserver";
+ this.TopMost = true;
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
diff --git a/MDserver/AboutForm.resx b/MDserver/AboutForm.resx
index 106d961..7079589 100644
--- a/MDserver/AboutForm.resx
+++ b/MDserver/AboutForm.resx
@@ -121,202 +121,342 @@
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
- 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
+ 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
+ /f75//77//7///xPNzFlQTdlMiheKyFkMSdgLyFLJx3///v5/vz5+/z//v//+PhdhYo/CRBLCgE8DABH
+ CwA8DgA5DAE6DAE2DAAzCwAuBgEbAAAAAAAAAAA2HBYmAgA1BQE7BwE6CQA6CgA8DQBFDgE5DgBOEAU5
+ HRL//PtVUluQkZtIY2A+PTlhSEZuQkGBVVv/+////v3//PV8VE90RT1yRjl0Rjt5SD59TD6ATEX//Pb3
+ //36/////v///P85XF8xHyZZDgxDDABFCwA6DQA9DAI6DAE4CwA2CwIuCQUAAAAAAAAAAAAAAAArDQg6
+ BwQ5AwA7CwA9DQFCDgFDCwBDFAZICABdLyewjYr/7fVpYGp5fIGdmJmWg4CEbWv//Pvv/////vrYxb6M
+ XVmNWVJ/V0t/Vk2BVk2JWEqJUkuWgHr5/fj4/P39+vz//f9UWVplaG1NBw1OCgA/CgA6DQA+CgM7DAQ4
+ CQE1BwAmCAMAAAAAAAAAAAAAAAAAAAA0BAA2AgA8DQA/DgBEDQBIBQBLDgSVX1Sndm6Qc261lpn/9/v/
+ /f/3+Pb///z+/vj9//zv5eWVhIGRdHCbbGikdG6bdGuZdGyZc26dcGWfb2mKamXSw8D///79/P7//v+r
+ mZqKpq15UFVSCgA+CQA9DABBCwQ8CwM4CQE5BgMwGxYAAAAAAAAAAAAAAAAAAAA0BgBBDwM8DQBBDQBH
+ CwBVEwhGBQC0kIi5joueiIKpiYSmjojItbDm29fq5eLo39y0n524iIesioqqh4S1ioexh4KviYSuiYWu
+ iIazi4ashoGuiIaggYD/+vf////7/f3u2Np1mKKdjZRJCwBODQVDCwBDCwY8CgQ6CAI6CAIAAAAAAAAA
+ AAAAAAAAAAAAAAAaAQA0BQE9CgBACgBKCQBCCgCQZVy+pJ69opjCope9oZq5oZu9oJu9oJu9oJu9oJu9
+ oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu5oZu9oJu+oJu+pJ66qKH///j///j/9PyipKWYuLc/Ih5U
+ DwVTDgRDDwBFCwBACwggBgEAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Dww8AQBHDAJGDwJHCgDTqaLItbDJ
+ tKzQs6rLs63Hs67Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63HtK3Ns63Ns63J
+ savCsKn/+/L///f//f7h1dWksbNpZ2Y8BwBEDAE+BwBDDQI8Eg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABODglEBwA+DQBLBwDdt7LNwr7VxMHcw7/XxMHTxMLXxL/XxL/XxL/XxL/XxL/XxL/XxL/XxL/X
+ xL/XxL/XxL/XxL/XxL/Txb/YxL/axL/VwbzRvrnOxL3d1c799e7//fvt4+mRoaAvDgU8CAFKEQg9CgAu
+ FQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAABABQBEEABLBACJY17h29bl2dns19nq2Nnj2dno
+ 2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbl2tbm2tbq2dbo19To2dbj19Pg1dHm
+ 3dTr2NPd0dc8ODcxAQA/CgA+CwEsAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6CgQ7
+ AwBNCAU6EAvs4tvq3t7v4OT05urt5ebr4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r
+ 4t/p4t/r4t/u4d/u4d/u4d/t4d/t4d/x3tv27enk3N1JEhVJBgBBBwA0CgUAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkDgpGCwFLEAawgX3/6+7y6O758PP67O317e717e717e717e71
+ 7e717e717e717e717e717e717e717e717e717e7z7e7z7e7z7e7z7e7z7e7z7e705eP///R+VUxKCwND
+ BQAvCgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQBJCQAzAACx
+ kpX/+v//9vn/9fP88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b59Pb5
+ 9Pb59Pb59Pb59Pb+9fF3TD1HAgA1CgAwCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAiAwBJCABLDQNrPDT//Pn7/f739vj/+/3/9/r/9vn/+vz4/P399fb/+Pn9
+ 9fb/+fr+9vf99fb/+Pn79Pf/+Pv79vj++fv9+Pr79Pf/+PtaLBtTEAdGBwAhAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEHRZBCwRBDQY3CgdoQT//
+ +vj/+/v///7//v/9///7/v/9/v/8/f/9/v/6+//8/f/8/f/7/P/9/P79///+//3++/f//vtLLCkuBwVN
+ DwdECwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAzBgBHBgBRDAMwCgVgRD3g0Mr///7//P789/n//f///P///f///P///f///f//
+ /f///fz//Pm+qqU8IBk3EAg/CgBKDwZDEAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9Dwg/DgZEDwVHDwRB
+ CwA9DABCDQNDDgRLFgxJFApFEAZBDAI/CgBFDQJHCQFGCgQ+BwI5DQYAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAArGRAwDwZDDgRFDQJCCwBGDwJDDABGDwJDDABDDABEDQBCCwBDCgFADwUpCgEd
+ CQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCgU0DAcxCQQ1
+ DQgzCwYyCgUvBwIvBwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///AP//8AAP//gAH//wAA//wAAH//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/
+ AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAA
+ AAAABwAA4AAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAwAAwAAAAAADAADgAAAAAAMAAOAAAAAABwAA4AAAAAAH
+ AADwAAAAAA8AAPgAAAAADwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/A
+ AAAH/wAA//AAAA//AAD//gAAf/8AAP//AAD//wAA///wD///AAA=
\ No newline at end of file
diff --git a/MDserver/Form_MDserver.Designer.cs b/MDserver/Form_MDserver.Designer.cs
index 26b117b..2d7e450 100644
--- a/MDserver/Form_MDserver.Designer.cs
+++ b/MDserver/Form_MDserver.Designer.cs
@@ -103,6 +103,7 @@ private void InitializeComponent()
this.ToolStripMenuItem_exit = new System.Windows.Forms.ToolStripMenuItem();
this.radioButton_Apache = new System.Windows.Forms.RadioButton();
this.groupBox_webserver = new System.Windows.Forms.GroupBox();
+ this.button_host = new System.Windows.Forms.Button();
this.statusStrip_main.SuspendLayout();
this.groupBox_manage.SuspendLayout();
this.groupBox_sql.SuspendLayout();
@@ -481,12 +482,13 @@ private void InitializeComponent()
this.button_mod_host.Name = "button_mod_host";
this.button_mod_host.Size = new System.Drawing.Size(66, 23);
this.button_mod_host.TabIndex = 5;
- this.button_mod_host.Text = "HOST文件";
+ this.button_mod_host.Text = "WEB管理";
this.button_mod_host.UseVisualStyleBackColor = true;
this.button_mod_host.Click += new System.EventHandler(this.button_mod_host_Click);
//
// groupBox_usually
//
+ this.groupBox_usually.Controls.Add(this.button_host);
this.groupBox_usually.Controls.Add(this.button_OP_lweb);
this.groupBox_usually.Controls.Add(this.button_author);
this.groupBox_usually.Controls.Add(this.button_mod_host);
@@ -501,7 +503,7 @@ private void InitializeComponent()
//
this.button_OP_lweb.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
this.button_OP_lweb.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
- this.button_OP_lweb.Location = new System.Drawing.Point(12, 75);
+ this.button_OP_lweb.Location = new System.Drawing.Point(12, 100);
this.button_OP_lweb.Name = "button_OP_lweb";
this.button_OP_lweb.Size = new System.Drawing.Size(66, 22);
this.button_OP_lweb.TabIndex = 8;
@@ -512,7 +514,7 @@ private void InitializeComponent()
// button_author
//
this.button_author.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
- this.button_author.Location = new System.Drawing.Point(12, 46);
+ this.button_author.Location = new System.Drawing.Point(12, 71);
this.button_author.Name = "button_author";
this.button_author.Size = new System.Drawing.Size(66, 22);
this.button_author.TabIndex = 7;
@@ -808,6 +810,23 @@ private void InitializeComponent()
this.groupBox_webserver.TabStop = false;
this.groupBox_webserver.Text = "WebServer";
//
+ // button_host
+ //
+ this.button_host.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.button_host.FlatAppearance.BorderColor = System.Drawing.Color.White;
+ this.button_host.FlatAppearance.BorderSize = 0;
+ this.button_host.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White;
+ this.button_host.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
+ this.button_host.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.button_host.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
+ this.button_host.Location = new System.Drawing.Point(12, 46);
+ this.button_host.Name = "button_host";
+ this.button_host.Size = new System.Drawing.Size(66, 23);
+ this.button_host.TabIndex = 9;
+ this.button_host.Text = "HOST查看";
+ this.button_host.UseVisualStyleBackColor = true;
+ this.button_host.Click += new System.EventHandler(this.button_host_Click);
+ //
// MDserv
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
@@ -878,7 +897,7 @@ private void InitializeComponent()
private System.Windows.Forms.GroupBox groupBox_usually;
private System.Windows.Forms.ListBox listBox_listen;
private System.Windows.Forms.GroupBox groupBox_status;
- private System.Windows.Forms.Button button_start;
+ public System.Windows.Forms.Button button_start;
private System.Windows.Forms.Button button_regedit;
private System.ServiceProcess.ServiceController serviceController_main;
private System.Windows.Forms.Button button_author;
@@ -928,6 +947,7 @@ private void InitializeComponent()
private System.Windows.Forms.MenuItem menuItem_php_list_0;
private System.Windows.Forms.RadioButton radioButton_Apache;
private System.Windows.Forms.GroupBox groupBox_webserver;
+ private System.Windows.Forms.Button button_host;
}
}
diff --git a/MDserver/Form_MDserver.cs b/MDserver/Form_MDserver.cs
index 4008ded..6720879 100644
--- a/MDserver/Form_MDserver.cs
+++ b/MDserver/Form_MDserver.cs
@@ -22,14 +22,14 @@
//self class
using MDserver;
-
-
+using System.Xml;
+using System.Text.RegularExpressions;
namespace MDserver
{
public partial class MDserv : Form
{
- //private static string version = "1.1.5";
+ //private static string version = "2.0.0";
//PID 进程显示时钟
private System.Timers.Timer timer = new System.Timers.Timer(3000);
@@ -68,26 +68,30 @@ public static extern IntPtr CreateService(IntPtr SC_HANDLE, string lpSvcName, st
private static string MD_MongoDB = "MDserver-MongoDB";
//默认php版本
- private static string PHP_VERSION = "php5.5";
+ private static string PHP_VERSION = "php55";
+
+ private static string HOSTS_NOTES = "#MDserver Hosts Don`t Remove and Change";
private SystemINI ini;
+ private SystemXml iniXml;
public MDserv()
{
InitializeComponent();
this.ini = new SystemINI(BaseDir + "md.ini");
+ this.iniXml = new SystemXml(BaseDir + "host.xml");
//拦截标题栏的关闭事件
this.Closing += new CancelEventHandler(MDserv_Closing);
//延迟执行
- System.Timers.Timer timers = new System.Timers.Timer(500);
+ System.Timers.Timer timers = new System.Timers.Timer(200);
timers.Elapsed += new System.Timers.ElapsedEventHandler(_MDserv_start);
timers.Enabled = true;
timers.AutoReset = false;
Control.CheckForIllegalCrossThreadCalls = false;
-
+
addPHPMenulist();
}
@@ -181,16 +185,19 @@ private void _MDserv_start(object sender, System.Timers.ElapsedEventArgs e)
{
//检查原有的服务
string[] service = { MD_ApacheName, MD_MySQL, MD_Redis };
- System.Timers.Timer timer = new System.Timers.Timer(3000);
+ System.Timers.Timer timer = new System.Timers.Timer(1000);
foreach (string s in service)
{
if (WServiceIsExisted(s) && !WQueryServiceIsStart(s))
{
- button_start.Enabled = false;
+
if (!WQueryServiceIsStart(s))
{
+
if (s == MD_ApacheName)
{
+ button_start.Enabled = false;
+
radioButton_Apache.Checked = true;
WStart(MD_ApacheName);
@@ -205,8 +212,9 @@ private void _MDserv_start(object sender, System.Timers.ElapsedEventArgs e)
timer.Elapsed += new System.Timers.ElapsedEventHandler(_start_mysql_lazy);
timer.Enabled = true;
timer.AutoReset = false;
- }
+ }
}
+
}
//线程检查
@@ -238,7 +246,8 @@ private void _check_status(object sender, System.Timers.ElapsedEventArgs e)
}
//MD_MySQL
- if (WQueryServiceIsStart(MD_MySQL)) {
+ if (WQueryServiceIsStart(MD_MySQL))
+ {
checkBox_MySQL.Checked = true;
}
@@ -270,7 +279,8 @@ private void _check_ws_status()
}
//添加PHP列表
- private void addPHPMenulist() {
+ private void addPHPMenulist()
+ {
//查看PHP版本
string php_list = BaseDir.Replace("/", "\\") + @"bin\PHP";
//当前默认php版本
@@ -286,7 +296,8 @@ private void addPHPMenulist() {
_pversion.Index = 1;
_pversion.Click += new System.EventHandler(this.php_list_click);
- if(_pvn.Equals(php_cver)){
+ if (_pvn.Equals(php_cver))
+ {
_pversion.Checked = true;
}
@@ -297,11 +308,32 @@ private void addPHPMenulist() {
}
}
- private void php_list_click(object sender, EventArgs e){
- foreach (MenuItem i in this.menuItem_php_list.MenuItems) {
+ //重新启动
+ public void restart()
+ {
+
+ bool ret = WStop_S(MD_ApacheName);
+ if (ret)
+ {
+ _stop_apache();
+
+ after_stop_SERVICE();
+
+ Thread.Sleep(3000);
+
+ _clear_record();
+ pre_start_SERVICE();
+ _start_Apache();
+ }
+ }
+
+ private void php_list_click(object sender, EventArgs e)
+ {
+ foreach (MenuItem i in this.menuItem_php_list.MenuItems)
+ {
i.Checked = false;
}
-
+
MenuItem pitem = (MenuItem)sender;
pitem.Checked = true;
@@ -322,7 +354,7 @@ private void php_list_click(object sender, EventArgs e){
}
after_stop_SERVICE();
this.ini.WriteString("MDSERVER", "PHP_DIR", pitem.Text);
-
+
Thread.Sleep(3000);
//this.PHPCurlFixAndPath(pitem.Text);
@@ -330,18 +362,19 @@ private void php_list_click(object sender, EventArgs e){
pre_start_SERVICE();
_start_Apache();
}
- else
+ else
{
- this.after_stop_SERVICE();
+ this.after_stop_SERVICE();
}
}
- else
+ else
{
this.ini.WriteString("MDSERVER", "PHP_DIR", pitem.Text);
}
}
- private void PHPCurlFixAndPath(string s) {
+ private void PHPCurlFixAndPath(string s)
+ {
string php_list = BaseDir.Replace("/", "\\") + @"bin\PHP";
@@ -354,9 +387,12 @@ private void PHPCurlFixAndPath(string s) {
ArrayList new_list = new ArrayList();
foreach (string i in list)
{
- if(i == php_pos_s){
+ if (i == php_pos_s)
+ {
continue;
- } else if(i==php_pos_m){
+ }
+ else if (i == php_pos_m)
+ {
continue;
}
new_list.Add(i);
@@ -364,10 +400,11 @@ private void PHPCurlFixAndPath(string s) {
}
string t = "";
- foreach (string i2 in new_list) {
- t += i2 +";";
+ foreach (string i2 in new_list)
+ {
+ t += i2 + ";";
}
-
+
//设置Path
System.Environment.SetEnvironmentVariable("PATH", t + php_pos_m + ";");
@@ -415,7 +452,8 @@ private void MDserv_Load(object sender, EventArgs e)
Wstatus("欢迎使用MDsever(PHP开发环境)...");
listBox_listen_init();
- if (checkedIsHasSelfRun()) {
+ if (checkedIsHasSelfRun())
+ {
MessageBox.Show("已经在运行了!!!");
Application.Exit();
}
@@ -426,7 +464,8 @@ private void MDserv_Load(object sender, EventArgs e)
}
//检查是自己已经运行了
- private bool checkedIsHasSelfRun() {
+ private bool checkedIsHasSelfRun()
+ {
string cmdtext = "tasklist | findstr MDserver.exe";
Process Tcmd = new Process();
Tcmd.StartInfo.FileName = "cmd.exe";//设定程序名
@@ -473,7 +512,7 @@ private void menuItem_a_conf_Click(object sender, EventArgs e)
{
string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24");
string vim = BaseDir + @"tool\Vim\vim73\gvim.exe";
- string httpd_conf = BaseDir + @"bin\"+ apache_dir + @"\conf\httpd.conf";
+ string httpd_conf = BaseDir + @"bin\" + apache_dir + @"\conf\httpd.conf";
Wcmd_Exe(vim, httpd_conf);
}
@@ -482,7 +521,7 @@ private void menuItem_a_log_Click(object sender, EventArgs e)
{
string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24");
string vim = BaseDir + @"tool\Vim\vim73\gvim.exe";
- string httpd_log = BaseDir + @"bin\"+ apache_dir + @"\logs\access.log";
+ string httpd_log = BaseDir + @"bin\" + apache_dir + @"\logs\access.log";
Wcmd_Exe(vim, httpd_log);
}
@@ -491,7 +530,7 @@ private void menuItem_a_error_Click(object sender, EventArgs e)
{
string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24");
string vim = BaseDir + @"tool\Vim\vim73\gvim.exe";
- string httpd_log = BaseDir + @"bin\" + apache_dir + @"\logs\error.log";
+ string httpd_log = BaseDir + @"bin\" + apache_dir + @"\logs\error.log";
Wcmd_Exe(vim, httpd_log);
}
@@ -519,7 +558,7 @@ private void menuItem_php_conf_Click(object sender, EventArgs e)
string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION);
string vim = BaseDir + @"tool\Vim\vim73\gvim.exe";
- string php = BaseDir + @"bin\PHP\"+ php_dir + @"\php.ini";
+ string php = BaseDir + @"bin\PHP\" + php_dir + @"\php.ini";
Wcmd_Exe(vim, php);
}
@@ -528,8 +567,8 @@ private void menuItem_PHPext_Click(object sender, EventArgs e)
{
string dir_E = "explorer.exe";
string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION);
- string dir = BaseDir.Replace("/", "\\")+ @"bin\PHP\" + php_dir + @"\ext";
- Wcmd_Exe(dir_E, dir);
+ string dir = BaseDir.Replace("/", "\\") + @"bin\PHP\" + php_dir + @"\ext";
+ Wcmd_Exe(dir_E, dir);
}
//www/htdocs
@@ -553,7 +592,7 @@ private void menuItem_scan_cgi_bin_Click(object sender, EventArgs e)
//帮助信息
private void menuItem_help_Click(object sender, EventArgs e)
{
- System.Diagnostics.Process.Start("http://midoks.duapp.com/p/mdserver.html");
+ System.Diagnostics.Process.Start("http://midoks.cachecha.com/2014/09/30/mdserver.html");
}
@@ -585,6 +624,14 @@ private void menuItem_alipay_Click(object sender, EventArgs e)
*/
//修改host
private void button_mod_host_Click(object sender, EventArgs e)
+ {
+
+ WebSite ws = new WebSite();
+ ws.mainUI = this;
+ ws.ShowDialog();
+ }
+
+ private void button_host_Click(object sender, EventArgs e)
{
string vim = BaseDir + @"tool\Vim\vim73\gvim.exe";
string path = @"C:\Windows\System32\drivers\etc\hosts";
@@ -598,9 +645,9 @@ private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
if (timer.Enabled)
{
ArrayList str = new ArrayList();
- string[] nn = {
+ string[] nn = {
"MDserver", "memcached","mongod",
- "redis","mysql","php", "httpd"
+ "redis","mysql","php", "httpd"
};
foreach (string i in nn)
{
@@ -659,10 +706,12 @@ private ArrayList listen_process_name(string name)
private void checkBox_MySQL_CheckedChanged(object sender, EventArgs e)
{
+
System.Timers.Timer timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(_mysql_status);
timer.Enabled = true;
timer.AutoReset = false;
+
}
private void _mysql_status(object sender, System.Timers.ElapsedEventArgs e)
@@ -675,9 +724,14 @@ private void _mysql_status(object sender, System.Timers.ElapsedEventArgs e)
{
if (checkBox_MySQL.Checked)
{
+ pre_start_mysql();
_start_mysql();
- } else {
+ }
+ else
+ {
+ Wstatus("MySQL: 停止中...");
_stop_mysql();
+ after_stop_msyql();
}
}
catch (Exception ex)
@@ -761,7 +815,8 @@ private void _MongoDB_status(object sender, System.Timers.ElapsedEventArgs e)
else
{
bool ret = WStop_S(MD_MongoDB);
- if(ret){
+ if (ret)
+ {
Wcmd_Exe(mdir_Exe, @" --logpath " + mdir + @"log\log.txt --dbpath " + mdir + @"data --serviceName " + MD_MongoDB + " --remove");
}
}
@@ -801,7 +856,8 @@ private void _Redis_status(object sender, System.Timers.ElapsedEventArgs e)
else
{
bool ret = WStop_S(MD_Redis);
- if(ret){
+ if (ret)
+ {
Wcmd_Exe(mdir_Exe, " --service-uninstall " + mdir + @"redis.conf --service-name " + MD_Redis);
}
}
@@ -842,14 +898,88 @@ private void button_listen_Click(object sender, EventArgs e)
//启动服务之前的初始化配置
private void pre_start_SERVICE()
{
+
+
string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION);
string php_dir_pos = BaseDir + "bin/PHP/" + php_dir;
string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24");
- //httpd.conf,my.ini,php.ini替换
- string[] conf = {
+ //make apache vhost conf
+ XmlNode hostXml = this.iniXml.rootNode();
+ string tplFile = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost\host.tpl");
+ //修改hosts
+ string hosts = @"C:\Windows\System32\drivers\etc\HOSTS";
+
+ if (System.IO.File.Exists(tplFile))
+ {
+ string hostsContent = _ReadContent(hosts);
+ hostsContent = hostsContent.Trim();
+
+ string vhostDir = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost\");
+ if (hostXml.HasChildNodes)
+ {
+ ArrayList portList = new ArrayList();
+
+ foreach (XmlNode host in hostXml)
+ {
+ string hostname = host.Attributes["name"].Value;
+
+ string port = host.Attributes["port"].Value;
+ string root_dir = host.Attributes["root_dir"].Value;
+
+ string c = _ReadContent(tplFile);
+
+ c = c.Replace("{HOSTNAME}", hostname.Trim());
+ c = c.Replace("{ROOTDIR}", root_dir.Trim());
+ c = c.Replace("{PORT}", port.Trim());
+
+ if (System.IO.File.Exists(vhostDir + "own_" + hostname.Trim().Replace(".", "_") + ".conf"))
+ {
+ continue;
+ }
+
+ //写入vhost
+ _WriteContent(vhostDir + "tmp_" + hostname.Trim().Replace(".", "_") + ".conf", c);
+
+ //host组装
+ hostsContent += "\r\n127.0.0.1\t\t" + hostname + "\t" + HOSTS_NOTES;
+
+ //log(port);
+ //监听端口组装
+ if (port.Equals("80") || port.Equals("8080"))
+ {
+
+ }
+ else
+ {
+ if (portList.IndexOf(port) == -1)
+ {
+ portList.Add(port);
+ }
+ }
+ }
+
+ string portContent = "";
+ foreach (string portv in portList)
+ {
+ portContent += "Listen " + portv + "\r\n";
+ }
+
+ _WriteContent(vhostDir + "tmp_listen.conf", portContent);
+ }
+ else
+ {
+ _WriteContent(vhostDir + "tmp_listen.conf", "");
+ }
+
+ _WriteContent(hosts, hostsContent);
+ //log(hostsContent);
+ }
+
+
+ //httpd.conf,php.ini替换
+ string[] conf = {
@"bin/"+ apache_dir + @"/conf/httpd.conf",
- @"bin/MySQL/my.ini",
@"bin/PHP/"+ php_dir + @"/php.ini"};
//apache2_4.dll 找到
@@ -875,7 +1005,7 @@ private void pre_start_SERVICE()
}
//conf替换
- string[] conf_v_list = {
+ string[] conf_v_list = {
BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost",
BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\alias"
};
@@ -894,26 +1024,75 @@ private void pre_start_SERVICE()
}
}
+ private void pre_start_mysql()
+ {
+ string[] conf = { @"bin/MySQL/my.ini" };
+ foreach (string i in conf)
+ {
+ string r = _ReadContent(BaseDir + i);
+ r = r.Replace("MD:/", BaseDir);
+ _WriteContent(BaseDir + i, r, System.Text.Encoding.ASCII);
+ }
+ }
+
+ private void after_stop_msyql()
+ {
+ string[] conf = { @"bin/MySQL/my.ini" };
+
+ foreach (string i in conf)
+ {
+ string r = _ReadContent(BaseDir + i);
+ r = r.Replace(BaseDir, "MD:/");
+ _WriteContent(BaseDir + i, r, System.Text.Encoding.ASCII);
+ }
+ }
+
//停止后配置恢复原状
private void after_stop_SERVICE()
{
-
+
string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION);
string php_dir_pos = BaseDir + "bin/PHP/" + php_dir;
string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24");
+
+ //删除自动生成的配置(apache vhost conf )
+ string vhostDir = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost\");
+ var tmpVhost = Directory.GetFiles(vhostDir, "tmp_*.conf");
+ foreach (var tV in tmpVhost)
+ {
+ System.IO.File.Delete(tV);
+ }
+
+ //删除APACHE的日志
+ string apacheLogPath = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\logs\");
+ var apacheLogPathFiles = Directory.GetFiles(apacheLogPath, "tmp_*.log");
+ foreach (var logFile in apacheLogPathFiles)
+ {
+ System.IO.File.Delete(logFile);
+ }
+
+ //删除HOSTS
+ string hosts = @"C:\Windows\System32\drivers\etc\HOSTS";
+ string hostsContent = _ReadContent(hosts);
+
+ Regex reg = new Regex("(.*)" + HOSTS_NOTES);
+ hostsContent = reg.Replace(hostsContent, "");
+ hostsContent = hostsContent.Trim();
+ _WriteContent(hosts, hostsContent);
+ //log(hostsContent);
+
+
//apache2_4.dll 找到
string[] php_apache_dll_list = Directory.GetFiles(php_dir_pos, "*apache2_4.dll");
string php_apache_dll = System.IO.Path.GetFileName(php_apache_dll_list[0]);
-
- //httpd.conf,my.ini,php.ini替换
- string[] conf = {
+
+ //httpd.conf,php.ini替换
+ string[] conf = {
@"bin/" + apache_dir + "/conf/httpd.conf",
- @"bin/MySQL/my.ini",
@"bin/PHP/"+ php_dir +@"/php.ini"};
-
foreach (string i in conf)
{
string r = _ReadContent(BaseDir + i);
@@ -928,7 +1107,7 @@ private void after_stop_SERVICE()
}
//conf替换
- string[] conf_v_list = {
+ string[] conf_v_list = {
BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost",
BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\alias"
};
@@ -952,7 +1131,7 @@ private void _clear_record()
{
string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24");
- string[] file = {
+ string[] file = {
BaseDir + @"bin\"+ apache_dir + @"\logs\access.log",
BaseDir + @"bin\" + apache_dir + @"\logs\error.log",
};
@@ -961,12 +1140,7 @@ private void _clear_record()
{
_clear_file_log(f);
}
- //__Delete(BaseDir + @"bin\Nginx\myapp.err.log");
- //__Delete(BaseDir + @"bin\Nginx\myapp.err.log.old");
- //__Delete(BaseDir + @"bin\Nginx\myapp.out.log");
- //__Delete(BaseDir + @"bin\Nginx\myapp.out.log.old");
- //__Delete(BaseDir + @"bin\Nginx\myapp.wrapper.log");
- //__Delete(BaseDir + @"bin\Nginx\myapp.xml");
+
}
//清楚文件
@@ -1014,8 +1188,9 @@ private void _start_Apache()
string arg = "-k install -n " + MD_ApacheName;
log(apache + " " + arg);
Wcmd(apache + " " + arg);
+
Thread.Sleep(3000);
-
+
//延迟执行
System.Timers.Timer timer = new System.Timers.Timer(1500);
timer.Elapsed += new System.Timers.ElapsedEventHandler(_start_Apache_lazy);
@@ -1026,6 +1201,8 @@ private void _start_Apache()
private void _start_Apache_lazy(object sender, System.Timers.ElapsedEventArgs e)
{
WStart_S(MD_ApacheName);
+ //不可以点击启动按钮
+ button_start.Enabled = false;
}
//MySQL
@@ -1058,18 +1235,17 @@ private void button_stop_Click(object sender, EventArgs e)
_stop_apache();
after_stop_SERVICE();
- this.button_start.Enabled = true;
this.ini.WriteInteger("MDSERVER", "MD_RUN", 0);
this.ini.WriteString("MDSERVER", "RUN_DIR", "");
}
-
+
//停止卸载Apache
private void _stop_apache()
{
if (WServiceIsExisted(MD_ApacheName))
- {
+ {
//延迟执行
System.Timers.Timer timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(_stop_apache_lazy);
@@ -1079,6 +1255,8 @@ private void _stop_apache()
else
{
Wstatus(MD_ApacheName + "已经停止!");
+ //可以点击启动按钮
+ button_start.Enabled = true;
}
}
@@ -1093,6 +1271,8 @@ private void _stop_apache_lazy(object sender, System.Timers.ElapsedEventArgs e)
string arg = "-k uninstall -n " + MD_ApacheName;
Wcmd(apache + " " + arg);
}
+ //可以点击启动按钮
+ button_start.Enabled = true;
}
//停止mysql
@@ -1103,7 +1283,7 @@ private void _stop_mysql()
{
//string installName = dir + @"bin\mysqld " + "remove " + MD_MySQL;
//Wcmd(installName);
-
+
//延迟执行
System.Timers.Timer timer = new System.Timers.Timer(500);
timer.Elapsed += new System.Timers.ElapsedEventHandler(_stop_mysql_lazy);
@@ -1119,8 +1299,12 @@ private void _stop_mysql_lazy(object sender, System.Timers.ElapsedEventArgs e)
{
WUninstall(MD_MySQL);
}
+ else
+ {
+ Wstatus("MySQL: 停止失败!");
+ }
}
-
+
/**
* 小工具配置
@@ -1140,14 +1324,21 @@ private void button_author_Click(object sender, EventArgs e)
//打开数据管理地址
private void button_MySQL_Click(object sender, EventArgs e)
{
- if (WQueryServiceIsStart(MD_ApacheName))
+ if (checkHttp())
{
System.Diagnostics.Process.Start("http://127.0.0.1/phpMyAdmin");
}
- else
+ }
+
+ public Boolean checkHttp()
+ {
+ bool isRun = !button_start.Enabled;
+ if (!isRun)
{
- MessageBox.Show("尚未开启服务!!!");
+ MessageBox.Show("HTTP服务没有启动!!!");
+ return false;
}
+ return true;
}
///
@@ -1157,7 +1348,11 @@ private void button_MySQL_Click(object sender, EventArgs e)
///
private void button_memcached_admin_Click(object sender, EventArgs e)
{
- System.Diagnostics.Process.Start("http://127.0.0.1/memadmin");
+ if (checkHttp())
+ {
+ System.Diagnostics.Process.Start("http://127.0.0.1/memadmin");
+ }
+
}
///
@@ -1167,7 +1362,11 @@ private void button_memcached_admin_Click(object sender, EventArgs e)
///
private void button_redis_admin_Click(object sender, EventArgs e)
{
- System.Diagnostics.Process.Start("http://127.0.0.1/phpRedisAdmin");
+ if (checkHttp())
+ {
+ System.Diagnostics.Process.Start("http://127.0.0.1/phpRedisAdmin");
+ }
+
}
///
@@ -1177,7 +1376,10 @@ private void button_redis_admin_Click(object sender, EventArgs e)
///
private void button_mongo_admin_Click(object sender, EventArgs e)
{
- System.Diagnostics.Process.Start("http://127.0.0.1/phpMongodb");
+ if (checkHttp())
+ {
+ System.Diagnostics.Process.Start("http://127.0.0.1/phpMongodb");
+ }
}
@@ -1257,7 +1459,7 @@ private void button_VIM_Click(object sender, EventArgs e)
private void button_WinCacheGrind_Click(object sender, EventArgs e)
{
//MessageBox.Show(BaseDir.Replace("/", "\\") + @"tool\WinCacheGrind\WinCacheGrind.exe");
- System.Diagnostics.Process.Start(BaseDir.Replace("/","\\") + @"tool\kcachegrind\kcachegrind.exe");
+ System.Diagnostics.Process.Start(BaseDir.Replace("/", "\\") + @"tool\kcachegrind\kcachegrind.exe");
//string dir_E = "explorer.exe";
//string dir = BaseDir + @"tool/kcachegrind/kcachegrind";
//Wcmd_Exe(dir_E, dir.Replace("/", "\\"));
@@ -1288,7 +1490,7 @@ private bool runWhenStartExist(string exeName)
{
bool ok = false;
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);//打开注册表子项
-
+
if (key == null) { }
else if (exeName != "")
{
@@ -1615,7 +1817,9 @@ private bool WStart_S(string serviceName)
{
Wstatus(serviceName + "启动成功!!!");
return true;
- } if (i == 19) {
+ }
+ if (i == 19)
+ {
Wstatus(serviceName + "启动失败!!!");
}
service.Refresh();
@@ -1651,7 +1855,9 @@ private bool WStop_S(string serviceName)
{
Wstatus(serviceName + "停止成功!!!");
return true;
- } if (i == 19) {
+ }
+ if (i == 19)
+ {
Wstatus(serviceName + "停止失败!!!");
}
service.Refresh();
@@ -1713,10 +1919,24 @@ private void WsetDesc(string serviceName, string DescInfo)
}
//写入内容
- private bool _WriteContent(string path, string content)
+ public bool _WriteContent(string path, string content)
+ {
+ bool ok = false;
+ System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, System.Text.Encoding.UTF8); //System.Text.Encoding.UTF8
+ try
+ {
+ sw.Write(content);
+ ok = true;
+ sw.Close();
+ }
+ catch { }
+ return ok;
+ }
+
+ public bool _WriteContent(string path, string content, Encoding code)
{
bool ok = false;
- System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, System.Text.Encoding.Default);
+ System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, code);
try
{
sw.Write(content);
@@ -1727,6 +1947,8 @@ private bool _WriteContent(string path, string content)
return ok;
}
+
+
//读取内容
private string _ReadContent(string path)
{
@@ -1792,13 +2014,13 @@ private void button_FSCapture_Click(object sender, EventArgs e)
}
private void menuItem_apache_Click(object sender, EventArgs e)
- {}
+ { }
private void groupBox_tool_Enter(object sender, EventArgs e)
{
}
-
+
}
}
\ No newline at end of file
diff --git a/MDserver/MDserver.csproj b/MDserver/MDserver.csproj
index 77b71e9..349f823 100644
--- a/MDserver/MDserver.csproj
+++ b/MDserver/MDserver.csproj
@@ -1,4 +1,4 @@
-
+
Debug
@@ -66,6 +66,13 @@
+
+
+ Form
+
+
+ WebSite.cs
+
Designer
AboutForm.cs
@@ -84,6 +91,9 @@
Resources.resx
True
+
+ WebSite.cs
+
SettingsSingleFileGenerator
Settings.Designer.cs
@@ -109,6 +119,12 @@
+
+
+
+
+
+
+
@@ -68,9 +69,10 @@
-
+
+
@@ -85,9 +87,10 @@
-
+
+
@@ -114,4 +117,11 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\Resources\docs.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\goto.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/MDserver/Resources/docs.png b/MDserver/Resources/docs.png
new file mode 100644
index 0000000..4f946b6
Binary files /dev/null and b/MDserver/Resources/docs.png differ
diff --git a/MDserver/Resources/goto.png b/MDserver/Resources/goto.png
new file mode 100644
index 0000000..d85f663
Binary files /dev/null and b/MDserver/Resources/goto.png differ
diff --git a/MDserver/Resources/host_info.png b/MDserver/Resources/host_info.png
new file mode 100644
index 0000000..31659ac
Binary files /dev/null and b/MDserver/Resources/host_info.png differ
diff --git a/MDserver/SystemINI.cs b/MDserver/SystemINI.cs
index 360bbfd..cbb1cc3 100644
--- a/MDserver/SystemINI.cs
+++ b/MDserver/SystemINI.cs
@@ -35,8 +35,8 @@ public SystemINI(string AFileName)
sw.Write("#MDserverļ,벻\r\n");
sw.Write("[MDSERVER]\r\n");
sw.Write("#PHP汾,PHP汾,ƵbinĿдļ\r\n");
- sw.Write("#PHP5.4\r\n");
- sw.Write("PHP_DIR=php5.5\r\n");
+ sw.Write("#php55\r\n");
+ sw.Write("PHP_DIR=php55\r\n");
sw.Write("#apacheĿ¼ַ\r\n");
sw.Write("APACHE_DIR=Apache24\r\n");
sw.Close();
diff --git a/MDserver/SystemXml.cs b/MDserver/SystemXml.cs
new file mode 100644
index 0000000..e501470
--- /dev/null
+++ b/MDserver/SystemXml.cs
@@ -0,0 +1,114 @@
+using System;
+using System.IO;
+using System.Xml;
+
+namespace MDserver
+{
+ class SystemXml
+ {
+ public string filename;
+
+ public SystemXml(string AFileName)
+ {
+ filename = AFileName;
+
+ if (!File.Exists(AFileName))
+ {
+ var xmldoc = new XmlDocument();
+ var xmldecl = xmldoc.CreateXmlDeclaration("1.0", "gb2312", null);
+ xmldoc.AppendChild(xmldecl);
+
+ var xmlelem = xmldoc.CreateElement("", "root", "");
+ xmldoc.AppendChild(xmlelem);
+
+ xmldoc.Save(AFileName);
+ }
+ }
+
+ public XmlNode rootNode()
+ {
+ XmlDocument xmldoc = new XmlDocument();
+ xmldoc.Load(filename);
+ XmlNode root = xmldoc.SelectSingleNode("root");
+ return root;
+ }
+
+ public XmlNode selectedNode(int index)
+ {
+ XmlDocument xmldoc = new XmlDocument();
+ xmldoc.Load(filename);
+
+ XmlNode root = xmldoc.SelectSingleNode("root");
+ XmlNode ch = root.ChildNodes.Item(index);
+
+ xmldoc.Save(filename);
+ return ch;
+ }
+
+
+ public Boolean updateNode(int index, string key, string value)
+ {
+ XmlDocument xmldoc = new XmlDocument();
+ xmldoc.Load(filename);
+
+ XmlNode root = xmldoc.SelectSingleNode("root");
+ XmlElement ch = (XmlElement)root.ChildNodes.Item(index);
+
+ ch.SetAttribute(key,value);
+
+ xmldoc.Save(filename);
+ return true;
+ }
+
+
+ public Boolean addNode(string nodeName, string childKey, string childValue) {
+ XmlDocument xmldoc = new XmlDocument();
+ xmldoc.Load(filename);
+
+ XmlElement n = xmldoc.CreateElement("pn");
+ n.SetAttribute("name", nodeName);
+ n.SetAttribute(childKey, childValue);
+
+ XmlNode root = xmldoc.SelectSingleNode("root");
+ root.AppendChild(n);
+
+ xmldoc.Save(filename);
+ return true;
+ }
+
+ public Boolean removeNode(string nodeName) {
+ XmlDocument xmldoc = new XmlDocument();
+ xmldoc.Load(filename);
+
+
+ XmlNode root = xmldoc.SelectSingleNode("root");
+
+ XmlNode selectedNdoe = root.SelectSingleNode(nodeName); ;
+ root.ParentNode.RemoveChild(selectedNdoe);
+
+ xmldoc.Save(filename);
+ return true;
+ }
+
+ public Boolean removeNode(int index) {
+ if (index < 0) {
+ return false;
+ }
+
+ XmlDocument xmldoc = new XmlDocument();
+ xmldoc.Load(filename);
+
+
+ XmlNode root = xmldoc.SelectSingleNode("root");
+
+ XmlNode selectedNdoe = root.ChildNodes.Item(index);
+ root.RemoveChild(selectedNdoe);
+
+ xmldoc.Save(filename);
+
+ return true;
+ }
+
+
+ }
+}
diff --git a/MDserver/WebSite.Designer.cs b/MDserver/WebSite.Designer.cs
new file mode 100644
index 0000000..2491bf6
--- /dev/null
+++ b/MDserver/WebSite.Designer.cs
@@ -0,0 +1,308 @@
+namespace MDserver
+{
+ partial class WebSite
+ {
+ ///
+ /// 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()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WebSite));
+ this.domainList = new System.Windows.Forms.DataGridView();
+ this.hostname = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.port = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.groupList = new System.Windows.Forms.GroupBox();
+ this.buttonDel = new System.Windows.Forms.Button();
+ this.buttonAdd = new System.Windows.Forms.Button();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.button_RestartServer = new System.Windows.Forms.Button();
+ this.textBox_rootDir = new System.Windows.Forms.TextBox();
+ this.buttonSelectDir = new System.Windows.Forms.Button();
+ this.buttonRootGo = new System.Windows.Forms.Button();
+ this.label3 = new System.Windows.Forms.Label();
+ this.buttonInfo = new System.Windows.Forms.Button();
+ this.buttonGo = new System.Windows.Forms.Button();
+ this.textBox_Port = new System.Windows.Forms.TextBox();
+ this.textBox_hostname = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.domainList)).BeginInit();
+ this.groupList.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // domainList
+ //
+ this.domainList.AllowUserToAddRows = false;
+ this.domainList.AllowUserToDeleteRows = false;
+ this.domainList.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.domainList.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.domainList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.domainList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.hostname,
+ this.port});
+ this.domainList.GridColor = System.Drawing.SystemColors.ButtonFace;
+ this.domainList.Location = new System.Drawing.Point(15, 20);
+ this.domainList.Name = "domainList";
+ this.domainList.ReadOnly = true;
+ this.domainList.RowTemplate.Height = 23;
+ this.domainList.Size = new System.Drawing.Size(286, 197);
+ this.domainList.TabIndex = 0;
+ this.domainList.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.domainList_CellContentClick);
+ //
+ // hostname
+ //
+ this.hostname.HeaderText = "hostname";
+ this.hostname.Name = "hostname";
+ this.hostname.ReadOnly = true;
+ this.hostname.Resizable = System.Windows.Forms.DataGridViewTriState.False;
+ //
+ // port
+ //
+ this.port.HeaderText = "port";
+ this.port.MaxInputLength = 10;
+ this.port.Name = "port";
+ this.port.ReadOnly = true;
+ this.port.Resizable = System.Windows.Forms.DataGridViewTriState.False;
+ this.port.Width = 80;
+ //
+ // groupList
+ //
+ this.groupList.Controls.Add(this.buttonDel);
+ this.groupList.Controls.Add(this.buttonAdd);
+ this.groupList.Controls.Add(this.domainList);
+ this.groupList.Location = new System.Drawing.Point(12, 12);
+ this.groupList.Name = "groupList";
+ this.groupList.Size = new System.Drawing.Size(307, 257);
+ this.groupList.TabIndex = 1;
+ this.groupList.TabStop = false;
+ this.groupList.Text = "List";
+ //
+ // buttonDel
+ //
+ this.buttonDel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.buttonDel.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.buttonDel.Location = new System.Drawing.Point(47, 223);
+ this.buttonDel.Name = "buttonDel";
+ this.buttonDel.Size = new System.Drawing.Size(28, 28);
+ this.buttonDel.TabIndex = 11;
+ this.buttonDel.Text = " -";
+ this.buttonDel.UseVisualStyleBackColor = true;
+ this.buttonDel.Click += new System.EventHandler(this.buttonDel_Click);
+ //
+ // buttonAdd
+ //
+ this.buttonAdd.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.buttonAdd.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.buttonAdd.Location = new System.Drawing.Point(15, 223);
+ this.buttonAdd.Name = "buttonAdd";
+ this.buttonAdd.Size = new System.Drawing.Size(28, 28);
+ this.buttonAdd.TabIndex = 10;
+ this.buttonAdd.Text = " +";
+ this.buttonAdd.UseVisualStyleBackColor = true;
+ this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click);
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.button_RestartServer);
+ this.groupBox1.Controls.Add(this.textBox_rootDir);
+ this.groupBox1.Controls.Add(this.buttonSelectDir);
+ this.groupBox1.Controls.Add(this.buttonRootGo);
+ this.groupBox1.Controls.Add(this.label3);
+ this.groupBox1.Controls.Add(this.buttonInfo);
+ this.groupBox1.Controls.Add(this.buttonGo);
+ this.groupBox1.Controls.Add(this.textBox_Port);
+ this.groupBox1.Controls.Add(this.textBox_hostname);
+ this.groupBox1.Controls.Add(this.label2);
+ this.groupBox1.Controls.Add(this.label1);
+ this.groupBox1.Location = new System.Drawing.Point(325, 12);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(259, 257);
+ this.groupBox1.TabIndex = 2;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Setting";
+ //
+ // button_RestartServer
+ //
+ this.button_RestartServer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.button_RestartServer.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.button_RestartServer.Location = new System.Drawing.Point(15, 223);
+ this.button_RestartServer.Name = "button_RestartServer";
+ this.button_RestartServer.Size = new System.Drawing.Size(106, 23);
+ this.button_RestartServer.TabIndex = 10;
+ this.button_RestartServer.Text = "Restart Server";
+ this.button_RestartServer.UseVisualStyleBackColor = true;
+ this.button_RestartServer.Click += new System.EventHandler(this.button_RestartServer_Click);
+ //
+ // textBox_rootDir
+ //
+ this.textBox_rootDir.Location = new System.Drawing.Point(14, 143);
+ this.textBox_rootDir.Name = "textBox_rootDir";
+ this.textBox_rootDir.ReadOnly = true;
+ this.textBox_rootDir.Size = new System.Drawing.Size(224, 21);
+ this.textBox_rootDir.TabIndex = 9;
+ //
+ // buttonSelectDir
+ //
+ this.buttonSelectDir.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.buttonSelectDir.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.buttonSelectDir.Location = new System.Drawing.Point(164, 114);
+ this.buttonSelectDir.Name = "buttonSelectDir";
+ this.buttonSelectDir.Size = new System.Drawing.Size(74, 23);
+ this.buttonSelectDir.TabIndex = 8;
+ this.buttonSelectDir.Text = "SelectDir";
+ this.buttonSelectDir.UseVisualStyleBackColor = true;
+ this.buttonSelectDir.Click += new System.EventHandler(this.buttonSelectDir_Click);
+ //
+ // buttonRootGo
+ //
+ this.buttonRootGo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.buttonRootGo.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.buttonRootGo.Location = new System.Drawing.Point(128, 114);
+ this.buttonRootGo.Name = "buttonRootGo";
+ this.buttonRootGo.Size = new System.Drawing.Size(28, 23);
+ this.buttonRootGo.TabIndex = 7;
+ this.buttonRootGo.Text = "Go";
+ this.buttonRootGo.UseVisualStyleBackColor = true;
+ this.buttonRootGo.Click += new System.EventHandler(this.buttonRootGo_Click);
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.ForeColor = System.Drawing.Color.Black;
+ this.label3.Location = new System.Drawing.Point(12, 119);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(89, 12);
+ this.label3.TabIndex = 6;
+ this.label3.Text = "Doucment Root:";
+ //
+ // buttonInfo
+ //
+ this.buttonInfo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.buttonInfo.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.buttonInfo.Location = new System.Drawing.Point(226, 29);
+ this.buttonInfo.Name = "buttonInfo";
+ this.buttonInfo.Size = new System.Drawing.Size(28, 23);
+ this.buttonInfo.TabIndex = 5;
+ this.buttonInfo.Text = "i";
+ this.buttonInfo.UseVisualStyleBackColor = true;
+ this.buttonInfo.Click += new System.EventHandler(this.buttonInfo_Click);
+ //
+ // buttonGo
+ //
+ this.buttonGo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.buttonGo.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+ this.buttonGo.Location = new System.Drawing.Point(196, 29);
+ this.buttonGo.Name = "buttonGo";
+ this.buttonGo.Size = new System.Drawing.Size(28, 23);
+ this.buttonGo.TabIndex = 4;
+ this.buttonGo.Text = "Go";
+ this.buttonGo.UseVisualStyleBackColor = true;
+ this.buttonGo.Click += new System.EventHandler(this.buttonGo_Click);
+ //
+ // textBox_Port
+ //
+ this.textBox_Port.Location = new System.Drawing.Point(91, 56);
+ this.textBox_Port.Name = "textBox_Port";
+ this.textBox_Port.Size = new System.Drawing.Size(65, 21);
+ this.textBox_Port.TabIndex = 3;
+ this.textBox_Port.Text = "80";
+ this.textBox_Port.TextChanged += new System.EventHandler(this.textBox_Port_TextChanged);
+ //
+ // textBox_hostname
+ //
+ this.textBox_hostname.Location = new System.Drawing.Point(91, 30);
+ this.textBox_hostname.Name = "textBox_hostname";
+ this.textBox_hostname.Size = new System.Drawing.Size(100, 21);
+ this.textBox_hostname.TabIndex = 2;
+ this.textBox_hostname.Text = "localhost";
+ this.textBox_hostname.TextChanged += new System.EventHandler(this.textBox_hostname_TextChanged);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.ForeColor = System.Drawing.Color.Black;
+ this.label2.Location = new System.Drawing.Point(12, 59);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(77, 12);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "Port Number:";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.ForeColor = System.Drawing.Color.Black;
+ this.label1.Location = new System.Drawing.Point(12, 33);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(77, 12);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Server Name:";
+ //
+ // WebSite
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(606, 301);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.groupList);
+ this.ForeColor = System.Drawing.Color.Black;
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "WebSite";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Web管理";
+ this.TopMost = true;
+ this.Load += new System.EventHandler(this.WebSite_Load);
+ ((System.ComponentModel.ISupportInitialize)(this.domainList)).EndInit();
+ this.groupList.ResumeLayout(false);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DataGridView domainList;
+ private System.Windows.Forms.GroupBox groupList;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.TextBox textBox_Port;
+ private System.Windows.Forms.TextBox textBox_hostname;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button buttonGo;
+ private System.Windows.Forms.Button buttonInfo;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button buttonSelectDir;
+ private System.Windows.Forms.Button buttonRootGo;
+ private System.Windows.Forms.TextBox textBox_rootDir;
+ private System.Windows.Forms.Button buttonAdd;
+ private System.Windows.Forms.Button buttonDel;
+ private System.Windows.Forms.Button button_RestartServer;
+ private System.Windows.Forms.DataGridViewTextBoxColumn hostname;
+ private System.Windows.Forms.DataGridViewTextBoxColumn port;
+ }
+}
\ No newline at end of file
diff --git a/MDserver/WebSite.cs b/MDserver/WebSite.cs
new file mode 100644
index 0000000..c49c944
--- /dev/null
+++ b/MDserver/WebSite.cs
@@ -0,0 +1,409 @@
+using System;
+using System.IO;
+using System.Timers;
+using System.Windows.Forms;
+using System.Xml;
+using System.Threading;
+using System.Text.RegularExpressions;
+
+namespace MDserver
+{
+ public partial class WebSite : Form
+ {
+ private static string BaseDir = System.AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "/");
+
+ private SystemXml iniXml;
+ public MDserv mainUI;
+
+ //port总长度
+ private int PORTLEN = 10;
+ //域名长度
+ private int DOMAINLEN = 30;
+
+ public WebSite()
+ {
+ InitializeComponent();
+ this.iniXml = new SystemXml(BaseDir + "host.xml");
+ Control.CheckForIllegalCrossThreadCalls = false;
+ }
+
+ //设置为有一定
+ public string setLenValue(string value, int len)
+ {
+ int vlen = value.Length;
+ int padLen = len - vlen;
+ //this.mainUI.log(padLen.ToString() + ":");
+ if (padLen > 0)
+ {
+ value = value.PadRight(padLen, ' ');
+ }
+ return value;
+ }
+ public string getRealValue(string value)
+ {
+ return value.Trim();
+ }
+
+
+ private void WebSite_Load(object sender, EventArgs e)
+ {
+ InitUI();
+ }
+
+ public void InitUI()
+ {
+ domainList.SelectionMode = DataGridViewSelectionMode.CellSelect;
+
+ //禁止排序
+ for (int i = 0; i < this.domainList.Columns.Count; i++)
+ {
+ this.domainList.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
+ this.domainList.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
+ }
+
+ string hostname = setLenValue("localhost", DOMAINLEN);
+ string port = setLenValue("80", PORTLEN);
+ string root_dir = BaseDir + "www/htdocs";
+
+ DataGridViewRow Row = new DataGridViewRow();
+ int index = domainList.Rows.Add(Row);
+ domainList.Rows[index].Cells[0].Value = hostname;
+ domainList.Rows[index].Cells[1].Value = port;
+
+ textBox_hostname.Text = getRealValue(hostname);
+ textBox_Port.Text = getRealValue(port);
+ textBox_rootDir.Text = root_dir;
+
+
+
+ XmlNode r = this.iniXml.rootNode();
+ foreach (XmlNode r_one in r)
+ {
+ DataGridViewRow Rt = new DataGridViewRow();
+ int t = domainList.Rows.Add(Rt);
+ domainList.Rows[t].Cells[0].Value = setLenValue(r_one.Attributes["name"].Value, DOMAINLEN);
+ domainList.Rows[t].Cells[1].Value = setLenValue(r_one.Attributes["port"].Value, PORTLEN);
+
+ //this.mainUI.log(domainList.Rows[t].Cells[0].Value+ ":");
+ //this.mainUI.log(domainList.Rows[t].Cells[1].Value + ":");
+ }
+
+ }
+
+
+ private void domainList_CellContentClick(object sender, DataGridViewCellEventArgs e)
+ {
+ int index = domainList.CurrentRow.Index;
+
+ string hostname = domainList.Rows[index].Cells[0].Value.ToString();
+ string port = domainList.Rows[index].Cells[1].Value.ToString();
+ textBox_hostname.Text = getRealValue(hostname);
+ textBox_Port.Text = getRealValue(port);
+
+ if (index > 0)
+ {
+ XmlNode ch = this.iniXml.selectedNode(index - 1);
+
+ string v = ch.Attributes["root_dir"].Value;
+ textBox_rootDir.Text = v;
+ }
+ else
+ {
+ string root_dir = BaseDir + "www/htdocs";
+ textBox_rootDir.Text = root_dir;
+ }
+
+ }
+
+
+ private void buttonAdd_Click(object sender, EventArgs e)
+ {
+ int count = domainList.RowCount;
+
+ DataGridViewRow Row = new DataGridViewRow();
+ //domainList.RowHeadersWidth = 45;
+
+ string hostname = Guid.NewGuid().ToString().Substring(0, 8) + ".com"; ;
+ string port = "80";
+
+ hostname = setLenValue(hostname, 30);
+ port = setLenValue(port, 10);
+
+ string root_dir = BaseDir + "www/htdocs";
+
+ int index = domainList.Rows.Add(Row);
+ domainList.Rows[index].Cells[0].Value = hostname;
+ domainList.Rows[index].Cells[1].Value = port;
+
+ this.iniXml.addNode(getRealValue(hostname), "port", getRealValue(port));
+ this.iniXml.updateNode(index - 1, "root_dir", getRealValue(root_dir));
+
+
+ restart();
+
+ }
+
+ private void buttonDel_Click(object sender, EventArgs e)
+ {
+ int index = domainList.CurrentRow.Index;
+ if (index > 0)
+ {
+ domainList.Rows.RemoveAt(index);
+ this.iniXml.removeNode(index - 1);
+
+ restart();
+ }
+ else
+ {
+ MessageBox.Show("localhost不可修改");
+ }
+
+ }
+
+ private void buttonInfo_Click(object sender, EventArgs e)
+ {
+ var ok = checkFunc();
+ if (ok)
+ {
+ int index = domainList.CurrentRow.Index;
+
+ string hostname = getRealValue(domainList.Rows[index].Cells[0].Value.ToString());
+ string port = getRealValue(domainList.Rows[index].Cells[1].Value.ToString());
+
+ string root_dir = BaseDir + "www/htdocs";
+ if (index > 0)
+ {
+ XmlNode ch = this.iniXml.selectedNode(index - 1);
+ root_dir = ch.Attributes["root_dir"].Value.ToString();
+ }
+
+ string php_tmp = "tmp_" + Guid.NewGuid().ToString().Replace("-", "_") + ".php";
+ var cbool = this.mainUI._WriteContent(root_dir + "/" + php_tmp, "");
+ if (cbool)
+ {
+ System.Diagnostics.Process.Start("http://" + hostname + ":" + port + "/" + php_tmp);
+
+
+ Thread delfile = new Thread(() =>
+ {
+ Thread.Sleep(3000);
+ //删除临时文件
+ File.Delete(root_dir + "/" + php_tmp);
+ });
+ delfile.Start();
+ }
+ else
+ {
+ MessageBox.Show("创建临时文件失败!");
+ }
+ }
+ }
+
+ private void buttonGo_Click(object sender, EventArgs e)
+ {
+ var ok = checkFunc();
+ if (ok)
+ {
+ int index = domainList.CurrentRow.Index;
+ string hostname = getRealValue(domainList.Rows[index].Cells[0].Value.ToString());
+ string port = getRealValue(domainList.Rows[index].Cells[1].Value.ToString());
+
+ System.Diagnostics.Process.Start("http://" + hostname + ":" + port + "/");
+ }
+ }
+
+ private void buttonSelectDir_Click(object sender, EventArgs e)
+ {
+ int index = domainList.CurrentRow.Index;
+ if (index > 0)
+ {
+ FolderBrowserDialog dir = new FolderBrowserDialog();
+ dir.RootFolder = Environment.SpecialFolder.Desktop;
+ if (dir.ShowDialog() == DialogResult.OK)
+ {
+ if (index > 0)
+ {
+ this.iniXml.updateNode(index - 1, "root_dir", dir.SelectedPath);
+ textBox_rootDir.Text = dir.SelectedPath;
+ }
+ }
+
+ restart();
+ }
+ else
+ {
+ MessageBox.Show("localhost不可修改");
+ }
+ }
+
+ private void buttonRootGo_Click(object sender, EventArgs e)
+ {
+ string dir = textBox_rootDir.Text;
+ //dir = getDirPath(dir);
+ if (Directory.Exists(dir))
+ {
+ System.Diagnostics.Process.Start(dir);
+ }
+ else
+ {
+ MessageBox.Show(dir + "目录不存在!");
+ }
+
+ }
+
+ private void textBox_hostname_TextChanged(object sender, EventArgs e)
+ {
+ int index = domainList.CurrentRow.Index;
+ string conf_hostname;
+ string hostname = textBox_hostname.Text.Trim();
+
+ if (index > 0)
+ {
+ bool isRepeat = false;
+
+ //检查是否为空
+ if (hostname.Equals(""))
+ {
+ MessageBox.Show("端口不能为空!!");
+ textBox_hostname.Text = Guid.NewGuid().ToString().Substring(0, 8) + ".com";
+ return;
+ }
+
+ //检查是否重复
+ XmlNode hostXml = this.iniXml.rootNode();
+ int hostIndex = 1;
+ foreach (XmlNode host in hostXml)
+ {
+ conf_hostname = host.Attributes["name"].Value;
+
+ if (hostname.Equals(conf_hostname) && index != hostIndex)
+ {
+ isRepeat = true;
+ break;
+ }
+ hostIndex++;
+ }
+
+ if (isRepeat)
+ {
+ MessageBox.Show("域名不要重复!!");
+ textBox_hostname.Text = Guid.NewGuid().ToString().Substring(0, 8) + ".com";
+ return;
+ }
+
+ domainList.Rows[index].Cells[0].Value = setLenValue(textBox_hostname.Text.Trim(), DOMAINLEN);
+ this.iniXml.updateNode(index - 1, "name", textBox_hostname.Text.Trim());
+
+ }
+ else
+ {
+ if (textBox_hostname.Text == "localhost")
+ {
+ }
+ else
+ {
+ MessageBox.Show("localhost不可修改!");
+ textBox_hostname.Text = "localhost";
+ }
+ return;
+ }
+ }
+
+ public bool IsInt(string value)
+ {
+ return Regex.IsMatch(value, @"^[+-]?\d*$");
+ }
+
+ private void textBox_Port_TextChanged(object sender, EventArgs e)
+ {
+ int index = domainList.CurrentRow.Index;
+ string port = textBox_Port.Text;
+ if (index > 0)
+ {
+
+
+ if (port.Equals(""))
+ {
+ MessageBox.Show("端口不能为空!!");
+ textBox_Port.Text = "80";
+ return;
+ }
+
+ if (!IsInt(port)) {
+ MessageBox.Show("请输入数字!!");
+ textBox_Port.Text = "80";
+ domainList.Rows[index].Cells[1].Value = setLenValue("80", PORTLEN);
+ return;
+ }
+
+ int portInt = Convert.ToInt32(port);
+ //this.mainUI.log(portInt.ToString());
+ if (portInt > 0 && portInt < 65536)
+ {
+ textBox_Port.Text = portInt.ToString();
+ port = textBox_Port.Text;
+ domainList.Rows[index].Cells[1].Value = setLenValue(port, PORTLEN);
+ this.iniXml.updateNode(index - 1, "port", textBox_Port.Text);
+ }
+ else
+ {
+ MessageBox.Show("端口范围在0~65536之内");
+ textBox_Port.Text = "80";
+ return;
+ }
+
+ }
+ else
+ {
+ if (port != "80")
+ {
+ MessageBox.Show("localhost端口不可修改!");
+ textBox_Port.Text = "80";
+ return;
+ }
+ }
+ }
+
+
+ //私有方法
+ public Boolean checkFunc()
+ {
+ bool isRun = !this.mainUI.button_start.Enabled;
+ int index = domainList.CurrentRow.Index;
+
+ if (!isRun)
+ {
+ MessageBox.Show("HTTP服务没有启动!!!");
+ return false;
+ }
+ //else if (index == 0) {
+ // MessageBox.Show("localhost不可修改");
+ // return false;
+ //}
+
+ return true;
+ }
+
+ public void restart()
+ {
+ var isRun = !this.mainUI.button_start.Enabled;
+ if (isRun)
+ {
+ DialogResult qa = MessageBox.Show("要想立即生效需要重新启动,是否重新启动!!!", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
+ if (qa == DialogResult.Yes)
+ {
+ Thread re = new Thread(() =>
+ {
+ this.mainUI.restart();
+ });
+ re.Start();
+ }
+ }
+ }
+
+ private void button_RestartServer_Click(object sender, EventArgs e)
+ {
+ restart();
+ }
+ }
+}
diff --git a/MDserver/WebSite.resx b/MDserver/WebSite.resx
new file mode 100644
index 0000000..c4d5afc
--- /dev/null
+++ b/MDserver/WebSite.resx
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ True
+
+
+
+
+ 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
+ CwA8DgA5DAE6DAE2DAAzCwAuBgEbAAAAAAAAAAA2HBYmAgA1BQE7BwE6CQA6CgA8DQBFDgE5DgBOEAU5
+ HRL//PtVUluQkZtIY2A+PTlhSEZuQkGBVVv/+////v3//PV8VE90RT1yRjl0Rjt5SD59TD6ATEX//Pb3
+ //36/////v///P85XF8xHyZZDgxDDABFCwA6DQA9DAI6DAE4CwA2CwIuCQUAAAAAAAAAAAAAAAArDQg6
+ BwQ5AwA7CwA9DQFCDgFDCwBDFAZICABdLyewjYr/7fVpYGp5fIGdmJmWg4CEbWv//Pvv/////vrYxb6M
+ XVmNWVJ/V0t/Vk2BVk2JWEqJUkuWgHr5/fj4/P39+vz//f9UWVplaG1NBw1OCgA/CgA6DQA+CgM7DAQ4
+ CQE1BwAmCAMAAAAAAAAAAAAAAAAAAAA0BAA2AgA8DQA/DgBEDQBIBQBLDgSVX1Sndm6Qc261lpn/9/v/
+ /f/3+Pb///z+/vj9//zv5eWVhIGRdHCbbGikdG6bdGuZdGyZc26dcGWfb2mKamXSw8D///79/P7//v+r
+ mZqKpq15UFVSCgA+CQA9DABBCwQ8CwM4CQE5BgMwGxYAAAAAAAAAAAAAAAAAAAA0BgBBDwM8DQBBDQBH
+ CwBVEwhGBQC0kIi5joueiIKpiYSmjojItbDm29fq5eLo39y0n524iIesioqqh4S1ioexh4KviYSuiYWu
+ iIazi4ashoGuiIaggYD/+vf////7/f3u2Np1mKKdjZRJCwBODQVDCwBDCwY8CgQ6CAI6CAIAAAAAAAAA
+ AAAAAAAAAAAAAAAaAQA0BQE9CgBACgBKCQBCCgCQZVy+pJ69opjCope9oZq5oZu9oJu9oJu9oJu9oJu9
+ oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu5oZu9oJu+oJu+pJ66qKH///j///j/9PyipKWYuLc/Ih5U
+ DwVTDgRDDwBFCwBACwggBgEAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Dww8AQBHDAJGDwJHCgDTqaLItbDJ
+ tKzQs6rLs63Hs67Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63HtK3Ns63Ns63J
+ savCsKn/+/L///f//f7h1dWksbNpZ2Y8BwBEDAE+BwBDDQI8Eg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABODglEBwA+DQBLBwDdt7LNwr7VxMHcw7/XxMHTxMLXxL/XxL/XxL/XxL/XxL/XxL/XxL/XxL/X
+ xL/XxL/XxL/XxL/XxL/Txb/YxL/axL/VwbzRvrnOxL3d1c799e7//fvt4+mRoaAvDgU8CAFKEQg9CgAu
+ FQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAABABQBEEABLBACJY17h29bl2dns19nq2Nnj2dno
+ 2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbl2tbm2tbq2dbo19To2dbj19Pg1dHm
+ 3dTr2NPd0dc8ODcxAQA/CgA+CwEsAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6CgQ7
+ AwBNCAU6EAvs4tvq3t7v4OT05urt5ebr4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r
+ 4t/p4t/r4t/u4d/u4d/u4d/t4d/t4d/x3tv27enk3N1JEhVJBgBBBwA0CgUAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkDgpGCwFLEAawgX3/6+7y6O758PP67O317e717e717e717e71
+ 7e717e717e717e717e717e717e717e717e717e7z7e7z7e7z7e7z7e7z7e7z7e705eP///R+VUxKCwND
+ BQAvCgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQBJCQAzAACx
+ kpX/+v//9vn/9fP88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b59Pb5
+ 9Pb59Pb59Pb59Pb+9fF3TD1HAgA1CgAwCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAiAwBJCABLDQNrPDT//Pn7/f739vj/+/3/9/r/9vn/+vz4/P399fb/+Pn9
+ 9fb/+fr+9vf99fb/+Pn79Pf/+Pv79vj++fv9+Pr79Pf/+PtaLBtTEAdGBwAhAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEHRZBCwRBDQY3CgdoQT//
+ +vj/+/v///7//v/9///7/v/9/v/8/f/9/v/6+//8/f/8/f/7/P/9/P79///+//3++/f//vtLLCkuBwVN
+ DwdECwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAzBgBHBgBRDAMwCgVgRD3g0Mr///7//P789/n//f///P///f///P///f///f//
+ /f///fz//Pm+qqU8IBk3EAg/CgBKDwZDEAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9Dwg/DgZEDwVHDwRB
+ CwA9DABCDQNDDgRLFgxJFApFEAZBDAI/CgBFDQJHCQFGCgQ+BwI5DQYAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAArGRAwDwZDDgRFDQJCCwBGDwJDDABGDwJDDABDDABEDQBCCwBDCgFADwUpCgEd
+ CQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCgU0DAcxCQQ1
+ DQgzCwYyCgUvBwIvBwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///AP//8AAP//gAH//wAA//wAAH//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/
+ AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAA
+ AAAABwAA4AAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAwAAwAAAAAADAADgAAAAAAMAAOAAAAAABwAA4AAAAAAH
+ AADwAAAAAA8AAPgAAAAADwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/A
+ AAAH/wAA//AAAA//AAD//gAAf/8AAP//AAD//wAA///wD///AAA=
+
+
+
\ No newline at end of file