@freshguard/freshguard-core 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +644 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +350 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/connectors/base-connector.d.ts +62 -0
- package/dist/connectors/base-connector.d.ts.map +1 -0
- package/dist/connectors/base-connector.js +549 -0
- package/dist/connectors/base-connector.js.map +1 -0
- package/dist/connectors/bigquery.d.ts +38 -0
- package/dist/connectors/bigquery.d.ts.map +1 -0
- package/dist/connectors/bigquery.js +406 -0
- package/dist/connectors/bigquery.js.map +1 -0
- package/dist/connectors/duckdb.d.ts +36 -0
- package/dist/connectors/duckdb.d.ts.map +1 -0
- package/dist/connectors/duckdb.js +364 -0
- package/dist/connectors/duckdb.js.map +1 -0
- package/dist/connectors/index.d.ts +7 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +7 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/mysql.d.ts +32 -0
- package/dist/connectors/mysql.d.ts.map +1 -0
- package/dist/connectors/mysql.js +348 -0
- package/dist/connectors/mysql.js.map +1 -0
- package/dist/connectors/postgres.d.ts +31 -0
- package/dist/connectors/postgres.d.ts.map +1 -0
- package/dist/connectors/postgres.js +326 -0
- package/dist/connectors/postgres.js.map +1 -0
- package/dist/connectors/redshift.d.ts +32 -0
- package/dist/connectors/redshift.d.ts.map +1 -0
- package/dist/connectors/redshift.js +366 -0
- package/dist/connectors/redshift.js.map +1 -0
- package/dist/connectors/snowflake.d.ts +43 -0
- package/dist/connectors/snowflake.d.ts.map +1 -0
- package/dist/connectors/snowflake.js +442 -0
- package/dist/connectors/snowflake.js.map +1 -0
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +12 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +114 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +2053 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +164 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/errors/debug-factory.d.ts +23 -0
- package/dist/errors/debug-factory.d.ts.map +1 -0
- package/dist/errors/debug-factory.js +149 -0
- package/dist/errors/debug-factory.js.map +1 -0
- package/dist/errors/index.d.ts +119 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +341 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata/duckdb-storage.d.ts +31 -0
- package/dist/metadata/duckdb-storage.d.ts.map +1 -0
- package/dist/metadata/duckdb-storage.js +230 -0
- package/dist/metadata/duckdb-storage.js.map +1 -0
- package/dist/metadata/factory.d.ts +4 -0
- package/dist/metadata/factory.d.ts.map +1 -0
- package/dist/metadata/factory.js +23 -0
- package/dist/metadata/factory.js.map +1 -0
- package/dist/metadata/index.d.ts +6 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +4 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/interface.d.ts +26 -0
- package/dist/metadata/interface.d.ts.map +1 -0
- package/dist/metadata/interface.js +2 -0
- package/dist/metadata/interface.js.map +1 -0
- package/dist/metadata/postgresql-storage.d.ts +32 -0
- package/dist/metadata/postgresql-storage.d.ts.map +1 -0
- package/dist/metadata/postgresql-storage.js +242 -0
- package/dist/metadata/postgresql-storage.js.map +1 -0
- package/dist/metadata/schema-config.d.ts +30 -0
- package/dist/metadata/schema-config.d.ts.map +1 -0
- package/dist/metadata/schema-config.js +94 -0
- package/dist/metadata/schema-config.js.map +1 -0
- package/dist/metadata/types.d.ts +35 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +2 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/monitor/baseline-calculator.d.ts +30 -0
- package/dist/monitor/baseline-calculator.d.ts.map +1 -0
- package/dist/monitor/baseline-calculator.js +192 -0
- package/dist/monitor/baseline-calculator.js.map +1 -0
- package/dist/monitor/baseline-config.d.ts +37 -0
- package/dist/monitor/baseline-config.d.ts.map +1 -0
- package/dist/monitor/baseline-config.js +156 -0
- package/dist/monitor/baseline-config.js.map +1 -0
- package/dist/monitor/freshness.d.ts +5 -0
- package/dist/monitor/freshness.d.ts.map +1 -0
- package/dist/monitor/freshness.js +239 -0
- package/dist/monitor/freshness.js.map +1 -0
- package/dist/monitor/index.d.ts +5 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +5 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/schema-baseline.d.ts +22 -0
- package/dist/monitor/schema-baseline.d.ts.map +1 -0
- package/dist/monitor/schema-baseline.js +211 -0
- package/dist/monitor/schema-baseline.js.map +1 -0
- package/dist/monitor/schema-changes.d.ts +5 -0
- package/dist/monitor/schema-changes.d.ts.map +1 -0
- package/dist/monitor/schema-changes.js +289 -0
- package/dist/monitor/schema-changes.js.map +1 -0
- package/dist/monitor/volume.d.ts +5 -0
- package/dist/monitor/volume.d.ts.map +1 -0
- package/dist/monitor/volume.js +262 -0
- package/dist/monitor/volume.js.map +1 -0
- package/dist/observability/logger.d.ts +63 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +282 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +106 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +441 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/query-analyzer.js +526 -0
- package/dist/resilience/circuit-breaker.d.ts +94 -0
- package/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/resilience/circuit-breaker.js +379 -0
- package/dist/resilience/circuit-breaker.js.map +1 -0
- package/dist/resilience/index.d.ts +7 -0
- package/dist/resilience/index.d.ts.map +1 -0
- package/dist/resilience/index.js +7 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/resilience/retry-policy.d.ts +87 -0
- package/dist/resilience/retry-policy.d.ts.map +1 -0
- package/dist/resilience/retry-policy.js +423 -0
- package/dist/resilience/retry-policy.js.map +1 -0
- package/dist/resilience/timeout-manager.d.ts +97 -0
- package/dist/resilience/timeout-manager.d.ts.map +1 -0
- package/dist/resilience/timeout-manager.js +339 -0
- package/dist/resilience/timeout-manager.js.map +1 -0
- package/dist/security/query-analyzer.d.ts +82 -0
- package/dist/security/query-analyzer.d.ts.map +1 -0
- package/dist/security/query-analyzer.js +381 -0
- package/dist/security/query-analyzer.js.map +1 -0
- package/dist/security/schema-cache.d.ts +95 -0
- package/dist/security/schema-cache.d.ts.map +1 -0
- package/dist/security/schema-cache.js +344 -0
- package/dist/security/schema-cache.js.map +1 -0
- package/dist/types/connector.d.ts +68 -0
- package/dist/types/connector.d.ts.map +1 -0
- package/dist/types/connector.js +26 -0
- package/dist/types/connector.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/index.d.ts +7 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/runtime-validator.d.ts +70 -0
- package/dist/validation/runtime-validator.d.ts.map +1 -0
- package/dist/validation/runtime-validator.js +206 -0
- package/dist/validation/runtime-validator.js.map +1 -0
- package/dist/validation/sanitizers.d.ts +56 -0
- package/dist/validation/sanitizers.d.ts.map +1 -0
- package/dist/validation/sanitizers.js +264 -0
- package/dist/validation/sanitizers.js.map +1 -0
- package/dist/validation/schemas.d.ts +224 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +263 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/validators/index.d.ts +18 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +209 -0
- package/dist/validators/index.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile, writeFile, existsSync, mkdirSync } from 'fs';
|
|
3
|
+
import { join, resolve, dirname } from 'path';
|
|
4
|
+
import { promisify } from 'util';
|
|
5
|
+
import { PostgresConnector } from '../connectors/postgres.js';
|
|
6
|
+
import { DuckDBConnector } from '../connectors/duckdb.js';
|
|
7
|
+
import { BigQueryConnector } from '../connectors/bigquery.js';
|
|
8
|
+
import { SnowflakeConnector } from '../connectors/snowflake.js';
|
|
9
|
+
import { ConfigurationError, ConnectionError, ErrorHandler } from '../errors/index.js';
|
|
10
|
+
const readFileAsync = promisify(readFile);
|
|
11
|
+
const writeFileAsync = promisify(writeFile);
|
|
12
|
+
const ALLOWED_CONFIG_DIRS = [
|
|
13
|
+
process.cwd(),
|
|
14
|
+
join(process.cwd(), '.freshguard'),
|
|
15
|
+
join(process.cwd(), 'config'),
|
|
16
|
+
];
|
|
17
|
+
const DEFAULT_CONFIG_FILE = '.freshguard/config.yaml';
|
|
18
|
+
const args = process.argv.slice(2);
|
|
19
|
+
const command = args[0];
|
|
20
|
+
async function main() {
|
|
21
|
+
try {
|
|
22
|
+
if (!command) {
|
|
23
|
+
printHelp();
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
if (!isValidCommand(command)) {
|
|
27
|
+
console.error(`❌ Invalid command: ${command}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
switch (command) {
|
|
31
|
+
case 'init':
|
|
32
|
+
await handleInit();
|
|
33
|
+
break;
|
|
34
|
+
case 'test':
|
|
35
|
+
await handleTest();
|
|
36
|
+
break;
|
|
37
|
+
case 'run':
|
|
38
|
+
await handleRun();
|
|
39
|
+
break;
|
|
40
|
+
case 'version':
|
|
41
|
+
case '-v':
|
|
42
|
+
case '--version':
|
|
43
|
+
console.log('FreshGuard Core v0.1.2');
|
|
44
|
+
break;
|
|
45
|
+
case 'help':
|
|
46
|
+
case '-h':
|
|
47
|
+
case '--help':
|
|
48
|
+
printHelp();
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
console.error(`❌ Unknown command: ${command}`);
|
|
52
|
+
console.error('');
|
|
53
|
+
printHelp();
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const userMessage = ErrorHandler.getUserMessage(error);
|
|
59
|
+
console.error(`❌ Error: ${userMessage}`);
|
|
60
|
+
if (process.env.NODE_ENV === 'development' && error instanceof Error) {
|
|
61
|
+
console.error('Stack trace:', error.stack);
|
|
62
|
+
}
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function isValidCommand(cmd) {
|
|
67
|
+
const validCommands = ['init', 'test', 'run', 'version', '-v', '--version', 'help', '-h', '--help'];
|
|
68
|
+
return validCommands.includes(cmd) && /^[a-zA-Z-]+$/.test(cmd);
|
|
69
|
+
}
|
|
70
|
+
function validateConfigPath(filePath) {
|
|
71
|
+
try {
|
|
72
|
+
const resolvedPath = resolve(filePath);
|
|
73
|
+
const isAllowed = ALLOWED_CONFIG_DIRS.some(allowedDir => {
|
|
74
|
+
const resolvedAllowedDir = resolve(allowedDir);
|
|
75
|
+
return resolvedPath.startsWith(resolvedAllowedDir);
|
|
76
|
+
});
|
|
77
|
+
if (!isAllowed) {
|
|
78
|
+
throw new ConfigurationError('Configuration file path not allowed for security reasons');
|
|
79
|
+
}
|
|
80
|
+
return resolvedPath;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new ConfigurationError('Invalid configuration file path');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function handleInit() {
|
|
87
|
+
console.log('🚀 FreshGuard Init\n');
|
|
88
|
+
const dbUrl = process.env.FRESHGUARD_DATABASE_URL;
|
|
89
|
+
let dbType = 'postgres';
|
|
90
|
+
if (!dbUrl) {
|
|
91
|
+
console.log('⚠️ No FRESHGUARD_DATABASE_URL environment variable found.');
|
|
92
|
+
console.log('Please set your database connection string as an environment variable:');
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log('For PostgreSQL:');
|
|
95
|
+
console.log(' export FRESHGUARD_DATABASE_URL="postgresql://user:password@localhost:5432/database?sslmode=require"');
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log('For DuckDB:');
|
|
98
|
+
console.log(' export FRESHGUARD_DATABASE_URL="duckdb://./data/analytics.duckdb"');
|
|
99
|
+
console.log('');
|
|
100
|
+
console.log('Then run: freshguard init');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const config = parseSecureConnectionString(dbUrl);
|
|
105
|
+
dbType = config.type;
|
|
106
|
+
console.log('✅ Database URL detected');
|
|
107
|
+
console.log(`📊 Database type: ${dbType}`);
|
|
108
|
+
console.log(`🔒 SSL required: ${config.ssl ? 'Yes' : 'No'}`);
|
|
109
|
+
const configDir = dirname(validateConfigPath(DEFAULT_CONFIG_FILE));
|
|
110
|
+
if (!existsSync(configDir)) {
|
|
111
|
+
mkdirSync(configDir, { recursive: true });
|
|
112
|
+
}
|
|
113
|
+
const initialConfig = {
|
|
114
|
+
connections: {
|
|
115
|
+
default: {
|
|
116
|
+
...config,
|
|
117
|
+
type: dbType
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
defaultConnection: 'default',
|
|
121
|
+
logLevel: 'info',
|
|
122
|
+
securityMode: 'strict'
|
|
123
|
+
};
|
|
124
|
+
await writeFileAsync(validateConfigPath(DEFAULT_CONFIG_FILE), JSON.stringify(initialConfig, null, 2));
|
|
125
|
+
console.log(`✅ Configuration created: ${DEFAULT_CONFIG_FILE}`);
|
|
126
|
+
console.log('');
|
|
127
|
+
console.log('Next steps:');
|
|
128
|
+
console.log(' 1. Test your connection: freshguard test');
|
|
129
|
+
console.log(' 2. Configure monitoring rules in your configuration file');
|
|
130
|
+
console.log(' 3. Start monitoring: freshguard run');
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
throw new ConfigurationError('Failed to parse database connection string. Please check the format.');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function handleTest() {
|
|
137
|
+
console.log('🔍 Testing database connection...\n');
|
|
138
|
+
const config = await loadConfig();
|
|
139
|
+
const connectionName = getFlag('--connection') || config.defaultConnection || 'default';
|
|
140
|
+
if (!config.connections[connectionName]) {
|
|
141
|
+
throw new ConfigurationError(`Connection '${connectionName}' not found in configuration`);
|
|
142
|
+
}
|
|
143
|
+
const connConfig = config.connections[connectionName];
|
|
144
|
+
let connector;
|
|
145
|
+
try {
|
|
146
|
+
connector = createSecureConnector(connConfig.type, connConfig);
|
|
147
|
+
console.log(`📊 Testing ${connConfig.type} connection...`);
|
|
148
|
+
const testResult = await connector.testConnection();
|
|
149
|
+
if (testResult) {
|
|
150
|
+
console.log('✅ Connection successful!');
|
|
151
|
+
try {
|
|
152
|
+
const tables = await connector.listTables();
|
|
153
|
+
console.log(`📋 Found ${tables.length} tables`);
|
|
154
|
+
if (tables.length > 0) {
|
|
155
|
+
console.log(`🔍 Sample tables: ${tables.slice(0, 3).join(', ')}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.log('⚠️ Connection works, but table listing failed (check permissions)');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
console.log('❌ Connection failed');
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.log('❌ Connection failed');
|
|
169
|
+
if (process.env.NODE_ENV === 'development') {
|
|
170
|
+
console.log('Debug info:', ErrorHandler.getUserMessage(error));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log('💡 Run with NODE_ENV=development for more details');
|
|
174
|
+
}
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async function handleRun() {
|
|
179
|
+
console.log('⏱️ Starting FreshGuard monitoring scheduler...\n');
|
|
180
|
+
const config = await loadConfig();
|
|
181
|
+
if (!config.defaultConnection || !config.connections[config.defaultConnection]) {
|
|
182
|
+
throw new ConfigurationError('No default connection configured. Run: freshguard init');
|
|
183
|
+
}
|
|
184
|
+
const connConfig = config.connections[config.defaultConnection];
|
|
185
|
+
if (!connConfig) {
|
|
186
|
+
throw new ConfigurationError(`Connection '${config.defaultConnection}' not found in configuration`);
|
|
187
|
+
}
|
|
188
|
+
const connector = createSecureConnector(connConfig.type, connConfig);
|
|
189
|
+
console.log(`📊 Using ${connConfig.type} connection`);
|
|
190
|
+
console.log(`🔒 Security mode: ${config.securityMode || 'strict'}`);
|
|
191
|
+
const isConnected = await connector.testConnection();
|
|
192
|
+
if (!isConnected) {
|
|
193
|
+
throw new ConnectionError('Cannot connect to database');
|
|
194
|
+
}
|
|
195
|
+
console.log('✅ Database connection verified');
|
|
196
|
+
console.log('🔄 Monitoring scheduler started');
|
|
197
|
+
console.log('');
|
|
198
|
+
console.log('⚠️ This is a basic scheduler. For production use, consider:');
|
|
199
|
+
console.log(' - Running as a systemd service');
|
|
200
|
+
console.log(' - Adding proper logging');
|
|
201
|
+
console.log(' - Setting up alerting');
|
|
202
|
+
console.log('');
|
|
203
|
+
console.log('Press Ctrl+C to stop...');
|
|
204
|
+
process.on('SIGINT', () => {
|
|
205
|
+
console.log('\n🛑 Shutting down gracefully...');
|
|
206
|
+
process.exit(0);
|
|
207
|
+
});
|
|
208
|
+
while (true) {
|
|
209
|
+
try {
|
|
210
|
+
console.log('🔍 Running health checks...');
|
|
211
|
+
await connector.testConnection();
|
|
212
|
+
console.log('✅ Health check completed');
|
|
213
|
+
await new Promise(resolve => setTimeout(resolve, 60000));
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
console.error('❌ Monitoring check failed:', ErrorHandler.getUserMessage(error));
|
|
217
|
+
await new Promise(resolve => setTimeout(resolve, 60000));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function parseSecureConnectionString(connectionString) {
|
|
222
|
+
try {
|
|
223
|
+
const url = new URL(connectionString);
|
|
224
|
+
let type;
|
|
225
|
+
switch (url.protocol) {
|
|
226
|
+
case 'postgresql:':
|
|
227
|
+
case 'postgres:':
|
|
228
|
+
type = 'postgres';
|
|
229
|
+
break;
|
|
230
|
+
case 'duckdb:':
|
|
231
|
+
type = 'duckdb';
|
|
232
|
+
break;
|
|
233
|
+
case 'bigquery:':
|
|
234
|
+
type = 'bigquery';
|
|
235
|
+
break;
|
|
236
|
+
case 'snowflake:':
|
|
237
|
+
type = 'snowflake';
|
|
238
|
+
break;
|
|
239
|
+
default:
|
|
240
|
+
throw new ConfigurationError(`Unsupported database protocol: ${url.protocol}`);
|
|
241
|
+
}
|
|
242
|
+
const config = {
|
|
243
|
+
type,
|
|
244
|
+
host: url.hostname || 'localhost',
|
|
245
|
+
port: url.port ? parseInt(url.port, 10) : getDefaultPort(type),
|
|
246
|
+
database: url.pathname.slice(1) || '',
|
|
247
|
+
username: url.username || process.env.FRESHGUARD_DB_USER || '',
|
|
248
|
+
password: url.password || process.env.FRESHGUARD_DB_PASSWORD || '',
|
|
249
|
+
ssl: url.searchParams.get('sslmode') !== 'disable' && url.searchParams.get('ssl') !== 'false',
|
|
250
|
+
};
|
|
251
|
+
return config;
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
throw new ConfigurationError('Invalid database connection string format');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function getDefaultPort(type) {
|
|
258
|
+
switch (type) {
|
|
259
|
+
case 'postgres': return 5432;
|
|
260
|
+
case 'duckdb': return 0;
|
|
261
|
+
case 'bigquery': return 443;
|
|
262
|
+
case 'snowflake': return 443;
|
|
263
|
+
default: return 0;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function createSecureConnector(type, config) {
|
|
267
|
+
switch (type) {
|
|
268
|
+
case 'postgres':
|
|
269
|
+
return new PostgresConnector(config);
|
|
270
|
+
case 'duckdb':
|
|
271
|
+
return new DuckDBConnector(config);
|
|
272
|
+
case 'bigquery':
|
|
273
|
+
return new BigQueryConnector(config);
|
|
274
|
+
case 'snowflake':
|
|
275
|
+
return new SnowflakeConnector(config);
|
|
276
|
+
default:
|
|
277
|
+
throw new ConfigurationError(`Unsupported connector type: ${type}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
async function loadConfig() {
|
|
281
|
+
try {
|
|
282
|
+
const configPath = validateConfigPath(DEFAULT_CONFIG_FILE);
|
|
283
|
+
if (!existsSync(configPath)) {
|
|
284
|
+
throw new ConfigurationError('Configuration file not found. Run: freshguard init');
|
|
285
|
+
}
|
|
286
|
+
const configData = await readFileAsync(configPath, 'utf8');
|
|
287
|
+
const config = JSON.parse(configData);
|
|
288
|
+
if (!config.connections || Object.keys(config.connections).length === 0) {
|
|
289
|
+
throw new ConfigurationError('No connections configured');
|
|
290
|
+
}
|
|
291
|
+
return config;
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
if (error instanceof ConfigurationError) {
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
throw new ConfigurationError('Failed to load configuration file');
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function getFlag(flag) {
|
|
301
|
+
const flagIndex = args.indexOf(flag);
|
|
302
|
+
if (flagIndex !== -1 && flagIndex + 1 < args.length) {
|
|
303
|
+
return args[flagIndex + 1];
|
|
304
|
+
}
|
|
305
|
+
return undefined;
|
|
306
|
+
}
|
|
307
|
+
function printHelp() {
|
|
308
|
+
console.log('FreshGuard CLI - Secure Data Pipeline Monitoring');
|
|
309
|
+
console.log('');
|
|
310
|
+
console.log('Usage:');
|
|
311
|
+
console.log(' freshguard <command> [options]');
|
|
312
|
+
console.log('');
|
|
313
|
+
console.log('Commands:');
|
|
314
|
+
console.log(' init Initialize FreshGuard configuration');
|
|
315
|
+
console.log(' test Test connection to data source');
|
|
316
|
+
console.log(' run Run the monitoring scheduler');
|
|
317
|
+
console.log(' version Show version information');
|
|
318
|
+
console.log(' help Show this help message');
|
|
319
|
+
console.log('');
|
|
320
|
+
console.log('Examples:');
|
|
321
|
+
console.log(' # Set database URL and initialize');
|
|
322
|
+
console.log(' export FRESHGUARD_DATABASE_URL="postgresql://user:pass@localhost:5432/db"');
|
|
323
|
+
console.log(' freshguard init');
|
|
324
|
+
console.log('');
|
|
325
|
+
console.log(' # Test connection');
|
|
326
|
+
console.log(' freshguard test');
|
|
327
|
+
console.log('');
|
|
328
|
+
console.log(' # Run monitoring');
|
|
329
|
+
console.log(' freshguard run');
|
|
330
|
+
console.log('');
|
|
331
|
+
console.log('Environment Variables:');
|
|
332
|
+
console.log(' FRESHGUARD_DATABASE_URL Database connection string');
|
|
333
|
+
console.log(' FRESHGUARD_DB_USER Database username (optional)');
|
|
334
|
+
console.log(' FRESHGUARD_DB_PASSWORD Database password (optional)');
|
|
335
|
+
console.log(' NODE_ENV Environment (development for debug info)');
|
|
336
|
+
console.log('');
|
|
337
|
+
console.log('Security:');
|
|
338
|
+
console.log(' - Credentials are read from environment variables');
|
|
339
|
+
console.log(' - Configuration files are validated for path traversal');
|
|
340
|
+
console.log(' - SSL connections are enforced by default');
|
|
341
|
+
console.log(' - Error messages are sanitized in production');
|
|
342
|
+
console.log('');
|
|
343
|
+
console.log('For more information:');
|
|
344
|
+
console.log(' https://github.com/freshguard/freshguard');
|
|
345
|
+
}
|
|
346
|
+
main().catch((error) => {
|
|
347
|
+
console.error('Error:', error.message);
|
|
348
|
+
process.exit(1);
|
|
349
|
+
});
|
|
350
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Connector, ConnectorConfig, TableSchema, SecurityConfig } from '../types/connector.js';
|
|
2
|
+
import { DebugErrorFactory } from '../errors/debug-factory.js';
|
|
3
|
+
import type { DebugConfig } from '../types.js';
|
|
4
|
+
import type { StructuredLogger } from '../observability/logger.js';
|
|
5
|
+
import { type LogContext } from '../observability/logger.js';
|
|
6
|
+
import type { MetricsCollector } from '../observability/metrics.js';
|
|
7
|
+
import type { QueryComplexityAnalyzer } from '../security/query-analyzer.js';
|
|
8
|
+
import { type TableMetadata } from '../security/query-analyzer.js';
|
|
9
|
+
import type { SchemaCache } from '../security/schema-cache.js';
|
|
10
|
+
export declare abstract class BaseConnector implements Connector {
|
|
11
|
+
protected config: ConnectorConfig;
|
|
12
|
+
protected readonly connectionTimeout: number;
|
|
13
|
+
protected readonly queryTimeout: number;
|
|
14
|
+
protected readonly maxRows: number;
|
|
15
|
+
protected readonly requireSSL: boolean;
|
|
16
|
+
protected readonly logger: StructuredLogger;
|
|
17
|
+
protected readonly metrics: MetricsCollector;
|
|
18
|
+
protected readonly queryAnalyzer: QueryComplexityAnalyzer;
|
|
19
|
+
protected readonly schemaCache: SchemaCache;
|
|
20
|
+
protected readonly enableDetailedLogging: boolean;
|
|
21
|
+
protected readonly enableQueryAnalysis: boolean;
|
|
22
|
+
private readonly allowedPatterns;
|
|
23
|
+
private readonly blockedKeywords;
|
|
24
|
+
constructor(config: ConnectorConfig, securityConfig?: Partial<SecurityConfig>);
|
|
25
|
+
private validateConfig;
|
|
26
|
+
protected validateQuery(sql: string, tableNames?: string[]): Promise<void>;
|
|
27
|
+
private validateQueryTraditional;
|
|
28
|
+
private validateQueryWithAnalyzer;
|
|
29
|
+
private getTableMetadataForAnalysis;
|
|
30
|
+
private convertCachedToTableMetadata;
|
|
31
|
+
protected getTableMetadataFresh(tableName: string): Promise<TableMetadata | null>;
|
|
32
|
+
private cacheTableMetadata;
|
|
33
|
+
private logQueryAnalysis;
|
|
34
|
+
private getBlockingReason;
|
|
35
|
+
protected escapeIdentifier(identifier: string): string;
|
|
36
|
+
protected executeWithTimeout<T>(operation: () => Promise<T>, timeoutMs: number): Promise<T>;
|
|
37
|
+
protected sanitizeError(error: unknown): string;
|
|
38
|
+
getRowCount(table: string): Promise<number>;
|
|
39
|
+
private getRowCountInternal;
|
|
40
|
+
getMaxTimestamp(table: string, column: string): Promise<Date | null>;
|
|
41
|
+
private getMaxTimestampInternal;
|
|
42
|
+
getMinTimestamp(table: string, column: string): Promise<Date | null>;
|
|
43
|
+
private getMinTimestampInternal;
|
|
44
|
+
getLastModified(_table: string): Promise<Date | null>;
|
|
45
|
+
protected validateResultSize(results: any[]): void;
|
|
46
|
+
protected logOperation(operation: string, context: LogContext): void;
|
|
47
|
+
protected logError(operation: string, error: Error, context?: LogContext): void;
|
|
48
|
+
protected getSchemaCacheStats(): any;
|
|
49
|
+
protected clearSchemaCache(): void;
|
|
50
|
+
protected getQueryAnalyzerConfig(): any;
|
|
51
|
+
protected cleanup(): void;
|
|
52
|
+
protected abstract executeQuery(sql: string): Promise<any[]>;
|
|
53
|
+
protected executeParameterizedQuery(sql: string, parameters?: any[]): Promise<any[]>;
|
|
54
|
+
abstract testConnection(debugConfig?: DebugConfig): Promise<boolean>;
|
|
55
|
+
protected createDebugErrorFactory(debugConfig?: DebugConfig): DebugErrorFactory;
|
|
56
|
+
protected logDebugInfo(debugConfig: DebugConfig | undefined, debugId: string, operation: string, context: Record<string, unknown>): void;
|
|
57
|
+
protected logDebugError(debugConfig: DebugConfig | undefined, debugId: string, operation: string, context: Record<string, unknown>): void;
|
|
58
|
+
abstract listTables(): Promise<string[]>;
|
|
59
|
+
abstract getTableSchema(table: string): Promise<TableSchema>;
|
|
60
|
+
abstract close(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=base-connector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-connector.d.ts","sourceRoot":"","sources":["../../src/connectors/base-connector.ts"],"names":[],"mappings":"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"}
|