File size: 2,317 Bytes
529090e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { z } from 'zod';

const openSearchSchema = z.object({
  node: z.string().url().optional(),
  username: z.string().optional(),
  password: z.string().optional(),
  index: z.string().default('ti-feeds'),
});

const minioSchema = z.object({
  endpoint: z.string().optional(),
  port: z.coerce.number().default(9000),
  useSSL: z.coerce.boolean().default(false),
  accessKey: z.string().optional(),
  secretKey: z.string().optional(),
  bucket: z.string().default('security-feeds'),
});

const registrySchema = z.object({
  retentionDays: z.coerce.number().default(14),
  streamHeartbeatMs: z.coerce.number().default(10_000),
});

export type OpenSearchConfig = z.infer<typeof openSearchSchema>;
export type MinioConfig = z.infer<typeof minioSchema>;
export type RegistryStreamConfig = z.infer<typeof registrySchema>;

export interface SecurityIntegrationConfig {
  openSearch: OpenSearchConfig;
  minio: MinioConfig;
  registry: RegistryStreamConfig;
}

let cachedConfig: SecurityIntegrationConfig | null = null;

export function getSecurityIntegrationConfig(): SecurityIntegrationConfig {
  if (cachedConfig) {
    return cachedConfig;
  }

  const openSearch = openSearchSchema.parse({
    node: process.env.OPENSEARCH_NODE,
    username: process.env.OPENSEARCH_USERNAME,
    password: process.env.OPENSEARCH_PASSWORD,
    index: process.env.OPENSEARCH_FEED_INDEX ?? 'ti-feeds',
  });

  const minio = minioSchema.parse({
    endpoint: process.env.MINIO_ENDPOINT,
    port: process.env.MINIO_PORT ?? 9000,
    useSSL: process.env.MINIO_USE_SSL ?? false,
    accessKey: process.env.MINIO_ACCESS_KEY,
    secretKey: process.env.MINIO_SECRET_KEY,
    bucket: process.env.MINIO_BUCKET ?? 'security-feeds',
  });

  const registry = registrySchema.parse({
    retentionDays: process.env.SECURITY_ACTIVITY_RETENTION_DAYS ?? 14,
    streamHeartbeatMs: process.env.SECURITY_ACTIVITY_HEARTBEAT_MS ?? 10_000,
  });

  cachedConfig = { openSearch, minio, registry };
  return cachedConfig;
}

export function isOpenSearchConfigured(): boolean {
  const { node } = getSecurityIntegrationConfig().openSearch;
  return Boolean(node);
}

export function isMinioConfigured(): boolean {
  const { endpoint, accessKey, secretKey } = getSecurityIntegrationConfig().minio;
  return Boolean(endpoint && accessKey && secretKey);
}