def verify_ffmpeg_existence(RepositoryRoot):
    commandPath = os.path.join(RepositoryRoot, FFMPEG_PATH_SUFFIX)
    if ryw.is_valid_file(commandPath, 'verify_ffmpeg_existence'):
        return commandPath
    ryw.give_news('Cannot find ffmpeg.  Advise you to install it.',
                  logging.info)
    return commandPath
def copy_queue_file(tmpdir, name):
    
    rfpath = os.path.join(RepositoryRoot, 'QUEUES', name)
    if not ryw.is_valid_file(rfpath, 'copy_queue_file'):
        ryw.give_bad_news('copy_queue_file: queue file invalid: ' + rfpath,
                          logging.error)
        return (0, '')
    
    freeKB = ryw.free_MB(tmpdir) * 1024
    success,bytes = ryw.get_file_size(rfpath)
    if not success:
        return (0, '')
    kB = math.ceil(bytes / 1024.0)

    if pretty_much_out_of_space(kB, freeKB):
        ryw.give_bad_news(
            'user_error: nearly out of space while uploading queue, KB: ' + repr(kB), logging.error)
        return (0, '')

    #appendedName = name + '_selection'
    appendedName = 'saved_selection'
    tmpFileName = os.path.join(tmpdir, appendedName)
    try:
        shutil.copyfile(rfpath, tmpFileName)
    except:
        ryw.give_bad_news('copy_queue_file: failed to copy queue file: ' +
                          rfpath + ' -> ' + tmpFileName,
                          logging.critical)
        return (0, '')

    return (bytes, appendedName)
def copy_reverse_lists(repDir):
    ryw.give_news2('copying reverse lists...   ', logging.info)
    logging.debug('copy_reverse_lists: ' + repDir)

    reverseListsFile = os.path.join(RepositoryRoot, 'ReverseLists')
    if not ryw.is_valid_file(reverseListsFile, 'copy_reverse_lists:'):
        ryw.give_news2('not found: ' + reverseListsFile + '<BR>',
                       logging.info)
        return True

    success,reverseLists = ReverseLists.open_reverse_lists(
        'AddRobotWriteRequests.copy_reverse_lists:',
        '', '', reverseListsFile, False,
        allowNullSearchFile = True)
    if not success:
        return False

    dst = os.path.join(repDir, 'ReverseLists')
    
    try:
        shutil.copyfile(reverseListsFile, dst)
    except:
        ryw.give_bad_news('copy_reverse_lists failed: ' +
                          reverseListsFile + ' ' + dst, logging.critical)
        if reverseLists:
            reverseLists.done()
        return False

    if reverseLists:
        reverseLists.done()
    
    logging.debug('copy_reverse_lists: ' + reverseListsFile + ' ' + dst)
    ryw.give_news2('done.<BR>', logging.info)
    return True    
def merge_incoming(existingName, incomingName, repositoryRoot,
                   searchFile=None):
    """called by ProcessDiscs.py"""

    logging.info('merge_incoming: ' + existingName + ' <- ' + incomingName)
    
    if not ryw.is_valid_file(incomingName, 'copy_reverse_lists:'):
        ryw.give_news3('merge_incoming: incoming ReverseLists not found.',
                       logging.info)
        return True

    if not searchFile:
        success,searchFile = ryw.open_search_file(
            'merge_incoming:',
            os.path.join(RepositoryRoot, 'WWW', 'logs'),
            'upload.log',
            os.path.join(RepositoryRoot, 'SearchFile'),
            False)
        if not success:
            if searchFile:
                searchFile.done()
            ryw.give_bad_news('merge_incoming: open search file failed. ',
                              logging.critical)
            return False

    success,existingRL = open_reverse_lists('ReverseLists.merge_incoming:',
                                            '', '', existingName, True,
                                            searchFile = searchFile,
                                            repositoryRoot = repositoryRoot)
    if not success:
        ryw.give_bad_news('merge_incoming: failed to open existing list.',
                          logging.critical)
        if existingRL:
            existingRL.done()
        return False

    success,incomingRL = open_reverse_lists('ReverseLists.merge_incoming:',
                                            '', '', incomingName, False,
                                            skipLk = True,
                                            allowNullSearchFile = True)
    if not success:
        ryw.give_bad_news('merge_incoming: failed to open incoming list.',
                          logging.error)
        if incomingRL:
            incomingRL.done()
        return False
        
    success = existingRL.merge(incomingRL, repositoryRoot)

    existingRL.done()
    incomingRL.done()

    if searchFile:
        searchFile.done()
    return success
def get_reqs(rfpath):
    if not os.path.exists(rfpath):
        #logging.debug('get_reqs: no existing request found.')
        return set('')

    if not ryw.is_valid_file(rfpath, msg='get_reqs'):
        ryw.give_bad_news('get_reqs: not a valid file: ' + rfpath,
                          logging.error)
        return set('')

    try:
        reqs = su.pickload(rfpath)
        logging.debug('get_reqs: get_reqs succeeded.')
        return reqs
    except:
        ryw.give_bad_news(
            'fatal_error: get_reqs: failed to load requests :' + rfpath, 
            logging.critical)
        return None
    def __read_reverse_lists_file(self):
        """lock held if instantiate for write.
        lock released if instantiate for read.
        skipLk is True when dealing with merging
        incoming ReverseLists file"""
        
        assert(self.reverseListsFile != None)

        if not ryw.is_valid_file(self.reverseListsFile,
                                 msg='__read_reverse_lists_file'):
            ryw.give_bad_news('__read_reverse_lists_file: '+
                              'not a valid file: ' + self.reverseListsFile,
                              logging.error)
            return False

        if not self.skipLock:
            if not self._ReverseLists__lock():
                self._ReverseLists__unlock()
                return False

        try:
            self.reverseDict = su.pickload(self.reverseListsFile)
        except:
            ryw.give_bad_news(
                '__read_reverse_lists_file: ' +
                'failed to open reverse lists file: ' +
                self.reverseListsFile, logging.critical)
            self._ReverseLists__unlock()
            return False

        if not self.skipLock:
            if not self.exclusive:
                self._ReverseLists__unlock()

        #logging.debug('ReverseLists.__read_reverse_lists_file: ' +
        #              repr(self.reverseDict))
        return True
def verify_ffmpeg_existence(RepositoryRoot):
    commandPath = r"/usr/bin/ffmpeg"
    if ryw.is_valid_file(commandPath, "verify_ffmpeg_existence"):
        return commandPath
    ryw.give_news("Cannot find ffmpeg.  Advise you to install it.", logging.info)
    return None
def sudo_chmod(path, smode="777", imode=0777, repositoryRoot=None):
    """from ryw.chmod_tree(). smode is a string, like '666' or '777'
    imode is a numbr, like 0666 or 0777.
    smode is used on Linux.
    imode is used on XP.
    caller should supply both.
    """

    if repositoryRoot == None:
        repositoryRoot = RepositoryRoot

    # chmodPath = os.path.join(repositoryRoot, 'etc', 'chmod')
    chmodPath = os.path.join("/usr/local/bin", "cmod2")

    if not ryw.is_valid_file(chmodPath):
        ryw.give_bad_news("Cannot find suid chmod. Advise you to fix this.", logging.error)
        return

    command = chmodPath + " " + smode + " " + path
    ret = subprocess.call(command, shell=True)

    if ret != 0:
        ryw.give_bad_news("sudo_chmod failed on " + path, logging.error)


#
# moved from ryw_ffmpeg.py
#
def verify_ffmpeg_existence(RepositoryRoot):
    commandPath = r"/usr/bin/ffmpeg"