@abtnode/core 1.15.17 → 1.16.0-beta-b16cb035
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/lib/api/node.js +67 -69
- package/lib/api/team.js +386 -55
- package/lib/blocklet/downloader/blocklet-downloader.js +226 -0
- package/lib/blocklet/downloader/bundle-downloader.js +272 -0
- package/lib/blocklet/downloader/constants.js +3 -0
- package/lib/blocklet/downloader/resolve-download.js +199 -0
- package/lib/blocklet/extras.js +83 -26
- package/lib/blocklet/hooks.js +18 -65
- package/lib/blocklet/manager/base.js +10 -16
- package/lib/blocklet/manager/disk.js +1679 -1566
- package/lib/blocklet/manager/helper/install-application-from-backup.js +177 -0
- package/lib/blocklet/manager/helper/install-application-from-dev.js +94 -0
- package/lib/blocklet/manager/helper/install-application-from-general.js +188 -0
- package/lib/blocklet/manager/helper/install-component-from-dev.js +84 -0
- package/lib/blocklet/manager/helper/install-component-from-upload.js +181 -0
- package/lib/blocklet/manager/helper/install-component-from-url.js +173 -0
- package/lib/blocklet/manager/helper/migrate-application-to-struct-v2.js +450 -0
- package/lib/blocklet/manager/helper/rollback-cache.js +41 -0
- package/lib/blocklet/manager/helper/upgrade-components.js +152 -0
- package/lib/blocklet/migration.js +30 -52
- package/lib/blocklet/storage/backup/audit-log.js +27 -0
- package/lib/blocklet/storage/backup/base.js +62 -0
- package/lib/blocklet/storage/backup/blocklet-extras.js +92 -0
- package/lib/blocklet/storage/backup/blocklet.js +70 -0
- package/lib/blocklet/storage/backup/blocklets.js +74 -0
- package/lib/blocklet/storage/backup/data.js +19 -0
- package/lib/blocklet/storage/backup/logs.js +24 -0
- package/lib/blocklet/storage/backup/routing-rule.js +19 -0
- package/lib/blocklet/storage/backup/spaces.js +240 -0
- package/lib/blocklet/storage/restore/base.js +67 -0
- package/lib/blocklet/storage/restore/blocklet-extras.js +86 -0
- package/lib/blocklet/storage/restore/blocklet.js +56 -0
- package/lib/blocklet/storage/restore/blocklets.js +43 -0
- package/lib/blocklet/storage/restore/logs.js +21 -0
- package/lib/blocklet/storage/restore/spaces.js +156 -0
- package/lib/blocklet/storage/utils/hash.js +51 -0
- package/lib/blocklet/storage/utils/zip.js +43 -0
- package/lib/cert.js +206 -0
- package/lib/event.js +237 -64
- package/lib/index.js +191 -83
- package/lib/migrations/1.0.21-update-config.js +1 -1
- package/lib/migrations/1.0.22-max-memory.js +1 -1
- package/lib/migrations/1.0.25.js +1 -1
- package/lib/migrations/1.0.32-update-config.js +1 -1
- package/lib/migrations/1.0.33-blocklets.js +1 -1
- package/lib/migrations/1.5.20-registry.js +15 -0
- package/lib/migrations/1.6.17-blocklet-children.js +48 -0
- package/lib/migrations/1.6.21-rename-ip-echo-domain.js +35 -0
- package/lib/migrations/1.6.4-security.js +59 -0
- package/lib/migrations/1.6.5-security.js +60 -0
- package/lib/migrations/1.6.9-update-node-info-and-certificate.js +38 -0
- package/lib/migrations/1.7.1-blocklet-setup.js +18 -0
- package/lib/migrations/1.7.12-blocklet-meta.js +51 -0
- package/lib/migrations/1.7.15-blocklet-bundle-source.js +42 -0
- package/lib/migrations/1.7.20-blocklet-component.js +41 -0
- package/lib/migrations/1.8.33-blocklet-mem-limit.js +20 -0
- package/lib/migrations/README.md +1 -1
- package/lib/migrations/index.js +6 -2
- package/lib/monitor/blocklet-runtime-monitor.js +200 -0
- package/lib/monitor/get-history-list.js +37 -0
- package/lib/monitor/node-runtime-monitor.js +228 -0
- package/lib/router/helper.js +572 -497
- package/lib/router/index.js +85 -21
- package/lib/router/manager.js +146 -187
- package/lib/states/README.md +36 -1
- package/lib/states/access-key.js +39 -17
- package/lib/states/audit-log.js +462 -0
- package/lib/states/base.js +4 -213
- package/lib/states/blocklet-extras.js +194 -138
- package/lib/states/blocklet.js +361 -104
- package/lib/states/cache.js +8 -6
- package/lib/states/challenge.js +5 -5
- package/lib/states/index.js +19 -36
- package/lib/states/migration.js +4 -4
- package/lib/states/node.js +135 -46
- package/lib/states/notification.js +22 -35
- package/lib/states/session.js +17 -9
- package/lib/states/site.js +50 -25
- package/lib/states/user.js +74 -20
- package/lib/states/webhook.js +10 -6
- package/lib/team/manager.js +124 -7
- package/lib/util/blocklet.js +1223 -246
- package/lib/util/chain.js +1 -1
- package/lib/util/default-node-config.js +5 -23
- package/lib/util/disk-monitor.js +13 -10
- package/lib/util/domain-status.js +84 -15
- package/lib/util/get-accessible-external-node-ip.js +2 -2
- package/lib/util/get-domain-for-blocklet.js +13 -0
- package/lib/util/get-meta-from-url.js +33 -0
- package/lib/util/index.js +207 -272
- package/lib/util/ip.js +6 -0
- package/lib/util/maintain.js +233 -0
- package/lib/util/public-to-store.js +85 -0
- package/lib/util/ready.js +1 -1
- package/lib/util/requirement.js +28 -9
- package/lib/util/reset-node.js +22 -7
- package/lib/util/router.js +13 -0
- package/lib/util/rpc.js +16 -0
- package/lib/util/store.js +179 -0
- package/lib/util/sysinfo.js +44 -0
- package/lib/util/ua.js +54 -0
- package/lib/validators/blocklet-extra.js +24 -0
- package/lib/validators/node.js +25 -12
- package/lib/validators/permission.js +16 -1
- package/lib/validators/role.js +17 -3
- package/lib/validators/router.js +40 -20
- package/lib/validators/trusted-passport.js +1 -0
- package/lib/validators/util.js +22 -5
- package/lib/webhook/index.js +45 -35
- package/lib/webhook/sender/index.js +5 -0
- package/lib/webhook/sender/slack/index.js +1 -1
- package/lib/webhook/sender/wallet/index.js +48 -0
- package/package.json +54 -36
- package/lib/blocklet/registry.js +0 -205
- package/lib/states/https-cert.js +0 -67
- package/lib/util/get-ip-dns-domain-for-blocklet.js +0 -19
- package/lib/util/service.js +0 -66
- package/lib/util/upgrade.js +0 -178
- /package/lib/{queue.js → util/queue.js} +0 -0
package/lib/util/chain.js
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
const {
|
|
2
|
-
NODE_REGISTER_URL,
|
|
3
|
-
BLOCKLET_STORE_URL,
|
|
4
|
-
BLOCKLET_STORE_URL_DEV,
|
|
5
|
-
WEB_WALLET_URL,
|
|
6
|
-
NODE_PACKAGE_NAME,
|
|
7
|
-
NODE_COMMAND_NAME,
|
|
8
|
-
} = require('@abtnode/constant');
|
|
1
|
+
const { NODE_REGISTER_URL, BLOCKLET_STORE, BLOCKLET_STORE_DEV } = require('@abtnode/constant');
|
|
9
2
|
const canPackageReadWrite = require('@abtnode/util/lib/can-pkg-rw');
|
|
10
3
|
|
|
11
4
|
const getDefaultAutoUpgrade = () => {
|
|
12
5
|
try {
|
|
13
|
-
return canPackageReadWrite(
|
|
6
|
+
return canPackageReadWrite(process.env.ABT_NODE_BINARY_NAME, process.env.ABT_NODE_PACKAGE_NAME);
|
|
14
7
|
} catch (err) {
|
|
15
8
|
return false;
|
|
16
9
|
}
|
|
@@ -23,27 +16,16 @@ const defaultNodeConfigs = {
|
|
|
23
16
|
blockletRegistryList: {
|
|
24
17
|
getDefaultValue: () => [
|
|
25
18
|
{
|
|
26
|
-
|
|
27
|
-
description: 'ArcBlock official blocklet registry',
|
|
28
|
-
url: BLOCKLET_STORE_URL,
|
|
29
|
-
logoUrl: '/logo.png',
|
|
30
|
-
maintainer: 'arcblock',
|
|
31
|
-
selected: true,
|
|
19
|
+
...BLOCKLET_STORE,
|
|
32
20
|
protected: true,
|
|
33
21
|
},
|
|
34
22
|
{
|
|
35
|
-
|
|
36
|
-
description: 'ArcBlock dev registry that contains demo and example blocklets',
|
|
37
|
-
url: BLOCKLET_STORE_URL_DEV,
|
|
38
|
-
maintainer: 'arcblock',
|
|
39
|
-
logoUrl: '/logo.png',
|
|
40
|
-
selected: false,
|
|
23
|
+
...BLOCKLET_STORE_DEV,
|
|
41
24
|
protected: false,
|
|
42
25
|
},
|
|
43
26
|
],
|
|
44
27
|
},
|
|
45
|
-
registerUrl: { getDefaultValue: () => NODE_REGISTER_URL },
|
|
46
|
-
webWalletUrl: { getDefaultValue: () => WEB_WALLET_URL },
|
|
28
|
+
registerUrl: { getDefaultValue: () => NODE_REGISTER_URL },
|
|
47
29
|
};
|
|
48
30
|
|
|
49
31
|
const lib = {
|
package/lib/util/disk-monitor.js
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
const systeminformation = require('@abtnode/util/lib/sys-info');
|
|
2
1
|
const logger = require('@abtnode/logger')('@abtnode/disk-monitor');
|
|
2
|
+
const info = require('./sysinfo');
|
|
3
3
|
|
|
4
4
|
const states = require('../states');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* @param {number} threshold Threshold for disk alarms, percentage
|
|
7
|
+
* @param {number} threshold Threshold for disk alerts, percentage
|
|
9
8
|
*/
|
|
10
9
|
const check = async (threshold) => {
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
const { disks } = await info.getSysInfo();
|
|
11
|
+
for (const disk of disks) {
|
|
12
|
+
const usageRatio = (disk.used / disk.total) * 100;
|
|
13
|
+
const usageRatioPercent = `${usageRatio.toFixed(2)}%`;
|
|
14
|
+
logger.info('check disk usage', { usage: usageRatioPercent, threshold });
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
if (usageRatio < threshold) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// eslint-disable-next-line no-await-in-loop
|
|
17
21
|
await states.notification.create({
|
|
18
22
|
title: 'Disk Usage Alert',
|
|
19
|
-
description: `More than ${
|
|
23
|
+
description: `More than ${usageRatioPercent} space has been used for disk ${disk.device}, the blocklet server may not function properly.`,
|
|
20
24
|
entityType: 'node',
|
|
21
25
|
severity: 'warning',
|
|
22
26
|
sticky: true,
|
|
@@ -30,7 +34,6 @@ const getCron = () => ({
|
|
|
30
34
|
fn: async () => {
|
|
31
35
|
const nodeInfo = await states.node.read();
|
|
32
36
|
const threshold = nodeInfo.diskAlertThreshold;
|
|
33
|
-
|
|
34
37
|
await check(threshold);
|
|
35
38
|
},
|
|
36
39
|
options: { runOnInit: true },
|
|
@@ -1,44 +1,113 @@
|
|
|
1
|
+
const https = require('https');
|
|
1
2
|
const { EventEmitter } = require('events');
|
|
2
3
|
const logger = require('@abtnode/logger')('@abtnode/domain-status');
|
|
4
|
+
const { EVENTS, WELLKNOWN_PING_PREFIX } = require('@abtnode/constant');
|
|
5
|
+
const { BlockletEvents } = require('@blocklet/constant');
|
|
3
6
|
const { checkDomainDNS } = require('./index');
|
|
4
7
|
|
|
5
8
|
const dnsStatusStore = Object.create(null);
|
|
6
9
|
|
|
7
|
-
const
|
|
8
|
-
// 正在执行,并且离上次的执行时间小于 2 分钟则不请求
|
|
9
|
-
if (dnsStatusStore[domain] && Date.now() - dnsStatusStore[domain] < 2 * 60 * 1000) {
|
|
10
|
-
return {};
|
|
11
|
-
}
|
|
12
|
-
|
|
10
|
+
const doCheckDomainDnsWrapper = async (domain) => {
|
|
13
11
|
try {
|
|
14
|
-
dnsStatusStore[domain] = Date.now();
|
|
15
12
|
const status = await checkDomainDNS(domain);
|
|
16
13
|
return status;
|
|
17
14
|
} catch (error) {
|
|
18
15
|
logger.error('check domain dns error', { domain, error });
|
|
19
16
|
throw error;
|
|
20
17
|
} finally {
|
|
21
|
-
delete dnsStatusStore[domain];
|
|
22
18
|
logger.debug('removed dns flag', { domain });
|
|
23
19
|
}
|
|
24
20
|
};
|
|
25
21
|
|
|
22
|
+
const checkDomainDnsWrapper = (domain) => {
|
|
23
|
+
// 正在执行或已成功,并且离上次的执行时间小于 2 分钟则不请求
|
|
24
|
+
if (dnsStatusStore[domain] && Date.now() - dnsStatusStore[domain].startAt < 2 * 60 * 1000) {
|
|
25
|
+
return dnsStatusStore[domain].promise;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const promise = doCheckDomainDnsWrapper(domain);
|
|
29
|
+
dnsStatusStore[domain] = {
|
|
30
|
+
promise,
|
|
31
|
+
startAt: Date.now(),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
promise.catch(() => {
|
|
35
|
+
delete dnsStatusStore[domain];
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
return promise;
|
|
39
|
+
};
|
|
40
|
+
|
|
26
41
|
class DomainStatus extends EventEmitter {
|
|
27
|
-
constructor(routerManager) {
|
|
42
|
+
constructor({ routerManager, states }) {
|
|
28
43
|
super();
|
|
29
44
|
|
|
30
45
|
this.routerManager = routerManager;
|
|
46
|
+
this.states = states;
|
|
31
47
|
}
|
|
32
48
|
|
|
33
|
-
|
|
49
|
+
async getHttpsCert(domain) {
|
|
50
|
+
const matchedCert = await this.routerManager.getMatchedCert(domain);
|
|
51
|
+
|
|
52
|
+
if (matchedCert) {
|
|
53
|
+
return matchedCert;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
const req = https.request(
|
|
58
|
+
{
|
|
59
|
+
host: domain,
|
|
60
|
+
path: WELLKNOWN_PING_PREFIX,
|
|
61
|
+
method: 'GET',
|
|
62
|
+
timeout: 1000 * 10,
|
|
63
|
+
},
|
|
64
|
+
(res) => {
|
|
65
|
+
try {
|
|
66
|
+
const data = res.socket.getPeerCertificate();
|
|
67
|
+
const cert = {
|
|
68
|
+
issuer: {
|
|
69
|
+
countryName: data.issuer.C,
|
|
70
|
+
organizationName: data.issuer.O,
|
|
71
|
+
commonName: data.issuer.CN,
|
|
72
|
+
},
|
|
73
|
+
validFrom: data.valid_from,
|
|
74
|
+
validTo: data.valid_to,
|
|
75
|
+
};
|
|
76
|
+
resolve(cert);
|
|
77
|
+
} catch {
|
|
78
|
+
resolve(null);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
req.on('error', () => {
|
|
84
|
+
resolve(null);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
req.end();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async checkDomainsStatus({ domains, did } = {}) {
|
|
92
|
+
if (did) {
|
|
93
|
+
// eslint-disable-next-line no-param-reassign
|
|
94
|
+
domains = await this.states.site.getBlockletDomains(did);
|
|
95
|
+
}
|
|
96
|
+
|
|
34
97
|
(domains || []).forEach((domain) => {
|
|
35
|
-
Promise.all([this.
|
|
36
|
-
.then((
|
|
37
|
-
const
|
|
38
|
-
|
|
98
|
+
Promise.all([this.getHttpsCert(domain), checkDomainDnsWrapper(domain)])
|
|
99
|
+
.then(([matchedCert, dns]) => {
|
|
100
|
+
const eventData = { domain, matchedCert, isHttps: !!matchedCert, dns };
|
|
101
|
+
|
|
102
|
+
if (did) {
|
|
103
|
+
eventData.meta = { did };
|
|
104
|
+
this.emit(BlockletEvents.domainStatus, eventData);
|
|
105
|
+
} else {
|
|
106
|
+
this.emit(EVENTS.DOMAIN_STATUS, eventData);
|
|
107
|
+
}
|
|
39
108
|
})
|
|
40
109
|
.catch((error) => {
|
|
41
|
-
logger.error('check domain status error', { domain, error });
|
|
110
|
+
logger.error('check domain status error', { domain, error, did });
|
|
42
111
|
});
|
|
43
112
|
});
|
|
44
113
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const joinUrl = require('url-join');
|
|
2
2
|
const axios = require('@abtnode/util/lib/axios');
|
|
3
|
-
const {
|
|
3
|
+
const { DEFAULT_IP_DOMAIN, DEFAULT_ADMIN_PATH } = require('@abtnode/constant');
|
|
4
4
|
const { get: getIp } = require('./ip');
|
|
5
5
|
|
|
6
|
-
const getNodeDomain = (ip) => (ip ?
|
|
6
|
+
const getNodeDomain = (ip) => (ip ? DEFAULT_IP_DOMAIN.replace(/^\*/, ip.replace(/\./g, '-')) : '');
|
|
7
7
|
|
|
8
8
|
let cache = null;
|
|
9
9
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const { DEFAULT_IP_DOMAIN_SUFFIX, SLOT_FOR_IP_DNS_SITE } = require('@abtnode/constant');
|
|
2
|
+
const { encode: encodeBase32 } = require('@abtnode/util/lib/base32');
|
|
3
|
+
const formatName = require('@abtnode/util/lib/format-name');
|
|
4
|
+
|
|
5
|
+
const getIpDnsDomainForBlocklet = (blocklet) => {
|
|
6
|
+
return `${encodeBase32(blocklet.meta.did)}-${SLOT_FOR_IP_DNS_SITE}.${DEFAULT_IP_DOMAIN_SUFFIX}`;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const getDidDomainForBlocklet = ({ appPid, didDomain }) => {
|
|
10
|
+
return `${encodeBase32(appPid)}.${didDomain}`;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet, formatName };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const { isFreeBlocklet } = require('@blocklet/meta/lib/util');
|
|
2
|
+
|
|
3
|
+
const logger = require('@abtnode/logger')('getMetaFromUrl');
|
|
4
|
+
|
|
5
|
+
const { getBlockletMetaFromUrl } = require('./blocklet');
|
|
6
|
+
const { getStoreMeta, parseSourceUrl } = require('./store');
|
|
7
|
+
const { getFactoryState } = require('./chain');
|
|
8
|
+
|
|
9
|
+
const getMetaFromUrl = async ({ url, checkPrice = false }) => {
|
|
10
|
+
const meta = await getBlockletMetaFromUrl(url);
|
|
11
|
+
let isFree = isFreeBlocklet(meta);
|
|
12
|
+
|
|
13
|
+
if (checkPrice && !isFree && meta.nftFactory) {
|
|
14
|
+
try {
|
|
15
|
+
const registryMeta = await getStoreMeta(new URL(url).origin);
|
|
16
|
+
|
|
17
|
+
if (registryMeta.chainHost) {
|
|
18
|
+
const state = await getFactoryState(registryMeta.chainHost, meta.nftFactory);
|
|
19
|
+
if (state) {
|
|
20
|
+
isFree = false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
} catch (error) {
|
|
24
|
+
logger.warn('failed when checking if the blocklet is free', { did: meta.did, error });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const { inStore, registryUrl } = await parseSourceUrl(url);
|
|
29
|
+
|
|
30
|
+
return { meta, isFree, inStore, registryUrl };
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
module.exports = getMetaFromUrl;
|