@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.
Files changed (233) hide show
  1. package/dist/adapters/adapter-registry.d.ts +150 -0
  2. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  3. package/dist/adapters/adapter-registry.js +271 -0
  4. package/dist/adapters/adapter-registry.js.map +1 -0
  5. package/dist/adapters/base-adapter.d.ts +101 -0
  6. package/dist/adapters/base-adapter.d.ts.map +1 -0
  7. package/dist/adapters/base-adapter.js +160 -0
  8. package/dist/adapters/base-adapter.js.map +1 -0
  9. package/dist/adapters/defender-adapter.d.ts +90 -0
  10. package/dist/adapters/defender-adapter.d.ts.map +1 -0
  11. package/dist/adapters/defender-adapter.js +227 -0
  12. package/dist/adapters/defender-adapter.js.map +1 -0
  13. package/dist/adapters/index.d.ts +22 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +23 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/syslog-adapter.d.ts +207 -0
  18. package/dist/adapters/syslog-adapter.d.ts.map +1 -0
  19. package/dist/adapters/syslog-adapter.js +432 -0
  20. package/dist/adapters/syslog-adapter.js.map +1 -0
  21. package/dist/adapters/types.d.ts +135 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +13 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/adapters/wazuh-adapter.d.ts +120 -0
  26. package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
  27. package/dist/adapters/wazuh-adapter.js +266 -0
  28. package/dist/adapters/wazuh-adapter.js.map +1 -0
  29. package/dist/ai/claude-provider.d.ts +66 -0
  30. package/dist/ai/claude-provider.d.ts.map +1 -0
  31. package/dist/ai/claude-provider.js +166 -0
  32. package/dist/ai/claude-provider.js.map +1 -0
  33. package/dist/ai/funnel-router.d.ts +75 -0
  34. package/dist/ai/funnel-router.d.ts.map +1 -0
  35. package/dist/ai/funnel-router.js +173 -0
  36. package/dist/ai/funnel-router.js.map +1 -0
  37. package/dist/ai/index.d.ts +77 -0
  38. package/dist/ai/index.d.ts.map +1 -0
  39. package/dist/ai/index.js +95 -0
  40. package/dist/ai/index.js.map +1 -0
  41. package/dist/ai/ollama-provider.d.ts +73 -0
  42. package/dist/ai/ollama-provider.d.ts.map +1 -0
  43. package/dist/ai/ollama-provider.js +200 -0
  44. package/dist/ai/ollama-provider.js.map +1 -0
  45. package/dist/ai/openai-provider.d.ts +70 -0
  46. package/dist/ai/openai-provider.d.ts.map +1 -0
  47. package/dist/ai/openai-provider.js +175 -0
  48. package/dist/ai/openai-provider.js.map +1 -0
  49. package/dist/ai/prompts/event-classifier.d.ts +25 -0
  50. package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
  51. package/dist/ai/prompts/event-classifier.js +94 -0
  52. package/dist/ai/prompts/event-classifier.js.map +1 -0
  53. package/dist/ai/prompts/index.d.ts +13 -0
  54. package/dist/ai/prompts/index.d.ts.map +1 -0
  55. package/dist/ai/prompts/index.js +13 -0
  56. package/dist/ai/prompts/index.js.map +1 -0
  57. package/dist/ai/prompts/report-generator.d.ts +25 -0
  58. package/dist/ai/prompts/report-generator.d.ts.map +1 -0
  59. package/dist/ai/prompts/report-generator.js +131 -0
  60. package/dist/ai/prompts/report-generator.js.map +1 -0
  61. package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
  62. package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
  63. package/dist/ai/prompts/threat-analyzer.js +75 -0
  64. package/dist/ai/prompts/threat-analyzer.js.map +1 -0
  65. package/dist/ai/provider-base.d.ts +100 -0
  66. package/dist/ai/provider-base.d.ts.map +1 -0
  67. package/dist/ai/provider-base.js +166 -0
  68. package/dist/ai/provider-base.js.map +1 -0
  69. package/dist/ai/response-parser.d.ts +36 -0
  70. package/dist/ai/response-parser.d.ts.map +1 -0
  71. package/dist/ai/response-parser.js +195 -0
  72. package/dist/ai/response-parser.js.map +1 -0
  73. package/dist/ai/token-tracker.d.ts +72 -0
  74. package/dist/ai/token-tracker.d.ts.map +1 -0
  75. package/dist/ai/token-tracker.js +145 -0
  76. package/dist/ai/token-tracker.js.map +1 -0
  77. package/dist/ai/types.d.ts +138 -0
  78. package/dist/ai/types.d.ts.map +1 -0
  79. package/dist/ai/types.js +12 -0
  80. package/dist/ai/types.js.map +1 -0
  81. package/dist/cli/index.d.ts +146 -0
  82. package/dist/cli/index.d.ts.map +1 -0
  83. package/dist/cli/index.js +515 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli/prompts.d.ts +58 -0
  86. package/dist/cli/prompts.d.ts.map +1 -0
  87. package/dist/cli/prompts.js +327 -0
  88. package/dist/cli/prompts.js.map +1 -0
  89. package/dist/cli/wizard.d.ts +58 -0
  90. package/dist/cli/wizard.d.ts.map +1 -0
  91. package/dist/cli/wizard.js +200 -0
  92. package/dist/cli/wizard.js.map +1 -0
  93. package/dist/discovery/firewall-checker.d.ts +28 -0
  94. package/dist/discovery/firewall-checker.d.ts.map +1 -0
  95. package/dist/discovery/firewall-checker.js +379 -0
  96. package/dist/discovery/firewall-checker.js.map +1 -0
  97. package/dist/discovery/index.d.ts +23 -0
  98. package/dist/discovery/index.d.ts.map +1 -0
  99. package/dist/discovery/index.js +29 -0
  100. package/dist/discovery/index.js.map +1 -0
  101. package/dist/discovery/network-scanner.d.ts +60 -0
  102. package/dist/discovery/network-scanner.d.ts.map +1 -0
  103. package/dist/discovery/network-scanner.js +640 -0
  104. package/dist/discovery/network-scanner.js.map +1 -0
  105. package/dist/discovery/os-detector.d.ts +24 -0
  106. package/dist/discovery/os-detector.d.ts.map +1 -0
  107. package/dist/discovery/os-detector.js +253 -0
  108. package/dist/discovery/os-detector.js.map +1 -0
  109. package/dist/discovery/osquery-provider.d.ts +127 -0
  110. package/dist/discovery/osquery-provider.d.ts.map +1 -0
  111. package/dist/discovery/osquery-provider.js +214 -0
  112. package/dist/discovery/osquery-provider.js.map +1 -0
  113. package/dist/discovery/risk-scorer.d.ts +66 -0
  114. package/dist/discovery/risk-scorer.d.ts.map +1 -0
  115. package/dist/discovery/risk-scorer.js +294 -0
  116. package/dist/discovery/risk-scorer.js.map +1 -0
  117. package/dist/discovery/security-tools.d.ts +31 -0
  118. package/dist/discovery/security-tools.d.ts.map +1 -0
  119. package/dist/discovery/security-tools.js +346 -0
  120. package/dist/discovery/security-tools.js.map +1 -0
  121. package/dist/discovery/service-detector.d.ts +28 -0
  122. package/dist/discovery/service-detector.d.ts.map +1 -0
  123. package/dist/discovery/service-detector.js +300 -0
  124. package/dist/discovery/service-detector.js.map +1 -0
  125. package/dist/discovery/types.d.ts +502 -0
  126. package/dist/discovery/types.d.ts.map +1 -0
  127. package/dist/discovery/types.js +12 -0
  128. package/dist/discovery/types.js.map +1 -0
  129. package/dist/discovery/user-auditor.d.ts +28 -0
  130. package/dist/discovery/user-auditor.d.ts.map +1 -0
  131. package/dist/discovery/user-auditor.js +385 -0
  132. package/dist/discovery/user-auditor.js.map +1 -0
  133. package/dist/i18n/config.d.ts +45 -0
  134. package/dist/i18n/config.d.ts.map +1 -0
  135. package/dist/i18n/config.js +135 -0
  136. package/dist/i18n/config.js.map +1 -0
  137. package/dist/i18n/index.d.ts +8 -0
  138. package/dist/i18n/index.d.ts.map +1 -0
  139. package/dist/i18n/index.js +8 -0
  140. package/dist/i18n/index.js.map +1 -0
  141. package/dist/index.d.ts +31 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +31 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/monitor/event-normalizer.d.ts +102 -0
  146. package/dist/monitor/event-normalizer.d.ts.map +1 -0
  147. package/dist/monitor/event-normalizer.js +195 -0
  148. package/dist/monitor/event-normalizer.js.map +1 -0
  149. package/dist/monitor/file-monitor.d.ts +90 -0
  150. package/dist/monitor/file-monitor.d.ts.map +1 -0
  151. package/dist/monitor/file-monitor.js +222 -0
  152. package/dist/monitor/file-monitor.js.map +1 -0
  153. package/dist/monitor/index.d.ts +147 -0
  154. package/dist/monitor/index.d.ts.map +1 -0
  155. package/dist/monitor/index.js +293 -0
  156. package/dist/monitor/index.js.map +1 -0
  157. package/dist/monitor/log-monitor.d.ts +102 -0
  158. package/dist/monitor/log-monitor.d.ts.map +1 -0
  159. package/dist/monitor/log-monitor.js +245 -0
  160. package/dist/monitor/log-monitor.js.map +1 -0
  161. package/dist/monitor/network-monitor.d.ts +103 -0
  162. package/dist/monitor/network-monitor.d.ts.map +1 -0
  163. package/dist/monitor/network-monitor.js +336 -0
  164. package/dist/monitor/network-monitor.js.map +1 -0
  165. package/dist/monitor/process-monitor.d.ts +108 -0
  166. package/dist/monitor/process-monitor.d.ts.map +1 -0
  167. package/dist/monitor/process-monitor.js +245 -0
  168. package/dist/monitor/process-monitor.js.map +1 -0
  169. package/dist/monitor/threat-intel-feeds.d.ts +141 -0
  170. package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
  171. package/dist/monitor/threat-intel-feeds.js +430 -0
  172. package/dist/monitor/threat-intel-feeds.js.map +1 -0
  173. package/dist/monitor/threat-intel.d.ts +83 -0
  174. package/dist/monitor/threat-intel.d.ts.map +1 -0
  175. package/dist/monitor/threat-intel.js +215 -0
  176. package/dist/monitor/threat-intel.js.map +1 -0
  177. package/dist/monitor/types.d.ts +65 -0
  178. package/dist/monitor/types.d.ts.map +1 -0
  179. package/dist/monitor/types.js +20 -0
  180. package/dist/monitor/types.js.map +1 -0
  181. package/dist/rules/index.d.ts +115 -0
  182. package/dist/rules/index.d.ts.map +1 -0
  183. package/dist/rules/index.js +244 -0
  184. package/dist/rules/index.js.map +1 -0
  185. package/dist/rules/rule-loader.d.ts +54 -0
  186. package/dist/rules/rule-loader.d.ts.map +1 -0
  187. package/dist/rules/rule-loader.js +167 -0
  188. package/dist/rules/rule-loader.js.map +1 -0
  189. package/dist/rules/sigma-matcher.d.ts +40 -0
  190. package/dist/rules/sigma-matcher.d.ts.map +1 -0
  191. package/dist/rules/sigma-matcher.js +447 -0
  192. package/dist/rules/sigma-matcher.js.map +1 -0
  193. package/dist/rules/sigma-parser.d.ts +36 -0
  194. package/dist/rules/sigma-parser.d.ts.map +1 -0
  195. package/dist/rules/sigma-parser.js +180 -0
  196. package/dist/rules/sigma-parser.js.map +1 -0
  197. package/dist/rules/types.d.ts +112 -0
  198. package/dist/rules/types.d.ts.map +1 -0
  199. package/dist/rules/types.js +11 -0
  200. package/dist/rules/types.js.map +1 -0
  201. package/dist/rules/yara-scanner.d.ts +103 -0
  202. package/dist/rules/yara-scanner.d.ts.map +1 -0
  203. package/dist/rules/yara-scanner.js +421 -0
  204. package/dist/rules/yara-scanner.js.map +1 -0
  205. package/dist/scoring/achievements.d.ts +76 -0
  206. package/dist/scoring/achievements.d.ts.map +1 -0
  207. package/dist/scoring/achievements.js +211 -0
  208. package/dist/scoring/achievements.js.map +1 -0
  209. package/dist/scoring/index.d.ts +3 -0
  210. package/dist/scoring/index.d.ts.map +1 -0
  211. package/dist/scoring/index.js +3 -0
  212. package/dist/scoring/index.js.map +1 -0
  213. package/dist/scoring/security-score.d.ts +60 -0
  214. package/dist/scoring/security-score.d.ts.map +1 -0
  215. package/dist/scoring/security-score.js +211 -0
  216. package/dist/scoring/security-score.js.map +1 -0
  217. package/dist/types.d.ts +71 -0
  218. package/dist/types.d.ts.map +1 -0
  219. package/dist/types.js +8 -0
  220. package/dist/types.js.map +1 -0
  221. package/dist/utils/index.d.ts +10 -0
  222. package/dist/utils/index.d.ts.map +1 -0
  223. package/dist/utils/index.js +9 -0
  224. package/dist/utils/index.js.map +1 -0
  225. package/dist/utils/logger.d.ts +38 -0
  226. package/dist/utils/logger.d.ts.map +1 -0
  227. package/dist/utils/logger.js +71 -0
  228. package/dist/utils/logger.js.map +1 -0
  229. package/dist/utils/validation.d.ts +35 -0
  230. package/dist/utils/validation.d.ts.map +1 -0
  231. package/dist/utils/validation.js +56 -0
  232. package/dist/utils/validation.js.map +1 -0
  233. 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":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAc;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;YACvD,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,kBAAkB;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,gDAAgD;IAChD,0CAA0C;IAC1C,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,iDAAiD,EAAE;QAClF,kBAAkB;KACnB,CAAC,CAAC;IAEH,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,oCAAoC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,+BAA+B;QAC/B,qBAAqB;QACrB,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE;YAChD,MAAM;YACN,oCAAoC;YACpC,aAAa;SACd,CAAC,CAAC;QAEH,IAAI,cAAc,EAAE,CAAC;YACnB,qFAAqF;YACrF,gDAAgD;YAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC3C,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,0CAA0C,KAAK,aAAa,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,mCAAmC;IACnC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,iDAAiD,EAAE;QACnF,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE5B,2EAA2E;YAC3E,mEAAmE;YACnE,IACE,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC;gBAC9C,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAC9C,CAAC;gBACD,+CAA+C;gBAC/C,gBAAgB;gBAChB,SAAS;YACX,CAAC;YAED,yEAAyE;YACzE,+DAA+D;YAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACnD,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnC,8DAA8D;gBAC9D,qBAAqB;gBACrB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;gBACpD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAEzD,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;oBACnC,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,SAAS;IACT,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,iDAAiD,EAAE;QACtF,kBAAkB;KACnB,CAAC,CAAC;IAEH,IAAI,aAAa,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO;QACP,OAAO,EAAE,kCAAkC;QAC3C,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,kBAAkB;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,IAAI,OAAO,GAAG,UAAU,CAAC;IAEzB,gBAAgB;IAChB,WAAW;IACX,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/D,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,CAAC;QAChB,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAExE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,cAAc,GAAG,KAAK,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE5B,kCAAkC;gBAClC,WAAW;gBACX,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7B,cAAc,GAAG,IAAI,CAAC;oBACtB,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAE1C,6BAA6B;gBAC7B,iCAAiC;gBACjC,iCAAiC;gBACjC,kBAAkB;gBAClB,iCAAiC;gBACjC,iCAAiC;gBACjC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBAClF,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAE7C,kCAAkC;oBAClC,YAAY;oBACZ,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBACpE,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;oBACjC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;oBAEpD,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,OAAO,MAAM,EAAE;wBACrB,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;wBAC5C,MAAM,EAAE,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;wBACpE,QAAQ;wBACR,IAAI;wBACJ,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,2BAA2B;IAC3B,iBAAiB;IACjB,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAElF,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,GAAG,UAAU,CAAC;QACrB,6DAA6D;QAC7D,6BAA6B;QAC7B,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC7F,CAAC;QACF,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAE/B,MAAM,CAAC,IAAI,CAAC,8BAA8B,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAEpF,uBAAuB;QACvB,iBAAiB;QACjB,IAAI,YAAY,GAAG,EAAE,CAAC;QAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAChD,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC7B,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAEpF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAE/B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAEvC,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACpE,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,GAAG,YAAY,SAAS,GAAG,EAAE;oBACnC,SAAS,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;oBACrF,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;oBAC/C,QAAQ,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;oBAC7C,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBACd,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,qCAAqC;QACrC,wBAAwB;QACxB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,GAAG,UAAU,CAAC;YACrB,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,8BAA8B,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,oBAAoB;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAE/E,IAAI,MAAM,EAAE,CAAC;QACX,2CAA2C;QAC3C,mBAAmB;QACnB,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAErE,qBAAqB;QACrB,UAAU;QACV,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE;YAC1C,aAAa;YACb,UAAU;YACV,MAAM;YACN,MAAM;YACN,UAAU;SACX,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,6CAA6C;YAC7C,eAAe;YACf,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAE5B,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,SAAS,GAAiB,IAAI,CAAC;gBACnC,IAAI,MAAM,GAAsB,OAAO,CAAC;gBACxC,IAAI,QAA4B,CAAC;gBACjC,IAAI,IAAwB,CAAC;gBAC7B,IAAI,WAAW,GAAG,IAAI,CAAC;gBAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBACvD,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;wBAAE,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAE/C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBACtD,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;wBAAE,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;oBAEzF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACnD,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;wBACf,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;oBAE5E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBACvD,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpB,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;wBAC7C,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,CAAC;oBAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBACvD,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACnB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC9B,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrC,CAAC;oBAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBACxD,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC;wBAAE,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;gBACtF,CAAC;gBAED,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI;wBACJ,SAAS;wBACT,MAAM;wBACN,QAAQ;wBACR,IAAI;wBACJ,OAAO,EAAE,WAAW;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,OAAO,EAAE,2BAA2B;QACpC,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,eAAe,GAAG,UAAU,EAAE,CAAC;IAErC,MAAM,CAAC,IAAI,CAAC,wBAAwB,eAAe,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,QAAQ,eAAe,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACX,OAAO,MAAM,kBAAkB,EAAE,CAAC;YACpC,KAAK,OAAO;gBACV,OAAO,MAAM,kBAAkB,EAAE,CAAC;YACpC,KAAK,OAAO;gBACV,OAAO,MAAM,oBAAoB,EAAE,CAAC;YACtC;gBACE,MAAM,CAAC,IAAI,CAAC,4CAA4C,eAAe,EAAE,CAAC,CAAC;gBAC3E,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,SAAS;oBAClB,KAAK,EAAE,EAAE;iBACV,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;YACpC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -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