ovtools 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +121 -2
- package/assets/common/bond-inspect.sh +368 -0
- package/assets/common/config.sh +263 -0
- package/assets/common/extract-data.sh +197 -0
- package/assets/common/harden-host.sh +37 -0
- package/assets/common/install-deps.sh +93 -0
- package/assets/common/node-enroll.sh +65 -0
- package/assets/common/node-setup.sh +150 -0
- package/assets/common/node-start.sh +90 -0
- package/assets/common/node-stop.sh +18 -0
- package/assets/common/node-upgrade.sh +45 -0
- package/assets/common/pre-run.sh +497 -0
- package/assets/common/promote-validator.sh +104 -0
- package/assets/deploy/10-prepare-host.sh +98 -0
- package/assets/deploy/20-install-toolchain.sh +93 -0
- package/assets/deploy/30-setup-node.sh +82 -0
- package/assets/deploy/40-start-node.sh +75 -0
- package/assets/deploy/50-verify.sh +259 -0
- package/assets/deploy/60-enroll.sh +304 -0
- package/assets/deploy/70-promote.sh +152 -0
- package/assets/deploy/lib.sh +398 -0
- package/assets/manage/10-bond-increase.sh +149 -0
- package/assets/manage/10-diagnose-node.sh +169 -0
- package/assets/manage/20-exit-validator.sh +259 -0
- package/assets/manage/25-recover-node.sh +291 -0
- package/assets/manage/30-status.sh +64 -0
- package/assets/manage/40-exit-withdraw.sh +133 -0
- package/assets/manage/bond_inc.sh +318 -0
- package/assets/manage/dashboard_monitor/app.js +1544 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/base.css +113 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/content.css +133 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/controls.css +229 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/data.css +374 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/icons.css +35 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/motion.css +57 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/shell.css +51 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/sidebar.css +242 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/topbar.css +138 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/fonts.css +30 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/synteq-ui-v2.css +25 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-dark.css +38 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-light.css +36 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/tokens.css +61 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/js/synteq-ui-v2.js +869 -0
- package/assets/manage/dashboard_monitor/deploy-dashboard.sh +230 -0
- package/assets/manage/dashboard_monitor/favicon.svg +13 -0
- package/assets/manage/dashboard_monitor/index.html +1197 -0
- package/assets/manage/dashboard_monitor/nginx-octra.conf +76 -0
- package/assets/manage/dashboard_monitor/octra-dashboard.service +29 -0
- package/assets/manage/dashboard_monitor/octra-node-prune.cron +12 -0
- package/assets/manage/dashboard_monitor/octra-node-prune.service +16 -0
- package/assets/manage/dashboard_monitor/octra-node-prune.timer +12 -0
- package/assets/manage/dashboard_monitor/prune-node-junk.sh +329 -0
- package/assets/manage/dashboard_monitor/server.py +1887 -0
- package/assets/manage/dashboard_monitor/ssl-certbot.sh +90 -0
- package/assets/manage/dashboard_monitor/styles.css +327 -0
- package/assets/manage/lib.sh +347 -0
- package/assets/manifest.json +143 -0
- package/assets/migrate/00-backup-identity.sh +67 -0
- package/assets/migrate/01-prepare-target.sh +145 -0
- package/assets/migrate/02-authorize-pull.sh +43 -0
- package/assets/migrate/03-pull-state.sh +102 -0
- package/assets/migrate/04-stop-source.sh +85 -0
- package/assets/migrate/05-finalize-target.sh +140 -0
- package/assets/migrate/06-start-target.sh +57 -0
- package/assets/migrate/07-verify.sh +237 -0
- package/assets/migrate/08-rollback.sh +54 -0
- package/assets/migrate/lib.sh +149 -0
- package/assets/upgrade/10-preflight.sh +120 -0
- package/assets/upgrade/20-upgrade.sh +142 -0
- package/assets/upgrade/30-manual-upgrade.sh +129 -0
- package/assets/upgrade/40-storage-prune.sh +65 -0
- package/assets/upgrade/50-status.sh +58 -0
- package/assets/upgrade/lib.sh +232 -0
- package/bin/ovtools.js +32 -0
- package/dist/api/checks.d.ts +6 -0
- package/dist/api/checks.d.ts.map +1 -0
- package/dist/api/checks.js +173 -0
- package/dist/api/checks.js.map +1 -0
- package/dist/api/hostkeys.d.ts +10 -0
- package/dist/api/hostkeys.d.ts.map +1 -0
- package/dist/api/hostkeys.js +58 -0
- package/dist/api/hostkeys.js.map +1 -0
- package/dist/api/jobs.d.ts +33 -0
- package/dist/api/jobs.d.ts.map +1 -0
- package/dist/api/jobs.js +483 -0
- package/dist/api/jobs.js.map +1 -0
- package/dist/api/nodes.d.ts +16 -0
- package/dist/api/nodes.d.ts.map +1 -0
- package/dist/api/nodes.js +126 -0
- package/dist/api/nodes.js.map +1 -0
- package/dist/api/server.d.ts +3 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +443 -0
- package/dist/api/server.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +301 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +76 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +150 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/base.d.ts +52 -0
- package/dist/orchestrator/base.d.ts.map +1 -0
- package/dist/orchestrator/base.js +219 -0
- package/dist/orchestrator/base.js.map +1 -0
- package/dist/orchestrator/deploy.d.ts +33 -0
- package/dist/orchestrator/deploy.d.ts.map +1 -0
- package/dist/orchestrator/deploy.js +313 -0
- package/dist/orchestrator/deploy.js.map +1 -0
- package/dist/orchestrator/manage.d.ts +28 -0
- package/dist/orchestrator/manage.d.ts.map +1 -0
- package/dist/orchestrator/manage.js +267 -0
- package/dist/orchestrator/manage.js.map +1 -0
- package/dist/orchestrator/migrate.d.ts +31 -0
- package/dist/orchestrator/migrate.d.ts.map +1 -0
- package/dist/orchestrator/migrate.js +442 -0
- package/dist/orchestrator/migrate.js.map +1 -0
- package/dist/ssh/client.d.ts +39 -0
- package/dist/ssh/client.d.ts.map +1 -0
- package/dist/ssh/client.js +418 -0
- package/dist/ssh/client.js.map +1 -0
- package/dist/test/core.test.d.ts +2 -0
- package/dist/test/core.test.d.ts.map +1 -0
- package/dist/test/core.test.js +188 -0
- package/dist/test/core.test.js.map +1 -0
- package/dist/types.d.ts +267 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/assets.d.ts +28 -0
- package/dist/utils/assets.d.ts.map +1 -0
- package/dist/utils/assets.js +583 -0
- package/dist/utils/assets.js.map +1 -0
- package/dist/utils/browser.d.ts +2 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +23 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/dashboard.d.ts +16 -0
- package/dist/utils/dashboard.d.ts.map +1 -0
- package/dist/utils/dashboard.js +177 -0
- package/dist/utils/dashboard.js.map +1 -0
- package/dist/utils/helpers.d.ts +29 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +204 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/scripts.d.ts +60 -0
- package/dist/utils/scripts.d.ts.map +1 -0
- package/dist/utils/scripts.js +174 -0
- package/dist/utils/scripts.js.map +1 -0
- package/dist/utils/state.d.ts +12 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +44 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/tar.d.ts +11 -0
- package/dist/utils/tar.d.ts.map +1 -0
- package/dist/utils/tar.js +93 -0
- package/dist/utils/tar.js.map +1 -0
- package/dist/utils/update.d.ts +9 -0
- package/dist/utils/update.d.ts.map +1 -0
- package/dist/utils/update.js +134 -0
- package/dist/utils/update.js.map +1 -0
- package/dist/utils/websocket.d.ts +10 -0
- package/dist/utils/websocket.d.ts.map +1 -0
- package/dist/utils/websocket.js +203 -0
- package/dist/utils/websocket.js.map +1 -0
- package/package.json +55 -4
- package/public/app.js +2712 -0
- package/public/assets/v2.2/css/base.css +113 -0
- package/public/assets/v2.2/css/components/content.css +133 -0
- package/public/assets/v2.2/css/components/controls.css +229 -0
- package/public/assets/v2.2/css/components/data.css +373 -0
- package/public/assets/v2.2/css/components/icons.css +35 -0
- package/public/assets/v2.2/css/components/motion.css +57 -0
- package/public/assets/v2.2/css/components/shell.css +51 -0
- package/public/assets/v2.2/css/components/sidebar.css +242 -0
- package/public/assets/v2.2/css/components/topbar.css +138 -0
- package/public/assets/v2.2/css/fonts.css +30 -0
- package/public/assets/v2.2/css/synteq-ui-v2.css +25 -0
- package/public/assets/v2.2/css/theme-dark.css +38 -0
- package/public/assets/v2.2/css/theme-light.css +36 -0
- package/public/assets/v2.2/css/tokens.css +61 -0
- package/public/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
- package/public/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
- package/public/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
- package/public/assets/v2.2/js/synteq-ui-v2.js +869 -0
- package/public/favicon.svg +7 -0
- package/public/index.html +1080 -0
- package/public/styles.css +552 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ===================================================================
|
|
3
|
+
# node-setup.sh — configure the Octra lite_node
|
|
4
|
+
#
|
|
5
|
+
# Two-step validator setup (by design — Octra protocol requirement):
|
|
6
|
+
#
|
|
7
|
+
# STEP 1 (first run): --role observer
|
|
8
|
+
# Run this on a fresh node. Builds binary, syncs 38 GB state,
|
|
9
|
+
# generates wallet.json + node.env.
|
|
10
|
+
# Then start the node, fund the wallet, and call node-enroll.sh.
|
|
11
|
+
#
|
|
12
|
+
# STEP 2 (after bond is ready): --role validator
|
|
13
|
+
# Once enrollment state = "ready" (validator_scheduled or
|
|
14
|
+
# validator_active = true via stat.sh), run this script again
|
|
15
|
+
# with ROLE=validator to reconfigure node.env, then restart.
|
|
16
|
+
# The promote-validator.sh watcher handles this automatically.
|
|
17
|
+
#
|
|
18
|
+
# Usage:
|
|
19
|
+
# sudo bash node-setup.sh # interactive (asks role)
|
|
20
|
+
# sudo ROLE=observer PUBLIC_HOST=1.2.3.4 NODE_NAME=mynode bash node-setup.sh
|
|
21
|
+
# sudo ROLE=validator PUBLIC_HOST=1.2.3.4 NODE_NAME=mynode bash node-setup.sh
|
|
22
|
+
#
|
|
23
|
+
# ROLE defaults to 'observer' for first-time setup.
|
|
24
|
+
# Set ROLE=validator only after enrollment state = ready.
|
|
25
|
+
# ===================================================================
|
|
26
|
+
|
|
27
|
+
set -euo pipefail
|
|
28
|
+
source "$(dirname "$0")/config.sh"
|
|
29
|
+
|
|
30
|
+
if [[ $EUID -ne 0 ]]; then
|
|
31
|
+
err "Run as root: sudo bash $0"
|
|
32
|
+
exit 1
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# --- Gather inputs -------------------------------------------------
|
|
36
|
+
PUBLIC_HOST="${PUBLIC_HOST:-}"
|
|
37
|
+
NODE_NAME="${NODE_NAME:-}"
|
|
38
|
+
ROLE="${ROLE:-observer}"
|
|
39
|
+
|
|
40
|
+
if [[ -z "${PUBLIC_HOST}" ]]; then
|
|
41
|
+
PUBLIC_HOST=$(curl -s --max-time 5 https://api.ipify.org 2>/dev/null || hostname -I | awk '{print $1}')
|
|
42
|
+
warn "PUBLIC_HOST not set — auto-detected: ${PUBLIC_HOST}"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
if [[ -z "${NODE_NAME}" ]]; then
|
|
46
|
+
NODE_NAME="octra-node-$(hostname)"
|
|
47
|
+
warn "NODE_NAME not set — using: ${NODE_NAME}"
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
if [[ "${ROLE}" != "observer" && "${ROLE}" != "validator" ]]; then
|
|
51
|
+
err "ROLE must be 'observer' or 'validator', got: ${ROLE}"
|
|
52
|
+
exit 1
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# --- Warn if switching to validator before membership is ready -----
|
|
56
|
+
if [[ "${ROLE}" == "validator" ]]; then
|
|
57
|
+
log "Checking validator membership before reconfiguring…"
|
|
58
|
+
MEMBERSHIP=$(su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && sh controls/stat.sh 2>/dev/null" 2>/dev/null | \
|
|
59
|
+
grep -E '^(validator_active|validator_scheduled|validator_enrollment)' || true)
|
|
60
|
+
ACTIVE=$(echo "${MEMBERSHIP}" | grep '^validator_active' | awk -F' = ' '{print $2}')
|
|
61
|
+
SCHEDULED=$(echo "${MEMBERSHIP}" | grep '^validator_scheduled' | awk -F' = ' '{print $2}')
|
|
62
|
+
ENROLL=$(echo "${MEMBERSHIP}" | grep '^validator_enrollment' | awk -F' = ' '{print $2}')
|
|
63
|
+
|
|
64
|
+
if [[ "${ACTIVE}" != "true" && "${SCHEDULED}" != "true" ]]; then
|
|
65
|
+
err "Cannot set ROLE=validator: membership not yet active or scheduled"
|
|
66
|
+
warn "Current enrollment: ${ENROLL:-unknown}"
|
|
67
|
+
warn "Run 'sh controls/stat.sh' and wait until validator_active or validator_scheduled = true"
|
|
68
|
+
exit 1
|
|
69
|
+
fi
|
|
70
|
+
log "Membership confirmed (active=${ACTIVE} scheduled=${SCHEDULED}) — proceeding with validator config"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
log "Configuring node:"
|
|
74
|
+
echo " Role: ${ROLE}"
|
|
75
|
+
echo " Host: ${PUBLIC_HOST}"
|
|
76
|
+
echo " Name: ${NODE_NAME}"
|
|
77
|
+
echo " API port: ${API_PORT}"
|
|
78
|
+
echo " Consensus: ${CONSENSUS_PORT}"
|
|
79
|
+
echo " P2P: ${P2P_PORT}"
|
|
80
|
+
echo " Data dir: ${NODE_DATA_DIR}"
|
|
81
|
+
|
|
82
|
+
# --- Ensure data directories exist --------------------------------
|
|
83
|
+
mkdir -p "${NODE_DATA_DIR}" "${NODE_SYNC_STAGE}"
|
|
84
|
+
chown -R "${NODE_USER}:${NODE_USER}" "${NODE_DATA_ROOT}"
|
|
85
|
+
|
|
86
|
+
# --- Verify network.env sha256 ------------------------------------
|
|
87
|
+
(cd "${NODE_SRC_DIR}" && sha256sum -c config/network.env.sha256)
|
|
88
|
+
NETWORK_SHA=$(awk '{print $1}' "${NODE_SRC_DIR}/config/network.env.sha256")
|
|
89
|
+
|
|
90
|
+
# config_val.sh runs `opam switch link <switch> <repo>` and opam 2.3 cannot
|
|
91
|
+
# re-create an existing <repo>/_opam: it dies with «"rmdir" failed ... Not a
|
|
92
|
+
# directory» AND the failed call empties the switch prefix, which throws away the
|
|
93
|
+
# whole build (seen 2026-11-02). install.sh already created that link, so drop it
|
|
94
|
+
# here and let config_val.sh create it again - the switch itself is untouched.
|
|
95
|
+
unlink_ocaml_switch_link "config_val.sh runs opam switch link next"
|
|
96
|
+
# --- Run config_val.sh -------------------------------------------
|
|
97
|
+
log "Running config_val.sh (role=${ROLE})…"
|
|
98
|
+
|
|
99
|
+
# For observer (first run): include --build and --sync
|
|
100
|
+
# For validator (re-config): skip both — binary + data already present
|
|
101
|
+
if [[ "${ROLE}" == "observer" ]]; then
|
|
102
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && \
|
|
103
|
+
sh controls/config_val.sh \
|
|
104
|
+
--role observer \
|
|
105
|
+
--name '${NODE_NAME}' \
|
|
106
|
+
--advertise '${PUBLIC_HOST}:${CONSENSUS_PORT}' \
|
|
107
|
+
--api-port ${API_PORT} \
|
|
108
|
+
--consensus-port ${CONSENSUS_PORT} \
|
|
109
|
+
--p2p-port ${P2P_PORT} \
|
|
110
|
+
--data-dir ${NODE_DATA_DIR} \
|
|
111
|
+
--sync-stage ${NODE_SYNC_STAGE} \
|
|
112
|
+
--network config/network.env \
|
|
113
|
+
--network-sha '${NETWORK_SHA}' \
|
|
114
|
+
--build \
|
|
115
|
+
--sync \
|
|
116
|
+
--yes"
|
|
117
|
+
else
|
|
118
|
+
# Validator re-config — node must be STOPPED before running this.
|
|
119
|
+
# We patch node.env directly (bypasses config_val.py's RPC membership check
|
|
120
|
+
# which fails when the node is stopped). Only two fields change:
|
|
121
|
+
# OCTRA_OPERATOR_ROLE: observer → validator
|
|
122
|
+
# OCTRA_CONSENSUS_MODE: observer → bft
|
|
123
|
+
NODE_ENV="${NODE_SRC_DIR}/.keys/validator/node.env"
|
|
124
|
+
if [[ ! -f "${NODE_ENV}" ]]; then
|
|
125
|
+
err "node.env not found — run observer setup first"
|
|
126
|
+
exit 1
|
|
127
|
+
fi
|
|
128
|
+
cp "${NODE_ENV}" "${NODE_ENV}.observer.bak"
|
|
129
|
+
sed -i "s/^OCTRA_OPERATOR_ROLE=.*/OCTRA_OPERATOR_ROLE=validator/" "${NODE_ENV}"
|
|
130
|
+
sed -i "s/^OCTRA_CONSENSUS_MODE=.*/OCTRA_CONSENSUS_MODE=bft/" "${NODE_ENV}"
|
|
131
|
+
log "node.env patched: ROLE=$(grep '^OCTRA_OPERATOR_ROLE=' "${NODE_ENV}" | cut -d= -f2)"
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
log "Node configured as ${ROLE}."
|
|
135
|
+
echo " ${NODE_SRC_DIR}/.keys/validator/node.env — node config"
|
|
136
|
+
echo " ${NODE_SRC_DIR}/.keys/validator/wallet.json — validator wallet"
|
|
137
|
+
echo " ${NODE_DATA_DIR}/ — blockchain data"
|
|
138
|
+
echo
|
|
139
|
+
|
|
140
|
+
if [[ "${ROLE}" == "observer" ]]; then
|
|
141
|
+
log "Next steps:"
|
|
142
|
+
echo " 1. Start node: bash node-start.sh"
|
|
143
|
+
echo " 2. Fund wallet: topup address in wallet.json"
|
|
144
|
+
echo " 3. Enroll: bash node-enroll.sh join 1000000"
|
|
145
|
+
echo " 4. Wait for: validator_scheduled = true (check: sh controls/stat.sh)"
|
|
146
|
+
echo " 5. Promote: sudo ROLE=validator bash node-setup.sh && bash node-start.sh"
|
|
147
|
+
else
|
|
148
|
+
log "Validator config applied. Restart the node to activate:"
|
|
149
|
+
echo " bash node-start.sh"
|
|
150
|
+
fi
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ===================================================================
|
|
3
|
+
# node-start.sh — start the Octra lite_node and check status
|
|
4
|
+
#
|
|
5
|
+
# Usage: sudo bash node-start.sh
|
|
6
|
+
# Idempotent — checks if already running before starting.
|
|
7
|
+
# ===================================================================
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
source "$(dirname "$0")/config.sh"
|
|
11
|
+
|
|
12
|
+
if [[ $EUID -ne 0 ]]; then
|
|
13
|
+
err "Run as root: sudo bash $0"
|
|
14
|
+
exit 1
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
log "Starting Octra lite_node…"
|
|
18
|
+
|
|
19
|
+
# --- is the node really online under pm2? ----------------------------
|
|
20
|
+
# `pm2 pid <name>` is NOT a reliable probe: when the name does not exist (or the
|
|
21
|
+
# pm2 daemon still has to be spawned) it prints a banner or a table separator
|
|
22
|
+
# ("-------------"), and the old check took any non-empty line as a PID - so this
|
|
23
|
+
# script reported "Node already running (PID -------------)", never started the
|
|
24
|
+
# node, and the deploy waited 30 minutes for an rpc that could never answer
|
|
25
|
+
# (2026-11-02). The JSON process list only reports processes that exist, and the
|
|
26
|
+
# pid must be a number.
|
|
27
|
+
pm2_online_pid() { # pm2_online_pid [<pm2 name hint>]
|
|
28
|
+
local want="${1:-}" json pid node_env
|
|
29
|
+
# the name the node really uses is in node.env (OCTRA_OPERATOR_PM2_NAME); the
|
|
30
|
+
# hint is only a fallback, and any "octra*" pm2 process counts as our node
|
|
31
|
+
node_env="${NODE_ENV:-${NODE_SRC_DIR}/.keys/validator/node.env}"
|
|
32
|
+
if [[ -f "${node_env}" ]]; then
|
|
33
|
+
want=$(grep -m1 '^OCTRA_OPERATOR_PM2_NAME=' "${node_env}" 2>/dev/null | cut -d= -f2- || true)
|
|
34
|
+
want="${want:-${1:-}}"
|
|
35
|
+
fi
|
|
36
|
+
if command -v jq >/dev/null 2>&1; then
|
|
37
|
+
json=$(su - "${NODE_USER}" -c "pm2 jlist" 2>/dev/null || true)
|
|
38
|
+
pid=$(printf '%s' "${json}" | jq -r --arg want "${want}" \
|
|
39
|
+
'.[]? | select(.pm2_env.status == "online")
|
|
40
|
+
| select($want == "" or (.name | startswith($want)) or (.name | startswith("octra")))
|
|
41
|
+
| .pid' 2>/dev/null | head -1)
|
|
42
|
+
if [[ -n "${pid}" && "${pid}" != "null" ]]; then
|
|
43
|
+
printf '%s\n' "${pid}"
|
|
44
|
+
return 0
|
|
45
|
+
fi
|
|
46
|
+
fi
|
|
47
|
+
# no jq (or pm2 not answering): the node process itself is proof enough
|
|
48
|
+
pgrep -f '[o]ctra_node\.exe' | head -1
|
|
49
|
+
return 0
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
node_log_tail() { # node_log_tail [<lines>]
|
|
53
|
+
local lines="${1:-20}" logdir
|
|
54
|
+
logdir=$(su - "${NODE_USER}" -c "grep -m1 '^OCTRA_OPERATOR_LOG_DIR=' ${NODE_SRC_DIR}/.keys/validator/node.env" 2>/dev/null \
|
|
55
|
+
| cut -d= -f2- || true)
|
|
56
|
+
logdir="${logdir:-${NODE_SRC_DIR}/data}"
|
|
57
|
+
tail -n "${lines}" "${logdir}/node.log" 2>/dev/null | sed 's/^/ /' || true
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
RUNNING=$(pm2_online_pid "${NODE_PM2_NAME:-octra-node-1}")
|
|
61
|
+
if [[ -n "${RUNNING}" ]]; then
|
|
62
|
+
warn "Node already running (PID ${RUNNING}) - not starting it twice"
|
|
63
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && sh controls/stat.sh" || true
|
|
64
|
+
exit 0
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# Start the node
|
|
68
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && sh controls/run.sh"
|
|
69
|
+
|
|
70
|
+
sleep 3
|
|
71
|
+
|
|
72
|
+
# --- the node must really be running now -----------------------------
|
|
73
|
+
# Say it HERE, with the node's own log, instead of letting the deploy step wait
|
|
74
|
+
# half an hour for an rpc that will never come.
|
|
75
|
+
RUNNING=$(pm2_online_pid "${NODE_PM2_NAME:-octra-node-1}")
|
|
76
|
+
if [[ -z "${RUNNING}" ]]; then
|
|
77
|
+
err "the node did not come up under pm2 (no online process) - node log:"
|
|
78
|
+
node_log_tail 20
|
|
79
|
+
err "pm2 list:"
|
|
80
|
+
su - "${NODE_USER}" -c "pm2 list" 2>/dev/null | sed 's/^/ /' || true
|
|
81
|
+
exit 1
|
|
82
|
+
fi
|
|
83
|
+
log "node process online (PID ${RUNNING})"
|
|
84
|
+
|
|
85
|
+
# Show status
|
|
86
|
+
log "Node status:"
|
|
87
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && sh controls/stat.sh"
|
|
88
|
+
|
|
89
|
+
echo
|
|
90
|
+
log "Node started. Dashboard API: http://$(curl -s --max-time 3 https://api.ipify.org 2>/dev/null || echo 'localhost'):${API_PORT}/"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ===================================================================
|
|
3
|
+
# node-stop.sh — stop the Octra lite_node gracefully
|
|
4
|
+
#
|
|
5
|
+
# Usage: sudo bash node-stop.sh
|
|
6
|
+
# ===================================================================
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
source "$(dirname "$0")/config.sh"
|
|
10
|
+
|
|
11
|
+
if [[ $EUID -ne 0 ]]; then
|
|
12
|
+
err "Run as root: sudo bash $0"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
log "Stopping Octra lite_node…"
|
|
17
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && sh controls/stop.sh"
|
|
18
|
+
log "Node stopped."
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ===================================================================
|
|
3
|
+
# node-upgrade.sh — upgrade the Octra lite_node to the latest release
|
|
4
|
+
#
|
|
5
|
+
# Uses the official upgrade.sh which monitors the repo, builds a
|
|
6
|
+
# fresh binary, restarts the node, and verifies it's operational.
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# sudo bash node-upgrade.sh # dry-run (test only, no changes)
|
|
10
|
+
# sudo bash node-upgrade.sh --apply # apply the upgrade
|
|
11
|
+
#
|
|
12
|
+
# This is a thin wrapper around controls/upgrade.sh.
|
|
13
|
+
# ===================================================================
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
source "$(dirname "$0")/config.sh"
|
|
17
|
+
|
|
18
|
+
if [[ $EUID -ne 0 ]]; then
|
|
19
|
+
err "Run as root: sudo bash $0"
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
if [[ ! -d "${NODE_SRC_DIR}/.git" ]]; then
|
|
24
|
+
err "Node source not found at ${NODE_SRC_DIR}"
|
|
25
|
+
err "Run install-deps.sh first."
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
MODE="${1:---dry-run}"
|
|
30
|
+
|
|
31
|
+
log "Running upgrade (${MODE})…"
|
|
32
|
+
log "Pulling latest source…"
|
|
33
|
+
|
|
34
|
+
# Pull latest code first
|
|
35
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && git pull --ff-only"
|
|
36
|
+
|
|
37
|
+
if [[ "${MODE}" == "--apply" ]]; then
|
|
38
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && sh controls/upgrade.sh --apply"
|
|
39
|
+
else
|
|
40
|
+
log "Dry-run mode — testing only (no changes applied)"
|
|
41
|
+
su - "${NODE_USER}" -c "cd ${NODE_SRC_DIR} && sh controls/upgrade.sh"
|
|
42
|
+
echo
|
|
43
|
+
log "Dry-run complete. If everything looks good, run:"
|
|
44
|
+
echo " sudo bash node-upgrade.sh --apply"
|
|
45
|
+
fi
|