bash-скрипт для автоматической публикации фида
В таблице делегатов на Стимуле часто вижу, что некоторые делегаты фиды публикуют с большими задержками:
Да, может сейчас это на так важно с технической точки зрения (пока токены голоса не торгуются на бирже), но я считаю, что активные делегаты должны подавать хороший пример остальному сообществу и уже сейчас публикация фидов не должна превышать 2-3 часов.
Конечно же, каждые 2 часа заходить в cli_wallet и выполнять команду publish_feed программисту лень, поэтому я написал простенький bash-скрипт.
Закинул скрипт на github. Исходный код:
#!/bin/bash
# cli_wallet --rpc-http-endpoint url
WALLET=http://127.0.0.1:8093
# cli_wallet unlock password
PASSWORD="PASSWORD"
# publish_feed nickname:
NICKNAME="xtar"
function is_locked {
LOCKED=`curl -s --data-binary '{"id":"1","method":"is_locked","params":[""]}' "$WALLET" | jq -r '.result'`
}
function checkLockAndExit {
if [ "$EXITLOCK" = true ]; then
echo -n "Locking wallet again..."
curl -s --data-binary '{"id":0,"method":"lock","params":[]}' "$WALLET" > /dev/null
echo ""
echo "Locked."
fi
}
is_locked
if [ "$LOCKED" == "true" ]; then
EXITLOCK=true
echo -n "Wallet is locked. Trying to unlock..."
curl -s --data-binary '{"id":"1","method":"unlock","params":["'"$PASSWORD"'"]}' "$WALLET" > /dev/null
echo ""
is_locked
if [ "$LOCKED" == "true" ]; then
echo "Can't unlock wallet, exiting."
checkLockAndExit
else
echo "Wallet unlocked."
fi
else
if [ "$LOCKED" == "false" ]; then
EXITLOCK=false
echo "Wallet was unlocked before."
else
echo "Some error. Is cli_wallet running? Exit."
exit
fi
fi
# примерно раз в 60 минут обновлять фид
RANGE=60
number=$RANDOM
let "number %= $RANGE"
if [ $number -eq 30 ]; then
BASE="1.000"
QUOTE=`curl -s "http://www.steeme.ru/gf.html?mode=feed"`
PUB=`curl -s --data-binary '{"id":"2","method":"publish_feed","params":["'"$NICKNAME"'",{"base":"'"$BASE GBG"'", "quote":"'"$QUOTE GOLOS"'"}, true],"jsonrpc":"2.0"}' "$WALLET" | jq -r '.id'`
if [ $PUB -eq 2 ]; then
echo "Feed was updated successfully. 'base'=${BASE} 'quote'=${QUOTE}"
else
echo "Some error. Feed wasn't updated."
fi
fi
checkLockAndExit
Первая половина скрипта занимается разблокировкой кошелька cli_wallet (если он был до этого заблокирован) и снизу кусок кода примерно раз в час публикует фид.
Скрипт нужно засунуть в крон, на ежеминутное выполнение. Для этого добавьте в файл /etc/crontab строку
* * * * * /path/to/sh/pub.sh
Либо, если не хотите связываться с кроном, можно засунуть кусок кода с публикацией в бесконечный цикл со случайной паузой от 1 до 60 минут.
while true ; do
curl -s --data-binary '{"id":"1","method":"publish_feed","params":["'"$NICKNAME"'",{"base":"0.100 GBG", "quote":"1.000 GOLOS"}, true],"jsonrpc":"2.0"}' "$WALLET" > /dev/null
# генерируем случайное число от 1 до 60
RANGE=60
number=$RANDOM
let "number %= $RANGE"
sleep "${number}m"
done
Чтоб не напрягать блокчейн одновременной отправкой десятков запросов, скрипт каждую минуту генерирует случайное число от 1 до 60. Если число = 30, то команда publish_feed выполняется.
Пока что значения base и quote фиксированы.
"base":"0.100 GBG", "quote":"1.000 GOLOS"
Как только выйдем на биржу, я обновлю скрипт и цены будут браться уже из внешних источников.
Можете свободно форкать и делать изменения.
Требования к серверу
Для парсинга json-ответов от API в скрипте используется утилита jq. Устанавливаем командой:
sudo apt-get install jq
Необходимо, чтоб был запущен cli_wallet (не обязательно его разблокировать, скрипт это сделает сам).
./cli_wallet --server-rpc-endpoint="ws://127.0.0.1:9090" --rpc-endpoint 127.0.0.1:8093
Не забудьте поменять значения переменных с паролем и ником вашего делегата.