def __init__(self, url=common.DEFAULT_URL, debug=False, quiet=False, use_folder_tree=False, max_size=common.DEFAULT_MAX_SIZE, store_path=common.DEFAULT_STORE_PATH, config_path=common.DEFAULT_CONFIG_PATH, connection_retry_limit=common.DEFAULT_CONNECTION_RETRY_LIMIT, connection_retry_delay=common.DEFAULT_CONNECTION_RETRY_DELAY): debug = deserialize.flag(debug) quiet = deserialize.flag(quiet) self.url = deserialize.url(url) self.use_folder_tree = deserialize.flag(use_folder_tree) self.max_size = deserialize.byte_count(max_size) self.messenger = None # lazy self.btctxstore = BtcTxStore() self.retry_limit = deserialize.positive_integer(connection_retry_limit) self.retry_delay = deserialize.positive_integer(connection_retry_delay) # paths self.cfg_path = os.path.realpath(config_path) control.util.ensure_path_exists(os.path.dirname(self.cfg_path)) self.store_path = os.path.realpath(store_path) control.util.ensure_path_exists(self.store_path) # check for vfat partions if control.util.get_fs_type(self.store_path) == "vfat": self.use_folder_tree = True self.cfg = control.config.get(self.btctxstore, self.cfg_path)
def __init__(self, url=common.DEFAULT_URL, debug=False, quiet=False, use_folder_tree=False, max_size=common.DEFAULT_MAX_SIZE, store_path=common.DEFAULT_STORE_PATH, config_path=common.DEFAULT_CONFIG_PATH, connection_retry_limit=common.DEFAULT_CONNECTION_RETRY_LIMIT, connection_retry_delay=common.DEFAULT_CONNECTION_RETRY_DELAY): debug = deserialize.flag(debug) quiet = deserialize.flag(quiet) self.url = deserialize.url(url) self.use_folder_tree = deserialize.flag(use_folder_tree) self.max_size = deserialize.byte_count(max_size) self.messenger = None # lazy self.btctxstore = BtcTxStore() self.retry_limit = deserialize.positive_integer(connection_retry_limit) self.retry_delay = deserialize.positive_integer(connection_retry_delay) # paths self.cfg_path = os.path.realpath(config_path) control.util.ensure_path_exists(os.path.dirname(self.cfg_path)) self.store_path = os.path.realpath(store_path) control.util.ensure_path_exists(self.store_path) # check for vfat partions fstype = control.util.get_fs_type(self.store_path) if fstype == "vfat": logger.info("Detected vfat partition, using folder tree.") self.use_folder_tree = True if fstype is None: msg = "Couldn't detected partition type for '{0}'" logger.warning(msg.format(self.store_path)) self.cfg = control.config.get(self.btctxstore, self.cfg_path)
def build(self, workers=1, cleanup=False, rebuild=False, repair=False, set_height_interval=common.DEFAULT_SET_HEIGHT_INTERVAL): """Generate test files deterministically based on address. :param workers: Number of Number of threadpool workers. :param cleanup: Remove files in shard directory. :param rebuild: Re-generate any file shards. :param set_height_interval: Number of shards to generate before notifying the server. """ workers = deserialize.positive_nonzero_integer(workers) set_height_interval = deserialize.positive_nonzero_integer( set_height_interval) cleanup = deserialize.flag(cleanup) rebuild = deserialize.flag(rebuild) repair = deserialize.flag(repair) self._init_messenger() logger.info("Starting build") def _on_generate_shard(cur_height, last): """ Because URL requests are slow, only update the server when we are at the first height, at some height_interval, or the last height. :param cur_height: Current height in the building process. """ first = cur_height == 1 set_height = (cur_height % int(set_height_interval)) == 0 if first or set_height or last: self.messenger.height(cur_height) logger.info("Current height at {0}.".format(cur_height)) # Initialize builder and generate/re-generate shards bldr = builder.Builder(address=self.cfg["payout_address"], shard_size=common.SHARD_SIZE, max_size=self.max_size, min_free_size=self.min_free_size, on_generate_shard=_on_generate_shard, use_folder_tree=self.use_folder_tree) generated = bldr.build(self.store_path, workers=workers, cleanup=cleanup, rebuild=rebuild, repair=repair) logger.info("Build finished") return generated
def __init__(self, url=common.DEFAULT_URL, debug=False, quiet=False, use_folder_tree=False, max_size=common.DEFAULT_MAX_SIZE, min_free_size=common.DEFAULT_MIN_FREE_SIZE, store_path=common.DEFAULT_STORE_PATH, config_path=common.DEFAULT_CONFIG_PATH, connection_retry_limit=common.DEFAULT_CONNECTION_RETRY_LIMIT, connection_retry_delay=common.DEFAULT_CONNECTION_RETRY_DELAY, nop2p=True): debug = deserialize.flag(debug) quiet = deserialize.flag(quiet) self.storjnode = None self.nop2p = nop2p self.url = deserialize.url(url) self.use_folder_tree = deserialize.flag(use_folder_tree) self.max_size = deserialize.byte_count(max_size) self.min_free_size = deserialize.byte_count(min_free_size) self.messenger = None # lazy self.btctxstore = BtcTxStore() self.retry_limit = deserialize.positive_integer(connection_retry_limit) self.retry_delay = deserialize.positive_integer(connection_retry_delay) # paths self.cfg_path = os.path.realpath(config_path) storjnode.util.ensure_path_exists(os.path.dirname(self.cfg_path)) self.store_path = os.path.realpath(store_path) storjnode.util.ensure_path_exists(self.store_path) # check for vfat partions try: fstype = storjnode.util.get_fs_type(self.store_path) # FileNotFoundError: [Errno 2] No such file or directory: '/etc/mtab' # psutil: https://code.google.com/p/psutil/issues/detail?id=434 except EnvironmentError as e: logger.warning(e) fstype = None if fstype == "vfat": logger.info("Detected vfat partition, using folder tree.") self.use_folder_tree = True if fstype is None: msg = "Couldn't detected partition type for '{0}'" logger.warning(msg.format(self.store_path)) self.cfg = storjnode.config.get(self.btctxstore, self.cfg_path)
def build(self, workers=1, cleanup=False, rebuild=False, repair=False, set_height_interval=common.DEFAULT_SET_HEIGHT_INTERVAL): """Generate test files deterministically based on address. :param workers: Number of Number of threadpool workers. :param cleanup: Remove files in shard directory. :param rebuild: Re-generate any file shards. :param set_height_interval: Number of shards to generate before notifying the server. """ workers = deserialize.positive_nonzero_integer(workers) set_height_interval = deserialize.positive_nonzero_integer( set_height_interval ) cleanup = deserialize.flag(cleanup) rebuild = deserialize.flag(rebuild) repair = deserialize.flag(repair) self._init_messenger() logger.info("Starting build") def _on_generate_shard(cur_height, last): """ Because URL requests are slow, only update the server when we are at the first height, at some height_interval, or the last height. :param cur_height: Current height in the building process. """ first = cur_height == 1 set_height = (cur_height % int(set_height_interval)) == 0 if first or set_height or last: self.messenger.height(cur_height) logger.info("Current height at {0}.".format(cur_height)) # Initialize builder and generate/re-generate shards bldr = builder.Builder(address=self.cfg["payout_address"], shard_size=common.SHARD_SIZE, max_size=self.max_size, min_free_size=self.min_free_size, on_generate_shard=_on_generate_shard, use_folder_tree=self.use_folder_tree) generated = bldr.build(self.store_path, workers=workers, cleanup=cleanup, rebuild=rebuild, repair=repair) logger.info("Build finished") return generated
def farm(self, workers=1, cleanup=False, rebuild=False, repair=False, set_height_interval=common.DEFAULT_SET_HEIGHT_INTERVAL, delay=common.DEFAULT_DELAY, limit=None): """ Fully automatic client for users wishing a simple turnkey solution. This will run all functions automatically with the most sane defaults and as little user interface as possible. :param workers: Number of Number of threadpool workers. :param cleanup: Remove files in shard directory. :param rebuild: Re-generate any file shards. :param set_height_interval: Number of shards to generate before notifying the server. :param delay: Delay in seconds per ping of the server. :param limit: Number of seconds in the future to stop polling. """ workers = deserialize.positive_nonzero_integer(workers) set_height_interval = deserialize.positive_nonzero_integer( set_height_interval) cleanup = deserialize.flag(cleanup) rebuild = deserialize.flag(rebuild) repair = deserialize.flag(repair) # farmer never gives up self._init_messenger() self.messenger.retry_limit = 99999999999999999999999999999999999999 try: self.register() except exceptions.AddressAlreadyRegistered: pass # already registered ... self.build(workers=workers, cleanup=cleanup, rebuild=rebuild, repair=repair, set_height_interval=set_height_interval) self.poll(delay=delay, limit=limit) return True
def farm(self, workers=1, cleanup=False, rebuild=False, repair=False, set_height_interval=common.DEFAULT_SET_HEIGHT_INTERVAL, delay=common.DEFAULT_DELAY, limit=None): """ Fully automatic client for users wishing a simple turnkey solution. This will run all functions automatically with the most sane defaults and as little user interface as possible. :param workers: Number of Number of threadpool workers. :param cleanup: Remove files in shard directory. :param rebuild: Re-generate any file shards. :param set_height_interval: Number of shards to generate before notifying the server. :param delay: Delay in seconds per ping of the server. :param limit: Number of seconds in the future to stop polling. """ workers = deserialize.positive_nonzero_integer(workers) set_height_interval = deserialize.positive_nonzero_integer( set_height_interval ) cleanup = deserialize.flag(cleanup) rebuild = deserialize.flag(rebuild) repair = deserialize.flag(repair) # farmer never gives up self._init_messenger() self.messenger.retry_limit = 99999999999999999999999999999999999999 try: self.register() except exceptions.AddressAlreadyRegistered: pass # already registered ... self.set_bandwidth() self.build(workers=workers, cleanup=cleanup, rebuild=rebuild, repair=repair, set_height_interval=set_height_interval) self.poll(delay=delay, limit=limit) return True
def farm(self, cleanup=False, rebuild=False, set_height_interval=common.DEFAULT_SET_HEIGHT_INTERVAL, delay=common.DEFAULT_DELAY, limit=None): """ Fully automatic client for users wishing a simple turnkey solution. This will run all functions automatically with the most sane defaults and as little user interface as possible. """ set_height_interval = deserialize.positive_nonzero_integer( set_height_interval ) cleanup = deserialize.flag(cleanup) rebuild = deserialize.flag(rebuild) # farmer never gives up self._init_messenger() self.messenger.retry_limit = 99999999999999999999999999999999999999 try: self.register() except exceptions.AddressAlreadyRegistered: pass # already registered ... self.build(cleanup=cleanup, rebuild=rebuild, set_height_interval=set_height_interval) self.poll(delay=delay, limit=limit) return True