The key changes:
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:
@@ -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.CveStatisticsService;
|
||||||
import com.psg.dlsysinfo.dl_sysinfo_server.service.EmailService;
|
import com.psg.dlsysinfo.dl_sysinfo_server.service.EmailService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -14,7 +15,26 @@ import java.util.Map;
|
|||||||
@Component
|
@Component
|
||||||
public class CveSyncScheduler {
|
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
|
@Autowired
|
||||||
private EmailService emailService;
|
private EmailService emailService;
|
||||||
@@ -25,24 +45,34 @@ public class CveSyncScheduler {
|
|||||||
|
|
||||||
@Scheduled(cron = "0 0 */8 * * *") // ⏰ Every 8 hours
|
@Scheduled(cron = "0 0 */8 * * *") // ⏰ Every 8 hours
|
||||||
public void runCveSyncScript() {
|
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()) {
|
if (!scriptFile.exists()) {
|
||||||
String msg = "❌ Script not found: " + scriptFile.getAbsolutePath();
|
String msg = "❌ Script not found: " + scriptFile.getAbsolutePath();
|
||||||
log(msg);
|
log(msg, logFile);
|
||||||
emailService.sendHtmlEmail("⚠️ CVE Sync Failed", wrapHtml(msg));
|
emailService.sendHtmlEmail("⚠️ CVE Sync Failed", wrapHtml(msg));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
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();
|
Map<String, String> env = pb.environment();
|
||||||
env.put("DB_HOST", System.getenv("DB_HOST"));
|
env.put("DB_HOST", extractHost(dbUrl));
|
||||||
env.put("DB_USER", System.getenv("DB_USER"));
|
env.put("DB_PORT", extractPort(dbUrl));
|
||||||
env.put("DB_PASSWORD", System.getenv("DB_PASSWORD"));
|
env.put("DB_NAME", extractDbName(dbUrl));
|
||||||
env.put("DB_NAME", System.getenv("DB_NAME"));
|
env.put("DB_USER", dbUser);
|
||||||
env.put("NVD_API_KEY", System.getenv("NVD_API_KEY"));
|
env.put("DB_PASSWORD", dbPass);
|
||||||
env.put("NVD_MAX_RANGE_DAYS", System.getenv("NVD_MAX_RANGE_DAYS"));
|
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);
|
pb.redirectErrorStream(true);
|
||||||
Process process = pb.start();
|
Process process = pb.start();
|
||||||
@@ -74,12 +104,50 @@ public class CveSyncScheduler {
|
|||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
String err = "❌ Exception during CVE sync: " + e.getMessage();
|
String err = "❌ Exception during CVE sync: " + e.getMessage();
|
||||||
log(err);
|
log(err, logFile);
|
||||||
emailService.sendHtmlEmail("❌ CVE Sync Error", wrapHtml(err));
|
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)) {
|
try (FileWriter fw = new FileWriter(logFile, true)) {
|
||||||
fw.write(LocalDateTime.now() + " — " + message + "\n");
|
fw.write(LocalDateTime.now() + " — " + message + "\n");
|
||||||
} catch (IOException ignored) {}
|
} catch (IOException ignored) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user