From 42fa4d49d4a85f76559774d36c7bc85fa57f77ad Mon Sep 17 00:00:00 2001 From: tecnovert Date: Mon, 27 May 2024 16:00:26 +0200 Subject: [PATCH] Workarounds to run Decred in windows. Running BSX in windows is highly discouraged. If you have no choice at least use the WSL docker setup instead. --- basicswap/interface/dcr/util.py | 63 +++++++++++++++++++++------------ bin/basicswap_run.py | 8 +++-- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/basicswap/interface/dcr/util.py b/basicswap/interface/dcr/util.py index 6d45a44..b32743a 100644 --- a/basicswap/interface/dcr/util.py +++ b/basicswap/interface/dcr/util.py @@ -11,34 +11,51 @@ import subprocess def createDCRWallet(args, hex_seed, logging, delay_event): logging.info('Creating DCR wallet') + (pipe_r, pipe_w) = os.pipe() # subprocess.PIPE is buffered, blocks when read - p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=pipe_w, stderr=pipe_w) + + if os.name == 'nt': + str_args = ' '.join(args) + p = subprocess.Popen(str_args, shell=True, stdin=subprocess.PIPE, stdout=pipe_w, stderr=pipe_w) + else: + p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=pipe_w, stderr=pipe_w) + + def readOutput(): + buf = os.read(pipe_r, 1024).decode('utf-8') + response = None + if 'Opened wallet' in buf: + pass + elif 'Use the existing configured private passphrase' in buf: + response = b'y\n' + elif 'Do you want to add an additional layer of encryption' in buf: + response = b'n\n' + elif 'Do you have an existing wallet seed' in buf: + response = b'y\n' + elif 'Enter existing wallet seed' in buf: + response = (hex_seed + '\n').encode('utf-8') + elif 'Seed input successful' in buf: + pass + elif 'Upgrading database from version' in buf: + pass + elif 'Ticket commitments db upgrade done' in buf: + pass + elif 'The wallet has been created successfully' in buf: + pass + else: + raise ValueError(f'Unexpected output: {buf}') + if response is not None: + p.stdin.write(response) + p.stdin.flush() try: while p.poll() is None: + if os.name == 'nt': + readOutput() + delay_event.wait(0.1) + continue while len(select.select([pipe_r], [], [], 0)[0]) == 1: - buf = os.read(pipe_r, 1024).decode('utf-8') - response = None - if 'Use the existing configured private passphrase' in buf: - response = b'y\n' - elif 'Do you want to add an additional layer of encryption' in buf: - response = b'n\n' - elif 'Do you have an existing wallet seed' in buf: - response = b'y\n' - elif 'Enter existing wallet seed' in buf: - response = (hex_seed + '\n').encode('utf-8') - elif 'Seed input successful' in buf: - pass - elif 'Upgrading database from version' in buf: - pass - elif 'Ticket commitments db upgrade done' in buf: - pass - else: - raise ValueError(f'Unexpected output: {buf}') - if response is not None: - p.stdin.write(response) - p.stdin.flush() - delay_event.wait(0.1) + readOutput() + delay_event.wait(0.1) except Exception as e: logging.error(f'dcrwallet --create failed: {e}') finally: diff --git a/bin/basicswap_run.py b/bin/basicswap_run.py index 1217ab7..d8c55ad 100755 --- a/bin/basicswap_run.py +++ b/bin/basicswap_run.py @@ -91,6 +91,9 @@ def startDaemon(node_dir, bin_dir, daemon_bin, opts=[], extra_config={}): stdout_dest = subprocess.PIPE stderr_dest = subprocess.PIPE + if extra_config.get('use_shell', False): + str_args = ' '.join(args) + return Daemon(subprocess.Popen(str_args, shell=True, stdin=subprocess.PIPE, stdout=stdout_dest, stderr=stderr_dest, cwd=datadir_path), opened_files) return Daemon(subprocess.Popen(args, stdin=subprocess.PIPE, stdout=stdout_dest, stderr=stderr_dest, cwd=datadir_path), opened_files) @@ -245,11 +248,12 @@ def runClient(fp, data_dir, chain, start_only_coins): if c == 'decred': appdata = v['datadir'] extra_opts = [f'--appdata="{appdata}"', ] + use_shell: bool = True if os.name == 'nt' else False if v['manage_daemon'] is True: swap_client.log.info(f'Starting {display_name} daemon') filename = 'dcrd' + ('.exe' if os.name == 'nt' else '') - extra_config = {'add_datadir': False, 'stdout_to_file': True, 'stdout_filename': 'dcrd_stdout.log'} + extra_config = {'add_datadir': False, 'stdout_to_file': True, 'stdout_filename': 'dcrd_stdout.log', 'use_shell': use_shell} daemons.append(startDaemon(appdata, v['bindir'], filename, opts=extra_opts, extra_config=extra_config)) pid = daemons[-1].handle.pid swap_client.log.info('Started {} {}'.format(filename, pid)) @@ -264,7 +268,7 @@ def runClient(fp, data_dir, chain, start_only_coins): wallet_pwd = os.getenv('WALLET_ENCRYPTION_PWD', '') if wallet_pwd != '': extra_opts.append(f'--pass="{wallet_pwd}"') - extra_config = {'add_datadir': False, 'stdout_to_file': True, 'stdout_filename': 'dcrwallet_stdout.log'} + extra_config = {'add_datadir': False, 'stdout_to_file': True, 'stdout_filename': 'dcrwallet_stdout.log', 'use_shell': use_shell} daemons.append(startDaemon(appdata, v['bindir'], filename, opts=extra_opts, extra_config=extra_config)) pid = daemons[-1].handle.pid swap_client.log.info('Started {} {}'.format(filename, pid))