ovtools 0.0.0-stage → 1.0.1

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.
Files changed (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +121 -2
  3. package/assets/common/bond-inspect.sh +368 -0
  4. package/assets/common/config.sh +263 -0
  5. package/assets/common/extract-data.sh +197 -0
  6. package/assets/common/harden-host.sh +37 -0
  7. package/assets/common/install-deps.sh +93 -0
  8. package/assets/common/node-enroll.sh +65 -0
  9. package/assets/common/node-setup.sh +150 -0
  10. package/assets/common/node-start.sh +90 -0
  11. package/assets/common/node-stop.sh +18 -0
  12. package/assets/common/node-upgrade.sh +45 -0
  13. package/assets/common/pre-run.sh +497 -0
  14. package/assets/common/promote-validator.sh +104 -0
  15. package/assets/deploy/10-prepare-host.sh +98 -0
  16. package/assets/deploy/20-install-toolchain.sh +93 -0
  17. package/assets/deploy/30-setup-node.sh +82 -0
  18. package/assets/deploy/40-start-node.sh +75 -0
  19. package/assets/deploy/50-verify.sh +259 -0
  20. package/assets/deploy/60-enroll.sh +304 -0
  21. package/assets/deploy/70-promote.sh +152 -0
  22. package/assets/deploy/lib.sh +398 -0
  23. package/assets/manage/10-bond-increase.sh +149 -0
  24. package/assets/manage/10-diagnose-node.sh +169 -0
  25. package/assets/manage/20-exit-validator.sh +259 -0
  26. package/assets/manage/25-recover-node.sh +291 -0
  27. package/assets/manage/30-status.sh +64 -0
  28. package/assets/manage/40-exit-withdraw.sh +133 -0
  29. package/assets/manage/bond_inc.sh +318 -0
  30. package/assets/manage/dashboard_monitor/app.js +1544 -0
  31. package/assets/manage/dashboard_monitor/assets/v2.2/css/base.css +113 -0
  32. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/content.css +133 -0
  33. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/controls.css +229 -0
  34. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/data.css +374 -0
  35. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/icons.css +35 -0
  36. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/motion.css +57 -0
  37. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/shell.css +51 -0
  38. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/sidebar.css +242 -0
  39. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/topbar.css +138 -0
  40. package/assets/manage/dashboard_monitor/assets/v2.2/css/fonts.css +30 -0
  41. package/assets/manage/dashboard_monitor/assets/v2.2/css/synteq-ui-v2.css +25 -0
  42. package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-dark.css +38 -0
  43. package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-light.css +36 -0
  44. package/assets/manage/dashboard_monitor/assets/v2.2/css/tokens.css +61 -0
  45. package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
  46. package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
  47. package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
  48. package/assets/manage/dashboard_monitor/assets/v2.2/js/synteq-ui-v2.js +869 -0
  49. package/assets/manage/dashboard_monitor/deploy-dashboard.sh +230 -0
  50. package/assets/manage/dashboard_monitor/favicon.svg +13 -0
  51. package/assets/manage/dashboard_monitor/index.html +1197 -0
  52. package/assets/manage/dashboard_monitor/nginx-octra.conf +76 -0
  53. package/assets/manage/dashboard_monitor/octra-dashboard.service +29 -0
  54. package/assets/manage/dashboard_monitor/octra-node-prune.cron +12 -0
  55. package/assets/manage/dashboard_monitor/octra-node-prune.service +16 -0
  56. package/assets/manage/dashboard_monitor/octra-node-prune.timer +12 -0
  57. package/assets/manage/dashboard_monitor/prune-node-junk.sh +329 -0
  58. package/assets/manage/dashboard_monitor/server.py +1887 -0
  59. package/assets/manage/dashboard_monitor/ssl-certbot.sh +90 -0
  60. package/assets/manage/dashboard_monitor/styles.css +327 -0
  61. package/assets/manage/lib.sh +347 -0
  62. package/assets/manifest.json +143 -0
  63. package/assets/migrate/00-backup-identity.sh +67 -0
  64. package/assets/migrate/01-prepare-target.sh +145 -0
  65. package/assets/migrate/02-authorize-pull.sh +43 -0
  66. package/assets/migrate/03-pull-state.sh +102 -0
  67. package/assets/migrate/04-stop-source.sh +85 -0
  68. package/assets/migrate/05-finalize-target.sh +140 -0
  69. package/assets/migrate/06-start-target.sh +57 -0
  70. package/assets/migrate/07-verify.sh +237 -0
  71. package/assets/migrate/08-rollback.sh +54 -0
  72. package/assets/migrate/lib.sh +149 -0
  73. package/assets/upgrade/10-preflight.sh +120 -0
  74. package/assets/upgrade/20-upgrade.sh +142 -0
  75. package/assets/upgrade/30-manual-upgrade.sh +129 -0
  76. package/assets/upgrade/40-storage-prune.sh +65 -0
  77. package/assets/upgrade/50-status.sh +58 -0
  78. package/assets/upgrade/lib.sh +232 -0
  79. package/bin/ovtools.js +32 -0
  80. package/dist/api/checks.d.ts +6 -0
  81. package/dist/api/checks.d.ts.map +1 -0
  82. package/dist/api/checks.js +173 -0
  83. package/dist/api/checks.js.map +1 -0
  84. package/dist/api/hostkeys.d.ts +10 -0
  85. package/dist/api/hostkeys.d.ts.map +1 -0
  86. package/dist/api/hostkeys.js +58 -0
  87. package/dist/api/hostkeys.js.map +1 -0
  88. package/dist/api/jobs.d.ts +33 -0
  89. package/dist/api/jobs.d.ts.map +1 -0
  90. package/dist/api/jobs.js +486 -0
  91. package/dist/api/jobs.js.map +1 -0
  92. package/dist/api/nodes.d.ts +16 -0
  93. package/dist/api/nodes.d.ts.map +1 -0
  94. package/dist/api/nodes.js +126 -0
  95. package/dist/api/nodes.js.map +1 -0
  96. package/dist/api/server.d.ts +3 -0
  97. package/dist/api/server.d.ts.map +1 -0
  98. package/dist/api/server.js +443 -0
  99. package/dist/api/server.js.map +1 -0
  100. package/dist/cli.d.ts +3 -0
  101. package/dist/cli.d.ts.map +1 -0
  102. package/dist/cli.js +301 -0
  103. package/dist/cli.js.map +1 -0
  104. package/dist/constants.d.ts +76 -0
  105. package/dist/constants.d.ts.map +1 -0
  106. package/dist/constants.js +150 -0
  107. package/dist/constants.js.map +1 -0
  108. package/dist/index.d.ts +18 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +60 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/orchestrator/base.d.ts +52 -0
  113. package/dist/orchestrator/base.d.ts.map +1 -0
  114. package/dist/orchestrator/base.js +219 -0
  115. package/dist/orchestrator/base.js.map +1 -0
  116. package/dist/orchestrator/deploy.d.ts +33 -0
  117. package/dist/orchestrator/deploy.d.ts.map +1 -0
  118. package/dist/orchestrator/deploy.js +313 -0
  119. package/dist/orchestrator/deploy.js.map +1 -0
  120. package/dist/orchestrator/manage.d.ts +28 -0
  121. package/dist/orchestrator/manage.d.ts.map +1 -0
  122. package/dist/orchestrator/manage.js +267 -0
  123. package/dist/orchestrator/manage.js.map +1 -0
  124. package/dist/orchestrator/migrate.d.ts +31 -0
  125. package/dist/orchestrator/migrate.d.ts.map +1 -0
  126. package/dist/orchestrator/migrate.js +442 -0
  127. package/dist/orchestrator/migrate.js.map +1 -0
  128. package/dist/ssh/client.d.ts +39 -0
  129. package/dist/ssh/client.d.ts.map +1 -0
  130. package/dist/ssh/client.js +418 -0
  131. package/dist/ssh/client.js.map +1 -0
  132. package/dist/test/core.test.d.ts +2 -0
  133. package/dist/test/core.test.d.ts.map +1 -0
  134. package/dist/test/core.test.js +188 -0
  135. package/dist/test/core.test.js.map +1 -0
  136. package/dist/types.d.ts +267 -0
  137. package/dist/types.d.ts.map +1 -0
  138. package/dist/types.js +3 -0
  139. package/dist/types.js.map +1 -0
  140. package/dist/utils/assets.d.ts +28 -0
  141. package/dist/utils/assets.d.ts.map +1 -0
  142. package/dist/utils/assets.js +583 -0
  143. package/dist/utils/assets.js.map +1 -0
  144. package/dist/utils/browser.d.ts +2 -0
  145. package/dist/utils/browser.d.ts.map +1 -0
  146. package/dist/utils/browser.js +23 -0
  147. package/dist/utils/browser.js.map +1 -0
  148. package/dist/utils/dashboard.d.ts +16 -0
  149. package/dist/utils/dashboard.d.ts.map +1 -0
  150. package/dist/utils/dashboard.js +177 -0
  151. package/dist/utils/dashboard.js.map +1 -0
  152. package/dist/utils/helpers.d.ts +29 -0
  153. package/dist/utils/helpers.d.ts.map +1 -0
  154. package/dist/utils/helpers.js +204 -0
  155. package/dist/utils/helpers.js.map +1 -0
  156. package/dist/utils/scripts.d.ts +60 -0
  157. package/dist/utils/scripts.d.ts.map +1 -0
  158. package/dist/utils/scripts.js +174 -0
  159. package/dist/utils/scripts.js.map +1 -0
  160. package/dist/utils/state.d.ts +12 -0
  161. package/dist/utils/state.d.ts.map +1 -0
  162. package/dist/utils/state.js +44 -0
  163. package/dist/utils/state.js.map +1 -0
  164. package/dist/utils/tar.d.ts +11 -0
  165. package/dist/utils/tar.d.ts.map +1 -0
  166. package/dist/utils/tar.js +93 -0
  167. package/dist/utils/tar.js.map +1 -0
  168. package/dist/utils/update.d.ts +9 -0
  169. package/dist/utils/update.d.ts.map +1 -0
  170. package/dist/utils/update.js +134 -0
  171. package/dist/utils/update.js.map +1 -0
  172. package/dist/utils/websocket.d.ts +10 -0
  173. package/dist/utils/websocket.d.ts.map +1 -0
  174. package/dist/utils/websocket.js +203 -0
  175. package/dist/utils/websocket.js.map +1 -0
  176. package/package.json +55 -4
  177. package/public/app.js +2736 -0
  178. package/public/assets/v2.2/css/base.css +113 -0
  179. package/public/assets/v2.2/css/components/content.css +133 -0
  180. package/public/assets/v2.2/css/components/controls.css +229 -0
  181. package/public/assets/v2.2/css/components/data.css +373 -0
  182. package/public/assets/v2.2/css/components/icons.css +35 -0
  183. package/public/assets/v2.2/css/components/motion.css +57 -0
  184. package/public/assets/v2.2/css/components/shell.css +51 -0
  185. package/public/assets/v2.2/css/components/sidebar.css +242 -0
  186. package/public/assets/v2.2/css/components/topbar.css +138 -0
  187. package/public/assets/v2.2/css/fonts.css +30 -0
  188. package/public/assets/v2.2/css/synteq-ui-v2.css +25 -0
  189. package/public/assets/v2.2/css/theme-dark.css +38 -0
  190. package/public/assets/v2.2/css/theme-light.css +36 -0
  191. package/public/assets/v2.2/css/tokens.css +61 -0
  192. package/public/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
  193. package/public/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
  194. package/public/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
  195. package/public/assets/v2.2/js/synteq-ui-v2.js +869 -0
  196. package/public/favicon.svg +13 -0
  197. package/public/index.html +1083 -0
  198. package/public/styles.css +580 -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