def create_torrent(file, port, try_vod = True):
    '''
    Creates a torrent for the given file. Returns a string representing the
    path to the torrent file.
    If try_vod is True try to add the playtime to the torrent making it "streamable".
    '''
    
    # generate torrent    
    tdef = TorrentDef()
    url = "http://localhost:%s/announce/" % port
    tdef.set_tracker(url)
    #tdef.set_create_merkle_torrent(True)
    #tdef.set_piece_length(self._pieceSize)
    
    if try_vod:
        torrent_name = FileUtils.get_relative_filename(file) + constants.TORRENT_VOD_EXT
        # set playtime
        playtime = videostats_via_ffmpeg(file)['playtime']
        print "playtime", playtime
    else:
        torrent_name = FileUtils.get_relative_filename(file) + constants.TORRENT_DOWNLOAD_EXT
        playtime = None
        print "Create a non-streamable torrent"
            
    tdef.add_content(file, playtime=playtime)
    tdef.finalize()
    
    torrent_dir = os.getcwd()
    torrent = os.path.join(torrent_dir, torrent_name)
    tdef.save(torrent)
    
    print "created torrent file: %s" % torrent
    print "Tracker uses the announce URL: %s" % tdef.get_tracker()

    return tdef
Exemplo n.º 2
0
 def _cleanup(self, signal=None, func=None):
     if self._config.get_delete_directories():
         FileUtils.remove_directory_recursively(
             self._config.get_directory())
         FileUtils.remove_directory_recursively(
             self._config.get_state_directory())
         self._logger.warn("Removed directories %s and %s" %
                           (self._config.get_directory(),
                            self._config.get_state_directory()))
 def _copy_files_to_client(self, from_dir, to_dir, is_seeder=False):
     from_files = [ from_dir + os.path.normcase('/') + self.FILE_RELATIVE + constants.TORRENT_DOWNLOAD_EXT ]
     if is_seeder:
         from_files.append(from_dir + os.path.normcase('/') + self.FILE_RELATIVE)
     for file in from_files:
         shutil.copy(file, to_dir + os.path.normcase('/') + \
                     FileUtils.get_relative_filename(file))
Exemplo n.º 4
0
def spawn_headless(ulrate):
    global seeder_proc, __TORRENT__, __DOWNLOAD__, __HEADLESS_SCRIPT__
    os.makedirs('basic_scenario_seeder')
    shutil.copyfile(__TORRENT__, os.path.join('basic_scenario_seeder', __TORRENT__))
    shutil.copyfile(__DOWNLOAD__, os.path.join('basic_scenario_seeder', FileUtils.get_relative_filename(__DOWNLOAD__)))
    shellcmd = 'python %s -p 50000 -d basic_scenario_seeder -x %i --single_torrent=%s' % (
            __HEADLESS_SCRIPT__, ulrate, os.path.join('basic_scenario_seeder', __TORRENT__))
    seeder_proc = Popen(shellcmd.split(' '), shell=__USE_SHELL__)
Exemplo n.º 5
0
 def _copy_files_to_client(self, from_dir, to_dir, is_seeder=False):
     from_files = [
         from_dir + os.path.normcase('/') + self.FILE_RELATIVE +
         constants.TORRENT_DOWNLOAD_EXT
     ]
     if is_seeder:
         from_files.append(from_dir + os.path.normcase('/') +
                           self.FILE_RELATIVE)
     for file in from_files:
         shutil.copy(file, to_dir + os.path.normcase('/') + \
                     FileUtils.get_relative_filename(file))
Exemplo n.º 6
0
def create_torrent(file, port, try_vod=True):
    '''
    Creates a torrent for the given file. Returns a string representing the
    path to the torrent file.
    If try_vod is True try to add the playtime to the torrent making it "streamable".
    '''

    # generate torrent
    tdef = TorrentDef()
    url = "http://localhost:%s/announce/" % port
    tdef.set_tracker(url)
    #tdef.set_create_merkle_torrent(True)
    #tdef.set_piece_length(self._pieceSize)

    if try_vod:
        torrent_name = FileUtils.get_relative_filename(
            file) + constants.TORRENT_VOD_EXT
        # set playtime
        playtime = videostats_via_ffmpeg(file)['playtime']
        print "playtime", playtime
    else:
        torrent_name = FileUtils.get_relative_filename(
            file) + constants.TORRENT_DOWNLOAD_EXT
        playtime = None
        print "Create a non-streamable torrent"

    tdef.add_content(file, playtime=playtime)
    tdef.finalize()

    torrent_dir = os.getcwd()
    torrent = os.path.join(torrent_dir, torrent_name)
    tdef.save(torrent)

    print "created torrent file: %s" % torrent
    print "Tracker uses the announce URL: %s" % tdef.get_tracker()

    return tdef
Exemplo n.º 7
0
 def __init__(self, client_config):
     self._config = client_config
     self._logger = logging.getLogger(self._get_name())
     self._local_reporter = None
     
     if self._config.get_logfile() is not None:
         logfile_directory = FileUtils.get_path_from_full_filename(self._config.get_logfile())
         if self._config.get_logfile().find(os.path.normcase('/')) > -1 and \
                 not os.access(logfile_directory, os.F_OK):
             os.mkdir(logfile_directory)
     
     torrent_file = self._config.get_single_torrent()
     if torrent_file is not None:
         if not os.access(torrent_file, os.F_OK):
             self._logger.error("The specified torrent file %s does not exist." % torrent_file)
             self._on_exit()
Exemplo n.º 8
0
def main():
    global __TORRENT__, __TORRENT_NEW__, __DOWNLOAD__, active_procs
    
    if len(sys.argv[1:]) != 1:
        print >>sys.stderr, 'Usage: %s <full download>' % sys.argv[0]
        sys.exit(1)
        
    __DOWNLOAD__ = sys.argv[1]
    __TORRENT__ = FileUtils.get_relative_filename(__DOWNLOAD__) + constants.TORRENT_DOWNLOAD_EXT
    __TORRENT_NEW__ = __TORRENT__ + '-new'
    
    check_dependencies()
    prepare_scenario()
    
    start_ts = time.time()
    last_vodclient_spawned = time.time()-30.0
    print >>sys.stderr, 'Spawning tracker process...'
    spawn_tracker()
    time.sleep(10)
    print >>sys.stderr, 'Fetching torrent from tracker...'
    shutil.copyfile(os.path.join('basic_scenario_tracker', __TORRENT__), __TORRENT__)
    print >>sys.stderr, 'Adding playtime information to %s' % __TORRENT__
    add_playtime_to_torrent(__TORRENT__)
    tdef = TorrentDef.load(__TORRENT_NEW__)
    bitrate = tdef.get_bitrate()
    print >>sys.stderr, 'Bitrate is: %i' % bitrate
    print >>sys.stderr, 'Spawning seeder process...'
    spawn_headless(bitrate*4)
    FINISH_TIME = 90 # experiment duration in seconds
    count = 0
    while (time.time() - start_ts <= FINISH_TIME):
        if count == 10:
            count = 0
            print >>sys.stderr, 'Scenario progress '+str(time.time() - start_ts)
        count+=1
        # remove finished vodclient processes
        active_procs = [p for p in active_procs if p.poll() == None]
        # check if we have to spawn a new vodclient
        ts = time.time()
        if ts - last_vodclient_spawned >= 30.0 and len(active_procs) < 2:
            print >>sys.stderr, '%s: Spawning new vod client... experiment progress is %f' % (str(ts), ts/start_ts*100)
            spawn_vodclient(bitrate/4, bitrate)
            last_vodclient_spawned = ts
        time.sleep(1.0)
    print >>sys.stderr, 'Emulation finished, finish and exit...'
    cleanup()
    os._exit(0)
Exemplo n.º 9
0
    def __init__(self, client_config):
        self._config = client_config
        self._logger = logging.getLogger(self._get_name())
        self._local_reporter = None

        if self._config.get_logfile() is not None:
            logfile_directory = FileUtils.get_path_from_full_filename(
                self._config.get_logfile())
            if self._config.get_logfile().find(os.path.normcase('/')) > -1 and \
                    not os.access(logfile_directory, os.F_OK):
                os.mkdir(logfile_directory)

        torrent_file = self._config.get_single_torrent()
        if torrent_file is not None:
            if not os.access(torrent_file, os.F_OK):
                self._logger.error(
                    "The specified torrent file %s does not exist." %
                    torrent_file)
                self._on_exit()
Exemplo n.º 10
0
def cleanup():
    global vodclient_dirs, tracker_proc, active_procs, seeder_proc
    print >>sys.stderr, 'Killing remaining processes...'
    tracker_proc.kill()
    seeder_proc.kill()
    seeder_proc.terminate()
    for vodclient_proc in active_procs:
        vodclient_proc.kill()
    print >>sys.stderr, 'Removing directories...'
    FileUtils.remove_directory_recursively('basic_scenario_tracker')
    FileUtils.remove_directory_recursively('basic_scenario_seeder')
    FileUtils.remove_directory_recursively('basic_scenario_files')
    for dir in vodclient_dirs:
        os.removedirs(dir)
    os.unlink(__TORRENT_NEW__)
 def tearDown(self):
     FileUtils.remove_directory_recursively(self.DIRECTORY_TRACKER)
     FileUtils.remove_directory_recursively(self.DIRECTORY_LEECHER)
     FileUtils.remove_directory_recursively(self.DIRECTORY_SEEDER)
Exemplo n.º 12
0
def prepare_scenario():
    global __DOWNLOAD__
    os.makedirs('basic_scenario_files')
    shutil.copyfile(__DOWNLOAD__, os.path.join('basic_scenario_files', FileUtils.get_relative_filename(__DOWNLOAD__)))
Exemplo n.º 13
0
 def _cleanup(self, signal=None, func=None):
     if self._config.get_delete_directories():
         FileUtils.remove_directory_recursively(self._config.get_directory())
         FileUtils.remove_directory_recursively(self._config.get_state_directory())
         self._logger.warn("Removed directories %s and %s" % (self._config.get_directory(),
                                                              self._config.get_state_directory()))
Exemplo n.º 14
0
 def tearDown(self):
     FileUtils.remove_directory_recursively(self.DIRECTORY_TRACKER)
     FileUtils.remove_directory_recursively(self.DIRECTORY_LEECHER)
     FileUtils.remove_directory_recursively(self.DIRECTORY_SEEDER)
Exemplo n.º 15
0
class TerminationTest(unittest.TestCase):

    DIRECTORY_TRACKER = "test/termination_tracker"
    DIRECTORY_SEEDER = "test/termination_seeder"
    DIRECTORY_LEECHER = "test/termination_leecher"

    FILE = FileUtils.get_current_script_directory(__file__) + \
           os.path.normcase('/') + "reports_large.zip"
    FILE_RELATIVE = FileUtils.get_relative_filename(FILE)

    _start_tracker = "sh tracker.sh -f " + DIRECTORY_TRACKER + \
                     " -u http://localhost:8859/announce -d " + DIRECTORY_TRACKER
    _start_client = "sh client.sh -d %s %s"
    _cmd_grep_tracker_pid = "ps -AF | grep tracker.sh"
    _cmd_grep_client_pid = "ps -AF | grep client.sh"

    def setUp(self):
        os.mkdir(self.DIRECTORY_TRACKER)
        os.mkdir(self.DIRECTORY_SEEDER)
        os.mkdir(self.DIRECTORY_LEECHER)

        shutil.copyfile(self.FILE, self.DIRECTORY_TRACKER + \
                        os.path.normcase('/') + self.FILE_RELATIVE)

    def tearDown(self):
        FileUtils.remove_directory_recursively(self.DIRECTORY_TRACKER)
        FileUtils.remove_directory_recursively(self.DIRECTORY_LEECHER)
        FileUtils.remove_directory_recursively(self.DIRECTORY_SEEDER)

    def suite(self):
        suite = unittest.TestSuite()
        suite.addTest(TerminationTest("testTerminateAfterDownload"))
        #suite.addTest(TerminationTest("testTerminateAfterPlayback"))
        #suite.addTest(TerminationTest("testTerminateAfterSeeding"))
        return suite

    def _copy_files_to_client(self, from_dir, to_dir, is_seeder=False):
        from_files = [
            from_dir + os.path.normcase('/') + self.FILE_RELATIVE +
            constants.TORRENT_DOWNLOAD_EXT
        ]
        if is_seeder:
            from_files.append(from_dir + os.path.normcase('/') +
                              self.FILE_RELATIVE)
        for file in from_files:
            shutil.copy(file, to_dir + os.path.normcase('/') + \
                        FileUtils.get_relative_filename(file))

    def testTerminateAfterDownload(self):
        start = time.time()
        pid_tracker = Popen(self._start_tracker, shell=True)
        time.sleep(5)
        self._copy_files_to_client(self.DIRECTORY_TRACKER,
                                   self.DIRECTORY_LEECHER,
                                   is_seeder=False)
        self._copy_files_to_client(self.DIRECTORY_TRACKER,
                                   self.DIRECTORY_SEEDER,
                                   is_seeder=True)
        pid_seeder = Popen(self._start_client % (self.DIRECTORY_SEEDER, ""),
                           shell=True)
        pid_leecher = Popen(self._start_client %
                            (self.DIRECTORY_LEECHER, "-e download -y 100"),
                            shell=True)
        # wait for the leecher to terminate
        pid_leecher.wait()
        diff = time.time() - start
        self.assertTrue(diff < 60)
        os.system("kill -9 %i" % (pid_tracker.pid + 2))
        os.system("kill -9 %i" % (pid_seeder.pid + 2))
        os.system("kill -9 %i" % (pid_tracker.pid + 1))
        os.system("kill -9 %i" % (pid_seeder.pid + 1))
        os.system("kill -9 %i" % (pid_seeder.pid + 0))

    def testTerminateAfterPlayback(self):
        start = time.time()
        pid_tracker = Popen(self._start_tracker, shell=True)
        time.sleep(5)
        self._copy_files_to_client(self.DIRECTORY_TRACKER,
                                   self.DIRECTORY_LEECHER,
                                   is_seeder=False)
        self._copy_files_to_client(self.DIRECTORY_TRACKER,
                                   self.DIRECTORY_SEEDER,
                                   is_seeder=True)
        pid_seeder = Popen(self._start_client % (self.DIRECTORY_SEEDER, ""),
                           shell=True)
        pid_leecher = Popen(self._start_client %
                            (self.DIRECTORY_LEECHER, "-e playback -y 100"),
                            shell=True)
        # wait for the leecher to terminate
        pid_leecher.wait()
        diff = time.time() - start
        self.assertTrue(diff < 120)
        print >> sys.stderr, "############### DIFF: %i" % diff
        os.system("kill -9 %i" % (pid_tracker.pid + 2))
        os.system("kill -9 %i" % (pid_seeder.pid + 2))
        os.system("kill -9 %i" % (pid_tracker.pid + 1))
        os.system("kill -9 %i" % (pid_seeder.pid + 1))
        os.system("kill -9 %i" % (pid_seeder.pid + 0))

    def testTerminateAfterSeeding(self):
        start = time.time()
        pid_tracker = Popen(self._start_tracker, shell=True)
        time.sleep(5)
        self._copy_files_to_client(self.DIRECTORY_TRACKER,
                                   self.DIRECTORY_LEECHER,
                                   is_seeder=False)
        self._copy_files_to_client(self.DIRECTORY_TRACKER,
                                   self.DIRECTORY_SEEDER,
                                   is_seeder=True)
        pid_seeder = Popen(self._start_client % (self.DIRECTORY_SEEDER, ""),
                           shell=True)
        pid_leecher = Popen(self._start_client %
                            (self.DIRECTORY_LEECHER, "-e seeding 20 -y 100"),
                            shell=True)
        # wait for the leecher to terminate
        pid_leecher.wait()
        diff = time.time() - start
        self.assertTrue(diff < 60)
        self.assertTrue(diff >= 20)
        os.system("kill -9 %i" % (pid_tracker.pid + 2))
        os.system("kill -9 %i" % (pid_seeder.pid + 2))
        os.system("kill -9 %i" % (pid_tracker.pid + 1))
        os.system("kill -9 %i" % (pid_seeder.pid + 1))
        os.system("kill -9 %i" % (pid_seeder.pid + 0))