mirror of
https://github.com/proxysu/ProxySU.git
synced 2024-11-24 14:16:08 +03:00
add hysteria editor
This commit is contained in:
parent
07c8d9bb2b
commit
f371277362
@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public class HysteriaSettings
|
||||
public class HysteriaSettings : IProjectSettings
|
||||
{
|
||||
public string Domain { get; set; } = "";
|
||||
|
||||
@ -21,5 +21,13 @@ namespace ProxySuper.Core.Models.Projects
|
||||
public int UpMbps { get; set; } = 300;
|
||||
|
||||
public int DownMbps { get; set; } = 300;
|
||||
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<int> { Port };
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -108,6 +108,7 @@
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Helpers\Utils.cs" />
|
||||
<Compile Include="Services\BrookService.cs" />
|
||||
<Compile Include="Services\HysteriaService.cs" />
|
||||
<Compile Include="Services\MTProtoGoService.cs" />
|
||||
<Compile Include="Services\NaiveProxyService.cs" />
|
||||
<Compile Include="Services\ServiceBase.cs" />
|
||||
|
168
ProxySuper.Core/Services/HysteriaService.cs
Normal file
168
ProxySuper.Core/Services/HysteriaService.cs
Normal file
@ -0,0 +1,168 @@
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using Renci.SshNet.Messages;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class HysteriaService : ServiceBase<HysteriaSettings>
|
||||
{
|
||||
public HysteriaService(Host host, HysteriaSettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public void Install()
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "安装Hysteria";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "安装必要的系统工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = "配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Step = "检测网络环境";
|
||||
EnsureNetwork();
|
||||
Progress.Percentage = 60;
|
||||
|
||||
|
||||
Progress.Desc = "检测域名是否绑定本机IP";
|
||||
ValidateDomain();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = "上传Hysteria配置文件";
|
||||
UploadConfigFile();
|
||||
Progress.Step = "安装Hysteria服务";
|
||||
InstallHysteria();
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "安装Hysteria成功";
|
||||
Progress.Desc = "安装Hysteria成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "卸载Hysteria";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "停止Hysteria服务";
|
||||
RunCmd("systemctl stop Hysteria");
|
||||
RunCmd("systemctl disable Hysteria");
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Desc = "删除Hysteria相关文件";
|
||||
RunCmd("rm -rf /etc/systemd/system/Hysteria.service");
|
||||
RunCmd("rm -rf /usr/bin/Hysteria");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Desc = "重置防火墙设置";
|
||||
ResetFirewalld();
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "卸载完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private string HysteriaServiceTemp = @"
|
||||
[Unit]
|
||||
Description=hysteria service
|
||||
After=network.target syslog.target
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=##run_cmd##
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target";
|
||||
|
||||
private void InstallHysteria()
|
||||
{
|
||||
Progress.Desc = "执行Hysteria安装文件";
|
||||
string url = "https://github.com/apernet/hysteria/releases/download/v1.3.3/hysteria-linux-386";
|
||||
string targetPath = "/user/bin/hysteria/hysteria-linux-386";
|
||||
|
||||
if (ArchType == ArchType.arm)
|
||||
{
|
||||
url = url.Replace("hysteria-linux-386", "hysteria-linux-arm");
|
||||
targetPath = targetPath.Replace("hysteria-linux-386", "hysteria-linux-arm");
|
||||
}
|
||||
|
||||
RunCmd($"curl -L {url} -o /usr/bin/hysteria");
|
||||
RunCmd("chmod +x /usr/bin/hysteria");
|
||||
|
||||
Progress.Desc = "设置Hysteria服务";
|
||||
var cmd = targetPath + " server";
|
||||
var hysteriaService = HysteriaServiceTemp.Replace("##run_cmd##", cmd);
|
||||
|
||||
RunCmd("rm -rf /etc/systemd/system/hysteria.service");
|
||||
RunCmd("touch /etc/systemd/system/hysteria.service");
|
||||
|
||||
RunCmd($"echo \"{hysteriaService}\" > /etc/systemd/system/hysteria.service");
|
||||
RunCmd("sudo chmod 777 /etc/systemd/system/hysteria.service");
|
||||
|
||||
|
||||
Progress.Desc = "启动Hysteria服务";
|
||||
RunCmd("systemctl enable hysteria");
|
||||
RunCmd("systemctl restart hysteria");
|
||||
}
|
||||
|
||||
private const string ConfigFilePath = @"Templates\Hysteria\config.json";
|
||||
private void UploadConfigFile()
|
||||
{
|
||||
var text = File.ReadAllText(ConfigFilePath, Encoding.UTF8);
|
||||
var json = JsonConvert.DeserializeObject(text);
|
||||
var obj = JToken.FromObject(json) as dynamic;
|
||||
|
||||
|
||||
obj["listen"] = Settings.Port;
|
||||
obj["acme"]["domains"][0] = Settings.Domain;
|
||||
obj["email"] = Settings.Email;
|
||||
obj["obfs"] = Settings.Obfs;
|
||||
|
||||
var configJson = JsonConvert.SerializeObject(
|
||||
obj,
|
||||
Formatting.Indented,
|
||||
new JsonSerializerSettings()
|
||||
{
|
||||
NullValueHandling = NullValueHandling.Ignore
|
||||
});
|
||||
|
||||
WriteToFile(configJson, "/user/bin/hysteria/config.json");
|
||||
}
|
||||
}
|
||||
}
|
@ -108,6 +108,8 @@ namespace ProxySuper.Core.ViewModels
|
||||
|
||||
public IMvxCommand AddBrookCommand => new MvxAsyncCommand(AddBrookRecord);
|
||||
|
||||
public IMvxCommand AddHysteriaCommand => new MvxAsyncCommand(AddHysteriaRecord);
|
||||
|
||||
public IMvxCommand RemoveCommand => new MvxAsyncCommand<string>(DeleteRecord);
|
||||
|
||||
public IMvxCommand EditCommand => new MvxAsyncCommand<string>(EditRecord);
|
||||
@ -204,6 +206,21 @@ namespace ProxySuper.Core.ViewModels
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task AddHysteriaRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.HysteriaSettings = new HysteriaSettings();
|
||||
|
||||
var result = await _navigationService.Navigate<HysteriaEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
|
||||
public async Task EditRecord(string id)
|
||||
{
|
||||
|
@ -1,9 +1,12 @@
|
||||
using MvvmCross.ViewModels;
|
||||
using MvvmCross.Commands;
|
||||
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.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
@ -12,14 +15,52 @@ namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class HysteriaInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
public Host Host { get; set; }
|
||||
public Host _host { get; set; }
|
||||
|
||||
public HysteriaSettings Settings { get; set; }
|
||||
public HysteriaSettings _settings { get; set; }
|
||||
|
||||
public HysteriaService _service { get; set; }
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
Host = parameter.Host;
|
||||
Settings = parameter.HysteriaSettings;
|
||||
_host = parameter.Host;
|
||||
_settings = parameter.HysteriaSettings;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_service = new HysteriaService(_host, _settings);
|
||||
_service.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_service.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_service.Connect();
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_service.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
public ProjectProgress Progress => _service.Progress;
|
||||
|
||||
public string Logs => _service.Progress.Logs;
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(_service.Install);
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_service.Uninstall);
|
||||
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = System.IO.Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".hysteria.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -413,6 +413,9 @@
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Templates\Hysteria\config.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\NaiveProxy\naive_server.caddyfile">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
10
ProxySuper.WPF/Templates/Hysteria/config.json
Normal file
10
ProxySuper.WPF/Templates/Hysteria/config.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"listen": ":36712",
|
||||
"acme": {
|
||||
"domains": [
|
||||
"your.domain.com"
|
||||
],
|
||||
"email": "your@email.com"
|
||||
},
|
||||
"obfs": "8ZuA2Zpqhuk8yakXvMjDqEXBwY"
|
||||
}
|
@ -21,6 +21,7 @@
|
||||
<MenuItem Padding="0,5" Header="Trojan-Go" Command="{Binding AddTrojanGoCommand}"></MenuItem>
|
||||
<MenuItem Padding="0,5" Header="NaiveProxy" Command="{Binding AddNaiveProxyCommand}"></MenuItem>
|
||||
<MenuItem Padding="0,5" Header="Brook" Command="{Binding AddBrookCommand}"></MenuItem>
|
||||
<MenuItem Padding="0,5" Header="Hysteria" Command="{Binding AddHysteriaCommand}"></MenuItem>
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem Header="{DynamicResource MainMenuActions}" Padding="10,3">
|
||||
|
@ -1,4 +1,5 @@
|
||||
<Window x:Class="ProxySuper.WPF.Views.Hysteria.HysteriaEditorView"
|
||||
<views:MvxWindow x:Class="ProxySuper.WPF.Views.Hysteria.HysteriaEditorView"
|
||||
xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
|
||||
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"
|
||||
@ -50,17 +51,17 @@
|
||||
<Label Content="{DynamicResource HysteriaObfs}" Grid.Row="2" Grid.Column="0" />
|
||||
<TextBox Text="{Binding Settings.Obfs}" Grid.Row="2" Grid.Column="1" />
|
||||
|
||||
<Label Content="{DynamicResource HysteriaProtocol}" Grid.Row="3" Grid.Column="0" />
|
||||
<TextBox Text="{Binding Settings.Protocol}" Grid.Row="3" Grid.Column="1" />
|
||||
<Label Content="{DynamicResource HysteriaEmail}" Grid.Row="3" Grid.Column="0" />
|
||||
<TextBox Text="{Binding Settings.Email}" Grid.Row="3" Grid.Column="1" />
|
||||
|
||||
<Label Content="{DynamicResource HysteriaEmail}" Grid.Row="4" Grid.Column="0" />
|
||||
<TextBox Text="{Binding Settings.Email}" Grid.Row="4" Grid.Column="1" />
|
||||
<!--<Label Content="{DynamicResource HysteriaProtocol}" Grid.Row="4" Grid.Column="0" />
|
||||
<TextBox Text="{Binding Settings.Protocol}" Grid.Row="4" Grid.Column="1" />-->
|
||||
|
||||
<Label Content="{DynamicResource HysteriaUpMbps}" Grid.Row="5" Grid.Column="0" />
|
||||
<!--<Label Content="{DynamicResource HysteriaUpMbps}" Grid.Row="5" Grid.Column="0" />
|
||||
<TextBox Text="{Binding Settings.UpMbps}" Grid.Row="5" Grid.Column="1" />
|
||||
|
||||
<Label Content="{DynamicResource HysteriaDownMbps}" Grid.Row="6" Grid.Column="0" />
|
||||
<TextBox Text="{Binding Settings.DownMbps}" Grid.Row="6" Grid.Column="1" />
|
||||
<TextBox Text="{Binding Settings.DownMbps}" Grid.Row="6" Grid.Column="1" />-->
|
||||
|
||||
<Border Grid.Row="8"
|
||||
Grid.ColumnSpan="3"
|
||||
@ -84,4 +85,4 @@
|
||||
</Border>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Window>
|
||||
</views:MvxWindow>
|
||||
|
@ -1,4 +1,6 @@
|
||||
using System;
|
||||
using MvvmCross.Platforms.Wpf.Presenters.Attributes;
|
||||
using MvvmCross.Platforms.Wpf.Views;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@ -14,10 +16,8 @@ using System.Windows.Shapes;
|
||||
|
||||
namespace ProxySuper.WPF.Views.Hysteria
|
||||
{
|
||||
/// <summary>
|
||||
/// HysteriaEditorView.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class HysteriaEditorView : Window
|
||||
[MvxWindowPresentation]
|
||||
public partial class HysteriaEditorView : MvxWindow
|
||||
{
|
||||
public HysteriaEditorView()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user