@panguard-ai/core 0.1.0
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/dist/adapters/adapter-registry.d.ts +150 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +271 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +101 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +160 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/defender-adapter.d.ts +90 -0
- package/dist/adapters/defender-adapter.d.ts.map +1 -0
- package/dist/adapters/defender-adapter.js +227 -0
- package/dist/adapters/defender-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +22 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +23 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/syslog-adapter.d.ts +207 -0
- package/dist/adapters/syslog-adapter.d.ts.map +1 -0
- package/dist/adapters/syslog-adapter.js +432 -0
- package/dist/adapters/syslog-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +135 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +13 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/wazuh-adapter.d.ts +120 -0
- package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
- package/dist/adapters/wazuh-adapter.js +266 -0
- package/dist/adapters/wazuh-adapter.js.map +1 -0
- package/dist/ai/claude-provider.d.ts +66 -0
- package/dist/ai/claude-provider.d.ts.map +1 -0
- package/dist/ai/claude-provider.js +166 -0
- package/dist/ai/claude-provider.js.map +1 -0
- package/dist/ai/funnel-router.d.ts +75 -0
- package/dist/ai/funnel-router.d.ts.map +1 -0
- package/dist/ai/funnel-router.js +173 -0
- package/dist/ai/funnel-router.js.map +1 -0
- package/dist/ai/index.d.ts +77 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +95 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/ollama-provider.d.ts +73 -0
- package/dist/ai/ollama-provider.d.ts.map +1 -0
- package/dist/ai/ollama-provider.js +200 -0
- package/dist/ai/ollama-provider.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +70 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +175 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/prompts/event-classifier.d.ts +25 -0
- package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
- package/dist/ai/prompts/event-classifier.js +94 -0
- package/dist/ai/prompts/event-classifier.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +13 -0
- package/dist/ai/prompts/index.d.ts.map +1 -0
- package/dist/ai/prompts/index.js +13 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/report-generator.d.ts +25 -0
- package/dist/ai/prompts/report-generator.d.ts.map +1 -0
- package/dist/ai/prompts/report-generator.js +131 -0
- package/dist/ai/prompts/report-generator.js.map +1 -0
- package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
- package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
- package/dist/ai/prompts/threat-analyzer.js +75 -0
- package/dist/ai/prompts/threat-analyzer.js.map +1 -0
- package/dist/ai/provider-base.d.ts +100 -0
- package/dist/ai/provider-base.d.ts.map +1 -0
- package/dist/ai/provider-base.js +166 -0
- package/dist/ai/provider-base.js.map +1 -0
- package/dist/ai/response-parser.d.ts +36 -0
- package/dist/ai/response-parser.d.ts.map +1 -0
- package/dist/ai/response-parser.js +195 -0
- package/dist/ai/response-parser.js.map +1 -0
- package/dist/ai/token-tracker.d.ts +72 -0
- package/dist/ai/token-tracker.d.ts.map +1 -0
- package/dist/ai/token-tracker.js +145 -0
- package/dist/ai/token-tracker.js.map +1 -0
- package/dist/ai/types.d.ts +138 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +12 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/index.d.ts +146 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +515 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +58 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +327 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/wizard.d.ts +58 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +200 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/discovery/firewall-checker.d.ts +28 -0
- package/dist/discovery/firewall-checker.d.ts.map +1 -0
- package/dist/discovery/firewall-checker.js +379 -0
- package/dist/discovery/firewall-checker.js.map +1 -0
- package/dist/discovery/index.d.ts +23 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +29 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/network-scanner.d.ts +60 -0
- package/dist/discovery/network-scanner.d.ts.map +1 -0
- package/dist/discovery/network-scanner.js +640 -0
- package/dist/discovery/network-scanner.js.map +1 -0
- package/dist/discovery/os-detector.d.ts +24 -0
- package/dist/discovery/os-detector.d.ts.map +1 -0
- package/dist/discovery/os-detector.js +253 -0
- package/dist/discovery/os-detector.js.map +1 -0
- package/dist/discovery/osquery-provider.d.ts +127 -0
- package/dist/discovery/osquery-provider.d.ts.map +1 -0
- package/dist/discovery/osquery-provider.js +214 -0
- package/dist/discovery/osquery-provider.js.map +1 -0
- package/dist/discovery/risk-scorer.d.ts +66 -0
- package/dist/discovery/risk-scorer.d.ts.map +1 -0
- package/dist/discovery/risk-scorer.js +294 -0
- package/dist/discovery/risk-scorer.js.map +1 -0
- package/dist/discovery/security-tools.d.ts +31 -0
- package/dist/discovery/security-tools.d.ts.map +1 -0
- package/dist/discovery/security-tools.js +346 -0
- package/dist/discovery/security-tools.js.map +1 -0
- package/dist/discovery/service-detector.d.ts +28 -0
- package/dist/discovery/service-detector.d.ts.map +1 -0
- package/dist/discovery/service-detector.js +300 -0
- package/dist/discovery/service-detector.js.map +1 -0
- package/dist/discovery/types.d.ts +502 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +12 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/discovery/user-auditor.d.ts +28 -0
- package/dist/discovery/user-auditor.d.ts.map +1 -0
- package/dist/discovery/user-auditor.js +385 -0
- package/dist/discovery/user-auditor.js.map +1 -0
- package/dist/i18n/config.d.ts +45 -0
- package/dist/i18n/config.d.ts.map +1 -0
- package/dist/i18n/config.js +135 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/index.d.ts +8 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +8 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/monitor/event-normalizer.d.ts +102 -0
- package/dist/monitor/event-normalizer.d.ts.map +1 -0
- package/dist/monitor/event-normalizer.js +195 -0
- package/dist/monitor/event-normalizer.js.map +1 -0
- package/dist/monitor/file-monitor.d.ts +90 -0
- package/dist/monitor/file-monitor.d.ts.map +1 -0
- package/dist/monitor/file-monitor.js +222 -0
- package/dist/monitor/file-monitor.js.map +1 -0
- package/dist/monitor/index.d.ts +147 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +293 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/log-monitor.d.ts +102 -0
- package/dist/monitor/log-monitor.d.ts.map +1 -0
- package/dist/monitor/log-monitor.js +245 -0
- package/dist/monitor/log-monitor.js.map +1 -0
- package/dist/monitor/network-monitor.d.ts +103 -0
- package/dist/monitor/network-monitor.d.ts.map +1 -0
- package/dist/monitor/network-monitor.js +336 -0
- package/dist/monitor/network-monitor.js.map +1 -0
- package/dist/monitor/process-monitor.d.ts +108 -0
- package/dist/monitor/process-monitor.d.ts.map +1 -0
- package/dist/monitor/process-monitor.js +245 -0
- package/dist/monitor/process-monitor.js.map +1 -0
- package/dist/monitor/threat-intel-feeds.d.ts +141 -0
- package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
- package/dist/monitor/threat-intel-feeds.js +430 -0
- package/dist/monitor/threat-intel-feeds.js.map +1 -0
- package/dist/monitor/threat-intel.d.ts +83 -0
- package/dist/monitor/threat-intel.d.ts.map +1 -0
- package/dist/monitor/threat-intel.js +215 -0
- package/dist/monitor/threat-intel.js.map +1 -0
- package/dist/monitor/types.d.ts +65 -0
- package/dist/monitor/types.d.ts.map +1 -0
- package/dist/monitor/types.js +20 -0
- package/dist/monitor/types.js.map +1 -0
- package/dist/rules/index.d.ts +115 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +244 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/rule-loader.d.ts +54 -0
- package/dist/rules/rule-loader.d.ts.map +1 -0
- package/dist/rules/rule-loader.js +167 -0
- package/dist/rules/rule-loader.js.map +1 -0
- package/dist/rules/sigma-matcher.d.ts +40 -0
- package/dist/rules/sigma-matcher.d.ts.map +1 -0
- package/dist/rules/sigma-matcher.js +447 -0
- package/dist/rules/sigma-matcher.js.map +1 -0
- package/dist/rules/sigma-parser.d.ts +36 -0
- package/dist/rules/sigma-parser.d.ts.map +1 -0
- package/dist/rules/sigma-parser.js +180 -0
- package/dist/rules/sigma-parser.js.map +1 -0
- package/dist/rules/types.d.ts +112 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +11 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/yara-scanner.d.ts +103 -0
- package/dist/rules/yara-scanner.d.ts.map +1 -0
- package/dist/rules/yara-scanner.js +421 -0
- package/dist/rules/yara-scanner.js.map +1 -0
- package/dist/scoring/achievements.d.ts +76 -0
- package/dist/scoring/achievements.d.ts.map +1 -0
- package/dist/scoring/achievements.js +211 -0
- package/dist/scoring/achievements.js.map +1 -0
- package/dist/scoring/index.d.ts +3 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +3 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/security-score.d.ts +60 -0
- package/dist/scoring/security-score.d.ts.map +1 -0
- package/dist/scoring/security-score.js +211 -0
- package/dist/scoring/security-score.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +71 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +35 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System log monitoring via native OS log streams
|
|
3
|
+
* 透過原生作業系統日誌串流進行系統日誌監控
|
|
4
|
+
*
|
|
5
|
+
* Supports macOS (log stream), Linux (tail -F), and Windows (wevtutil).
|
|
6
|
+
* 支援 macOS (log stream)、Linux (tail -F) 和 Windows (wevtutil)。
|
|
7
|
+
*
|
|
8
|
+
* @module @panguard-ai/core/monitor/log-monitor
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'node:events';
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import { platform } from 'node:os';
|
|
13
|
+
import { createInterface } from 'node:readline';
|
|
14
|
+
import { createLogger } from '../utils/index.js';
|
|
15
|
+
import { normalizeLogEvent } from './event-normalizer.js';
|
|
16
|
+
const logger = createLogger('log-monitor');
|
|
17
|
+
/**
|
|
18
|
+
* LogMonitor - monitors system logs in real-time using OS-native tools
|
|
19
|
+
* LogMonitor - 使用作業系統原生工具即時監控系統日誌
|
|
20
|
+
*
|
|
21
|
+
* Events emitted:
|
|
22
|
+
* - 'event': SecurityEvent - when a log line is captured / 當擷取到日誌行時
|
|
23
|
+
* - 'error': Error - when the monitoring process encounters an error / 當監控程序遇到錯誤時
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const monitor = new LogMonitor();
|
|
28
|
+
* monitor.on('event', (event) => console.log(event));
|
|
29
|
+
* monitor.start();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class LogMonitor extends EventEmitter {
|
|
33
|
+
/** Whether the monitor is currently running / 監控器是否正在執行 */
|
|
34
|
+
running = false;
|
|
35
|
+
/** Child process for log streaming / 用於日誌串流的子程序 */
|
|
36
|
+
childProcess;
|
|
37
|
+
/** Monitor configuration / 監控配置 */
|
|
38
|
+
config;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new LogMonitor instance
|
|
41
|
+
* 建立新的 LogMonitor 實例
|
|
42
|
+
*
|
|
43
|
+
* @param config - Optional configuration / 可選配置
|
|
44
|
+
*/
|
|
45
|
+
constructor(config) {
|
|
46
|
+
super();
|
|
47
|
+
this.config = config ?? {};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Start monitoring system logs
|
|
51
|
+
* 開始監控系統日誌
|
|
52
|
+
*
|
|
53
|
+
* Spawns the appropriate OS-level log monitoring process:
|
|
54
|
+
* 產生適當的作業系統級日誌監控程序:
|
|
55
|
+
* - macOS: `log stream --style json --predicate 'eventType == logEvent'`
|
|
56
|
+
* - Linux: `tail -F /var/log/auth.log /var/log/syslog`
|
|
57
|
+
* - Windows: `wevtutil qe Security /f:text /rd:true /c:1`
|
|
58
|
+
*/
|
|
59
|
+
start() {
|
|
60
|
+
if (this.running) {
|
|
61
|
+
logger.warn('LogMonitor is already running');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const os = platform();
|
|
65
|
+
logger.info(`Starting log monitor on platform: ${os}`);
|
|
66
|
+
try {
|
|
67
|
+
if (os === 'darwin') {
|
|
68
|
+
this.startMacOS();
|
|
69
|
+
}
|
|
70
|
+
else if (os === 'linux') {
|
|
71
|
+
this.startLinux();
|
|
72
|
+
}
|
|
73
|
+
else if (os === 'win32') {
|
|
74
|
+
this.startWindows();
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
logger.error(`Unsupported platform: ${os}`);
|
|
78
|
+
this.emit('error', new Error(`Unsupported platform: ${os}`));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.running = true;
|
|
82
|
+
logger.info('LogMonitor started successfully');
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
logger.error('Failed to start LogMonitor', { error: String(err) });
|
|
86
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Stop monitoring system logs and clean up child processes
|
|
91
|
+
* 停止監控系統日誌並清理子程序
|
|
92
|
+
*/
|
|
93
|
+
stop() {
|
|
94
|
+
if (!this.running) {
|
|
95
|
+
logger.warn('LogMonitor is not running');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (this.childProcess) {
|
|
99
|
+
this.childProcess.removeAllListeners();
|
|
100
|
+
if (this.childProcess.stdout) {
|
|
101
|
+
this.childProcess.stdout.removeAllListeners();
|
|
102
|
+
}
|
|
103
|
+
if (this.childProcess.stderr) {
|
|
104
|
+
this.childProcess.stderr.removeAllListeners();
|
|
105
|
+
}
|
|
106
|
+
this.childProcess.kill('SIGTERM');
|
|
107
|
+
// Force kill after 3 seconds if still alive
|
|
108
|
+
// 如果仍在執行,3 秒後強制終止
|
|
109
|
+
const forceKillTimeout = setTimeout(() => {
|
|
110
|
+
if (this.childProcess && !this.childProcess.killed) {
|
|
111
|
+
this.childProcess.kill('SIGKILL');
|
|
112
|
+
}
|
|
113
|
+
}, 3000);
|
|
114
|
+
this.childProcess.once('exit', () => {
|
|
115
|
+
clearTimeout(forceKillTimeout);
|
|
116
|
+
});
|
|
117
|
+
this.childProcess = undefined;
|
|
118
|
+
}
|
|
119
|
+
this.running = false;
|
|
120
|
+
logger.info('LogMonitor stopped');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if the monitor is currently running
|
|
124
|
+
* 檢查監控器是否正在執行
|
|
125
|
+
*
|
|
126
|
+
* @returns True if running / 如果正在執行則為 true
|
|
127
|
+
*/
|
|
128
|
+
isRunning() {
|
|
129
|
+
return this.running;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Start macOS log stream monitoring
|
|
133
|
+
* 啟動 macOS 日誌串流監控
|
|
134
|
+
*/
|
|
135
|
+
startMacOS() {
|
|
136
|
+
this.childProcess = spawn('log', [
|
|
137
|
+
'stream',
|
|
138
|
+
'--style',
|
|
139
|
+
'json',
|
|
140
|
+
'--predicate',
|
|
141
|
+
'eventType == logEvent',
|
|
142
|
+
]);
|
|
143
|
+
this.attachProcessHandlers('macOS-log-stream');
|
|
144
|
+
this.parseOutputStream((line) => {
|
|
145
|
+
// macOS log stream JSON output: try to parse each line
|
|
146
|
+
// macOS 日誌串流 JSON 輸出:嘗試解析每一行
|
|
147
|
+
try {
|
|
148
|
+
const parsed = JSON.parse(line);
|
|
149
|
+
const message = typeof parsed['eventMessage'] === 'string' ? parsed['eventMessage'] : line;
|
|
150
|
+
const source = typeof parsed['senderImagePath'] === 'string' ? parsed['senderImagePath'] : 'macOS';
|
|
151
|
+
const timestamp = typeof parsed['timestamp'] === 'string' ? new Date(parsed['timestamp']) : new Date();
|
|
152
|
+
const event = normalizeLogEvent({ message, source, timestamp });
|
|
153
|
+
this.emit('event', event);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Non-JSON line (e.g., header line), treat as plain text
|
|
157
|
+
// 非 JSON 行(例如標頭行),視為純文字處理
|
|
158
|
+
if (line.trim().length > 0 && !line.startsWith('Filtering')) {
|
|
159
|
+
const event = normalizeLogEvent({
|
|
160
|
+
message: line,
|
|
161
|
+
source: 'macOS-log-stream',
|
|
162
|
+
});
|
|
163
|
+
this.emit('event', event);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Start Linux log tail monitoring
|
|
170
|
+
* 啟動 Linux 日誌尾部監控
|
|
171
|
+
*/
|
|
172
|
+
startLinux() {
|
|
173
|
+
const logPaths = this.config.logPaths ?? ['/var/log/auth.log', '/var/log/syslog'];
|
|
174
|
+
this.childProcess = spawn('tail', ['-F', ...logPaths]);
|
|
175
|
+
this.attachProcessHandlers('linux-tail');
|
|
176
|
+
this.parseOutputStream((line) => {
|
|
177
|
+
if (line.trim().length > 0) {
|
|
178
|
+
const event = normalizeLogEvent({
|
|
179
|
+
message: line,
|
|
180
|
+
source: 'syslog',
|
|
181
|
+
});
|
|
182
|
+
this.emit('event', event);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Start Windows event log monitoring
|
|
188
|
+
* 啟動 Windows 事件日誌監控
|
|
189
|
+
*/
|
|
190
|
+
startWindows() {
|
|
191
|
+
this.childProcess = spawn('wevtutil', ['qe', 'Security', '/f:text', '/rd:true', '/c:1']);
|
|
192
|
+
this.attachProcessHandlers('windows-wevtutil');
|
|
193
|
+
this.parseOutputStream((line) => {
|
|
194
|
+
if (line.trim().length > 0) {
|
|
195
|
+
const event = normalizeLogEvent({
|
|
196
|
+
message: line,
|
|
197
|
+
source: 'windows-event',
|
|
198
|
+
});
|
|
199
|
+
this.emit('event', event);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Attach error and exit handlers to the child process
|
|
205
|
+
* 將錯誤和退出處理器附加到子程序
|
|
206
|
+
*
|
|
207
|
+
* @param label - Label for logging / 用於日誌記錄的標籤
|
|
208
|
+
*/
|
|
209
|
+
attachProcessHandlers(label) {
|
|
210
|
+
if (!this.childProcess)
|
|
211
|
+
return;
|
|
212
|
+
this.childProcess.on('error', (err) => {
|
|
213
|
+
logger.error(`${label} process error: ${err.message}`);
|
|
214
|
+
this.running = false;
|
|
215
|
+
this.emit('error', err);
|
|
216
|
+
});
|
|
217
|
+
this.childProcess.on('exit', (code, signal) => {
|
|
218
|
+
logger.info(`${label} process exited`, { code, signal });
|
|
219
|
+
if (this.running) {
|
|
220
|
+
// Unexpected exit / 意外退出
|
|
221
|
+
this.running = false;
|
|
222
|
+
this.emit('error', new Error(`${label} process exited unexpectedly (code: ${code}, signal: ${signal})`));
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Parse stdout from the child process line by line
|
|
228
|
+
* 逐行解析子程序的標準輸出
|
|
229
|
+
*
|
|
230
|
+
* @param handler - Callback for each line / 每行的回呼函式
|
|
231
|
+
*/
|
|
232
|
+
parseOutputStream(handler) {
|
|
233
|
+
if (!this.childProcess?.stdout)
|
|
234
|
+
return;
|
|
235
|
+
const rl = createInterface({
|
|
236
|
+
input: this.childProcess.stdout,
|
|
237
|
+
crlfDelay: Infinity,
|
|
238
|
+
});
|
|
239
|
+
rl.on('line', handler);
|
|
240
|
+
rl.on('error', (err) => {
|
|
241
|
+
logger.error(`Readline error: ${err.message}`);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=log-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-monitor.js","sourceRoot":"","sources":["../../src/monitor/log-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network connection monitoring via polling
|
|
3
|
+
* 透過輪詢進行網路連線監控
|
|
4
|
+
*
|
|
5
|
+
* Periodically polls active network connections and emits events
|
|
6
|
+
* for newly established or closed connections.
|
|
7
|
+
* 定期輪詢活躍網路連線,並為新建立或關閉的連線發出事件。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/monitor/network-monitor
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
import type { ActiveConnection } from '../discovery/types.js';
|
|
13
|
+
/**
|
|
14
|
+
* NetworkMonitor - monitors active network connections by polling OS tools
|
|
15
|
+
* NetworkMonitor - 透過輪詢作業系統工具監控活躍網路連線
|
|
16
|
+
*
|
|
17
|
+
* Events emitted:
|
|
18
|
+
* - 'new_connection': SecurityEvent - when a new connection is detected / 當偵測到新連線時
|
|
19
|
+
* - 'closed_connection': SecurityEvent - when a connection is closed / 當連線關閉時
|
|
20
|
+
* - 'error': Error - when polling encounters an error / 當輪詢遇到錯誤時
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const monitor = new NetworkMonitor(30000);
|
|
25
|
+
* monitor.on('new_connection', (event) => console.log('New:', event));
|
|
26
|
+
* monitor.on('closed_connection', (event) => console.log('Closed:', event));
|
|
27
|
+
* monitor.start();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class NetworkMonitor extends EventEmitter {
|
|
31
|
+
/** Whether the monitor is currently running / 監控器是否正在執行 */
|
|
32
|
+
private running;
|
|
33
|
+
/** Polling timer / 輪詢計時器 */
|
|
34
|
+
private timer?;
|
|
35
|
+
/** Previous connection snapshot for diff detection / 用於差異偵測的先前連線快照 */
|
|
36
|
+
private previousConnections;
|
|
37
|
+
/** Polling interval in milliseconds / 輪詢間隔(毫秒) */
|
|
38
|
+
private pollInterval;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new NetworkMonitor instance
|
|
41
|
+
* 建立新的 NetworkMonitor 實例
|
|
42
|
+
*
|
|
43
|
+
* @param pollInterval - Polling interval in ms (default 30000) / 輪詢間隔毫秒數(預設 30000)
|
|
44
|
+
*/
|
|
45
|
+
constructor(pollInterval?: number);
|
|
46
|
+
/**
|
|
47
|
+
* Start polling for network connections
|
|
48
|
+
* 開始輪詢網路連線
|
|
49
|
+
*/
|
|
50
|
+
start(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Stop polling and clean up
|
|
53
|
+
* 停止輪詢並清理
|
|
54
|
+
*/
|
|
55
|
+
stop(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Check if the monitor is currently running
|
|
58
|
+
* 檢查監控器是否正在執行
|
|
59
|
+
*
|
|
60
|
+
* @returns True if running / 如果正在執行則為 true
|
|
61
|
+
*/
|
|
62
|
+
isRunning(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Poll current connections and emit events for changes
|
|
65
|
+
* 輪詢目前連線並為變更發出事件
|
|
66
|
+
*/
|
|
67
|
+
private pollConnections;
|
|
68
|
+
/**
|
|
69
|
+
* Get current active network connections from the OS
|
|
70
|
+
* 從作業系統取得目前活躍的網路連線
|
|
71
|
+
*
|
|
72
|
+
* Uses platform-specific tools:
|
|
73
|
+
* 使用平台特定工具:
|
|
74
|
+
* - macOS: `lsof -i -P -n`
|
|
75
|
+
* - Linux: `ss -tnp`
|
|
76
|
+
* - Windows: `netstat -an`
|
|
77
|
+
*
|
|
78
|
+
* @returns Array of active connections / 活躍連線陣列
|
|
79
|
+
*/
|
|
80
|
+
getCurrentConnections(): Promise<ActiveConnection[]>;
|
|
81
|
+
/**
|
|
82
|
+
* Parse macOS lsof output into ActiveConnection array
|
|
83
|
+
* 將 macOS lsof 輸出解析為 ActiveConnection 陣列
|
|
84
|
+
*
|
|
85
|
+
* @returns Parsed connections / 解析後的連線
|
|
86
|
+
*/
|
|
87
|
+
private parseLsof;
|
|
88
|
+
/**
|
|
89
|
+
* Parse Linux ss output into ActiveConnection array
|
|
90
|
+
* 將 Linux ss 輸出解析為 ActiveConnection 陣列
|
|
91
|
+
*
|
|
92
|
+
* @returns Parsed connections / 解析後的連線
|
|
93
|
+
*/
|
|
94
|
+
private parseSs;
|
|
95
|
+
/**
|
|
96
|
+
* Parse Windows netstat output into ActiveConnection array
|
|
97
|
+
* 將 Windows netstat 輸出解析為 ActiveConnection 陣列
|
|
98
|
+
*
|
|
99
|
+
* @returns Parsed connections / 解析後的連線
|
|
100
|
+
*/
|
|
101
|
+
private parseNetstat;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=network-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-monitor.d.ts","sourceRoot":"","sources":["../../src/monitor/network-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAgB9D;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,2DAA2D;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,4BAA4B;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,sEAAsE;IACtE,OAAO,CAAC,mBAAmB,CAA4C;IACvE,kDAAkD;IAClD,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;;OAKG;gBACS,YAAY,SAAQ;IAKhC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAiBb;;;OAGG;IACH,IAAI,IAAI,IAAI;IAgBZ;;;;;OAKG;IACH,SAAS,IAAI,OAAO;IAIpB;;;OAGG;YACW,eAAe;IA+C7B;;;;;;;;;;;OAWG;IACG,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAoB1D;;;;;OAKG;YACW,SAAS;IAyDvB;;;;;OAKG;YACW,OAAO;IAmDrB;;;;;OAKG;YACW,YAAY;CAsC3B"}
|