Eden 2 bulan lalu
induk
melakukan
3260b5a29c

+ 9 - 3
TEAMModelOS.Extension/IES.Exam/IES.ExamClient/main.js

@@ -10,7 +10,7 @@ const { exec } = require('child_process');
 const net = require('net');
 const os = require('os');
 const utils = require('./utils');
-
+const fs = require('fs');
 let win = null;
 let tray = null;
 app.isQuitting = false; // 添加标志位
@@ -33,7 +33,7 @@ const createWindow = async () => {
                 contextIsolation: false,
             },
         });
-        win.webContents.openDevTools(); // 打开开发者工具
+        //win.webContents.openDevTools(); // 打开开发者工具
         //win.webContents.session.setCertificateVerifyProc((request, callback) => {
         //    // 始终返回 0 表示验证通过
         //    callback(0);
@@ -93,7 +93,7 @@ app.on('window-all-closed', function () {
     }
 });
 
-// 模拟执行业务过程
+// 服务端启动过程
 async function StartProcess() {
     //步骤1 开始检查
     sendLogMessage('检查评测服务是否启动...');
@@ -141,6 +141,12 @@ async function StartProcess() {
         await serverManager.startServer();
         const isServerRunning = await serverManager.checkServerHealth();
         if (isServerRunning) {
+            let startJsonPath = path.join(constants.serverPath, 'server', 'start.json');
+            startJsonPath = `"${startJsonPath}"`;
+            if (fs.existsSync(startJsonPath))
+            {
+                sendLogMessage('本地IP域名映射配置成功...');
+            }
             sendLogMessage('本地IP域名映射配置成功...');
             sendLogMessage('SSL安全证书安装成功...');
             sendLogMessage('评测服务启动成功...');

+ 11 - 3
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Controllers/IndexController.cs

@@ -380,8 +380,16 @@ namespace IES.ExamServer.Controllers
         {
             try
             {
-                var data = await IndexService. ModifyHosts(ip,_memoryCache,_liteDBFactory,_connectionService);
-                return Ok(new { data.code,data.code_zip,data.code_cer,data.code_hosts,data.msg});
+                if (SystemScriptHelper.IsAdministrator())
+                {
+                    var data = await IndexService.ModifyHosts(ip, _memoryCache, _liteDBFactory, _connectionService);
+                    return Ok(new { data.code, data.code_zip, data.code_cer, data.code_hosts, data.msg });
+                }
+                else 
+                {
+                    code = 401;
+                    msg = "请使用管理员身份运行本程序以切换主站";
+                }
             }
             catch (Exception ex)
             {
@@ -389,7 +397,7 @@ namespace IES.ExamServer.Controllers
                 _logger.LogError($"域名IP绑定错误。{ex.Message},{ex.StackTrace}");
                 msg = $"域名IP绑定错误,{ex.Message}";
             }
-            return Ok(new { code = 400, msg = msg });
+            return Ok(new { code = code, msg = msg });
         }
         /// <summary>
         /// 强制重新安装证书

+ 16 - 16
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Controllers/ManageController.cs

@@ -264,13 +264,13 @@ namespace IES.ExamServer.Controllers
                         int msg_status = Constant._Message_status_info;
                         string msg_content = msg_status.Equals(Constant._Message_status_success) ? "成功" : "失败";
                         await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                        new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = 0, content = "检测云端数据是否匹配..." });
+                        new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = 0, step=1, content = "检测云端数据是否匹配..." });
                         var dataInfo=  await GetEvaluationFromCenter(GetXAuthToken(), _configuration, _httpClientFactory, shortCode, evaluationClient.id!);
                       
                         if (dataInfo.centerCode.Equals("200")&& dataInfo.evaluationCloud!=null)
                         {
                             await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"云端数据检测结果:{dataInfo.centerMsg},状态:{dataInfo.centerCode}" },true);
+                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, step = 1, content = $"云端数据检测结果:{dataInfo.centerMsg},状态:{dataInfo.centerCode}" },true);
                             string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
                             var client = _httpClientFactory.CreateClient();
                             if (client.DefaultRequestHeaders.Contains(Constant._X_Auth_AuthToken))
@@ -306,7 +306,7 @@ namespace IES.ExamServer.Controllers
                             }
                             msg_content = msg_status.Equals(Constant._Message_status_success) ? "成功" : "失败";
                             await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = msg_status, content = $"获取云端下载授权=>{msg_content}" }, true);
+                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = msg_status, step = 1, content = $"获取云端下载授权=>{msg_content}" }, true);
                             var httpClient = _httpClientFactory.CreateClient();
                             string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "package");
                             string evaluationPath = Path.Combine(packagePath, dataInfo.evaluationCloud.id!);
@@ -319,7 +319,7 @@ namespace IES.ExamServer.Controllers
                             }
                            
                             await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_info, content = $"下载前清理资源" });
+                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 1, status = Constant._Message_status_info, content = $"下载前清理资源" });
                             string evaluationData = string.Empty;
                             {
                                 //evaluation
@@ -333,13 +333,13 @@ namespace IES.ExamServer.Controllers
                                     await System.IO.File.WriteAllTextAsync(path_evaluation, content);
                                     successMsgs.Add("评测信息文件evaluation.json文件下载成功!");
                                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                    new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"评测信息文件evaluation.json文件下载成功!" });
+                                    new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 2, status = Constant._Message_status_success, content = $"评测信息文件evaluation.json文件下载成功!" });
                                 }
                                 else
                                 {
                                     errorMsgs.Add("评测信息文件evaluation.json文件下载失败!");
                                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                    new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"评测信息文件evaluation.json文件下载失败!" }, true);
+                                    new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 2, status = Constant._Message_status_error, content = $"评测信息文件evaluation.json文件下载失败!" }, true);
                                 }
 
 
@@ -377,14 +377,14 @@ namespace IES.ExamServer.Controllers
                                     await System.IO.File.WriteAllTextAsync(path_groupList, content);
                                     successMsgs.Add("评测名单grouplist.json文件下载成功!");
                                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"评测名单grouplist.json文件下载成功!" });
+                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 3, status = Constant._Message_status_success, content = $"评测名单grouplist.json文件下载成功!" });
 
                                 }
                                 else
                                 {
                                     errorMsgs.Add("评测名单grouplist.json文件下载失败!");
                                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"评测名单grouplist.json文件下载失败!" }, true);
+                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 3, status = Constant._Message_status_error, content = $"评测名单grouplist.json文件下载失败!" }, true);
 
                                 }
                             }
@@ -435,14 +435,14 @@ namespace IES.ExamServer.Controllers
                                                     }
 
                                                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"[进度:{currCount}/{blobCount}][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载成功。" });
+                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 4, status = Constant._Message_status_success, content = $"[进度:{currCount}/{blobCount}][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载成功。" });
                                                 }
                                                 else
                                                 {
                                                     string? error = await blobMessage.Content.ReadAsStringAsync(cancellationToken);
                                                     errorMsgs.Add($"{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载失败,{blobMessage.StatusCode},{error}");
                                                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                 new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"[进度:{currCount}/{blobCount}][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载失败,{blobMessage.StatusCode},{error}" }, true);
+                                 new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 4, status = Constant._Message_status_error, content = $"[进度:{currCount}/{blobCount}][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载失败,{blobMessage.StatusCode},{error}" }, true);
 
                                                     // Console.WriteLine($"Error downloading {blob.path},{blobMessage.StatusCode},{error}");
                                                 }
@@ -451,7 +451,7 @@ namespace IES.ExamServer.Controllers
                                             {
                                                 errorMsgs.Add($"{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载错误,{ex.Message}");
                                                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                 new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"[进度:{currCount}/{blobCount}][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载错误,{ex.Message}" }, true);
+                                 new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 4, status = Constant._Message_status_error, content = $"[进度:{currCount}/{blobCount}][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载错误,{ex.Message}" }, true);
 
                                                 // 处理异常
                                                 //Console.WriteLine($"Error downloading {blob.path}: {ex.Message}");
@@ -463,9 +463,9 @@ namespace IES.ExamServer.Controllers
 
                             _liteDBFactory.GetLiteDatabase().GetCollection<EvaluationClient>().Upsert(dataInfo.evaluationCloud!);
 
-                            (successMsgs, errorMsgs) = await ManageService.CheckFile(dataInfo.evaluationCloud!, successMsgs, errorMsgs, _signalRExamServerHub, _memoryCache, _logger, deviceId, evaluationPath, Constant._Message_grant_type_download_file);
+                            (successMsgs, errorMsgs) = await ManageService.CheckFile(dataInfo.evaluationCloud!, successMsgs, errorMsgs, _signalRExamServerHub, _memoryCache, _logger, deviceId, evaluationPath, Constant._Message_grant_type_download_file,step:5);
                             await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_info, content = $"正在创建压缩包,请稍等..." });
+                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 6, status = Constant._Message_status_info, content = $"正在创建压缩包,请稍等..." });
 
                             //下载完成后,对数据进行检查,然后在加密压缩。
                             string zipPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "zip");
@@ -479,13 +479,13 @@ namespace IES.ExamServer.Controllers
                             {
                                 successMsgs.Add("评测数据压缩包创建成功!");
                                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"评测数据压缩包创建成功!" });
+                                   new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 6, status = Constant._Message_status_success, content = $"评测数据压缩包创建成功!" });
                             }
                             else
                             {
                                 errorMsgs.Add("评测数据压缩包创建失败!");
                                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                  new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"评测数据压缩包创建失败!" }, true);
+                                  new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 6, status = Constant._Message_status_error, content = $"评测数据压缩包创建失败!" }, true);
 
                             }
                         }
@@ -493,7 +493,7 @@ namespace IES.ExamServer.Controllers
                             string content = $"云端数据检测结果:{dataInfo.centerMsg},状态:{dataInfo.centerCode}";
                             errorMsgs.Add(content);
                             await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
-                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = content }, true);
+                                new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, step = 1, status = Constant._Message_status_error, content = content }, true);
                         }
                     }
                     else

+ 17 - 1
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/DI/ServiceInitializer.cs

@@ -10,6 +10,7 @@ using IES.ExamServer.Helper;
 using IES.ExamServer.Models;
 using System.Security.Policy;
 using IES.ExamServer.Helpers;
+using System.Text;
 
 namespace IES.ExamServer.DI
 {
@@ -131,7 +132,22 @@ namespace IES.ExamServer.DI
             _cache.Set(Constant._KeyServerDevice, serverDevice);
             _liteDBFactory.GetLiteDatabase().GetCollection<ServerDevice>().Upsert(serverDevice);
             _connectionService.serverDevice = serverDevice;
-            await  IndexService.ModifyHosts(null, _cache, _liteDBFactory, _connectionService);
+            var dataModify =  await  IndexService.ModifyHosts(null, _cache, _liteDBFactory, _connectionService);
+            var dataFile = new {
+                dataModify.code_zip,
+                dataModify.zip_msg,
+                dataModify.code_cer,
+                dataModify.cer_msg,
+                dataModify.code_hosts,
+                dataModify.hosts_msg,
+                name = dataModify.primaryNetwork?.name,
+                mac= dataModify.primaryNetwork?.mac,
+                ip = dataModify.primaryNetwork?.ip,
+                read=0
+            };
+            string filePath = Path.Combine(Directory.GetCurrentDirectory(),"start.json");
+            await File.WriteAllTextAsync(filePath, dataFile.ToJsonString());
+            StringBuilder sb = new StringBuilder();
             _lifetime.ApplicationStarted.Register(() =>
             {
                var serverDevice=  _cache.Get<ServerDevice>(Constant._KeyServerDevice);

+ 52 - 47
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Helpers/ProcessHelper.cs

@@ -10,63 +10,68 @@ namespace IES.ExamServer.Helpers
         {
             int code = 0;
             string msg = string.Empty;
+            try {
 
-            // 创建一个新的 ProcessStartInfo 对象
-            ProcessStartInfo startInfo = new ProcessStartInfo
-            {
-                // 指定要执行的 BAT 文件的路径
-                FileName = "cmd.exe",
-                // 设置命令行参数,使用 /c 表示执行命令后关闭命令提示符窗口
-                Arguments = $"/c {pathBat}",
-                // 设置是否使用操作系统 shell 启动进程
-                UseShellExecute = false,
-                // 设置是否创建新的窗口
-                CreateNoWindow = true,
-                // 重定向标准输出和标准错误输出
-                RedirectStandardOutput = true,
-                RedirectStandardError = true
-            };
-            // 创建一个新的 Process 对象
-            using (Process process = new Process())
-            {
-                // 将 ProcessStartInfo 对象分配给 Process 对象
-                process.StartInfo = startInfo;
+                // 创建一个新的 ProcessStartInfo 对象
+                ProcessStartInfo startInfo = new ProcessStartInfo
+                {
+                    // 指定要执行的 BAT 文件的路径
+                    FileName = "cmd.exe",
+                    // 设置命令行参数,使用 /c 表示执行命令后关闭命令提示符窗口
+                    Arguments = $"/c {pathBat}",
+                    // 设置是否使用操作系统 shell 启动进程
+                    UseShellExecute = false,
+                    // 设置是否创建新的窗口
+                    CreateNoWindow = true,
+                    // 重定向标准输出和标准错误输出
+                    RedirectStandardOutput = true,
+                    RedirectStandardError = true
+                };
+                // 创建一个新的 Process 对象
+                using (Process process = new Process())
+                {
+                    // 将 ProcessStartInfo 对象分配给 Process 对象
+                    process.StartInfo = startInfo;
 
-                // 启动进程
-                process.Start();
+                    // 启动进程
+                    process.Start();
 
-                // 读取标准输出和标准错误输出
-                string output = process.StandardOutput.ReadToEnd();
-                string error = process.StandardError.ReadToEnd();
+                    // 读取标准输出和标准错误输出
+                    string output = process.StandardOutput.ReadToEnd();
+                    string error = process.StandardError.ReadToEnd();
 
-                // 等待进程执行完成
-                process.WaitForExit();
+                    // 等待进程执行完成
+                    process.WaitForExit();
 
-                // 输出执行结果
-                if (!string.IsNullOrEmpty(output))
-                {
-                    // Console.WriteLine("标准输出:");
-                    // Console.WriteLine(output);
-                    if (output.Contains("successfully", StringComparison.OrdinalIgnoreCase))
+                    // 输出执行结果
+                    if (!string.IsNullOrEmpty(output))
                     {
-                        msg = $"执行成功!";
-                        code = 200;
+                        // Console.WriteLine("标准输出:");
+                        // Console.WriteLine(output);
+                        if (output.Contains("successfully", StringComparison.OrdinalIgnoreCase))
+                        {
+                            msg = $"执行成功!";
+                            code = 200;
+                        }
+                        else
+                        {
+                            msg = $"执行异常:{output}";
+                            code = 1;
+                        }
+
                     }
-                    else
+
+                    if (!string.IsNullOrEmpty(error))
                     {
-                        msg = $"执行异常:{output}";
-                        code = 1;
+                        // Console.WriteLine("错误输出:");
+                        // Console.WriteLine(error);
+                        msg = $"执行失败:{error}";
+                        code = 2;
                     }
-
-                }
-
-                if (!string.IsNullOrEmpty(error))
-                {
-                    // Console.WriteLine("错误输出:");
-                    // Console.WriteLine(error);
-                    msg = $"执行失败:{error}";
-                    code = 2;
                 }
+            } catch (Exception ex) {
+                code = 500;
+                msg = $"{ex.Message},{ex.StackTrace}";
             }
             return (code, msg);
         }

+ 4 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Models/SignalRClient.cs

@@ -96,6 +96,10 @@
         /// 数据名称
         /// </summary>
         public string? dataName {  get; set; }
+        /// <summary>
+        /// 步骤
+        /// </summary>
+        public int step { get; set; }
     }
  
     public class SignalRClient

+ 54 - 10
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Services/IndexService.cs

@@ -26,10 +26,12 @@ namespace IES.ExamServer.Services
         /// <param name="_liteDBFactory"></param>
         /// <param name="connectionService"></param>
         /// <returns></returns>
-        public static async Task<(int code, int code_cer ,int code_hosts,int code_zip, string msg)> ModifyHosts(string? ip,IMemoryCache _memoryCache,LiteDBFactory _liteDBFactory,CenterServiceConnectionService connectionService)
+        public static async Task<(int code, int code_cer ,int code_hosts,int code_zip, string msg,string hosts_msg, string cer_msg,string zip_msg,Network? primaryNetwork)> ModifyHosts(string? ip,IMemoryCache _memoryCache,LiteDBFactory _liteDBFactory,CenterServiceConnectionService connectionService)
         {
-           (string? hostsIp,string hostsMsg) = SystemScriptHelper.FindIpAddressForDomain("exam.habook.local");
+            Network? primaryNetwork = null;
+            (string? hostsIp,string hostsMsg) = SystemScriptHelper.FindIpAddressForDomain("exam.habook.local");
             int code = 0, code_cer = 0,code_hosts=0,code_zip=0 ;
+            string hosts_msg = string.Empty, cer_msg = string.Empty, zip_msg = string.Empty;
             StringBuilder sb = new StringBuilder();
             try
             {
@@ -55,21 +57,39 @@ namespace IES.ExamServer.Services
                         var res = ProcessHelper.ExecuteProcess(pathBatNew);
                         sb.Append(res.msg);
                         code_cer = res.code;
+                        switch (res.code) 
+                        {
+                            case 200:
+                                cer_msg = "证书安装成功";
+                                break;
+                            case 1:
+                                cer_msg = $"证书安装异常:{res.msg}";
+                                break;
+                            case 2:
+                                cer_msg = $"证书脚本运行异常:{res.msg}";
+                                break;
+                            case 500:
+                                cer_msg = $"证书代码执行异常:{res.msg}";
+                                break;
+
+                        }
                     }
                     else
                     {
                         code_cer = 401;
                         sb.Append("请使用管理员身份运行本程序,如果已经安装过脚本请忽略!");
+                        cer_msg = $"请使用管理员身份安装证书!";
                     }
                 }
                 else
                 {
                     code_cer = 200;
+                    cer_msg = $"证书已经安装!";
                 }
                 //获取主站配置信息。
                 ServerDevice serverDevice = _memoryCache.Get<ServerDevice>(Constant._KeyServerDevice);
                 var primaryNetworks=   _liteDBFactory.GetLiteDatabase().GetCollection<Network>().FindAll().ToList();
-                Network? primaryNetwork = null;
+               
                 //传入的ip为不为空,切换
                 if (!string.IsNullOrWhiteSpace(ip) )
                 {
@@ -126,20 +146,38 @@ namespace IES.ExamServer.Services
                             var resHosts = ProcessHelper.ExecuteProcess(pathBatHostsNew);
                             sb.Append(resHosts.msg);
                             code_hosts = resHosts.code;
+                            switch (resHosts.code)
+                            {
+                                case 200:
+                                    hosts_msg = "IP域名映射成功";
+                                    break;
+                                case 1:
+                                    hosts_msg = $"IP域名映射异常:{resHosts.msg}";
+                                    break;
+                                case 2:
+                                    hosts_msg = $"IP域名映射脚本运行异常:{resHosts.msg}";
+                                    break;
+                                case 500:
+                                    hosts_msg = $"IP域名映射代码执行异常:{resHosts.msg}";
+                                    break;
+
+                            }
                         }
                         else
                         {
                             code_hosts = 401;
                             sb.Append("请使用管理员身份执行本程序!");
+                            hosts_msg = $"请使用管理员身份映射IP域名!";
                         }
                     }
                     else
                     {
                         code_hosts = 200;
                         sb.Append("IP域名映射已存在,无需再次映射!");
+                        hosts_msg = $"IP域名映射已存在,无需再次映射!";
                     }
-                    string scriptPath= Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "script");
-                    if (!Directory.Exists(scriptPath)) 
+                    string scriptPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "script");
+                    if (!Directory.Exists(scriptPath))
                     {
                         Directory.CreateDirectory(scriptPath);
                     }
@@ -150,12 +188,14 @@ namespace IES.ExamServer.Services
                     {
                         code_zip = 200;
                         sb.Append(res.msg);
-                        
+                        zip_msg = res.msg;
+
                     }
                     else
                     {
                         code_zip = 400;
                         sb.Append("脚本文件创建异常!");
+                        zip_msg = res.msg;
                     }
                     serverDevice!.networks.ForEach(x =>
                     {
@@ -163,8 +203,8 @@ namespace IES.ExamServer.Services
                         x.batscriptZip = null;
                         if (x.id!.Equals(primaryNetwork.id))
                         {
-                            x.primary = code_hosts ==200? 1:0;
-                            x.batscriptZip = res.res? "script/student_script.zip" : null;
+                            x.primary = code_hosts == 200 ? 1 : 0;
+                            x.batscriptZip = res.res ? "script/student_script.zip" : null;
                         }
                     });
                     //更新设备的主站设备信息
@@ -178,14 +218,18 @@ namespace IES.ExamServer.Services
                     code = 200;
                     sb.Append("证书安装成功,域名IP绑定成功,脚本文件创建成功!");
                 }
+                else {
+                    hosts_msg = $"未匹配到可用网卡和IP";
+                    code_hosts = 400;
+                }
             }
             catch (Exception ex)
             {
                 code = 500;
                 //_logger.LogError($"域名IP绑定错误。{ex.Message},{ex.StackTrace}");
-                return (500,code_cer,code_hosts,code_zip, $"域名IP绑定错误,{ex.Message},{ex.StackTrace}");
+                return (500,code_cer,code_hosts,code_zip, $"域名IP绑定错误,{ex.Message},{ex.StackTrace}",hosts_msg,cer_msg,zip_msg, primaryNetwork);
             }
-            return (code, code_cer, code_hosts, code_zip, sb.ToString());
+            return (code, code_cer, code_hosts, code_zip, sb.ToString(), hosts_msg, cer_msg, zip_msg, primaryNetwork);
         }
 
 

+ 11 - 10
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Services/ManageService.cs

@@ -278,7 +278,7 @@ namespace IES.ExamServer.Services
         /// <param name="_liteDBFactory"></param>
         /// <returns></returns>
         public async static Task<(List<string> successMsgs, List<string> errorMsgs)> CheckFile(EvaluationClient evaluationLocal, List<string> successMsgs,List<string> errorMsgs, IHubContext<SignalRExamServerHub> _signalRExamServerHub, 
-            IMemoryCache _memoryCache, ILogger _logger, string deviceId,string evaluationPath,string grant_type)
+            IMemoryCache _memoryCache, ILogger _logger, string deviceId,string evaluationPath,string grant_type,int step=0)
         {
            
         
@@ -306,7 +306,7 @@ namespace IES.ExamServer.Services
                     
                 }
                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                    new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测名单文件(groupList.json)" }, true);
+                    new MessageContent { step=step, dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测名单文件(groupList.json)" }, true);
                 content = msg_status.Equals(Constant._Message_status_success) ? "成功" : "失败";
                 if (msg_status.Equals(Constant._Message_status_success)|| msg_status.Equals(Constant._Message_status_info))
                 {
@@ -363,7 +363,7 @@ namespace IES.ExamServer.Services
                     //数据格式:  [检查][成功/失败][15:43]=>[评测数据文件:/wwwroot/package/623a9fe6-5445-0938-ff77-aeb80066ef27/evaluation.json]
                     //数据格式:  [下载][成功/失败][15:43]=>[评测数据文件:/wwwroot/package/623a9fe6-5445-0938-ff77-aeb80066ef27/evaluation.json][1024kb][15ms]
                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                        new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测数据文件(evaluation.json)" }, true);
+                        new MessageContent { step = step, dataId =evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测数据文件(evaluation.json)" }, true);
                     content = msg_status.Equals(Constant._Message_status_success) ? "成功" : "失败";
                     if (msg_status.Equals(Constant._Message_status_success)|| msg_status.Equals(Constant._Message_status_info))
                     {
@@ -383,7 +383,7 @@ namespace IES.ExamServer.Services
                            
                             msg_status=Constant._Message_status_error;
                             await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                                new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测数据文件(evaluation.json),文件读取失败!" }, true);
+                                new MessageContent { step = step, dataId =evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测数据文件(evaluation.json),文件读取失败!" }, true);
                             errorMsgs.Add("评测数据文件(evaluation.json),文件读取失败!");
                         }
                         else
@@ -394,7 +394,7 @@ namespace IES.ExamServer.Services
                                
                                 
                                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                                    new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content="评测数据文件(evaluation.json),读取评测基本信息..." }, true);
+                                    new MessageContent { step = step, dataId =evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content="评测数据文件(evaluation.json),读取评测基本信息..." }, true);
                                 successMsgs.Add($"评测数据文件(evaluation.json),读取评测基本信息...");
                                 if (!string.IsNullOrWhiteSpace(evaluationLocal.blobHash) && evaluationLocal.blobHash.Equals(evaluationClient.blobHash)
                                     &&(evaluationLocal.blobTime==evaluationClient.blobTime)
@@ -412,7 +412,7 @@ namespace IES.ExamServer.Services
                                 }
 
                                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                                    new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content="评测数据文件(evaluation.json),校验评测基本信息..." }, true);
+                                    new MessageContent { step = step, dataId =evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content="评测数据文件(evaluation.json),校验评测基本信息..." }, true);
                                 content = msg_status.Equals(Constant._Message_status_success)||msg_status.Equals(Constant._Message_status_info) ? "成功" : "失败";
                                 if (msg_status.Equals(Constant._Message_status_success)|| msg_status.Equals(Constant._Message_status_info))
                                 {
@@ -429,7 +429,7 @@ namespace IES.ExamServer.Services
                                
                                 msg_status=Constant._Message_status_error;
                                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                                new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测数据文件(evaluation.json),读取评测基本信息失败!" }, true);
+                                new MessageContent { step = step, dataId =evaluationLocal.id, dataName=evaluationLocal.name, messageType= Constant._Message_type_check, status=msg_status, content="评测数据文件(evaluation.json),读取评测基本信息失败!" }, true);
                                 errorMsgs.Add("评测数据文件(evaluation.json),读取评测基本信息失败!");
                             }
 
@@ -446,14 +446,14 @@ namespace IES.ExamServer.Services
                             {
                                 msg_status=Constant._Message_status_info;
                                 await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                                    new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content="评测数据文件(evaluation.json),读取评测试卷信息..." }, true);
+                                    new MessageContent { step = step, dataId =evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content="评测数据文件(evaluation.json),读取评测试卷信息..." }, true);
                                 successMsgs.Add($"评测数据文件(evaluation.json),读取评测试卷信息...");
                                 string pattern = @"paper/[^/]+/([^/]+/[^/]+\.[^/]+)";
                                 foreach (var evaluationExam in evaluationExams!)
                                 {
                                     msg_status=Constant._Message_status_info;
                                     await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
-                                        new MessageContent { dataId=evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content=$"校验评测科目试卷:{evaluationExam.subjectName}-{evaluationExam.examName}" }, true);
+                                        new MessageContent { step = step, dataId =evaluationLocal.id, dataName=evaluationLocal.name, messageType=Constant._Message_type_message, status=msg_status, content=$"校验评测科目试卷:{evaluationExam.subjectName}-{evaluationExam.examName}" }, true);
                                     successMsgs.Add($"校验评测科目试卷:{evaluationExam.subjectName}-{evaluationExam.examName}");
                                     string path_papers = Path.Combine(evaluationPath, "papers");
                                     var papers_files = FileHelper.ListAllFiles(path_papers);
@@ -531,7 +531,8 @@ namespace IES.ExamServer.Services
                                         await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, grant_type,
                                             new MessageContent
                                             {
-                                                dataId=evaluationLocal.id,
+                                                step = step,
+                                                dataId =evaluationLocal.id,
                                                 dataName=evaluationLocal.name,
                                                 messageType=Constant._Message_type_message,
                                                 status=paper_msg_status,