1
0
mirror of https://github.com/proxysu/ProxySU.git synced 2024-11-22 05:06:08 +03:00
This commit is contained in:
autumn 2021-07-06 18:30:14 +08:00
parent 5bd7529bec
commit d5878079f1
10 changed files with 286 additions and 33 deletions

View File

@ -10,6 +10,7 @@ namespace ProxySuper.Core.Models.Projects
{
server,
wsserver,
wssserver
wssserver,
socks5
}
}

View File

@ -95,6 +95,7 @@
<Compile Include="Services\XrayConfigBuilder.cs" />
<Compile Include="Services\XrayProject.cs" />
<Compile Include="ViewModels\BrookEditorViewModel.cs" />
<Compile Include="ViewModels\BrookInstallerViewModel.cs" />
<Compile Include="ViewModels\HomeViewModel.cs" />
<Compile Include="ViewModels\NaiveProxyConfigViewModel.cs" />
<Compile Include="ViewModels\NaiveProxyEditorViewModel.cs" />

View File

@ -44,64 +44,53 @@ namespace ProxySuper.Core.Services
WriteOutput("域名检测完成");
}
InstallBrook();
Console.WriteLine("*************安装完成,尽情享用吧**********");
}
public void InstallBrook()
{
Console.WriteLine("安装nami");
RunCmd("source <(curl -L https://git.io/getnami)");
Console.WriteLine("安装nami完成");
Console.WriteLine("安装Brook");
RunCmd("echo y | nami install github.com/txthinking/brook");
string url = "https://github.com/txthinking/brook/releases/latest/download/brook_linux_amd64";
if (ArchType == ArchType.arm)
{
url = url.Replace("brook_linux_amd64", "brook_linux_arm7");
}
RunCmd($"curl -L {url} -o /usr/bin/brook");
RunCmd("chmod +x /usr/bin/brook");
Console.WriteLine("安装Brook完成");
Console.WriteLine("安装joker");
RunCmd("echo y | nami install github.com/txthinking/joker");
Console.WriteLine("安装joker完成");
Console.WriteLine("安装jinbe");
RunCmd("echo y | nami install github.com/txthinking/jinbe");
Console.WriteLine("安装jinbe完成");
var runBrookCmd = string.Empty;
if (Parameters.BrookType == BrookType.server)
{
runBrookCmd = $"joker brook server --listen :{Parameters.Port} --password {Parameters.Password}";
runBrookCmd = $"nohup /usr/bin/brook server --listen :{Parameters.Port} --password {Parameters.Password} &";
}
if (Parameters.BrookType == BrookType.wsserver)
{
runBrookCmd = $"joker brook wsserver --listen :{Parameters.Port} --password {Parameters.Password}";
runBrookCmd = $"nohup /usr/bin/brook wsserver --listen :{Parameters.Port} --password {Parameters.Password} &";
}
if (Parameters.BrookType == BrookType.wsserver)
{
runBrookCmd = $"joker brook wssserver --domain {Parameters.Domain} --password {Parameters.Password}";
runBrookCmd = $"nohup /usr/bin/brook wssserver --domain {Parameters.Domain} --password {Parameters.Password} &";
}
RunCmd("jinbe " + runBrookCmd);
Console.WriteLine("*************安装完成,尽情享用吧**********");
if (Parameters.BrookType == BrookType.socks5)
{
runBrookCmd = $"nohup /usr/bin/brook socks5 --socks5 :{Parameters.Port} &";
}
}
public void Uninstall()
{
RunCmd("jinbe remove 0");
RunCmd("killall joker");
Console.WriteLine("卸载jinbe");
RunCmd("echo y | nami remove github.com/txthinking/jinbe");
Console.WriteLine("卸载joker");
RunCmd("echo y | nami remove github.com/txthinking/joker");
Console.WriteLine("卸载brook");
RunCmd("echo y | nami remove github.com/txthinking/brook");
RunCmd("killall brook");
Console.WriteLine("关闭端口");
ClosePort(Parameters.FreePorts.ToArray());

View File

@ -15,6 +15,13 @@ namespace ProxySuper.Core.ViewModels
{
public class BrookEditorViewModel : MvxViewModel<Record, Record>
{
public BrookEditorViewModel(IMvxNavigationService navigationService)
{
NavigationService = navigationService;
}
public IMvxNavigationService NavigationService { get; }
public string Id { get; set; }
public Host Host { get; set; }
@ -29,6 +36,7 @@ namespace ProxySuper.Core.ViewModels
BrookType.server.ToString(),
BrookType.wsserver.ToString(),
BrookType.wssserver.ToString(),
BrookType.socks5.ToString(),
};
}
}
@ -53,8 +61,6 @@ namespace ProxySuper.Core.ViewModels
public IMvxCommand SaveCommand => new MvxCommand(() => Save());
public IMvxNavigationService NavigationService { get; }
public override void Prepare(Record parameter)
{
var record = Utils.DeepClone(parameter);

View File

@ -0,0 +1,44 @@
using MvvmCross.ViewModels;
using ProxySuper.Core.Models;
using ProxySuper.Core.Models.Hosts;
using ProxySuper.Core.Models.Projects;
using ProxySuper.Core.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProxySuper.Core.ViewModels
{
public class BrookInstallerViewModel : MvxViewModel<Record>
{
public Host Host { get; set; }
public BrookSettings Settings { get; set; }
public override void Prepare(Record parameter)
{
var record = Utils.DeepClone(parameter);
Host = record.Host;
Settings = record.BrookSettings;
}
private bool _connected;
public bool Connected
{
get
{
return _connected;
}
set
{
_connected = value;
RaisePropertyChanged("Connected");
}
}
public string CommandText { get; set; }
}
}

View File

@ -166,6 +166,14 @@ namespace ProxySuper.Core.ViewModels
record.Host = result.Host;
record.NaiveProxySettings = result.NaiveProxySettings;
}
if (record.Type == ProjectType.Brook)
{
result = await _navigationService.Navigate<BrookEditorViewModel, Record, Record>(record);
if (result == null) return;
record.Host = result.Host;
record.BrookSettings = result.BrookSettings;
}
SaveToJson();
}
@ -221,6 +229,10 @@ namespace ProxySuper.Core.ViewModels
{
await _navigationService.Navigate<NaiveProxyInstallerViewModel, Record>(record);
}
if (record.Type == ProjectType.Brook)
{
await _navigationService.Navigate<BrookInstallerViewModel, Record>(record);
}
}
}
}

View File

@ -114,6 +114,9 @@
<Compile Include="Views\BrookEditorView.xaml.cs">
<DependentUpon>BrookEditorView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\BrookInstallerView.xaml.cs">
<DependentUpon>BrookInstallerView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\HomeView.xaml.cs">
<DependentUpon>HomeView.xaml</DependentUpon>
</Compile>
@ -208,6 +211,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\BrookInstallerView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\HomeView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>

View File

@ -9,6 +9,8 @@
mc:Ignorable="d"
BorderThickness="0,1,0,0"
BorderBrush="#eee"
Icon="/Resources/ProxySU.ico"
WindowStartupLocation="CenterScreen"
Title="BrookEditorView" Height="600" Width="1000">
<Grid>
<Grid.ColumnDefinitions>

View File

@ -0,0 +1,34 @@
<views:MvxWindow x:Class="ProxySuper.WPF.Views.BrookInstallerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
xmlns:local="clr-namespace:ProxySuper.WPF.Views"
Icon="/Resources/ProxySU.ico"
mc:Ignorable="d"
WindowStartupLocation="CenterScreen"
Title="Brook" Height="450" Width="800">
<StackPanel>
<TextBox IsReadOnly="True"
Block.LineHeight="18"
Background="#000"
Foreground="LawnGreen"
FontSize="14"
FontFamily="Consolas"
x:Name="OutputTextBox"
Height="260"
Padding="10"
BorderThickness="0"
VerticalAlignment="Top"
VerticalContentAlignment="Top"
TextWrapping="WrapWithOverflow"
/>
<StackPanel Margin="5" Orientation="Horizontal">
<Label Content="{DynamicResource Install}" />
<Button Height="24" Padding="10,0" Margin="10,0,0,0" IsEnabled="{Binding Connected}" Click="Install" Content="{DynamicResource XrayInstallerInstall}" />
<Button Height="24" Padding="10,0" Margin="10,0,0,0" IsEnabled="{Binding Connected}" Click="Uninstall" Content="{DynamicResource XrayInstallerUninstall}" />
</StackPanel>
</StackPanel>
</views:MvxWindow>

View File

@ -0,0 +1,157 @@
using MvvmCross.Platforms.Wpf.Views;
using ProxySuper.Core.Models.Hosts;
using ProxySuper.Core.Services;
using ProxySuper.Core.ViewModels;
using Renci.SshNet;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace ProxySuper.WPF.Views
{
/// <summary>
/// BrookInstallerView.xaml 的交互逻辑
/// </summary>
public partial class BrookInstallerView : MvxWindow
{
public BrookInstallerView()
{
InitializeComponent();
}
public new BrookInstallerViewModel ViewModel
{
get
{
return (BrookInstallerViewModel)base.ViewModel;
}
}
public BrookProject Project { get; set; }
private SshClient _sshClient;
private void OpenConnect()
{
WriteOutput("正在登陆服务器 ...");
var conneInfo = CreateConnectionInfo(ViewModel.Host);
_sshClient = new SshClient(conneInfo);
try
{
_sshClient.Connect();
}
catch (Exception ex)
{
WriteOutput("登陆失败!");
WriteOutput(ex.Message);
return;
}
WriteOutput("登陆服务器成功!");
ViewModel.Connected = true;
Project = new BrookProject(_sshClient, ViewModel.Settings, WriteOutput);
}
private void WriteOutput(string outShell)
{
if (!outShell.EndsWith("\n"))
{
outShell += "\n";
}
ViewModel.CommandText += outShell;
Dispatcher.Invoke(() =>
{
OutputTextBox.AppendText(outShell);
OutputTextBox.ScrollToEnd();
});
}
private ConnectionInfo CreateConnectionInfo(Host host)
{
AuthenticationMethod auth = null;
if (host.SecretType == LoginSecretType.Password)
{
auth = new PasswordAuthenticationMethod(host.UserName, host.Password);
}
else if (host.SecretType == LoginSecretType.PrivateKey)
{
auth = new PrivateKeyAuthenticationMethod(host.UserName, new PrivateKeyFile(host.PrivateKeyPath));
}
if (host.Proxy.Type == LocalProxyType.None)
{
return new ConnectionInfo(host.Address, host.Port, host.UserName, auth);
}
else
{
return new ConnectionInfo(
host: host.Address,
port: host.Port,
username: host.UserName,
proxyType: (ProxyTypes)(int)host.Proxy.Type,
proxyHost: host.Proxy.Address,
proxyPort: host.Proxy.Port,
proxyUsername: host.Proxy.UserName,
proxyPassword: host.Proxy.Password,
authenticationMethods: auth);
}
}
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
base.Loaded += (sender, arg) =>
{
Task.Factory.StartNew(OpenConnect);
};
base.Closed += SaveInstallLog;
}
private void SaveInstallLog(object sender, EventArgs e)
{
if (!Directory.Exists("Logs"))
{
Directory.CreateDirectory("Logs");
}
var fileName = System.IO.Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".brook.txt");
File.WriteAllText(fileName, ViewModel.CommandText);
}
private void OpenLink(object sender, RoutedEventArgs e)
{
Hyperlink link = sender as Hyperlink;
Process.Start(new ProcessStartInfo(link.NavigateUri.AbsoluteUri));
}
private void Install(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(Project.Install);
}
private void Uninstall(object sender, RoutedEventArgs e)
{
var result = MessageBox.Show("您确认要卸载代理吗?", "提示", MessageBoxButton.YesNo);
if (result == MessageBoxResult.Yes)
{
Task.Factory.StartNew(Project.Uninstall);
}
}
}
}