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.
- package/LICENSE +21 -0
- package/README.md +233 -0
- package/bin/docker-client-mx.js +42 -0
- package/build/icons/icon-1024.png +0 -0
- package/build/icons/icon-128.png +0 -0
- package/build/icons/icon-16.png +0 -0
- package/build/icons/icon-256.png +0 -0
- package/build/icons/icon-32.png +0 -0
- package/build/icons/icon-48.png +0 -0
- package/build/icons/icon-512.png +0 -0
- package/build/icons/icon-64.png +0 -0
- package/build/icons/icon.ico +0 -0
- package/build/icons/icon.iconset/icon_128x128.png +0 -0
- package/build/icons/icon.iconset/icon_128x128@2x.png +0 -0
- package/build/icons/icon.iconset/icon_16x16.png +0 -0
- package/build/icons/icon.iconset/icon_16x16@2x.png +0 -0
- package/build/icons/icon.iconset/icon_256x256.png +0 -0
- package/build/icons/icon.iconset/icon_256x256@2x.png +0 -0
- package/build/icons/icon.iconset/icon_32x32.png +0 -0
- package/build/icons/icon.iconset/icon_32x32@2x.png +0 -0
- package/build/icons/icon.iconset/icon_512x512.png +0 -0
- package/build/icons/icon.iconset/icon_512x512@2x.png +0 -0
- package/build/icons/icon.png +0 -0
- package/dist/docker-desktop-mx/browser/chunk-64WWLMUP.js +39 -0
- package/dist/docker-desktop-mx/browser/chunk-N4VBBC4W.js +1 -0
- package/dist/docker-desktop-mx/browser/favicon.ico +0 -0
- package/dist/docker-desktop-mx/browser/index.html +14 -0
- package/dist/docker-desktop-mx/browser/main-CTIRTSOI.js +5 -0
- package/dist/docker-desktop-mx/browser/styles-JS3HDDI4.css +1 -0
- package/dist-electron/api.js +10 -0
- package/dist-electron/api.js.map +1 -0
- package/dist-electron/assistant-key.js +70 -0
- package/dist-electron/assistant-key.js.map +1 -0
- package/dist-electron/assistant-models.js +19 -0
- package/dist-electron/assistant-models.js.map +1 -0
- package/dist-electron/assistant-tools.js +335 -0
- package/dist-electron/assistant-tools.js.map +1 -0
- package/dist-electron/assistant.js +302 -0
- package/dist-electron/assistant.js.map +1 -0
- package/dist-electron/attention.js +75 -0
- package/dist-electron/attention.js.map +1 -0
- package/dist-electron/channels.js +113 -0
- package/dist-electron/channels.js.map +1 -0
- package/dist-electron/compose-files.js +104 -0
- package/dist-electron/compose-files.js.map +1 -0
- package/dist-electron/compose.js +271 -0
- package/dist-electron/compose.js.map +1 -0
- package/dist-electron/container-events.js +188 -0
- package/dist-electron/container-events.js.map +1 -0
- package/dist-electron/containers.js +165 -0
- package/dist-electron/containers.js.map +1 -0
- package/dist-electron/context-menu.js +56 -0
- package/dist-electron/context-menu.js.map +1 -0
- package/dist-electron/contexts.js +346 -0
- package/dist-electron/contexts.js.map +1 -0
- package/dist-electron/crash.js +129 -0
- package/dist-electron/crash.js.map +1 -0
- package/dist-electron/diagnosis.js +338 -0
- package/dist-electron/diagnosis.js.map +1 -0
- package/dist-electron/docker-client.js +284 -0
- package/dist-electron/docker-client.js.map +1 -0
- package/dist-electron/engine.js +145 -0
- package/dist-electron/engine.js.map +1 -0
- package/dist-electron/event-store.js +146 -0
- package/dist-electron/event-store.js.map +1 -0
- package/dist-electron/events.js +132 -0
- package/dist-electron/events.js.map +1 -0
- package/dist-electron/exec.js +138 -0
- package/dist-electron/exec.js.map +1 -0
- package/dist-electron/files.js +407 -0
- package/dist-electron/files.js.map +1 -0
- package/dist-electron/health.js +92 -0
- package/dist-electron/health.js.map +1 -0
- package/dist-electron/host-overview.js +50 -0
- package/dist-electron/host-overview.js.map +1 -0
- package/dist-electron/host-shell.js +196 -0
- package/dist-electron/host-shell.js.map +1 -0
- package/dist-electron/i18n.js +58 -0
- package/dist-electron/i18n.js.map +1 -0
- package/dist-electron/image-history.js +87 -0
- package/dist-electron/image-history.js.map +1 -0
- package/dist-electron/images.js +141 -0
- package/dist-electron/images.js.map +1 -0
- package/dist-electron/ipc.js +783 -0
- package/dist-electron/ipc.js.map +1 -0
- package/dist-electron/links.js +46 -0
- package/dist-electron/links.js.map +1 -0
- package/dist-electron/logs.js +153 -0
- package/dist-electron/logs.js.map +1 -0
- package/dist-electron/main.js +494 -0
- package/dist-electron/main.js.map +1 -0
- package/dist-electron/merged-logs.js +127 -0
- package/dist-electron/merged-logs.js.map +1 -0
- package/dist-electron/navigation.js +37 -0
- package/dist-electron/navigation.js.map +1 -0
- package/dist-electron/ndjson.js +30 -0
- package/dist-electron/ndjson.js.map +1 -0
- package/dist-electron/networks.js +507 -0
- package/dist-electron/networks.js.map +1 -0
- package/dist-electron/port-conflicts.js +106 -0
- package/dist-electron/port-conflicts.js.map +1 -0
- package/dist-electron/preload.js +257 -0
- package/dist-electron/preload.js.map +1 -0
- package/dist-electron/pull.js +220 -0
- package/dist-electron/pull.js.map +1 -0
- package/dist-electron/redact.js +129 -0
- package/dist-electron/redact.js.map +1 -0
- package/dist-electron/registry-auth.js +150 -0
- package/dist-electron/registry-auth.js.map +1 -0
- package/dist-electron/renew.js +162 -0
- package/dist-electron/renew.js.map +1 -0
- package/dist-electron/restart-policy.js +58 -0
- package/dist-electron/restart-policy.js.map +1 -0
- package/dist-electron/run-command.js +146 -0
- package/dist-electron/run-command.js.map +1 -0
- package/dist-electron/run.js +151 -0
- package/dist-electron/run.js.map +1 -0
- package/dist-electron/self-update.js +163 -0
- package/dist-electron/self-update.js.map +1 -0
- package/dist-electron/servers.js +108 -0
- package/dist-electron/servers.js.map +1 -0
- package/dist-electron/settings.js +146 -0
- package/dist-electron/settings.js.map +1 -0
- package/dist-electron/ssh.js +574 -0
- package/dist-electron/ssh.js.map +1 -0
- package/dist-electron/stats.js +209 -0
- package/dist-electron/stats.js.map +1 -0
- package/dist-electron/streams.js +63 -0
- package/dist-electron/streams.js.map +1 -0
- package/dist-electron/system.js +123 -0
- package/dist-electron/system.js.map +1 -0
- package/dist-electron/terminal-transcript.js +55 -0
- package/dist-electron/terminal-transcript.js.map +1 -0
- package/dist-electron/updates.js +136 -0
- package/dist-electron/updates.js.map +1 -0
- package/dist-electron/volume-backup.js +203 -0
- package/dist-electron/volume-backup.js.map +1 -0
- package/dist-electron/volume-files.js +124 -0
- package/dist-electron/volume-files.js.map +1 -0
- package/dist-electron/volumes.js +253 -0
- package/dist-electron/volumes.js.map +1 -0
- package/dist-electron/wiring-watch.js +93 -0
- package/dist-electron/wiring-watch.js.map +1 -0
- package/dist-electron/wiring.js +71 -0
- package/dist-electron/wiring.js.map +1 -0
- package/dist-electron/wsl.js +167 -0
- package/dist-electron/wsl.js.map +1 -0
- package/package.json +125 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-client.js","sourceRoot":"","sources":["../electron/docker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toEngineVersion = toEngineVersion;
|
|
4
|
+
exports.toEngineInfo = toEngineInfo;
|
|
5
|
+
exports.readEngineStatus = readEngineStatus;
|
|
6
|
+
exports.startWsl = startWsl;
|
|
7
|
+
exports.startWslDaemon = startWslDaemon;
|
|
8
|
+
const docker_client_1 = require("./docker-client");
|
|
9
|
+
const i18n_1 = require("./i18n");
|
|
10
|
+
const wsl_1 = require("./wsl");
|
|
11
|
+
/** Na het starten van de distro moet systemd docker nog opbrengen. */
|
|
12
|
+
const WSL_WAIT_MS = 20_000;
|
|
13
|
+
const WSL_POLL_MS = 1000;
|
|
14
|
+
/** Vertaalt het antwoord van `docker version` naar het contract van de renderer. */
|
|
15
|
+
function toEngineVersion(raw) {
|
|
16
|
+
const unknown = (0, i18n_1.t)({ en: 'unknown', nl: 'onbekend', de: 'unbekannt', fr: 'inconnu', es: 'desconocido' });
|
|
17
|
+
return {
|
|
18
|
+
version: raw.Version ?? unknown,
|
|
19
|
+
apiVersion: raw.ApiVersion ?? unknown,
|
|
20
|
+
os: raw.Os ?? unknown,
|
|
21
|
+
arch: raw.Arch ?? unknown,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Vertaalt het antwoord van `docker info` naar het contract van de renderer. */
|
|
25
|
+
function toEngineInfo(raw) {
|
|
26
|
+
return {
|
|
27
|
+
name: raw.Name ?? (0, i18n_1.t)({ en: 'unknown', nl: 'onbekend', de: 'unbekannt', fr: 'inconnu', es: 'desconocido' }),
|
|
28
|
+
containers: raw.Containers ?? 0,
|
|
29
|
+
containersRunning: raw.ContainersRunning ?? 0,
|
|
30
|
+
containersPaused: raw.ContainersPaused ?? 0,
|
|
31
|
+
containersStopped: raw.ContainersStopped ?? 0,
|
|
32
|
+
images: raw.Images ?? 0,
|
|
33
|
+
cpus: raw.NCPU ?? 0,
|
|
34
|
+
memoryBytes: raw.MemTotal ?? 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Haalt versie en info op. Faalt bewust nooit: de statusbalk moet altijd iets kunnen tonen,
|
|
39
|
+
* dus een onbereikbare daemon komt terug als `connected: false` met een leesbare reden.
|
|
40
|
+
*/
|
|
41
|
+
async function readEngineStatus() {
|
|
42
|
+
const { docker, endpoint } = (0, docker_client_1.getConnection)();
|
|
43
|
+
try {
|
|
44
|
+
// dockerode typeert version() als `any`; de vorm vastleggen bij het uitpakken houdt de
|
|
45
|
+
// rest van deze functie typed in plaats van dat `any` doorlekt naar de vertaalfuncties.
|
|
46
|
+
const [version, info] = (await Promise.all([docker.version(), docker.info()]));
|
|
47
|
+
return { connected: true, endpoint, version: toEngineVersion(version), info: toEngineInfo(info) };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const offer = await (0, wsl_1.wslOffer)(err, endpoint);
|
|
51
|
+
return {
|
|
52
|
+
connected: false,
|
|
53
|
+
endpoint,
|
|
54
|
+
problem: (0, docker_client_1.describeConnectionProblem)(err, endpoint),
|
|
55
|
+
...(offer === null ? {} : offer.kind === 'distro' ? { wslDistro: offer.distro } : { wslDaemonDistro: offer.distro }),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const defaultDeps = {
|
|
60
|
+
start: (distro) => (0, wsl_1.startDistro)(distro),
|
|
61
|
+
ping: async () => {
|
|
62
|
+
await (0, docker_client_1.getConnection)().docker.ping();
|
|
63
|
+
return true;
|
|
64
|
+
},
|
|
65
|
+
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
66
|
+
now: () => Date.now(),
|
|
67
|
+
};
|
|
68
|
+
/** Zelfde stappen, maar `start` draait het commando ín de distro in plaats van hem op te starten. */
|
|
69
|
+
const daemonDeps = { ...defaultDeps, start: (distro) => (0, wsl_1.startDaemonInDistro)(distro) };
|
|
70
|
+
/**
|
|
71
|
+
* Start de distro en wacht tot de daemon antwoordt.
|
|
72
|
+
*
|
|
73
|
+
* Wachten hoort hier en niet in de renderer: zodra dit `ok` zegt, kan de renderer alles
|
|
74
|
+
* opnieuw ophalen en klopt het meteen, in plaats van dat elke lijst zelf gaat pollen.
|
|
75
|
+
*/
|
|
76
|
+
async function startWsl(distro, deps = defaultDeps) {
|
|
77
|
+
try {
|
|
78
|
+
await deps.start(distro);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
82
|
+
return { ok: false, problem: (0, i18n_1.t)({
|
|
83
|
+
en: `Could not start ${distro}: ${reason}`,
|
|
84
|
+
nl: `Kon ${distro} niet starten: ${reason}`,
|
|
85
|
+
de: `${distro} konnte nicht gestartet werden: ${reason}`,
|
|
86
|
+
fr: `Impossible de démarrer ${distro} : ${reason}`,
|
|
87
|
+
es: `No se ha podido iniciar ${distro}: ${reason}`,
|
|
88
|
+
}) };
|
|
89
|
+
}
|
|
90
|
+
return waitForDaemon(distro, deps);
|
|
91
|
+
}
|
|
92
|
+
/** Zoals `startWsl`, maar voor een distro die al draait: daar ontbreekt alleen de daemon. */
|
|
93
|
+
async function startWslDaemon(distro, deps = daemonDeps) {
|
|
94
|
+
try {
|
|
95
|
+
await deps.start(distro);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
99
|
+
const manually = (0, wsl_1.daemonCommand)(distro);
|
|
100
|
+
// Het commando erbij: lukt het zo niet, dan is het in een terminal alsnog één regel. Een
|
|
101
|
+
// distro zonder systemd, of met docker onder een andere naam, komt hier terecht.
|
|
102
|
+
return { ok: false, problem: (0, i18n_1.t)({
|
|
103
|
+
en: `Could not start Docker in ${distro}: ${reason} Try it yourself with: ${manually}`,
|
|
104
|
+
nl: `Kon Docker niet starten in ${distro}: ${reason} Probeer het zelf met: ${manually}`,
|
|
105
|
+
de: `Docker konnte in ${distro} nicht gestartet werden: ${reason} Versuchen Sie es selbst mit: ${manually}`,
|
|
106
|
+
fr: `Impossible de démarrer Docker dans ${distro} : ${reason} Essayez vous-même avec : ${manually}`,
|
|
107
|
+
es: `No se ha podido iniciar Docker en ${distro}: ${reason} Pruébalo tú mismo con: ${manually}`,
|
|
108
|
+
}) };
|
|
109
|
+
}
|
|
110
|
+
return waitForDaemon(distro, deps);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Wachten tot de daemon antwoordt. Hoort hier en niet in de renderer: zodra dit `ok` zegt, kan
|
|
114
|
+
* die alles opnieuw ophalen en klopt het meteen, in plaats van dat elke lijst zelf gaat pollen.
|
|
115
|
+
*/
|
|
116
|
+
async function waitForDaemon(distro, deps) {
|
|
117
|
+
const deadline = deps.now() + WSL_WAIT_MS;
|
|
118
|
+
while (deps.now() < deadline) {
|
|
119
|
+
try {
|
|
120
|
+
if (await deps.ping()) {
|
|
121
|
+
return { ok: true };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Nog niet: docker komt pas op als systemd zover is.
|
|
126
|
+
}
|
|
127
|
+
await deps.sleep(WSL_POLL_MS);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
problem: (0, i18n_1.t)({
|
|
132
|
+
en: `${distro} is running, but Docker still does not respond after ${String(WSL_WAIT_MS / 1000)} seconds. ` +
|
|
133
|
+
`Check inside the distro with 'systemctl status docker'.`,
|
|
134
|
+
nl: `${distro} draait, maar Docker antwoordt na ${String(WSL_WAIT_MS / 1000)} seconden nog niet. ` +
|
|
135
|
+
`Kijk in de distro met 'systemctl status docker'.`,
|
|
136
|
+
de: `${distro} läuft, aber Docker antwortet nach ${String(WSL_WAIT_MS / 1000)} Sekunden immer noch nicht. ` +
|
|
137
|
+
`Prüfen Sie es in der Distro mit 'systemctl status docker'.`,
|
|
138
|
+
fr: `${distro} tourne, mais Docker ne répond toujours pas après ${String(WSL_WAIT_MS / 1000)} secondes. ` +
|
|
139
|
+
`Vérifiez dans la distro avec 'systemctl status docker'.`,
|
|
140
|
+
es: `${distro} está en marcha, pero Docker sigue sin responder después de ${String(WSL_WAIT_MS / 1000)} segundos. ` +
|
|
141
|
+
`Compruébalo dentro de la distro con 'systemctl status docker'.`,
|
|
142
|
+
}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../electron/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventStore = exports.SAVE_DELAY_MS = void 0;
|
|
4
|
+
exports.parseEventFile = parseEventFile;
|
|
5
|
+
const container_events_1 = require("./container-events");
|
|
6
|
+
/**
|
|
7
|
+
* De geschiedenis van de tab Gebeurtenissen op schijf, zodat hij een herstart van de app overleeft.
|
|
8
|
+
*
|
|
9
|
+
* Zonder dit begon de tab na elke update opnieuw, met alleen wat de daemon nog wist: 256 events,
|
|
10
|
+
* in de praktijk allemaal exec's van healthchecks. Nu staat hij in `events.json` in de
|
|
11
|
+
* gebruikersmap, per context: een andere daemon heeft andere containers, en dezelfde naam betekent
|
|
12
|
+
* daar iets anders.
|
|
13
|
+
*
|
|
14
|
+
* Schrijven gebeurt met vertraging. Een container in een herstartlus levert drie events per ronde
|
|
15
|
+
* op, en daar hoort geen schrijfactie per event bij. Bij het afsluiten en bij een contextwissel
|
|
16
|
+
* gaat het meteen.
|
|
17
|
+
*/
|
|
18
|
+
/** Zo lang na het laatste event wachten we met schrijven. */
|
|
19
|
+
exports.SAVE_DELAY_MS = 5000;
|
|
20
|
+
const FILE_VERSION = 1;
|
|
21
|
+
const ACTIONS = new Set([
|
|
22
|
+
'create',
|
|
23
|
+
'start',
|
|
24
|
+
'die',
|
|
25
|
+
'kill',
|
|
26
|
+
'oom',
|
|
27
|
+
'stop',
|
|
28
|
+
'restart',
|
|
29
|
+
'pause',
|
|
30
|
+
'unpause',
|
|
31
|
+
'destroy',
|
|
32
|
+
'rename',
|
|
33
|
+
'health',
|
|
34
|
+
]);
|
|
35
|
+
const HEALTH = new Set(['starting', 'healthy', 'unhealthy']);
|
|
36
|
+
function isObject(value) {
|
|
37
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
38
|
+
}
|
|
39
|
+
function orNull(value, check) {
|
|
40
|
+
return check(value) ? value : null;
|
|
41
|
+
}
|
|
42
|
+
const isNumber = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
43
|
+
const isString = (value) => typeof value === 'string';
|
|
44
|
+
const isHealth = (value) => HEALTH.has(value);
|
|
45
|
+
/** Eén opgeslagen event, of `null` als het niet klopt. Het bestand is van ons, maar kan half geschreven zijn. */
|
|
46
|
+
function toEntry(raw) {
|
|
47
|
+
if (!isObject(raw) || !isString(raw['key']) || !isObject(raw['event'])) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const event = raw['event'];
|
|
51
|
+
if (!isNumber(event['time']) || !ACTIONS.has(event['action'])) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const parsed = {
|
|
55
|
+
time: event['time'],
|
|
56
|
+
action: event['action'],
|
|
57
|
+
exitCode: orNull(event['exitCode'], isNumber),
|
|
58
|
+
signal: orNull(event['signal'], isString),
|
|
59
|
+
health: orNull(event['health'], isHealth),
|
|
60
|
+
oldName: orNull(event['oldName'], isString),
|
|
61
|
+
};
|
|
62
|
+
return { key: raw['key'], event: parsed };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Leest het bestand. Wat niet klopt, valt weg; een kapot bestand geeft niets, en dan begint de
|
|
66
|
+
* geschiedenis leeg. Dat is geen reden om de app niet te laten starten.
|
|
67
|
+
*/
|
|
68
|
+
function parseEventFile(text) {
|
|
69
|
+
if (text === null) {
|
|
70
|
+
return {};
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const raw = JSON.parse(text);
|
|
74
|
+
if (!isObject(raw) || raw['version'] !== FILE_VERSION || !isObject(raw['contexts'])) {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
const contexts = {};
|
|
78
|
+
for (const [context, names] of Object.entries(raw['contexts'])) {
|
|
79
|
+
if (!isObject(names)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
contexts[context] = {};
|
|
83
|
+
for (const [name, entries] of Object.entries(names)) {
|
|
84
|
+
if (Array.isArray(entries)) {
|
|
85
|
+
contexts[context][name] = entries.map(toEntry).filter((entry) => entry !== null);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return contexts;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return {};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function defaultSchedule(callback, delayMs) {
|
|
96
|
+
const timer = setTimeout(callback, delayMs);
|
|
97
|
+
// Een schrijfactie die nog moet, mag het afsluiten niet ophouden; `flush` doet hem dan zelf.
|
|
98
|
+
timer.unref();
|
|
99
|
+
return { cancel: () => clearTimeout(timer) };
|
|
100
|
+
}
|
|
101
|
+
class EventStore {
|
|
102
|
+
deps;
|
|
103
|
+
saved = null;
|
|
104
|
+
dirty = new Map();
|
|
105
|
+
pending = null;
|
|
106
|
+
constructor(deps) {
|
|
107
|
+
this.deps = deps;
|
|
108
|
+
}
|
|
109
|
+
/** De geschiedenis van deze context zoals hij bewaard was, zonder namen van langer dan een week geleden. */
|
|
110
|
+
load(context) {
|
|
111
|
+
return container_events_1.ContainerHistory.restore(this.contexts()[context] ?? {}, this.deps.now());
|
|
112
|
+
}
|
|
113
|
+
/** Er kwam iets bij: over een paar seconden wegschrijven, samen met wat er daarna nog komt. */
|
|
114
|
+
changed(context, history) {
|
|
115
|
+
this.dirty.set(context, history);
|
|
116
|
+
if (this.pending === null) {
|
|
117
|
+
this.pending = (this.deps.schedule ?? defaultSchedule)(() => this.flush(), exports.SAVE_DELAY_MS);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Nu wegschrijven wat er nog moet: bij het afsluiten en bij een contextwissel. */
|
|
121
|
+
flush() {
|
|
122
|
+
this.pending?.cancel();
|
|
123
|
+
this.pending = null;
|
|
124
|
+
if (this.dirty.size === 0) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const contexts = { ...this.contexts() };
|
|
128
|
+
for (const [context, history] of this.dirty) {
|
|
129
|
+
contexts[context] = history.save();
|
|
130
|
+
}
|
|
131
|
+
this.dirty.clear();
|
|
132
|
+
this.saved = contexts;
|
|
133
|
+
try {
|
|
134
|
+
this.deps.write(`${JSON.stringify({ version: FILE_VERSION, contexts })}\n`);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Niet kunnen schrijven is jammer, maar de app werkt door; de volgende keer lukt het misschien.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
contexts() {
|
|
141
|
+
this.saved ??= parseEventFile(this.deps.read());
|
|
142
|
+
return this.saved;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.EventStore = EventStore;
|
|
146
|
+
//# sourceMappingURL=event-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../electron/event-store.ts"],"names":[],"mappings":";;;AAkFA,wCAiCC;AAlHD,yDAAyE;AAEzE;;;;;;;;;;;GAWG;AAEH,6DAA6D;AAChD,QAAA,aAAa,GAAG,IAAI,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,CAAC;AAIvB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAuB;IAC5C,QAAQ;IACR,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAe,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAE3E,SAAS,QAAQ,CAAC,KAAc;IAE9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,MAAM,CAAI,KAAc,EAAE,KAAqC;IAEtE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1G,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;AAChF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAyB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAqB,CAAC,CAAC;AAE9F,iHAAiH;AACjH,SAAS,OAAO,CAAC,GAAY;IAE3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAyB,CAAC,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAyB;QAC/C,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC;QAC7C,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;KAC5C,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAAmB;IAEhD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,YAAY,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACpF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAEvB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAyB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;gBAC1G,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD,SAAS,eAAe,CAAC,QAAoB,EAAE,OAAe;IAE5D,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE5C,6FAA6F;IAC7F,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAa,UAAU;IAMQ;IAJrB,KAAK,GAAyB,IAAI,CAAC;IAC1B,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IACrD,OAAO,GAA8B,IAAI,CAAC;IAElD,YAA6B,IAAoB;QAApB,SAAI,GAAJ,IAAI,CAAgB;IAAG,CAAC;IAErD,4GAA4G;IAC5G,IAAI,CAAC,OAAe;QAElB,OAAO,mCAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,+FAA+F;IAC/F,OAAO,CAAC,OAAe,EAAE,OAAyB;QAEhD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,qBAAa,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,KAAK;QAEH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAExC,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QAEtB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,gGAAgG;QAClG,CAAC;IACH,CAAC;IAEO,QAAQ;QAEd,IAAI,CAAC,KAAK,KAAK,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEhD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAxDD,gCAwDC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventsWatcher = void 0;
|
|
4
|
+
exports.toResourceKind = toResourceKind;
|
|
5
|
+
const channels_1 = require("./channels");
|
|
6
|
+
const docker_client_1 = require("./docker-client");
|
|
7
|
+
const ndjson_1 = require("./ndjson");
|
|
8
|
+
/**
|
|
9
|
+
* Bij een `compose up` van tien services komen er tientallen gebeurtenissen binnen in een
|
|
10
|
+
* seconde. Zonder dit venster zou elke gebeurtenis een eigen lijstaanvraag opleveren.
|
|
11
|
+
*/
|
|
12
|
+
const COALESCE_MS = 150;
|
|
13
|
+
/** Hoe lang we wachten voor we opnieuw proberen als de daemon wegvalt (bijv. bij herstarten). */
|
|
14
|
+
const RETRY_MS = 2000;
|
|
15
|
+
const KINDS = {
|
|
16
|
+
container: 'container',
|
|
17
|
+
image: 'image',
|
|
18
|
+
volume: 'volume',
|
|
19
|
+
network: 'network',
|
|
20
|
+
};
|
|
21
|
+
/** Leest uit een gebeurtenis welk soort resource er veranderde; `null` voor alles wat we negeren. */
|
|
22
|
+
function toResourceKind(raw) {
|
|
23
|
+
const type = raw?.Type;
|
|
24
|
+
if (typeof type !== 'string') {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return KINDS[type] ?? null;
|
|
28
|
+
}
|
|
29
|
+
async function openViaDocker(onEvent, onEnd) {
|
|
30
|
+
const { docker } = (0, docker_client_1.getConnection)();
|
|
31
|
+
const stream = (await docker.getEvents());
|
|
32
|
+
stream.on('data', (0, ndjson_1.ndjson)(onEvent));
|
|
33
|
+
stream.on('error', onEnd);
|
|
34
|
+
stream.on('end', onEnd);
|
|
35
|
+
return stream;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Volgt Docker's events-stream en vertelt het venster welke lijsten verouderd zijn. Niet wát
|
|
39
|
+
* er veranderde: het soort resource is genoeg om te weten welke lijst opnieuw opgehaald moet
|
|
40
|
+
* worden, en dat scheelt het naspelen van Docker's toestandsovergangen aan onze kant.
|
|
41
|
+
*/
|
|
42
|
+
class EventsWatcher {
|
|
43
|
+
sender;
|
|
44
|
+
open;
|
|
45
|
+
onRaw;
|
|
46
|
+
stream = null;
|
|
47
|
+
pending = new Set();
|
|
48
|
+
flushTimer = null;
|
|
49
|
+
retryTimer = null;
|
|
50
|
+
stopped = false;
|
|
51
|
+
/**
|
|
52
|
+
* `onRaw` krijgt elk event ongewijzigd, voor wie meer wil weten dan welk soort er veranderde.
|
|
53
|
+
* De crashmelding gebruikt dit: die moet de afsluitcode zien.
|
|
54
|
+
*/
|
|
55
|
+
constructor(sender, open = openViaDocker, onRaw = () => undefined) {
|
|
56
|
+
this.sender = sender;
|
|
57
|
+
this.open = open;
|
|
58
|
+
this.onRaw = onRaw;
|
|
59
|
+
}
|
|
60
|
+
start() {
|
|
61
|
+
void this.connect();
|
|
62
|
+
}
|
|
63
|
+
stop() {
|
|
64
|
+
this.stopped = true;
|
|
65
|
+
this.stream?.destroy();
|
|
66
|
+
this.stream = null;
|
|
67
|
+
this.clear(this.flushTimer);
|
|
68
|
+
this.clear(this.retryTimer);
|
|
69
|
+
this.flushTimer = null;
|
|
70
|
+
this.retryTimer = null;
|
|
71
|
+
}
|
|
72
|
+
clear(timer) {
|
|
73
|
+
if (timer !== null) {
|
|
74
|
+
clearTimeout(timer);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async connect() {
|
|
78
|
+
if (this.stopped) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const stream = await this.open((raw) => this.record(raw), () => this.reconnect());
|
|
83
|
+
// Tussen het openen en nu kan het venster gesloten zijn.
|
|
84
|
+
if (this.stopped) {
|
|
85
|
+
stream.destroy();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.stream = stream;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
this.reconnect();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
reconnect() {
|
|
95
|
+
if (this.stopped || this.retryTimer !== null) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.stream = null;
|
|
99
|
+
this.retryTimer = setTimeout(() => {
|
|
100
|
+
this.retryTimer = null;
|
|
101
|
+
void this.connect();
|
|
102
|
+
}, RETRY_MS);
|
|
103
|
+
this.retryTimer.unref();
|
|
104
|
+
}
|
|
105
|
+
record(raw) {
|
|
106
|
+
this.onRaw(raw);
|
|
107
|
+
const kind = toResourceKind(raw);
|
|
108
|
+
if (kind === null) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
this.pending.add(kind);
|
|
112
|
+
if (this.flushTimer === null) {
|
|
113
|
+
this.flushTimer = setTimeout(() => this.emit(), COALESCE_MS);
|
|
114
|
+
this.flushTimer.unref();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
emit() {
|
|
118
|
+
this.flushTimer = null;
|
|
119
|
+
const kinds = [...this.pending];
|
|
120
|
+
this.pending.clear();
|
|
121
|
+
if (kinds.length === 0) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (this.sender.isDestroyed()) {
|
|
125
|
+
this.stop();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.sender.send(channels_1.CHANNELS.dockerEvents, kinds);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.EventsWatcher = EventsWatcher;
|
|
132
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../electron/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wrapSession = wrapSession;
|
|
4
|
+
exports.openExec = openExec;
|
|
5
|
+
const docker_client_1 = require("./docker-client");
|
|
6
|
+
const i18n_1 = require("./i18n");
|
|
7
|
+
/**
|
|
8
|
+
* Zoekt een shell die er echt is.
|
|
9
|
+
*
|
|
10
|
+
* Alpine en de meeste slanke images hebben geen bash, distroless images hebben helemaal niets.
|
|
11
|
+
* Blind `/bin/bash` starten geeft dan een OCI-fout die er uitziet als een fout van ons, dus we
|
|
12
|
+
* vragen het eerst. Dat kost één korte exec, en het antwoord is eenduidig.
|
|
13
|
+
*/
|
|
14
|
+
const PROBE = 'for c in /bin/bash /usr/bin/bash /bin/sh /usr/bin/sh /bin/ash; do [ -x "$c" ] && echo "$c" && exit 0; done; exit 1';
|
|
15
|
+
/** Leest de uitvoer van een korte exec uit; de shell-probe schrijft één regel. */
|
|
16
|
+
function readAll(stream) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
let text = '';
|
|
19
|
+
stream.on('data', (chunk) => (text += chunk.toString('utf8')));
|
|
20
|
+
stream.on('end', () => resolve(text));
|
|
21
|
+
stream.on('error', () => resolve(text));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const dockerBackend = {
|
|
25
|
+
detectShell: async (containerId) => {
|
|
26
|
+
const { docker } = (0, docker_client_1.getConnection)();
|
|
27
|
+
try {
|
|
28
|
+
const probe = await docker.getContainer(containerId).exec({
|
|
29
|
+
Cmd: ['/bin/sh', '-c', PROBE],
|
|
30
|
+
AttachStdout: true,
|
|
31
|
+
AttachStderr: false,
|
|
32
|
+
});
|
|
33
|
+
const stream = await probe.start({ hijack: true, stdin: false });
|
|
34
|
+
// Zonder TTY zet Docker een kop van 8 bytes voor elk frame; de probe geeft één regel,
|
|
35
|
+
// dus het pad eruit halen kan met een regex in plaats van een volledige demux.
|
|
36
|
+
const found = /(\/[\w/]*\/(?:bash|sh|ash))/.exec(await readAll(stream));
|
|
37
|
+
return found === null ? null : found[1];
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
start: async (containerId, shell, size) => {
|
|
44
|
+
const { docker } = (0, docker_client_1.getConnection)();
|
|
45
|
+
const exec = await docker.getContainer(containerId).exec({
|
|
46
|
+
Cmd: [shell],
|
|
47
|
+
AttachStdin: true,
|
|
48
|
+
AttachStdout: true,
|
|
49
|
+
AttachStderr: true,
|
|
50
|
+
Tty: true,
|
|
51
|
+
Env: ['TERM=xterm-256color'],
|
|
52
|
+
});
|
|
53
|
+
// Drie dingen moeten hier staan, en het derde is een valkuil:
|
|
54
|
+
// - hijack maakt van de HTTP-verbinding een tweerichtingskanaal in plaats van een antwoord;
|
|
55
|
+
// - stdin opent de schrijfkant, anders kun je wel lezen maar niet typen;
|
|
56
|
+
// - Tty moet ook hier staan, níét alleen bij het aanmaken hierboven. De start-aanroep heeft
|
|
57
|
+
// zijn eigen Tty in de body, en die bepaalt of de daemon de uitvoer framet. Laat je hem
|
|
58
|
+
// weg, dan komt er van een exec die volgens `inspect` gewoon `tty: true` is toch
|
|
59
|
+
// gemultiplexte uitvoer terug, met een kop van 8 bytes voor elk stukje.
|
|
60
|
+
const stream = (await exec.start({ hijack: true, stdin: true, Tty: true }));
|
|
61
|
+
await exec.resize({ h: size.rows, w: size.cols });
|
|
62
|
+
return {
|
|
63
|
+
stream,
|
|
64
|
+
resize: (cols, rows) => {
|
|
65
|
+
// Een resize op een exec die net gestopt is geeft een 404; dat is geen fout om te melden.
|
|
66
|
+
void exec.resize({ h: rows, w: cols }).catch(() => undefined);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Maakt van een ruwe TTY-stream een sessie. `stop` ruimt op wat er naast de stream nog draait,
|
|
73
|
+
* zoals de hulpcontainer van de host-shell.
|
|
74
|
+
*/
|
|
75
|
+
function wrapSession(shell, stream, resize, onData, onEnd, stop = () => undefined) {
|
|
76
|
+
let closed = false;
|
|
77
|
+
const finish = () => {
|
|
78
|
+
if (!closed) {
|
|
79
|
+
closed = true;
|
|
80
|
+
onEnd();
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
stream.on('data', (chunk) => onData(chunk.toString('utf8')));
|
|
84
|
+
stream.on('end', finish);
|
|
85
|
+
stream.on('close', finish);
|
|
86
|
+
stream.on('error', finish);
|
|
87
|
+
return {
|
|
88
|
+
shell,
|
|
89
|
+
write: (data) => {
|
|
90
|
+
if (!closed) {
|
|
91
|
+
stream.write(data);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
resize,
|
|
95
|
+
destroy: () => {
|
|
96
|
+
closed = true;
|
|
97
|
+
stream.destroy();
|
|
98
|
+
stop();
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Opent een shell in een draaiende container.
|
|
104
|
+
*
|
|
105
|
+
* Met TTY multiplext Docker de uitvoer niet, dus wat binnenkomt gaat ongewijzigd naar xterm —
|
|
106
|
+
* inclusief de escape-codes, want díé zijn hier juist de bedoeling. Dat is het verschil met de
|
|
107
|
+
* logweergave, waar we ze er juist uit halen.
|
|
108
|
+
*/
|
|
109
|
+
async function openExec(containerId, size, onData, onEnd, backend = dockerBackend) {
|
|
110
|
+
const shell = await backend.detectShell(containerId);
|
|
111
|
+
if (shell === null) {
|
|
112
|
+
return {
|
|
113
|
+
ok: false,
|
|
114
|
+
problem: (0, i18n_1.t)({
|
|
115
|
+
en: 'No shell can be found in this container. Slim images such as distroless do not have one.',
|
|
116
|
+
nl: 'In deze container is geen shell te vinden. Slanke images zoals distroless hebben er geen.',
|
|
117
|
+
de: 'In diesem Container ist keine Shell zu finden. Schlanke Images wie distroless haben keine.',
|
|
118
|
+
fr: 'Aucun shell n’a été trouvé dans ce conteneur. Les images minimales comme distroless n’en ont pas.',
|
|
119
|
+
es: 'No se encuentra ningún shell en este contenedor. Las images minimalistas como distroless no tienen.',
|
|
120
|
+
}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const { stream, resize } = await backend.start(containerId, shell, size);
|
|
125
|
+
return { ok: true, session: wrapSession(shell, stream, resize, onData, onEnd) };
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
129
|
+
return { ok: false, problem: (0, i18n_1.t)({
|
|
130
|
+
en: `The shell could not be started: ${reason}`,
|
|
131
|
+
nl: `De shell kon niet gestart worden: ${reason}`,
|
|
132
|
+
de: `Die Shell konnte nicht gestartet werden: ${reason}`,
|
|
133
|
+
fr: `Le shell n’a pas pu être démarré : ${reason}`,
|
|
134
|
+
es: `No se ha podido iniciar el shell: ${reason}`,
|
|
135
|
+
}) };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../electron/exec.ts"],"names":[],"mappings":"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"}
|