@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,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wizard Engine - Step-by-step interactive flow with navigation
|
|
3
|
+
* 精靈引擎 - 逐步互動流程,支援前後導航
|
|
4
|
+
*
|
|
5
|
+
* Orchestrates a sequence of WizardSteps, rendering progress indicators,
|
|
6
|
+
* handling back-navigation, conditional steps, and auto-detection.
|
|
7
|
+
*
|
|
8
|
+
* @module @panguard-ai/core/cli/wizard
|
|
9
|
+
*/
|
|
10
|
+
import { c, symbols } from './index.js';
|
|
11
|
+
import { promptSelect, promptText, promptConfirm } from './prompts.js';
|
|
12
|
+
// ============================================================
|
|
13
|
+
// Progress Rendering
|
|
14
|
+
// ============================================================
|
|
15
|
+
function renderProgress(current, total, lang) {
|
|
16
|
+
const barWidth = 24;
|
|
17
|
+
const ratio = total > 0 ? current / total : 0;
|
|
18
|
+
const filled = Math.round(barWidth * ratio);
|
|
19
|
+
const empty = barWidth - filled;
|
|
20
|
+
const percent = Math.round(ratio * 100);
|
|
21
|
+
const bar = c.safe('\u2588'.repeat(filled)) + c.dim('\u2591'.repeat(empty));
|
|
22
|
+
const stepLabel = lang === 'zh-TW' ? `\u6B65\u9A5F ${current}/${total}` : `Step ${current}/${total}`;
|
|
23
|
+
console.log(` ${c.dim(stepLabel)} ${bar} ${c.dim(`${percent}%`)}`);
|
|
24
|
+
console.log('');
|
|
25
|
+
}
|
|
26
|
+
// ============================================================
|
|
27
|
+
// Wizard Engine
|
|
28
|
+
// ============================================================
|
|
29
|
+
export class WizardEngine {
|
|
30
|
+
steps;
|
|
31
|
+
lang;
|
|
32
|
+
answers = {};
|
|
33
|
+
constructor(steps, lang) {
|
|
34
|
+
this.steps = steps;
|
|
35
|
+
this.lang = lang;
|
|
36
|
+
}
|
|
37
|
+
/** Get the current language (may be updated during the wizard) */
|
|
38
|
+
getLang() {
|
|
39
|
+
return this.lang;
|
|
40
|
+
}
|
|
41
|
+
/** Set language (useful after the language selection step) */
|
|
42
|
+
setLang(lang) {
|
|
43
|
+
this.lang = lang;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run the wizard through all steps.
|
|
47
|
+
* Returns collected answers, or null if the user cancelled.
|
|
48
|
+
*/
|
|
49
|
+
async run() {
|
|
50
|
+
// Filter to applicable steps
|
|
51
|
+
const applicableSteps = this.getApplicableSteps();
|
|
52
|
+
const total = applicableSteps.length;
|
|
53
|
+
let index = 0;
|
|
54
|
+
while (index < total) {
|
|
55
|
+
const step = applicableSteps[index];
|
|
56
|
+
// Re-evaluate applicable steps in case answers changed
|
|
57
|
+
const currentApplicable = this.getApplicableSteps();
|
|
58
|
+
if (!currentApplicable.find((s) => s.id === step.id)) {
|
|
59
|
+
// This step is no longer applicable, skip forward
|
|
60
|
+
index++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Recalculate position within current applicable steps
|
|
64
|
+
const stepNum = currentApplicable.findIndex((s) => s.id === step.id) + 1;
|
|
65
|
+
const stepTotal = currentApplicable.length;
|
|
66
|
+
renderProgress(stepNum, stepTotal, this.lang);
|
|
67
|
+
const result = await this.executeStep(step);
|
|
68
|
+
if (result === null) {
|
|
69
|
+
// User pressed back
|
|
70
|
+
if (index > 0) {
|
|
71
|
+
index--;
|
|
72
|
+
// Clear previous answer
|
|
73
|
+
const prevStep = applicableSteps[index];
|
|
74
|
+
delete this.answers[prevStep.id];
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
this.answers[step.id] = result;
|
|
79
|
+
// Special: if this is a language step, update the wizard language
|
|
80
|
+
if (step.id === 'language' && (result === 'en' || result === 'zh-TW')) {
|
|
81
|
+
this.lang = result;
|
|
82
|
+
}
|
|
83
|
+
index++;
|
|
84
|
+
}
|
|
85
|
+
return this.answers;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Execute a single step based on its inputType.
|
|
89
|
+
* Returns the answer string, or null for back-navigation.
|
|
90
|
+
*/
|
|
91
|
+
async executeStep(step) {
|
|
92
|
+
switch (step.inputType) {
|
|
93
|
+
case 'select':
|
|
94
|
+
return this.executeSelect(step);
|
|
95
|
+
case 'text':
|
|
96
|
+
return this.executeText(step);
|
|
97
|
+
case 'confirm':
|
|
98
|
+
return this.executeConfirm(step);
|
|
99
|
+
case 'auto':
|
|
100
|
+
return this.executeAuto(step);
|
|
101
|
+
default:
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async executeSelect(step) {
|
|
106
|
+
if (!step.options || step.options.length === 0)
|
|
107
|
+
return null;
|
|
108
|
+
const result = await promptSelect({
|
|
109
|
+
title: step.title,
|
|
110
|
+
description: step.description,
|
|
111
|
+
options: step.options,
|
|
112
|
+
lang: this.lang,
|
|
113
|
+
allowBack: true,
|
|
114
|
+
});
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
async executeText(step) {
|
|
118
|
+
const existing = this.answers[step.id];
|
|
119
|
+
const result = await promptText({
|
|
120
|
+
title: step.title,
|
|
121
|
+
description: step.description,
|
|
122
|
+
defaultValue: existing,
|
|
123
|
+
validate: step.validate,
|
|
124
|
+
sensitive: step.sensitive,
|
|
125
|
+
lang: this.lang,
|
|
126
|
+
allowBack: true,
|
|
127
|
+
});
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
async executeConfirm(step) {
|
|
131
|
+
const result = await promptConfirm({
|
|
132
|
+
message: step.title,
|
|
133
|
+
defaultValue: true,
|
|
134
|
+
lang: this.lang,
|
|
135
|
+
});
|
|
136
|
+
return result ? 'yes' : 'no';
|
|
137
|
+
}
|
|
138
|
+
async executeAuto(step) {
|
|
139
|
+
if (!step.autoDetect)
|
|
140
|
+
return '';
|
|
141
|
+
console.log(` ${c.heading(step.title[this.lang])}`);
|
|
142
|
+
console.log(` ${c.dim(step.description[this.lang])}`);
|
|
143
|
+
console.log('');
|
|
144
|
+
// Run auto-detection
|
|
145
|
+
const detecting = this.lang === 'zh-TW' ? '\u5075\u6E2C\u4E2D...' : 'Detecting...';
|
|
146
|
+
process.stdout.write(` ${c.sage('\u2022')} ${detecting}`);
|
|
147
|
+
try {
|
|
148
|
+
const detected = await step.autoDetect();
|
|
149
|
+
process.stdout.write(`\r\x1b[K`);
|
|
150
|
+
console.log(` ${symbols.pass} ${detected}`);
|
|
151
|
+
console.log('');
|
|
152
|
+
// Confirm the auto-detected value
|
|
153
|
+
const ok = await promptConfirm({
|
|
154
|
+
message: {
|
|
155
|
+
en: 'Is this correct?',
|
|
156
|
+
'zh-TW': '\u9019\u6B63\u78BA\u55CE\uFF1F',
|
|
157
|
+
},
|
|
158
|
+
defaultValue: true,
|
|
159
|
+
lang: this.lang,
|
|
160
|
+
});
|
|
161
|
+
if (ok)
|
|
162
|
+
return detected;
|
|
163
|
+
// User said no — let them type it
|
|
164
|
+
const manual = await promptText({
|
|
165
|
+
title: step.title,
|
|
166
|
+
lang: this.lang,
|
|
167
|
+
allowBack: true,
|
|
168
|
+
});
|
|
169
|
+
return manual;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
process.stdout.write(`\r\x1b[K`);
|
|
173
|
+
console.log(` ${symbols.warn} ${this.lang === 'zh-TW' ? '\u5075\u6E2C\u5931\u6557' : 'Detection failed'}`);
|
|
174
|
+
const manual = await promptText({
|
|
175
|
+
title: step.title,
|
|
176
|
+
lang: this.lang,
|
|
177
|
+
allowBack: true,
|
|
178
|
+
});
|
|
179
|
+
return manual;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Filter steps based on their dependency conditions and current answers.
|
|
184
|
+
*/
|
|
185
|
+
getApplicableSteps() {
|
|
186
|
+
return this.steps.filter((step) => {
|
|
187
|
+
if (!step.dependsOn)
|
|
188
|
+
return true;
|
|
189
|
+
const depValue = this.answers[step.dependsOn.stepId];
|
|
190
|
+
if (depValue === undefined)
|
|
191
|
+
return true; // Dependency not yet answered, include step
|
|
192
|
+
if (step.dependsOn.values) {
|
|
193
|
+
return step.dependsOn.values.includes(depValue);
|
|
194
|
+
}
|
|
195
|
+
// If no specific values, just check if dependency has been answered
|
|
196
|
+
return depValue !== undefined;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/cli/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firewall status checker
|
|
3
|
+
* 防火牆狀態檢查器
|
|
4
|
+
*
|
|
5
|
+
* Checks firewall status and retrieves active rules across macOS, Linux,
|
|
6
|
+
* and Windows using platform-specific firewall management commands.
|
|
7
|
+
* 使用平台特定的防火牆管理命令,跨 macOS、Linux 和 Windows 檢查防火牆狀態並擷取啟用規則。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/discovery/firewall-checker
|
|
10
|
+
*/
|
|
11
|
+
import type { FirewallStatus } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Check firewall status on the current platform
|
|
14
|
+
* 檢查目前平台的防火牆狀態
|
|
15
|
+
*
|
|
16
|
+
* Dispatches to platform-specific firewall check methods:
|
|
17
|
+
* - macOS: socketfilterfw / defaults read
|
|
18
|
+
* - Linux: ufw / iptables / nftables
|
|
19
|
+
* - Windows: netsh advfirewall
|
|
20
|
+
* 分派到平台特定的防火牆檢查方法:
|
|
21
|
+
* - macOS:socketfilterfw / defaults read
|
|
22
|
+
* - Linux:ufw / iptables / nftables
|
|
23
|
+
* - Windows:netsh advfirewall
|
|
24
|
+
*
|
|
25
|
+
* @returns Firewall status and rules / 防火牆狀態和規則
|
|
26
|
+
*/
|
|
27
|
+
export declare function checkFirewall(): Promise<FirewallStatus>;
|
|
28
|
+
//# sourceMappingURL=firewall-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firewall-checker.d.ts","sourceRoot":"","sources":["../../src/discovery/firewall-checker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AA6W/D;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC,CA+B7D"}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firewall status checker
|
|
3
|
+
* 防火牆狀態檢查器
|
|
4
|
+
*
|
|
5
|
+
* Checks firewall status and retrieves active rules across macOS, Linux,
|
|
6
|
+
* and Windows using platform-specific firewall management commands.
|
|
7
|
+
* 使用平台特定的防火牆管理命令,跨 macOS、Linux 和 Windows 檢查防火牆狀態並擷取啟用規則。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/discovery/firewall-checker
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from 'child_process';
|
|
12
|
+
import { promisify } from 'util';
|
|
13
|
+
import { platform as osPlatform } from 'os';
|
|
14
|
+
import { createLogger } from '../utils/logger.js';
|
|
15
|
+
const execFileAsync = promisify(execFile);
|
|
16
|
+
const logger = createLogger('discovery:firewall');
|
|
17
|
+
/**
|
|
18
|
+
* Safely execute a command and return stdout, or empty string on failure
|
|
19
|
+
* 安全地執行命令並回傳 stdout,失敗時回傳空字串
|
|
20
|
+
*
|
|
21
|
+
* @param cmd - Command to execute / 要執行的命令
|
|
22
|
+
* @param args - Command arguments / 命令參數
|
|
23
|
+
* @returns stdout output trimmed / 修剪後的 stdout 輸出
|
|
24
|
+
*/
|
|
25
|
+
async function safeExec(cmd, args) {
|
|
26
|
+
try {
|
|
27
|
+
const { stdout } = await execFileAsync(cmd, args, { timeout: 10_000 });
|
|
28
|
+
return stdout.trim();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
logger.debug(`Command failed: ${cmd} ${args.join(' ')}`, {
|
|
32
|
+
error: err instanceof Error ? err.message : String(err),
|
|
33
|
+
});
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check macOS Application Firewall (ALF) status
|
|
39
|
+
* 檢查 macOS 應用程式防火牆 (ALF) 狀態
|
|
40
|
+
*
|
|
41
|
+
* Uses socketfilterfw to check global state and defaults read for detailed config.
|
|
42
|
+
* 使用 socketfilterfw 檢查全域狀態,並使用 defaults read 取得詳細配置。
|
|
43
|
+
*
|
|
44
|
+
* @returns Firewall status for macOS / macOS 防火牆狀態
|
|
45
|
+
*/
|
|
46
|
+
async function checkMacOSFirewall() {
|
|
47
|
+
let enabled = false;
|
|
48
|
+
const rules = [];
|
|
49
|
+
// Method 1: Use socketfilterfw --getglobalstate
|
|
50
|
+
// 方法 1:使用 socketfilterfw --getglobalstate
|
|
51
|
+
const sfwOutput = await safeExec('/usr/libexec/ApplicationFirewall/socketfilterfw', [
|
|
52
|
+
'--getglobalstate',
|
|
53
|
+
]);
|
|
54
|
+
if (sfwOutput) {
|
|
55
|
+
enabled = sfwOutput.toLowerCase().includes('enabled');
|
|
56
|
+
logger.info(`macOS firewall (socketfilterfw): ${enabled ? 'enabled' : 'disabled'}`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Method 2: Read from defaults
|
|
60
|
+
// 方法 2:從 defaults 讀取
|
|
61
|
+
const defaultsOutput = await safeExec('defaults', [
|
|
62
|
+
'read',
|
|
63
|
+
'/Library/Preferences/com.apple.alf',
|
|
64
|
+
'globalstate',
|
|
65
|
+
]);
|
|
66
|
+
if (defaultsOutput) {
|
|
67
|
+
// globalstate: 0 = off, 1 = on (specific services), 2 = on (essential services only)
|
|
68
|
+
// globalstate:0 = 關閉,1 = 開啟(特定服務),2 = 開啟(僅基本服務)
|
|
69
|
+
const state = parseInt(defaultsOutput, 10);
|
|
70
|
+
enabled = state > 0;
|
|
71
|
+
logger.info(`macOS firewall (defaults): globalstate=${state}, enabled=${enabled}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Try to list allowed/blocked apps via socketfilterfw
|
|
75
|
+
// 嘗試透過 socketfilterfw 列出允許/封鎖的應用程式
|
|
76
|
+
const listOutput = await safeExec('/usr/libexec/ApplicationFirewall/socketfilterfw', [
|
|
77
|
+
'--listapps',
|
|
78
|
+
]);
|
|
79
|
+
if (listOutput) {
|
|
80
|
+
const lines = listOutput.split('\n');
|
|
81
|
+
for (const line of lines) {
|
|
82
|
+
const trimmed = line.trim();
|
|
83
|
+
// Lines like: "Allow incoming connections" or "Block incoming connections"
|
|
84
|
+
// 行內容如:"Allow incoming connections" 或 "Block incoming connections"
|
|
85
|
+
if (trimmed.includes('Allow incoming connections') ||
|
|
86
|
+
trimmed.includes('Block incoming connections')) {
|
|
87
|
+
// The previous line typically has the app path
|
|
88
|
+
// 前一行通常包含應用程式路徑
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Match app entries: index app-path (Allow/Block incoming connections)
|
|
92
|
+
// 比對應用程式條目:index app-path (Allow/Block incoming connections)
|
|
93
|
+
const appMatch = trimmed.match(/^\d+\s*:\s*(.+)$/);
|
|
94
|
+
if (appMatch?.[1]) {
|
|
95
|
+
const appPath = appMatch[1].trim();
|
|
96
|
+
// Check the next relevant context to determine if allow/block
|
|
97
|
+
// 檢查下一個相關上下文以判斷允許/封鎖
|
|
98
|
+
const appName = appPath.split('/').pop() ?? appPath;
|
|
99
|
+
const isAllow = !trimmed.toLowerCase().includes('block');
|
|
100
|
+
rules.push({
|
|
101
|
+
name: appName,
|
|
102
|
+
direction: 'in',
|
|
103
|
+
action: isAllow ? 'allow' : 'block',
|
|
104
|
+
protocol: undefined,
|
|
105
|
+
port: undefined,
|
|
106
|
+
enabled: true,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Check stealth mode
|
|
112
|
+
// 檢查隱身模式
|
|
113
|
+
const stealthOutput = await safeExec('/usr/libexec/ApplicationFirewall/socketfilterfw', [
|
|
114
|
+
'--getstealthmode',
|
|
115
|
+
]);
|
|
116
|
+
if (stealthOutput && stealthOutput.toLowerCase().includes('enabled')) {
|
|
117
|
+
rules.push({
|
|
118
|
+
name: 'Stealth Mode',
|
|
119
|
+
direction: 'in',
|
|
120
|
+
action: 'block',
|
|
121
|
+
protocol: 'icmp',
|
|
122
|
+
port: undefined,
|
|
123
|
+
enabled: true,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
enabled,
|
|
128
|
+
product: 'macOS Application Firewall (ALF)',
|
|
129
|
+
rules,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check Linux firewall status (iptables / ufw)
|
|
134
|
+
* 檢查 Linux 防火牆狀態(iptables / ufw)
|
|
135
|
+
*
|
|
136
|
+
* Tries ufw first, then falls back to iptables.
|
|
137
|
+
* 優先嘗試 ufw,然後回退到 iptables。
|
|
138
|
+
*
|
|
139
|
+
* @returns Firewall status for Linux / Linux 防火牆狀態
|
|
140
|
+
*/
|
|
141
|
+
async function checkLinuxFirewall() {
|
|
142
|
+
let enabled = false;
|
|
143
|
+
const rules = [];
|
|
144
|
+
let product = 'iptables';
|
|
145
|
+
// Try ufw first
|
|
146
|
+
// 優先嘗試 ufw
|
|
147
|
+
const ufwOutput = await safeExec('ufw', ['status', 'verbose']);
|
|
148
|
+
if (ufwOutput) {
|
|
149
|
+
product = 'ufw';
|
|
150
|
+
enabled = ufwOutput.toLowerCase().includes('status: active');
|
|
151
|
+
logger.info(`Linux firewall (ufw): ${enabled ? 'active' : 'inactive'}`);
|
|
152
|
+
if (enabled) {
|
|
153
|
+
const lines = ufwOutput.split('\n');
|
|
154
|
+
let inRulesSection = false;
|
|
155
|
+
for (const line of lines) {
|
|
156
|
+
const trimmed = line.trim();
|
|
157
|
+
// Detect the rules section header
|
|
158
|
+
// 偵測規則區段標頭
|
|
159
|
+
if (trimmed.startsWith('--')) {
|
|
160
|
+
inRulesSection = true;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (!inRulesSection || !trimmed)
|
|
164
|
+
continue;
|
|
165
|
+
// Parse ufw rule lines like:
|
|
166
|
+
// 22/tcp ALLOW IN Anywhere
|
|
167
|
+
// 80/tcp DENY IN Anywhere
|
|
168
|
+
// 解析 ufw 規則行,格式如:
|
|
169
|
+
// 22/tcp ALLOW IN Anywhere
|
|
170
|
+
// 80/tcp DENY IN Anywhere
|
|
171
|
+
const ruleMatch = trimmed.match(/^(\S+)\s+(ALLOW|DENY|REJECT|LIMIT)\s+(IN|OUT)/i);
|
|
172
|
+
if (ruleMatch?.[1] && ruleMatch[2] && ruleMatch[3]) {
|
|
173
|
+
const target = ruleMatch[1];
|
|
174
|
+
const action = ruleMatch[2].toUpperCase();
|
|
175
|
+
const direction = ruleMatch[3].toUpperCase();
|
|
176
|
+
// Parse port/protocol from target
|
|
177
|
+
// 從目標解析埠/協定
|
|
178
|
+
const portProtoMatch = target.match(/^(\d+(?::\d+)?)\/(tcp|udp)$/i);
|
|
179
|
+
const port = portProtoMatch?.[1];
|
|
180
|
+
const protocol = portProtoMatch?.[2]?.toLowerCase();
|
|
181
|
+
rules.push({
|
|
182
|
+
name: `ufw-${target}`,
|
|
183
|
+
direction: direction === 'IN' ? 'in' : 'out',
|
|
184
|
+
action: action === 'ALLOW' || action === 'LIMIT' ? 'allow' : 'block',
|
|
185
|
+
protocol,
|
|
186
|
+
port,
|
|
187
|
+
enabled: true,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return { enabled, product, rules };
|
|
193
|
+
}
|
|
194
|
+
// Fallback: check iptables
|
|
195
|
+
// 備用:檢查 iptables
|
|
196
|
+
const iptablesOutput = await safeExec('iptables', ['-L', '-n', '--line-numbers']);
|
|
197
|
+
if (iptablesOutput) {
|
|
198
|
+
product = 'iptables';
|
|
199
|
+
// If iptables has any non-default rules, consider it enabled
|
|
200
|
+
// 如果 iptables 有任何非預設規則,視為已啟用
|
|
201
|
+
const lines = iptablesOutput.split('\n');
|
|
202
|
+
const ruleLines = lines.filter((l) => l.trim() && !l.startsWith('Chain') && !l.startsWith('num') && !l.startsWith('target'));
|
|
203
|
+
enabled = ruleLines.length > 0;
|
|
204
|
+
logger.info(`Linux firewall (iptables): ${enabled ? 'rules present' : 'no rules'}`);
|
|
205
|
+
// Parse iptables rules
|
|
206
|
+
// 解析 iptables 規則
|
|
207
|
+
let currentChain = '';
|
|
208
|
+
for (const line of lines) {
|
|
209
|
+
const chainMatch = line.match(/^Chain\s+(\w+)/);
|
|
210
|
+
if (chainMatch?.[1]) {
|
|
211
|
+
currentChain = chainMatch[1];
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const trimmed = line.trim();
|
|
215
|
+
if (!trimmed || trimmed.startsWith('num') || trimmed.startsWith('target'))
|
|
216
|
+
continue;
|
|
217
|
+
const parts = trimmed.split(/\s+/);
|
|
218
|
+
if (parts.length < 4)
|
|
219
|
+
continue;
|
|
220
|
+
const num = parts[0] ?? '0';
|
|
221
|
+
const target = parts[1] ?? '';
|
|
222
|
+
const proto = parts[2] ?? '';
|
|
223
|
+
const dpt = trimmed.match(/dpt:(\d+)/);
|
|
224
|
+
if (target === 'ACCEPT' || target === 'DROP' || target === 'REJECT') {
|
|
225
|
+
rules.push({
|
|
226
|
+
name: `${currentChain}-rule-${num}`,
|
|
227
|
+
direction: currentChain === 'INPUT' ? 'in' : currentChain === 'OUTPUT' ? 'out' : 'in',
|
|
228
|
+
action: target === 'ACCEPT' ? 'allow' : 'block',
|
|
229
|
+
protocol: proto === 'all' ? undefined : proto,
|
|
230
|
+
port: dpt?.[1],
|
|
231
|
+
enabled: true,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
// Check nftables as another fallback
|
|
238
|
+
// 檢查 nftables 作為另一個備用方案
|
|
239
|
+
const nftOutput = await safeExec('nft', ['list', 'ruleset']);
|
|
240
|
+
if (nftOutput) {
|
|
241
|
+
product = 'nftables';
|
|
242
|
+
enabled = nftOutput.includes('chain') && nftOutput.includes('rule');
|
|
243
|
+
logger.info(`Linux firewall (nftables): ${enabled ? 'rules present' : 'no rules'}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return { enabled, product, rules };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Check Windows Firewall status via netsh
|
|
250
|
+
* 透過 netsh 檢查 Windows 防火牆狀態
|
|
251
|
+
*
|
|
252
|
+
* Uses 'netsh advfirewall show allprofiles' to check status.
|
|
253
|
+
* 使用 'netsh advfirewall show allprofiles' 檢查狀態。
|
|
254
|
+
*
|
|
255
|
+
* @returns Firewall status for Windows / Windows 防火牆狀態
|
|
256
|
+
*/
|
|
257
|
+
async function checkWindowsFirewall() {
|
|
258
|
+
let enabled = false;
|
|
259
|
+
const rules = [];
|
|
260
|
+
const output = await safeExec('netsh', ['advfirewall', 'show', 'allprofiles']);
|
|
261
|
+
if (output) {
|
|
262
|
+
// Check if any profile has the firewall ON
|
|
263
|
+
// 檢查是否有任何設定檔已開啟防火牆
|
|
264
|
+
enabled = output.toLowerCase().includes('state on');
|
|
265
|
+
logger.info(`Windows Firewall: ${enabled ? 'enabled' : 'disabled'}`);
|
|
266
|
+
// Get firewall rules
|
|
267
|
+
// 取得防火牆規則
|
|
268
|
+
const rulesOutput = await safeExec('netsh', [
|
|
269
|
+
'advfirewall',
|
|
270
|
+
'firewall',
|
|
271
|
+
'show',
|
|
272
|
+
'rule',
|
|
273
|
+
'name=all',
|
|
274
|
+
]);
|
|
275
|
+
if (rulesOutput) {
|
|
276
|
+
// Parse rule blocks separated by blank lines
|
|
277
|
+
// 解析以空行分隔的規則區塊
|
|
278
|
+
const blocks = rulesOutput.split(/\n\s*\n/);
|
|
279
|
+
for (const block of blocks) {
|
|
280
|
+
if (!block.trim())
|
|
281
|
+
continue;
|
|
282
|
+
let name = '';
|
|
283
|
+
let direction = 'in';
|
|
284
|
+
let action = 'allow';
|
|
285
|
+
let protocol;
|
|
286
|
+
let port;
|
|
287
|
+
let ruleEnabled = true;
|
|
288
|
+
const lines = block.split('\n');
|
|
289
|
+
for (const line of lines) {
|
|
290
|
+
const trimmed = line.trim();
|
|
291
|
+
const nameMatch = trimmed.match(/^Rule Name:\s*(.+)/i);
|
|
292
|
+
if (nameMatch?.[1])
|
|
293
|
+
name = nameMatch[1].trim();
|
|
294
|
+
const dirMatch = trimmed.match(/^Direction:\s*(.+)/i);
|
|
295
|
+
if (dirMatch?.[1])
|
|
296
|
+
direction = dirMatch[1].trim().toLowerCase() === 'out' ? 'out' : 'in';
|
|
297
|
+
const actMatch = trimmed.match(/^Action:\s*(.+)/i);
|
|
298
|
+
if (actMatch?.[1])
|
|
299
|
+
action = actMatch[1].trim().toLowerCase() === 'block' ? 'block' : 'allow';
|
|
300
|
+
const protoMatch = trimmed.match(/^Protocol:\s*(.+)/i);
|
|
301
|
+
if (protoMatch?.[1]) {
|
|
302
|
+
const p = protoMatch[1].trim().toLowerCase();
|
|
303
|
+
protocol = p === 'any' ? undefined : p;
|
|
304
|
+
}
|
|
305
|
+
const portMatch = trimmed.match(/^LocalPort:\s*(.+)/i);
|
|
306
|
+
if (portMatch?.[1]) {
|
|
307
|
+
const p = portMatch[1].trim();
|
|
308
|
+
port = p === 'Any' ? undefined : p;
|
|
309
|
+
}
|
|
310
|
+
const enabledMatch = trimmed.match(/^Enabled:\s*(.+)/i);
|
|
311
|
+
if (enabledMatch?.[1])
|
|
312
|
+
ruleEnabled = enabledMatch[1].trim().toLowerCase() === 'yes';
|
|
313
|
+
}
|
|
314
|
+
if (name) {
|
|
315
|
+
rules.push({
|
|
316
|
+
name,
|
|
317
|
+
direction,
|
|
318
|
+
action,
|
|
319
|
+
protocol,
|
|
320
|
+
port,
|
|
321
|
+
enabled: ruleEnabled,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
enabled,
|
|
329
|
+
product: 'Windows Defender Firewall',
|
|
330
|
+
rules,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Check firewall status on the current platform
|
|
335
|
+
* 檢查目前平台的防火牆狀態
|
|
336
|
+
*
|
|
337
|
+
* Dispatches to platform-specific firewall check methods:
|
|
338
|
+
* - macOS: socketfilterfw / defaults read
|
|
339
|
+
* - Linux: ufw / iptables / nftables
|
|
340
|
+
* - Windows: netsh advfirewall
|
|
341
|
+
* 分派到平台特定的防火牆檢查方法:
|
|
342
|
+
* - macOS:socketfilterfw / defaults read
|
|
343
|
+
* - Linux:ufw / iptables / nftables
|
|
344
|
+
* - Windows:netsh advfirewall
|
|
345
|
+
*
|
|
346
|
+
* @returns Firewall status and rules / 防火牆狀態和規則
|
|
347
|
+
*/
|
|
348
|
+
export async function checkFirewall() {
|
|
349
|
+
const currentPlatform = osPlatform();
|
|
350
|
+
logger.info(`Checking firewall on ${currentPlatform}`);
|
|
351
|
+
try {
|
|
352
|
+
switch (currentPlatform) {
|
|
353
|
+
case 'darwin':
|
|
354
|
+
return await checkMacOSFirewall();
|
|
355
|
+
case 'linux':
|
|
356
|
+
return await checkLinuxFirewall();
|
|
357
|
+
case 'win32':
|
|
358
|
+
return await checkWindowsFirewall();
|
|
359
|
+
default:
|
|
360
|
+
logger.warn(`Unsupported platform for firewall check: ${currentPlatform}`);
|
|
361
|
+
return {
|
|
362
|
+
enabled: false,
|
|
363
|
+
product: 'unknown',
|
|
364
|
+
rules: [],
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
logger.error('Firewall check failed', {
|
|
370
|
+
error: err instanceof Error ? err.message : String(err),
|
|
371
|
+
});
|
|
372
|
+
return {
|
|
373
|
+
enabled: false,
|
|
374
|
+
product: 'unknown',
|
|
375
|
+
rules: [],
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=firewall-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firewall-checker.js","sourceRoot":"","sources":["../../src/discovery/firewall-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Discovery Engine
|
|
3
|
+
* 環境偵察引擎
|
|
4
|
+
*
|
|
5
|
+
* Provides system discovery capabilities including OS detection,
|
|
6
|
+
* network scanning, service enumeration, and security tool detection.
|
|
7
|
+
* 提供系統偵察功能,包括作業系統偵測、網路掃描、服務列舉和安全工具偵測。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/discovery
|
|
10
|
+
*/
|
|
11
|
+
/** Discovery engine version / 偵察引擎版本 */
|
|
12
|
+
export declare const DISCOVERY_VERSION = "0.1.0";
|
|
13
|
+
export type { DiscoveryConfig, OSInfo, NetworkInterface, PortInfo, ActiveConnection, NetworkInfo, ServiceInfo, SecurityToolType, SecurityTool, FirewallRule, FirewallStatus, UpdateStatus, UserInfo, RiskFactor, DiscoveryResult, } from './types.js';
|
|
14
|
+
export { detectOS } from './os-detector.js';
|
|
15
|
+
export { getNetworkInterfaces, scanOpenPorts, getActiveConnections, getGateway, getDnsServers, getDnsServersAsync, } from './network-scanner.js';
|
|
16
|
+
export { detectServices } from './service-detector.js';
|
|
17
|
+
export { detectSecurityTools } from './security-tools.js';
|
|
18
|
+
export { checkFirewall } from './firewall-checker.js';
|
|
19
|
+
export { auditUsers } from './user-auditor.js';
|
|
20
|
+
export { calculateRiskScore, getRiskLevel } from './risk-scorer.js';
|
|
21
|
+
export { OsqueryProvider, createOsqueryProvider } from './osquery-provider.js';
|
|
22
|
+
export type { OsqueryProcess, OsqueryListeningPort, OsqueryLoggedInUser, } from './osquery-provider.js';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|