Skip to content

Commit 3cddd28

Browse files
authored
Merge pull request #508 from GSA/1745-add-new-snapshots
1745: Add New Snapshot
2 parents 571cf98 + c19d3c8 commit 3cddd28

File tree

10 files changed

+368
-248
lines changed

10 files changed

+368
-248
lines changed

.github/workflows/create-snapshot.yml

Lines changed: 0 additions & 29 deletions
This file was deleted.

apps/cli/src/main.ts

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,18 @@ import { SecurityDataController } from './security-data.controller';
1212

1313
import pino from 'pino';
1414
import { getRootLogger } from '../../../libs/logging/src';
15-
import { logCount } from "../../../libs/logging/src/metric-utils";
15+
import { logCount } from '../../../libs/logging/src/metric-utils';
1616

17-
function createCommandLogger(commandName: string, options = undefined): pino.Logger {
17+
function createCommandLogger(
18+
commandName: string,
19+
options = undefined,
20+
): pino.Logger {
1821
const appLogger = getRootLogger();
19-
return appLogger.child({ cliCommand: commandName, sseContext: 'Cli.Main', cliOptions: options });
22+
return appLogger.child({
23+
cliCommand: commandName,
24+
sseContext: 'Cli.Main',
25+
cliOptions: options,
26+
});
2027
}
2128

2229
async function bootstrap() {
@@ -32,19 +39,24 @@ function printMemoryUsage(logger: pino.Logger) {
3239
const used = process.memoryUsage();
3340
for (const key in used) {
3441
const valueMb = Math.round((used[key] / 1024 / 1024) * 100) / 100;
35-
logCount(logger, {
42+
logCount(
43+
logger,
44+
{
3645
metricUnit: 'megabytes',
3746
},
3847
`scanner.core.memory.used.${key}.mb`,
3948
`Memory used: ${key}: ${valueMb} MB`,
40-
valueMb
49+
valueMb,
4150
);
4251
}
4352
}
4453

4554
async function ingest(cmdObj) {
4655
const nestApp = await bootstrap();
47-
const logger = createCommandLogger('ingest', { limit: cmdObj.limit, federalSubdomainsUrl: cmdObj.federalSubdomainsUrl });
56+
const logger = createCommandLogger('ingest', {
57+
limit: cmdObj.limit,
58+
federalSubdomainsUrl: cmdObj.federalSubdomainsUrl,
59+
});
4860
const controller = nestApp.get(IngestController);
4961
logger.info('ingesting target urls');
5062

@@ -82,8 +94,14 @@ async function checkQueueStatus() {
8294
logger.info('checking queue status');
8395

8496
const queueStatus = await controller.getQueueStatus();
85-
logger.info({ jobsRemaining: queueStatus.count }, `${queueStatus.count} jobs remaining in queue`);
86-
logger.info({ activeJobs: queueStatus.activeCount }, `${queueStatus.activeCount} active jobs in queue`);
97+
logger.info(
98+
{ jobsRemaining: queueStatus.count },
99+
`${queueStatus.count} jobs remaining in queue`,
100+
);
101+
logger.info(
102+
{ activeJobs: queueStatus.activeCount },
103+
`${queueStatus.activeCount} active jobs in queue`,
104+
);
87105
printMemoryUsage(logger);
88106
await nestApp.close();
89107
}
@@ -101,7 +119,9 @@ async function enqueueSite(cmdObj) {
101119

102120
async function enqueueLimitedScans(cmdObj) {
103121
const nestApp = await bootstrap();
104-
const logger = createCommandLogger('enqueue-limited-scans', { limit: cmdObj.limit });
122+
const logger = createCommandLogger('enqueue-limited-scans', {
123+
limit: cmdObj.limit,
124+
});
105125
const controller = nestApp.get(QueueController);
106126
logger.info('enqueueing limited scan jobs');
107127

@@ -110,17 +130,6 @@ async function enqueueLimitedScans(cmdObj) {
110130
await nestApp.close();
111131
}
112132

113-
async function createSnapshot() {
114-
const nestApp = await bootstrap();
115-
const logger = createCommandLogger('create-snapshot');
116-
const controller = nestApp.get(SnapshotController);
117-
logger.info('creating snapshot');
118-
119-
await controller.weeklySnapshot();
120-
printMemoryUsage(logger);
121-
await nestApp.close();
122-
}
123-
124133
async function createDailySnapshot() {
125134
const nestApp = await bootstrap();
126135
const logger = createCommandLogger('create-daily-snapshot');
@@ -145,11 +154,15 @@ async function createAccessibilityResultsSnapshot() {
145154

146155
async function scanSite(cmdObj) {
147156
const nestApp = await bootstrap();
148-
const logger = createCommandLogger('scan-site', { url: cmdObj.url, page: cmdObj.page, scan: cmdObj.scan });
157+
const logger = createCommandLogger('scan-site', {
158+
url: cmdObj.url,
159+
page: cmdObj.page,
160+
scan: cmdObj.scan,
161+
});
149162
const controller = nestApp.get(ScanController);
150163

151164
logger.info(
152-
`Scanning site: ${cmdObj.url}, page: ${cmdObj.page ?? 'ALL'}, scan: ${cmdObj.scan ?? 'ALL'}`
165+
`Scanning site: ${cmdObj.url}, page: ${cmdObj.page ?? 'ALL'}, scan: ${cmdObj.scan ?? 'ALL'}`,
153166
);
154167

155168
await controller.scanSite(cmdObj.url, cmdObj.page, cmdObj.scan);
@@ -232,10 +245,7 @@ async function main() {
232245
.description(
233246
'enqueue-site add 1 site from the Website database table to the redis queue',
234247
)
235-
.option(
236-
'--url <string>',
237-
'queue up one specific site by URL'
238-
)
248+
.option('--url <string>', 'queue up one specific site by URL')
239249
.action(enqueueSite);
240250

241251
// queue-status
@@ -245,7 +255,7 @@ async function main() {
245255
'queue-status retrieves the active and remaining jobs in the redis queue',
246256
)
247257
.action(checkQueueStatus);
248-
258+
249259
// queue-limited-scans
250260
program
251261
.command('enqueue-limited-scans')
@@ -259,14 +269,6 @@ async function main() {
259269
)
260270
.action((cmdObj) => enqueueLimitedScans(cmdObj));
261271

262-
// create-snapshot
263-
program
264-
.command('create-snapshot')
265-
.description(
266-
'create-snapshot writes a CSV and JSON of the current scans to S3',
267-
)
268-
.action(createSnapshot);
269-
270272
// create-daily-snapshot
271273
program
272274
.command('create-daily-snapshot')
@@ -287,7 +289,7 @@ async function main() {
287289
program
288290
.command('scan-site')
289291
.description(
290-
'scan-site scans a given URL, which MUST exist in the website table'
292+
'scan-site scans a given URL, which MUST exist in the website table',
291293
)
292294
.option('--url <string>', 'URL to scan')
293295
.option('--page <string>', 'Page to scan (optional)')
@@ -321,4 +323,4 @@ async function main() {
321323
await program.parseAsync(process.argv);
322324
}
323325

324-
main();
326+
main();

apps/cli/src/snapshot.controller.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ describe('SnapshotController', () => {
2323
});
2424

2525
it('creates snapshot', () => {
26-
snapshotController.weeklySnapshot();
27-
expect(mockSnapshotService.weeklySnapshot).toHaveBeenCalled();
26+
snapshotController.dailySnapshot();
27+
expect(mockSnapshotService.dailySnapshot).toHaveBeenCalled();
2828
});
2929
});

apps/cli/src/snapshot.controller.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ import { SnapshotService } from '@app/snapshot';
66
export class SnapshotController {
77
constructor(private readonly snapshotService: SnapshotService) {}
88

9-
async weeklySnapshot() {
10-
await this.snapshotService.weeklySnapshot();
11-
}
12-
139
async dailySnapshot() {
1410
await this.snapshotService.dailySnapshot();
1511
}

libs/database/src/websites/websites.service.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,27 @@ export class WebsiteService {
3131
}
3232

3333
async findLiveSnapshotResults(): Promise<Website[]> {
34+
const queryBuilder = this.website
35+
.createQueryBuilder('website')
36+
.innerJoinAndSelect('website.coreResult', 'coreResult')
37+
.andWhere('coreResult.finalUrlIsLive = :isLive', { isLive: true })
38+
.andWhere('coreResult.finalUrlMIMEType NOT IN (:...mimeTypes)', {
39+
mimeTypes: [
40+
'image/jpeg',
41+
'application/xml',
42+
'application/json',
43+
'text/xml',
44+
],
45+
})
46+
.orderBy({
47+
'coreResult.targetUrlBaseDomain': 'ASC',
48+
'website.url': 'ASC',
49+
});
50+
51+
return await queryBuilder.getMany();
52+
}
53+
54+
async findLiveFilteredSnapshotResults(): Promise<Website[]> {
3455
const queryBuilder = this.website
3556
.createQueryBuilder('website')
3657
.innerJoinAndSelect('website.coreResult', 'coreResult')
@@ -52,12 +73,14 @@ export class WebsiteService {
5273
return await queryBuilder.getMany();
5374
}
5475

55-
async findUniqueSnapshotResults(): Promise<Website[]> {
76+
async findLiveFilteredUniqueSnapshotResults(): Promise<Website[]> {
5677
const queryBuilder = this.website
5778
.createQueryBuilder('website')
5879
.innerJoinAndSelect('website.coreResult', 'coreResult')
5980
.andWhere('coreResult.filter = :isFilter', { isFilter: false })
60-
.andWhere('coreResult.targetUrlRedirects = :isRedirect', { isRedirect: false })
81+
.andWhere('coreResult.targetUrlRedirects = :isRedirect', {
82+
isRedirect: false,
83+
})
6184
.andWhere('coreResult.finalUrlIsLive = :isLive', { isLive: true })
6285
.andWhere('coreResult.finalUrlMIMEType NOT IN (:...mimeTypes)', {
6386
mimeTypes: [
@@ -110,7 +133,6 @@ export class WebsiteService {
110133
}
111134

112135
async findWebsitesWithPrimaryTimedOutCoreResults(): Promise<Website[]> {
113-
114136
const queryBuilder = this.website
115137
.createQueryBuilder('website')
116138
.innerJoinAndSelect('website.coreResult', 'coreResult')

libs/snapshot/src/config/snapshot.config.ts

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,20 @@
44
export default () => {
55
if (process.env.NODE_ENV === 'production') {
66
return {
7-
fileNameLive: 'weekly-snapshot',
8-
fileNameUnique: 'weekly-snapshot-unique',
9-
fileNameAll: 'weekly-snapshot-all',
10-
fileNameAccessibility: 'weekly-snapshot-accessibility-details',
11-
fileNameDailyLive: 'site-scanning-live-filtered-latest',
12-
fileNameDailyUnique: 'site-scanning-live-filtered-unique-latest',
7+
fileNameDailyLive: 'site-scanning-live-latest',
8+
fileNameDailyLiveFiltered: 'site-scanning-live-filtered-latest',
9+
fileNameDailyLiveFilteredUnique:
10+
'site-scanning-live-filtered-unique-latest',
1311
fileNameDailyAll: 'site-scanning-latest',
12+
fileNameAccessibility: 'weekly-snapshot-accessibility-details',
1413
};
1514
} else {
1615
return {
17-
fileNameLive: `weekly-snapshot-${process.env.NODE_ENV}`,
18-
fileNameUnique: `weekly-snapshot-unique-${process.env.NODE_ENV}`,
19-
fileNameAll: `weekly-snapshot-all-${process.env.NODE_ENV}`,
20-
fileNameAccessibility: `weekly-snapshot-accessibility-details-${process.env.NODE_ENV}`,
21-
fileNameDailyLive: `site-scanning-live-filtered-latest-${process.env.NODE_ENV}`,
22-
fileNameDailyUnique: `site-scanning-live-filtered-unique-latest-${process.env.NODE_ENV}`,
16+
fileNameDailyLive: `site-scanning-live-latest-${process.env.NODE_ENV}`,
17+
fileNameDailyLiveFiltered: `site-scanning-live-filtered-latest-${process.env.NODE_ENV}`,
18+
fileNameDailyLiveFilteredUnique: `site-scanning-live-filtered-unique-latest-${process.env.NODE_ENV}`,
2319
fileNameDailyAll: `site-scanning-latest-${process.env.NODE_ENV}`,
20+
fileNameAccessibility: `weekly-snapshot-accessibility-details-${process.env.NODE_ENV}`,
2421
};
2522
}
2623
};

0 commit comments

Comments
 (0)