|
2 | 2 |
|
3 | 3 | import static datadog.crashtracking.ConfigManager.writeConfigToPath; |
4 | 4 | import static datadog.crashtracking.Initializer.LOG; |
5 | | -import static datadog.crashtracking.Initializer.RWXRWXRWX; |
6 | | -import static datadog.crashtracking.Initializer.R_XR_XR_X; |
7 | 5 | import static datadog.crashtracking.Initializer.findAgentJar; |
8 | 6 | import static datadog.crashtracking.Initializer.getCrashUploaderTemplate; |
9 | 7 | import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; |
10 | | -import static java.nio.file.attribute.PosixFilePermissions.asFileAttribute; |
11 | | -import static java.nio.file.attribute.PosixFilePermissions.fromString; |
12 | 8 | import static java.util.Locale.ROOT; |
13 | 9 |
|
14 | 10 | import datadog.environment.SystemProperties; |
15 | 11 | import datadog.trace.util.PidHelper; |
16 | 12 | import datadog.trace.util.Strings; |
17 | 13 | import java.io.BufferedReader; |
18 | 14 | import java.io.BufferedWriter; |
| 15 | +import java.io.File; |
| 16 | +import java.io.FileOutputStream; |
19 | 17 | import java.io.IOException; |
20 | 18 | import java.io.InputStream; |
21 | 19 | import java.io.InputStreamReader; |
22 | | -import java.nio.file.FileAlreadyExistsException; |
23 | | -import java.nio.file.Files; |
24 | | -import java.nio.file.Path; |
25 | | -import java.nio.file.Paths; |
| 20 | +import java.io.OutputStreamWriter; |
| 21 | +import java.nio.charset.StandardCharsets; |
26 | 22 |
|
27 | 23 | public final class CrashUploaderScriptInitializer { |
28 | 24 | private static final String SETUP_FAILURE_MESSAGE = "Crash tracking will not work properly."; |
@@ -54,71 +50,78 @@ static void initialize(String onErrorVal, String onErrorFile, String javacorePat |
54 | 50 | return; |
55 | 51 | } |
56 | 52 |
|
57 | | - Path scriptPath = Paths.get(onErrorVal.replace(" %p", "")); |
| 53 | + File scriptFile = new File(onErrorVal.replace(" %p", "")); |
58 | 54 | boolean isDDCrashUploader = |
59 | | - scriptPath.getFileName().toString().toLowerCase(ROOT).contains("dd_crash_uploader"); |
60 | | - if (isDDCrashUploader && !copyCrashUploaderScript(scriptPath, onErrorFile, agentJar)) { |
| 55 | + scriptFile.getName().toLowerCase(ROOT).contains("dd_crash_uploader"); |
| 56 | + if (isDDCrashUploader && !copyCrashUploaderScript(scriptFile, onErrorFile, agentJar)) { |
61 | 57 | return; |
62 | 58 | } |
63 | 59 |
|
64 | 60 | if (javacorePath != null && !javacorePath.isEmpty()) { |
65 | | - writeConfigToPath(scriptPath, "agent", agentJar, "javacore_path", javacorePath); |
| 61 | + writeConfigToPath(scriptFile, "agent", agentJar, "javacore_path", javacorePath); |
66 | 62 | } else { |
67 | | - writeConfigToPath(scriptPath, "agent", agentJar, "hs_err", onErrorFile); |
| 63 | + writeConfigToPath(scriptFile, "agent", agentJar, "hs_err", onErrorFile); |
68 | 64 | } |
69 | 65 | } |
70 | 66 |
|
71 | 67 | private static boolean copyCrashUploaderScript( |
72 | | - Path scriptPath, String onErrorFile, String agentJar) { |
73 | | - Path scriptDirectory = scriptPath.getParent(); |
74 | | - try { |
75 | | - Files.createDirectories(scriptDirectory, asFileAttribute(fromString(RWXRWXRWX))); |
76 | | - } catch (UnsupportedOperationException e) { |
77 | | - LOG.warn( |
78 | | - SEND_TELEMETRY, |
79 | | - "Unsupported permissions '" + RWXRWXRWX + "' for {}. " + SETUP_FAILURE_MESSAGE, |
80 | | - scriptDirectory); |
81 | | - return false; |
82 | | - } catch (FileAlreadyExistsException ignored) { |
83 | | - // can be safely ignored; if the folder exists we will just reuse it |
84 | | - if (!Files.isWritable(scriptDirectory)) { |
| 68 | + File scriptFile, String onErrorFile, String agentJar) { |
| 69 | + File scriptDirectory = scriptFile.getParentFile(); |
| 70 | + if (!scriptDirectory.exists()) { |
| 71 | + if (!scriptDirectory.mkdirs()) { |
85 | 72 | LOG.warn( |
86 | | - SEND_TELEMETRY, "Read only directory {}. " + SETUP_FAILURE_MESSAGE, scriptDirectory); |
| 73 | + SEND_TELEMETRY, |
| 74 | + "Failed to create writable crash tracking script folder {}. " + SETUP_FAILURE_MESSAGE, |
| 75 | + scriptDirectory); |
87 | 76 | return false; |
88 | 77 | } |
89 | | - } catch (IOException e) { |
90 | | - LOG.warn( |
91 | | - SEND_TELEMETRY, |
92 | | - "Failed to create writable crash tracking script folder {}. " + SETUP_FAILURE_MESSAGE, |
93 | | - scriptDirectory); |
| 78 | + boolean permissionFailure = false; |
| 79 | + permissionFailure |= !scriptDirectory.setReadable(true, false); |
| 80 | + permissionFailure |= !scriptDirectory.setWritable(true, false); |
| 81 | + permissionFailure |= !scriptDirectory.setExecutable(true, false); |
| 82 | + if (permissionFailure) { |
| 83 | + LOG.warn( |
| 84 | + SEND_TELEMETRY, |
| 85 | + "Failed to set permissions on crash tracking script folder {}. {}", |
| 86 | + scriptDirectory, |
| 87 | + SETUP_FAILURE_MESSAGE); |
| 88 | + } |
| 89 | + } |
| 90 | + if (!scriptDirectory.canWrite()) { |
| 91 | + LOG.warn(SEND_TELEMETRY, "Read only directory {}. " + SETUP_FAILURE_MESSAGE, scriptDirectory); |
94 | 92 | return false; |
95 | 93 | } |
96 | 94 | try { |
97 | | - LOG.debug("Writing crash uploader script: {}", scriptPath); |
98 | | - writeCrashUploaderScript(getCrashUploaderTemplate(), scriptPath, agentJar, onErrorFile); |
| 95 | + LOG.debug("Writing crash uploader script: {}", scriptFile); |
| 96 | + writeCrashUploaderScript(getCrashUploaderTemplate(), scriptFile, agentJar, onErrorFile); |
99 | 97 | } catch (IOException e) { |
100 | 98 | LOG.warn( |
101 | 99 | SEND_TELEMETRY, |
102 | 100 | "Failed to copy crash tracking script {}. " + SETUP_FAILURE_MESSAGE, |
103 | | - scriptPath); |
| 101 | + scriptFile); |
104 | 102 | return false; |
105 | 103 | } |
106 | 104 | return true; |
107 | 105 | } |
108 | 106 |
|
109 | 107 | private static void writeCrashUploaderScript( |
110 | | - InputStream template, Path scriptPath, String execClass, String crashFile) |
| 108 | + InputStream template, File scriptFile, String execClass, String crashFile) |
111 | 109 | throws IOException { |
112 | | - if (!Files.exists(scriptPath)) { |
| 110 | + if (!scriptFile.exists()) { |
113 | 111 | try (BufferedReader br = new BufferedReader(new InputStreamReader(template)); |
114 | | - BufferedWriter bw = Files.newBufferedWriter(scriptPath)) { |
| 112 | + BufferedWriter bw = |
| 113 | + new BufferedWriter( |
| 114 | + new OutputStreamWriter( |
| 115 | + new FileOutputStream(scriptFile), StandardCharsets.UTF_8))) { |
115 | 116 | String line; |
116 | 117 | while ((line = br.readLine()) != null) { |
117 | 118 | bw.write(template(line, execClass, crashFile)); |
118 | 119 | bw.newLine(); |
119 | 120 | } |
120 | 121 | } |
121 | | - Files.setPosixFilePermissions(scriptPath, fromString(R_XR_XR_X)); |
| 122 | + scriptFile.setReadable(true, false); |
| 123 | + scriptFile.setWritable(false, false); |
| 124 | + scriptFile.setExecutable(true, false); |
122 | 125 | } |
123 | 126 | } |
124 | 127 |
|
|
0 commit comments