mirror of
https://github.com/basicswap/basicswap.git
synced 2025-11-06 10:48:11 +01:00
ui, xmr: List of candidate remote XMR daemon urls can be set through the http ui
This commit is contained in:
@@ -34,6 +34,7 @@ from .interface_xmr import XMRInterface
|
||||
from .interface_passthrough_btc import PassthroughBTCInterface
|
||||
|
||||
from . import __version__
|
||||
from .rpc_xmr import make_xmr_rpc2_func
|
||||
from .util import (
|
||||
TemporaryError,
|
||||
pubkeyToAddress,
|
||||
@@ -377,6 +378,9 @@ class BasicSwap(BaseApp):
|
||||
|
||||
if self.coin_clients[coin]['connection_type'] == 'rpc':
|
||||
if coin == Coins.XMR:
|
||||
if chain_client_settings.get('automatically_select_daemon', False):
|
||||
self.selectXMRRemoteDaemon(coin)
|
||||
|
||||
self.coin_clients[coin]['walletrpchost'] = chain_client_settings.get('walletrpchost', '127.0.0.1')
|
||||
self.coin_clients[coin]['walletrpcport'] = chain_client_settings.get('walletrpcport', chainparams[coin][self.chain]['walletrpcport'])
|
||||
if 'walletrpcpassword' in chain_client_settings:
|
||||
@@ -384,6 +388,41 @@ class BasicSwap(BaseApp):
|
||||
else:
|
||||
raise ValueError('Missing XMR wallet rpc credentials.')
|
||||
|
||||
def selectXMRRemoteDaemon(self, coin):
|
||||
self.log.info('Selecting remote XMR daemon.')
|
||||
chain_client_settings = self.getChainClientSettings(coin)
|
||||
remote_daemon_urls = chain_client_settings.get('remote_daemon_urls', [])
|
||||
rpchost = self.coin_clients[coin]['rpchost']
|
||||
rpcport = self.coin_clients[coin]['rpcport']
|
||||
current_daemon_url = f'{rpchost}:{rpcport}'
|
||||
if current_daemon_url in remote_daemon_urls:
|
||||
self.log.info(f'Trying last used url {rpchost}:{rpcport}.')
|
||||
try:
|
||||
rpc_cb2 = make_xmr_rpc2_func(rpcport, rpchost)
|
||||
test = rpc_cb2('get_height', timeout=20)['height']
|
||||
return True
|
||||
except Exception as e:
|
||||
self.log.warning(f'Failed to set XMR remote daemon to {rpchost}:{rpcport}, {e}')
|
||||
random.shuffle(remote_daemon_urls)
|
||||
for url in remote_daemon_urls:
|
||||
self.log.info(f'Trying url {url}.')
|
||||
try:
|
||||
rpchost, rpcport = url.rsplit(':', 1)
|
||||
rpc_cb2 = make_xmr_rpc2_func(rpcport, rpchost)
|
||||
test = rpc_cb2('get_height', timeout=20)['height']
|
||||
self.coin_clients[coin]['rpchost'] = rpchost
|
||||
self.coin_clients[coin]['rpcport'] = rpcport
|
||||
data = {
|
||||
'rpchost': rpchost,
|
||||
'rpcport': rpcport,
|
||||
}
|
||||
self.editSettings(self.coin_clients[coin]['name'], data)
|
||||
return True
|
||||
except Exception as e:
|
||||
self.log.warning(f'Failed to set XMR remote daemon to {url}, {e}')
|
||||
|
||||
raise ValueError('Failed to select a working XMR daemon url.')
|
||||
|
||||
def ci(self, coin): # Coin interface
|
||||
if coin == Coins.PART_ANON:
|
||||
return self.coin_clients[Coins.PART]['interface_anon']
|
||||
@@ -4818,6 +4857,7 @@ class BasicSwap(BaseApp):
|
||||
with self.mxDB:
|
||||
settings_cc = self.settings['chainclients'][coin_name]
|
||||
settings_changed = False
|
||||
suggest_reboot = False
|
||||
if 'lookups' in data:
|
||||
if settings_cc.get('chain_lookups', 'local') != data['lookups']:
|
||||
settings_changed = True
|
||||
@@ -4827,6 +4867,26 @@ class BasicSwap(BaseApp):
|
||||
cc['chain_lookups'] = data['lookups']
|
||||
break
|
||||
|
||||
for setting in ('manage_daemon', 'rpchost', 'rpcport', 'automatically_select_daemon'):
|
||||
if setting not in data:
|
||||
continue
|
||||
if settings_cc.get(setting) != data[setting]:
|
||||
settings_changed = True
|
||||
suggest_reboot = True
|
||||
settings_cc[setting] = data[setting]
|
||||
|
||||
if 'remotedaemonurls' in data:
|
||||
remotedaemonurls_in = data['remotedaemonurls'].split('\n')
|
||||
remotedaemonurls = set()
|
||||
for url in remotedaemonurls_in:
|
||||
if url.count(':') > 0:
|
||||
remotedaemonurls.add(url.strip())
|
||||
|
||||
if set(settings_cc.get('remote_daemon_urls', [])) != remotedaemonurls:
|
||||
settings_cc['remote_daemon_urls'] = list(remotedaemonurls)
|
||||
settings_changed = True
|
||||
suggest_reboot = True
|
||||
|
||||
if 'fee_priority' in data:
|
||||
new_fee_priority = data['fee_priority']
|
||||
ensure(new_fee_priority >= 0 and new_fee_priority < 4, 'Invalid priority')
|
||||
@@ -4858,7 +4918,7 @@ class BasicSwap(BaseApp):
|
||||
shutil.copyfile(settings_path, settings_path + '.last')
|
||||
with open(settings_path, 'w') as fp:
|
||||
json.dump(self.settings, fp, indent=4)
|
||||
return settings_changed
|
||||
return settings_changed, suggest_reboot
|
||||
|
||||
def enableCoin(self, coin_name):
|
||||
self.log.info('Enabling coin %s', coin_name)
|
||||
|
||||
Reference in New Issue
Block a user