mirror of
https://github.com/basicswap/basicswap.git
synced 2025-12-30 09:11:37 +01:00
69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright (c) 2024 tecnovert
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
import os
|
|
import select
|
|
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
|
|
|
|
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:
|
|
readOutput()
|
|
delay_event.wait(0.1)
|
|
except Exception as e:
|
|
logging.error(f"dcrwallet --create failed: {e}")
|
|
finally:
|
|
if p.poll() is None:
|
|
p.terminate()
|
|
os.close(pipe_r)
|
|
os.close(pipe_w)
|
|
p.stdin.close()
|