KernelExtensions.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using NTMiner.Gpus;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. namespace NTMiner.Core.Kernels {
  7. public static class KernelExtensions {
  8. public sealed class CommandName {
  9. internal string Name;
  10. // 根据这个判断是否换成过期
  11. internal string KernelInputArgs;
  12. }
  13. public static string GetProcessName(this IKernel kernel) {
  14. string commandName = GetCommandName(kernel);
  15. if (string.IsNullOrEmpty(commandName)) {
  16. return string.Empty;
  17. }
  18. return Path.GetFileNameWithoutExtension(commandName);
  19. }
  20. private static readonly Dictionary<Guid, CommandName> _commandNames = new Dictionary<Guid, CommandName>();
  21. public static string GetCommandName(this IKernel kernel) {
  22. try {
  23. if (kernel == null || kernel.KernelInputId == Guid.Empty) {
  24. return string.Empty;
  25. }
  26. NTMinerContext.Instance.ServerContext.KernelInputSet.TryGetKernelInput(kernel.KernelInputId, out IKernelInput kernelInput);
  27. if (kernelInput == null) {
  28. NTMinerConsole.UserError("意外!没有正确配置内核输入,请QQ群联系小编解决。");
  29. return string.Empty;
  30. }
  31. if (_commandNames.TryGetValue(kernel.GetId(), out CommandName commandName)) {
  32. // 如果KernelInput.Args没有变那么命令名就没有变
  33. if (kernelInput.Args == commandName.KernelInputArgs) {
  34. return commandName.Name;
  35. }
  36. }
  37. string args = kernelInput.Args;
  38. if (!string.IsNullOrEmpty(args)) {
  39. args = args.Trim();
  40. }
  41. else {
  42. return string.Empty;
  43. }
  44. string cmdName;
  45. if (args[0] == '"') {
  46. int index = args.IndexOf('"', 1);
  47. cmdName = args.Substring(1, index - 1);
  48. }
  49. else {
  50. int firstSpaceIndex = args.IndexOf(' ');
  51. if (firstSpaceIndex != -1) {
  52. cmdName = args.Substring(0, args.IndexOf(' '));
  53. }
  54. else {
  55. cmdName = args;
  56. }
  57. }
  58. if (commandName != null) {
  59. commandName.Name = cmdName;
  60. commandName.KernelInputArgs = kernelInput.Args;
  61. }
  62. else {
  63. _commandNames.Add(kernel.GetId(), new CommandName {
  64. Name = cmdName,
  65. KernelInputArgs = kernelInput.Args
  66. });
  67. }
  68. return cmdName;
  69. }
  70. catch (Exception e) {
  71. Logger.ErrorDebugLine(e);
  72. return string.Empty;
  73. }
  74. }
  75. public static bool IsSupported(this IKernel kernel, ICoin coin) {
  76. // 群控客户端和无显卡的电脑的GpuSet类型都是空
  77. if (NTMinerContext.Instance.GpuSet.GpuType == GpuType.Empty) {
  78. return true;
  79. }
  80. var coinKernelSet = NTMinerContext.Instance.ServerContext.CoinKernelSet;
  81. foreach (var item in coinKernelSet.AsEnumerable().Where(a => a.CoinId == coin.GetId() && a.KernelId == kernel.GetId()).ToArray()) {
  82. if (item.SupportedGpu.IsSupportedGpu(NTMinerContext.Instance.GpuSet.GpuType)) {
  83. return true;
  84. }
  85. }
  86. return false;
  87. }
  88. public static string GetKernelDirFullName(this IKernel kernel) {
  89. if (kernel == null || string.IsNullOrEmpty(kernel.Package)) {
  90. return string.Empty;
  91. }
  92. return Path.Combine(MinerClientTempPath.KernelsDirFullName, Path.GetFileNameWithoutExtension(kernel.Package));
  93. }
  94. public static string GetPackageFileFullName(this IKernel kernel) {
  95. if (kernel == null || string.IsNullOrEmpty(kernel.Package)) {
  96. return string.Empty;
  97. }
  98. return Path.Combine(HomePath.PackagesDirFullName, kernel.Package);
  99. }
  100. public static bool IsPackageFileExist(this IKernel kernel) {
  101. if (kernel == null || string.IsNullOrEmpty(kernel.Package)) {
  102. return false;
  103. }
  104. string fileFullName = kernel.GetPackageFileFullName();
  105. return File.Exists(fileFullName);
  106. }
  107. public static string GetDownloadFileFullName(this IKernel kernel) {
  108. if (kernel == null || string.IsNullOrEmpty(kernel.Package)) {
  109. return string.Empty;
  110. }
  111. return Path.Combine(MinerClientTempPath.DownloadDirFullName, kernel.Package);
  112. }
  113. public static bool ExtractPackage(this IKernel kernel) {
  114. try {
  115. string kernelDir = kernel.GetKernelDirFullName();
  116. if (string.IsNullOrEmpty(kernelDir)) {
  117. return false;
  118. }
  119. if (!Directory.Exists(kernelDir)) {
  120. Directory.CreateDirectory(kernelDir);
  121. }
  122. string packageZipFileFullName = kernel.GetPackageFileFullName();
  123. if (string.IsNullOrEmpty(packageZipFileFullName)) {
  124. return false;
  125. }
  126. if (!File.Exists(packageZipFileFullName)) {
  127. NTMinerConsole.DevDebug(() => $"试图解压的{packageZipFileFullName}文件不存在");
  128. return false;
  129. }
  130. ZipUtil.DecompressZipFile(packageZipFileFullName, kernelDir);
  131. return true;
  132. }
  133. catch (Exception e) {
  134. Logger.ErrorDebugLine(e);
  135. return false;
  136. }
  137. }
  138. }
  139. }