diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java index 4ee6d28e3291..e74157f93aec 100644 --- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java +++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java @@ -276,13 +276,24 @@ public CreateEntityDownloadURLAnswer handleCreateEntityURLCommand(CreateEntityDo // Create the directory structure so that its visible under apache server root String extractDir = BASE_EXTRACT_PATH; extractDir = extractDir + cmd.getFilepathInExtractURL() + File.separator; + // Ensure the base extract directory exists and is owned by www-data so that + // the www-data user can create the per-entity subdirectory inside it. + Script baseDirCommand = new Script("/bin/bash", logger); + baseDirCommand.add("-c"); + baseDirCommand.add("mkdir -p " + BASE_EXTRACT_PATH + " && chown www-data:www-data " + BASE_EXTRACT_PATH); + String result = baseDirCommand.execute(); + if (result != null) { + String errorString = "Error in creating base extract directory =" + result; + logger.error(errorString); + return new CreateEntityDownloadURLAnswer(errorString, CreateEntityDownloadURLAnswer.RESULT_FAILURE); + } Script command = new Script("/bin/su", logger); command.add("-s"); command.add("/bin/bash"); command.add("-c"); command.add("mkdir -p " + extractDir); command.add("www-data"); - String result = command.execute(); + result = command.execute(); if (result != null) { String errorString = "Error in creating directory =" + result; logger.error(errorString);