def __init__(self, restore_dir): ''' Initialize the restore task. >>> restore_task = RestoreTask(os.path.join(gettempdir(), 'bitcoin/data/testnet3/backups/level1')) >>> restore_task is not None True >>> restore_task.__init__(os.path.join(gettempdir(), 'bitcoin/data/testnet3/backups/level1')) >>> restore_task.restore_dir '/tmp/bitcoin/data/testnet3/backups/level1' >>> restore_task._interrupted False >>> restore_task.manager is None True >>> restore_task.log_name 'blockchain_backup.bitcoin.restore.log' ''' Thread.__init__(self) self.restore_dir = restore_dir self._interrupted = False self.log = get_log() self.log_name = os.path.basename(get_log_path()) self.manager = None
def __init__(self): ''' Initialize the backup task. >>> backup_task = BackupTask() >>> backup_task is not None True >>> backup_task.__init__() >>> type(backup_task.locale_tz) <class 'pytz.tzfile.Atlantic/Reykjavik'> >>> backup_task._interrupted False >>> backup_task.manager is None True >>> backup_task.log_name 'blockchain_backup.bitcoin.backup.log' ''' Thread.__init__(self) self._interrupted = False self.log = get_log() self.log_name = os.path.basename(get_log_path()) self.manager = None self.to_backup_dir = None self.backup_level = 1 self.backup_formatted_time = None self.locale_tz = timezone(TIME_ZONE)
def __init__(self, log_name, use_fresh_debug_log=True): ''' Initialize bitcoin core manager. >>> manager = BitcoinManager('blockchain_backup.bitcoin.manager.log') >>> manager is not None True ''' self.log = get_log(filename=log_name) self.bin_dir, self.data_dir = get_bitcoin_dirs() if use_fresh_debug_log: self.debug_log = utils.get_fresh_debug_log(self.data_dir) else: self.debug_log = utils.get_debug_log_name(self.data_dir) self.total_blocks_needed = None self.new_blocks_found = False self.last_progress_update = None self.last_notice_update = None self.last_subnotice_update = None self.last_header_update = None # give socketio time to connect sleep(5)
def __init__(self): Thread.__init__(self) self.log = get_log() self.log_name = os.path.basename(get_log_path()) self.manager = None self.current_block = state.get_last_block_updated()
def __init__(self, *args, **kwargs): ''' Initialize the preferences form. >>> prefs = PreferencesForm() >>> prefs is not None True >>> prefs.log is not None True ''' super(PreferencesForm, self).__init__(*args, **kwargs) self.log = get_log()
def server_nonce(): ''' Return saved server nonce. To get this nonce, an attacker would have to crack this server, or fool the server into sending the nonce. >>> nonce = server_nonce() >>> nonce is not None True ''' if os.path.exists(NONCE_FILE): with open(NONCE_FILE) as infile: nonce = infile.read() else: log = get_log() nonce = str(random()) with locked(): with open(NONCE_FILE, 'w') as outfile: outfile.write(nonce) log(f'server_nonce: {nonce}') run('chmod', 'g-r,o-r', NONCE_FILE) log(f'changed permissions on {NONCE_FILE}') return nonce
def __init__(self): ''' Initialize the update task. >>> update_task = UpdateTask() >>> update_task is not None True >>> update_task.__init__() >>> update_task._interrupted False >>> update_task.manager is None True >>> update_task.log_name 'blockchain_backup.bitcoin.update.log' ''' self._interrupted = False self.manager = None self.log = get_log() self.log_name = os.path.basename(get_log_path()) self.current_block = state.get_last_block_updated() Thread.__init__(self)
import os from shutil import rmtree from traceback import format_exc from django.contrib import messages from django.db import transaction from django.db.utils import OperationalError from blockchain_backup.bitcoin import constants from blockchain_backup.bitcoin.models import Preferences from blockchain_backup.settings import HOME_DIR from denova.os.user import getdir, whoami from denova.python.log import get_log log = get_log() def get_bitcoin_dirs(): ''' Get the bin and data dirs for bitcoin. >>> from blockchain_backup.bitcoin.tests import utils as test_utils >>> test_utils.init_database() >>> bin_dir, data_dir = get_bitcoin_dirs() >>> bin_dir '/tmp/bitcoin/bin/' >>> data_dir '/tmp/bitcoin/data/testnet3' '''
def process_bitcoin_cli_error(self, arg, returncode, stdout, stderr): ''' Process an error from bitcoin_cli. >>> manager = BitcoinManager('blockchain_backup.bitcoin.manager.log') >>> arg = 'getblockchaininfo' >>> returncode = 28 >>> stdout = None >>> stderr = 'error code: -28\\nerror message:\\nLoading block index...' >>> manager.process_bitcoin_cli_error(arg, returncode, stdout, stderr) (False, 'Loading block index...', None) >>> returncode = 1 >>> stderr = 'error code: 1\\nerror message:\\nerror: Could not locate RPC credentials.' >>> manager.process_bitcoin_cli_error(arg, returncode, stdout, stderr) (False, None, None) >>> returncode = 1 >>> stderr = 'error code: 1\\nerror message:\\nerror: Could not connect to the server 127.0.0.1:8332' >>> manager.process_bitcoin_cli_error(arg, returncode, stdout, stderr) (False, None, None) >>> returncode = 4 >>> stderr = 'error code: 1\\nerror message:\\nerror: Error loading block database.' >>> manager.process_bitcoin_cli_error(arg, returncode, stdout, stderr) (True, 'Error loading block database.', None) ''' log = get_log() abort = False progress = log_message = None if not stderr: log_message = f'failed with return code: {returncode} stdout: {stdout}' elif stderr.find('error code: -28') >= 0: abort, progress = self.check_bitcoin_log() if progress is None: progress = self.strip_stderr(stderr) elif returncode == 1: if stderr.find('error: Could not locate RPC credentials.') >= 0: # this error doesn't appear to do any harm; it just # means that we're restricted on what commands we can issue # which is fine as we only want to issue general query commands # (e.g., getblockcount, getblockinfo) pass elif stderr.find('error: Could not connect to the server') >= 0: # this error just means the app isn't up yet, so we'll try again pass else: # don't report the error if we're just stopping if arg == 'stop': log_message = 'error while trying to stop bitcoind\n' log_message += self.strip_stderr(stderr) elif stderr.find('error code 1 - "EOF reached"') >= 0: # don't try again as this is a known serious error abort = True log_message = self.strip_stderr(stderr) else: # we're going to ignore the error and try again # if we haven't hit the max retries log_message = self.strip_stderr(stderr) elif returncode == 4: if stderr: DNS_PROBLEMS = 'Temporary failure in name resolution' i = stderr.find(DNS_PROBLEMS) if i >= 0: progress = f'{DNS_PROBLEMS} -- problems with DNS?' else: progress = self.strip_stderr(stderr) else: log_message = f'failed with return code: {returncode} stdout: {stdout}' else: log_message = f'failed with return code: {returncode} stderr: {stderr}' # don't know the return code if self.strip_stderr(stderr).find( 'Error loading block database.') >= 0: abort = True log('aborting connection because error loading block database') return abort, progress, log_message