Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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()
Ejemplo n.º 5
0
    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()
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
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'
    '''
Ejemplo n.º 9
0
    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