Skip to content

Commit d0ecb20

Browse files
authored
Merge pull request #297 from dappnode/v0.2.22
v0.2.22 Release
2 parents 7b2dae2 + 4faab82 commit d0ecb20

37 files changed

+803
-247
lines changed

build/Dockerfile

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,6 @@ WORKDIR /usr/src/app
8484
COPY --from=build-deps /usr/bin/nsupdate /usr/bin/nsupdate
8585
COPY --from=build-deps /usr/bin/docker /usr/bin/docker
8686

87-
COPY build/entrypoint.sh .
88-
COPY build/dns_updater.sh /etc/periodic/1min/dns_updater
89-
RUN crontab -l | { cat; echo "* * * * * run-parts /etc/periodic/1min"; } | crontab -
90-
9187
# Copy the src last as it's the layer most likely to change
9288
COPY --from=build-deps /usr/src/app /usr/src/app
9389
COPY --from=build-src /usr/src/app/dist /usr/src/app/src
@@ -98,4 +94,4 @@ COPY build/update_local_dyndns.sh /usr/local/bin/update_local_dyndns
9894
ENV COMPOSE_HTTP_TIMEOUT=300 DOCKER_CLIENT_TIMEOUT=300 DOCKER_HOST=unix:///var/run/docker.sock
9995
RUN echo "127.0.0.1 localunixsocket"
10096

101-
ENTRYPOINT /usr/src/app/entrypoint.sh
97+
CMD [ "node", "src/index" ]

build/dns_updater.sh

Lines changed: 0 additions & 37 deletions
This file was deleted.

build/entrypoint.sh

Lines changed: 0 additions & 3 deletions
This file was deleted.

build/src/src/calls/fetchDirectory.ts

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
import * as eventBus from "../eventBus";
12
import { ReturnData } from "../route-types/fetchDirectory";
23
import getDirectory from "../modules/release/getDirectory";
34
import getRelease from "../modules/release/getRelease";
45
import isSyncing from "../utils/isSyncing";
56
import { RpcHandlerReturnWithResult, DirectoryItem } from "../types";
67
import Logs from "../logs";
78
import { listContainers } from "../modules/docker/listContainers";
8-
import { notUndefined } from "../utils/typingHelpers";
99
import { getIsInstalled, getIsUpdated } from "./fetchDnpRequest";
1010
import { fileToGatewayUrl } from "../utils/distributedFile";
11+
import { throttle } from "lodash";
1112
const logs = Logs(module);
1213

14+
const loadThrottle = 500; // 0.5 seconds
15+
1316
/**
1417
* Fetches all package names in the custom dappnode directory.
1518
*/
@@ -24,34 +27,54 @@ export default async function fetchDirectory(): RpcHandlerReturnWithResult<
2427
};
2528
}
2629

30+
// Prevent sending way to many updates in case the fetching process is fast
31+
const emitDirectoryUpdate = throttle(eventBus.directory.emit, loadThrottle);
32+
2733
const dnpList = await listContainers();
2834

29-
// const directoryItemsUnordered: DirectoryItem[] = [];
35+
// Returns already sorted by: feat#0, feat#1, dnp#0, dnp#1, dnp#2
36+
const directory = await getDirectory();
37+
const directoryDnps: DirectoryItem[] = directory.map(
38+
({ name, isFeatured }) => ({
39+
status: "loading",
40+
name,
41+
whitelisted: true,
42+
isFeatured
43+
})
44+
);
45+
emitDirectoryUpdate(directoryDnps);
3046

31-
const directoryDnps = (await Promise.all(
32-
// Returns already sorted by: feat#0, feat#1, dnp#0, dnp#1, dnp#2
33-
(await getDirectory()).map(async ({ name, isFeatured }) => {
47+
await Promise.all(
48+
directory.map(async ({ name, isFeatured }, idx) => {
49+
const whitelisted = true;
50+
const directoryItemBasic = { name, whitelisted, isFeatured };
3451
try {
3552
// Now resolve the last version of the package
3653
const release = await getRelease(name);
3754
const { metadata, avatarFile } = release;
3855

39-
return {
40-
name,
56+
directoryDnps[idx] = {
57+
...directoryItemBasic,
58+
status: "ok",
4159
description: getShortDescription(metadata),
4260
avatarUrl: fileToGatewayUrl(avatarFile), // Must be URL to a resource in a DAPPMANAGER API
4361
isInstalled: getIsInstalled(release, dnpList),
4462
isUpdated: getIsUpdated(release, dnpList),
45-
whitelisted: true,
46-
isFeatured,
4763
featuredStyle: metadata.style,
4864
categories: metadata.categories || getFallBackCategories(name) || []
49-
} as DirectoryItem;
65+
};
5066
} catch (e) {
5167
logs.error(`Error fetching ${name} release: ${e.message}`);
68+
directoryDnps[idx] = {
69+
...directoryItemBasic,
70+
status: "error",
71+
message: e.message
72+
};
73+
} finally {
74+
emitDirectoryUpdate(directoryDnps);
5275
}
5376
})
54-
)).filter(notUndefined);
77+
);
5578

5679
return {
5780
message: `Listed directory of ${directoryDnps.length} DNPs`,

build/src/src/calls/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import naclEncryptionGetPublicKey from "./naclEncryptionGetPublicKey";
2929
import notificationsGet from "./notificationsGet";
3030
import notificationsRemove from "./notificationsRemove";
3131
import notificationsTest from "./notificationsTest";
32+
import packageGettingStartedToggle from "./packageGettingStartedToggle";
3233
import passwordChange from "./passwordChange";
3334
import passwordIsSecure from "./passwordIsSecure";
3435
import poweroffHost from "./poweroffHost";
@@ -71,6 +72,7 @@ export {
7172
notificationsGet,
7273
notificationsRemove,
7374
notificationsTest,
75+
packageGettingStartedToggle,
7476
passwordChange,
7577
passwordIsSecure,
7678
poweroffHost,

build/src/src/calls/installPackage.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import fs from "fs";
22
import path from "path";
33
import * as eventBus from "../eventBus";
4+
import * as db from "../db";
45
// Modules
56
import dappGet from "../modules/dappGet";
67
import getImage, { verifyDockerImage } from "../modules/release/getImage";
@@ -283,6 +284,7 @@ export default async function installPackage({
283284
logUi({ id, name, message: "Writing files..." });
284285

285286
writeManifest(manifestPath, metadata);
287+
db.addPackageInstalledMetadata(name);
286288
}
287289

288290
/**
@@ -306,7 +308,9 @@ export default async function installPackage({
306308

307309
// Emit packages update
308310
eventBus.requestPackages.emit();
309-
eventBus.packageModified.emit({ id });
311+
eventBus.packagesModified.emit({
312+
ids: packagesData.map(({ name }) => name)
313+
});
310314

311315
// Flag packages as no longer installing
312316
flagPackagesAreNotInstalling(state);

build/src/src/calls/listPackages.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
import { ReturnData } from "../route-types/listPackages";
12
import * as eventBus from "../eventBus";
3+
import * as db from "../db";
24
// Modules
35
import { listContainers } from "../modules/docker/listContainers";
46
import { dockerDf } from "../modules/docker/dockerApi";
57
// Utils
8+
import { omit } from "lodash";
69
import parseDockerSystemDf from "../utils/parseDockerSystemDf";
710
import Logs from "../logs";
8-
import { PackageContainer, RpcHandlerReturnWithResult } from "../types";
11+
import { RpcHandlerReturnWithResult } from "../types";
912
import { readConfigFiles } from "../utils/configFiles";
1013
const logs = Logs(module);
1114

@@ -14,8 +17,6 @@ const logs = Logs(module);
1417
// Prevent running it twice
1518
let isDockerSystemDfCallRunning = false;
1619

17-
type ReturnData = PackageContainer[];
18-
1920
/**
2021
* Returns the list of current containers associated to packages
2122
*/
@@ -28,8 +29,12 @@ export default async function listPackages(): RpcHandlerReturnWithResult<
2829
dnpList.map(dnp => {
2930
try {
3031
const { manifest, environment } = readConfigFiles(dnp);
31-
dnp.manifest = manifest;
32+
dnp.manifest = omit(manifest, ["gettingStarted"]);
3233
dnp.envs = environment;
34+
dnp.gettingStarted = manifest.gettingStarted;
35+
dnp.gettingStartedShow = Boolean(
36+
db.packageGettingStartedShow.get(dnp.name)
37+
);
3338
} catch (e) {
3439
logs.warn(`Error appending ${dnp.name} files: ${e.stack || e.message}`);
3540
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { RequestData } from "../route-types/packageGettingStartedToggle";
2+
import * as db from "../db";
3+
import * as eventBus from "../eventBus";
4+
import { RpcHandlerReturn } from "../types";
5+
6+
/**
7+
* Toggles the visibility of a getting started block
8+
* @param show Should be shown on hidden
9+
*/
10+
export default async function packageGettingStartedToggle({
11+
id,
12+
show
13+
}: RequestData): RpcHandlerReturn {
14+
if (!id) throw Error("kwarg id must be defined");
15+
16+
db.packageGettingStartedShow.set(id, show);
17+
18+
// Emit packages update
19+
eventBus.requestPackages.emit();
20+
21+
return {
22+
message: `Toggled getting started visibility of ${id}`
23+
};
24+
}

build/src/src/calls/removePackage.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as eventBus from "../eventBus";
33
// Modules
44
import { dockerComposeDown, dockerRm } from "../modules/docker/dockerCommands";
55
// External call
6-
import restartPackageVolumes from "./restartPackageVolumes";
6+
import { restartPackageVolumesTask } from "./restartPackageVolumes";
77
// Utils
88
import * as getPath from "../utils/getPath";
99
import shell from "../utils/shell";
@@ -39,14 +39,21 @@ export default async function removePackage({
3939
const composePath = getPath.dockerCompose(name, false);
4040
const packageRepoDir = getPath.packageRepoDir(id, false);
4141

42+
// Necessary for eventBus dependants to know the exact list of deleted DNPs
43+
let removedIds: string[] = [id];
44+
4245
/**
4346
* [NOTE] Not necessary to close the ports since they will just
4447
* not be renewed in the next interval
4548
*/
4649

4750
// Call restartPackageVolumes to safely delete dependant volumes
4851
if (deleteVolumes) {
49-
await restartPackageVolumes({ id, doNotRestart: true });
52+
const { removedDnps } = await restartPackageVolumesTask({
53+
id,
54+
doNotRestart: true
55+
});
56+
removedIds = removedDnps; // restartPackageVolumes may remove additional DNPs
5057
} else {
5158
/**
5259
* If there is no docker-compose, do a docker rm directly
@@ -71,7 +78,7 @@ export default async function removePackage({
7178

7279
// Emit packages update
7380
eventBus.requestPackages.emit();
74-
eventBus.packageModified.emit({ id, removed: true });
81+
eventBus.packagesModified.emit({ ids: removedIds, removed: true });
7582

7683
return {
7784
message: `Removed package: ${id}`,

build/src/src/calls/restartPackage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export default async function restartPackage({
3232

3333
// Emit packages update
3434
eventBus.requestPackages.emit();
35+
eventBus.packagesModified.emit({ ids: [id] });
3536
}
3637

3738
return {

0 commit comments

Comments
 (0)