|
|
|
@ -68,6 +68,7 @@ namespace ServiceLib.Handler
|
|
|
|
|
{ |
|
|
|
|
ShowMsg(true, $"{node.GetSummary()}"); |
|
|
|
|
await CoreStop(); |
|
|
|
|
await Task.Delay(100); |
|
|
|
|
await CoreStart(node); |
|
|
|
|
|
|
|
|
|
//In tun mode, do a delay check and restart the core |
|
|
|
@ -169,21 +170,12 @@ namespace ServiceLib.Handler
|
|
|
|
|
ShowMsg(false, $"{Environment.OSVersion} - {(Environment.Is64BitOperatingSystem ? 64 : 32)}"); |
|
|
|
|
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"))); |
|
|
|
|
|
|
|
|
|
//ECoreType coreType; |
|
|
|
|
//if (node.configType != EConfigType.Custom && _config.tunModeItem.enableTun) |
|
|
|
|
//{ |
|
|
|
|
// coreType = ECoreType.sing_box; |
|
|
|
|
//} |
|
|
|
|
//else |
|
|
|
|
//{ |
|
|
|
|
// coreType = LazyConfig.Instance.GetCoreType(node, node.configType); |
|
|
|
|
//} |
|
|
|
|
var coreType = AppHandler.Instance.GetCoreType(node, node.ConfigType); |
|
|
|
|
_config.RunningCoreType = coreType; |
|
|
|
|
var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(coreType); |
|
|
|
|
|
|
|
|
|
var displayLog = node.ConfigType != EConfigType.Custom || node.DisplayLog; |
|
|
|
|
var proc = await RunProcess(coreInfo, Global.CoreConfigFileName, displayLog); |
|
|
|
|
var proc = await RunProcess(coreInfo, Global.CoreConfigFileName, displayLog, true); |
|
|
|
|
if (proc is null) |
|
|
|
|
{ |
|
|
|
|
return; |
|
|
|
@ -225,7 +217,7 @@ namespace ServiceLib.Handler
|
|
|
|
|
if (result.Success) |
|
|
|
|
{ |
|
|
|
|
var coreInfo2 = CoreInfoHandler.Instance.GetCoreInfo(preCoreType); |
|
|
|
|
var proc2 = await RunProcess(coreInfo2, Global.CorePreConfigFileName, true); |
|
|
|
|
var proc2 = await RunProcess(coreInfo2, Global.CorePreConfigFileName, true, true); |
|
|
|
|
if (proc2 is not null) |
|
|
|
|
{ |
|
|
|
|
_processPre = proc2; |
|
|
|
@ -243,7 +235,7 @@ namespace ServiceLib.Handler
|
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(coreType); |
|
|
|
|
var proc = await RunProcess(coreInfo, Global.CoreSpeedtestConfigFileName, true); |
|
|
|
|
var proc = await RunProcess(coreInfo, Global.CoreSpeedtestConfigFileName, true, false); |
|
|
|
|
if (proc is null) |
|
|
|
|
{ |
|
|
|
|
return -1; |
|
|
|
@ -264,17 +256,28 @@ namespace ServiceLib.Handler
|
|
|
|
|
_updateFunc?.Invoke(notify, msg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private bool IsNeedSudo(ECoreType eCoreType) |
|
|
|
|
{ |
|
|
|
|
return _config.TunModeItem.EnableTun |
|
|
|
|
&& eCoreType == ECoreType.sing_box |
|
|
|
|
&& Utils.IsLinux() |
|
|
|
|
&& _config.TunModeItem.LinuxSudoPassword.IsNotEmpty() |
|
|
|
|
; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endregion Private |
|
|
|
|
|
|
|
|
|
#region Process |
|
|
|
|
|
|
|
|
|
private async Task<Process?> RunProcess(CoreInfo coreInfo, string configPath, bool displayLog) |
|
|
|
|
private async Task<Process?> RunProcess(CoreInfo coreInfo, string configPath, bool displayLog, bool mayNeedSudo) |
|
|
|
|
{ |
|
|
|
|
var fileName = CoreFindExe(coreInfo); |
|
|
|
|
if (Utils.IsNullOrEmpty(fileName)) |
|
|
|
|
{ |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var isNeedSudo = mayNeedSudo && IsNeedSudo(coreInfo.CoreType); |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
Process proc = new() |
|
|
|
@ -292,6 +295,15 @@ namespace ServiceLib.Handler
|
|
|
|
|
StandardErrorEncoding = displayLog ? Encoding.UTF8 : null, |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
if (isNeedSudo) |
|
|
|
|
{ |
|
|
|
|
proc.StartInfo.FileName = $"/bin/sudo"; |
|
|
|
|
proc.StartInfo.Arguments = $"-S {fileName} {string.Format(coreInfo.Arguments, configPath)}"; |
|
|
|
|
proc.StartInfo.StandardInputEncoding = Encoding.UTF8; |
|
|
|
|
proc.StartInfo.RedirectStandardInput = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var startUpErrorMessage = new StringBuilder(); |
|
|
|
|
var startUpSuccessful = false; |
|
|
|
|
if (displayLog) |
|
|
|
@ -313,6 +325,15 @@ namespace ServiceLib.Handler
|
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
proc.Start(); |
|
|
|
|
|
|
|
|
|
if (isNeedSudo) |
|
|
|
|
{ |
|
|
|
|
await Task.Delay(10); |
|
|
|
|
await proc.StandardInput.WriteLineAsync(_config.TunModeItem.LinuxSudoPassword); |
|
|
|
|
await Task.Delay(10); |
|
|
|
|
await proc.StandardInput.WriteLineAsync(_config.TunModeItem.LinuxSudoPassword); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (displayLog) |
|
|
|
|
{ |
|
|
|
|
proc.BeginOutputReadLine(); |
|
|
|
|