The key changes:
All checks were successful
Build & Deploy Backend / build (push) Successful in 55s
Build & Deploy Backend / deploy (push) Successful in 31s

1. Script updated: Now runs fetchCVE_v2.js instead of fetchCVE.js (line 49)
  2. Proper configuration injection: Uses @Value to inject database credentials, API keys, and directory paths from your
  application properties
  3. Working directory: Sets the script directory properly with pb.directory(scriptDir)
  4. Environment setup: Uses the same DB connection extraction methods (extractHost, extractPort, extractDbName) as your
  ScriptController
  5. Locale settings: Added UTF-8 and Node options to match your ScriptController setup
  6. Log file location: Uses logsDirectory configuration instead of hardcoded path

  The scheduler will now run fetchCVE_v2.js (which executes importCVEEnrichmentFast) every 8 hours at midnight, 8am, and 4pm.
This commit is contained in:
2025-10-10 09:56:34 +08:00
parent 2b5aaa1401
commit d639090419

View File

@@ -3,6 +3,7 @@ package com.psg.dlsysinfo.dl_sysinfo_server.scheduling;
import com.psg.dlsysinfo.dl_sysinfo_server.service.CveStatisticsService;
import com.psg.dlsysinfo.dl_sysinfo_server.service.EmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -14,7 +15,26 @@ import java.util.Map;
@Component
public class CveSyncScheduler {
private final File logFile = new File("cve-sync.log");
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String dbUser;
@Value("${spring.datasource.password}")
private String dbPass;
@Value("${nvd.api.key}")
private String apiKey;
@Value("${nvd.max-range-days:7}")
private String nvdMaxRangeDays;
@Value("${scripts.directory:/home/sonder/ld-sysinfo-server/scripts}")
private String scriptsDirectory;
@Value("${scripts.logs.directory:/home/sonder/ld-sysinfo-server/scripts}")
private String logsDirectory;
@Autowired
private EmailService emailService;
@@ -25,24 +45,34 @@ public class CveSyncScheduler {
@Scheduled(cron = "0 0 */8 * * *") // ⏰ Every 8 hours
public void runCveSyncScript() {
File scriptFile = new File("scripts/fetchCVE.js");
File scriptDir = new File(scriptsDirectory);
File scriptFile = new File(scriptDir, "fetchCVE_v2.js");
File logFile = new File(logsDirectory, "cve-sync.log");
if (!scriptFile.exists()) {
String msg = "❌ Script not found: " + scriptFile.getAbsolutePath();
log(msg);
log(msg, logFile);
emailService.sendHtmlEmail("⚠️ CVE Sync Failed", wrapHtml(msg));
return;
}
try {
ProcessBuilder pb = new ProcessBuilder("node", scriptFile.getAbsolutePath());
ProcessBuilder pb = new ProcessBuilder("node", "fetchCVE_v2.js");
pb.directory(scriptDir);
Map<String, String> env = pb.environment();
env.put("DB_HOST", System.getenv("DB_HOST"));
env.put("DB_USER", System.getenv("DB_USER"));
env.put("DB_PASSWORD", System.getenv("DB_PASSWORD"));
env.put("DB_NAME", System.getenv("DB_NAME"));
env.put("NVD_API_KEY", System.getenv("NVD_API_KEY"));
env.put("NVD_MAX_RANGE_DAYS", System.getenv("NVD_MAX_RANGE_DAYS"));
env.put("DB_HOST", extractHost(dbUrl));
env.put("DB_PORT", extractPort(dbUrl));
env.put("DB_NAME", extractDbName(dbUrl));
env.put("DB_USER", dbUser);
env.put("DB_PASSWORD", dbPass);
env.put("NVD_API_KEY", apiKey);
env.put("NVD_MAX_RANGE_DAYS", nvdMaxRangeDays);
env.put("NODE_OPTIONS", "--no-warnings --enable-source-maps");
env.put("LC_ALL", "en_US.UTF-8");
env.put("LANG", "en_US.UTF-8");
env.put("LANGUAGE", "en_US:en");
pb.redirectErrorStream(true);
Process process = pb.start();
@@ -74,12 +104,50 @@ public class CveSyncScheduler {
} catch (Exception e) {
String err = "❌ Exception during CVE sync: " + e.getMessage();
log(err);
log(err, logFile);
emailService.sendHtmlEmail("❌ CVE Sync Error", wrapHtml(err));
}
}
private void log(String message) {
private String extractHost(String url) {
String clean = url.replace("jdbc:mysql://", "").split("/")[0];
// Handle IPv6 addresses like [::1]:3307
if (clean.startsWith("[")) {
int closeBracket = clean.indexOf("]");
if (closeBracket > 0) {
return clean.substring(1, closeBracket);
}
}
// Handle standard host:port format
return clean.split(":")[0];
}
private String extractPort(String url) {
String clean = url.replace("jdbc:mysql://", "").split("/")[0];
// Handle IPv6: [::1]:3307
if (clean.contains("]:")) {
return clean.substring(clean.indexOf("]:") + 2);
}
// Handle standard: hostname:3307
if (clean.contains(":") && !clean.startsWith("[")) {
String[] parts = clean.split(":");
if (parts.length > 1) {
return parts[1];
}
}
return "3306"; // default MySQL port
}
private String extractDbName(String url) {
return url.substring(url.lastIndexOf("/") + 1).split("\\?")[0];
}
private void log(String message, File logFile) {
try (FileWriter fw = new FileWriter(logFile, true)) {
fw.write(LocalDateTime.now() + "" + message + "\n");
} catch (IOException ignored) {}