Skip to content

Commit

Permalink
MTProxy-Go
Browse files Browse the repository at this point in the history
  • Loading branch information
next-autumn committed Aug 23, 2021
1 parent eab70cc commit 7b72512
Show file tree
Hide file tree
Showing 20 changed files with 550 additions and 9 deletions.
34 changes: 34 additions & 0 deletions ProxySuper.Core/Models/Projects/MTProxyGoSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxySuper.Core.Models.Projects
{
public class MTProxyGoSettings : IProjectSettings
{
public MTProxyGoSettings()
{
Port = 443;

Domain = string.Empty;

Cleartext = "bing.com";

SecretText = string.Empty;
}

public int Port { get; set; }

public string Domain { get; set; }

public List<int> FreePorts => new List<int> { Port };

public string Email => "";

public string Cleartext { get; set; }

public string SecretText { get; set; }
}
}
3 changes: 3 additions & 0 deletions ProxySuper.Core/Models/Record.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public Host Host
[JsonProperty("brook")]
public BrookSettings BrookSettings { get; set; }

[JsonProperty("mtProxyGoSettings")]
public MTProxyGoSettings MTProxyGoSettings { get; set; }


[JsonIgnore]
public ProjectType Type
Expand Down
4 changes: 4 additions & 0 deletions ProxySuper.Core/ProxySuper.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
<Compile Include="Models\Projects\BrookType.cs" />
<Compile Include="Models\Projects\IProjectSettings.cs" />
<Compile Include="Models\Hosts\LocalProxy.cs" />
<Compile Include="Models\Projects\MTProxyGoSettings.cs" />
<Compile Include="Models\Projects\NaiveProxySettings.cs" />
<Compile Include="Models\Projects\ProjectType.cs" />
<Compile Include="Models\Projects\TrojanGoSettings.cs" />
Expand All @@ -89,6 +90,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Helpers\Utils.cs" />
<Compile Include="Services\BrookService.cs" />
<Compile Include="Services\MTProxyGoService.cs" />
<Compile Include="Services\NaiveProxyService.cs" />
<Compile Include="Services\ServiceBase.cs" />
<Compile Include="Services\ShareLink.cs" />
Expand All @@ -103,6 +105,8 @@
<Compile Include="ViewModels\BrookInstallViewModel.cs" />
<Compile Include="ViewModels\EnableRootViewModel.cs" />
<Compile Include="ViewModels\HomeViewModel.cs" />
<Compile Include="ViewModels\MTProxyGoEditorViewModel.cs" />
<Compile Include="ViewModels\MTProxyGoInstallViewModel.cs" />
<Compile Include="ViewModels\NaiveProxyConfigViewModel.cs" />
<Compile Include="ViewModels\NaiveProxyEditorViewModel.cs" />
<Compile Include="ViewModels\NaiveProxyInstallViewModel.cs" />
Expand Down
143 changes: 143 additions & 0 deletions ProxySuper.Core/Services/MTProxyGoService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
using ProxySuper.Core.Models.Hosts;
using ProxySuper.Core.Models.Projects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace ProxySuper.Core.Services
{
public class MTProxyGoService : ServiceBase<MTProxyGoSettings>
{
public MTProxyGoService(Host host, MTProxyGoSettings settings) : base(host, settings)
{
}

public void Install()
{
Task.Factory.StartNew(() =>
{
try
{
Progress.Step = "1. 检测系统环境";
Progress.Percentage = 0;

EnsureRootUser();
EnsureSystemEnv();
Progress.Percentage = 15;

Progress.Step = "2. 安装必要的系统工具";
InstallSystemTools();
Progress.Percentage = 25;

Progress.Step = "3. 配置防火墙";
ConfigFirewalld();
Progress.Percentage = 35;

Progress.Step = "4. 安装docker";
InstallDocker();
Progress.Percentage = 50;

Progress.Step = "5. 生成密钥";
Settings.SecretText = RunCmd($"docker run nineseconds/mtg generate-secret {Settings.Cleartext}");
Progress.Percentage = 65;

Progress.Step = "6. 生成配置文件";
Progress.Desc = "创建配置";
RunCmd("touch /etc/mtg.toml");

Progress.Desc = "写入配置内容";
RunCmd($"echo secret=\"{Settings.SecretText}\" > /etc/mtg.toml");
RunCmd($"echo bind-to=\"0.0.0.0:{Settings.Port}\" >> /etc/mtg.toml");
Progress.Percentage = 80;

Progress.Step = "7. 启动MTProxy服务";
RunCmd($"docker run -d -v /etc/mtg.toml:/config.toml --name=mtg --restart=always -p {Settings.Port + ":" + Settings.Port} nineseconds/mtg");
Progress.Desc = "设置自启动MTProxy服务";

Progress.Step = "安装完成";
Progress.Percentage = 100;

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}

public void Uninstall()
{
Task.Factory.StartNew(() =>
{
try
{
Progress.Percentage = 0;
Progress.Step = "卸载MTProxy";

Progress.Desc = "检测系统环境";
EnsureRootUser();
Progress.Percentage = 30;

Progress.Desc = "删除docker容器";
var cid = RunCmd("docker ps -q --filter name=mtg");
RunCmd($"docker stop {cid}");
RunCmd($"docker rm {cid}");
Progress.Percentage = 100;
Progress.Desc = "卸载完成";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}

public void UpdateSettings()
{
Task.Factory.StartNew(() =>
{
try
{
Progress.Percentage = 0;
Progress.Step = "卸载MTProxy";


Progress.Desc = "停止MTProxy服务";
var cid = RunCmd("docker ps -q --filter name=mtg");
RunCmd($"docker stop {cid}");
Progress.Percentage = 50;

Progress.Desc = "修改配置文件";
RunCmd($"echo secret=\"{Settings.SecretText}\" > /etc/mtg.toml");
RunCmd($"echo bind-to=\"0.0.0.0:{Settings.Port}\" >> /etc/mtg.toml");
Progress.Percentage = 80;

Progress.Desc = "重启MTProxy服务";
RunCmd($"docker restart {cid}");

Progress.Percentage = 100;
Progress.Desc = "更新配置成功";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}

private void InstallDocker()
{
Progress.Desc = "执行docker安装脚本";
RunCmd("yes | curl https://get.docker.com | sh");

if (!FileExists("/usr/bin/docker"))
{
Progress.Desc = "docker安装失败";
throw new Exception("docker安装失败");
}
}
}
}
17 changes: 17 additions & 0 deletions ProxySuper.Core/ViewModels/HomeViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ public void SortUp(string id)

public IMvxCommand AddNaiveProxyCommand => new MvxAsyncCommand(AddNaiveProxyRecord);

public IMvxCommand AddMTProxyGoCommand => new MvxAsyncCommand(AddMTProxyGoRecord);

public IMvxCommand AddBrookCommand => new MvxAsyncCommand(AddBrookRecord);

public IMvxCommand RemoveCommand => new MvxAsyncCommand<string>(DeleteRecord);
Expand Down Expand Up @@ -153,6 +155,21 @@ public async Task AddTrojanGoRecord()
SaveToJson();
}

public async Task AddMTProxyGoRecord()
{
Record record = new Record();
record.Id = Utils.GetTickID();
record.Host = new Host();
record.MTProxyGoSettings = new MTProxyGoSettings();

var result = await _navigationService.Navigate<MTProxyGoEditorViewModel, Record, Record>(record);
if (result == null) return;

Records.Add(result);

SaveToJson();
}

public async Task AddNaiveProxyRecord()
{
Record record = new Record();
Expand Down
66 changes: 66 additions & 0 deletions ProxySuper.Core/ViewModels/MTProxyGoEditorViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using MvvmCross.Commands;
using MvvmCross.Navigation;
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 MTProxyGoEditorViewModel : MvxViewModel<Record, Record>
{
public MTProxyGoEditorViewModel(IMvxNavigationService navigationService)
{
NavigationService = navigationService;
}

public IMvxNavigationService NavigationService { get; }

public IMvxCommand SaveCommand => new MvxCommand(Save);

public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);

public string Id { get; set; }

public Host Host { get; set; }

public MTProxyGoSettings Settings { get; set; }

public override void Prepare(Record parameter)
{
var record = Utils.DeepClone(parameter);

Id = record.Id;
Host = record.Host;
Settings = record.MTProxyGoSettings;
}

private void Save()
{
NavigationService.Close(this, new Record
{
Id = this.Id,
Host = this.Host,
MTProxyGoSettings = Settings,
});
}

private void SaveAndInstall()
{
var record = new Record
{
Id = this.Id,
Host = this.Host,
MTProxyGoSettings = Settings,
};
NavigationService.Close(this, record);
NavigationService.Navigate<MTProxyGoInstallViewModel, Record>(record);
}
}
}
79 changes: 79 additions & 0 deletions ProxySuper.Core/ViewModels/MTProxyGoInstallViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
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;

namespace ProxySuper.Core.ViewModels
{
public class MTProxyGoInstallViewModel : MvxViewModel<Record>
{
Host _host;

MTProxyGoSettings _settings;

MTProxyGoService _mtproxyService;

public override void Prepare(Record parameter)
{
_host = parameter.Host;
_settings = parameter.MTProxyGoSettings;
}

public override Task Initialize()
{
_mtproxyService = new MTProxyGoService(_host, _settings);
_mtproxyService.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
_mtproxyService.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
_mtproxyService.Connect();
return base.Initialize();
}

public override void ViewDestroy(bool viewFinishing = true)
{
_mtproxyService.Disconnect();
this.SaveInstallLog();
base.ViewDestroy(viewFinishing);
}

public ProjectProgress Progress
{
get => _mtproxyService.Progress;
}

public string Logs
{
get => _mtproxyService.Progress.Logs;
}


#region Command

public IMvxCommand InstallCommand => new MvxCommand(_mtproxyService.Install);

public IMvxCommand UpdateSettingsCommand => new MvxCommand(_mtproxyService.UpdateSettings);

public IMvxCommand UninstallCommand => new MvxCommand(_mtproxyService.Uninstall);

#endregion


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") + ".mtproxy-go.txt");
File.WriteAllText(fileName, Logs);
}
}
}
Loading

0 comments on commit 7b72512

Please sign in to comment.