mirror of
https://gitee.com/dolphinscheduler/DolphinScheduler.git
synced 2024-12-02 12:17:43 +08:00
Set tenantDir permission (#12486)
This commit is contained in:
parent
dedff70f90
commit
a0d37fc7ae
@ -88,23 +88,29 @@ public class FileUtils {
|
|||||||
/**
|
/**
|
||||||
* directory of process execution
|
* directory of process execution
|
||||||
*
|
*
|
||||||
* @param projectCode project code
|
* @param tenant tenant
|
||||||
* @param processDefineCode process definition Code
|
* @param projectCode project code
|
||||||
|
* @param processDefineCode process definition Code
|
||||||
* @param processDefineVersion process definition version
|
* @param processDefineVersion process definition version
|
||||||
* @param processInstanceId process instance id
|
* @param processInstanceId process instance id
|
||||||
* @param taskInstanceId task instance id
|
* @param taskInstanceId task instance id
|
||||||
* @return directory of process execution
|
* @return directory of process execution
|
||||||
*/
|
*/
|
||||||
public static String getProcessExecDir(long projectCode, long processDefineCode, int processDefineVersion,
|
public static String getProcessExecDir(String tenant,
|
||||||
int processInstanceId, int taskInstanceId) {
|
long projectCode,
|
||||||
String fileName = String.format("%s/exec/process/%d/%s/%d/%d", DATA_BASEDIR,
|
long processDefineCode,
|
||||||
projectCode, processDefineCode + "_" + processDefineVersion, processInstanceId, taskInstanceId);
|
int processDefineVersion,
|
||||||
File file = new File(fileName);
|
int processInstanceId,
|
||||||
if (!file.getParentFile().exists()) {
|
int taskInstanceId) {
|
||||||
file.getParentFile().mkdirs();
|
return String.format(
|
||||||
}
|
"%s/exec/process/%s/%d/%d_%d/%d/%d",
|
||||||
|
DATA_BASEDIR,
|
||||||
return fileName;
|
tenant,
|
||||||
|
projectCode,
|
||||||
|
processDefineCode,
|
||||||
|
processDefineVersion,
|
||||||
|
processInstanceId,
|
||||||
|
taskInstanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,8 +51,8 @@ public class FileUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessExecDir() {
|
public void testGetProcessExecDir() {
|
||||||
String dir = FileUtils.getProcessExecDir(1L, 2L, 1, 3, 4);
|
String dir = FileUtils.getProcessExecDir("test", 1L, 2L, 1, 3, 4);
|
||||||
Assertions.assertEquals("/tmp/dolphinscheduler/exec/process/1/2_1/3/4", dir);
|
Assertions.assertEquals("/tmp/dolphinscheduler/exec/process/test/1/2_1/3/4", dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -204,7 +204,9 @@ public class ProcessUtils {
|
|||||||
if (CollectionUtils.isNotEmpty(appIds)) {
|
if (CollectionUtils.isNotEmpty(appIds)) {
|
||||||
if (StringUtils.isEmpty(taskExecutionContext.getExecutePath())) {
|
if (StringUtils.isEmpty(taskExecutionContext.getExecutePath())) {
|
||||||
taskExecutionContext
|
taskExecutionContext
|
||||||
.setExecutePath(FileUtils.getProcessExecDir(taskExecutionContext.getProjectCode(),
|
.setExecutePath(FileUtils.getProcessExecDir(
|
||||||
|
taskExecutionContext.getTenantCode(),
|
||||||
|
taskExecutionContext.getProjectCode(),
|
||||||
taskExecutionContext.getProcessDefineCode(),
|
taskExecutionContext.getProcessDefineCode(),
|
||||||
taskExecutionContext.getProcessDefineVersion(),
|
taskExecutionContext.getProcessDefineVersion(),
|
||||||
taskExecutionContext.getProcessInstanceId(),
|
taskExecutionContext.getProcessInstanceId(),
|
||||||
|
@ -33,8 +33,13 @@ import org.apache.commons.lang3.SystemUtils;
|
|||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.FileSystems;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.attribute.UserPrincipal;
|
||||||
|
import java.nio.file.attribute.UserPrincipalLookupService;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -45,23 +50,24 @@ public class TaskExecutionCheckerUtils {
|
|||||||
|
|
||||||
public static void checkTenantExist(WorkerConfig workerConfig, TaskExecutionContext taskExecutionContext) {
|
public static void checkTenantExist(WorkerConfig workerConfig, TaskExecutionContext taskExecutionContext) {
|
||||||
try {
|
try {
|
||||||
|
String tenantCode = taskExecutionContext.getTenantCode();
|
||||||
boolean osUserExistFlag;
|
boolean osUserExistFlag;
|
||||||
// if Using distributed is true and Currently supported systems are linux,Should not let it
|
// if Using distributed is true and Currently supported systems are linux,Should not let it
|
||||||
// automatically
|
// automatically
|
||||||
// create tenants,so TenantAutoCreate has no effect
|
// create tenants,so TenantAutoCreate has no effect
|
||||||
if (workerConfig.isTenantDistributedUser() && SystemUtils.IS_OS_LINUX) {
|
if (workerConfig.isTenantDistributedUser() && SystemUtils.IS_OS_LINUX) {
|
||||||
// use the id command to judge in linux
|
// use the id command to judge in linux
|
||||||
osUserExistFlag = OSUtils.existTenantCodeInLinux(taskExecutionContext.getTenantCode());
|
osUserExistFlag = OSUtils.existTenantCodeInLinux(tenantCode);
|
||||||
} else if (OSUtils.isSudoEnable() && workerConfig.isTenantAutoCreate()) {
|
} else if (OSUtils.isSudoEnable() && workerConfig.isTenantAutoCreate()) {
|
||||||
// if not exists this user, then create
|
// if not exists this user, then create
|
||||||
OSUtils.createUserIfAbsent(taskExecutionContext.getTenantCode());
|
OSUtils.createUserIfAbsent(tenantCode);
|
||||||
osUserExistFlag = OSUtils.getUserList().contains(taskExecutionContext.getTenantCode());
|
osUserExistFlag = OSUtils.getUserList().contains(tenantCode);
|
||||||
} else {
|
} else {
|
||||||
osUserExistFlag = OSUtils.getUserList().contains(taskExecutionContext.getTenantCode());
|
osUserExistFlag = OSUtils.getUserList().contains(tenantCode);
|
||||||
}
|
}
|
||||||
if (!osUserExistFlag) {
|
if (!osUserExistFlag) {
|
||||||
throw new TaskException(
|
throw new TaskException(
|
||||||
String.format("TenantCode: %s doesn't exist", taskExecutionContext.getTenantCode()));
|
String.format("TenantCode: %s doesn't exist", tenantCode));
|
||||||
}
|
}
|
||||||
} catch (TaskException ex) {
|
} catch (TaskException ex) {
|
||||||
throw ex;
|
throw ex;
|
||||||
@ -75,13 +81,14 @@ public class TaskExecutionCheckerUtils {
|
|||||||
try {
|
try {
|
||||||
// local execute path
|
// local execute path
|
||||||
String execLocalPath = FileUtils.getProcessExecDir(
|
String execLocalPath = FileUtils.getProcessExecDir(
|
||||||
|
taskExecutionContext.getTenantCode(),
|
||||||
taskExecutionContext.getProjectCode(),
|
taskExecutionContext.getProjectCode(),
|
||||||
taskExecutionContext.getProcessDefineCode(),
|
taskExecutionContext.getProcessDefineCode(),
|
||||||
taskExecutionContext.getProcessDefineVersion(),
|
taskExecutionContext.getProcessDefineVersion(),
|
||||||
taskExecutionContext.getProcessInstanceId(),
|
taskExecutionContext.getProcessInstanceId(),
|
||||||
taskExecutionContext.getTaskInstanceId());
|
taskExecutionContext.getTaskInstanceId());
|
||||||
taskExecutionContext.setExecutePath(execLocalPath);
|
taskExecutionContext.setExecutePath(execLocalPath);
|
||||||
FileUtils.createWorkDirIfAbsent(execLocalPath);
|
createDirectoryWithOwner(Paths.get(execLocalPath), taskExecutionContext.getTenantCode());
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
throw new TaskException("Cannot create process execute dir", ex);
|
throw new TaskException("Cannot create process execute dir", ex);
|
||||||
}
|
}
|
||||||
@ -131,4 +138,23 @@ public class TaskExecutionCheckerUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void createDirectoryWithOwner(Path filePath, String tenant) {
|
||||||
|
if (Files.exists(filePath)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Files.createDirectories(filePath);
|
||||||
|
if (!OSUtils.isSudoEnable()) {
|
||||||
|
// we need to open sudo, then we can change the owner.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
UserPrincipalLookupService userPrincipalLookupService =
|
||||||
|
FileSystems.getDefault().getUserPrincipalLookupService();
|
||||||
|
UserPrincipal tenantPrincipal = userPrincipalLookupService.lookupPrincipalByName(tenant);
|
||||||
|
Files.setOwner(filePath, tenantPrincipal);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new TaskException("Set tenant directory permission failed, tenant: " + tenant, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user