From bca6cc2b39e01a7b87af9309bba4c2acfc245e79 Mon Sep 17 00:00:00 2001 From: ProxySU Date: Sun, 15 Mar 2020 21:05:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E6=9D=BF=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProxySU/MainWindow.xaml | 28 +++++- ProxySU/MainWindow.xaml.cs | 166 ++++++++++++++++++++++---------- ProxySU/bin/Release/ProxySU.exe | Bin 563200 -> 564736 bytes 3 files changed, 138 insertions(+), 56 deletions(-) diff --git a/ProxySU/MainWindow.xaml b/ProxySU/MainWindow.xaml index 9e501d1..10d9a36 100644 --- a/ProxySU/MainWindow.xaml +++ b/ProxySU/MainWindow.xaml @@ -30,12 +30,12 @@ - + - + @@ -60,7 +60,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProxySU/MainWindow.xaml.cs b/ProxySU/MainWindow.xaml.cs index 9da10eb..5439450 100644 --- a/ProxySU/MainWindow.xaml.cs +++ b/ProxySU/MainWindow.xaml.cs @@ -30,6 +30,8 @@ namespace ProxySU RadioButtonPasswordLogin.IsChecked = true; RadioButtonNoProxy.IsChecked = true; RadioButtonProxyNoLogin.IsChecked = true; + //GuideConfiguration.IsChecked = true; + RadioButtonTemplateConfiguration.IsChecked = true; } //System.Diagnostics.Process exitProgram = System.Diagnostics.Process.GetProcessById(System.Diagnostics.Process.GetCurrentProcess().Id); private void Button_Login_Click(object sender, RoutedEventArgs e) @@ -102,12 +104,25 @@ namespace ProxySU //ProgressBarSetUpProcessing.IsIndeterminate = true; #endregion - // try - //{ - //var connectionInfo = new PasswordConnectionInfo(sshHostName, sshPort, sshUser, sshPassword); + //var connectionInfo = new PasswordConnectionInfo(sshHostName, sshPort, sshUser, sshPassword); - var connectionInfo = new ConnectionInfo( + var connectionInfo = new ConnectionInfo( + sshHostName, + sshPort, + sshUser, + proxyTypes, + sshProxyHost, + sshProxyPort, + sshProxyUser, + sshProxyPassword, + new PasswordAuthenticationMethod(sshUser, sshPassword) + //new PrivateKeyAuthenticationMethod(sshUser, new PrivateKeyFile(sshPrivateKey)) + ); + + if (RadioButtonCertLogin.IsChecked == true) + { + connectionInfo = new ConnectionInfo( sshHostName, sshPort, sshUser, @@ -116,31 +131,17 @@ namespace ProxySU sshProxyPort, sshProxyUser, sshProxyPassword, - new PasswordAuthenticationMethod(sshUser, sshPassword) - //new PrivateKeyAuthenticationMethod(sshUser, new PrivateKeyFile(sshPrivateKey)) + //new PasswordAuthenticationMethod(sshUser, sshPassword) + new PrivateKeyAuthenticationMethod(sshUser, new PrivateKeyFile(sshPrivateKey)) ); - if (RadioButtonCertLogin.IsChecked == true) - { - connectionInfo = new ConnectionInfo( - sshHostName, - sshPort, - sshUser, - proxyTypes, - sshProxyHost, - sshProxyPort, - sshProxyUser, - sshProxyPassword, - //new PasswordAuthenticationMethod(sshUser, sshPassword) - new PrivateKeyAuthenticationMethod(sshUser, new PrivateKeyFile(sshPrivateKey)) - ); + } - } - - //using (var client = new SshClient(sshHostName, sshPort, sshUser, sshPassword)) - //Action startSetUpAction = new Action(StartSetUpRemoteHost); - Task task = new Task(() => StartSetUpRemoteHost(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing)); - task.Start(); + //using (var client = new SshClient(sshHostName, sshPort, sshUser, sshPassword)) + //Action startSetUpAction = new Action(StartSetUpRemoteHost); + string appConfig = TextBoxJsonPath.Text.ToString().Replace("\\","\\\\"); + Task task = new Task(() => StartSetUpRemoteHost(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing, appConfig)); + task.Start(); @@ -327,7 +328,7 @@ namespace ProxySU #endregion //登录远程主机布署程序 - private void StartSetUpRemoteHost(ConnectionInfo connectionInfo,TextBlock textBlockName, ProgressBar progressBar) + private void StartSetUpRemoteHost(ConnectionInfo connectionInfo,TextBlock textBlockName, ProgressBar progressBar, string appConfig) { string currentStatus = "正在登录远程主机......"; Action updateAction = new Action(UpdateTextBlock); @@ -440,39 +441,26 @@ namespace ProxySU client.RunCommand("curl -o /tmp/go.sh https://install.direct/go.sh"); client.RunCommand("bash /tmp/go.sh"); - client.RunCommand("move /etc/v2ray/config.json /etc/v2ray/config.json.1"); + client.RunCommand("mv /etc/v2ray/config.json /etc/v2ray/config.json.1"); + + //client.RunCommand("echo 1111 >> test.json"); //上传配置文件 - string v2rayConfig = ""; - try - { - using (var sftpClient = new SftpClient(connectionInfo)) - { - sftpClient.Connect(); - //MessageBox.Show("sftp信息1" + sftpClient.ConnectionInfo.ServerVersion.ToString()); - sftpClient.UploadFile(File.OpenRead(v2rayConfig), "/etc/v2ray/config.json", true); - //sftpClient.DownloadFile("/root/id_rsa.pub", File.Create("config\\server_config.json")); - MessageBox.Show("sftp信息" + sftpClient.ConnectionInfo.ServerVersion.ToString()); - sftpClient.Disconnect(); - } + //string uploadConfig = "config\\http_server.json"; + currentStatus = "程序安装完毕,配置文件上传中......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(2000); + UploadConfig(connectionInfo, appConfig); - } - catch (Exception ex2) - { - MessageBox.Show("sftp" + ex2.ToString()); - MessageBox.Show("sftp出现未知错误"); - } - - client.RunCommand("echo 1111 >> test.json"); currentStatus = "安装成功"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(2000); - MessageBox.Show("安装成功"); + //MessageBox.Show("安装成功"); //MessageBox.Show("ssh信息"+client.ConnectionInfo.ServerVersion.ToString()); //MessageBox.Show(client); client.Disconnect(); - + return; } } catch (Exception ex1)//例外处理 @@ -511,7 +499,55 @@ namespace ProxySU #endregion } - + //上传配置文件 + private void UploadConfig(ConnectionInfo connectionInfo,string uploadConfig) + { + + //v2rayConfig = "config\\http_server.json"; + try + { + using (var sftpClient = new SftpClient(connectionInfo)) + { + sftpClient.Connect(); + //MessageBox.Show("sftp信息1" + sftpClient.ConnectionInfo.ServerVersion.ToString()); + sftpClient.UploadFile(File.OpenRead(uploadConfig), "/etc/v2ray/config.json", true); + //sftpClient.DownloadFile("/root/id_rsa.pub", File.Create("config\\server_config.json")); + MessageBox.Show("sftp信息" + sftpClient.ConnectionInfo.ServerVersion.ToString()); + sftpClient.Disconnect(); + } + + } + catch (Exception ex2) + { + MessageBox.Show("sftp" + ex2.ToString()); + MessageBox.Show("sftp出现未知错误"); + } + } + //下载配置文件 + private void DownloadConfig(ConnectionInfo connectionInfo, string downloadConfig) + { + + //v2rayConfig = "config\\http_server.json"; + try + { + using (var sftpClient = new SftpClient(connectionInfo)) + { + sftpClient.Connect(); + //MessageBox.Show("sftp信息1" + sftpClient.ConnectionInfo.ServerVersion.ToString()); + //sftpClient.UploadFile(File.OpenRead(v2rayConfig), "/etc/v2ray/config.json", true); + sftpClient.DownloadFile("/etc/v2ray/config.json", File.Create(downloadConfig)); + MessageBox.Show("sftp信息" + sftpClient.ConnectionInfo.ServerVersion.ToString()); + sftpClient.Disconnect(); + } + + } + catch (Exception ex2) + { + MessageBox.Show("sftp" + ex2.ToString()); + MessageBox.Show("sftp出现未知错误"); + } + } + //更新UI显示内容 private void UpdateTextBlock(TextBlock textBlockName, ProgressBar progressBar, string currentStatus) { @@ -592,9 +628,33 @@ namespace ProxySU return false; } - - + private void ButtonSetConfiguration_Click(object sender, RoutedEventArgs e) + { + if (RadioButtonGuideConfiguration.IsChecked == true) + { + MessageBox.Show("还未完善,敬请期待!"); + } + else if (RadioButtonTemplateConfiguration.IsChecked == true) + { + var openFileDialog = new Microsoft.Win32.OpenFileDialog() + { + Filter = "Cert Files (*.json)|*.json" + }; + var result = openFileDialog.ShowDialog(); + if (result == true) + { + TextBoxJsonPath.Text = openFileDialog.FileName; + } + } + else + { + MessageBox.Show("还未完善,敬请期待!"); + } + MessageBox.Show(TextBoxJsonPath.Text.ToString()); + string appConfig = TextBoxJsonPath.Text.ToString().Replace("\\", "\\\\"); + MessageBox.Show(appConfig); + } } } diff --git a/ProxySU/bin/Release/ProxySU.exe b/ProxySU/bin/Release/ProxySU.exe index 135d6002ebb4da2c4b8ec43c76c44fdac224b0d1..99b56c98f3746eca6a8caba4251fc29b29788489 100644 GIT binary patch delta 7786 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 RaEk4f#+M%ac)I#M`#)Xj&J_Rv delta 6266 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