Last active
September 23, 2021 21:30
-
-
Save dadatuputi/0c9277a0f166f304a3c5e3316a253a65 to your computer and use it in GitHub Desktop.
Nagios Flexpool Check
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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