69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
import * as fs from 'node:fs';
|
|
import * as path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
export async function uploadReports() {
|
|
const baseUrl = (process.env.DEFECTDOJO_URL || "").replace(/\/$/, "");
|
|
const apiToken = process.env.DEFECTDOJO_API_TOKEN;
|
|
const productName = process.env.DEFECTDOJO_PRODUCT_NAME || "agentguard-ci";
|
|
|
|
if (!baseUrl || !apiToken) {
|
|
console.error("DEFECTDOJO_URL and DEFECTDOJO_API_TOKEN must be set.");
|
|
process.exit(1);
|
|
}
|
|
|
|
const scanMap: Record<string, string> = {
|
|
".sarif": "SARIF",
|
|
".json": "Generic Findings Import",
|
|
};
|
|
|
|
const reportsDir = "/workspace/reports";
|
|
if (!fs.existsSync(reportsDir)) {
|
|
console.log("No reports directory found.");
|
|
return;
|
|
}
|
|
|
|
const files = fs.readdirSync(reportsDir).sort();
|
|
|
|
for (const file of files) {
|
|
const fullPath = path.join(reportsDir, file);
|
|
if (!fs.statSync(fullPath).isFile()) continue;
|
|
|
|
const ext = path.extname(file);
|
|
const scanType = scanMap[ext];
|
|
if (!scanType) continue;
|
|
|
|
console.log(`Uploading ${file} as ${scanType}...`);
|
|
|
|
try {
|
|
const response = await fetch(`${baseUrl}/api/v2/import-scan/`, {
|
|
method: "POST",
|
|
headers: {
|
|
"Authorization": `Token ${apiToken}`,
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
scan_type: scanType,
|
|
product_name: productName,
|
|
file_name: file,
|
|
})
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const text = await response.text();
|
|
console.error(`Failed to upload ${file}: ${response.status} ${response.statusText} - ${text}`);
|
|
process.exitCode = 1;
|
|
} else {
|
|
console.log(`Successfully uploaded ${file}`);
|
|
}
|
|
} catch (e) {
|
|
console.error(`Network error uploading ${file}:`, e);
|
|
process.exitCode = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
uploadReports();
|
|
}
|