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":"containers.js","sourceRoot":"","sources":["../electron/containers.ts"],"names":[],"mappings":";;AAyDA,sCAKC;AAGD,gDAwBC;AAGD,wCAMC;AAOD,4CAQC;AA8CD,gDAiBC;AAQD,0CAmBC;AAjMD,uCAA6C;AAC7C,mDAAuE;AACvE,iCAA2B;AAC3B,qDAAuD;AACvD,qCAA4C;AAE5C,MAAM,eAAe,GAAG,4BAA4B,CAAC;AACrD,MAAM,eAAe,GAAG,4BAA4B,CAAC;AACrD,MAAM,mBAAmB,GAAG,wCAAwC,CAAC;AACrE,MAAM,oBAAoB,GAAG,yCAAyC,CAAC;AAEvE,MAAM,MAAM,GAA8B,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEvH,SAAS,OAAO,CAAC,GAAW;IAE1B,OAAQ,MAA4B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAsB,CAAC,CAAC,CAAC,MAAM,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,GAA0C;IAEzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAgB;YAC3B,QAAQ,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;YACjC,aAAa,EAAE,IAAI,CAAC,WAAW;YAC/B,QAAQ,EAAE,IAAI,CAAC,IAAI;SACpB,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;IACxG,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,MAAc;IAE1C,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,4EAA4E;AAC5E,SAAgB,kBAAkB,CAAC,GAA4B;IAE7D,MAAM,MAAM,GAA2B,GAAG,CAAC,MAAM,CAAC;IAElD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5B,qFAAqF;QACrF,kDAAkD;QAClD,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACjD,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QACnC,SAAS,EAAE,GAAG,CAAC,OAAO;QACtB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,cAAc,EAAE,IAAA,yBAAgB,EAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC;QAChI,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,IAAI;QAC/C,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,IAAI;QAC/C,mFAAmF;QACnF,gFAAgF;QAChF,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,IAAI;QACtD,kBAAkB,EAAE,IAAA,0BAAgB,EAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,yEAAyE;AAClE,KAAK,UAAU,cAAc;IAElC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAa,GAAE,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvD,OAAO,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,gBAAgB,CAAC,EAAU;IAE/C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAa,GAAE,CAAC;IAEnC,4FAA4F;IAC5F,2FAA2F;IAC3F,yDAAyD;IACzD,OAAO,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAyB,CAAC;AAC3E,CAAC;AAED,SAAS,GAAG,CAAC,SAA8B,EAAE,MAAuB;IAElE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC;QAC3B,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1B,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC;QAC3B,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;QAC7B,KAAK,QAAQ;YACX,yFAAyF;YACzF,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,SAAS,mBAAmB,CAAC,MAAuB,EAAE,IAAY;IAEhE,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,IAAA,QAAC,EAAC;YACA,EAAE,EAAE,IAAI,IAAI,iDAAiD;YAC7D,EAAE,EAAE,IAAI,IAAI,uDAAuD;YACnE,EAAE,EAAE,IAAI,IAAI,4DAA4D;YACxE,EAAE,EAAE,IAAI,IAAI,uDAAuD;YACnE,EAAE,EAAE,IAAI,IAAI,yDAAyD;SACtE,CAAC;QACJ,CAAC,CAAC,IAAA,QAAC,EAAC;YACA,EAAE,EAAE,IAAI,IAAI,+CAA+C;YAC3D,EAAE,EAAE,IAAI,IAAI,oDAAoD;YAChE,EAAE,EAAE,IAAI,IAAI,wDAAwD;YACpE,EAAE,EAAE,IAAI,IAAI,qDAAqD;YACjE,EAAE,EAAE,IAAI,IAAI,uDAAuD;SACpE,CAAC,CAAC;AACT,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAuB,EAAE,EAAU;IAE1E,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAa,GAAE,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAE3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qFAAqF;QACrF,MAAM,OAAO,GAAG,MAAM,IAAA,oCAAmB,EAAC,IAAA,qCAAqB,EAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE;YAChG,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;SACnH,CAAC,CAAC;QAEH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;AACH,CAAC;AAOD,8GAA8G;AACvG,KAAK,UAAU,eAAe;IAEnC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAa,GAAE,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAa,CAAC;QAEzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;IAC5G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAA,QAAC,EAAC;gBAC7B,EAAE,EAAE,iBAAiB,MAAM,EAAE;gBAC7B,EAAE,EAAE,sBAAsB,MAAM,EAAE;gBAClC,EAAE,EAAE,6BAA6B,MAAM,EAAE;gBACzC,EAAE,EAAE,2BAA2B,MAAM,EAAE;gBACvC,EAAE,EAAE,2BAA2B,MAAM,EAAE;aACxC,CAAC,EAAE,CAAC;IACP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.contextMenuItems = contextMenuItems;
|
|
4
|
+
const i18n_1 = require("./i18n");
|
|
5
|
+
const links_1 = require("./links");
|
|
6
|
+
const SEPARATOR = { type: 'separator' };
|
|
7
|
+
/** Groepen regels, met een lijn ertussen; lege groepen vallen weg. */
|
|
8
|
+
function joined(groups) {
|
|
9
|
+
return groups.filter((group) => group.length > 0).flatMap((group, index) => (index === 0 ? [...group] : [SEPARATOR, ...group]));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* De regels voor een klik. Leeg betekent: geen menu. Een menu met alleen uitgeschakelde regels
|
|
13
|
+
* op een plek waar niets te doen is, is ruis.
|
|
14
|
+
*/
|
|
15
|
+
function contextMenuItems(click, deps) {
|
|
16
|
+
const flags = click.editFlags;
|
|
17
|
+
const hasSelection = click.selectionText.trim() !== '';
|
|
18
|
+
// In een invoerveld het volledige bewerkmenu; de rollen doen het werk, ook in de terminal.
|
|
19
|
+
const editing = click.isEditable
|
|
20
|
+
? [
|
|
21
|
+
{ role: 'undo', label: (0, i18n_1.t)({ en: 'Undo', nl: 'Ongedaan maken', de: 'Rückgängig', fr: 'Annuler', es: 'Deshacer' }), enabled: flags.canUndo },
|
|
22
|
+
{ role: 'redo', label: (0, i18n_1.t)({ en: 'Redo', nl: 'Opnieuw', de: 'Wiederherstellen', fr: 'Rétablir', es: 'Rehacer' }), enabled: flags.canRedo },
|
|
23
|
+
SEPARATOR,
|
|
24
|
+
{ role: 'cut', label: (0, i18n_1.t)({ en: 'Cut', nl: 'Knippen', de: 'Ausschneiden', fr: 'Couper', es: 'Cortar' }), enabled: flags.canCut },
|
|
25
|
+
{ role: 'copy', label: (0, i18n_1.t)({ en: 'Copy', nl: 'Kopiëren', de: 'Kopieren', fr: 'Copier', es: 'Copiar' }), enabled: flags.canCopy },
|
|
26
|
+
{ role: 'paste', label: (0, i18n_1.t)({ en: 'Paste', nl: 'Plakken', de: 'Einfügen', fr: 'Coller', es: 'Pegar' }), enabled: flags.canPaste },
|
|
27
|
+
SEPARATOR,
|
|
28
|
+
{ role: 'selectAll', label: (0, i18n_1.t)({ en: 'Select all', nl: 'Alles selecteren', de: 'Alles auswählen', fr: 'Tout sélectionner', es: 'Seleccionar todo' }), enabled: flags.canSelectAll },
|
|
29
|
+
]
|
|
30
|
+
: hasSelection
|
|
31
|
+
? [{ role: 'copy', label: (0, i18n_1.t)({ en: 'Copy', nl: 'Kopiëren', de: 'Kopieren', fr: 'Copier', es: 'Copiar' }) }]
|
|
32
|
+
: [];
|
|
33
|
+
// Alleen http(s), net als bij het openen van een link: een file:-adres gaat nergens heen.
|
|
34
|
+
const link = click.linkURL !== '' && (0, links_1.isExternalUrl)(click.linkURL)
|
|
35
|
+
? [
|
|
36
|
+
{ label: (0, i18n_1.t)({
|
|
37
|
+
en: 'Open link in browser',
|
|
38
|
+
nl: 'Link openen in de browser',
|
|
39
|
+
de: 'Link im Browser öffnen',
|
|
40
|
+
fr: 'Ouvrir le lien dans le navigateur',
|
|
41
|
+
es: 'Abrir el enlace en el navegador',
|
|
42
|
+
}), click: () => deps.openExternal(click.linkURL) },
|
|
43
|
+
{ label: (0, i18n_1.t)({ en: 'Copy link', nl: 'Link kopiëren', de: 'Link kopieren', fr: 'Copier le lien', es: 'Copiar el enlace' }), click: () => deps.copyText(click.linkURL) },
|
|
44
|
+
]
|
|
45
|
+
: [];
|
|
46
|
+
const inspect = deps.inspect;
|
|
47
|
+
const developer = inspect === null ? [] : [{ label: (0, i18n_1.t)({
|
|
48
|
+
en: 'Inspect element',
|
|
49
|
+
nl: 'Element inspecteren',
|
|
50
|
+
de: 'Element untersuchen',
|
|
51
|
+
fr: 'Inspecter l’élément',
|
|
52
|
+
es: 'Inspeccionar el elemento',
|
|
53
|
+
}), click: () => inspect(click.x, click.y) }];
|
|
54
|
+
return joined([editing, link, developer]);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=context-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.js","sourceRoot":"","sources":["../electron/context-menu.ts"],"names":[],"mappings":";;AAgDA,4CA8CC;AA7FD,iCAA2B;AAC3B,mCAAwC;AAkCxC,MAAM,SAAS,GAA+B,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAEpE,sEAAsE;AACtE,SAAS,MAAM,CAAC,MAA0D;IAExE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAClI,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,KAAuB,EAAE,IAAqB;IAE7E,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAEvD,2FAA2F;IAC3F,MAAM,OAAO,GAAiC,KAAK,CAAC,UAAU;QAC5D,CAAC,CAAC;YACE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;YACzI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;YACxI,SAAS;YACT,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;YAC9H,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;YAC9H,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;YAC/H,SAAS;YACT,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE;SACnL;QACH,CAAC,CAAC,YAAY;YACZ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC1G,CAAC,CAAC,EAAE,CAAC;IAET,0FAA0F;IAC1F,MAAM,IAAI,GACR,KAAK,CAAC,OAAO,KAAK,EAAE,IAAI,IAAA,qBAAa,EAAC,KAAK,CAAC,OAAO,CAAC;QAClD,CAAC,CAAC;YACE,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC;oBACT,EAAE,EAAE,sBAAsB;oBAC1B,EAAE,EAAE,2BAA2B;oBAC/B,EAAE,EAAE,wBAAwB;oBAC5B,EAAE,EAAE,mCAAmC;oBACvC,EAAE,EAAE,iCAAiC;iBACtC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACnD,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;SACrK;QACH,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,SAAS,GAAiC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAA,QAAC,EAAC;gBAClF,EAAE,EAAE,iBAAiB;gBACrB,EAAE,EAAE,qBAAqB;gBACzB,EAAE,EAAE,qBAAqB;gBACzB,EAAE,EAAE,qBAAqB;gBACzB,EAAE,EAAE,0BAA0B;aAC/B,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DEFAULT_CONTEXT = void 0;
|
|
37
|
+
exports.dockerHome = dockerHome;
|
|
38
|
+
exports.parseContextMeta = parseContextMeta;
|
|
39
|
+
exports.defaultHost = defaultHost;
|
|
40
|
+
exports.currentContextName = currentContextName;
|
|
41
|
+
exports.describeSupport = describeSupport;
|
|
42
|
+
exports.tlsDirFor = tlsDirFor;
|
|
43
|
+
exports.listContexts = listContexts;
|
|
44
|
+
exports.serverHost = serverHost;
|
|
45
|
+
exports.contextId = contextId;
|
|
46
|
+
exports.createContext = createContext;
|
|
47
|
+
exports.removeContext = removeContext;
|
|
48
|
+
const node_crypto_1 = require("node:crypto");
|
|
49
|
+
const node_fs_1 = require("node:fs");
|
|
50
|
+
const node_os_1 = require("node:os");
|
|
51
|
+
const path = __importStar(require("node:path"));
|
|
52
|
+
const i18n_1 = require("./i18n");
|
|
53
|
+
const ssh_1 = require("./ssh");
|
|
54
|
+
/**
|
|
55
|
+
* De context die Docker aanmaakt als er geen andere is. Hij staat niet op schijf: de CLI leidt
|
|
56
|
+
* hem af van DOCKER_HOST of van het platform, en wij moeten dus hetzelfde doen.
|
|
57
|
+
*/
|
|
58
|
+
exports.DEFAULT_CONTEXT = 'default';
|
|
59
|
+
const WINDOWS_PIPE = 'npipe:////./pipe/docker_engine';
|
|
60
|
+
const UNIX_SOCKET = 'unix:///var/run/docker.sock';
|
|
61
|
+
/** Waar Docker zijn configuratie bewaart. `DOCKER_CONFIG` wint, net als bij de CLI. */
|
|
62
|
+
function dockerHome(env = process.env) {
|
|
63
|
+
return env['DOCKER_CONFIG'] ?? path.join((0, node_os_1.homedir)(), '.docker');
|
|
64
|
+
}
|
|
65
|
+
/** Leest één meta.json uit; `null` als het bestand niet de vorm heeft die we verwachten. */
|
|
66
|
+
function parseContextMeta(raw) {
|
|
67
|
+
const meta = raw;
|
|
68
|
+
const name = meta?.Name;
|
|
69
|
+
const host = meta?.Endpoints?.docker?.Host;
|
|
70
|
+
if (typeof name !== 'string' || name === '' || typeof host !== 'string' || host === '') {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const description = meta?.Metadata?.Description;
|
|
74
|
+
return {
|
|
75
|
+
name,
|
|
76
|
+
host,
|
|
77
|
+
description: typeof description === 'string' && description !== '' ? description : null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Waar de app naartoe praat als er geen context gekozen is.
|
|
82
|
+
*
|
|
83
|
+
* `DOCKER_HOST` wint van alles, want dat is ook de afspraak van de CLI. Dat is meteen de reden
|
|
84
|
+
* dat `default` geen vast adres heeft: hij betekent letterlijk "wat de omgeving zegt".
|
|
85
|
+
*/
|
|
86
|
+
function defaultHost(env = process.env, platform = process.platform) {
|
|
87
|
+
const fromEnv = env['DOCKER_HOST'];
|
|
88
|
+
if (fromEnv !== undefined && fromEnv !== '') {
|
|
89
|
+
return fromEnv;
|
|
90
|
+
}
|
|
91
|
+
return platform === 'win32' ? WINDOWS_PIPE : UNIX_SOCKET;
|
|
92
|
+
}
|
|
93
|
+
/** Welke context Docker zelf als huidige heeft staan. `DOCKER_CONTEXT` wint van config.json. */
|
|
94
|
+
function currentContextName(env = process.env, home = dockerHome(env)) {
|
|
95
|
+
const fromEnv = env['DOCKER_CONTEXT'];
|
|
96
|
+
if (fromEnv !== undefined && fromEnv !== '') {
|
|
97
|
+
return fromEnv;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const config = JSON.parse((0, node_fs_1.readFileSync)(path.join(home, 'config.json'), 'utf8'));
|
|
101
|
+
return typeof config.currentContext === 'string' && config.currentContext !== ''
|
|
102
|
+
? config.currentContext
|
|
103
|
+
: exports.DEFAULT_CONTEXT;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return exports.DEFAULT_CONTEXT;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Of we met dit adres overweg kunnen, en zo niet waarom niet. Een adres dat we niet kennen
|
|
111
|
+
* laten we zien met de reden erbij; dat is eerlijker dan hem verzwijgen.
|
|
112
|
+
*/
|
|
113
|
+
function describeSupport(host) {
|
|
114
|
+
if (host.startsWith('ssh://')) {
|
|
115
|
+
try {
|
|
116
|
+
(0, ssh_1.parseSshHost)(host);
|
|
117
|
+
return { supported: true, reason: null };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return { supported: false, reason: err instanceof Error ? err.message : String(err) };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (host.startsWith('npipe://') || host.startsWith('unix://') || host.startsWith('tcp://')) {
|
|
124
|
+
return { supported: true, reason: null };
|
|
125
|
+
}
|
|
126
|
+
return { supported: false, reason: (0, i18n_1.t)({
|
|
127
|
+
en: `Unknown kind of address: ${host}`,
|
|
128
|
+
nl: `Onbekend soort adres: ${host}`,
|
|
129
|
+
de: `Unbekannte Art von Adresse: ${host}`,
|
|
130
|
+
fr: `Type d’adresse inconnu : ${host}`,
|
|
131
|
+
es: `Tipo de dirección desconocido: ${host}`,
|
|
132
|
+
}) };
|
|
133
|
+
}
|
|
134
|
+
/** Waar de TLS-bestanden van een context staan, als hij ze heeft. */
|
|
135
|
+
function tlsDirFor(home, contextId) {
|
|
136
|
+
return path.join(home, 'contexts', 'tls', contextId, 'docker');
|
|
137
|
+
}
|
|
138
|
+
function readStored(home) {
|
|
139
|
+
const metaRoot = path.join(home, 'contexts', 'meta');
|
|
140
|
+
if (!(0, node_fs_1.existsSync)(metaRoot)) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
const found = [];
|
|
144
|
+
for (const id of (0, node_fs_1.readdirSync)(metaRoot)) {
|
|
145
|
+
try {
|
|
146
|
+
const raw = JSON.parse((0, node_fs_1.readFileSync)(path.join(metaRoot, id, 'meta.json'), 'utf8'));
|
|
147
|
+
const parsed = parseContextMeta(raw);
|
|
148
|
+
if (parsed !== null) {
|
|
149
|
+
found.push({ id, ...parsed });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Een map zonder leesbare meta.json slaan we over; de rest van de lijst klopt nog.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return found;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Alle contexts die Docker kent, met `default` er als eerste bij.
|
|
160
|
+
*
|
|
161
|
+
* `active` is welke context de app nu gebruikt, en dat hoeft niet dezelfde te zijn als die van
|
|
162
|
+
* de CLI: in de app schakelen verandert `~/.docker/config.json` bewust niet, want dat zou ook
|
|
163
|
+
* je terminal omzetten.
|
|
164
|
+
*/
|
|
165
|
+
function listContexts(active, env = process.env) {
|
|
166
|
+
const home = dockerHome(env);
|
|
167
|
+
const stored = readStored(home);
|
|
168
|
+
const contexts = [
|
|
169
|
+
{
|
|
170
|
+
name: exports.DEFAULT_CONTEXT,
|
|
171
|
+
description: (0, i18n_1.t)({
|
|
172
|
+
en: 'What DOCKER_HOST or the platform points to',
|
|
173
|
+
nl: 'Wat DOCKER_HOST of het platform aangeeft',
|
|
174
|
+
de: 'Worauf DOCKER_HOST oder die Plattform zeigt',
|
|
175
|
+
fr: 'Ce vers quoi pointe DOCKER_HOST ou la plateforme',
|
|
176
|
+
es: 'Aquello a lo que apunta DOCKER_HOST o la plataforma',
|
|
177
|
+
}),
|
|
178
|
+
host: defaultHost(env),
|
|
179
|
+
...describeSupport(defaultHost(env)),
|
|
180
|
+
active: active === exports.DEFAULT_CONTEXT,
|
|
181
|
+
currentInCli: currentContextName(env, home) === exports.DEFAULT_CONTEXT,
|
|
182
|
+
tlsDir: null,
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
for (const entry of stored.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
186
|
+
const tlsDir = tlsDirFor(home, entry.id);
|
|
187
|
+
contexts.push({
|
|
188
|
+
name: entry.name,
|
|
189
|
+
description: entry.description,
|
|
190
|
+
host: entry.host,
|
|
191
|
+
...describeSupport(entry.host),
|
|
192
|
+
active: active === entry.name,
|
|
193
|
+
currentInCli: currentContextName(env, home) === entry.name,
|
|
194
|
+
tlsDir: (0, node_fs_1.existsSync)(tlsDir) ? tlsDir : null,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return contexts;
|
|
198
|
+
}
|
|
199
|
+
/** Wat de CLI als contextnaam accepteert. */
|
|
200
|
+
const CONTEXT_NAME = /^[a-zA-Z0-9][a-zA-Z0-9_.+-]*$/;
|
|
201
|
+
/** Een hostnaam, een IPv4-adres of een IPv6-adres; geen schema, pad of gebruiker erin. */
|
|
202
|
+
const HOSTNAME = /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*|[0-9a-fA-F:]*:[0-9a-fA-F:.]*)$/;
|
|
203
|
+
const USERNAME = /^[a-zA-Z_][a-zA-Z0-9_.-]*$/;
|
|
204
|
+
/**
|
|
205
|
+
* Het docker-adres voor een server uit het formulier, of een melding wat er niet klopt.
|
|
206
|
+
* Poort 22 laten we weg, zoals je hem zelf ook zou typen.
|
|
207
|
+
*/
|
|
208
|
+
function serverHost(server) {
|
|
209
|
+
const host = server.host.trim();
|
|
210
|
+
if (!HOSTNAME.test(host) || host.length > 253) {
|
|
211
|
+
return { problem: (0, i18n_1.t)({
|
|
212
|
+
en: `'${host}' is not a host name or IP address.`,
|
|
213
|
+
nl: `'${host}' is geen hostnaam of IP-adres.`,
|
|
214
|
+
de: `'${host}' ist kein Hostname und keine IP-Adresse.`,
|
|
215
|
+
fr: `'${host}' n’est ni un nom d’hôte ni une adresse IP.`,
|
|
216
|
+
es: `'${host}' no es un nombre de host ni una dirección IP.`,
|
|
217
|
+
}) };
|
|
218
|
+
}
|
|
219
|
+
if (server.port !== null && (!Number.isInteger(server.port) || server.port < 1 || server.port > 65_535)) {
|
|
220
|
+
return { problem: (0, i18n_1.t)({
|
|
221
|
+
en: 'The port must be between 1 and 65535.',
|
|
222
|
+
nl: 'De poort moet tussen 1 en 65535 liggen.',
|
|
223
|
+
de: 'Der Port muss zwischen 1 und 65535 liegen.',
|
|
224
|
+
fr: 'Le port doit être compris entre 1 et 65535.',
|
|
225
|
+
es: 'El puerto debe estar entre 1 y 65535.',
|
|
226
|
+
}) };
|
|
227
|
+
}
|
|
228
|
+
const address = host.includes(':') ? `[${host}]` : host;
|
|
229
|
+
if (server.kind === 'tcp') {
|
|
230
|
+
return { host: `tcp://${address}:${String(server.port ?? 2375)}` };
|
|
231
|
+
}
|
|
232
|
+
const username = server.username?.trim() ?? '';
|
|
233
|
+
if (username !== '' && !USERNAME.test(username)) {
|
|
234
|
+
return { problem: (0, i18n_1.t)({
|
|
235
|
+
en: `'${username}' is not a valid user name.`,
|
|
236
|
+
nl: `'${username}' is geen geldige gebruikersnaam.`,
|
|
237
|
+
de: `'${username}' ist kein gültiger Benutzername.`,
|
|
238
|
+
fr: `'${username}' n’est pas un nom d’utilisateur valide.`,
|
|
239
|
+
es: `'${username}' no es un nombre de usuario válido.`,
|
|
240
|
+
}) };
|
|
241
|
+
}
|
|
242
|
+
const user = username === '' ? '' : `${username}@`;
|
|
243
|
+
const port = server.port === null || server.port === 22 ? '' : `:${String(server.port)}`;
|
|
244
|
+
return { host: `ssh://${user}${address}${port}` };
|
|
245
|
+
}
|
|
246
|
+
/** De map van een context heet naar de sha256 van zijn naam; zo doet de CLI het ook. */
|
|
247
|
+
function contextId(name) {
|
|
248
|
+
return (0, node_crypto_1.createHash)('sha256').update(name).digest('hex');
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Schrijft een context zoals `docker context create` dat doet, zodat de CLI hem ook kent.
|
|
252
|
+
* Rechtstreeks en niet via de CLI: de app werkt ook zonder `docker` op het pad.
|
|
253
|
+
*/
|
|
254
|
+
function createContext(server, env = process.env) {
|
|
255
|
+
const name = server.name.trim();
|
|
256
|
+
if (!CONTEXT_NAME.test(name) || name.length > 64) {
|
|
257
|
+
return {
|
|
258
|
+
ok: false,
|
|
259
|
+
problem: (0, i18n_1.t)({
|
|
260
|
+
en: 'A name starts with a letter or digit, followed by letters, digits, _ . + or -.',
|
|
261
|
+
nl: 'Een naam begint met een letter of cijfer, gevolgd door letters, cijfers, _ . + of -.',
|
|
262
|
+
de: 'Ein Name beginnt mit einem Buchstaben oder einer Ziffer, gefolgt von Buchstaben, Ziffern, _ . + oder -.',
|
|
263
|
+
fr: 'Un nom commence par une lettre ou un chiffre, suivi de lettres, chiffres, _ . + ou -.',
|
|
264
|
+
es: 'Un nombre empieza por una letra o un dígito, seguido de letras, dígitos, _ . + o -.',
|
|
265
|
+
}),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const home = dockerHome(env);
|
|
269
|
+
if (name === exports.DEFAULT_CONTEXT || readStored(home).some((entry) => entry.name === name)) {
|
|
270
|
+
return { ok: false, problem: (0, i18n_1.t)({
|
|
271
|
+
en: `There already is a context '${name}'.`,
|
|
272
|
+
nl: `Er is al een context '${name}'.`,
|
|
273
|
+
de: `Es gibt bereits einen Context '${name}'.`,
|
|
274
|
+
fr: `Il existe déjà un context '${name}'.`,
|
|
275
|
+
es: `Ya existe un context '${name}'.`,
|
|
276
|
+
}) };
|
|
277
|
+
}
|
|
278
|
+
const address = serverHost(server);
|
|
279
|
+
if ('problem' in address) {
|
|
280
|
+
return { ok: false, problem: address.problem };
|
|
281
|
+
}
|
|
282
|
+
const description = server.description?.trim() ?? '';
|
|
283
|
+
const meta = {
|
|
284
|
+
Name: name,
|
|
285
|
+
Metadata: description === '' ? {} : { Description: description },
|
|
286
|
+
Endpoints: { docker: { Host: address.host, SkipTLSVerify: false } },
|
|
287
|
+
};
|
|
288
|
+
const dir = path.join(home, 'contexts', 'meta', contextId(name));
|
|
289
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
290
|
+
(0, node_fs_1.writeFileSync)(path.join(dir, 'meta.json'), JSON.stringify(meta), 'utf8');
|
|
291
|
+
return { ok: true };
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Haalt een context weg, met zijn certificaten. Niet `default` (die staat niet op schijf), niet
|
|
295
|
+
* de context die de app nu gebruikt, en niet die van de CLI: dan werkt je terminal niet meer.
|
|
296
|
+
*/
|
|
297
|
+
function removeContext(name, active, env = process.env) {
|
|
298
|
+
const home = dockerHome(env);
|
|
299
|
+
if (name === exports.DEFAULT_CONTEXT) {
|
|
300
|
+
return { ok: false, problem: (0, i18n_1.t)({
|
|
301
|
+
en: "The context 'default' cannot be removed.",
|
|
302
|
+
nl: "De context 'default' kan niet weg.",
|
|
303
|
+
de: "Der Context 'default' kann nicht entfernt werden.",
|
|
304
|
+
fr: "Le context 'default' ne peut pas être supprimé.",
|
|
305
|
+
es: "El context 'default' no se puede eliminar.",
|
|
306
|
+
}) };
|
|
307
|
+
}
|
|
308
|
+
if (name === active) {
|
|
309
|
+
return {
|
|
310
|
+
ok: false,
|
|
311
|
+
problem: (0, i18n_1.t)({
|
|
312
|
+
en: `The app is using '${name}'. Switch to another context first.`,
|
|
313
|
+
nl: `De app gebruikt '${name}'. Schakel eerst naar een andere context.`,
|
|
314
|
+
de: `Die App benutzt '${name}'. Wechseln Sie zuerst zu einem anderen Context.`,
|
|
315
|
+
fr: `L’application utilise '${name}'. Basculez d’abord vers un autre context.`,
|
|
316
|
+
es: `La aplicación está usando '${name}'. Cambia antes a otro context.`,
|
|
317
|
+
}),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
if (currentContextName(env, home) === name) {
|
|
321
|
+
return {
|
|
322
|
+
ok: false,
|
|
323
|
+
problem: (0, i18n_1.t)({
|
|
324
|
+
en: `The docker CLI is using '${name}'. Switch there first with 'docker context use'.`,
|
|
325
|
+
nl: `De docker CLI gebruikt '${name}'. Schakel daar eerst om met 'docker context use'.`,
|
|
326
|
+
de: `Die docker-CLI benutzt '${name}'. Wechseln Sie dort zuerst mit 'docker context use'.`,
|
|
327
|
+
fr: `La CLI docker utilise '${name}'. Basculez-y d’abord avec 'docker context use'.`,
|
|
328
|
+
es: `La CLI de docker está usando '${name}'. Cambia allí primero con 'docker context use'.`,
|
|
329
|
+
}),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const entry = readStored(home).find((candidate) => candidate.name === name);
|
|
333
|
+
if (entry === undefined) {
|
|
334
|
+
return { ok: false, problem: (0, i18n_1.t)({
|
|
335
|
+
en: `Context '${name}' does not exist (anymore).`,
|
|
336
|
+
nl: `Context '${name}' bestaat niet (meer).`,
|
|
337
|
+
de: `Context '${name}' existiert nicht (mehr).`,
|
|
338
|
+
fr: `Le context '${name}' n’existe pas (ou plus).`,
|
|
339
|
+
es: `El context '${name}' no existe (ya).`,
|
|
340
|
+
}) };
|
|
341
|
+
}
|
|
342
|
+
(0, node_fs_1.rmSync)(path.join(home, 'contexts', 'meta', entry.id), { recursive: true, force: true });
|
|
343
|
+
(0, node_fs_1.rmSync)(path.join(home, 'contexts', 'tls', entry.id), { recursive: true, force: true });
|
|
344
|
+
return { ok: true };
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=contexts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contexts.js","sourceRoot":"","sources":["../electron/contexts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CrashDetector = void 0;
|
|
4
|
+
exports.describeCrash = describeCrash;
|
|
5
|
+
const i18n_1 = require("./i18n");
|
|
6
|
+
/**
|
|
7
|
+
* Herkent een container die uit zichzelf omviel, in Docker's events-stream.
|
|
8
|
+
*
|
|
9
|
+
* Een `die` met een afsluitcode ongelijk aan nul is niet genoeg: `docker stop` eindigt vaak
|
|
10
|
+
* op 137 of 143, en dat is geen crash. Het verschil zit in wat eraan voorafgaat. Elke gewone
|
|
11
|
+
* stop, uit deze app, uit de CLI of uit `compose down`, stuurt eerst een signaal, en Docker
|
|
12
|
+
* meldt dat als een `kill`-event. Een crash of een OOM heeft dat niet. Zo hoeft de app niet bij
|
|
13
|
+
* te houden wat hij zelf stopte, en telt een stop vanuit de terminal ook als "bewust".
|
|
14
|
+
*/
|
|
15
|
+
/** Na een `kill` telt een `die` als bewust gestopt. Ruim boven de standaard stop-timeout van 10 s. */
|
|
16
|
+
const STOP_GRACE_MS = 30_000;
|
|
17
|
+
/** Een container in een herstartlus valt elke paar seconden om; één melding per minuut is genoeg. */
|
|
18
|
+
const NOTIFY_INTERVAL_MS = 60_000;
|
|
19
|
+
class CrashDetector {
|
|
20
|
+
now;
|
|
21
|
+
stopping = new Map();
|
|
22
|
+
notified = new Map();
|
|
23
|
+
constructor(now = () => Date.now()) {
|
|
24
|
+
this.now = now;
|
|
25
|
+
}
|
|
26
|
+
/** Geeft een melding terug als dit event een crash is, anders `null`. */
|
|
27
|
+
observe(raw) {
|
|
28
|
+
const event = raw;
|
|
29
|
+
if (event?.Type !== 'container') {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const id = typeof event.Actor?.ID === 'string' ? event.Actor.ID : typeof event.id === 'string' ? event.id : null;
|
|
33
|
+
if (id === null) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const now = this.now();
|
|
37
|
+
if (event.Action === 'kill' || event.Action === 'stop') {
|
|
38
|
+
this.stopping.set(id, now);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
if (event.Action === 'destroy') {
|
|
42
|
+
this.stopping.delete(id);
|
|
43
|
+
this.notified.delete(`${id}:crash`);
|
|
44
|
+
this.notified.delete(`${id}:unhealthy`);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const attributes = event.Actor?.Attributes ?? {};
|
|
48
|
+
// Docker meldt dit één keer, bij de overgang, en niet bij elke mislukte check.
|
|
49
|
+
if (event.Action === 'health_status: unhealthy') {
|
|
50
|
+
return this.throttled(id, 'unhealthy', now, () => ({ id, name: nameOf(attributes, id), kind: 'unhealthy', exitCode: null }));
|
|
51
|
+
}
|
|
52
|
+
if (event.Action !== 'die') {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const exitCode = Number(attributes['exitCode']);
|
|
56
|
+
const stoppedAt = this.stopping.get(id);
|
|
57
|
+
this.stopping.delete(id);
|
|
58
|
+
if (!Number.isFinite(exitCode) || exitCode === 0) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
if (stoppedAt !== undefined && now - stoppedAt <= STOP_GRACE_MS) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return this.throttled(id, 'crash', now, () => ({ id, name: nameOf(attributes, id), kind: 'crash', exitCode }));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Hooguit één melding per minuut per container en per soort. Een crash en daarna een
|
|
68
|
+
* unhealthy van dezelfde container zijn twee verschillende berichten.
|
|
69
|
+
*/
|
|
70
|
+
throttled(id, kind, now, make) {
|
|
71
|
+
const key = `${id}:${kind}`;
|
|
72
|
+
const last = this.notified.get(key);
|
|
73
|
+
if (last !== undefined && now - last < NOTIFY_INTERVAL_MS) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
this.notified.set(key, now);
|
|
77
|
+
return make();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.CrashDetector = CrashDetector;
|
|
81
|
+
function nameOf(attributes, id) {
|
|
82
|
+
const name = attributes['name'];
|
|
83
|
+
return typeof name === 'string' && name !== '' ? name : id.slice(0, 12);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* De tekst van de melding. 137 is bijna altijd de OOM-killer als niemand hem stopte, en dat
|
|
87
|
+
* zegt meer dan het getal.
|
|
88
|
+
*/
|
|
89
|
+
function describeCrash(notice) {
|
|
90
|
+
if (notice.kind === 'unhealthy') {
|
|
91
|
+
return {
|
|
92
|
+
title: `${notice.name} is unhealthy`,
|
|
93
|
+
body: (0, i18n_1.t)({
|
|
94
|
+
en: `${notice.name} is still running, but its healthcheck is failing. Click to open the logs.`,
|
|
95
|
+
nl: `${notice.name} draait nog, maar zijn healthcheck faalt. Klik om de logs te openen.`,
|
|
96
|
+
de: `${notice.name} läuft noch, aber der Healthcheck schlägt fehl. Klicken Sie, um die Logs zu öffnen.`,
|
|
97
|
+
fr: `${notice.name} tourne encore, mais son healthcheck échoue. Cliquez pour ouvrir les logs.`,
|
|
98
|
+
es: `${notice.name} sigue en marcha, pero su healthcheck está fallando. Haz clic para abrir los logs.`,
|
|
99
|
+
}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const code = notice.exitCode ?? 0;
|
|
103
|
+
const reason = code === 137
|
|
104
|
+
? (0, i18n_1.t)({
|
|
105
|
+
en: 'exited with code 137, probably out of memory',
|
|
106
|
+
nl: 'afgebroken met code 137, waarschijnlijk geheugen op',
|
|
107
|
+
de: 'mit Code 137 beendet, wahrscheinlich zu wenig Speicher',
|
|
108
|
+
fr: 'terminé avec le code 137, probablement à court de mémoire',
|
|
109
|
+
es: 'terminó con el código 137, probablemente por falta de memoria',
|
|
110
|
+
})
|
|
111
|
+
: (0, i18n_1.t)({
|
|
112
|
+
en: `exited with code ${String(code)}`,
|
|
113
|
+
nl: `afgebroken met code ${String(code)}`,
|
|
114
|
+
de: `mit Code ${String(code)} beendet`,
|
|
115
|
+
fr: `terminé avec le code ${String(code)}`,
|
|
116
|
+
es: `terminó con el código ${String(code)}`,
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
title: (0, i18n_1.t)({ en: `${notice.name} has stopped`, nl: `${notice.name} is gestopt`, de: `${notice.name} ist gestoppt`, fr: `${notice.name} s’est arrêté`, es: `${notice.name} se ha detenido` }),
|
|
120
|
+
body: (0, i18n_1.t)({
|
|
121
|
+
en: `${notice.name} ${reason}. Click to open the logs.`,
|
|
122
|
+
nl: `${notice.name} is ${reason}. Klik om de logs te openen.`,
|
|
123
|
+
de: `${notice.name} ${reason}. Klicken Sie, um die Logs zu öffnen.`,
|
|
124
|
+
fr: `${notice.name} ${reason}. Cliquez pour ouvrir les logs.`,
|
|
125
|
+
es: `${notice.name} ${reason}. Haz clic para abrir los logs.`,
|
|
126
|
+
}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=crash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash.js","sourceRoot":"","sources":["../electron/crash.ts"],"names":[],"mappings":"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"}
|