docker-client-mx 1.35.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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/bin/docker-client-mx.js +42 -0
  4. package/build/icons/icon-1024.png +0 -0
  5. package/build/icons/icon-128.png +0 -0
  6. package/build/icons/icon-16.png +0 -0
  7. package/build/icons/icon-256.png +0 -0
  8. package/build/icons/icon-32.png +0 -0
  9. package/build/icons/icon-48.png +0 -0
  10. package/build/icons/icon-512.png +0 -0
  11. package/build/icons/icon-64.png +0 -0
  12. package/build/icons/icon.ico +0 -0
  13. package/build/icons/icon.iconset/icon_128x128.png +0 -0
  14. package/build/icons/icon.iconset/icon_128x128@2x.png +0 -0
  15. package/build/icons/icon.iconset/icon_16x16.png +0 -0
  16. package/build/icons/icon.iconset/icon_16x16@2x.png +0 -0
  17. package/build/icons/icon.iconset/icon_256x256.png +0 -0
  18. package/build/icons/icon.iconset/icon_256x256@2x.png +0 -0
  19. package/build/icons/icon.iconset/icon_32x32.png +0 -0
  20. package/build/icons/icon.iconset/icon_32x32@2x.png +0 -0
  21. package/build/icons/icon.iconset/icon_512x512.png +0 -0
  22. package/build/icons/icon.iconset/icon_512x512@2x.png +0 -0
  23. package/build/icons/icon.png +0 -0
  24. package/dist/docker-desktop-mx/browser/chunk-64WWLMUP.js +39 -0
  25. package/dist/docker-desktop-mx/browser/chunk-N4VBBC4W.js +1 -0
  26. package/dist/docker-desktop-mx/browser/favicon.ico +0 -0
  27. package/dist/docker-desktop-mx/browser/index.html +14 -0
  28. package/dist/docker-desktop-mx/browser/main-CTIRTSOI.js +5 -0
  29. package/dist/docker-desktop-mx/browser/styles-JS3HDDI4.css +1 -0
  30. package/dist-electron/api.js +10 -0
  31. package/dist-electron/api.js.map +1 -0
  32. package/dist-electron/assistant-key.js +70 -0
  33. package/dist-electron/assistant-key.js.map +1 -0
  34. package/dist-electron/assistant-models.js +19 -0
  35. package/dist-electron/assistant-models.js.map +1 -0
  36. package/dist-electron/assistant-tools.js +335 -0
  37. package/dist-electron/assistant-tools.js.map +1 -0
  38. package/dist-electron/assistant.js +302 -0
  39. package/dist-electron/assistant.js.map +1 -0
  40. package/dist-electron/attention.js +75 -0
  41. package/dist-electron/attention.js.map +1 -0
  42. package/dist-electron/channels.js +113 -0
  43. package/dist-electron/channels.js.map +1 -0
  44. package/dist-electron/compose-files.js +104 -0
  45. package/dist-electron/compose-files.js.map +1 -0
  46. package/dist-electron/compose.js +271 -0
  47. package/dist-electron/compose.js.map +1 -0
  48. package/dist-electron/container-events.js +188 -0
  49. package/dist-electron/container-events.js.map +1 -0
  50. package/dist-electron/containers.js +165 -0
  51. package/dist-electron/containers.js.map +1 -0
  52. package/dist-electron/context-menu.js +56 -0
  53. package/dist-electron/context-menu.js.map +1 -0
  54. package/dist-electron/contexts.js +346 -0
  55. package/dist-electron/contexts.js.map +1 -0
  56. package/dist-electron/crash.js +129 -0
  57. package/dist-electron/crash.js.map +1 -0
  58. package/dist-electron/diagnosis.js +338 -0
  59. package/dist-electron/diagnosis.js.map +1 -0
  60. package/dist-electron/docker-client.js +284 -0
  61. package/dist-electron/docker-client.js.map +1 -0
  62. package/dist-electron/engine.js +145 -0
  63. package/dist-electron/engine.js.map +1 -0
  64. package/dist-electron/event-store.js +146 -0
  65. package/dist-electron/event-store.js.map +1 -0
  66. package/dist-electron/events.js +132 -0
  67. package/dist-electron/events.js.map +1 -0
  68. package/dist-electron/exec.js +138 -0
  69. package/dist-electron/exec.js.map +1 -0
  70. package/dist-electron/files.js +407 -0
  71. package/dist-electron/files.js.map +1 -0
  72. package/dist-electron/health.js +92 -0
  73. package/dist-electron/health.js.map +1 -0
  74. package/dist-electron/host-overview.js +50 -0
  75. package/dist-electron/host-overview.js.map +1 -0
  76. package/dist-electron/host-shell.js +196 -0
  77. package/dist-electron/host-shell.js.map +1 -0
  78. package/dist-electron/i18n.js +58 -0
  79. package/dist-electron/i18n.js.map +1 -0
  80. package/dist-electron/image-history.js +87 -0
  81. package/dist-electron/image-history.js.map +1 -0
  82. package/dist-electron/images.js +141 -0
  83. package/dist-electron/images.js.map +1 -0
  84. package/dist-electron/ipc.js +783 -0
  85. package/dist-electron/ipc.js.map +1 -0
  86. package/dist-electron/links.js +46 -0
  87. package/dist-electron/links.js.map +1 -0
  88. package/dist-electron/logs.js +153 -0
  89. package/dist-electron/logs.js.map +1 -0
  90. package/dist-electron/main.js +494 -0
  91. package/dist-electron/main.js.map +1 -0
  92. package/dist-electron/merged-logs.js +127 -0
  93. package/dist-electron/merged-logs.js.map +1 -0
  94. package/dist-electron/navigation.js +37 -0
  95. package/dist-electron/navigation.js.map +1 -0
  96. package/dist-electron/ndjson.js +30 -0
  97. package/dist-electron/ndjson.js.map +1 -0
  98. package/dist-electron/networks.js +507 -0
  99. package/dist-electron/networks.js.map +1 -0
  100. package/dist-electron/port-conflicts.js +106 -0
  101. package/dist-electron/port-conflicts.js.map +1 -0
  102. package/dist-electron/preload.js +257 -0
  103. package/dist-electron/preload.js.map +1 -0
  104. package/dist-electron/pull.js +220 -0
  105. package/dist-electron/pull.js.map +1 -0
  106. package/dist-electron/redact.js +129 -0
  107. package/dist-electron/redact.js.map +1 -0
  108. package/dist-electron/registry-auth.js +150 -0
  109. package/dist-electron/registry-auth.js.map +1 -0
  110. package/dist-electron/renew.js +162 -0
  111. package/dist-electron/renew.js.map +1 -0
  112. package/dist-electron/restart-policy.js +58 -0
  113. package/dist-electron/restart-policy.js.map +1 -0
  114. package/dist-electron/run-command.js +146 -0
  115. package/dist-electron/run-command.js.map +1 -0
  116. package/dist-electron/run.js +151 -0
  117. package/dist-electron/run.js.map +1 -0
  118. package/dist-electron/self-update.js +163 -0
  119. package/dist-electron/self-update.js.map +1 -0
  120. package/dist-electron/servers.js +108 -0
  121. package/dist-electron/servers.js.map +1 -0
  122. package/dist-electron/settings.js +146 -0
  123. package/dist-electron/settings.js.map +1 -0
  124. package/dist-electron/ssh.js +574 -0
  125. package/dist-electron/ssh.js.map +1 -0
  126. package/dist-electron/stats.js +209 -0
  127. package/dist-electron/stats.js.map +1 -0
  128. package/dist-electron/streams.js +63 -0
  129. package/dist-electron/streams.js.map +1 -0
  130. package/dist-electron/system.js +123 -0
  131. package/dist-electron/system.js.map +1 -0
  132. package/dist-electron/terminal-transcript.js +55 -0
  133. package/dist-electron/terminal-transcript.js.map +1 -0
  134. package/dist-electron/updates.js +136 -0
  135. package/dist-electron/updates.js.map +1 -0
  136. package/dist-electron/volume-backup.js +203 -0
  137. package/dist-electron/volume-backup.js.map +1 -0
  138. package/dist-electron/volume-files.js +124 -0
  139. package/dist-electron/volume-files.js.map +1 -0
  140. package/dist-electron/volumes.js +253 -0
  141. package/dist-electron/volumes.js.map +1 -0
  142. package/dist-electron/wiring-watch.js +93 -0
  143. package/dist-electron/wiring-watch.js.map +1 -0
  144. package/dist-electron/wiring.js +71 -0
  145. package/dist-electron/wiring.js.map +1 -0
  146. package/dist-electron/wsl.js +167 -0
  147. package/dist-electron/wsl.js.map +1 -0
  148. package/package.json +125 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * Waar de renderer heen moet als main dat zegt, bijvoorbeeld na een klik op een crashmelding.
4
+ *
5
+ * Staat er geen venster, dan maakt main er een, en dat venster is pas een paar honderd
6
+ * milliseconden later klaar om te luisteren. Een route die dan verstuurd wordt, komt nergens
7
+ * aan. Daarom bewaart main hem hier, en haalt de renderer hem zelf op zodra hij er is.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.containerRoute = containerRoute;
11
+ exports.setPendingRoute = setPendingRoute;
12
+ exports.takePendingRoute = takePendingRoute;
13
+ let pending = null;
14
+ /**
15
+ * De route naar een container; zijn detailpagina opent op de tab Logs.
16
+ *
17
+ * De naam gaat mee omdat de container er bij aankomst niet meer hoeft te zijn: een `--rm`
18
+ * verdwijnt na het stoppen, en compose maakt bij `up` een nieuwe met dezelfde naam. Met de
19
+ * naam kan de pagina zeggen welke het was, en naar zijn opvolger wijzen.
20
+ */
21
+ function containerRoute(id, name) {
22
+ if (!/^[0-9a-f]{12,64}$/.test(id)) {
23
+ throw new Error(`Geen container-id: ${id}`);
24
+ }
25
+ return name === undefined ? `/containers/${id}` : `/containers/${id}?name=${encodeURIComponent(name)}`;
26
+ }
27
+ /** Bewaart een route voor het venster dat nog moet komen. Een nieuwere vervangt een oudere. */
28
+ function setPendingRoute(route) {
29
+ pending = route;
30
+ }
31
+ /** Geeft de bewaarde route terug, één keer. */
32
+ function takePendingRoute() {
33
+ const route = pending;
34
+ pending = null;
35
+ return route;
36
+ }
37
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../electron/navigation.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAWH,wCAOC;AAGD,0CAGC;AAGD,4CAOC;AAhCD,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,EAAU,EAAE,IAAa;IAEtD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;AACzG,CAAC;AAED,+FAA+F;AAC/F,SAAgB,eAAe,CAAC,KAAa;IAE3C,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC;AAED,+CAA+C;AAC/C,SAAgB,gBAAgB;IAE9B,MAAM,KAAK,GAAG,OAAO,CAAC;IAEtB,OAAO,GAAG,IAAI,CAAC;IAEf,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ndjson = ndjson;
4
+ /**
5
+ * De Engine API stuurt streams als newline-delimited JSON: één object per regel, maar een
6
+ * chunk uit de socket valt niet netjes op een regelgrens. Zonder buffer parseer je dus
7
+ * regelmatig een halve regel, en dat gaat er in het begin nog goed uit ook — tot een groot
8
+ * stats-object precies verkeerd breekt.
9
+ */
10
+ function ndjson(onValue) {
11
+ let buffer = '';
12
+ return (chunk) => {
13
+ buffer += chunk.toString();
14
+ let index = buffer.indexOf('\n');
15
+ while (index !== -1) {
16
+ const line = buffer.slice(0, index).trim();
17
+ buffer = buffer.slice(index + 1);
18
+ if (line !== '') {
19
+ try {
20
+ onValue(JSON.parse(line));
21
+ }
22
+ catch {
23
+ // Geen geldige JSON op een complete regel is ruis, geen halve regel: overslaan.
24
+ }
25
+ }
26
+ index = buffer.indexOf('\n');
27
+ }
28
+ };
29
+ }
30
+ //# sourceMappingURL=ndjson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson.js","sourceRoot":"","sources":["../electron/ndjson.ts"],"names":[],"mappings":";;AAMA,wBAyBC;AA/BD;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,OAAiC;IAEtD,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE3B,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAE3C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAEjC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,gFAAgF;gBAClF,CAAC;YACH,CAAC;YAED,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,507 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.countNetworkUsage = countNetworkUsage;
4
+ exports.firstSubnet = firstSubnet;
5
+ exports.toNetworkSummary = toNetworkSummary;
6
+ exports.listNetworks = listNetworks;
7
+ exports.toContainerNetworks = toContainerNetworks;
8
+ exports.listContainerNetworks = listContainerNetworks;
9
+ exports.connectContainer = connectContainer;
10
+ exports.disconnectContainer = disconnectContainer;
11
+ exports.networkNameProblem = networkNameProblem;
12
+ exports.toIpv4 = toIpv4;
13
+ exports.toIpam = toIpam;
14
+ exports.createNetwork = createNetwork;
15
+ exports.removeNetwork = removeNetwork;
16
+ exports.pruneNetworks = pruneNetworks;
17
+ exports.describeAttachProblem = describeAttachProblem;
18
+ exports.toNetworkMembers = toNetworkMembers;
19
+ exports.listNetworkMembers = listNetworkMembers;
20
+ const docker_client_1 = require("./docker-client");
21
+ const i18n_1 = require("./i18n");
22
+ const COMPOSE_PROJECT = 'com.docker.compose.project';
23
+ /**
24
+ * De netwerken die Docker zelf aanmaakt. Ze zijn niet te verwijderen, dus de knop hoort uit
25
+ * te staan in plaats van dat je op een foutmelding van de daemon loopt.
26
+ */
27
+ const BUILT_IN = new Set(['bridge', 'host', 'none']);
28
+ /**
29
+ * Telt per netwerknaam hoeveel containers eraan hangen.
30
+ *
31
+ * Uit de containerlijst en niet uit het `Containers`-veld van `/networks`: dat veld is daar
32
+ * leeg tenzij je per netwerk een inspect doet, en dat zijn net zoveel extra aanroepen als er
33
+ * netwerken zijn.
34
+ */
35
+ function countNetworkUsage(containers) {
36
+ const usage = new Map();
37
+ for (const container of containers) {
38
+ for (const name of Object.keys(container.NetworkSettings?.Networks ?? {})) {
39
+ usage.set(name, (usage.get(name) ?? 0) + 1);
40
+ }
41
+ }
42
+ return usage;
43
+ }
44
+ /** Het eerste subnet, als er een is. Een netwerk kan er meer hebben, maar in de tabel past er één. */
45
+ function firstSubnet(raw) {
46
+ for (const config of raw.IPAM?.Config ?? []) {
47
+ if (typeof config.Subnet === 'string' && config.Subnet !== '') {
48
+ return config.Subnet;
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ /** Vertaalt één regel uit `docker network ls` naar het contract van de renderer. */
54
+ function toNetworkSummary(raw, usage) {
55
+ const parsed = Date.parse(raw.Created ?? '');
56
+ return {
57
+ id: raw.Id,
58
+ shortId: raw.Id.slice(0, 12),
59
+ name: raw.Name,
60
+ driver: raw.Driver ?? (0, i18n_1.t)({ en: 'unknown', nl: 'onbekend', de: 'unbekannt', fr: 'inconnu', es: 'desconocido' }),
61
+ scope: raw.Scope ?? 'local',
62
+ subnet: firstSubnet(raw),
63
+ internal: raw.Internal === true,
64
+ builtIn: BUILT_IN.has(raw.Name),
65
+ createdAt: Number.isNaN(parsed) ? 0 : Math.floor(parsed / 1000),
66
+ composeProject: raw.Labels?.[COMPOSE_PROJECT] ?? null,
67
+ connected: usage.get(raw.Name) ?? 0,
68
+ };
69
+ }
70
+ /** Alle netwerken, met per regel hoeveel containers eraan hangen. */
71
+ async function listNetworks() {
72
+ const { docker } = (0, docker_client_1.getConnection)();
73
+ const [networks, containers] = await Promise.all([docker.listNetworks(), docker.listContainers({ all: true })]);
74
+ const usage = countNetworkUsage(containers);
75
+ const raw = networks;
76
+ return raw
77
+ .map((network) => toNetworkSummary(network, usage))
78
+ // De ingebouwde netwerken onderaan: je doet er toch niets mee.
79
+ .sort((a, b) => Number(a.builtIn) - Number(b.builtIn) || a.name.localeCompare(b.name));
80
+ }
81
+ /**
82
+ * De netwerken uit een container-inspect.
83
+ *
84
+ * `Aliases` en `DNSNames` staan er allebei in: nieuwere daemons vullen `DNSNames` en laten
85
+ * `Aliases` leeg, oudere precies andersom. Daarom de twee bij elkaar, min de namen waarop de
86
+ * container sowieso al te bereiken is — zijn eigen naam, zijn korte id en zijn hostname. Wat
87
+ * overblijft is wat iemand zelf ingesteld heeft, en dat is het enige wat de tab hoort te tonen.
88
+ */
89
+ function toContainerNetworks(networks, self) {
90
+ return Object.entries(networks)
91
+ .map(([name, endpoint]) => {
92
+ const names = new Set([...(endpoint.Aliases ?? []), ...(endpoint.DNSNames ?? [])]);
93
+ return {
94
+ name,
95
+ networkId: endpoint.NetworkID ?? '',
96
+ ipAddress: endpoint.IPAddress === undefined || endpoint.IPAddress === '' ? null : endpoint.IPAddress,
97
+ aliases: [...names].filter((alias) => !self.includes(alias)),
98
+ builtIn: BUILT_IN.has(name),
99
+ };
100
+ })
101
+ .sort((a, b) => Number(a.builtIn) - Number(b.builtIn) || a.name.localeCompare(b.name));
102
+ }
103
+ /** De netwerken waar deze container aan hangt; die staan alleen in zijn eigen inspect. */
104
+ async function listContainerNetworks(containerId) {
105
+ const { docker } = (0, docker_client_1.getConnection)();
106
+ const raw = (await docker.getContainer(containerId).inspect());
107
+ const self = [(raw.Name ?? '').replace(/^\//, ''), (raw.Id ?? '').slice(0, 12), raw.Config?.Hostname ?? ''];
108
+ return toContainerNetworks(raw.NetworkSettings?.Networks ?? {}, self.filter((name) => name !== ''));
109
+ }
110
+ /**
111
+ * Hangt een container aan een netwerk.
112
+ *
113
+ * Mag ook terwijl hij draait: de daemon koppelt hem er live bij, zonder herstart. Dat is het
114
+ * verschil met het netwerk in het startformulier, dat alleen geldt voor een nieuwe container.
115
+ */
116
+ async function connectContainer(network, containerId, alias) {
117
+ const { docker } = (0, docker_client_1.getConnection)();
118
+ try {
119
+ await docker.getNetwork(network).connect({
120
+ Container: containerId,
121
+ // Geen lege EndpointConfig meesturen: zonder alias hoort er niets te staan.
122
+ EndpointConfig: alias === null || alias === '' ? undefined : { Aliases: [alias] },
123
+ });
124
+ return { ok: true };
125
+ }
126
+ catch (err) {
127
+ return { ok: false, problem: describeAttachProblem(err, network, 'connect') };
128
+ }
129
+ }
130
+ /** Koppelt een container los van een netwerk. Ook dat mag terwijl hij draait. */
131
+ async function disconnectContainer(network, containerId) {
132
+ const { docker } = (0, docker_client_1.getConnection)();
133
+ try {
134
+ await docker.getNetwork(network).disconnect({ Container: containerId });
135
+ return { ok: true };
136
+ }
137
+ catch (err) {
138
+ return { ok: false, problem: describeAttachProblem(err, network, 'disconnect') };
139
+ }
140
+ }
141
+ // Dezelfde regel als de daemon hanteert; hier al, zodat de melding in de taal van de app is.
142
+ const NETWORK_NAME = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;
143
+ /** `null` als de naam deugt, anders wat eraan schort. */
144
+ function networkNameProblem(name) {
145
+ if (NETWORK_NAME.test(name)) {
146
+ return null;
147
+ }
148
+ return (0, i18n_1.t)({
149
+ en: 'A network name contains letters, digits, dots, hyphens and underscores, and starts with a letter or a digit.',
150
+ nl: 'Een netwerknaam bestaat uit letters, cijfers, punt, streepje en underscore, en begint met een letter of cijfer.',
151
+ de: 'Ein Netzwerkname besteht aus Buchstaben, Ziffern, Punkten, Bindestrichen und Unterstrichen und beginnt mit einem Buchstaben oder einer Ziffer.',
152
+ fr: 'Un nom de réseau se compose de lettres, de chiffres, de points, de tirets et d’underscores, et commence par une lettre ou un chiffre.',
153
+ es: 'Un nombre de red se compone de letras, dígitos, puntos, guiones y guiones bajos, y empieza por una letra o un dígito.',
154
+ });
155
+ }
156
+ const IPV4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
157
+ // Hexadecimale groepen met dubbele punten ertussen. Genoeg om een typefout te vangen; of het
158
+ // adres echt klopt zegt de daemon, die ook de vormen met een ingebed IPv4-adres kent.
159
+ const IPV6 = /^[0-9a-fA-F:]+$/;
160
+ /**
161
+ * Een IPv4-adres als getal, of `null` als het er geen is.
162
+ *
163
+ * Een octet met een voorloopnul gaat eruit: `010` leest elders als octaal, en dan wijst
164
+ * hetzelfde subnet in de app naar iets anders dan in de daemon.
165
+ */
166
+ function toIpv4(address) {
167
+ const match = IPV4.exec(address);
168
+ if (match === null) {
169
+ return null;
170
+ }
171
+ let value = 0;
172
+ for (const part of match.slice(1)) {
173
+ const octet = Number(part);
174
+ if (octet > 255 || (part.length > 1 && part.startsWith('0'))) {
175
+ return null;
176
+ }
177
+ value = value * 256 + octet;
178
+ }
179
+ return value;
180
+ }
181
+ /**
182
+ * Zet het subnet en de gateway uit de dialoog om naar het IPAM-blok dat de daemon verwacht,
183
+ * of naar de melding waarom dat niet gaat.
184
+ *
185
+ * Zonder subnet gaat er niets mee: de daemon kiest dan zelf een bereik dat nog vrij is, en dat
186
+ * is bij een bridge-netwerk het gewone geval. Een gateway alleen kan niet: die hoort ergens in
187
+ * een subnet te liggen, en zonder subnet is er niets om dat aan af te meten.
188
+ */
189
+ function toIpam(subnet, gateway) {
190
+ const range = (subnet ?? '').trim();
191
+ const router = (gateway ?? '').trim();
192
+ if (range === '') {
193
+ return router === '' ? { config: null } : { problem: lonelyGatewayProblem() };
194
+ }
195
+ const [address, prefix, ...rest] = range.split('/');
196
+ if (address === undefined || prefix === undefined || rest.length > 0 || !/^\d{1,3}$/.test(prefix)) {
197
+ return { problem: subnetProblem() };
198
+ }
199
+ const bits = Number(prefix);
200
+ // IPv6 blijft bij de vorm: een eigen parser ernaast levert vooral meldingen op waar Docker
201
+ // het niet mee eens is, en de daemon zegt het daarna alsnog.
202
+ if (address.includes(':')) {
203
+ if (!IPV6.test(address) || bits > 128) {
204
+ return { problem: subnetProblem() };
205
+ }
206
+ if (router !== '' && !IPV6.test(router)) {
207
+ return { problem: gatewayProblem() };
208
+ }
209
+ return { config: router === '' ? { Subnet: range } : { Subnet: range, Gateway: router } };
210
+ }
211
+ const network = toIpv4(address);
212
+ if (network === null || bits > 32) {
213
+ return { problem: subnetProblem() };
214
+ }
215
+ if (router === '') {
216
+ return { config: { Subnet: range } };
217
+ }
218
+ const routerAddress = toIpv4(router);
219
+ if (routerAddress === null) {
220
+ return { problem: gatewayProblem() };
221
+ }
222
+ // De daemon weigert een gateway buiten het subnet ook, maar dan met een zin over IPAM-pools.
223
+ const mask = bits === 0 ? 0 : (0xffff_ffff << (32 - bits)) >>> 0;
224
+ if (((routerAddress & mask) >>> 0) !== ((network & mask) >>> 0)) {
225
+ return { problem: outsideProblem(router, range) };
226
+ }
227
+ return { config: { Subnet: range, Gateway: router } };
228
+ }
229
+ function subnetProblem() {
230
+ return (0, i18n_1.t)({
231
+ en: 'Enter the subnet as a CIDR range, for example 172.30.0.0/16.',
232
+ nl: 'Vul het subnet in als CIDR-bereik, bijvoorbeeld 172.30.0.0/16.',
233
+ de: 'Geben Sie das Subnetz als CIDR-Bereich an, zum Beispiel 172.30.0.0/16.',
234
+ fr: 'Indiquez le sous-réseau sous forme de plage CIDR, par exemple 172.30.0.0/16.',
235
+ es: 'Indica la subred como un rango CIDR, por ejemplo 172.30.0.0/16.',
236
+ });
237
+ }
238
+ function gatewayProblem() {
239
+ return (0, i18n_1.t)({
240
+ en: 'Enter the gateway as an IP address, for example 172.30.0.1.',
241
+ nl: 'Vul de gateway in als IP-adres, bijvoorbeeld 172.30.0.1.',
242
+ de: 'Geben Sie das Gateway als IP-Adresse an, zum Beispiel 172.30.0.1.',
243
+ fr: 'Indiquez la passerelle sous forme d’adresse IP, par exemple 172.30.0.1.',
244
+ es: 'Indica la puerta de enlace como una dirección IP, por ejemplo 172.30.0.1.',
245
+ });
246
+ }
247
+ function lonelyGatewayProblem() {
248
+ return (0, i18n_1.t)({
249
+ en: 'A gateway belongs to a subnet. Fill in a subnet as well, or leave the gateway empty.',
250
+ nl: 'Een gateway hoort bij een subnet. Vul er ook een subnet bij in, of laat de gateway leeg.',
251
+ de: 'Ein Gateway gehört zu einem Subnetz. Geben Sie auch ein Subnetz an oder lassen Sie das Gateway leer.',
252
+ fr: 'Une passerelle appartient à un sous-réseau. Indiquez aussi un sous-réseau, ou laissez la passerelle vide.',
253
+ es: 'Una puerta de enlace pertenece a una subred. Indica también una subred o deja la puerta de enlace vacía.',
254
+ });
255
+ }
256
+ function outsideProblem(gateway, subnet) {
257
+ return (0, i18n_1.t)({
258
+ en: `Gateway ${gateway} is outside subnet ${subnet}.`,
259
+ nl: `De gateway ${gateway} ligt buiten het subnet ${subnet}.`,
260
+ de: `Das Gateway ${gateway} liegt außerhalb des Subnetzes ${subnet}.`,
261
+ fr: `La passerelle ${gateway} est en dehors du sous-réseau ${subnet}.`,
262
+ es: `La puerta de enlace ${gateway} está fuera de la subred ${subnet}.`,
263
+ });
264
+ }
265
+ /**
266
+ * Maakt een netwerk aan.
267
+ *
268
+ * Anders dan bij een volume meldt de daemon een bestaande naam zelf, dus die hoeft hier niet
269
+ * eerst opgezocht te worden. `CheckDuplicate` staat er voor oudere daemons: vanaf API 1.44
270
+ * kijkt de daemon altijd, daarvoor alleen als je erom vroeg.
271
+ */
272
+ async function createNetwork(network) {
273
+ const name = network.name.trim();
274
+ const problem = networkNameProblem(name);
275
+ if (problem !== null) {
276
+ return { ok: false, problem };
277
+ }
278
+ const ipam = toIpam(network.subnet, network.gateway);
279
+ if ('problem' in ipam) {
280
+ return { ok: false, problem: ipam.problem };
281
+ }
282
+ const { docker } = (0, docker_client_1.getConnection)();
283
+ try {
284
+ await docker.createNetwork({
285
+ Name: name,
286
+ Driver: network.driver.trim(),
287
+ Internal: network.internal,
288
+ CheckDuplicate: true,
289
+ IPAM: ipam.config === null ? undefined : { Driver: 'default', Config: [ipam.config] },
290
+ });
291
+ return { ok: true };
292
+ }
293
+ catch (err) {
294
+ return { ok: false, problem: describeCreateProblem(err, name) };
295
+ }
296
+ }
297
+ function describeCreateProblem(err, name) {
298
+ const status = err?.statusCode;
299
+ const text = describeError(err).toLowerCase();
300
+ if (status === 409 || text.includes('already exists')) {
301
+ return (0, i18n_1.t)({
302
+ en: `There already is a network '${name}'.`,
303
+ nl: `Er is al een netwerk '${name}'.`,
304
+ de: `Es gibt bereits ein Netzwerk '${name}'.`,
305
+ fr: `Il existe déjà un réseau '${name}'.`,
306
+ es: `Ya existe una red '${name}'.`,
307
+ });
308
+ }
309
+ // Twee netwerken met hetzelfde bereik kan de daemon niet uit elkaar houden bij het routeren.
310
+ if (text.includes('overlaps')) {
311
+ return (0, i18n_1.t)({
312
+ en: 'That subnet overlaps with an existing network. Pick another range.',
313
+ nl: 'Dat subnet overlapt met een bestaand netwerk. Kies een ander bereik.',
314
+ de: 'Dieses Subnetz überschneidet sich mit einem vorhandenen Netzwerk. Wählen Sie einen anderen Bereich.',
315
+ fr: 'Ce sous-réseau chevauche un réseau existant. Choisissez une autre plage.',
316
+ es: 'Esa subred se solapa con una red existente. Elige otro rango.',
317
+ });
318
+ }
319
+ return (0, i18n_1.t)({
320
+ en: `Creating '${name}' failed: ${describeError(err)}`,
321
+ nl: `Aanmaken van '${name}' mislukte: ${describeError(err)}`,
322
+ de: `Das Anlegen von '${name}' ist fehlgeschlagen: ${describeError(err)}`,
323
+ fr: `La création de '${name}' a échoué : ${describeError(err)}`,
324
+ es: `La creación de '${name}' ha fallado: ${describeError(err)}`,
325
+ });
326
+ }
327
+ /** Verwijdert een netwerk. Lukt niet bij een ingebouwd netwerk of met containers eraan. */
328
+ async function removeNetwork(id) {
329
+ const { docker } = (0, docker_client_1.getConnection)();
330
+ try {
331
+ await docker.getNetwork(id).remove();
332
+ return { ok: true };
333
+ }
334
+ catch (err) {
335
+ return { ok: false, problem: describeNetworkProblem(err, id) };
336
+ }
337
+ }
338
+ /** Verwijdert alle netwerken waar geen container aan hangt. Levert geen schijfruimte op. */
339
+ async function pruneNetworks() {
340
+ const { docker } = (0, docker_client_1.getConnection)();
341
+ try {
342
+ const raw = (await docker.pruneNetworks());
343
+ return { ok: true, removed: raw.NetworksDeleted?.length ?? 0, reclaimedBytes: 0 };
344
+ }
345
+ catch (err) {
346
+ return { ok: false, problem: (0, i18n_1.t)({
347
+ en: `Prune failed: ${describeError(err)}`,
348
+ nl: `Opruimen mislukte: ${describeError(err)}`,
349
+ de: `Aufräumen fehlgeschlagen: ${describeError(err)}`,
350
+ fr: `Le nettoyage a échoué : ${describeError(err)}`,
351
+ es: `La limpieza ha fallado: ${describeError(err)}`,
352
+ }) };
353
+ }
354
+ }
355
+ function describeError(err) {
356
+ return err instanceof Error ? err.message : String(err);
357
+ }
358
+ /**
359
+ * Vertaalt een mislukte koppeling naar iets waar je wat aan hebt.
360
+ *
361
+ * De daemon zegt dit meeste als een 403 met een zin erin, niet met een eigen statuscode, dus
362
+ * hier wordt op de tekst gekeken.
363
+ */
364
+ function describeAttachProblem(err, network, action) {
365
+ const status = err?.statusCode;
366
+ const text = describeError(err).toLowerCase();
367
+ if (text.includes('already exists in network') || text.includes('already attached')) {
368
+ return (0, i18n_1.t)({
369
+ en: `This container is already on '${network}'.`,
370
+ nl: `Deze container hangt al aan '${network}'.`,
371
+ de: `Dieser Container hängt schon an '${network}'.`,
372
+ fr: `Ce conteneur est déjà sur '${network}'.`,
373
+ es: `Este contenedor ya está en '${network}'.`,
374
+ });
375
+ }
376
+ if (text.includes('is not connected to network')) {
377
+ return (0, i18n_1.t)({
378
+ en: `This container is not on '${network}'.`,
379
+ nl: `Deze container hangt niet aan '${network}'.`,
380
+ de: `Dieser Container hängt nicht an '${network}'.`,
381
+ fr: `Ce conteneur n’est pas sur '${network}'.`,
382
+ es: `Este contenedor no está en '${network}'.`,
383
+ });
384
+ }
385
+ if (text.includes('user defined network')) {
386
+ return (0, i18n_1.t)({
387
+ en: `An alias only works on a network you made yourself, not on '${network}'.`,
388
+ nl: `Een alias werkt alleen op een netwerk dat je zelf gemaakt hebt, niet op '${network}'.`,
389
+ de: `Ein Alias funktioniert nur in einem selbst angelegten Netzwerk, nicht in '${network}'.`,
390
+ fr: `Un alias ne fonctionne que sur un réseau que vous avez créé vous-même, pas sur '${network}'.`,
391
+ es: `Un alias solo funciona en una red que hayas creado tú, no en '${network}'.`,
392
+ });
393
+ }
394
+ // host en none delen de netwerknaamruimte met de machine zelf; daar past niets naast.
395
+ if (text.includes('network namespace')) {
396
+ return (0, i18n_1.t)({
397
+ en: 'A container on the host or none network cannot be on another network as well.',
398
+ nl: 'Een container op het netwerk host of none kan er niet ook nog een netwerk bij hebben.',
399
+ de: 'Ein Container im host- oder none-Netzwerk kann nicht zusätzlich an einem anderen Netzwerk hängen.',
400
+ fr: 'Un conteneur sur le réseau host ou none ne peut pas être sur un autre réseau en plus.',
401
+ es: 'Un contenedor en la red host o none no puede estar además en otra red.',
402
+ });
403
+ }
404
+ if (status === 404 && text.includes('no such container')) {
405
+ return (0, i18n_1.t)({
406
+ en: 'That container no longer exists.',
407
+ nl: 'Die container bestaat niet meer.',
408
+ de: 'Diesen Container gibt es nicht mehr.',
409
+ fr: 'Ce conteneur n’existe plus.',
410
+ es: 'Ese contenedor ya no existe.',
411
+ });
412
+ }
413
+ if (status === 404) {
414
+ return (0, i18n_1.t)({
415
+ en: `Network '${network}' no longer exists.`,
416
+ nl: `Netwerk '${network}' bestaat niet meer.`,
417
+ de: `Netzwerk '${network}' existiert nicht mehr.`,
418
+ fr: `Le réseau '${network}' n’existe plus.`,
419
+ es: `La red '${network}' ya no existe.`,
420
+ });
421
+ }
422
+ if (action === 'connect') {
423
+ return (0, i18n_1.t)({
424
+ en: `Connecting to '${network}' failed: ${describeError(err)}`,
425
+ nl: `Koppelen aan '${network}' mislukte: ${describeError(err)}`,
426
+ de: `Das Verbinden mit '${network}' ist fehlgeschlagen: ${describeError(err)}`,
427
+ fr: `La connexion à '${network}' a échoué : ${describeError(err)}`,
428
+ es: `La conexión a '${network}' ha fallado: ${describeError(err)}`,
429
+ });
430
+ }
431
+ return (0, i18n_1.t)({
432
+ en: `Disconnecting from '${network}' failed: ${describeError(err)}`,
433
+ nl: `Loskoppelen van '${network}' mislukte: ${describeError(err)}`,
434
+ de: `Das Trennen von '${network}' ist fehlgeschlagen: ${describeError(err)}`,
435
+ fr: `La déconnexion de '${network}' a échoué : ${describeError(err)}`,
436
+ es: `La desconexión de '${network}' ha fallado: ${describeError(err)}`,
437
+ });
438
+ }
439
+ function describeNetworkProblem(err, ref) {
440
+ const status = err?.statusCode;
441
+ if (status === 404) {
442
+ return (0, i18n_1.t)({
443
+ en: `Network '${ref}' no longer exists.`,
444
+ nl: `Netwerk '${ref}' bestaat niet meer.`,
445
+ de: `Netzwerk '${ref}' existiert nicht mehr.`,
446
+ fr: `Le réseau '${ref}' n’existe plus.`,
447
+ es: `La red '${ref}' ya no existe.`,
448
+ });
449
+ }
450
+ if (status === 403) {
451
+ return (0, i18n_1.t)({
452
+ en: `'${ref}' is a built-in Docker network and cannot be removed.`,
453
+ nl: `'${ref}' is een ingebouwd netwerk van Docker en kan niet verwijderd worden.`,
454
+ de: `'${ref}' ist ein eingebautes Docker-Netzwerk und kann nicht entfernt werden.`,
455
+ fr: `'${ref}' est un réseau Docker intégré et ne peut pas être supprimé.`,
456
+ es: `'${ref}' es una red integrada de Docker y no se puede eliminar.`,
457
+ });
458
+ }
459
+ if (status === 409) {
460
+ return (0, i18n_1.t)({
461
+ en: `'${ref}' still has containers connected. Disconnect or remove them first.`,
462
+ nl: `'${ref}' heeft nog containers aangesloten. Koppel die eerst los of verwijder ze.`,
463
+ de: `An '${ref}' hängen noch Container. Trennen oder entfernen Sie die zuerst.`,
464
+ fr: `'${ref}' a encore des conteneurs connectés. Déconnectez-les ou supprimez-les d’abord.`,
465
+ es: `'${ref}' todavía tiene contenedores conectados. Desconéctalos o elimínalos primero.`,
466
+ });
467
+ }
468
+ return (0, i18n_1.t)({
469
+ en: `Removing '${ref}' failed: ${describeError(err)}`,
470
+ nl: `Verwijderen van '${ref}' mislukte: ${describeError(err)}`,
471
+ de: `Entfernen von '${ref}' fehlgeschlagen: ${describeError(err)}`,
472
+ fr: `La suppression de '${ref}' a échoué : ${describeError(err)}`,
473
+ es: `La eliminación de '${ref}' ha fallado: ${describeError(err)}`,
474
+ });
475
+ }
476
+ /**
477
+ * Wie er aan dit netwerk hangt, uit dezelfde containerlijst als het aantal op de pagina.
478
+ *
479
+ * Bewust niet uit `/networks/{id}`: dat noemt alleen containers die er nu mee verbonden zijn,
480
+ * terwijl het aantal ook de gestopte meetelt. Dan stond er "3 containers" boven een lijst van
481
+ * twee. Hier kloppen ze altijd, en een gestopte container staat er gewoon bij, zonder adres —
482
+ * hij komt bij de volgende start weer aan hetzelfde netwerk.
483
+ */
484
+ function toNetworkMembers(containers, network) {
485
+ return containers
486
+ .filter((container) => Object.hasOwn(container.NetworkSettings?.Networks ?? {}, network))
487
+ .map((container) => {
488
+ const endpoint = container.NetworkSettings?.Networks?.[network];
489
+ const address = endpoint?.IPAddress ?? '';
490
+ return {
491
+ id: container.Id,
492
+ name: (container.Names?.[0] ?? container.Id.slice(0, 12)).replace(/^\//, ''),
493
+ running: container.State === 'running',
494
+ // Een gestopte container heeft geen adres; een lege tekst zegt dan niets, null wel.
495
+ ipAddress: address === '' ? null : address,
496
+ composeProject: container.Labels?.['com.docker.compose.project'] ?? null,
497
+ };
498
+ })
499
+ .sort((a, b) => Number(b.running) - Number(a.running) || a.name.localeCompare(b.name));
500
+ }
501
+ /** Wie er aan dit netwerk hangt, draaiend of niet. */
502
+ async function listNetworkMembers(network) {
503
+ const { docker } = (0, docker_client_1.getConnection)();
504
+ const containers = (await docker.listContainers({ all: true }));
505
+ return toNetworkMembers(containers, network);
506
+ }
507
+ //# sourceMappingURL=networks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networks.js","sourceRoot":"","sources":["../electron/networks.ts"],"names":[],"mappings":"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"}