def _main(): import optparse import sys from gonium import _debugging; _debugging.streamlogger_setup() op = optparse.OptionParser(usage='%prog [options] <lnfs_volume> <torrent meta file>...') op.add_option('-b', '--basepath', dest='basepath', default='.', metavar='PATH', help='Basepath to use for reading BT data') op.add_option('-r', '--reverse', default=False, action='store_true', help='Copy from LNFS to FS instead of the opposite direction') (options, args) = op.parse_args() basepath = options.basepath.encode() fn_vol = args[0] fns_bt = args[1:] sa = ServiceAggregate() sa.aio = None _log(20, 'Opening LNFS volume {0!a}.'.format(fn_vol)) vol = LNFSVolume(open(fn_vol,'r+b')) for fn_bt in fns_bt: _log(20, 'Reading metainfo from {0!a} and opening data files.'.format(fn_bt)) mi = BTMetaInfo.build_from_benc_stream(open(fn_bt,'rb')) btdiskio_v = btdiskio_v_build(sa, mi, basepath, mkdirs=options.reverse, mkfiles=options.reverse) btdiskio_lnfs = vol.btdiskio_build(sa, mi, basepath) _log(20, 'Copying data.') if (options.reverse): btdata_copy_b(sa, btdiskio_v, btdiskio_lnfs, mi.length_total) else: btdata_copy_b(sa, btdiskio_lnfs, btdiskio_v, mi.length_total) _log(20, 'Data copy finished.') _log(20, 'All done.')
def main(): import sys import logging import optparse from fcntl import LOCK_SH, LOCK_NB logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', stream=sys.stderr, level=logging.DEBUG) logger = logging.getLogger() log = logger.log op = optparse.OptionParser() op.add_option('--allow-other', dest='allow_other', action='store_true', default=False, help='Allow FS access for other users than the mounting one.') op.add_option('--fg', dest='foreground', action='store_true', default=False, help="Don't background after initialization.") (opts, args) = op.parse_args() (volfn, mountpoint, *mifns) = args lf = LNFSFuse() log(20, 'Opening and parsing LNFS volume.') volf = open(volfn, 'rb') vol = LNFSVolume(volf, LOCK_SH | LOCK_NB) lf.add_lnfs_vol(vol) log(20, 'Done.') log(20, 'Reading and parsing MI files ...') for fn in mifns: f = open(fn, 'rb') mi = BTMetaInfo.build_from_benc_stream(f) lf.add_mi(mi) log(20, 'Done.') lf.finish_setup() log(20, 'Init finished.') fuse_kwargs = {} if (opts.foreground): fuse_kwargs['foreground'] = True if (opts.allow_other): fuse_kwargs['allow_other'] = True fuse.FUSE(lf, mountpoint, nothreads=True, **fuse_kwargs)
def _data_prepare(self): if not (self.mi is None): raise Exception() self.log(20, 'Preparing data to transfer and generating metainfo.') rf = open('/dev/urandom','rb') hb = HashBuilder(self.piece_length) for cas in self.config_argsets: datadir = cas[1] if not (os.path.isdir(datadir)): os.mkdir(datadir) dd_intermediate = os.path.join(datadir, self.intermediate_ddname) if not (os.path.isdir(dd_intermediate)): os.mkdir(dd_intermediate) src_dd = self.config_argsets[0][1] i = 0 file_dicts = deque() dfns = deque() for dfl in self.dfile_lens: dfn = str(i).encode('ascii') pn = os.path.join(src_dd, self.intermediate_ddname, dfn) df = open(pn, 'w+b') _copyfile(rf, df, dfl) hb.add_file(df) df.close() dfns.append(pn) file_dicts.append({b'length':dfl, b'path':[dfn]}) i += 1 hb.finish() rf.close() mi = BTMetaInfo.build_from_dict({ b'announce':self._get_tracker_url(), b'info':{ b'name':self.intermediate_ddname, b'piece length':self.piece_length, b'pieces':b''.join(hb.digests), b'files':list(file_dicts) } }) self.mi = mi