termify-agent 1.0.33 → 1.0.35

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 (60) hide show
  1. package/dist/agent.d.ts +13 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +236 -0
  4. package/dist/agent.js.map +1 -1
  5. package/dist/config.d.ts +2 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +5 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/index.js +184 -15
  10. package/dist/index.js.map +1 -1
  11. package/dist/network/backends/windows-wireguard-backend.d.ts +29 -0
  12. package/dist/network/backends/windows-wireguard-backend.d.ts.map +1 -0
  13. package/dist/network/backends/windows-wireguard-backend.js +190 -0
  14. package/dist/network/backends/windows-wireguard-backend.js.map +1 -0
  15. package/dist/network/key-rotation.d.ts +55 -0
  16. package/dist/network/key-rotation.d.ts.map +1 -0
  17. package/dist/network/key-rotation.js +105 -0
  18. package/dist/network/key-rotation.js.map +1 -0
  19. package/dist/network/nat-traversal.d.ts +27 -0
  20. package/dist/network/nat-traversal.d.ts.map +1 -0
  21. package/dist/network/nat-traversal.js +76 -0
  22. package/dist/network/nat-traversal.js.map +1 -0
  23. package/dist/network/uapi-client.d.ts +50 -0
  24. package/dist/network/uapi-client.d.ts.map +1 -0
  25. package/dist/network/uapi-client.js +260 -0
  26. package/dist/network/uapi-client.js.map +1 -0
  27. package/dist/network/wireguard-backend.d.ts +60 -0
  28. package/dist/network/wireguard-backend.d.ts.map +1 -0
  29. package/dist/network/wireguard-backend.js +9 -0
  30. package/dist/network/wireguard-backend.js.map +1 -0
  31. package/dist/network/wireguard-installer.d.ts +24 -0
  32. package/dist/network/wireguard-installer.d.ts.map +1 -0
  33. package/dist/network/wireguard-installer.js +362 -0
  34. package/dist/network/wireguard-installer.js.map +1 -0
  35. package/dist/network/wireguard-manager.d.ts +92 -0
  36. package/dist/network/wireguard-manager.d.ts.map +1 -0
  37. package/dist/network/wireguard-manager.js +575 -0
  38. package/dist/network/wireguard-manager.js.map +1 -0
  39. package/dist/network/wireguard-state-store.d.ts +55 -0
  40. package/dist/network/wireguard-state-store.d.ts.map +1 -0
  41. package/dist/network/wireguard-state-store.js +196 -0
  42. package/dist/network/wireguard-state-store.js.map +1 -0
  43. package/dist/ssh-manager.d.ts +5 -0
  44. package/dist/ssh-manager.d.ts.map +1 -1
  45. package/dist/ssh-manager.js +104 -0
  46. package/dist/ssh-manager.js.map +1 -1
  47. package/dist/tunnel-manager.d.ts +65 -0
  48. package/dist/tunnel-manager.d.ts.map +1 -0
  49. package/dist/tunnel-manager.js +267 -0
  50. package/dist/tunnel-manager.js.map +1 -0
  51. package/dist/utils/machine-id.d.ts +2 -1
  52. package/dist/utils/machine-id.d.ts.map +1 -1
  53. package/dist/utils/machine-id.js +10 -4
  54. package/dist/utils/machine-id.js.map +1 -1
  55. package/dist/ws-client.d.ts +145 -0
  56. package/dist/ws-client.d.ts.map +1 -1
  57. package/dist/ws-client.js +136 -1
  58. package/dist/ws-client.js.map +1 -1
  59. package/package.json +1 -1
  60. package/scripts/postinstall.js +100 -35
@@ -0,0 +1,60 @@
1
+ /**
2
+ * WireGuard backend abstraction layer.
3
+ *
4
+ * Defines the platform-agnostic interface that concrete implementations
5
+ * (Linux kernel, wireguard-go on macOS, etc.) must satisfy. No runtime
6
+ * dependencies - this module is pure types.
7
+ */
8
+ export interface WgSelfConfig {
9
+ interfaceName: string;
10
+ virtualIp: string;
11
+ listenPort: number;
12
+ privateKeyPath: string;
13
+ /** Base64-encoded private key for UAPI mode (avoids needing `wg` CLI). */
14
+ privateKeyBase64?: string;
15
+ }
16
+ export interface WgPeerConfig {
17
+ agentId: string;
18
+ publicKey: string;
19
+ allowedIps: string;
20
+ endpoint?: string;
21
+ persistentKeepalive: number;
22
+ }
23
+ export interface WgPeerHealth {
24
+ publicKey: string;
25
+ endpoint?: string;
26
+ allowedIps: string;
27
+ latestHandshake?: Date;
28
+ transferRx: number;
29
+ transferTx: number;
30
+ }
31
+ export interface WgHealthSnapshot {
32
+ interfaceUp: boolean;
33
+ publicKey: string;
34
+ listenPort: number;
35
+ peers: WgPeerHealth[];
36
+ }
37
+ export interface WgAvailabilityResult {
38
+ available: boolean;
39
+ reason?: string;
40
+ version?: string;
41
+ }
42
+ export interface WireGuardBackend {
43
+ /** Check if WG binary/tools are available on this platform. */
44
+ isAvailable(): Promise<WgAvailabilityResult>;
45
+ /** Create or ensure the WG interface is up with the given config. */
46
+ ensureInterface(config: WgSelfConfig): Promise<void>;
47
+ /** Set (replace) all peers on the interface. */
48
+ setPeers(interfaceName: string, peers: WgPeerConfig[]): Promise<void>;
49
+ /** Add a single peer to the interface. */
50
+ addPeer(interfaceName: string, peer: WgPeerConfig): Promise<void>;
51
+ /** Remove a single peer by its public key. */
52
+ removePeer(interfaceName: string, publicKey: string): Promise<void>;
53
+ /** Update the endpoint of an existing peer (for NAT traversal hot-update). */
54
+ updatePeerEndpoint(interfaceName: string, publicKey: string, endpoint: string): Promise<void>;
55
+ /** Get a health/stats snapshot for the interface. */
56
+ getHealth(interfaceName: string): Promise<WgHealthSnapshot>;
57
+ /** Tear down (destroy) the interface. */
58
+ teardown(interfaceName: string): Promise<void>;
59
+ }
60
+ //# sourceMappingURL=wireguard-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireguard-backend.d.ts","sourceRoot":"","sources":["../../src/network/wireguard-backend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAMD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAMD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,WAAW,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE7C,qEAAqE;IACrE,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE,0CAA0C;IAC1C,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElE,8CAA8C;IAC9C,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE,8EAA8E;IAC9E,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9F,qDAAqD;IACrD,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE5D,yCAAyC;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * WireGuard backend abstraction layer.
3
+ *
4
+ * Defines the platform-agnostic interface that concrete implementations
5
+ * (Linux kernel, wireguard-go on macOS, etc.) must satisfy. No runtime
6
+ * dependencies - this module is pure types.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=wireguard-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireguard-backend.js","sourceRoot":"","sources":["../../src/network/wireguard-backend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * WireGuard detection and auto-installation.
3
+ *
4
+ * Detects the OS, locates WireGuard binaries, and - when running with
5
+ * sufficient privileges - can attempt automatic installation on
6
+ * Debian/Ubuntu Linux. macOS users are pointed at Homebrew.
7
+ *
8
+ * All child processes use `execFile` (never `exec`) to prevent shell
9
+ * injection.
10
+ */
11
+ export type WgAvailability = 'available' | 'missing_binary' | 'missing_privilege' | 'unsupported_os';
12
+ export type WgBackendKind = 'kernel' | 'wireguard-go' | 'windows-service' | 'none';
13
+ export interface WgInstallResult {
14
+ available: boolean;
15
+ availability: WgAvailability;
16
+ backend: WgBackendKind;
17
+ version?: string;
18
+ binaryPath?: string;
19
+ /** True when using bundled wireguard-go from ~/.termify/ */
20
+ bundled?: boolean;
21
+ }
22
+ export declare function detectWireGuard(): Promise<WgInstallResult>;
23
+ export declare function installWireGuard(): Promise<WgInstallResult>;
24
+ //# sourceMappingURL=wireguard-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireguard-installer.d.ts","sourceRoot":"","sources":["../../src/network/wireguard-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,gBAAgB,CAAC;AAErB,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,cAAc,GAAG,iBAAiB,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,cAAc,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAsGD,wBAAsB,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC,CAmKhE;AAMD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,eAAe,CAAC,CAuGjE"}
@@ -0,0 +1,362 @@
1
+ /**
2
+ * WireGuard detection and auto-installation.
3
+ *
4
+ * Detects the OS, locates WireGuard binaries, and - when running with
5
+ * sufficient privileges - can attempt automatic installation on
6
+ * Debian/Ubuntu Linux. macOS users are pointed at Homebrew.
7
+ *
8
+ * All child processes use `execFile` (never `exec`) to prevent shell
9
+ * injection.
10
+ */
11
+ import { execFile as execFileCb } from 'node:child_process';
12
+ import { promisify } from 'node:util';
13
+ import { platform as osPlatform, homedir } from 'node:os';
14
+ import { join } from 'node:path';
15
+ import { logger } from '../utils/logger.js';
16
+ const execFile = promisify(execFileCb);
17
+ // ---------------------------------------------------------------------------
18
+ // Helpers
19
+ // ---------------------------------------------------------------------------
20
+ async function which(binary) {
21
+ try {
22
+ // Use 'where' on Windows, 'which' on Unix
23
+ const cmd = osPlatform() === 'win32' ? 'where' : 'which';
24
+ const { stdout } = await execFile(cmd, [binary]);
25
+ // 'where' on Windows may return multiple lines; take the first
26
+ const path = stdout.trim().split('\n')[0]?.trim();
27
+ return path || null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ /**
34
+ * Locate wg.exe on Windows. Checks the standard install path first,
35
+ * then falls back to PATH.
36
+ */
37
+ async function findWgWindows() {
38
+ const standardPath = 'C:\\Program Files\\WireGuard\\wg.exe';
39
+ try {
40
+ const { access, constants } = await import('node:fs/promises');
41
+ await access(standardPath, constants.X_OK);
42
+ return standardPath;
43
+ }
44
+ catch {
45
+ // Not at standard location, try PATH
46
+ return which('wg');
47
+ }
48
+ }
49
+ async function getWgVersion(binaryPath) {
50
+ try {
51
+ const { stdout } = await execFile(binaryPath, ['--version']);
52
+ return stdout.trim() || null;
53
+ }
54
+ catch {
55
+ // Some versions of wg don't support --version; fall back gracefully
56
+ return null;
57
+ }
58
+ }
59
+ async function isRoot() {
60
+ if (osPlatform() === 'win32')
61
+ return false;
62
+ try {
63
+ const { stdout } = await execFile('id', ['-u']);
64
+ return stdout.trim() === '0';
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ async function hasNetAdmin() {
71
+ if (osPlatform() !== 'linux')
72
+ return false;
73
+ try {
74
+ // capsh is part of libcap2-bin
75
+ const { stdout } = await execFile('capsh', ['--print']);
76
+ return stdout.includes('cap_net_admin');
77
+ }
78
+ catch {
79
+ // If capsh is unavailable, fall back to root check
80
+ return isRoot();
81
+ }
82
+ }
83
+ async function detectDistroFamilyAsync() {
84
+ if (osPlatform() !== 'linux')
85
+ return 'unknown';
86
+ try {
87
+ const fs = await import('node:fs/promises');
88
+ const osRelease = await fs.readFile('/etc/os-release', 'utf-8');
89
+ if (/ID_LIKE=.*debian/i.test(osRelease) || /^ID=debian$/m.test(osRelease) || /^ID=ubuntu$/m.test(osRelease)) {
90
+ return 'debian';
91
+ }
92
+ if (/ID_LIKE=.*rhel/i.test(osRelease) || /^ID=fedora$/m.test(osRelease) || /^ID=centos$/m.test(osRelease)) {
93
+ return 'redhat';
94
+ }
95
+ return 'unknown';
96
+ }
97
+ catch {
98
+ return 'unknown';
99
+ }
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Detection
103
+ // ---------------------------------------------------------------------------
104
+ /**
105
+ * Check if bundled wireguard-go exists at ~/.termify/wireguard-go
106
+ */
107
+ async function findBundledWireguardGo() {
108
+ const bundledPath = join(homedir(), '.termify', 'wireguard-go');
109
+ try {
110
+ const { access, constants } = await import('node:fs/promises');
111
+ await access(bundledPath, constants.X_OK);
112
+ return bundledPath;
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ export async function detectWireGuard() {
119
+ const plat = osPlatform();
120
+ if (plat !== 'linux' && plat !== 'darwin' && plat !== 'win32') {
121
+ logger.debug('[WG Installer] Unsupported OS: ' + plat);
122
+ return {
123
+ available: false,
124
+ availability: 'unsupported_os',
125
+ backend: 'none',
126
+ };
127
+ }
128
+ // ---- Windows ----
129
+ if (plat === 'win32') {
130
+ const wgPath = await findWgWindows();
131
+ if (!wgPath) {
132
+ logger.debug('[WG Installer] wg.exe not found on Windows');
133
+ return {
134
+ available: false,
135
+ availability: 'missing_binary',
136
+ backend: 'windows-service',
137
+ };
138
+ }
139
+ const version = await getWgVersion(wgPath);
140
+ logger.debug('[WG Installer] WireGuard available on Windows: ' + wgPath + (version ? ' (' + version + ')' : ''));
141
+ return {
142
+ available: true,
143
+ availability: 'available',
144
+ backend: 'windows-service',
145
+ version: version ?? undefined,
146
+ binaryPath: wgPath,
147
+ };
148
+ }
149
+ // Look for the wg binary (system install)
150
+ const wgPath = await which('wg');
151
+ // ---- macOS: bundled wireguard-go is sufficient (UAPI replaces wg CLI) ----
152
+ if (plat === 'darwin') {
153
+ // Check privilege first (required regardless of how WG is available)
154
+ const root = await isRoot();
155
+ if (wgPath) {
156
+ // System wg + wireguard-go available
157
+ const version = await getWgVersion(wgPath);
158
+ if (!root) {
159
+ logger.debug('[WG Installer] wg found on macOS but not running as root');
160
+ return {
161
+ available: false,
162
+ availability: 'missing_privilege',
163
+ backend: 'wireguard-go',
164
+ version: version ?? undefined,
165
+ binaryPath: wgPath,
166
+ };
167
+ }
168
+ logger.debug('[WG Installer] WireGuard available (system): ' + wgPath);
169
+ return {
170
+ available: true,
171
+ availability: 'available',
172
+ backend: 'wireguard-go',
173
+ version: version ?? undefined,
174
+ binaryPath: wgPath,
175
+ };
176
+ }
177
+ // No system wg — check for bundled wireguard-go
178
+ const bundledPath = await findBundledWireguardGo();
179
+ const systemWgGoPath = await which('wireguard-go');
180
+ const wgGoPath = bundledPath || systemWgGoPath;
181
+ if (wgGoPath) {
182
+ if (!root) {
183
+ logger.debug('[WG Installer] wireguard-go found but not running as root');
184
+ return {
185
+ available: false,
186
+ availability: 'missing_privilege',
187
+ backend: 'wireguard-go',
188
+ binaryPath: wgGoPath,
189
+ bundled: !!bundledPath,
190
+ };
191
+ }
192
+ // On macOS with UAPI, wireguard-go alone is enough (no wg CLI needed)
193
+ logger.debug('[WG Installer] WireGuard available via ' + (bundledPath ? 'bundled' : 'system') + ' wireguard-go: ' + wgGoPath);
194
+ return {
195
+ available: true,
196
+ availability: 'available',
197
+ backend: 'wireguard-go',
198
+ binaryPath: wgGoPath,
199
+ bundled: !!bundledPath,
200
+ };
201
+ }
202
+ logger.debug('[WG Installer] No WireGuard binary found on macOS');
203
+ return {
204
+ available: false,
205
+ availability: 'missing_binary',
206
+ backend: 'none',
207
+ };
208
+ }
209
+ // ---- Linux ----
210
+ // On Linux, prefer kernel module + wg CLI (auto-installed)
211
+ if (wgPath) {
212
+ const version = await getWgVersion(wgPath);
213
+ const root = await isRoot();
214
+ const netAdmin = await hasNetAdmin();
215
+ if (!root && !netAdmin) {
216
+ logger.debug('[WG Installer] wg found but missing NET_ADMIN capability');
217
+ return {
218
+ available: false,
219
+ availability: 'missing_privilege',
220
+ backend: 'kernel',
221
+ version: version ?? undefined,
222
+ binaryPath: wgPath,
223
+ };
224
+ }
225
+ logger.debug('[WG Installer] WireGuard available (kernel): ' + wgPath + (version ? ' (' + version + ')' : ''));
226
+ return {
227
+ available: true,
228
+ availability: 'available',
229
+ backend: 'kernel',
230
+ version: version ?? undefined,
231
+ binaryPath: wgPath,
232
+ };
233
+ }
234
+ // Linux fallback: check for bundled wireguard-go
235
+ const bundledPath = await findBundledWireguardGo();
236
+ if (bundledPath) {
237
+ const root = await isRoot();
238
+ const netAdmin = await hasNetAdmin();
239
+ if (!root && !netAdmin) {
240
+ logger.debug('[WG Installer] Bundled wireguard-go found but missing privileges');
241
+ return {
242
+ available: false,
243
+ availability: 'missing_privilege',
244
+ backend: 'wireguard-go',
245
+ binaryPath: bundledPath,
246
+ bundled: true,
247
+ };
248
+ }
249
+ logger.debug('[WG Installer] WireGuard available via bundled wireguard-go: ' + bundledPath);
250
+ return {
251
+ available: true,
252
+ availability: 'available',
253
+ backend: 'wireguard-go',
254
+ binaryPath: bundledPath,
255
+ bundled: true,
256
+ };
257
+ }
258
+ logger.debug('[WG Installer] wg binary not found in PATH');
259
+ return {
260
+ available: false,
261
+ availability: 'missing_binary',
262
+ backend: 'none',
263
+ };
264
+ }
265
+ // ---------------------------------------------------------------------------
266
+ // Installation
267
+ // ---------------------------------------------------------------------------
268
+ export async function installWireGuard() {
269
+ const plat = osPlatform();
270
+ if (plat !== 'linux' && plat !== 'darwin' && plat !== 'win32') {
271
+ return {
272
+ available: false,
273
+ availability: 'unsupported_os',
274
+ backend: 'none',
275
+ };
276
+ }
277
+ // ---- Windows ----
278
+ if (plat === 'win32') {
279
+ // Auto-install on Windows is too risky (requires MSI/admin). Suggest manual install.
280
+ logger.warn('[WG Installer] WireGuard not found on Windows. Install from https://www.wireguard.com/install/');
281
+ return {
282
+ available: false,
283
+ availability: 'missing_binary',
284
+ backend: 'windows-service',
285
+ };
286
+ }
287
+ // Pre-check: already installed?
288
+ const existing = await detectWireGuard();
289
+ if (existing.available) {
290
+ return existing;
291
+ }
292
+ // ---- macOS ----
293
+ if (plat === 'darwin') {
294
+ logger.warn('[WG Installer] WireGuard not found on macOS. Install via: brew install wireguard-tools');
295
+ return {
296
+ available: false,
297
+ availability: 'missing_binary',
298
+ backend: 'none',
299
+ };
300
+ }
301
+ // ---- Linux ----
302
+ const root = await isRoot();
303
+ if (!root) {
304
+ logger.warn('[WG Installer] Cannot auto-install WireGuard without root privileges');
305
+ return {
306
+ available: false,
307
+ availability: 'missing_privilege',
308
+ backend: 'none',
309
+ };
310
+ }
311
+ const distro = await detectDistroFamilyAsync();
312
+ if (distro === 'debian') {
313
+ logger.info('[WG Installer] Attempting apt-get install wireguard-tools...');
314
+ try {
315
+ await execFile('apt-get', ['update', '-qq'], { timeout: 60_000 });
316
+ await execFile('apt-get', ['install', '-y', '-qq', 'wireguard-tools'], {
317
+ timeout: 120_000,
318
+ });
319
+ logger.info('[WG Installer] wireguard-tools installed successfully');
320
+ }
321
+ catch (err) {
322
+ const message = err instanceof Error ? err.message : String(err);
323
+ logger.error('[WG Installer] apt-get install failed: ' + message);
324
+ return {
325
+ available: false,
326
+ availability: 'missing_binary',
327
+ backend: 'none',
328
+ };
329
+ }
330
+ }
331
+ else if (distro === 'redhat') {
332
+ logger.info('[WG Installer] Attempting dnf/yum install wireguard-tools...');
333
+ try {
334
+ // Try dnf first, fall back to yum
335
+ const pkgManager = (await which('dnf')) ? 'dnf' : 'yum';
336
+ await execFile(pkgManager, ['install', '-y', 'wireguard-tools'], {
337
+ timeout: 120_000,
338
+ });
339
+ logger.info('[WG Installer] wireguard-tools installed successfully');
340
+ }
341
+ catch (err) {
342
+ const message = err instanceof Error ? err.message : String(err);
343
+ logger.error('[WG Installer] dnf/yum install failed: ' + message);
344
+ return {
345
+ available: false,
346
+ availability: 'missing_binary',
347
+ backend: 'none',
348
+ };
349
+ }
350
+ }
351
+ else {
352
+ logger.warn('[WG Installer] Unsupported Linux distro for auto-install. Install wireguard-tools manually.');
353
+ return {
354
+ available: false,
355
+ availability: 'missing_binary',
356
+ backend: 'none',
357
+ };
358
+ }
359
+ // Re-detect after installation
360
+ return detectWireGuard();
361
+ }
362
+ //# sourceMappingURL=wireguard-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireguard-installer.js","sourceRoot":"","sources":["../../src/network/wireguard-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * High-level WireGuard orchestrator for the Termify agent.
3
+ *
4
+ * Combines:
5
+ * - wireguard-installer (detection / auto-install)
6
+ * - wireguard-state-store (persistent keypair)
7
+ * - WireGuardBackend (platform-specific interface management)
8
+ *
9
+ * Emits events:
10
+ * - 'ready' after interface is up
11
+ * - 'peer:added' { peer }
12
+ * - 'peer:removed' { publicKey }
13
+ * - 'health' WgHealthSnapshot
14
+ * - 'error' Error
15
+ * - 'shutdown' when torn down
16
+ */
17
+ import { EventEmitter } from 'node:events';
18
+ import { type WgInstallResult, type WgAvailability, type WgBackendKind } from './wireguard-installer.js';
19
+ import type { WgPeerConfig, WgHealthSnapshot } from './wireguard-backend.js';
20
+ export interface WgManagerStatus {
21
+ available: boolean;
22
+ availability: WgAvailability;
23
+ backend: WgBackendKind;
24
+ version?: string;
25
+ interfaceName?: string;
26
+ publicKey?: string;
27
+ listenPort?: number;
28
+ connectedPeers: number;
29
+ }
30
+ export declare class WireGuardManager extends EventEmitter {
31
+ private backend;
32
+ private stateStore;
33
+ private identity;
34
+ private installResult;
35
+ private interfaceName;
36
+ private connectedPeers;
37
+ constructor(configDir?: string);
38
+ /**
39
+ * Detect and optionally install WireGuard.
40
+ * Does NOT throw on failure - returns the detection result.
41
+ */
42
+ ensureInstalled(): Promise<WgInstallResult>;
43
+ /**
44
+ * Set up the WireGuard interface with the agent's virtual IP.
45
+ */
46
+ ensureInterface(virtualIp: string): Promise<void>;
47
+ /**
48
+ * Replace all peers (called when server sends full peer list).
49
+ */
50
+ setPeers(peers: WgPeerConfig[]): Promise<void>;
51
+ /**
52
+ * Add a single peer.
53
+ */
54
+ addPeer(peer: WgPeerConfig): Promise<void>;
55
+ /**
56
+ * Remove a peer by public key.
57
+ */
58
+ removePeer(publicKey: string): Promise<void>;
59
+ /**
60
+ * Update the endpoint of an existing peer (for NAT traversal hot-update).
61
+ */
62
+ updatePeerEndpoint(publicKey: string, endpoint: string): Promise<void>;
63
+ /**
64
+ * Rotate the WireGuard keypair. Generates a new key, updates the interface.
65
+ * Returns the new public key.
66
+ */
67
+ rotateKey(): Promise<{
68
+ publicKey: string;
69
+ }>;
70
+ /**
71
+ * Update a peer's public key (for key rotation).
72
+ * Removes the old peer and adds with new key, preserving other settings.
73
+ */
74
+ updatePeerKey(oldPublicKey: string, newPublicKey: string, allowedIps: string, endpoint?: string): Promise<void>;
75
+ /**
76
+ * Get current manager status for reporting to the server.
77
+ */
78
+ getStatus(): WgManagerStatus;
79
+ /**
80
+ * Get health snapshot from the running interface.
81
+ */
82
+ getHealth(): Promise<WgHealthSnapshot | null>;
83
+ /**
84
+ * Check if a specific peer has had a recent handshake (within 3 minutes).
85
+ */
86
+ isPeerHealthy(publicKey: string): Promise<boolean>;
87
+ /**
88
+ * Tear down the interface and clean up.
89
+ */
90
+ shutdown(): Promise<void>;
91
+ }
92
+ //# sourceMappingURL=wireguard-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireguard-manager.d.ts","sourceRoot":"","sources":["../../src/network/wireguard-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAUlC,OAAO,KAAK,EAGV,YAAY,EACZ,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAQhC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,cAAc,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAuWD,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,cAAc,CAAK;gBAEf,SAAS,CAAC,EAAE,MAAM;IAS9B;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;IAuCjD;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BvD;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhD;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlD;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5E;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAyBjD;;;OAGG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrH;;OAEG;IACH,SAAS,IAAI,eAAe;IAa5B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAgBnD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWxD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBhC"}