1
0
mirror of https://github.com/proxysu/ProxySU.git synced 2024-11-23 05:36:08 +03:00
ProxySU/ProxySU_Core/ViewModels/Developers/XrayProject.cs
2021-02-25 09:59:06 +08:00

239 lines
9.5 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 Renci.SshNet;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ProxySU_Core.ViewModels.Developers
{
public class XrayProject : Project<XrayParameters>
{
private const string ServerLogPath = "/Templates/xray/server/00_log/00_log.json";
private const string ServerApiPath = "/Templates/xray/server/01_api/01_api.json";
private const string ServerDnsPath = "/Templates/xray/server/02_dns/02_dns.json";
private const string ServerRoutingPath = "/Templates/xray/server/03_routing/03_routing.json";
private const string ServerPolicyPath = "/Templates/xray/server/04_policy/04_policy.json";
private const string ServerInboundsPath = "/Templates/xray/server/05_inbounds/05_inbounds.json";
private const string ServerOutboundsPath = "/Templates/xray/server/06_outbounds/06_outbounds.json";
private const string ServerTransportPath = "/Templates/xray/server/07_transport/07_transport.json";
private const string ServerStatsPath = "/Templates/xray/server/08_stats/08_stats.json";
private const string ServerReversePath = "/Templates/xray/server/09_reverse/09_reverse.json";
public XrayProject(SshClient sshClient, XrayParameters parameters, Action<string> writeOutput) : base(sshClient, parameters, writeOutput)
{
}
public override void Execute()
{
try
{
EnsureRootAuth();
if (FileExists("/usr/local/bin/xray"))
{
var btnResult = MessageBox.Show("已经安装Xray是否需要重装", "提示", MessageBoxButton.YesNo);
if (btnResult == MessageBoxResult.No)
{
MessageBox.Show("安装终止", "提示");
return;
}
}
EnsureSystemEnv();
ConfigureSoftware();
ConfigureIPv6();
ConfigureFirewall();
SyncTimeDiff();
ValidateDomain();
InstallXray();
}
catch (Exception ex)
{
MessageBox.Show("安装终止," + ex.Message);
}
}
private void InstallXray()
{
RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install");
if (FileExists("/usr/local/bin/xray"))
{
WriteOutput("Xray安装成功");
}
RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/xray.service");
RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/xray.service");
RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/xray.service");
RunCmd($"systemctl daemon-reload");
if (FileExists("/usr/local/etc/xray/config.json"))
{
RunCmd(@"mv /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.1");
}
UploadXrayConfig();
}
private int GetRandomPort()
{
var random = new Random();
return random.Next(10001, 60000);
}
private void UploadXrayConfig()
{
dynamic logObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerLogPath));
dynamic apiObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerApiPath));
dynamic dnsObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerDnsPath));
dynamic routingObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerRoutingPath));
dynamic policyObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerPolicyPath));
dynamic inboundsObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerInboundsPath));
dynamic outboundsObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerOutboundsPath));
dynamic transportObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerTransportPath));
dynamic statsObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerStatsPath));
dynamic reverseObj = JsonConvert.DeserializeObject(File.ReadAllText(ServerReversePath));
switch (Parameters.Type)
{
case XrayType.Shadowsocks_AEAD:
break;
case XrayType.Shadowsocks_TCP:
break;
case XrayType.Sockets5_TLS:
break;
case XrayType.Trojan_TCP_TLS:
break;
case XrayType.VLESS_H2C_Caddy2:
inboundsObj = JsonConvert.DeserializeObject(File.ReadAllText("/Templates/xray/server/05_inbounds/VLESS_HTTP2_TLS.json"));
inboundsObj[0]["port"] = GetRandomPort();
inboundsObj[0]["settings"]["clients"][0]["id"] = Parameters.UUID;
inboundsObj[0]["streamSettings"]["httpSettings"]["path"] = Parameters.VlessHttpPath;
inboundsObj[0]["streamSettings"]["httpSettings"]["host"][0] = Parameters.Domain;
break;
case XrayType.VLESS_TCP_TLS_WS:
inboundsObj = JsonConvert.DeserializeObject(File.ReadAllText("/Templates/xray/server/05_inbounds/VLESS_TCP_TLS_WS.json"));
inboundsObj[0]["port"] = GetRandomPort();
inboundsObj[0]["settings"]["clients"][0]["id"] = Parameters.UUID;
inboundsObj[0]["streamSettings"]["httpSettings"]["path"] = Parameters.VlessWsPath;
break;
case XrayType.VLESS_TCP_XTLS_WHATEVER:
break;
case XrayType.VLESS_mKCPSeed:
break;
case XrayType.VMess_HTTP2:
break;
case XrayType.VMess_TCP_TLS:
break;
case XrayType.VMess_WebSocket_TLS:
break;
case XrayType.VMess_mKCPSeed:
break;
default:
break;
}
var serverConfig = new
{
log = logObj["log"],
api = apiObj["api"],
dns = dnsObj["dns"],
routing = routingObj["routing"],
policy = policyObj["policy"],
inbounds = inboundsObj["inbounds"],
outbounds = outboundsObj["outbounds"],
transport = transportObj["transport"],
stats = statsObj["stats"],
reverse = reverseObj["reverse"]
};
var json = JsonConvert.SerializeObject(serverConfig);
var jsonStream = new MemoryStream(Encoding.UTF8.GetBytes(json));
UploadFile(jsonStream, "/usr/local/etc/xray/config.json");
jsonStream.Dispose();
}
private void InstallCert()
{
// 安装依赖
RunCmd(GetInstallCmd("socat"));
// 解决搬瓦工CentOS缺少问题
RunCmd(GetInstallCmd("automake autoconf libtool"));
// 安装Acme
var result = RunCmd($"curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m {GetRandomEmail()}");
if (result.Contains("Install success"))
{
WriteOutput("安装 acme.sh 成功");
}
else
{
throw new Exception("安装 acme.sh 失败,请联系开发者!");
}
RunCmd("cd ~/.acme.sh/");
RunCmd("alias acme.sh=~/.acme.sh/acme.sh");
// 申请证书
if (OnlyIpv6)
{
var cmd = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {Parameters.Domain} --listen-v6";
result = RunCmd(cmd);
}
else
{
var cmd = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {Parameters.Domain}";
result = RunCmd(cmd);
}
if (result.Contains("Cert success"))
{
WriteOutput("申请证书成功");
}
else
{
throw new Exception("申请证书失败,请联系开发者!");
}
// 安装证书到xray
RunCmd("mkdir -p /usr/local/etc/xray/ssl");
RunCmd($"/root/.acme.sh/acme.sh --installcert -d {Parameters.Domain} --certpath /usr/local/etc/xray/ssl/xray_ssl.crt --keypath /usr/local/etc/xray/ssl/xray_ssl.key --capath /usr/local/etc/xray/ssl/xray_ssl.crt --reloadcmd \"systemctl restart xray\"");
result = RunCmd(@"if [ ! -f ""/usr/local/etc/xray/ssl/xray_ssl.key"" ]; then echo ""0""; else echo ""1""; fi | head -n 1");
if (result.Contains("1"))
{
WriteOutput("安装证书成功");
}
else
{
throw new Exception("安装证书失败,请联系开发者!");
}
RunCmd(@"chmod 644 /usr/local/etc/xray/ssl/xray_ssl.key");
}
private void InstallCaddy()
{
}
private string GetRandomEmail()
{
Random r = new Random();
var num = r.Next(200000000, 900000000);
return $"{num}@qq.com";
}
}
}