sftp 无权限问题修复
This commit is contained in:
parent
558f4d346d
commit
7a2fa73974
@ -13,6 +13,7 @@ public class ShuiMuUrlConstant {
|
||||
public static final String getProjectVersion = "/api/project/code/getProjectVersion";
|
||||
public static final String buildAndSaveConfig = "/api/driverGeneration/buildAndSaveConfig";
|
||||
public static final String getProjectById = "/api/project/";
|
||||
public static final String getProjectResource = "/api/project/getProjectResource";
|
||||
public static final String uploadWfuzzJson = "/api/project/code/uploadWfuzzJson";
|
||||
public static final String executeAllEntrypointsTest ="/api/driverGeneration/executeAllEntrypointsTest";
|
||||
}
|
||||
|
@ -0,0 +1,16 @@
|
||||
package cd.casic.ci.process.dto.resp.shuimu;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ShuiMuProjectResourceResp {
|
||||
private Integer projectId;
|
||||
private Integer workspaceResource;
|
||||
private Integer buildResource;
|
||||
private Integer testResource;
|
||||
private Integer queueResource;
|
||||
private Integer finishResource;
|
||||
private Integer problemCount;
|
||||
private Double coverage;
|
||||
|
||||
}
|
@ -1,12 +1,14 @@
|
||||
package cd.casic.ci.process.engine.worker.shuimu;
|
||||
|
||||
import cd.casic.ci.process.common.WorkAtom;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp;
|
||||
import cd.casic.ci.process.engine.constant.ShuiMuConstant;
|
||||
import cd.casic.ci.process.engine.runContext.TaskRunContext;
|
||||
import cd.casic.ci.process.engine.worker.base.BaseWorker;
|
||||
import cd.casic.ci.process.engine.worker.base.SshWorker;
|
||||
import cd.casic.ci.process.process.dataObject.task.PipTask;
|
||||
import cd.casic.ci.process.process.service.shuimu.ShuiMuService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@ -27,5 +29,15 @@ public class ShuiMuWorker extends BaseWorker {
|
||||
String projectId = (String)taskProperties.get(ShuiMuConstant.SHUI_MU_PROJECT_ID_KEY);
|
||||
Integer fuzzMinutes = Integer.parseInt(String.valueOf(taskProperties.get(ShuiMuConstant.SHUI_MU_FUZZ_MINUTES)));
|
||||
shuiMuService.executeAllEntrypointsTest(projectId,fuzzMinutes);
|
||||
append(context,"水木模糊测试开始执行");
|
||||
while (true){
|
||||
ShuiMuProjectResourceResp projectResource = shuiMuService.getProjectResource(projectId);
|
||||
append(context,"当前执行情况:");
|
||||
append(context, JSON.toJSONString(projectResource));
|
||||
if (projectResource.getTestResource()==0) {
|
||||
append(context,"水木模糊测试执行完毕");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import cd.casic.ci.process.dto.req.shuimu.ShuiMuBuildAndSaveReq;
|
||||
import cd.casic.ci.process.dto.req.shuimu.ShuiMuProjectCreateReq;
|
||||
import cd.casic.ci.process.dto.req.shuimu.ShuiMuUpdateWFuzzJsonReq;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectInfoResp;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectVersionResp;
|
||||
|
||||
import java.util.List;
|
||||
@ -30,4 +31,5 @@ public interface ShuiMuService {
|
||||
void buildAndSaveConfig(ShuiMuBuildAndSaveReq req);
|
||||
void uploadWfuzzJson(ShuiMuUpdateWFuzzJsonReq req);
|
||||
void executeAllEntrypointsTest(String projectId,Integer fuzzMinutes);
|
||||
ShuiMuProjectResourceResp getProjectResource (String projectId);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import cd.casic.ci.process.dto.req.shuimu.ShuiMuBuildAndSaveReq;
|
||||
import cd.casic.ci.process.dto.req.shuimu.ShuiMuProjectCreateReq;
|
||||
import cd.casic.ci.process.dto.req.shuimu.ShuiMuUpdateWFuzzJsonReq;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectInfoResp;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectVersionResp;
|
||||
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuTokenResp;
|
||||
import cd.casic.ci.process.engine.manager.RunContextManager;
|
||||
@ -31,6 +32,8 @@ import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
|
||||
import static cd.casic.ci.process.constant.ShuiMuUrlConstant.*;
|
||||
@ -191,7 +194,9 @@ public class ShuiMuServiceImpl implements ShuiMuService {
|
||||
body.add("projectId",req.getProjectId());
|
||||
body.add("env",req.getEnv());
|
||||
body.add("fileName",req.getFileName());
|
||||
HttpEntity<MultiValueMap<String,String>> entity = new HttpEntity<>(body,getHeaders());
|
||||
HttpHeaders headers = getHeaders();
|
||||
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
||||
HttpEntity<MultiValueMap<String,String>> entity = new HttpEntity<>(body, headers);
|
||||
ResponseEntity<String> exchange = restTemplate.exchange(shuiMuProperties.getBaseUrl() + buildAndSaveConfig, HttpMethod.POST, entity, String.class, new HashMap<>());
|
||||
if (exchange.getStatusCode().isError()) {
|
||||
throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"保存并且构建失败");
|
||||
@ -207,16 +212,23 @@ public class ShuiMuServiceImpl implements ShuiMuService {
|
||||
restReq.put("product",projectInfo.getProduct());
|
||||
restReq.put("language",projectInfo.getLanguage());
|
||||
restReq.put("build",req.getBuild());
|
||||
ByteArrayOutputStream bis = new ByteArrayOutputStream();
|
||||
String tempDir = System.getProperty("java.io.tmpdir");
|
||||
|
||||
File tempFile = new File(tempDir,"wfuzz.json");
|
||||
|
||||
|
||||
try {
|
||||
ObjectOutputStream oos =new ObjectOutputStream(bis);
|
||||
oos.writeObject(restReq);
|
||||
File tempFile = File.createTempFile(UUID.randomUUID().toString().replaceAll("-", ""), "");
|
||||
FileOutputStream fos = new FileOutputStream(tempFile);
|
||||
fos.write(JSON.toJSONString(restReq).getBytes());
|
||||
fos.flush();
|
||||
tempFile.setReadable(true,false);
|
||||
FileSystemResource resource = new FileSystemResource(tempFile);
|
||||
MultiValueMap<String,Object> body = new LinkedMultiValueMap<>();
|
||||
body.add("projectId",req.getProjectId());
|
||||
body.add("file",resource);
|
||||
HttpEntity<MultiValueMap<String,Object>> entity = new HttpEntity<>(body,getHeaders());
|
||||
HttpHeaders headers = getHeaders();
|
||||
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
||||
HttpEntity<MultiValueMap<String,Object>> entity = new HttpEntity<>(body, headers);
|
||||
ResponseEntity<String> exchange = restTemplate.exchange(shuiMuProperties.getBaseUrl() + uploadWfuzzJson, HttpMethod.POST, entity, String.class, new HashMap<>());
|
||||
if (exchange.getStatusCode().isError()) {
|
||||
throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"更新配置文件失败");
|
||||
@ -230,6 +242,8 @@ public class ShuiMuServiceImpl implements ShuiMuService {
|
||||
ShuiMuProjectVersionResp.Repo repo = projectVersion.getRepo();
|
||||
ShuiMuBuildAndSaveReq shuiMuBuildAndSaveReq = new ShuiMuBuildAndSaveReq();
|
||||
BeanUtils.copyProperties(repo,shuiMuBuildAndSaveReq);
|
||||
shuiMuBuildAndSaveReq.setProjectId(req.getProjectId());
|
||||
shuiMuBuildAndSaveReq.setFileName(repo.getFilename());
|
||||
buildAndSaveConfig(shuiMuBuildAndSaveReq);
|
||||
}
|
||||
|
||||
@ -247,7 +261,24 @@ public class ShuiMuServiceImpl implements ShuiMuService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShuiMuProjectResourceResp getProjectResource (String projectId) {
|
||||
HttpEntity<String> entity = new HttpEntity<>(null,getHeaders());
|
||||
String uriString = UriComponentsBuilder.fromUriString(shuiMuProperties.getBaseUrl() + getProjectResource ).queryParam("projectId",projectId)
|
||||
.toUriString();
|
||||
ResponseEntity<String> exchange = restTemplate.exchange(uriString, HttpMethod.GET, entity, String.class, new HashMap<>());
|
||||
if (exchange.getStatusCode().isError()) {
|
||||
throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"获取项目执行信息失败");
|
||||
}
|
||||
String data = JSON.parseObject(exchange.getBody()).getString("data");
|
||||
try {
|
||||
List<ShuiMuProjectResourceResp> shuiMuProjectResourceResps = JSONArray.parseArray(data, ShuiMuProjectResourceResp.class);
|
||||
|
||||
return shuiMuProjectResourceResps.get(0);
|
||||
} catch (Exception e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
private HttpHeaders getHeaders(){
|
||||
HttpHeaders httpHeaders = new HttpHeaders();
|
||||
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
|
||||
|
@ -7,6 +7,7 @@ import com.amazonaws.util.IOUtils;
|
||||
import com.jcraft.jsch.*;
|
||||
import jakarta.servlet.ServletOutputStream;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@ -14,7 +15,7 @@ import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
import static com.fhs.common.utils.StringUtil.trim;
|
||||
|
||||
@Slf4j
|
||||
public class SftpUploadUtil {
|
||||
|
||||
private static final int DEFAULT_SFTP_PORT = 22;
|
||||
@ -584,8 +585,10 @@ public class SftpUploadUtil {
|
||||
// 获取远程文件名和目录
|
||||
String remoteDir = remoteFilePath.substring(0, remoteFilePath.lastIndexOf('/'));
|
||||
String fileName = remoteFilePath.substring(remoteFilePath.lastIndexOf('/') + 1);
|
||||
|
||||
String chmodDir = remoteFilePath.substring(0, remoteFilePath.indexOf("default"));
|
||||
log.info("分配权限路径,{}",chmodDir);
|
||||
// 切换目录并列出内容用于调试
|
||||
sudoChmodORwx(session,chmodDir,password);
|
||||
try {
|
||||
channelSftp.cd(remoteDir);
|
||||
} catch (SftpException e) {
|
||||
@ -1471,7 +1474,41 @@ public class SftpUploadUtil {
|
||||
}
|
||||
|
||||
|
||||
public static void sudoChmodORwx(Session session, String remotePath, String sudoPassword) throws Exception {
|
||||
String command = "sudo -S chmod -R o+rwx " + remotePath;
|
||||
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
|
||||
channelExec.setCommand(command);
|
||||
|
||||
OutputStream out = channelExec.getOutputStream();
|
||||
InputStream in = channelExec.getInputStream();
|
||||
channelExec.setErrStream(System.err);
|
||||
|
||||
channelExec.connect();
|
||||
|
||||
// 写入sudo密码
|
||||
out.write((sudoPassword + "\n").getBytes());
|
||||
out.flush();
|
||||
|
||||
// 读取命令输出
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
System.out.println(line);
|
||||
}
|
||||
|
||||
// 等待命令执行完成
|
||||
while (!channelExec.isClosed()) {
|
||||
Thread.sleep(100);
|
||||
}
|
||||
int exitStatus = channelExec.getExitStatus();
|
||||
channelExec.disconnect();
|
||||
|
||||
if (exitStatus != 0) {
|
||||
throw new RuntimeException("sudo chmod 执行失败,退出码: " + exitStatus);
|
||||
} else {
|
||||
System.out.println("sudo chmod -R o+rwx 执行成功!");
|
||||
}
|
||||
}
|
||||
private static boolean thisDirectory(ChannelSftp channelSftp, String fullPath) {
|
||||
try {
|
||||
SftpATTRS attrs = channelSftp.lstat(fullPath);
|
||||
|
@ -2,10 +2,19 @@ package cd.casic.server;
|
||||
|
||||
import cd.casic.ci.process.engine.manager.LoggerManager;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.hc.client5.http.classic.methods.HttpGet;
|
||||
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
|
||||
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
|
||||
import org.apache.hc.client5.http.impl.classic.HttpClients;
|
||||
import org.apache.hc.core5.http.HttpResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
@SpringBootTest(classes = {OpsServerApplication.class})
|
||||
@ActiveProfiles("local")
|
||||
public class SSETest {
|
||||
@ -15,5 +24,22 @@ public class SSETest {
|
||||
public void subscribe(){
|
||||
loggerManager.subscribe("716299524330622976",null);
|
||||
}
|
||||
@Test
|
||||
public void shuimuSSE() throws IOException {
|
||||
try (CloseableHttpClient client = HttpClients.createDefault()) {
|
||||
HttpGet request = new HttpGet("http://175.6.27.155:10200/api/driverGeneration/progress?uuid=6");
|
||||
request.addHeader("Accept", "text/event-stream");
|
||||
request.addHeader("Authorization", "Bearer xj76K1VJBMrKnCXAzTdPJUCp4B4");
|
||||
|
||||
try (CloseableHttpResponse response = client.execute(request)) {
|
||||
BufferedReader reader = new BufferedReader(
|
||||
new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
System.out.println("收到: " + line);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class SftpTest {
|
||||
}
|
||||
@Test
|
||||
public void ssh(){
|
||||
System.out.println(CryptogramUtil.doDecrypt("cf917c4ff8463a54df75120e2ff802e8"));
|
||||
System.out.println(CryptogramUtil.doDecrypt("b44a50e0cfb98f81c8c003330780c835923c2e5caa1738d61e27ee541be54e2e"));
|
||||
}
|
||||
@Test
|
||||
public void getFileList(){
|
||||
@ -68,4 +68,8 @@ public class SftpTest {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@Test
|
||||
public void test00(){
|
||||
System.out.println("{\"code\":0,\"message\":\"OK\",\"data\":\"锟斤拷\\u0000\\u0005t\\u0000锟絳\\\"product\\\":\\\"code\\\",\\\"build\\\":\\\"{\\\\\\\"helper\\\\\\\":\\\\\\\"jar-analyzer\\\\\\\",\\\\\\\"config\\\\\\\":{\\\\\\\"root\\\\\\\":\\\\\\\"./test-1.0.jar\\\\\\\"}}\\\",\\\"project\\\":\\\"搴旂敤妫€娴媉76ce2c9dab224d8cbc79821bcc85b61b\\\",\\\"language\\\":\\\"java\\\"}\"}");
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user