示例#1
0
    def delete_user(self, user):
        if not self.is_owner(user):
            return False

        colls_table = self._get_user_colls(user)
        for coll in colls_table:
            self.delete_collection(user, coll)

        # user directory
        user_dir = self.path_router.get_user_account_root(user)
        rel_dir = os.path.relpath(user_dir, self.path_router.root_dir) + '/'

        # delete from remote storage
        self.storage_manager.delete_dir(rel_dir)

        user_key = self._user_key(user)

        with utils.pipeline(self.redis) as pi:
            pi.delete(user_key)
            pi.delete(user_key + self.COLL_KEY)

            pi.publish('delete_user', user_dir)

        # delete from cork!
        self.cork.user(user).delete()
        return True
示例#2
0
    def delete_user(self, user):
        if not self.is_owner(user):
            return False

        colls_table = self._get_user_colls(user)
        for coll in colls_table:
            self.delete_collection(user, coll)

        # user directory
        user_dir = self.path_router.get_user_account_root(user)
        rel_dir = os.path.relpath(user_dir, self.path_router.root_dir) + '/'

        # delete from remote storage
        self.storage_manager.delete_dir(rel_dir)

        user_key = self._user_key(user)

        with utils.pipeline(self.redis) as pi:
            pi.delete(user_key)
            pi.delete(user_key + self.COLL_KEY)

            pi.publish('delete_user', user_dir)

        # delete from cork!
        self.cork.user(user).delete()
        return True
示例#3
0
    def delete_collection(self, user, coll):
        if not self.can_admin_coll(user, coll):
            return False

        base_key = self.make_key(user, coll)
        keys = map(lambda x: base_key + x, self.ALL_KEYS)
        #key_q = '*' + user + ':' + coll + '*'
        #keys = self.redis.keys(key_q)

        coll_len = self.redis.hget(base_key + self.DEDUP_KEY, 'total_len')
        user_key = self._user_key(user)
        user_len = self.redis.hget(user_key, 'total_len')

        with utils.pipeline(self.redis) as pi:
            if coll_len:
                pi.hset(user_key, 'total_len', int(user_len) - int(coll_len))

            # delete all coll keys
            if keys:
                pi.delete(*keys)

            # send delete msg
            pi.publish('delete_coll', self.path_router.get_archive_dir(user, coll))

        # coll directory
        coll_dir = self.path_router.get_coll_root(user, coll)
        rel_dir = os.path.relpath(coll_dir, self.path_router.root_dir) + '/'

        # delete from remote storage
        self.storage_manager.delete_dir(rel_dir)

        # delete collection entry
        del self._get_user_colls(user)[coll]

        return True
示例#4
0
    def delete_anon_user(self, user):
        self.delete_collection(user, '@anon')

        user_dir = self.path_router.get_user_account_root(user)
        user_key = self._user_key(user)

        with utils.pipeline(self.redis) as pi:
            pi.delete(user_key)
            pi.delete(user_key + self.COLL_KEY)

            pi.publish('delete_user', user_dir)

        return True
示例#5
0
    def delete_anon_user(self, user):
        self.delete_collection(user, '@anon')

        user_dir = self.path_router.get_user_account_root(user)
        user_key = self._user_key(user)

        with utils.pipeline(self.redis) as pi:
            pi.delete(user_key)
            pi.delete(user_key + self.COLL_KEY)

            pi.publish('delete_user', user_dir)

        return True
示例#6
0
def archive_page():
    browser_type, archive, url = get_params()

    response_key = get_cache_key(archive, browser_type, url)
    wait_key = get_wait_key(archive, browser_type, url)

    queue_key = get_queue_key(browser_type)

    result = None

    if not rc.exists(response_key):
        cmd = dict(request.query)
        cmd['url'] = url

        num = rc.incr('total_urls:' + browser_type)
        cmd['num'] = num

        cmd = json.dumps(cmd)

        with pipeline(rc) as pi:
            waiting_str = {'archived': False,
                           'queued': True,
                           'num': num}

            pi.set(response_key, json.dumps(waiting_str))
            pi.rpush(queue_key, cmd)

        rc.blpop(wait_key, theconfig['wait_timeout_secs'])

    result = rc.get(response_key)

    if result:
        result = json.loads(result)

        if 'queued' in result:
            result['queue_pos'] = 0
            front = rc.lindex(queue_key, 0)
            if front:
                front = json.loads(front)
                front_num = front.get('num', 0)

                # pos == 1 implies this url is next up
                # pos <= 0 implies this url was removed from queue and is being processed
                pos = result['num'] - front_num + 1
                result['queue_pos'] = pos
        else:
            result['ttl'] = rc.ttl(response_key)
    else:
        result = ERROR_RESP

    return result
示例#7
0
def archive_page():
    browser_type, archive, url = get_params()

    response_key = get_cache_key(archive, browser_type, url)
    wait_key = get_wait_key(archive, browser_type, url)

    queue_key = get_queue_key(browser_type)

    result = None

    if not rc.exists(response_key):
        cmd = dict(request.query)
        cmd['url'] = url

        num = rc.incr('total_urls:' + browser_type)
        cmd['num'] = num

        cmd = json.dumps(cmd)

        with pipeline(rc) as pi:
            waiting_str = {'archived': False, 'queued': True, 'num': num}

            pi.set(response_key, json.dumps(waiting_str))
            pi.rpush(queue_key, cmd)

        rc.blpop(wait_key, theconfig['wait_timeout_secs'])

    result = rc.get(response_key)

    if result:
        result = json.loads(result)

        if 'queued' in result:
            result['queue_pos'] = 0
            front = rc.lindex(queue_key, 0)
            if front:
                front = json.loads(front)
                front_num = front.get('num', 0)

                # pos == 1 implies this url is next up
                # pos <= 0 implies this url was removed from queue and is being processed
                pos = result['num'] - front_num + 1
                result['queue_pos'] = pos
        else:
            result['ttl'] = rc.ttl(response_key)
    else:
        result = ERROR_RESP

    return result
示例#8
0
def run(rc, browser, archives, config, browser_type):
    """ Read from redis queue in a loop and use associated web driver
    to load page on demand
    """
    url = None
    queue_key = get_queue_key(browser_type)
    logging.debug(queue_key)

    while True:
        cmd = rc.blpop(queue_key, 10)

        if not cmd:
            continue

        val = json.loads(cmd[1])
        archive = val['archive']
        url = val['url']

        result_key = get_cache_key(archive, browser_type, url)
        wait_key = get_wait_key(archive, browser_type, url)

        try:
            result = archives[archive](browser, url)
            cache_time = config['archive_cache_secs']
        except Exception as e:
            import traceback
            traceback.print_exc()

            result = {'archived': False, 'error': {'msg': str(e)}}
            cache_time = config['err_cache_secs']

        json_result = json.dumps(result)
        actual_url = result.get('actual_url')

        with pipeline(rc) as pi:
            if actual_url and actual_url != url:
                actual_key = get_cache_key(archive, browser_type, actual_url)
                pi.setex(actual_key, cache_time, json_result)

            pi.setex(result_key, cache_time, json_result)

            pi.rpush(wait_key, 1)
            pi.expire(wait_key, cache_time)
示例#9
0
def run(rc, browser, archives, config, browser_type):
    """ Read from redis queue in a loop and use associated web driver
    to load page on demand
    """
    url = None
    queue_key = get_queue_key(browser_type)
    logging.debug(queue_key)

    while True:
        cmd = rc.blpop(queue_key, 10)

        if not cmd:
            continue

        val= json.loads(cmd[1])
        archive = val['archive']
        url = val['url']

        result_key = get_cache_key(archive, browser_type, url)
        wait_key = get_wait_key(archive, browser_type, url)

        try:
            result = archives[archive](browser, url)
            cache_time = config['archive_cache_secs']
        except Exception as e:
            import traceback
            traceback.print_exc()

            result = {'archived': False, 'error': {'msg': str(e) }}
            cache_time = config['err_cache_secs']

        json_result = json.dumps(result)
        actual_url = result.get('actual_url')

        with pipeline(rc) as pi:
            if actual_url and actual_url != url:
                actual_key = get_cache_key(archive, browser_type, actual_url)
                pi.setex(actual_key, cache_time, json_result)

            pi.setex(result_key, cache_time, json_result)

            pi.rpush(wait_key, 1)
            pi.expire(wait_key, cache_time)
示例#10
0
    def delete_collection(self, user, coll):
        if not self.can_admin_coll(user, coll):
            return False

        base_key = self.make_key(user, coll)
        keys = map(lambda x: base_key + x, self.ALL_KEYS)
        #key_q = '*' + user + ':' + coll + '*'
        #keys = self.redis.keys(key_q)

        coll_len = self.redis.hget(base_key + self.DEDUP_KEY, 'total_len')
        user_key = self._user_key(user)
        user_len = self.redis.hget(user_key, 'total_len')

        with utils.pipeline(self.redis) as pi:
            if coll_len:
                pi.hset(user_key, 'total_len', int(user_len) - int(coll_len))

            # delete all coll keys
            if keys:
                pi.delete(*keys)

            # send delete msg
            pi.publish('delete_coll',
                       self.path_router.get_archive_dir(user, coll))

        # coll directory
        coll_dir = self.path_router.get_coll_root(user, coll)
        rel_dir = os.path.relpath(coll_dir, self.path_router.root_dir) + '/'

        # delete from remote storage
        self.storage_manager.delete_dir(rel_dir)

        # delete collection entry
        del self._get_user_colls(user)[coll]

        return True