Publish daily BTC price in public remoteStorage
This commit is contained in:
@@ -111,3 +111,5 @@ node.default['btcpay']['postgres']['user'] = 'satoshi'
|
||||
node.default['peerswap']['repo'] = 'https://github.com/ElementsProject/peerswap.git'
|
||||
node.default['peerswap']['revision'] = 'master'
|
||||
node.default['peerswap-lnd']['source_dir'] = '/opt/peerswap'
|
||||
|
||||
node.default['price_tracking']['rs_base_url'] = "https://storage.kosmos.org/kosmos/public/btc-price"
|
||||
|
||||
59
site-cookbooks/kosmos-bitcoin/recipes/price_tracking.rb
Normal file
59
site-cookbooks/kosmos-bitcoin/recipes/price_tracking.rb
Normal file
@@ -0,0 +1,59 @@
|
||||
#
|
||||
# Cookbook:: kosmos-bitcoin
|
||||
# Recipe:: price_tracking
|
||||
#
|
||||
# Track BTC rates and publish them via remoteStorage
|
||||
#
|
||||
|
||||
%w[curl jq].each do |pkg|
|
||||
apt_package pkg
|
||||
end
|
||||
|
||||
daily_tracker_path = "/usr/local/bin/btc-price-tracker-daily"
|
||||
|
||||
credentials = Chef::EncryptedDataBagItem.load('credentials', 'kosmos-rs')
|
||||
|
||||
template daily_tracker_path do
|
||||
source "btc-price-tracker-daily.sh.erb"
|
||||
mode '0740'
|
||||
variables rs_base_url: node['price_tracking']['rs_base_url']
|
||||
notifies :restart, "systemd_unit[lnd-channel-backup.service]", :delayed
|
||||
end
|
||||
|
||||
systemd_unit 'btc-price-tracker-daily.service' do
|
||||
content({
|
||||
Unit: {
|
||||
Description: 'BTC price tracker (daily rates)',
|
||||
After: 'network-online.target',
|
||||
Wants: 'network-online.target'
|
||||
},
|
||||
Service: {
|
||||
Type: 'oneshot',
|
||||
ExecStart: daily_tracker_path,
|
||||
Environment: "RS_AUTH=#{credentials["auth_tokens"]["/btc-price"]}"
|
||||
},
|
||||
Install: {
|
||||
WantedBy: 'multi-user.target'
|
||||
}
|
||||
})
|
||||
sensitive true
|
||||
triggers_reload true
|
||||
action [:create]
|
||||
end
|
||||
|
||||
systemd_unit 'btc-price-tracker-daily.timer' do
|
||||
content({
|
||||
Unit: {
|
||||
Description: 'Run BTC price tracker daily'
|
||||
},
|
||||
Timer: {
|
||||
OnCalendar: '*-*-* 00:00:00',
|
||||
Persistent: 'true'
|
||||
},
|
||||
Install: {
|
||||
WantedBy: 'timers.target'
|
||||
}
|
||||
})
|
||||
triggers_reload true
|
||||
action [:create, :enable, :start]
|
||||
end
|
||||
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Calculate yesterday's date in YYYY-MM-DD format
|
||||
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
|
||||
echo "Starting price tracking for $YESTERDAY" >&2
|
||||
|
||||
# Get USD data and extract values
|
||||
usd_data=$(curl -s "https://www.bitstamp.net/api/v2/ticker/btcusd/")
|
||||
if [ $? -eq 0 ] && [ ! -z "$usd_data" ]; then
|
||||
echo "Successfully retrieved USD price data" >&2
|
||||
usd_open24=$(echo $usd_data | jq -r '.open_24')
|
||||
usd_last=$(echo $usd_data | jq -r '.last')
|
||||
else
|
||||
echo "ERROR: Failed to retrieve USD price data" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get EUR data and extract values
|
||||
eur_data=$(curl -s "https://www.bitstamp.net/api/v2/ticker/btceur/")
|
||||
if [ $? -eq 0 ] && [ ! -z "$eur_data" ]; then
|
||||
echo "Successfully retrieved EUR price data" >&2
|
||||
eur_open24=$(echo $eur_data | jq -r '.open_24')
|
||||
eur_last=$(echo $eur_data | jq -r '.last')
|
||||
else
|
||||
echo "ERROR: Failed to retrieve EUR price data" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Calculate averages
|
||||
usd_avg=$(( (${usd_open24%.*} + ${usd_last%.*}) / 2 ))
|
||||
eur_avg=$(( (${eur_open24%.*} + ${eur_last%.*}) / 2 ))
|
||||
echo "Calculated averages - USD: $usd_avg, EUR: $eur_avg" >&2
|
||||
|
||||
# Create JSON
|
||||
json="{\"EUR\":$eur_avg,\"USD\":$usd_avg}"
|
||||
|
||||
# PUT in remote storage
|
||||
response=$(curl -X PUT \
|
||||
-H "Authorization: Bearer $RS_AUTH" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$json" \
|
||||
-w "%{http_code}" \
|
||||
-s \
|
||||
-o /dev/null \
|
||||
"<%= @rs_base_url %>/$YESTERDAY")
|
||||
|
||||
if [ "$response" -eq 200 ] || [ "$response" -eq 201 ]; then
|
||||
echo "Successfully uploaded price data" >&2
|
||||
else
|
||||
echo "ERROR: Failed to upload price data. HTTP status: $response" >&2
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user