1
0
mirror of https://github.com/proxysu/ProxySU.git synced 2024-12-01 09:36:06 +03:00
ProxySU/ProxySuper.Core/Services/MTProtoGoService.cs
2023-05-03 18:23:53 -07:00

161 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ProxySuper.Core.Models.Hosts;
using ProxySuper.Core.Models.Projects;
using ProxySuper.Core.ViewModels;
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 MTProtoGoService : ServiceBase<MTProtoGoSettings>
{
public MTProtoGoService(Host host, MTProtoGoSettings 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. 生成密钥";
//RunCmd("docker pull nineseconds/mtg:2"); //拉取v2版本命令但是似乎不用也可以。
//下面的命令是v1版本的命令格式。可以保留。将来如启用v1可用。
//Settings.SecretText = RunCmd($"docker run nineseconds/mtg:1 generate-secret -c {Settings.Cleartext} tls").TrimEnd('\n');
Settings.SecretText = RunCmd($"docker run nineseconds/mtg:2 generate-secret {Settings.Cleartext}").TrimEnd('\n');
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. 启动MTProto服务";
RunCmd($"docker run -d -v /etc/mtg.toml:/config.toml --name=mtg --restart=always -p {Settings.Port + ":" + Settings.Port} nineseconds/mtg:2");
Progress.Desc = "设置自启动MTProto服务";
Progress.Step = "安装完成";
Progress.Percentage = 100;
AppendCommand("Host: " + Settings.Domain);
AppendCommand("Port: " + Settings.Port);
AppendCommand("Secret: " + Settings.SecretText);
NavigationService.Navigate<MTProtoGoConfigViewModel, MTProtoGoSettings>(Settings);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
public void Uninstall()
{
Task.Factory.StartNew(() =>
{
try
{
Progress.Percentage = 0;
Progress.Step = "卸载MTProto";
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 = "更新MTProto配置";
Progress.Desc = "暂停MTProto服务";
var cid = RunCmd("docker ps -q --filter name=mtg");
RunCmd($"docker stop {cid}");
Progress.Percentage = 50;
Progress.Desc = "生成密钥";
//Settings.SecretText = RunCmd($"docker run nineseconds/mtg:1 generate-secret -c {Settings.Cleartext} tls").TrimEnd('\n'); //v1版本
Settings.SecretText = RunCmd($"docker run nineseconds/mtg:2 generate-secret {Settings.Cleartext}").TrimEnd('\n');
Progress.Percentage = 65;
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 = "重启MTProto服务";
RunCmd($"docker restart {cid}");
Progress.Percentage = 100;
Progress.Desc = "更新配置成功";
AppendCommand("Host: " + Settings.Domain);
AppendCommand("Port: " + Settings.Port);
AppendCommand("Secret: " + Settings.SecretText);
}
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安装失败");
}
}
}
}