Skip to content

Instantly share code, notes, and snippets.

@dadatuputi
Last active September 23, 2021 21:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dadatuputi/0c9277a0f166f304a3c5e3316a253a65 to your computer and use it in GitHub Desktop.
Save dadatuputi/0c9277a0f166f304a3c5e3316a253a65 to your computer and use it in GitHub Desktop.
Nagios Flexpool Check
#!/usr/bin/python3
import requests, argparse, sys
response_data = []
# Unit data for different coins - makes display of data a bit nices
# coin: [amount to divide balance, amount to divide hashrate, unit of measurement]
coins = {
'eth': [1000000000000000000, 1000000, ''],
'xch': [1000000000000, 1000000000000, 'TB']
}
status = "OK"
exit = 0
# Check for non-200 response codes
def response_critical(r):
if r.status_code != 200 or r.json()['error'] is not None:
print("CRITICAL - Response {}: {}".format(r.status_code, r.text))
sys.exit(2)
def get_balance(params, headers):
r = requests.get(flexpool_endpoint + 'balance', params=params, headers=headers)
response_critical(r)
j = r.json()
divisor=1
if params['coin'] in coins:
divisor = coins[params['coin']][0]
_response = []
_response.append("{}={}".format(params['coin'], j['result']['balance']/divisor))
_response.append("usd={}".format(j['result']['balanceCountervalue']))
_response.append("{}/usd={}".format(params['coin'], j['result']['price']))
print("OK - {} Balance: {} | ".format(params['coin'], j['result']['balance']/divisor) + '; '.join(_response))
sys.exit(0)
def get_worker_count(params, headers):
r = requests.get(flexpool_endpoint + 'workerCount', params=params, headers=headers)
response_critical(r)
j = r.json()
_response = []
_response.append("workers_offline={}".format(j['result']['workersOffline']))
_response.append("workers_online={}".format(j['result']['workersOnline']))
if j['result']['workersOffline'] > 0:
print("WARNING - {}/{} Workers Online | ".format(j['result']['workersOnline'], (j['result']['workersOnline'] + j['result']['workersOffline'])) + '; '.join(_response))
sys.exit(1)
else:
print("OK - {}/{} Workers Online | ".format(j['result']['workersOnline'], (j['result']['workersOnline'] + j['result']['workersOffline'])) + '; '.join(_response))
sys.exit(0)
def get_round_share(params, headers):
r = requests.get(flexpool_endpoint + 'roundShare', params=params, headers=headers)
response_critical(r)
j = r.json()
_response = []
_response.append("round_share={}".format(j['result']))
print("OK - Round Share: {} | ".format(j['result']) + '; '.join(_response))
sys.exit(0)
def get_stats(params, headers):
r = requests.get(flexpool_endpoint + 'stats', params=params, headers=headers)
response_critical(r)
j = r.json()
divisor=1
uom=''
if params['coin'] in coins:
divisor = coins[params['coin']][1]
uom = coins[params['coin']][2]
_response = []
_response.append("avg_hash={}{}".format(j['result']['averageEffectiveHashrate']/divisor, uom))
_response.append("cur_hash={}{}".format(j['result']['currentEffectiveHashrate']/divisor, uom))
_response.append("rep_hash={}{}".format(j['result']['reportedHashrate']/divisor, uom))
_response.append("inv_shares={}".format(j['result']['invalidShares']))
_response.append("stale_shares={}".format(j['result']['staleShares']))
_response.append("valid_shares={}".format(j['result']['validShares']))
print("OK - Average Hashrate: {}{}; Current Hashrate: {}{}; Reported Hashrate: {}{} | ".format(j['result']['averageEffectiveHashrate']/divisor, uom, j['result']['currentEffectiveHashrate']/divisor, uom, j['result']['reportedHashrate']/divisor, uom) + '; '.join(_response))
sys.exit(0)
def get_workers(params, headers, worker=None):
r = requests.get(flexpool_endpoint + 'workers', params=params, headers=headers)
response_critical(r)
j = r.json()
divisor=1
uom=''
if params['coin'] in coins:
divisor = coins[params['coin']][1]
uom = coins[params['coin']][2]
if worker is not None:
j['result'] = [miner for miner in j['result'] if miner['name'] == worker]
if not j['result']:
print("CRITICAL - No worker by the name {}".format(worker))
sys.exit(2)
_names = []
_response = []
for miner in j['result']:
_names.append(miner['name'])
_response.append("{}_count={}".format(miner['name'], miner['count']))
_response.append("{}_avg_hash={}{}".format(miner['name'], miner['averageEffectiveHashrate']/divisor, uom))
_response.append("{}_cur_hash={}{}".format(miner['name'], miner['currentEffectiveHashrate']/divisor, uom))
_response.append("{}_rep_hash={}{}".format(miner['name'], miner['reportedHashrate']/divisor, uom))
_response.append("{}_valid_shares={}".format(miner['name'], miner['validShares']))
_response.append("{}_stale_shares={}".format(miner['name'], miner['staleShares']))
_response.append("{}_inv_shares={}".format(miner['name'], miner['invalidShares']))
print("OK - Worker {} Stats | ".format(','.join(_names)) + '; '.join(_response))
sys.exit(0)
parser = argparse.ArgumentParser(description='Nagios plugin to check Flexpool API for miner statistics and status')
parser.add_argument('coin', help='coin to check statistics for')
parser.add_argument('address', help='mining address')
_flexpool_default_endpoint = "https://api.flexpool.io"
parser.add_argument('-H', default=_flexpool_default_endpoint, help='Ignored - Flexpool API Endpoint is {}'.format(_flexpool_default_endpoint))
group = parser.add_mutually_exclusive_group()
group.add_argument('-b', '--balance', action='store_true', help='return balance')
group.add_argument('-c', '--count', action='store_true', help='return worker counts')
group.add_argument('-r', '--round_share', action='store_true', help='return return share')
group.add_argument('-s', '--stats', action='store_true', help='return overall statistics')
group.add_argument('-w', '--workers', action='store_true', help='return statistics for all workers')
group.add_argument('--worker', help='return statistics for specified worker')
args = parser.parse_args()
args.H = _flexpool_default_endpoint
flexpool_endpoint = args.H + '/v2/miner/'
headers = {"accept": "application/json"}
params = {'coin': args.coin, 'address': args.address}
if args.balance:
get_balance(params, headers)
elif args.count:
get_worker_count(params, headers)
elif args.round_share:
get_round_share(params, headers)
elif args.stats:
get_stats(params, headers)
elif args.workers:
get_workers(params, headers)
elif args.worker:
get_workers(params, headers, args.worker)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment