|
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,70 @@ 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 | + scriptDirectory.setReadable(true, false); |
| 79 | + scriptDirectory.setWritable(true, false); |
| 80 | + scriptDirectory.setExecutable(true, false); |
| 81 | + } |
| 82 | + if (!scriptDirectory.canWrite()) { |
| 83 | + LOG.warn(SEND_TELEMETRY, "Read only directory {}. " + SETUP_FAILURE_MESSAGE, scriptDirectory); |
94 | 84 | return false; |
95 | 85 | } |
96 | 86 | try { |
97 | | - LOG.debug("Writing crash uploader script: {}", scriptPath); |
98 | | - writeCrashUploaderScript(getCrashUploaderTemplate(), scriptPath, agentJar, onErrorFile); |
| 87 | + LOG.debug("Writing crash uploader script: {}", scriptFile); |
| 88 | + writeCrashUploaderScript(getCrashUploaderTemplate(), scriptFile, agentJar, onErrorFile); |
99 | 89 | } catch (IOException e) { |
100 | 90 | LOG.warn( |
101 | 91 | SEND_TELEMETRY, |
102 | 92 | "Failed to copy crash tracking script {}. " + SETUP_FAILURE_MESSAGE, |
103 | | - scriptPath); |
| 93 | + scriptFile); |
104 | 94 | return false; |
105 | 95 | } |
106 | 96 | return true; |
107 | 97 | } |
108 | 98 |
|
109 | 99 | private static void writeCrashUploaderScript( |
110 | | - InputStream template, Path scriptPath, String execClass, String crashFile) |
| 100 | + InputStream template, File scriptFile, String execClass, String crashFile) |
111 | 101 | throws IOException { |
112 | | - if (!Files.exists(scriptPath)) { |
| 102 | + if (!scriptFile.exists()) { |
113 | 103 | try (BufferedReader br = new BufferedReader(new InputStreamReader(template)); |
114 | | - BufferedWriter bw = Files.newBufferedWriter(scriptPath)) { |
| 104 | + BufferedWriter bw = |
| 105 | + new BufferedWriter( |
| 106 | + new OutputStreamWriter( |
| 107 | + new FileOutputStream(scriptFile), StandardCharsets.UTF_8))) { |
115 | 108 | String line; |
116 | 109 | while ((line = br.readLine()) != null) { |
117 | 110 | bw.write(template(line, execClass, crashFile)); |
118 | 111 | bw.newLine(); |
119 | 112 | } |
120 | 113 | } |
121 | | - Files.setPosixFilePermissions(scriptPath, fromString(R_XR_XR_X)); |
| 114 | + scriptFile.setReadable(true, false); |
| 115 | + scriptFile.setWritable(false, false); |
| 116 | + scriptFile.setExecutable(true, false); |
122 | 117 | } |
123 | 118 | } |
124 | 119 |
|
|
0 commit comments