feat: Add better status check for internal nodes and error logging
All checks were successful
Tests and Linting / Tests-Linting (3.10) (push) Successful in 27s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 28s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 28s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 46s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 46s
All checks were successful
Tests and Linting / Tests-Linting (3.10) (push) Successful in 27s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 28s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 28s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 46s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 46s
This commit is contained in:
21
account.py
21
account.py
@@ -95,6 +95,7 @@ def hsdConnected():
|
|||||||
def hsdVersion(format=True):
|
def hsdVersion(format=True):
|
||||||
info = hsd.getInfo()
|
info = hsd.getInfo()
|
||||||
if 'error' in info:
|
if 'error' in info:
|
||||||
|
logger.error(f"HSD connection error: {info.get('error', 'Unknown error')}")
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
# Check if SPV mode is enabled
|
# Check if SPV mode is enabled
|
||||||
@@ -121,6 +122,7 @@ def check_account(cookie: str | None):
|
|||||||
# Check if the account is valid
|
# Check if the account is valid
|
||||||
info = hsw.getAccountInfo(account, 'default')
|
info = hsw.getAccountInfo(account, 'default')
|
||||||
if 'error' in info:
|
if 'error' in info:
|
||||||
|
logger.error(f"HSW error checking account {account}: {info.get('error', 'Unknown error')}")
|
||||||
return False
|
return False
|
||||||
return account
|
return account
|
||||||
|
|
||||||
@@ -583,6 +585,7 @@ def getTransactions(account, page=1, limit=100):
|
|||||||
return []
|
return []
|
||||||
info = hsw.getWalletTxHistory(account)
|
info = hsw.getWalletTxHistory(account)
|
||||||
if 'error' in info:
|
if 'error' in info:
|
||||||
|
logger.error(f"Error getting transactions for account {account}: {info['error']}")
|
||||||
return []
|
return []
|
||||||
return info[::-1]
|
return info[::-1]
|
||||||
|
|
||||||
@@ -916,6 +919,7 @@ def register(account, domain):
|
|||||||
def getNodeSync():
|
def getNodeSync():
|
||||||
response = hsd.getInfo()
|
response = hsd.getInfo()
|
||||||
if 'error' in response:
|
if 'error' in response:
|
||||||
|
logger.error(f"Error getting node sync status: {response['error']}")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
sync = response['chain']['progress']*100
|
sync = response['chain']['progress']*100
|
||||||
@@ -1941,6 +1945,7 @@ def hsdStart():
|
|||||||
cmd.append(flag)
|
cmd.append(flag)
|
||||||
|
|
||||||
# Launch process
|
# Launch process
|
||||||
|
try:
|
||||||
HSD_PROCESS = subprocess.Popen(
|
HSD_PROCESS = subprocess.Popen(
|
||||||
cmd,
|
cmd,
|
||||||
cwd=os.getcwd(),
|
cwd=os.getcwd(),
|
||||||
@@ -1948,6 +1953,9 @@ def hsdStart():
|
|||||||
)
|
)
|
||||||
|
|
||||||
logger.info(f"HSD started with PID {HSD_PROCESS.pid}")
|
logger.info(f"HSD started with PID {HSD_PROCESS.pid}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to start HSD: {str(e)}", exc_info=True)
|
||||||
|
return
|
||||||
|
|
||||||
atexit.register(hsdStop)
|
atexit.register(hsdStop)
|
||||||
|
|
||||||
@@ -1959,6 +1967,19 @@ def hsdStart():
|
|||||||
logger.error(f"Failed to set signal handlers: {str(e)}", exc_info=True)
|
logger.error(f"Failed to set signal handlers: {str(e)}", exc_info=True)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def hsdRunning() -> bool:
|
||||||
|
global HSD_PROCESS
|
||||||
|
if not HSD_INTERNAL_NODE:
|
||||||
|
return False
|
||||||
|
if HSD_PROCESS is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Check if process has terminated
|
||||||
|
poll_result = HSD_PROCESS.poll()
|
||||||
|
if poll_result is not None:
|
||||||
|
logger.error(f"HSD process has terminated with exit code: {poll_result}")
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def hsdStop():
|
def hsdStop():
|
||||||
global HSD_PROCESS
|
global HSD_PROCESS
|
||||||
|
|||||||
33
main.py
33
main.py
@@ -1868,9 +1868,36 @@ def api_icon(account):
|
|||||||
def api_status():
|
def api_status():
|
||||||
# This doesn't require a login
|
# This doesn't require a login
|
||||||
# Check if the node is connected
|
# Check if the node is connected
|
||||||
if not account_module.hsdConnected():
|
node_status = {
|
||||||
return jsonify({"status":503,"error": "Node not connected"}), 503
|
"connected": account_module.hsdConnected(),
|
||||||
return jsonify({"status": 200,"result": "FireWallet is running"})
|
"internal": account_module.HSD_INTERNAL_NODE,
|
||||||
|
"internal_running": False,
|
||||||
|
"version": "N/A"
|
||||||
|
}
|
||||||
|
status = 200
|
||||||
|
error = None
|
||||||
|
node_status['version'] = account_module.hsdVersion(False) # type: ignore
|
||||||
|
|
||||||
|
if node_status['internal']:
|
||||||
|
node_status['internal_running'] = account_module.hsdRunning()
|
||||||
|
|
||||||
|
# If the node is not connected, return an error
|
||||||
|
if not node_status['connected']:
|
||||||
|
error = "Node not connected"
|
||||||
|
status = 503
|
||||||
|
if node_status['version'] == -1:
|
||||||
|
error = "Error connecting to HSD"
|
||||||
|
status = 503
|
||||||
|
if node_status['internal'] and not node_status['internal_running']:
|
||||||
|
error = "Internal node not running"
|
||||||
|
status = 503
|
||||||
|
|
||||||
|
|
||||||
|
return jsonify({
|
||||||
|
"node": node_status,
|
||||||
|
"error": error,
|
||||||
|
"status": status
|
||||||
|
}), status
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
Reference in New Issue
Block a user