mirror of
https://github.com/EvernodeXRPL/sashimono.git
synced 2026-07-28 01:20:37 +00:00
Redesign installation process (#299)
This commit is contained in:
committed by
GitHub
parent
c1d1a986fd
commit
c38ce5d31f
Submodule evernode-bootstrap-contract updated: e40c3ae705...1e0e816abb
@@ -4,6 +4,10 @@ const evernode = require("evernode-js-client");
|
||||
const process = require("process");
|
||||
const fs = require("fs");
|
||||
const ip6addr = require('ip6addr');
|
||||
const keypairs = require('ripple-keypairs');
|
||||
const http = require('http');
|
||||
const crypto = require('crypto');
|
||||
const { appenv } = require("../../mb-xrpl/lib/appenv");
|
||||
|
||||
function checkParams(args, count) {
|
||||
for (let i = 0; i < count; i++) {
|
||||
@@ -18,11 +22,16 @@ const funcs = {
|
||||
'validate-server': async (args) => {
|
||||
checkParams(args, 1);
|
||||
const rippledUrl = args[0];
|
||||
const xrplApi = new evernode.XrplApi(rippledUrl, { autoReconnect: false });
|
||||
await evernode.Defaults.useNetwork(appenv.NETWORK);
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledUrl
|
||||
});
|
||||
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
|
||||
await xrplApi.connect();
|
||||
await xrplApi.disconnect();
|
||||
return { success: true };
|
||||
},
|
||||
|
||||
'validate-account': async (args) => {
|
||||
checkParams(args, 3);
|
||||
const rippledUrl = args[0];
|
||||
@@ -30,15 +39,22 @@ const funcs = {
|
||||
const accountAddress = args[2];
|
||||
const validateFor = args[3] || "register";
|
||||
|
||||
const xrplApi = new evernode.XrplApi(rippledUrl, { autoReconnect: false });
|
||||
await evernode.Defaults.useNetwork(appenv.NETWORK);
|
||||
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress
|
||||
});
|
||||
|
||||
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
|
||||
await xrplApi.connect();
|
||||
|
||||
const hostClient = new evernode.HostClient(accountAddress, null, {
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress,
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
|
||||
const hostClient = new evernode.HostClient(accountAddress, null);
|
||||
|
||||
if (!await hostClient.xrplAcc.exists())
|
||||
return { success: false, result: "Account not found." };
|
||||
|
||||
@@ -71,15 +87,26 @@ const funcs = {
|
||||
await xrplApi.disconnect();
|
||||
return { success: true };
|
||||
},
|
||||
|
||||
'validate-keys': async (args) => {
|
||||
checkParams(args, 3);
|
||||
const rippledUrl = args[0];
|
||||
const accountAddress = args[1];
|
||||
const accountSecret = args[2];
|
||||
|
||||
const xrplApi = new evernode.XrplApi(rippledUrl, { autoReconnect: false });
|
||||
await evernode.Defaults.useNetwork(appenv.NETWORK);
|
||||
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledUrl
|
||||
});
|
||||
|
||||
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
|
||||
await xrplApi.connect();
|
||||
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
|
||||
const xrplAcc = new evernode.XrplAccount(accountAddress, accountSecret, {
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
@@ -91,31 +118,33 @@ const funcs = {
|
||||
},
|
||||
|
||||
'access-evernode-cfg': async (args) => {
|
||||
checkParams(args, 4);
|
||||
checkParams(args, 3);
|
||||
const rippledUrl = args[0];
|
||||
const governorAddress = args[1];
|
||||
const accountAddress = args[2];
|
||||
const configName = args[3];
|
||||
const configName = args[2];
|
||||
|
||||
const xrplApi = new evernode.XrplApi(rippledUrl, { autoReconnect: false });
|
||||
await evernode.Defaults.useNetwork(appenv.NETWORK);
|
||||
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress
|
||||
});
|
||||
|
||||
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
|
||||
await xrplApi.connect();
|
||||
|
||||
const hostClient = new evernode.HostClient(accountAddress, null, {
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress,
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
|
||||
if (!await hostClient.xrplAcc.exists())
|
||||
return { success: false, result: "Account not found." };
|
||||
const governorClient = await evernode.HookClientFactory.create(evernode.HookTypes.governor);
|
||||
await governorClient.connect();
|
||||
const config = await governorClient.config;
|
||||
|
||||
await hostClient.connect();
|
||||
const config = hostClient.config;
|
||||
|
||||
await hostClient.disconnect();
|
||||
await governorClient.disconnect();
|
||||
await xrplApi.disconnect();
|
||||
|
||||
return { success: true, result: config[configName] };
|
||||
return { success: true, result: typeof config[configName] === 'object' ? JSON.stringify(config[configName]) : `${config[configName]}` };
|
||||
},
|
||||
|
||||
'transfer': async (args) => {
|
||||
@@ -126,15 +155,22 @@ const funcs = {
|
||||
const accountSecret = args[3];
|
||||
const transfereeAddress = args[4];
|
||||
|
||||
const xrplApi = new evernode.XrplApi(rippledUrl, { autoReconnect: false });
|
||||
await evernode.Defaults.useNetwork(appenv.NETWORK);
|
||||
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress
|
||||
});
|
||||
|
||||
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
|
||||
await xrplApi.connect();
|
||||
|
||||
const hostClient = new evernode.HostClient(accountAddress, accountSecret, {
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress,
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
|
||||
const hostClient = new evernode.HostClient(accountAddress, accountSecret);
|
||||
|
||||
if (!await hostClient.xrplAcc.exists())
|
||||
return { success: false, result: "Account not found." };
|
||||
|
||||
@@ -203,6 +239,223 @@ const funcs = {
|
||||
}
|
||||
|
||||
return { success: false };
|
||||
},
|
||||
|
||||
'check-balance': async (args) => {
|
||||
checkParams(args, 5);
|
||||
const rippledUrl = args[0];
|
||||
const governorAddress = args[1];
|
||||
const accountAddress = args[2];
|
||||
const tokenType = args[3];
|
||||
const expectedBalance = args[4];
|
||||
|
||||
const WAIT_PERIOD = 120; // seconds
|
||||
|
||||
await evernode.Defaults.useNetwork(appenv.NETWORK);
|
||||
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress
|
||||
});
|
||||
|
||||
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
|
||||
await xrplApi.connect();
|
||||
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
|
||||
const hostClient = new evernode.HostClient(accountAddress, null);
|
||||
const terminateConnections = async () => {
|
||||
await hostClient.disconnect();
|
||||
await xrplApi.disconnect();
|
||||
}
|
||||
|
||||
let attempts = 0;
|
||||
let balance = 0;
|
||||
while (attempts >= 0) {
|
||||
try {
|
||||
// In order to handle the account not found issue via catch block.
|
||||
await hostClient.connect();
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
if (tokenType === 'NATIVE')
|
||||
balance = Number((await hostClient.xrplAcc.getInfo()).Balance) / 1000000;
|
||||
else
|
||||
balance = Number(await hostClient.getEVRBalance());
|
||||
|
||||
if (balance < expectedBalance) {
|
||||
if (++attempts <= WAIT_PERIOD)
|
||||
continue;
|
||||
|
||||
await terminateConnections();
|
||||
return { success: false, result: "Funds not received within timeout." };
|
||||
}
|
||||
|
||||
break;
|
||||
} catch (err) {
|
||||
if (err.data?.error === 'actNotFound' && ++attempts <= WAIT_PERIOD) {
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
continue;
|
||||
}
|
||||
await terminateConnections();
|
||||
return { success: false, result: (err.data?.error === 'actNotFound') ? "Funds not received within timeout." : "Error occurred in account balance check." };
|
||||
}
|
||||
}
|
||||
|
||||
await terminateConnections();
|
||||
return { success: true, result: `${balance}` };
|
||||
},
|
||||
|
||||
'generate-account': async (args) => {
|
||||
let seed = null;
|
||||
if (args[0])
|
||||
seed = args[0];
|
||||
else
|
||||
seed = keypairs.generateSeed({ algorithm: "ecdsa-secp256k1" });
|
||||
|
||||
const keypair = keypairs.deriveKeypair(seed);
|
||||
const createdKeypair = {
|
||||
address: keypairs.deriveAddress(keypair.publicKey),
|
||||
secret: seed
|
||||
}
|
||||
return { success: true, result: typeof createdKeypair === 'object' ? JSON.stringify(createdKeypair) : `${createdKeypair}` };
|
||||
},
|
||||
|
||||
'prepare-host': async (args) => {
|
||||
checkParams(args, 4);
|
||||
const rippledUrl = args[0];
|
||||
const governorAddress = args[1];
|
||||
const accountAddress = args[2];
|
||||
const accountSecret = args[3];
|
||||
// Optional
|
||||
const domain = args[4] ? args[4] : "";
|
||||
|
||||
const WAIT_PERIOD = 120; // seconds
|
||||
|
||||
await evernode.Defaults.useNetwork(appenv.NETWORK);
|
||||
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledUrl,
|
||||
governorAddress: governorAddress
|
||||
});
|
||||
|
||||
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
|
||||
await xrplApi.connect();
|
||||
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
|
||||
const hostClient = new evernode.HostClient(accountAddress, accountSecret);
|
||||
await hostClient.connect();
|
||||
|
||||
const terminateConnections = async () => {
|
||||
await hostClient.disconnect();
|
||||
await xrplApi.disconnect();
|
||||
}
|
||||
|
||||
{
|
||||
let attempts = 0;
|
||||
while (attempts >= 0) {
|
||||
try {
|
||||
await hostClient.prepareAccount(domain);
|
||||
break;
|
||||
}
|
||||
catch (err) {
|
||||
if (err.data?.error === 'actNotFound' && ++attempts <= WAIT_PERIOD) {
|
||||
// Wait and retry.
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
continue;
|
||||
}
|
||||
|
||||
await terminateConnections();
|
||||
return { success: false, result: "Error occurred in account preparation." };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await terminateConnections();
|
||||
return { success: true };
|
||||
|
||||
},
|
||||
|
||||
// Starts an HTTP server on port 80 and check whether that's reachable via
|
||||
// the provided domain.
|
||||
'validate-domain': async (args) => {
|
||||
checkParams(args, 2);
|
||||
const domain = args[0];
|
||||
const port = parseInt(args[1]);
|
||||
const urlPath = "/" + crypto.randomBytes(16).toString('hex');
|
||||
const responseString = crypto.randomBytes(16).toString('hex');
|
||||
|
||||
const server = http.createServer((req, res) => {
|
||||
if (req.url === urlPath) {
|
||||
res.writeHead(200, { "Content-Type": "text/plain" });
|
||||
res.end(responseString + '\n');
|
||||
} else {
|
||||
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
||||
res.end('Not Found\n');
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
await new Promise((resolve, reject) => {
|
||||
server.on('error', function (e) {
|
||||
// We assume this is an error when starting to listen.
|
||||
reject("listen_error");
|
||||
});
|
||||
|
||||
server.listen(port, () => {
|
||||
// Server started. Now send a request via public domain.
|
||||
|
||||
const reqOptions = {
|
||||
hostname: domain,
|
||||
port: port,
|
||||
path: urlPath,
|
||||
method: "GET"
|
||||
};
|
||||
|
||||
const req = http.request(reqOptions, (res) => {
|
||||
let data = "";
|
||||
|
||||
res.on("data", (chunk) => {
|
||||
data += chunk;
|
||||
});
|
||||
|
||||
// request completion event.
|
||||
res.on("end", () => {
|
||||
server.close();
|
||||
if (data.startsWith(responseString)) {
|
||||
resolve();
|
||||
} else {
|
||||
// Return string does not match our responseString. Most probably response was
|
||||
// sent by some other server. Not by us.
|
||||
reject("domain_error")
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
req.on("error", (e) => {
|
||||
server.close();
|
||||
reject("domain_error")
|
||||
});
|
||||
|
||||
req.setTimeout(3000, () => { // 3 second request timeout
|
||||
req.destroy();
|
||||
server.close();
|
||||
reject("domain_error");
|
||||
});
|
||||
|
||||
req.end();
|
||||
});
|
||||
});
|
||||
|
||||
return { success: true, result: "ok" };
|
||||
|
||||
} catch (errorCode) {
|
||||
return { success: false, result: errorCode };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
258
installer/jshelper/package-lock.json
generated
258
installer/jshelper/package-lock.json
generated
@@ -6,8 +6,9 @@
|
||||
"": {
|
||||
"name": "evernode-setup-helper",
|
||||
"dependencies": {
|
||||
"evernode-js-client": "0.6.20",
|
||||
"ip6addr": "0.2.5"
|
||||
"evernode-js-client": "0.6.21",
|
||||
"ip6addr": "0.2.5",
|
||||
"ripple-keypairs": "1.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@noble/hashes": {
|
||||
@@ -363,9 +364,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/evernode-js-client": {
|
||||
"version": "0.6.20",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.20.tgz",
|
||||
"integrity": "sha512-OC6VNAhwqnNvUc0NhffxwNI9bTDH+BkD/KBTC5Xuwoiq8BhRfYhmfHBnD6M9K5AvLqv+Jxdufc3l1AlzHgILWg==",
|
||||
"version": "0.6.21",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
|
||||
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
|
||||
"dependencies": {
|
||||
"elliptic": "6.5.4",
|
||||
"libsodium-wrappers": "0.7.10",
|
||||
@@ -376,6 +377,27 @@
|
||||
"xrpl-binary-codec": "1.4.2"
|
||||
}
|
||||
},
|
||||
"node_modules/evernode-js-client/node_modules/bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"node_modules/evernode-js-client/node_modules/ripple-keypairs": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.0.tgz",
|
||||
"integrity": "sha512-Zlmbtn2YUpW4uKlLm2/tpkY5RC/EXQlkJwIIKp0AoF9D23pJ43/EuipNW2F6qURdbkUezDwB0bMV7uRXip3x2w==",
|
||||
"dependencies": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ext": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
|
||||
@@ -818,19 +840,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ripple-keypairs": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.0.tgz",
|
||||
"integrity": "sha512-Zlmbtn2YUpW4uKlLm2/tpkY5RC/EXQlkJwIIKp0AoF9D23pJ43/EuipNW2F6qURdbkUezDwB0bMV7uRXip3x2w==",
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.1.tgz",
|
||||
"integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==",
|
||||
"dependencies": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.2.0"
|
||||
"ripple-address-codec": "^4.3.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10",
|
||||
"npm": ">=7.0.0"
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/ripple-keypairs/node_modules/bn.js": {
|
||||
@@ -838,6 +859,18 @@
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"node_modules/ripple-keypairs/node_modules/ripple-address-codec": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.1.tgz",
|
||||
"integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==",
|
||||
"dependencies": {
|
||||
"base-x": "^3.0.9",
|
||||
"create-hash": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/ripple-secret-codec": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ripple-secret-codec/-/ripple-secret-codec-1.0.3.tgz",
|
||||
@@ -1119,21 +1152,6 @@
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl-accountlib/node_modules/ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"dependencies": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl-binary-codec": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/xrpl-binary-codec/-/xrpl-binary-codec-1.4.2.tgz",
|
||||
@@ -1190,38 +1208,6 @@
|
||||
"ripple-keypairs": "^1.1.5"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl-secret-numbers/node_modules/bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"node_modules/xrpl-secret-numbers/node_modules/ripple-address-codec": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.0.tgz",
|
||||
"integrity": "sha512-Tvd81i7hpDmNqHvkj6iYlj8Tv3I1Romw5gfjni9eacewJvGV2xe+p2y0FAw39z72qfciRMhQyHvpnviBcWVBNw==",
|
||||
"dependencies": {
|
||||
"base-x": "^3.0.9",
|
||||
"create-hash": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl-secret-numbers/node_modules/ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"dependencies": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl-sign-keypairs": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/xrpl-sign-keypairs/-/xrpl-sign-keypairs-2.2.0.tgz",
|
||||
@@ -1233,11 +1219,6 @@
|
||||
"ripple-keypairs": "^1.1.4"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl-sign-keypairs/node_modules/bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"node_modules/xrpl-sign-keypairs/node_modules/ripple-address-codec": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.0.tgz",
|
||||
@@ -1267,26 +1248,6 @@
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl-sign-keypairs/node_modules/ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"dependencies": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl/node_modules/bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"node_modules/xrpl/node_modules/ripple-address-codec": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.0.tgz",
|
||||
@@ -1299,21 +1260,6 @@
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/xrpl/node_modules/ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"dependencies": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/yaeti": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
|
||||
@@ -1597,9 +1543,9 @@
|
||||
}
|
||||
},
|
||||
"evernode-js-client": {
|
||||
"version": "0.6.20",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.20.tgz",
|
||||
"integrity": "sha512-OC6VNAhwqnNvUc0NhffxwNI9bTDH+BkD/KBTC5Xuwoiq8BhRfYhmfHBnD6M9K5AvLqv+Jxdufc3l1AlzHgILWg==",
|
||||
"version": "0.6.21",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
|
||||
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
|
||||
"requires": {
|
||||
"elliptic": "6.5.4",
|
||||
"libsodium-wrappers": "0.7.10",
|
||||
@@ -1608,6 +1554,25 @@
|
||||
"xrpl": "2.2.1",
|
||||
"xrpl-accountlib": "2.2.0",
|
||||
"xrpl-binary-codec": "1.4.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"ripple-keypairs": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.0.tgz",
|
||||
"integrity": "sha512-Zlmbtn2YUpW4uKlLm2/tpkY5RC/EXQlkJwIIKp0AoF9D23pJ43/EuipNW2F6qURdbkUezDwB0bMV7uRXip3x2w==",
|
||||
"requires": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ext": {
|
||||
@@ -1943,21 +1908,30 @@
|
||||
}
|
||||
},
|
||||
"ripple-keypairs": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.0.tgz",
|
||||
"integrity": "sha512-Zlmbtn2YUpW4uKlLm2/tpkY5RC/EXQlkJwIIKp0AoF9D23pJ43/EuipNW2F6qURdbkUezDwB0bMV7uRXip3x2w==",
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.1.tgz",
|
||||
"integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==",
|
||||
"requires": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.2.0"
|
||||
"ripple-address-codec": "^4.3.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"ripple-address-codec": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.1.tgz",
|
||||
"integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==",
|
||||
"requires": {
|
||||
"base-x": "^3.0.9",
|
||||
"create-hash": "^1.1.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2134,11 +2108,6 @@
|
||||
"ws": "^8.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"ripple-address-codec": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.0.tgz",
|
||||
@@ -2147,18 +2116,6 @@
|
||||
"base-x": "^3.0.9",
|
||||
"create-hash": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"requires": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2209,18 +2166,6 @@
|
||||
"decimal.js": "^10.2.0",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
}
|
||||
},
|
||||
"ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"requires": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2274,34 +2219,6 @@
|
||||
"@types/brorand": "^1.0.30",
|
||||
"brorand": "^1.1.0",
|
||||
"ripple-keypairs": "^1.1.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"ripple-address-codec": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.0.tgz",
|
||||
"integrity": "sha512-Tvd81i7hpDmNqHvkj6iYlj8Tv3I1Romw5gfjni9eacewJvGV2xe+p2y0FAw39z72qfciRMhQyHvpnviBcWVBNw==",
|
||||
"requires": {
|
||||
"base-x": "^3.0.9",
|
||||
"create-hash": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"requires": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xrpl-sign-keypairs": {
|
||||
@@ -2315,11 +2232,6 @@
|
||||
"ripple-keypairs": "^1.1.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
|
||||
"integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
|
||||
},
|
||||
"ripple-address-codec": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.0.tgz",
|
||||
@@ -2341,18 +2253,6 @@
|
||||
"decimal.js": "^10.2.0",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
}
|
||||
},
|
||||
"ripple-keypairs": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz",
|
||||
"integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==",
|
||||
"requires": {
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"build": "ncc build index.js --minify -o dist"
|
||||
},
|
||||
"dependencies": {
|
||||
"evernode-js-client": "0.6.20",
|
||||
"ip6addr": "0.2.5"
|
||||
"evernode-js-client": "0.6.21",
|
||||
"ip6addr": "0.2.5",
|
||||
"ripple-keypairs": "1.3.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ stage "Installing dependencies"
|
||||
# To fix - Repository 'https://apprepo.vultr.com/ubuntu universal InRelease' changed its 'Codename' value from 'buster' to 'universal'
|
||||
apt-get update --allow-releaseinfo-change
|
||||
apt-get install -y uidmap fuse3 cgroup-tools quota curl openssl jq
|
||||
|
||||
# uidmap # Required for rootless docker.
|
||||
# slirp4netns # Required for high performance rootless networking.
|
||||
# fuse3 # Required for hpfs.
|
||||
@@ -40,8 +41,13 @@ apt-get install -y uidmap fuse3 cgroup-tools quota curl openssl jq
|
||||
# Install nodejs if not exists.
|
||||
if ! command -v node &>/dev/null; then
|
||||
stage "Installing nodejs"
|
||||
apt-get -y install ca-certificates # In case nodejs package certitficates are renewed.
|
||||
curl -sL https://deb.nodesource.com/setup_16.x | bash -
|
||||
apt-get install -y ca-certificates curl gnupg
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
|
||||
|
||||
NODE_MAJOR=16
|
||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
|
||||
apt-get update
|
||||
apt-get -y install nodejs
|
||||
else
|
||||
version=$(node -v | cut -d '.' -f1)
|
||||
|
||||
@@ -16,7 +16,7 @@ diskKB=${9}
|
||||
lease_amount=${10}
|
||||
rippled_server=${11}
|
||||
xrpl_account_address=${12}
|
||||
xrpl_account_secret=${13}
|
||||
xrpl_account_secret_path=${13}
|
||||
email_address=${14}
|
||||
tls_key_file=${15}
|
||||
tls_cert_file=${16}
|
||||
@@ -28,16 +28,49 @@ ipv6_net_interface=${20}
|
||||
script_dir=$(dirname "$(realpath "$0")")
|
||||
desired_slirp4netns_version="1.2.1"
|
||||
setup_helper_dir="/tmp/evernode-setup-helpers"
|
||||
secret_backup_location="/root/.evernode/.host-account-secret.key"
|
||||
previous_secret_path_note=/root/.evernode/previous_secret_path.txt
|
||||
default_key_filepath="/home/$MB_XRPL_USER/.evernode-host/.host-account-secret.key"
|
||||
|
||||
secret_stored_path="-"
|
||||
|
||||
function stage() {
|
||||
echo "STAGE $1" # This is picked up by the setup console output filter.
|
||||
}
|
||||
|
||||
function confirm() {
|
||||
echo -en $1" [Y/n] "
|
||||
local yn=""
|
||||
read yn </dev/tty
|
||||
|
||||
# Default choice is 'y'
|
||||
[ -z $yn ] && yn="y"
|
||||
while ! [[ $yn =~ ^[Yy|Nn]$ ]]; do
|
||||
read -ep "'y' or 'n' expected: " yn </dev/tty
|
||||
done
|
||||
|
||||
echo "" # Insert new line after answering.
|
||||
[[ $yn =~ ^[Yy]$ ]] && return 0 || return 1 # 0 means success.
|
||||
}
|
||||
|
||||
function rollback() {
|
||||
[ "$UPGRADE" == "1" ] && echo "Evernode update failed. You can try again later. If the problem persists, please uninstall and re-install Evernode." && exit 1
|
||||
|
||||
# Backup secret in order to mitigate loss of secret.
|
||||
# NOTE: When removing MB_XRPL_USER the home directory also get removed. Hence, if the user has selected default path the secret file also will be removed.
|
||||
# By Backing up secret in a known location, we can restore that in the next installation attempt rather than creating new account.
|
||||
[ "$OPERATION" == "register" ] && echo "Backing up account secret in $secret_backup_location ." && mkdir -p $(dirname $secret_backup_location) && cp -p --no-preserve=ownership $xrpl_account_secret_path $secret_backup_location
|
||||
|
||||
echo "Rolling back sashimono installation."
|
||||
"$script_dir"/sashimono-uninstall.sh -f
|
||||
echo "Rolled back the installation."
|
||||
|
||||
# Revert ownership of provided secret file to ROOT user (as MB_XRPL_USER is not there anymore).
|
||||
[ "$OPERATION" == "re-register" ] && chown root:root $xrpl_account_secret_path
|
||||
|
||||
# Remove secret from original path as this was backed up.
|
||||
[ "$OPERATION" == "register" ] && [ -e $xrpl_account_secret_path ] && rm -f $xrpl_account_secret_path
|
||||
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -56,48 +89,6 @@ function set_cpu_info() {
|
||||
[ -z $cpu_mhz ] && cpu_mhz=$(lscpu | grep -i "^CPU MHz:" | sed 's/CPU MHz://g' | sed 's/\.[0-9]*//g' | xargs)
|
||||
}
|
||||
|
||||
function enable_evernode_auto_updater() {
|
||||
# Create the service.
|
||||
echo "[Unit]
|
||||
Description=Service for the Evernode auto-update.
|
||||
After=network.target
|
||||
[Service]
|
||||
User=root
|
||||
Group=root
|
||||
Type=oneshot
|
||||
ExecStart=/usr/bin/evernode update -q
|
||||
[Install]
|
||||
WantedBy=multi-user.target" >/etc/systemd/system/$EVERNODE_AUTO_UPDATE_SERVICE.service
|
||||
|
||||
# Create a timer for the service (every two hours).
|
||||
echo "[Unit]
|
||||
Description=Timer for the Evernode auto-update.
|
||||
# Allow manual starts
|
||||
RefuseManualStart=no
|
||||
# Allow manual stops
|
||||
RefuseManualStop=no
|
||||
[Timer]
|
||||
Unit=$EVERNODE_AUTO_UPDATE_SERVICE.service
|
||||
OnCalendar=0/12:00:00
|
||||
# Execute job if it missed a run due to machine being off
|
||||
Persistent=true
|
||||
# To prevent rush time, adding 2 hours delay
|
||||
RandomizedDelaySec=7200
|
||||
[Install]
|
||||
WantedBy=timers.target" >/etc/systemd/system/$EVERNODE_AUTO_UPDATE_SERVICE.timer
|
||||
|
||||
# Reload the systemd daemon.
|
||||
systemctl daemon-reload
|
||||
|
||||
echo "Enabling Evernode auto update service..."
|
||||
systemctl enable $EVERNODE_AUTO_UPDATE_SERVICE.service
|
||||
|
||||
echo "Enabling Evernode auto update timer..."
|
||||
systemctl enable $EVERNODE_AUTO_UPDATE_SERVICE.timer
|
||||
echo "Starting Evernode auto update timer..."
|
||||
systemctl start $EVERNODE_AUTO_UPDATE_SERVICE.timer
|
||||
}
|
||||
|
||||
function setup_certbot() {
|
||||
stage "Setting up letsencrypt certbot"
|
||||
|
||||
@@ -231,13 +222,13 @@ rm -r "$tmp"
|
||||
openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout $SASHIMONO_DATA/contract_template/cfg/tlskey.pem \
|
||||
-out $SASHIMONO_DATA/contract_template/cfg/tlscert.pem -subj "/C=HP/CN=$(jq -r '.hp.host_address' $SASHIMONO_DATA/sa.cfg)"
|
||||
|
||||
# Setup tls certs used for contract instance websockets.
|
||||
[ "$UPGRADE" == "0" ] && setup_tls_certs
|
||||
|
||||
# Install Sashimono agent binaries into sashimono bin dir.
|
||||
cp "$script_dir"/{sagent,hpfs,user-cgcreate.sh,user-install.sh,user-uninstall.sh,docker-registry-uninstall.sh} $SASHIMONO_BIN
|
||||
chmod -R +x $SASHIMONO_BIN
|
||||
|
||||
# Setup tls certs used for contract instance websockets.
|
||||
[ "$UPGRADE" == "0" ] && setup_tls_certs
|
||||
|
||||
# Copy the temporary setup-helper directory content to SASHIMONO_BIN directory.
|
||||
cp -Rdp $setup_helper_dir $SASHIMONO_BIN/evernode-setup-helpers
|
||||
|
||||
@@ -279,14 +270,37 @@ if [ "$NO_MB" == "" ]; then
|
||||
|
||||
cp -r "$script_dir"/mb-xrpl $SASHIMONO_BIN
|
||||
|
||||
# Creating message board user (if not exists).
|
||||
# Create MB_XRPL_USER if does not exists.
|
||||
if ! grep -q "^$MB_XRPL_USER:" /etc/passwd; then
|
||||
useradd --shell /usr/sbin/nologin -m $MB_XRPL_USER
|
||||
fi
|
||||
|
||||
# Assign message board user priviledges.
|
||||
if ! id -nG "$MB_XRPL_USER" | grep -qw "$SASHIADMIN_GROUP"; then
|
||||
usermod --lock $MB_XRPL_USER
|
||||
usermod -a -G $SASHIADMIN_GROUP $MB_XRPL_USER
|
||||
loginctl enable-linger $MB_XRPL_USER # Enable lingering to support service installation.
|
||||
fi
|
||||
|
||||
if [ "$UPGRADE" != "0" ]; then
|
||||
# Restore keyfile.
|
||||
if [ -f $secret_backup_location ]; then
|
||||
echo "Restoring secret file via $secret_backup_location."
|
||||
secret_stored_path=$(cat $previous_secret_path_note)
|
||||
|
||||
if [ "$secret_stored_path" == "$default_key_filepath" ]; then
|
||||
key_directory=$(dirname "$secret_stored_path")
|
||||
if [ ! -d "$key_directory" ]; then
|
||||
mkdir -p "$key_directory"
|
||||
fi
|
||||
fi
|
||||
|
||||
[ -d $(dirname "$secret_stored_path") ] && mv $secret_backup_location $secret_stored_path && \
|
||||
chown $MB_XRPL_USER: $secret_stored_path && \
|
||||
chmod 600 $secret_stored_path && rm -f $previous_secret_path_note
|
||||
fi
|
||||
fi
|
||||
|
||||
# First create the folder from root and then transfer ownership to the user
|
||||
# since the folder is created in /etc/sashimono directory.
|
||||
! mkdir -p $MB_XRPL_DATA && echo "Could not create '$MB_XRPL_DATA'. Make sure you are running as sudo." && exit 1
|
||||
@@ -304,7 +318,7 @@ if [ "$NO_MB" == "" ]; then
|
||||
# ! sudo -u $MB_XRPL_USER MB_DATA_DIR=$MB_XRPL_DATA node $MB_XRPL_BIN betagen $EVERNODE_GOVERNOR_ADDRESS $inetaddr $lease_amount $rippled_server $xrpl_account_secret && echo "XRPLACC_FAILURE" && rollback
|
||||
# doreg=1
|
||||
|
||||
! sudo -u $MB_XRPL_USER MB_DATA_DIR=$MB_XRPL_DATA node $MB_XRPL_BIN new $xrpl_account_address $xrpl_account_secret $EVERNODE_GOVERNOR_ADDRESS $inetaddr $lease_amount $rippled_server $ipv6_subnet $ipv6_net_interface && echo "XRPLACC_FAILURE" && rollback
|
||||
! sudo -u $MB_XRPL_USER MB_DATA_DIR=$MB_XRPL_DATA node $MB_XRPL_BIN new $xrpl_account_address $xrpl_account_secret_path $EVERNODE_GOVERNOR_ADDRESS $inetaddr $lease_amount $rippled_server $ipv6_subnet $ipv6_net_interface && echo "XRPLACC_FAILURE" && rollback
|
||||
doreg=1
|
||||
fi
|
||||
|
||||
@@ -452,11 +466,6 @@ if [ ! -f /run/reboot-required.pkgs ] || [ ! -n "$(grep sashimono /run/reboot-re
|
||||
fi
|
||||
fi
|
||||
|
||||
stage "Configuring auto updater service"
|
||||
|
||||
# Enable the Evernode Auto Updater Service.
|
||||
enable_evernode_auto_updater
|
||||
|
||||
echo "Sashimono installed successfully."
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
# Sashimono agent uninstall script.
|
||||
# This must be executed with root privileges.
|
||||
|
||||
export TRANSFER=${TRANSFER:-0}
|
||||
|
||||
[ "$UPGRADE" == "0" ] && echo "---Sashimono uninstaller---" || echo "---Sashimono uninstaller (for upgrade)---"
|
||||
|
||||
force=$1
|
||||
secret_backup_location="/root/.evernode/.host-account-secret.key"
|
||||
previous_secret_path_note=/root/.evernode/previous_secret_path.txt
|
||||
|
||||
function confirm() {
|
||||
echo -en $1" [Y/n] "
|
||||
@@ -30,24 +34,6 @@ function cgrulesengd_servicename() {
|
||||
fi
|
||||
}
|
||||
|
||||
function remove_evernode_auto_updater() {
|
||||
|
||||
echo "Removing Evernode auto update timer..."
|
||||
systemctl stop $EVERNODE_AUTO_UPDATE_SERVICE.timer
|
||||
systemctl disable $EVERNODE_AUTO_UPDATE_SERVICE.timer
|
||||
service_path="/etc/systemd/system/$EVERNODE_AUTO_UPDATE_SERVICE.timer"
|
||||
rm $service_path
|
||||
|
||||
echo "Removing Evernode auto update service..."
|
||||
systemctl stop $EVERNODE_AUTO_UPDATE_SERVICE.service
|
||||
systemctl disable $EVERNODE_AUTO_UPDATE_SERVICE.service
|
||||
service_path="/etc/systemd/system/$EVERNODE_AUTO_UPDATE_SERVICE.service"
|
||||
rm $service_path
|
||||
|
||||
# Reload the systemd daemon.
|
||||
systemctl daemon-reload
|
||||
}
|
||||
|
||||
function cleanup_certbot_ssl() {
|
||||
# revoke/delete certs if certbot is used.
|
||||
if command -v certbot &>/dev/null && [ -f "$SASHIMONO_DATA/sa.cfg" ]; then
|
||||
@@ -86,6 +72,16 @@ if grep -q "^$MB_XRPL_USER:" /etc/passwd; then
|
||||
sudo -u "$MB_XRPL_USER" XDG_RUNTIME_DIR="$mb_user_runtime_dir" systemctl --user disable $MB_XRPL_SERVICE
|
||||
fi
|
||||
|
||||
# Backup the secret in upgrade process.
|
||||
if [[ "$UPGRADE" != "0" ]]; then
|
||||
|
||||
mb_xrpl_config_data=$(cat $MB_XRPL_DATA/mb-xrpl.cfg)
|
||||
secret_stored_path=$(echo $mb_xrpl_config_data | jq -r '.xrpl.secretPath')
|
||||
backup_dir=$(dirname $secret_backup_location)
|
||||
echo "Backing up account secret at $secret_backup_location." && mkdir -p $backup_dir && cp -p --no-preserve=ownership $secret_stored_path $secret_backup_location
|
||||
echo $secret_stored_path >$previous_secret_path_note
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# Uninstall all contract instance users---------------------------
|
||||
@@ -186,6 +182,15 @@ if grep -q "^$MB_XRPL_USER:" /etc/passwd; then
|
||||
! confirm "Evernode host deregistration failed. Still do you want to continue uninstallation?" && echo "Aborting uninstallation. Try again later." && exit 1
|
||||
echo "Continuing uninstallation..."
|
||||
fi
|
||||
|
||||
mb_xrpl_config_data=$(cat $MB_XRPL_DATA/mb-xrpl.cfg)
|
||||
current_secret_path=$(echo $mb_xrpl_config_data | jq -r '.xrpl.secretPath')
|
||||
|
||||
# Remove secret from the saved location.(This is applied for secrets not specified in default path)
|
||||
rm -f $current_secret_path
|
||||
|
||||
# Remove Evernode util directory
|
||||
[ -d "/root/.evernode" ] && rm -rf "/root/.evernode"
|
||||
fi
|
||||
|
||||
echo "Deleting message board user..."
|
||||
@@ -215,7 +220,4 @@ groupdel $SASHIADMIN_GROUP
|
||||
|
||||
[ "$UPGRADE" == "0" ] && echo "Sashimono uninstalled successfully." || echo "Sashimono uninstalled successfully. Your data has been preserved."
|
||||
|
||||
# Remove the Evernode Auto Updater Service.
|
||||
[ "$UPGRADE" == "0" ] && remove_evernode_auto_updater
|
||||
|
||||
exit 0
|
||||
|
||||
1447
installer/setup-old.sh
Normal file
1447
installer/setup-old.sh
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -15,25 +15,26 @@ async function main() {
|
||||
if (process.argv.length >= 3) {
|
||||
if (process.argv.length >= 9 && process.argv[2] === 'new') {
|
||||
const accountAddress = process.argv[3];
|
||||
const accountSecret = process.argv[4];
|
||||
const accountSecretPath = process.argv[4];
|
||||
const governorAddress = process.argv[5];
|
||||
const domain = process.argv[6];
|
||||
// const domain = process.argv[6];
|
||||
const leaseAmount = process.argv[7];
|
||||
const rippledServer = process.argv[8];
|
||||
const ipv6Subnet = (process.argv[9] === '-') ? null : process.argv[9];
|
||||
const ipv6NetInterface = (process.argv[10] === '-') ? null : process.argv[10];
|
||||
const network = process.argv.length > 11 ? process.argv[11] : appenv.NETWORK;
|
||||
const setup = new Setup();
|
||||
const acc = await setup.setupHostAccount(accountAddress, accountSecret, rippledServer, governorAddress, domain);
|
||||
setup.newConfig(acc.address, acc.secret, governorAddress, parseFloat(leaseAmount), rippledServer, ipv6Subnet, ipv6NetInterface);
|
||||
setup.newConfig(accountAddress, accountSecretPath, governorAddress, parseFloat(leaseAmount), rippledServer, ipv6Subnet, ipv6NetInterface, network);
|
||||
}
|
||||
else if (process.argv.length === 7 && process.argv[2] === 'betagen') {
|
||||
const governorAddress = process.argv[3];
|
||||
const domain = process.argv[4];
|
||||
const leaseAmount = process.argv[5];
|
||||
const rippledServer = process.argv[6];
|
||||
const network = process.argv.length > 7 ? process.argv[7] : appenv.NETWORK;
|
||||
const setup = new Setup();
|
||||
const acc = await setup.generateBetaHostAccount(rippledServer, governorAddress, domain);
|
||||
setup.newConfig(acc.address, acc.secret, governorAddress, parseFloat(leaseAmount), rippledServer);
|
||||
const acc = await setup.generateBetaHostAccount(rippledServer, governorAddress, domain, network);
|
||||
setup.newConfig(acc.address, acc.secret, governorAddress, parseFloat(leaseAmount), rippledServer, null, null, network);
|
||||
}
|
||||
else if (process.argv.length >= 13 && process.argv[2] === 'register') {
|
||||
await new Setup().register(process.argv[3], parseInt(process.argv[4]), parseInt(process.argv[5]),
|
||||
@@ -77,9 +78,9 @@ async function main() {
|
||||
console.log(`Usage:
|
||||
node index.js - Run message board.
|
||||
node index.js version - Print version.
|
||||
node index.js new [address] [secret] [governorAddress] [leaseAmount] [rippledServer] [ipv6Subnet] [ipv6Interface] - Create new config files.
|
||||
node index.js new [address] [secret] [governorAddress] [leaseAmount] [rippledServer] [ipv6Subnet] [ipv6Interface] [network] - Create new config files.
|
||||
node index.js betagen [governorAddress] [domain or ip] [leaseAmount] [rippledServer] - Generate beta host account and populate the configs.
|
||||
node index.js register [countryCode] [cpuMicroSec] [ramKb] [swapKb] [diskKb] [totalInstanceCount] [description] - Register the host on Evernode.
|
||||
node index.js register [countryCode] [cpuMicroSec] [ramKb] [swapKb] [diskKb] [totalInstanceCount] [description] [network] - Register the host on Evernode.
|
||||
node index.js transfer [transfereeAddress] - Initiate a transfer.
|
||||
node index.js deregister - Deregister the host from Evernode.
|
||||
node index.js reginfo - Display Evernode registration info.
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
const process = require('process');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
let appenv = {
|
||||
IS_DEV_MODE: process.env.MB_DEV === "1",
|
||||
FILE_LOG_ENABLED: process.env.MB_FILE_LOG === "1",
|
||||
DATA_DIR: process.env.MB_DATA_DIR || __dirname,
|
||||
FAUCET_URL: process.env.MB_FAUCET_URL || "https://hooks-testnet-v3.xrpl-labs.com/newcreds",
|
||||
DEFAULT_RIPPLED_SERVER: 'wss://hooks-testnet-v3.xrpl-labs.com',
|
||||
DEFAULT_FULL_HISTORY_NODE: 'wss://hooks-testnet-v3.xrpl-labs.com' // If we migrate to Main NET, this should be configured with the relevant full history Node WebSocket.
|
||||
}
|
||||
|
||||
appenv = {
|
||||
...appenv,
|
||||
CONFIG_PATH: appenv.DATA_DIR + '/mb-xrpl.cfg',
|
||||
SECRET_CONFIG_PATH: appenv.DATA_DIR + '/secret.cfg',
|
||||
GOVERNANCE_CONFIG_PATH: appenv.DATA_DIR + '/governance.cfg',
|
||||
LOG_PATH: appenv.DATA_DIR + '/log/mb-xrpl.log',
|
||||
DB_PATH: appenv.DATA_DIR + '/mb-xrpl.sqlite',
|
||||
@@ -28,9 +27,17 @@ appenv = {
|
||||
ORPHAN_PRUNE_SCHEDULER_INTERVAL_HOURS: 4,
|
||||
SASHIMONO_SCHEDULER_INTERVAL_SECONDS: 2,
|
||||
SASHI_CLI_PATH: appenv.IS_DEV_MODE ? "../build/sashi" : "/usr/bin/sashi",
|
||||
MB_VERSION: '0.7.2',
|
||||
TOS_HASH: '757A0237B44D8B2BBB04AE2BAD5813858E0AECD2F0B217075E27E0630BA74314' // This is the sha256 hash of TOS text.
|
||||
MB_VERSION: '0.8.0',
|
||||
TOS_HASH: '757A0237B44D8B2BBB04AE2BAD5813858E0AECD2F0B217075E27E0630BA74314', // This is the sha256 hash of TOS text.
|
||||
NETWORK: 'testnet'
|
||||
}
|
||||
|
||||
const getSecretPath = () => {
|
||||
return fs.existsSync(appenv.CONFIG_PATH) ? JSON.parse(fs.readFileSync(appenv.CONFIG_PATH).toString()).xrpl.secretPath : "";
|
||||
}
|
||||
|
||||
appenv = { ...appenv, SECRET_CONFIG_PATH: getSecretPath() }
|
||||
|
||||
Object.freeze(appenv);
|
||||
|
||||
module.exports = {
|
||||
|
||||
@@ -28,15 +28,10 @@ class ConfigHelper {
|
||||
return config;
|
||||
}
|
||||
|
||||
static writeConfig(config, configPath, secretConfigPath) {
|
||||
static writeConfig(config, configPath) {
|
||||
let publicCfg = JSON.parse(JSON.stringify(config)); // Make a copy. So, referenced object won't get changed.
|
||||
const secretCfg = {
|
||||
xrpl: {
|
||||
secret: publicCfg.xrpl.secret
|
||||
}
|
||||
}
|
||||
delete publicCfg.xrpl.secret;
|
||||
fs.writeFileSync(secretConfigPath, JSON.stringify(secretCfg, null, 2), { mode: 0o600 }); // Set file permission so only current user can read/write.
|
||||
if ('secret' in publicCfg.xrpl)
|
||||
delete publicCfg.xrpl.secret;
|
||||
fs.writeFileSync(configPath, JSON.stringify(publicCfg, null, 2), { mode: 0o644 }); // Set file permission so only current user can read/write and others can read.
|
||||
}
|
||||
|
||||
|
||||
@@ -4,12 +4,18 @@ const fs = require('fs');
|
||||
const { appenv } = require('./appenv');
|
||||
const { ConfigHelper } = require('./config-helper');
|
||||
|
||||
function setEvernodeDefaults(governorAddress, rippledServer, xrplApi) {
|
||||
evernode.Defaults.set({
|
||||
governorAddress: governorAddress,
|
||||
rippledServer: rippledServer,
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
async function setEvernodeDefaults(network, governorAddress, rippledServer) {
|
||||
await evernode.Defaults.useNetwork(network || appenv.NETWORK);
|
||||
|
||||
if (governorAddress)
|
||||
evernode.Defaults.set({
|
||||
governorAddress: governorAddress
|
||||
});
|
||||
|
||||
if (rippledServer)
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledServer
|
||||
});
|
||||
}
|
||||
|
||||
class GovernanceManager {
|
||||
@@ -181,7 +187,7 @@ class GovernanceManager {
|
||||
// Secret is needed for propose, withdraw, and report in order to send the transaction
|
||||
const sashiMBConfig = ConfigHelper.readConfig(appenv.CONFIG_PATH,
|
||||
(command == 'propose' || command === 'withdraw' || command === 'report') ? appenv.SECRET_CONFIG_PATH : null);
|
||||
setEvernodeDefaults(sashiMBConfig.xrpl.governorAddress, sashiMBConfig.xrpl.rippledServer);
|
||||
await setEvernodeDefaults(sashiMBConfig.xrpl.network, sashiMBConfig.xrpl.governorAddress, sashiMBConfig.xrpl.rippledServer);
|
||||
hostClient = new evernode.HostClient(sashiMBConfig.xrpl.address, sashiMBConfig.xrpl.secret);
|
||||
}
|
||||
const mgr = new GovernanceManager(appenv.GOVERNANCE_CONFIG_PATH);
|
||||
|
||||
@@ -52,9 +52,20 @@ class MessageBoard {
|
||||
if (!this.cfg.version || !this.cfg.xrpl.address || !this.cfg.xrpl.secret || !this.cfg.xrpl.governorAddress)
|
||||
throw "Required cfg fields cannot be empty.";
|
||||
|
||||
this.xrplApi = new evernode.XrplApi(this.cfg.xrpl.rippledServer);
|
||||
await evernode.Defaults.useNetwork(this.cfg.xrpl.network || appenv.NETWORK);
|
||||
|
||||
if (this.cfg.xrpl.governorAddress)
|
||||
evernode.Defaults.set({
|
||||
governorAddress: this.cfg.xrpl.governorAddress
|
||||
});
|
||||
|
||||
if (this.cfg.xrpl.rippledServer)
|
||||
evernode.Defaults.set({
|
||||
rippledServer: this.cfg.xrpl.rippledServer
|
||||
});
|
||||
|
||||
this.xrplApi = new evernode.XrplApi();
|
||||
evernode.Defaults.set({
|
||||
governorAddress: this.cfg.xrpl.governorAddress,
|
||||
xrplApi: this.xrplApi
|
||||
})
|
||||
await this.xrplApi.connect();
|
||||
@@ -1076,7 +1087,7 @@ class MessageBoard {
|
||||
}
|
||||
|
||||
persistConfig() {
|
||||
ConfigHelper.writeConfig(this.cfg, this.configPath, this.secretConfigPath);
|
||||
ConfigHelper.writeConfig(this.cfg, this.configPath);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,12 +8,18 @@ const { ConfigHelper } = require('./config-helper');
|
||||
const { SashiCLI } = require('./sashi-cli');
|
||||
const { UtilHelper } = require('./util-helper');
|
||||
|
||||
function setEvernodeDefaults(governorAddress, rippledServer, xrplApi = null) {
|
||||
evernode.Defaults.set({
|
||||
governorAddress: governorAddress,
|
||||
rippledServer: rippledServer || appenv.DEFAULT_RIPPLED_SERVER,
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
async function setEvernodeDefaults(network, governorAddress, rippledServer) {
|
||||
await evernode.Defaults.useNetwork(network || appenv.NETWORK);
|
||||
|
||||
if (governorAddress)
|
||||
evernode.Defaults.set({
|
||||
governorAddress: governorAddress
|
||||
});
|
||||
|
||||
if (rippledServer)
|
||||
evernode.Defaults.set({
|
||||
rippledServer: rippledServer
|
||||
});
|
||||
}
|
||||
|
||||
class Setup {
|
||||
@@ -54,15 +60,16 @@ class Setup {
|
||||
}
|
||||
|
||||
#saveConfig(cfg) {
|
||||
ConfigHelper.writeConfig(cfg, appenv.CONFIG_PATH, appenv.SECRET_CONFIG_PATH);
|
||||
ConfigHelper.writeConfig(cfg, appenv.CONFIG_PATH);
|
||||
}
|
||||
|
||||
newConfig(address = "", secret = "", governorAddress = "", leaseAmount = 0, rippledServer = null, ipv6Subnet = null, ipv6NetInterface = null) {
|
||||
newConfig(address = "", secretPath = "", governorAddress = "", leaseAmount = 0, rippledServer = null, ipv6Subnet = null, ipv6NetInterface = null, network = "") {
|
||||
const baseConfig = {
|
||||
version: appenv.MB_VERSION,
|
||||
xrpl: {
|
||||
network: network,
|
||||
address: address,
|
||||
secret: secret,
|
||||
secretPath: secretPath,
|
||||
governorAddress: governorAddress,
|
||||
rippledServer: rippledServer || appenv.DEFAULT_RIPPLED_SERVER,
|
||||
leaseAmount: leaseAmount
|
||||
@@ -72,50 +79,9 @@ class Setup {
|
||||
this.#saveConfig(ipv6NetInterface ? { ...baseConfig, networking: { ipv6: { subnet: ipv6Subnet, interface: ipv6NetInterface } } } : baseConfig);
|
||||
}
|
||||
|
||||
async setupHostAccount(address, secret, rippledServer, governorAddress, domain) {
|
||||
async generateBetaHostAccount(rippledServer, governorAddress, domain, network = null) {
|
||||
|
||||
setEvernodeDefaults(governorAddress, rippledServer);
|
||||
|
||||
const xrplApi = new evernode.XrplApi(rippledServer);
|
||||
const acc = new evernode.XrplAccount(address, secret, { xrplApi: xrplApi });
|
||||
|
||||
// Prepare host account.
|
||||
{
|
||||
const hostClient = new evernode.HostClient(acc.address, acc.secret);
|
||||
await hostClient.connect();
|
||||
|
||||
console.log(`Preparing host account:${acc.address} (domain:${domain} registry:${hostClient.config.registryAddress})`);
|
||||
|
||||
// Sometimes we may get 'account not found' error from rippled when some servers in the cluster
|
||||
// haven't still updated the ledger. In such cases, we retry several times before giving up.
|
||||
{
|
||||
let attempts = 0;
|
||||
while (attempts >= 0) {
|
||||
try {
|
||||
await hostClient.prepareAccount(domain);
|
||||
break;
|
||||
}
|
||||
catch (err) {
|
||||
if (err.data?.error === 'actNotFound' && ++attempts <= 5) {
|
||||
console.log("actNotFound - retrying...")
|
||||
// Wait and retry.
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
continue;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await hostClient.disconnect();
|
||||
}
|
||||
|
||||
return acc;
|
||||
}
|
||||
|
||||
async generateBetaHostAccount(rippledServer, governorAddress, domain) {
|
||||
|
||||
setEvernodeDefaults(governorAddress, rippledServer);
|
||||
await setEvernodeDefaults(network, governorAddress, rippledServer);
|
||||
|
||||
const acc = await this.#generateFaucetAccount();
|
||||
|
||||
@@ -181,13 +147,15 @@ class Setup {
|
||||
let cpuModelFormatted = cpuModel.replaceAll('_', ' ');
|
||||
const config = this.#getConfig();
|
||||
const acc = config.xrpl;
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
|
||||
|
||||
const hostClient = new evernode.HostClient(acc.address, acc.secret);
|
||||
await hostClient.connect();
|
||||
|
||||
// Update the Defaults with "xrplApi" of the client.
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, hostClient.xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: hostClient.xrplApi
|
||||
});
|
||||
|
||||
const isAReReg = await hostClient.isTransferee();
|
||||
const evrBalance = await hostClient.getEVRBalance();
|
||||
@@ -230,13 +198,15 @@ class Setup {
|
||||
async deregister() {
|
||||
console.log("Deregistering host...");
|
||||
const acc = this.#getConfig().xrpl;
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
|
||||
|
||||
const hostClient = new evernode.HostClient(acc.address, acc.secret);
|
||||
await hostClient.connect();
|
||||
|
||||
// Update the Defaults with "xrplApi" of the client.
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, hostClient.xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: hostClient.xrplApi
|
||||
});
|
||||
|
||||
await this.burnMintedURITokens(hostClient.xrplAcc);
|
||||
await hostClient.deregister();
|
||||
@@ -249,7 +219,7 @@ class Setup {
|
||||
console.log(`Governor address: ${acc?.governorAddress}`);
|
||||
|
||||
if (!isBasic) {
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
|
||||
|
||||
try {
|
||||
const hostClient = new evernode.HostClient(acc.address);
|
||||
@@ -257,7 +227,9 @@ class Setup {
|
||||
console.log(`Registry address: ${hostClient.config.registryAddress}`);
|
||||
console.log(`Heartbeat address: ${hostClient.config.heartbeatAddress}`);
|
||||
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, hostClient.xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: hostClient.xrplApi
|
||||
});
|
||||
|
||||
const [evrBalance, hostInfo] = await Promise.all([hostClient.getEVRBalance(), hostClient.getRegistration()]);
|
||||
if (hostInfo) {
|
||||
@@ -290,12 +262,14 @@ class Setup {
|
||||
cfg.xrpl.rippledServer = appenv.DEFAULT_RIPPLED_SERVER
|
||||
|
||||
if (!cfg.xrpl.governorAddress) {
|
||||
setEvernodeDefaults(governorAddress, cfg.xrpl.rippledServer);
|
||||
await setEvernodeDefaults(cfg.xrpl.network, governorAddress, cfg.xrpl.rippledServer);
|
||||
|
||||
const hostClient = new evernode.HostClient(cfg.xrpl.address, cfg.xrpl.secret);
|
||||
await hostClient.connect();
|
||||
|
||||
setEvernodeDefaults(governorAddress, cfg.xrpl.rippledServer, hostClient.xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: hostClient.xrplApi
|
||||
});
|
||||
|
||||
cfg.xrpl.governorAddress = governorAddress;
|
||||
|
||||
@@ -311,13 +285,15 @@ class Setup {
|
||||
async hostInfo() {
|
||||
|
||||
const acc = this.#getConfig(false).xrpl;
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
|
||||
|
||||
const hostClient = new evernode.HostClient(acc.address);
|
||||
await hostClient.connect();
|
||||
|
||||
// Update the Defaults with "xrplApi" of the client.
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, hostClient.xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: hostClient.xrplApi
|
||||
});
|
||||
|
||||
const hostInfo = await hostClient.getHostInfo();
|
||||
|
||||
@@ -331,13 +307,15 @@ class Setup {
|
||||
|
||||
console.log("Updating host...");
|
||||
const acc = this.#getConfig().xrpl;
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
|
||||
|
||||
const hostClient = new evernode.HostClient(acc.address, acc.secret);
|
||||
await hostClient.connect();
|
||||
|
||||
// Update the Defaults with "xrplApi" of the client.
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, hostClient.xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: hostClient.xrplApi
|
||||
});
|
||||
|
||||
const hostInfo = await hostClient.getHostInfo();
|
||||
await hostClient.updateRegInfo(hostInfo.activeInstances, null, null, null, null, null, null, null, null, emailAddress);
|
||||
@@ -385,12 +363,14 @@ class Setup {
|
||||
async transfer(transfereeAddress) {
|
||||
console.log("Transferring host...");
|
||||
const acc = this.#getConfig().xrpl;
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
|
||||
|
||||
const hostClient = new evernode.HostClient(acc.address, acc.secret);
|
||||
await hostClient.connect();
|
||||
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, hostClient.xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: hostClient.xrplApi
|
||||
});
|
||||
|
||||
await hostClient.transfer(transfereeAddress);
|
||||
await this.burnMintedURITokens(hostClient.xrplAcc);
|
||||
@@ -448,13 +428,14 @@ class Setup {
|
||||
let hostClient;
|
||||
|
||||
async function initClients(rippledServer) {
|
||||
setEvernodeDefaults(acc.governorAddress, rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, rippledServer);
|
||||
xrplApi = new evernode.XrplApi();
|
||||
hostClient = new evernode.HostClient(acc.address, acc.secret, { xrplApi: xrplApi });
|
||||
await xrplApi.connect();
|
||||
await hostClient.connect();
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, xrplApi);
|
||||
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
}
|
||||
|
||||
async function deinitClients() {
|
||||
@@ -594,12 +575,14 @@ class Setup {
|
||||
lease = lease[0];
|
||||
|
||||
const acc = this.#getConfig().xrpl;
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer);
|
||||
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
|
||||
|
||||
xrplApi = new evernode.XrplApi(acc.rippledServer);
|
||||
await xrplApi.connect();
|
||||
|
||||
setEvernodeDefaults(acc.governorAddress, acc.rippledServer, xrplApi);
|
||||
evernode.Defaults.set({
|
||||
xrplApi: xrplApi
|
||||
});
|
||||
|
||||
// Get the existing uriToken of the lease.
|
||||
const uriToken = (await (new evernode.XrplAccount(lease.tenant_xrp_address, null, { xrplApi: xrplApi }).getURITokens()))?.find(n => n.index == lease.container_name);
|
||||
|
||||
14
mb-xrpl/package-lock.json
generated
14
mb-xrpl/package-lock.json
generated
@@ -6,7 +6,7 @@
|
||||
"": {
|
||||
"name": "mb-xrpl",
|
||||
"dependencies": {
|
||||
"evernode-js-client": "0.6.20",
|
||||
"evernode-js-client": "0.6.21",
|
||||
"ip6addr": "0.2.5",
|
||||
"sqlite3": "5.0.2"
|
||||
},
|
||||
@@ -980,9 +980,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/evernode-js-client": {
|
||||
"version": "0.6.20",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.20.tgz",
|
||||
"integrity": "sha512-OC6VNAhwqnNvUc0NhffxwNI9bTDH+BkD/KBTC5Xuwoiq8BhRfYhmfHBnD6M9K5AvLqv+Jxdufc3l1AlzHgILWg==",
|
||||
"version": "0.6.21",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
|
||||
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
|
||||
"dependencies": {
|
||||
"elliptic": "6.5.4",
|
||||
"libsodium-wrappers": "0.7.10",
|
||||
@@ -4010,9 +4010,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"evernode-js-client": {
|
||||
"version": "0.6.20",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.20.tgz",
|
||||
"integrity": "sha512-OC6VNAhwqnNvUc0NhffxwNI9bTDH+BkD/KBTC5Xuwoiq8BhRfYhmfHBnD6M9K5AvLqv+Jxdufc3l1AlzHgILWg==",
|
||||
"version": "0.6.21",
|
||||
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
|
||||
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
|
||||
"requires": {
|
||||
"elliptic": "6.5.4",
|
||||
"libsodium-wrappers": "0.7.10",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"build": "npm run lint && ncc build app.js --minify -o dist"
|
||||
},
|
||||
"dependencies": {
|
||||
"evernode-js-client": "0.6.20",
|
||||
"evernode-js-client": "0.6.21",
|
||||
"sqlite3": "5.0.2",
|
||||
"ip6addr": "0.2.5"
|
||||
},
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
namespace version
|
||||
{
|
||||
// Sashimono agent version. Written to new configs.
|
||||
constexpr const char *AGENT_VERSION = "0.7.2";
|
||||
constexpr const char *AGENT_VERSION = "0.8.0";
|
||||
|
||||
// Minimum compatible config version (this will be used to validate configs).
|
||||
constexpr const char *MIN_CONFIG_VERSION = "0.5.0";
|
||||
|
||||
Reference in New Issue
Block a user