diff --git a/FastGithub.HttpServer/CaCertInstallerOfLinux.cs b/FastGithub.HttpServer/CaCertInstallerOfLinux.cs
index 51f1d4a..128bddc 100644
--- a/FastGithub.HttpServer/CaCertInstallerOfLinux.cs
+++ b/FastGithub.HttpServer/CaCertInstallerOfLinux.cs
@@ -52,7 +52,7 @@ namespace FastGithub.HttpServer
if (geteuid() != 0)
{
- this.logger.LogWarning($"无法自动安装CA证书{caCertFilePath},因为没有root权限");
+ this.logger.LogWarning($"无法自动安装CA证书{caCertFilePath}:没有root权限");
return;
}
diff --git a/FastGithub/WindowsServiceExtensions.cs b/FastGithub/ServiceExtensions.cs
similarity index 51%
rename from FastGithub/WindowsServiceExtensions.cs
rename to FastGithub/ServiceExtensions.cs
index 917f948..85b3024 100644
--- a/FastGithub/WindowsServiceExtensions.cs
+++ b/FastGithub/ServiceExtensions.cs
@@ -4,9 +4,12 @@ using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using PInvoke;
using System;
+using System.Diagnostics;
using System.IO;
using System.Linq;
+using System.Runtime.InteropServices;
using System.Runtime.Versioning;
+using System.Text;
using System.Threading;
namespace FastGithub
@@ -14,7 +17,7 @@ namespace FastGithub
///
/// IHostBuilder扩展
///
- static class WindowsServiceExtensions
+ static class ServiceExtensions
{
///
/// 控制命令
@@ -25,6 +28,10 @@ namespace FastGithub
Stop,
}
+ [SupportedOSPlatform("linux")]
+ [DllImport("libc", SetLastError = true)]
+ private static extern uint geteuid();
+
///
/// 使用windows服务
///
@@ -48,11 +55,18 @@ namespace FastGithub
///
public static void Run(this IHost host, bool singleton = true)
{
- if (OperatingSystem.IsWindows() && TryGetCommand(out var cmd))
+ if (TryGetCommand(out var cmd) && (OperatingSystem.IsWindows() || OperatingSystem.IsLinux()))
{
try
{
- UseCommand(cmd);
+ if (OperatingSystem.IsWindows())
+ {
+ UseCommandAtWindows(cmd);
+ }
+ else if (OperatingSystem.IsLinux())
+ {
+ UseCommandAtLinux(cmd);
+ }
}
catch (Exception ex)
{
@@ -86,7 +100,7 @@ namespace FastGithub
///
///
[SupportedOSPlatform("windows")]
- private static void UseCommand(Command cmd)
+ private static void UseCommandAtWindows(Command cmd)
{
var binaryPath = Environment.GetCommandLineArgs().First();
var serviceName = Path.GetFileNameWithoutExtension(binaryPath);
@@ -106,5 +120,54 @@ namespace FastGithub
}
}
+ ///
+ /// 应用控制指令
+ ///
+ ///
+ [SupportedOSPlatform("linux")]
+ private static void UseCommandAtLinux(Command cmd)
+ {
+ if (geteuid() != 0)
+ {
+ throw new UnauthorizedAccessException("无法操作服务:没有root权限");
+ }
+
+ var binaryPath = Path.GetFullPath(Environment.GetCommandLineArgs().First());
+ var serviceName = Path.GetFileNameWithoutExtension(binaryPath);
+ var serviceFilePath = $"/etc/systemd/system/{serviceName}.service";
+
+ if (cmd == Command.Start)
+ {
+ var serviceBuilder = new StringBuilder()
+ .AppendLine("[Unit]")
+ .AppendLine($"Description={serviceName}")
+ .AppendLine()
+ .AppendLine("[Service]")
+ .AppendLine("Type=notify")
+ .AppendLine($"User={Environment.UserName}")
+ .AppendLine($"ExecStart={binaryPath}")
+ .AppendLine($"WorkingDirectory={Path.GetDirectoryName(binaryPath)}")
+ .AppendLine()
+ .AppendLine("[Install]")
+ .AppendLine("WantedBy=multi-user.target");
+ File.WriteAllText(serviceFilePath, serviceBuilder.ToString());
+
+ Process.Start("chcon", $"--type=bin_t {binaryPath}").WaitForExit(); // SELinux
+ Process.Start("systemctl", "daemon-reload").WaitForExit();
+ Process.Start("systemctl", $"start {serviceName}.service").WaitForExit();
+ Process.Start("systemctl", $"enable {serviceName}.service").WaitForExit();
+ }
+ else if (cmd == Command.Stop)
+ {
+ Process.Start("systemctl", $"stop {serviceName}.service").WaitForExit();
+ Process.Start("systemctl", $"disable {serviceName}.service").WaitForExit();
+
+ if (File.Exists(serviceFilePath))
+ {
+ File.Delete(serviceFilePath);
+ }
+ Process.Start("systemctl", "daemon-reload").WaitForExit();
+ }
+ }
}
}
diff --git a/README.html b/README.html
index e4577a5..bb74ba5 100644
--- a/README.html
+++ b/README.html
@@ -374,25 +374,34 @@ code {
Q群2 742376932
2 部署方式
-2.1 windows-x64
+2.1 windows-x64桌面
+2.2 windows-x64服务
+
fastgithub.exe start // 以windows服务安装并启动
fastgithub.exe stop // 以windows服务卸载并删除
-2.2 linux-x64
+2.3 linux-x64终端
-- 执行
sudo ./fastgithub
+sudo ./fastgithub
- 设置系统自动代理为
http://127.0.0.1:38457,或手动代理http/https为127.0.0.1:38457
-2.3 macOS-x64
+2.4 linux-x64服务
+
+sudo ./fastgithub start // 以systemd服务安装并启动
+sudo ./fastgithub start // 以systemd服务卸载并删除
+- 设置系统自动代理为
http://127.0.0.1:38457,或手动代理http/https为127.0.0.1:38457
+
+2.5 macOS-x64
- 双击运行fastgithub
- 安装cacert/fastgithub.cer并设置信任
- 设置系统自动代理为
http://127.0.0.1:38457,或手动代理http/https为127.0.0.1:38457
- 具体配置详情
-2.4 docker-compose一键部署
+2.6 docker-compose一键部署
- 准备好docker 18.09, docker-compose.
- 在源码目录下,有一个docker-compose.yaml 文件,专用于在实际项目中,临时使用github.com源码,而做的demo配置。
diff --git a/README.md b/README.md
index 63cd013..094138a 100644
--- a/README.md
+++ b/README.md
@@ -7,22 +7,29 @@ github加速神器,解决github打不开、用户头像无法加载、releases
* Q群2 [742376932](https://qm.qq.com/cgi-bin/qm/qr?k=6BBJ1nrJwe1o1E4-NJfwSOP-C4sMGc4q&jump_from=webapi)
### 2 部署方式
-#### 2.1 windows-x64
-* 双击运行FastGithub.UI.exe
+#### 2.1 windows-x64桌面
+* 双击运行FastGithub.UI.exe
+
+#### 2.2 windows-x64服务
* `fastgithub.exe start` // 以windows服务安装并启动
* `fastgithub.exe stop` // 以windows服务卸载并删除
-#### 2.2 linux-x64
-* 执行`sudo ./fastgithub`
+#### 2.3 linux-x64终端
+* `sudo ./fastgithub`
+* 设置系统自动代理为`http://127.0.0.1:38457`,或手动代理http/https为`127.0.0.1:38457`
+
+#### 2.4 linux-x64服务
+* `sudo ./fastgithub start` // 以systemd服务安装并启动
+* `sudo ./fastgithub start` // 以systemd服务卸载并删除
* 设置系统自动代理为`http://127.0.0.1:38457`,或手动代理http/https为`127.0.0.1:38457`
-#### 2.3 macOS-x64
+#### 2.5 macOS-x64
* 双击运行fastgithub
* 安装cacert/fastgithub.cer并设置信任
* 设置系统自动代理为`http://127.0.0.1:38457`,或手动代理http/https为`127.0.0.1:38457`
* [具体配置详情](https://github.com/dotnetcore/FastGithub/blob/master/MacOSXConfig.md)
-#### 2.4 docker-compose一键部署
+#### 2.6 docker-compose一键部署
* 准备好docker 18.09, docker-compose.
* 在源码目录下,有一个docker-compose.yaml 文件,专用于在实际项目中,临时使用github.com源码,而做的demo配置。
* 根据自己的需要更新docker-compose.yaml中的sample和build镜像即可完成拉github.com源码加速,并基于源码做后续的操作。