@ethernity-cloud/sdk-js 1.7.8 → 1.7.10
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/README.md +33 -13
- package/cas/config.js +2 -2
- package/cas/session_registry.js +9 -6
- package/info.js +2 -2
- package/init.js +37 -18
- package/localKubo.js +18 -10
- package/nodenithy/build.mjs +5 -5
- package/nodenithy/ipfs.mjs +74 -18
- package/nodenithy/run/docker-compose-swift-stream.yml +4 -1
- package/nodenithy/run/image_registry.js +1 -1
- package/nodenithy/run.js +54 -22
- package/nodenithy/src/ec_helloworld_example.js +6 -2
- package/nodenithy/src/preStart.mjs +6 -2
- package/package.json +2 -2
- package/pynithy/build.mjs +5 -5
- package/pynithy/ipfs.mjs +74 -18
- package/pynithy/run/docker-compose-swift-stream.yml +4 -1
- package/pynithy/run/docker-compose-swift-stream.yml.tmpl +4 -1
- package/pynithy/run/image_registry.js +1 -1
- package/pynithy/run.js +54 -22
- package/pynithy/src/ec_helloworld_example.js +6 -2
- package/pynithy/src/preStart.mjs +6 -2
- package/run.js +28 -5
- package/nodenithy/ipfs.js +0 -135
- package/nodenithy/run/git.sh +0 -22
- package/nodenithy/run/ipfs.sh +0 -58
- package/nodenithy/run/ipfs_pre.sh +0 -75
- package/nodenithy/run.sh +0 -277
- package/nodenithy/scripts/build-ipfs-upload.sh +0 -23
- package/nodenithy/scripts/build.sh +0 -40
- package/nodenithy/scripts/ipfs-daemon.sh +0 -7
- package/nodenithy/scripts/run.sh +0 -50
- package/pynithy/run/git.sh +0 -22
- package/pynithy/run/ipfs.sh +0 -89
package/run.js
CHANGED
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
* The network-side sibling of `ecld-test`: same payload flags (a code string,
|
|
5
5
|
* --file, --input/--input-text), but instead of executing locally it drives the
|
|
6
6
|
* real runner (@ethernity-cloud/runner's EthernityCloudRunner) end to end —
|
|
7
|
-
* encrypt the payload,
|
|
8
|
-
*
|
|
7
|
+
* encrypt the payload, place the on-chain DO request, deliver the payload to
|
|
8
|
+
* the bootnode's payload intake once the request is on chain (or to the IPFS
|
|
9
|
+
* API named with --ipfs <url>), wait for a node to process it, download and
|
|
10
|
+
* decrypt the result.
|
|
9
11
|
*
|
|
10
12
|
* Where ecld-test answers "does my CALL work?", ecld-run answers "does it work
|
|
11
13
|
* on the network, on the enclave I published?" — it costs gas and needs a
|
|
@@ -41,8 +43,15 @@ const fs = require('fs');
|
|
|
41
43
|
try { require('dotenv').config(); } catch (e) { /* dotenv optional */ }
|
|
42
44
|
const casConfig = require('./cas/config.js');
|
|
43
45
|
const { networkFor, unsafeVariant } = require('./network.js');
|
|
46
|
+
const { PUBLIC_IPFS_HOST } = require('./localKubo.js');
|
|
44
47
|
|
|
45
|
-
|
|
48
|
+
// `--ipfs intake` (the default): the artefacts' CIDs are computed locally and
|
|
49
|
+
// the bytes delivered to the bootnode's payload intake once the DO request is
|
|
50
|
+
// on chain (runner initializePublicIntake); `--ipfs <url>` uploads and reads
|
|
51
|
+
// through that IPFS RPC API instead, with ECLD_IPFS_TOKEN or IPFS_TOKEN as its
|
|
52
|
+
// Authorization header. The public API takes writes only with a writer token,
|
|
53
|
+
// so a URL naming it is refused without one.
|
|
54
|
+
const DEFAULT_IPFS = 'intake';
|
|
46
55
|
|
|
47
56
|
function parseArgs(argv) {
|
|
48
57
|
const opts = { ipfs: DEFAULT_IPFS, timeout: 600, taskPrice: 3, cpu: 1, memory: 1, storage: 10, bandwidth: 1, duration: 1, validators: 1, node: '' };
|
|
@@ -86,7 +95,9 @@ enclaves: --securelock <name> (default PROJECT_NAME), --trustedzone <name> (def
|
|
|
86
95
|
on an -unsafe network the default is each one's -unsafe variant
|
|
87
96
|
key: PRIVATE_KEY (a funded 0x key) from .env / env, or ECLD_PRIVATE_KEY
|
|
88
97
|
resources: --task-price 3 --cpu 1 --memory 1 --storage 10 --bandwidth 1 --duration 1 --validators 1
|
|
89
|
-
other: --node <addr> --ipfs
|
|
98
|
+
other: --node <addr> --ipfs intake|<ipfs api url> (default intake: the bootnode's payload intake;
|
|
99
|
+
a URL takes ECLD_IPFS_TOKEN or IPFS_TOKEN as its Authorization header)
|
|
100
|
+
--timeout <sec> --json`;
|
|
90
101
|
|
|
91
102
|
async function main() {
|
|
92
103
|
const { opts, positional } = parseArgs(process.argv.slice(2));
|
|
@@ -173,7 +184,19 @@ async function main() {
|
|
|
173
184
|
console.error('ecld-run: could not initialise the runner: ' + e.message);
|
|
174
185
|
process.exit(1);
|
|
175
186
|
}
|
|
176
|
-
|
|
187
|
+
if (opts.ipfs === 'intake') {
|
|
188
|
+
runner.initializePublicIntake();
|
|
189
|
+
} else {
|
|
190
|
+
const token = (process.env.ECLD_IPFS_TOKEN || process.env.IPFS_TOKEN || '').trim();
|
|
191
|
+
let host = '';
|
|
192
|
+
try { host = new URL(opts.ipfs).hostname; } catch (e) { /* not a URL: the runner reports it */ }
|
|
193
|
+
if (host === PUBLIC_IPFS_HOST && !token) {
|
|
194
|
+
console.error(`ecld-run: the public API ${PUBLIC_IPFS_HOST} takes writes only with a writer token `
|
|
195
|
+
+ '(ECLD_IPFS_TOKEN or IPFS_TOKEN); use the intake (--ipfs intake) or your own Kubo.');
|
|
196
|
+
process.exit(2);
|
|
197
|
+
}
|
|
198
|
+
runner.initializeStorage(opts.ipfs, undefined, undefined, token || undefined);
|
|
199
|
+
}
|
|
177
200
|
|
|
178
201
|
let lastPhase = null;
|
|
179
202
|
const onProgress = (e) => {
|
package/nodenithy/ipfs.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { create } from 'ipfs-http-client';
|
|
2
|
-
import { delay, getRetryDelay } from './utils';
|
|
3
|
-
import { ECError } from './enums';
|
|
4
|
-
|
|
5
|
-
let ipfs = null;
|
|
6
|
-
const writeFile = promisify(fs.writeFile);
|
|
7
|
-
|
|
8
|
-
export const initialize = (host, protocol, port, token) => {
|
|
9
|
-
if (host.search('http') !== -1) {
|
|
10
|
-
ipfs = create(host);
|
|
11
|
-
} else if (token === '') {
|
|
12
|
-
ipfs = create({
|
|
13
|
-
host,
|
|
14
|
-
protocol,
|
|
15
|
-
port
|
|
16
|
-
});
|
|
17
|
-
} else {
|
|
18
|
-
// example of authorization headers
|
|
19
|
-
// headers: {
|
|
20
|
-
// authorization: 'Bearer ' + TOKEN
|
|
21
|
-
// }
|
|
22
|
-
// const auth =
|
|
23
|
-
// 'Basic ' + Buffer.from(INFURA_ID + ':' + INFURA_SECRET_KEY).toString('base64');
|
|
24
|
-
ipfs = create({
|
|
25
|
-
host,
|
|
26
|
-
protocol,
|
|
27
|
-
port,
|
|
28
|
-
headers: { authorization: token }
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
export const uploadToIPFS = async (code) => {
|
|
34
|
-
try {
|
|
35
|
-
const response = await ipfs.add(code);
|
|
36
|
-
return response.path;
|
|
37
|
-
} catch (e) {
|
|
38
|
-
console.log(e);
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export const uploadFileToIPFS = async (path) => {
|
|
44
|
-
try {
|
|
45
|
-
const response = await ipfs.add(path);
|
|
46
|
-
return response.path;
|
|
47
|
-
} catch (e) {
|
|
48
|
-
console.log(e);
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export const uploadFolderToIPFS = async (path) => {
|
|
54
|
-
try {
|
|
55
|
-
const response = await ipfs.add(path, { recursive: true });
|
|
56
|
-
return response.path;
|
|
57
|
-
} catch (e) {
|
|
58
|
-
console.log(e);
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// export const getFromIPFS = async (hash) => {
|
|
64
|
-
// let res = '';
|
|
65
|
-
// try {
|
|
66
|
-
// // eslint-disable-next-line no-restricted-syntax
|
|
67
|
-
// for await (const file of ipfs.cat(hash)) {
|
|
68
|
-
// res += new TextDecoder().decode(file.buffer);
|
|
69
|
-
// }
|
|
70
|
-
//
|
|
71
|
-
// return res;
|
|
72
|
-
// } catch (error) {
|
|
73
|
-
// console.error(error.message);
|
|
74
|
-
// await delay(2000);
|
|
75
|
-
// return getFromIPFS(hash);
|
|
76
|
-
// }
|
|
77
|
-
// };
|
|
78
|
-
|
|
79
|
-
export const getFromIPFS = async (hash, filePath, maxRetries = process.env.REACT_APP_IPFS_RETRIES || 5) => {
|
|
80
|
-
let res = '';
|
|
81
|
-
let retryCount = 0;
|
|
82
|
-
|
|
83
|
-
while (retryCount < maxRetries) {
|
|
84
|
-
try {
|
|
85
|
-
// eslint-disable-next-line no-restricted-syntax,no-await-in-loop
|
|
86
|
-
for await (const file of ipfs.cat(hash)) {
|
|
87
|
-
res += new TextDecoder().decode(file.buffer);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Save the content to a file
|
|
91
|
-
await writeFile(filePath, res);
|
|
92
|
-
return res;
|
|
93
|
-
} catch (error) {
|
|
94
|
-
console.error(error.message);
|
|
95
|
-
retryCount += 1;
|
|
96
|
-
|
|
97
|
-
if (retryCount < maxRetries) {
|
|
98
|
-
// eslint-disable-next-line no-await-in-loop
|
|
99
|
-
await delay(getRetryDelay(retryCount));
|
|
100
|
-
// eslint-disable-next-line no-continue
|
|
101
|
-
continue;
|
|
102
|
-
} else {
|
|
103
|
-
throw new Error(ECError.IPFS_DOWNLOAD_ERROR);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
export const getContentFromIPFS = async (hash, maxRetries = process.env.REACT_APP_IPFS_RETRIES || 5) => {
|
|
110
|
-
let res = '';
|
|
111
|
-
let retryCount = 0;
|
|
112
|
-
|
|
113
|
-
while (retryCount < maxRetries) {
|
|
114
|
-
try {
|
|
115
|
-
// eslint-disable-next-line no-restricted-syntax,no-await-in-loop
|
|
116
|
-
for await (const file of ipfs.cat(hash)) {
|
|
117
|
-
res += new TextDecoder().decode(file.buffer);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return res;
|
|
121
|
-
} catch (error) {
|
|
122
|
-
console.error(error.message);
|
|
123
|
-
retryCount += 1;
|
|
124
|
-
|
|
125
|
-
if (retryCount < maxRetries) {
|
|
126
|
-
// eslint-disable-next-line no-await-in-loop
|
|
127
|
-
await delay(getRetryDelay(retryCount));
|
|
128
|
-
// eslint-disable-next-line no-continue
|
|
129
|
-
continue;
|
|
130
|
-
} else {
|
|
131
|
-
throw new Error(ECError.IPFS_DOWNLOAD_ERROR);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
};
|
package/nodenithy/run/git.sh
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
|
|
3
|
-
# apk add git
|
|
4
|
-
|
|
5
|
-
# ls -la
|
|
6
|
-
|
|
7
|
-
# echo "${REGISTRY_PATH}"
|
|
8
|
-
# cd ${REGISTRY_PATH}
|
|
9
|
-
|
|
10
|
-
# ls -la
|
|
11
|
-
|
|
12
|
-
# #commit add all to git
|
|
13
|
-
# ls -la ${CI_PROJECT_DIR}/etny-hash-packages/etny-nodenithy/v3/
|
|
14
|
-
# echo "Adding changed files to GIT: IPFS_HASH, IPFS_DOCKER_COMPOSE_HASH, CERTIFICATE..."
|
|
15
|
-
# git -C ${CI_PROJECT_DIR}/etny-hash-packages add etny-nodenithy/v3/.
|
|
16
|
-
# echo "Committed all files"
|
|
17
|
-
# git -C ${CI_PROJECT_DIR}/etny-hash-packages commit -m 'Adding changed files to GIT: IPFS_HASH, IPFS_DOCKER_COMPOSE_HASH, CERTIFICATE'
|
|
18
|
-
# echo "Pushed all files"
|
|
19
|
-
# git -C ${CI_PROJECT_DIR}/etny-hash-packages push
|
|
20
|
-
# echo "Added and committed all files"
|
|
21
|
-
# cd -
|
|
22
|
-
|
package/nodenithy/run/ipfs.sh
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
export IPFS_HOME=${PWD}/ipfs
|
|
4
|
-
export IPFS_PATH=${IPFS_HOME}/.ipfs
|
|
5
|
-
|
|
6
|
-
export KUBO_URL="https://github.com/ipfs/kubo/releases/download/v0.17.0/kubo_v0.17.0_darwin-amd64.tar.gz"
|
|
7
|
-
echo KUBO_URL=${KUBO_URL}
|
|
8
|
-
|
|
9
|
-
mkdir -p ${IPFS_HOME}
|
|
10
|
-
|
|
11
|
-
curl -L ${KUBO_URL} | tar xvz
|
|
12
|
-
|
|
13
|
-
echo "*** KUBO Downloaded ***"
|
|
14
|
-
|
|
15
|
-
if [ -d "${IPFS_PATH}" ]; then
|
|
16
|
-
killall ipfs
|
|
17
|
-
rm -fr ${IPFS_PATH}
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
export IPFS_CMD=${PWD}/kubo/ipfs
|
|
21
|
-
export REGISTRY_PATH=../../../../registry
|
|
22
|
-
|
|
23
|
-
${IPFS_CMD} init
|
|
24
|
-
|
|
25
|
-
sleep 20
|
|
26
|
-
|
|
27
|
-
${IPFS_CMD} daemon &
|
|
28
|
-
|
|
29
|
-
sleep 20
|
|
30
|
-
|
|
31
|
-
${IPFS_CMD} swarm connect /ip4/31.7.188.59/tcp/4001/ipfs/QmRBc1eBt4hpJQUqHqn6eA8ixQPD3LFcUDsn6coKBQtia5
|
|
32
|
-
${IPFS_CMD} bootstrap add /ip4/31.7.188.59/tcp/4001/ipfs/QmRBc1eBt4hpJQUqHqn6eA8ixQPD3LFcUDsn6coKBQtia5
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
cp certificate.securelock.crt "${REGISTRY_PATH}/certificate.securelock.crt"
|
|
36
|
-
cp certificate.trustedzone.crt "${REGISTRY_PATH}/certificate.trustedzone.crt"
|
|
37
|
-
echo "${REGISTRY_PATH}"
|
|
38
|
-
cd ${REGISTRY_PATH}
|
|
39
|
-
|
|
40
|
-
#ADDING DOCKER IMAGE hash
|
|
41
|
-
export IPFS_HASH=$(${IPFS_CMD} add . -r | grep added | tail -1 | awk '{print $2}')
|
|
42
|
-
echo "IPFS_HASH=${IPFS_HASH}"
|
|
43
|
-
|
|
44
|
-
echo ipfs pin add --progress ${IPFS_HASH}
|
|
45
|
-
${IPFS_CMD} pin add --progress ${IPFS_HASH}
|
|
46
|
-
|
|
47
|
-
#DOWNLOADING DOCKER IMAGE FROM IFPS HASH
|
|
48
|
-
echo ipfs get ${IPFS_HASH}
|
|
49
|
-
${IPFS_CMD} get ${IPFS_HASH}
|
|
50
|
-
|
|
51
|
-
if [ -d "${IPFS_PATH}" ]; then
|
|
52
|
-
killall ipfs
|
|
53
|
-
rm -fr ${IPFS_PATH}
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
cd -
|
|
57
|
-
|
|
58
|
-
echo "${IPFS_HASH}" > "IPFS_HASH.ipfs"
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
export IPFS_HOME=${PWD}/ipfs
|
|
4
|
-
export IPFS_PATH=${IPFS_HOME}/.ipfs
|
|
5
|
-
|
|
6
|
-
export KUBO_URL="https://github.com/ipfs/kubo/releases/download/v0.17.0/kubo_v0.17.0_darwin-amd64.tar.gz"
|
|
7
|
-
echo KUBO_URL=${KUBO_URL}
|
|
8
|
-
|
|
9
|
-
mkdir -p ${IPFS_HOME}
|
|
10
|
-
|
|
11
|
-
curl -L ${KUBO_URL} | tar xvz
|
|
12
|
-
|
|
13
|
-
echo "*** KUBO Downloaded ***"
|
|
14
|
-
|
|
15
|
-
if [ -d "${IPFS_PATH}" ]; then
|
|
16
|
-
killall ipfs
|
|
17
|
-
rm -fr ${IPFS_PATH}
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
export IPFS_CMD=${PWD}/kubo/ipfs
|
|
21
|
-
export REGISTRY_PATH=../../../../registry
|
|
22
|
-
|
|
23
|
-
${IPFS_CMD} init
|
|
24
|
-
|
|
25
|
-
sleep 20
|
|
26
|
-
|
|
27
|
-
# Configure Kubo to use the custom IPFS API endpoint
|
|
28
|
-
${IPFS_CMD} config Addresses.API /ip4/127.0.0.1/tcp/5001
|
|
29
|
-
${IPFS_CMD} config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
|
|
30
|
-
${IPFS_CMD} config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST", "GET"]'
|
|
31
|
-
|
|
32
|
-
${IPFS_CMD} daemon &
|
|
33
|
-
|
|
34
|
-
sleep 20
|
|
35
|
-
|
|
36
|
-
# Connect to the custom IPFS node
|
|
37
|
-
${IPFS_CMD} swarm connect /dns4/ipfs.ethernity.cloud/tcp/5001
|
|
38
|
-
|
|
39
|
-
# Adding Docker Compose hash
|
|
40
|
-
export IPFS_DOCKER_COMPOSE_HASH=$(${IPFS_CMD} add docker-compose-final.yml | grep added | tail -1 | awk '{print $2}')
|
|
41
|
-
echo "IPFS_DOCKER_COMPOSE_HASH=${IPFS_DOCKER_COMPOSE_HASH}"
|
|
42
|
-
|
|
43
|
-
echo ipfs pin add --progress ${IPFS_DOCKER_COMPOSE_HASH}
|
|
44
|
-
${IPFS_CMD} pin add --progress ${IPFS_DOCKER_COMPOSE_HASH}
|
|
45
|
-
|
|
46
|
-
# Downloading Docker Compose from IPFS hash
|
|
47
|
-
echo ipfs get ${IPFS_DOCKER_COMPOSE_HASH}
|
|
48
|
-
${IPFS_CMD} get ${IPFS_DOCKER_COMPOSE_HASH}
|
|
49
|
-
|
|
50
|
-
# Remove downloaded
|
|
51
|
-
rm -fr ${IPFS_DOCKER_COMPOSE_HASH}
|
|
52
|
-
|
|
53
|
-
echo "${REGISTRY_PATH}"
|
|
54
|
-
cd ${REGISTRY_PATH}
|
|
55
|
-
|
|
56
|
-
# Adding Docker image hash
|
|
57
|
-
export IPFS_HASH=$(${IPFS_CMD} add . -r | grep added | tail -1 | awk '{print $2}')
|
|
58
|
-
echo "IPFS_HASH=${IPFS_HASH}"
|
|
59
|
-
|
|
60
|
-
echo ipfs pin add --progress ${IPFS_HASH}
|
|
61
|
-
${IPFS_CMD} pin add --progress ${IPFS_HASH}
|
|
62
|
-
|
|
63
|
-
# Downloading Docker image from IPFS hash
|
|
64
|
-
echo ipfs get ${IPFS_HASH}
|
|
65
|
-
${IPFS_CMD} get ${IPFS_HASH}
|
|
66
|
-
|
|
67
|
-
if [ -d "${IPFS_PATH}" ]; then
|
|
68
|
-
killall ipfs
|
|
69
|
-
rm -fr ${IPFS_PATH}
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
cd -
|
|
73
|
-
|
|
74
|
-
echo "${IPFS_DOCKER_COMPOSE_HASH}" > "IPFS_DOCKER_COMPOSE_HASH.ipfs"
|
|
75
|
-
echo "${IPFS_HASH}" > "IPFS_HASH.ipfs"
|
package/nodenithy/run.sh
DELETED
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
set -e
|
|
4
|
-
|
|
5
|
-
# Source environment variables
|
|
6
|
-
if [ -f .env ]; then
|
|
7
|
-
source .env
|
|
8
|
-
else
|
|
9
|
-
echo "Error: .env file not found"
|
|
10
|
-
exit 1
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
write_env() {
|
|
14
|
-
local key=$1
|
|
15
|
-
local value=$2
|
|
16
|
-
local env_file="$current_dir/.env"
|
|
17
|
-
|
|
18
|
-
# Check if the .env file exists
|
|
19
|
-
if [[ -f $env_file ]]; then
|
|
20
|
-
# Check if the key exists in the .env file
|
|
21
|
-
if grep -q "^${key}=" "$env_file"; then
|
|
22
|
-
# Update the existing key with the new value
|
|
23
|
-
sed -i '' "s/^${key}=.*/${key}=${value}/" "$env_file"
|
|
24
|
-
else
|
|
25
|
-
# Add the new key-value pair to the .env file
|
|
26
|
-
echo "${key}=${value}" >> "$env_file"
|
|
27
|
-
fi
|
|
28
|
-
else
|
|
29
|
-
# Create the .env file and add the key-value pair
|
|
30
|
-
echo "${key}=${value}" > "$env_file"
|
|
31
|
-
fi
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
current_dir=$(pwd)
|
|
35
|
-
echo "current_dir: $current_dir"
|
|
36
|
-
|
|
37
|
-
# Set up local registry path
|
|
38
|
-
export REGISTRY_PATH=${PWD}/registry
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
# check for sgx compatible machine
|
|
42
|
-
# check if image name is available in smart contract
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
RUNNER_TYPE="nodenithy"
|
|
46
|
-
echo "VERSION = ${VERSION}"
|
|
47
|
-
|
|
48
|
-
cd ${PWD}/node_modules/ethernity-cloud-sdk-js/nodenithy/run
|
|
49
|
-
|
|
50
|
-
echo "ETNY MODE: ${ETNY_MODE}"
|
|
51
|
-
|
|
52
|
-
# Determine MRENCLAVE values
|
|
53
|
-
export MRENCLAVE_SECURELOCK=$(docker-compose run -e SCONE_LOG=INFO -e SCONE_HASH=1 etny-securelock | grep -v Creating | grep -v Pulling | grep -v latest | grep -v Digest | tr -d '\r')
|
|
54
|
-
export MRENCLAVE_TRUSTEDZONE=$(docker-compose run -e SCONE_LOG=INFO -e SCONE_HASH=1 etny-trustedzone | grep -v Creating | grep -v Pulling | grep -v latest | grep -v Digest | tr -d '\r')
|
|
55
|
-
export MRENCLAVE_VALIDATOR=$(docker-compose run -e SCONE_LOG=INFO -e SCONE_HASH=1 etny-validator | grep -v Creating | grep -v Pulling | grep -v latest | grep -v Digest | tr -d '\r')
|
|
56
|
-
|
|
57
|
-
echo "MRENCLAVE_SECURELOCK: ${MRENCLAVE_SECURELOCK}"
|
|
58
|
-
echo "MRENCLAVE_TRUSTEDZONE: ${MRENCLAVE_TRUSTEDZONE}"
|
|
59
|
-
echo "MRENCLAVE_VALIDATOR: ${MRENCLAVE_VALIDATOR}"
|
|
60
|
-
|
|
61
|
-
write_env "MRENCLAVE_SECURELOCK" "${MRENCLAVE_SECURELOCK}"
|
|
62
|
-
write_env "MRENCLAVE_TRUSTEDZONE" "${MRENCLAVE_TRUSTEDZONE}"
|
|
63
|
-
write_env "MRENCLAVE_VALIDATOR" "${MRENCLAVE_VALIDATOR}"
|
|
64
|
-
|
|
65
|
-
export CI_COMMIT_BRANCH = ${PROJECT_NAME}
|
|
66
|
-
# Generate enclave names
|
|
67
|
-
ENCLAVE_NAME_SECURELOCK=$(echo ${ENCLAVE_NAME_SECURELOCK} | awk '{print toupper($0)}' | sed 's#/#_#g' | sed 's#-#_#g')
|
|
68
|
-
PREDECESSOR_NAME_SECURELOCK=$(echo PREDECESSOR_SECURELOCK_${VERSION}_${CI_COMMIT_BRANCH} | awk '{print toupper($0)}' | sed 's#/#_#g' | sed 's#-#_#g')
|
|
69
|
-
|
|
70
|
-
echo
|
|
71
|
-
echo "ENCLAVE_NAME_SECURELOCK: ${ENCLAVE_NAME_SECURELOCK}"
|
|
72
|
-
echo "PREDECESSOR_NAME_SECURELOCK: ${PREDECESSOR_NAME_SECURELOCK}"
|
|
73
|
-
write_env "PREDECESSOR_NAME_SECURELOCK" "${PREDECESSOR_NAME_SECURELOCK}"
|
|
74
|
-
echo
|
|
75
|
-
|
|
76
|
-
export ENCLAVE_NAME_SECURELOCK
|
|
77
|
-
# write_env "ENCLAVE_NAME_SECURELOCK" "${ENCLAVE_NAME_SECURELOCK}"
|
|
78
|
-
|
|
79
|
-
PREDECESSOR_HASH_SECURELOCK=$(eval "echo \${$PREDECESSOR_NAME_SECURELOCK}")
|
|
80
|
-
|
|
81
|
-
# Set default values only if environment variables are not set
|
|
82
|
-
PREDECESSOR_HASH_SECURELOCK=${PREDECESSOR_HASH_SECURELOCK:-"EMPTY"}
|
|
83
|
-
|
|
84
|
-
# Debug: Print environment variables
|
|
85
|
-
echo "PREDECESSOR_HASH_SECURELOCK: ${PREDECESSOR_HASH_SECURELOCK}"
|
|
86
|
-
echo "MRENCLAVE_SECURELOCK: ${MRENCLAVE_SECURELOCK}"
|
|
87
|
-
echo "ENCLAVE_NAME_SECURELOCK: ${ENCLAVE_NAME_SECURELOCK}"
|
|
88
|
-
|
|
89
|
-
# Process etny-securelock-test.yaml
|
|
90
|
-
if [ ! -f etny-securelock-test.yaml.tpl ]; then
|
|
91
|
-
echo "Error: Template file etny-securelock-test.yaml.tpl not found!"
|
|
92
|
-
exit 1
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
if [ "${PREDECESSOR_HASH_SECURELOCK}" = "EMPTY" ]; then
|
|
96
|
-
sed -e "s|__PREDECESSOR__ |#predecessor: ${PREDECESSOR_HASH_SECURELOCK}|g" \
|
|
97
|
-
-e "s|__MRENCLAVE__|${MRENCLAVE_SECURELOCK}|g" \
|
|
98
|
-
-e "s|__ENCLAVE_NAME__|${ENCLAVE_NAME_SECURELOCK}|g" \
|
|
99
|
-
etny-securelock-test.yaml.tpl > etny-securelock-test.yaml
|
|
100
|
-
else
|
|
101
|
-
sed -e "s|__PREDECESSOR__|predecessor: ${PREDECESSOR_HASH_SECURELOCK}|g" \
|
|
102
|
-
-e "s|__MRENCLAVE__|${MRENCLAVE_SECURELOCK}|g" \
|
|
103
|
-
-e "s|__ENCLAVE_NAME__|${ENCLAVE_NAME_SECURELOCK}|g" \
|
|
104
|
-
etny-securelock-test.yaml.tpl > etny-securelock-test.yaml
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
echo "Contents of etny-securelock-test.yaml:"
|
|
108
|
-
cat etny-securelock-test.yaml
|
|
109
|
-
|
|
110
|
-
echo "Checking for remaining placeholders:"
|
|
111
|
-
grep -n "__.*__" etny-securelock-test.yaml || echo "No placeholders found."
|
|
112
|
-
|
|
113
|
-
echo "##############################################################################################################"
|
|
114
|
-
|
|
115
|
-
ENCLAVE_NAME_TRUSTEDZONE=$(echo ${ENCLAVE_NAME_TRUSTEDZONE} | awk '{print toupper($0)}' | sed 's#/#_#g' | sed 's#-#_#g')
|
|
116
|
-
PREDECESSOR_NAME_TRUSTEDZONE=$(echo PREDECESSOR_TRUSTEDZONE_${VERSION}_${CI_COMMIT_BRANCH} | awk '{print toupper($0)}' | sed 's#/#_#g' | sed 's#-#_#g')
|
|
117
|
-
|
|
118
|
-
echo
|
|
119
|
-
echo "ENCLAVE_NAME_TRUSTEDZONE: ${ENCLAVE_NAME_TRUSTEDZONE}"
|
|
120
|
-
echo "PREDECESSOR_NAME_TRUSTEDZONE: ${PREDECESSOR_NAME_TRUSTEDZONE}"
|
|
121
|
-
echo
|
|
122
|
-
|
|
123
|
-
export ENCLAVE_NAME_TRUSTEDZONE
|
|
124
|
-
# write_env "ENCLAVE_NAME_TRUSTEDZONE" "${ENCLAVE_NAME_TRUSTEDZONE}"
|
|
125
|
-
|
|
126
|
-
PREDECESSOR_HASH_TRUSTEDZONE=$(eval "echo \${$PREDECESSOR_NAME_TRUSTEDZONE}")
|
|
127
|
-
PREDECESSOR_HASH_TRUSTEDZONE=${PREDECESSOR_HASH_TRUSTEDZONE:-"EMPTY"}
|
|
128
|
-
|
|
129
|
-
# Debug: Print environment variables
|
|
130
|
-
echo "PREDECESSOR_HASH_TRUSTEDZONE: ${PREDECESSOR_HASH_TRUSTEDZONE}"
|
|
131
|
-
echo "MRENCLAVE_TRUSTEDZONE: ${MRENCLAVE_TRUSTEDZONE}"
|
|
132
|
-
echo "MRENCLAVE_VALIDATOR: ${MRENCLAVE_VALIDATOR}"
|
|
133
|
-
echo "ENCLAVE_NAME_TRUSTEDZONE: ${ENCLAVE_NAME_TRUSTEDZONE}"
|
|
134
|
-
|
|
135
|
-
# Process etny-trustedzone-test.yaml
|
|
136
|
-
if [ ! -f etny-trustedzone-test.yaml.tpl ]; then
|
|
137
|
-
echo "Error: Template file etny-trustedzone-test.yaml.tpl not found!"
|
|
138
|
-
exit 1
|
|
139
|
-
fi
|
|
140
|
-
|
|
141
|
-
if [ "${PREDECESSOR_HASH_TRUSTEDZONE}" = "EMPTY" ]; then
|
|
142
|
-
sed -e "s|__PREDECESSOR__|# predecessor: ${PREDECESSOR_HASH_TRUSTEDZONE}|g" \
|
|
143
|
-
-e "s|__MRENCLAVE__|${MRENCLAVE_TRUSTEDZONE}|g" \
|
|
144
|
-
-e "s|__MRENCLAVE_VALIDATOR__|${MRENCLAVE_VALIDATOR}|g" \
|
|
145
|
-
-e "s|__ENCLAVE_NAME__|${ENCLAVE_NAME_TRUSTEDZONE}|g" \
|
|
146
|
-
etny-trustedzone-test.yaml.tpl > etny-trustedzone-test.yaml
|
|
147
|
-
else
|
|
148
|
-
sed -e "s|__PREDECESSOR__|predecessor: ${PREDECESSOR_HASH_TRUSTEDZONE}|g" \
|
|
149
|
-
-e "s|__MRENCLAVE__|${MRENCLAVE_TRUSTEDZONE}|g" \
|
|
150
|
-
-e "s|__MRENCLAVE_VALIDATOR__|${MRENCLAVE_VALIDATOR}|g" \
|
|
151
|
-
-e "s|__ENCLAVE_NAME__|${ENCLAVE_NAME_TRUSTEDZONE}|g" \
|
|
152
|
-
etny-trustedzone-test.yaml.tpl > etny-trustedzone-test.yaml
|
|
153
|
-
fi
|
|
154
|
-
|
|
155
|
-
echo "Contents of etny-trustedzone-test.yaml:"
|
|
156
|
-
cat etny-trustedzone-test.yaml
|
|
157
|
-
|
|
158
|
-
echo "Checking for remaining placeholders:"
|
|
159
|
-
grep -n "__.*__" etny-trustedzone-test.yaml || echo "No placeholders found."
|
|
160
|
-
|
|
161
|
-
echo "# Update docker-compose files"
|
|
162
|
-
|
|
163
|
-
# Update docker-compose files
|
|
164
|
-
for file in docker-compose.yml docker-compose-final.yml; do
|
|
165
|
-
if [ ! -f "$file" ]; then
|
|
166
|
-
echo "Error: $file not found!"
|
|
167
|
-
continue
|
|
168
|
-
fi
|
|
169
|
-
|
|
170
|
-
echo "Processing $file"
|
|
171
|
-
echo "ENCLAVE_NAME_SECURELOCK: ${ENCLAVE_NAME_SECURELOCK}"
|
|
172
|
-
echo "ENCLAVE_NAME_TRUSTEDZONE: ${ENCLAVE_NAME_TRUSTEDZONE}"
|
|
173
|
-
|
|
174
|
-
echo "Checking for placeholders before replacement:"
|
|
175
|
-
grep "__ENCLAVE_NAME_SECURELOCK__" "$file" || echo "No __ENCLAVE_NAME_SECURELOCK__ found in $file"
|
|
176
|
-
grep "__ENCLAVE_NAME_TRUSTEDZONE__" "$file" || echo "No __ENCLAVE_NAME_TRUSTEDZONE__ found in $file"
|
|
177
|
-
|
|
178
|
-
sed -i '' -e "s|__ENCLAVE_NAME_SECURELOCK__|${ENCLAVE_NAME_SECURELOCK}|g" \
|
|
179
|
-
-e "s|__ENCLAVE_NAME_TRUSTEDZONE__|${ENCLAVE_NAME_TRUSTEDZONE}|g" \
|
|
180
|
-
"$file"
|
|
181
|
-
|
|
182
|
-
echo "Checking for placeholders after replacement:"
|
|
183
|
-
grep "__ENCLAVE_NAME_SECURELOCK__" "$file" || echo "No __ENCLAVE_NAME_SECURELOCK__ found in $file"
|
|
184
|
-
grep "__ENCLAVE_NAME_TRUSTEDZONE__" "$file" || echo "No __ENCLAVE_NAME_TRUSTEDZONE__ found in $file"
|
|
185
|
-
|
|
186
|
-
echo "Contents of $file:"
|
|
187
|
-
cat "$file"
|
|
188
|
-
echo
|
|
189
|
-
done
|
|
190
|
-
|
|
191
|
-
# export binaries hashes from scontain base image (node/python)
|
|
192
|
-
# use them allong with the ipfs hash of the uploaded registry artefact
|
|
193
|
-
|
|
194
|
-
# Get PUBLIC_KEY for SECURELOCK
|
|
195
|
-
export PUBLIC_KEY_SECURELOCK_RES=$(docker-compose run etny-securelock | grep -v Creating | grep -v Pulling | grep -v latest | grep -v Digest | sed 's/.*PUBLIC_KEY:\s*//' | tr -d '\r')
|
|
196
|
-
|
|
197
|
-
echo "PUBLIC_KEY_SECURELOCK_RES: ${PUBLIC_KEY_SECURELOCK_RES}"
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
# Check if PUBLIC_KEY_SECURELOCK_RES is empty
|
|
201
|
-
if [ -z "${PUBLIC_KEY_SECURELOCK_RES}" ]; then
|
|
202
|
-
echo
|
|
203
|
-
echo
|
|
204
|
-
echo "It seams that your machine is not SGX compatible."
|
|
205
|
-
echo
|
|
206
|
-
echo "Do you want to continue by generating the necesary certificates using the Ethernity Cloud signing service? (yes/no)"
|
|
207
|
-
read -p "Select an option (default is no): " REPLY
|
|
208
|
-
if [[ -z "$REPLY" ]]; then
|
|
209
|
-
echo "No option selected. Exiting."
|
|
210
|
-
exit 1
|
|
211
|
-
elif [[ "$REPLY" == "yes" ]]; then
|
|
212
|
-
echo
|
|
213
|
-
echo "Generating certificates using the Ethernity Cloud signing service..."
|
|
214
|
-
echo
|
|
215
|
-
echo "**** Started ipfs initial pining ****"
|
|
216
|
-
if [ -f ipfs.sh ]; then
|
|
217
|
-
chmod +x ipfs_pre.sh
|
|
218
|
-
./ipfs_pre.sh
|
|
219
|
-
else
|
|
220
|
-
echo "Warning: ipfs_pre.sh not found. Skipping IPFS setup."
|
|
221
|
-
fi
|
|
222
|
-
echo "**** Finished ipfs initial pining ****"
|
|
223
|
-
echo "ENCLAVE_NAME_SECURELOCK: ${ENCLAVE_NAME_SECURELOCK}"
|
|
224
|
-
echo "VERSION: ${VERSION}"
|
|
225
|
-
echo "BLOCKCHAIN_NETWORK: ${BLOCKCHAIN_NETWORK}"
|
|
226
|
-
python3 ./public_key_service.py --enclave_name "${PROJECT_NAME}" --protocol_version "${VERSION}" --network "${BLOCKCHAIN_NETWORK}" --template_version "0.1.12"
|
|
227
|
-
# read PUBLIC_KEY_SECURELOCK_RES from PUBLIC_KEY.txt
|
|
228
|
-
PUBLIC_KEY_SECURELOCK_RES=$(cat PUBLIC_KEY.txt)
|
|
229
|
-
else
|
|
230
|
-
echo "Exiting."
|
|
231
|
-
exit 1
|
|
232
|
-
fi
|
|
233
|
-
fi
|
|
234
|
-
|
|
235
|
-
export CERTIFICATE_CONTENT_SECURELOCK=$(echo "${PUBLIC_KEY_SECURELOCK_RES}" | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | sed -e '/-----BEGIN CERTIFICATE-----/d' -e '/-----END CERTIFICATE-----/d')
|
|
236
|
-
if [ -z "${CERTIFICATE_CONTENT_SECURELOCK}" ]; then
|
|
237
|
-
echo "ERROR! PUBLIC_KEY_SECURELOCK not found"
|
|
238
|
-
exit 1
|
|
239
|
-
else
|
|
240
|
-
echo "FOUND PUBLIC_KEY_SECURELOCK"
|
|
241
|
-
fi
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
echo -e "${PUBLIC_KEY_SECURELOCK}" > certificate.securelock.crt
|
|
246
|
-
echo "Listing certificate PUBLIC_KEY_SECURELOCK:"
|
|
247
|
-
cat certificate.securelock.crt
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
CERTIFICATE_CONTENT_TRUSTEDZONE="MIIBczCB+6ADAgECAgkAkZLVvEgT6QgwCgYIKoZIzj0EAwMwEjEQMA4GA1UEAwwHQ0FfQ0VSVDAgFw0yNDA2MDUwODEyMjhaGA80MDk2MDEwMTAwMDAwMFowFjEUMBIGA1UEAwwLU0VSVkVSX0NFUlQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARuZILgRDczZfYdvx+GP3MMNKWX0SsUYkG3ySN/lJL0iEm/rgjoLDRT2gV8p+xfzeGPqzAjL/6/5N7JLjKdmzMCSi0umbFKIzV1UOBQMoTye8Kq9pmrZSKW/gcDeg2tDb+jFzAVMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAoGCCqGSM49BAMDA2cAMGQCMDjiF3lBtlj+AiPu7k4AiaPcluAk8V7AFrKpNwfLCsmR8iSkjKuhMSWN0+Y1htUg+wIwVSY9CI8vbUJYWvOCd7n5IjLq2G0SF8Kw9k5BmX6XucnZxHc9dFgLm+6pcpuQg3YG"
|
|
251
|
-
export PUBLIC_KEY_TRUSTEDZONE="-----BEGIN CERTIFICATE-----\n${CERTIFICATE_CONTENT_TRUSTEDZONE}\n-----END CERTIFICATE-----"
|
|
252
|
-
echo -e "${PUBLIC_KEY_TRUSTEDZONE}" > certificate.trustedzone.crt
|
|
253
|
-
echo "Listing certificate PUBLIC_KEY_TRUSTEDZONE:"
|
|
254
|
-
cat certificate.trustedzone.crt
|
|
255
|
-
|
|
256
|
-
echo "**** Started ipfs final ****"
|
|
257
|
-
if [ -f ipfs.sh ]; then
|
|
258
|
-
chmod +x ipfs.sh
|
|
259
|
-
./ipfs.sh
|
|
260
|
-
else
|
|
261
|
-
echo "Warning: ipfs.sh not found. Skipping IPFS setup."
|
|
262
|
-
fi
|
|
263
|
-
echo "**** Finished ipfs final ****"
|
|
264
|
-
|
|
265
|
-
echo "Adding certificates for SECURELOCK into IMAGE REGISTRY smart contract..."
|
|
266
|
-
if [ -f image_registry_runner.py ]; then
|
|
267
|
-
brew install python3
|
|
268
|
-
python3 -m venv venv
|
|
269
|
-
source venv/bin/activate
|
|
270
|
-
pip3 install --no-cache --upgrade pip minio web3==5.17.0 eth_account python-dotenv requests
|
|
271
|
-
python3 image_registry_runner.py
|
|
272
|
-
deactivate
|
|
273
|
-
else
|
|
274
|
-
echo "Warning: image_registry_runner.py not found. Skipping certificate addition to IMAGE REGISTRY smart contract."
|
|
275
|
-
fi
|
|
276
|
-
|
|
277
|
-
echo "Script completed successfully."
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
|
|
3
|
-
apk add screen
|
|
4
|
-
|
|
5
|
-
cd /
|
|
6
|
-
wget https://github.com/ipfs/kubo/releases/download/v0.17.0/kubo_v0.17.0_linux-386.tar.gz
|
|
7
|
-
tar zxvf kubo_v0.17.0_linux-386.tar.gz
|
|
8
|
-
mv kubo go-ipfs
|
|
9
|
-
cd go-ipfs
|
|
10
|
-
./ipfs init
|
|
11
|
-
|
|
12
|
-
screen -dm -t ipfs-swarm watch /go-ipfs/ipfs swarm connect /ip4/31.7.188.59/tcp/4001/p2p/QmRBc1eBt4hpJQUqHqn6eA8ixQPD3LFcUDsn6coKBQtia5
|
|
13
|
-
|
|
14
|
-
screen -dm -t ipfs-daemon /ipfs-daemon.sh
|
|
15
|
-
|
|
16
|
-
sleep 10
|
|
17
|
-
|
|
18
|
-
cd /var/lib/registry
|
|
19
|
-
HASH=`/go-ipfs/ipfs add . -r | grep added | tail -1 | awk '{print $2}'`
|
|
20
|
-
/go-ipfs/ipfs pin add ${HASH}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
echo "HASH is ${HASH}"
|