108 lines
3.3 KiB
Python
Executable File
108 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
from urllib.request import urlopen, Request
|
|
import urllib
|
|
import json
|
|
import sys
|
|
|
|
|
|
# sc_precision is the number of hastings per siacoin
|
|
sc_precision = 10 ** 24
|
|
|
|
api_endpoint = "http://localhost:9980" # TODO get port from env/param
|
|
|
|
|
|
# TODO: get values from a param
|
|
min_balance = 10_000 * sc_precision
|
|
min_unspent_renter_funds = 5_000 * sc_precision
|
|
default_renter_funds = 20_000 * sc_precision
|
|
|
|
#siac class provides wrappers for the necessary siac commands.
|
|
class siac:
|
|
# initializes values for using the API (password and
|
|
# user-agent) so that all calls to urllib.request.urlopen have these set.
|
|
@staticmethod
|
|
def initialize():
|
|
# Setup a handler with the API password
|
|
username = ""
|
|
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
|
|
password_mgr.add_password(None, api_endpoint, username, siac.get_password())
|
|
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
|
|
|
|
# Setup an opener with the correct user agent
|
|
opener = urllib.request.build_opener(handler)
|
|
opener.addheaders = [('User-agent', 'Sia-Agent')]
|
|
|
|
# Install the opener.
|
|
# Now all calls to urllib.request.urlopen use our opener.
|
|
urllib.request.install_opener(opener)
|
|
|
|
@staticmethod
|
|
def get_password():
|
|
password_file = open("/home/marcin/.sia/apipassword")
|
|
password = password_file.readlines()
|
|
return password[0].strip()
|
|
|
|
# load_json reads the http response and decodes the JSON value
|
|
@staticmethod
|
|
def load_json(resp):
|
|
return json.loads(resp.decode("utf-8"))
|
|
|
|
@staticmethod
|
|
def get_wallet():
|
|
resp = urllib.request.urlopen(api_endpoint + "/wallet").read()
|
|
return siac.load_json(resp)
|
|
|
|
@staticmethod
|
|
def get_renter():
|
|
resp = urllib.request.urlopen(api_endpoint + "/renter").read()
|
|
return siac.load_json(resp)
|
|
|
|
# Initialize the API opener
|
|
siac.initialize()
|
|
|
|
# fail should ping discord for failures in health checks that can't be managed automatically.
|
|
def fail(err_msg):
|
|
print("Error message: ", err_msg)
|
|
|
|
|
|
# check_wallet_health_check checks that the wallet is unlocked and has at least min_balance SC.
|
|
def check_wallet_health():
|
|
wallet_get = siac.get_wallet()
|
|
|
|
if not wallet_get['unlocked']:
|
|
fail("Wallet not unlocked")
|
|
|
|
confirmed_coins = int(wallet_get['confirmedsiacoinbalance'])
|
|
unconfirmed_coins = int(wallet_get['unconfirmedincomingsiacoins'])
|
|
unconfirmed_outgoing_coins = int(wallet_get['unconfirmedoutgoingsiacoins'])
|
|
balance = confirmed_coins + unconfirmed_coins - unconfirmed_outgoing_coins
|
|
|
|
print("Balance: ", balance / sc_precision)
|
|
print("Min balance: ", min_balance / sc_precision)
|
|
|
|
if balance < min_balance:
|
|
fail("Wallet balance too low: {}".format(balance))
|
|
|
|
def check_renter_health():
|
|
renter_get = siac.get_renter()
|
|
|
|
allowance = renter_get['settings']['allowance']
|
|
allowance_funds = int(allowance['funds'])
|
|
unspent_funds = int(renter_get['financialmetrics']['unspent'])
|
|
|
|
# if funds are under a certain amount, re-balance the wallet.
|
|
if unspent_funds < min_unspent_renter_funds:
|
|
#siac.set_renter_funds(default_renter_funds)
|
|
#TODO
|
|
|
|
check_renter_health()
|
|
|
|
try:
|
|
check_wallet_health()
|
|
check_renter_health()
|
|
|
|
except: # catch all exceptions
|
|
e = sys.exc_info()[0]
|
|
fail(e)
|