CaCertInstallerOfLinux.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Microsoft.Extensions.Logging;
  2. using System;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. namespace FastGithub.HttpServer
  7. {
  8. abstract class CaCertInstallerOfLinux : ICaCertInstaller
  9. {
  10. const string OS_RELEASE_FILE = "/etc/os-release";
  11. /// <summary>
  12. /// 更新工具文件名
  13. /// </summary>
  14. public abstract string CertUpdateFileName { get; }
  15. /// <summary>
  16. /// 证书根目录
  17. /// </summary>
  18. public abstract string RootCertPath { get; }
  19. /// <summary>
  20. /// 是否支持
  21. /// </summary>
  22. /// <returns></returns>
  23. public abstract bool IsSupported();
  24. /// <summary>
  25. /// 安装ca证书
  26. /// </summary>
  27. /// <param name="caCertFilePath">证书文件路径</param>
  28. /// <param name="logger"></param>
  29. public void Install(string caCertFilePath, ILogger logger)
  30. {
  31. var destCertFilePath = Path.Combine(this.RootCertPath, "fastgithub.crt");
  32. if (File.Exists(destCertFilePath) && File.ReadAllBytes(caCertFilePath).SequenceEqual(File.ReadAllBytes(destCertFilePath)))
  33. {
  34. return;
  35. }
  36. if (Environment.UserName != "root")
  37. {
  38. logger.LogWarning($"无法自动安装CA证书{caCertFilePath},因为没有root权限");
  39. return;
  40. }
  41. try
  42. {
  43. Directory.CreateDirectory(this.RootCertPath);
  44. File.Copy(caCertFilePath, destCertFilePath, overwrite: true);
  45. Process.Start(this.CertUpdateFileName).WaitForExit();
  46. }
  47. catch (Exception ex)
  48. {
  49. logger.LogWarning(ex.Message, "自动安装证书异常");
  50. }
  51. }
  52. /// <summary>
  53. /// 是否为某个发行版
  54. /// </summary>
  55. /// <param name="name"></param>
  56. /// <returns></returns>
  57. protected bool IsReleasName(string name)
  58. {
  59. if (File.Exists(OS_RELEASE_FILE) == false)
  60. {
  61. return false;
  62. }
  63. var releaseLines = File.ReadAllLines(OS_RELEASE_FILE);
  64. if (releaseLines.Length == 0)
  65. {
  66. return false;
  67. }
  68. var nameLine = releaseLines[0];
  69. return nameLine.Contains(name);
  70. }
  71. }
  72. }