Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
xtar
8 лет назад

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

Не забудьте поменять значения переменных с паролем и ником вашего делегата.

6
47.340 GOLOS
На Golos с October 2016
Комментарии (13)
Сортировать по:
Сначала старые