package net.educoder.schedule; import cn.hutool.core.util.RandomUtil; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import net.educoder.config.PropertiesConfig; import net.educoder.model.AutoEvaParamConfig; import net.educoder.service.AutoEvaParamConfigService; import net.educoder.util.SignatureUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; /** * @Author: youys * @Date: 2022/4/2 * @Description: 评测检查告警任务. */ @Slf4j @Component public class EvaCheckWarningTask { @Autowired private PropertiesConfig propertiesConfig; @Autowired private AutoEvaParamConfigService autoEvaParamConfigService; @Value("${bridge.sign.accessKeySecret}") private String accessKeySecret; @Async @Scheduled(cron = "${task.cron.evalCheck}") public void check() { log.info("自动化评测接口告警检查---------start "); long startTime = System.currentTimeMillis(); List autoEvaParamConfigList = autoEvaParamConfigService.findAll(); log.info("自动化评测接口告警检查,总共有[{}]条需要评测", autoEvaParamConfigList.size()); for (AutoEvaParamConfig autoEvaParamConfig : autoEvaParamConfigList) { try { if (autoEvaParamConfig.getType().equals(AutoEvaParamConfig.SX_EVA)) { String extras = autoEvaParamConfig.getExtras(); if (!StringUtils.hasLength(extras)) { continue; } postEvaluation(autoEvaParamConfig); } else if (autoEvaParamConfig.getType().equals(AutoEvaParamConfig.OJ_EVA)) { if (!StringUtils.hasLength(autoEvaParamConfig.getCodeFileContent())) { continue; } postOjEvaluation(autoEvaParamConfig); } } catch (Exception e) { log.error("自动化评测接口告警检查任务异常", e); } } log.info("自动化评测接口告警检查 ---------end ,总耗时:{}ms", (System.currentTimeMillis() - startTime)); } /** * 处理实训评测. * * @param autoEvaParamConfig 配置 */ private void postEvaluation(AutoEvaParamConfig autoEvaParamConfig) { JSONObject extrasObject = JSONObject.parseObject(autoEvaParamConfig.getExtras()); Map param = new HashMap<>(32); param.put("isPublished", extrasObject.getInteger("isPublished")); param.put("trimBlank", extrasObject.getInteger("trimBlank")); param.put("containers", extrasObject.getString("containers")); param.put("instanceChallenge", extrasObject.getString("instanceChallenge")); param.put("tpmScript", extrasObject.getString("tpmScript")); param.put("timeLimit", extrasObject.getInteger("timeLimit")); param.put("times", extrasObject.getInteger("times")); param.put("resubmit", extrasObject.getInteger("resubmit")); param.put("podType", extrasObject.getInteger("podType")); param.put("content_modified", extrasObject.getInteger("content_modified")); param.put("tpiID", autoEvaParamConfig.getTpiId()); param.put("testCases", autoEvaParamConfig.getTestCases()); param.put("tpiGitURL", autoEvaParamConfig.getTpiGitUrl()); param.put("buildID", autoEvaParamConfig.getBuildId()); param.put("sec_key", UUID.randomUUID().toString()); param.put("callBackUrl", propertiesConfig.getCallbackUrl()); param.put("ak", RandomUtil.randomString(16)); param.put("nonce", RandomUtil.randomString(16)); String sign = SignatureUtil.genSignature(accessKeySecret, param); log.info("postEvaluation---------签名值sign:{}", sign); param.put("sign", sign); String result = HttpUtil.post(propertiesConfig.getGameEvaluationUrl(), param); JSONObject jsonResult = JSONObject.parseObject(result); log.info("实训评测接口返回:{},tpiId:{}", jsonResult, autoEvaParamConfig.getTpiId()); } /** * 处理oj评测. * * @param autoEvaParamConfig 配置 */ private void postOjEvaluation(AutoEvaParamConfig autoEvaParamConfig) { Map param = new HashMap<>(16); param.put("tpiID", autoEvaParamConfig.getTpiId()); param.put("testCases", autoEvaParamConfig.getTestCases()); param.put("codeFileContent", autoEvaParamConfig.getCodeFileContent()); param.put("sec_key", UUID.randomUUID().toString()); param.put("callBackUrl", propertiesConfig.getCallbackUrl()); param.put("ak", RandomUtil.randomString(16)); param.put("nonce", RandomUtil.randomString(16)); String sign = SignatureUtil.genSignature(accessKeySecret, param); log.info("postEvaluation---------签名值:{}", sign); param.put("sign", sign); String result = HttpUtil.post(propertiesConfig.getOjEvaluationUrl(), param); JSONObject jsonResult = JSONObject.parseObject(result); log.info("Oj评测接口返回:{},tpiId:{}", jsonResult, autoEvaParamConfig.getTpiId()); } }