示例#1
0
def exe_cmd_get_node(cur_node: Worker, **params) -> List[dict]:
    """

    :param cur_node:
    :param params: nodekey:List[str]
    :return:
    """
    target_nodekeys = params.get('nodekey', [])
    rdb = get_db(DB_CONTROL)
    coll = "node"
    nodes = rdb.hgetall(coll)
    result = []
    if not target_nodekeys:
        # 未指定则默认返回全部存活节点信息
        for nodekey, node_info in nodes.items():
            info = db_loads(node_info)
            if info.get('status', None) == NodeStatus.Running.name:
                info.update(nodekey=nodekey)
                result.append(info)
            else:
                pass
    else:
        for nodekey, node_info in nodes.items():
            if nodekey in target_nodekeys:
                info = db_loads(node_info)
                info.update(nodekey=nodekey)
                result.append(info)
            else:
                pass
    print('result: ', result)
    return result
示例#2
0
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        db = get_db()
        error = None

        if not username:
            error = 'Username is required.'
        elif not password:
            error = 'Password is required.'
        elif db.execute(
                'SELECT id FROM user WHERE username = ?', (username,)
        ).fetchone() is not None:
            error = 'User {} is already registered.'.format(username)

        if error is None:
            db.execute(
                'INSERT INTO user (username, password) VALUES (?, ?)',
                (username, generate_password_hash(password))
            )
            db.commit()
            return redirect(url_for('home'))

        flash(error)

    return render_template('auth/register.html')
    def listAll():
        db = get_db()
        parcel = db.execute(
            'SELECT parcel_py_ACRE FROM parcels WHERE OBJECTID = 1').fetchone(
            )

        return render_template('test.html', parcel=parcel)
示例#4
0
 def do_scan(self):
     """
     检查可用IP池是否充足 不足时从各个来源扫描IP 充足则拷贝
     更新到测试IP池self.test_pool
     :return:
     """
     rdb = get_db(DB_IP)
     for target_name in self.targets.keys():
         coll = "ip:{target}".format(target=target_name)
         size = rdb.scard(coll)
         # todo 保证不为空 目前为空抛出异常
         if size < self.min_supply:
             print('-->对于测试目标{tar} 可用IP池不足 开始进行扫描'.format(tar=target_name))
             IPs = self._scan_IP()
             print('-->对于测试目标{tar} 完成扫描'.format(tar=target_name))
             if not IPs:
                 raise Exception('No IP from this scan')
             else:
                 self.test_pool[target_name] = IPs
         else:
             raw_IPs = rdb.smembers(coll)
             if not raw_IPs:
                 raise Exception('No IP from this scan')
             else:
                 IPs = [IP(proxy=ip) for ip in raw_IPs]
                 print('-->对于测试目标{tar} 从可用IP池拉取到{num}个IP到测试池'.format(
                     tar=target_name, num=len(IPs)))
                 self.test_pool[target_name] = IPs
示例#5
0
def load_logged_in_user():
    user_id = session.get('user_id')

    if user_id is None:
        g.user = None
    else:
        g.user = get_db().execute(
            'SELECT * FROM user WHERE id = ?', (user_id,)
        ).fetchone()
示例#6
0
    def do_send_msg(self, nodekey: str, msg: Message):
        """
        将Message序列化 加入nodekey的消息队列
        :param nodekey:
        :param msg:
        :return:
        """

        rdb = get_db(DB_CONTROL)
        coll = "message:{node}".format(node=nodekey)
        meg_str = msg.dumps()
        rdb.rpush(coll, meg_str)
示例#7
0
 def _update_IPs(self, IPs: Set[str], target_name: str):
     """
     todo 不清空原有IP 根据历史表现删除失效IP
     :param IPs:
     :param target_name:
     :return:
     """
     if IPs:
         rdb = get_db(DB_IP)
         coll = "ip:{target}".format(target=target_name)
         rdb.sadd(coll, *IPs)
     else:
         pass
示例#8
0
 def receive_msg(self, nodekey: str) -> Message:
     """
     尝试从db: DB_CONTROL coll:message(nodekey:list)读取一个msg_str
     然后生成Message 队列中没有则生成空消息
     :return:
     """
     rdb = get_db(DB_CONTROL)
     coll = "message:{node}".format(node=nodekey)
     msg_str = rdb.lpop(coll)
     if not msg_str:
         return get_empty_message()
     else:
         print('------>收到消息', msg_str)
         return Message.loads(msg_str)
示例#9
0
 def _update_score(self, IP: str, target_name: str, good: bool) -> int:
     """
     根据一次测试后的结果good 在IP质量库redis DB_IP score:{target_name} (hash)更新其质量
     以0为基准 上下加减1
     :param IP:
     :param target_name:
     :param good:
     :return: 当前score
     """
     rdb = get_db(DB_IP)
     coll = "score:{target}".format(target=target_name)
     if good:
         return rdb.hincrby(coll, IP, amount=1)
     else:
         return rdb.hincrby(coll, IP, amount=-1)
示例#10
0
 def _delete_IPs(self, IPs: Set[str], target_name: str):
     """
     删除IPs中的IP
     :param IPs:
     :param target_name:
     :return:
     """
     if IPs:
         rdb = get_db(DB_IP)
         coll_IP = "ip:{target}".format(target=target_name)
         rdb.srem(coll_IP, *IPs)
         # todo 同时删除score 质量记录
         """
         coll_score = "score:{target}".format(target=target_name)
         rdb.hdel(coll_score, *IPs)
         """
     else:
         pass
示例#11
0
 def stop_node(self, nodekey: str):
     """
     停止当前节点 更新注册信息
     :param nodekey:
     :return:
     """
     # todo 不存在是否应该处理?
     if not nodekey:
         pass
     else:
         rdb = get_db(DB_CONTROL)
         coll = "node"
         if rdb.hexists(coll, nodekey):
             # todo 更新状态应该分离
             old = rdb.hget(coll, nodekey)
             new = db_update_dict(old, dict(status=NodeStatus.Stopped.name))
             rdb.hset(coll, nodekey, new)
         else:
             pass
示例#12
0
 def register_node(self, nodekey: str, nodefaculty: NodeFaculty):
     """
     将实例在控制中心DB_CONTROL中注册 包括以下信息
         nodekey 唯一id 成为一个node
         status Running
         faculty 职能
     :return:
     """
     if not nodekey:
         raise Exception("无法注册 缺少id")
     else:
         rdb = get_db(DB_CONTROL)
         coll = "node"
         if rdb.hexists(coll, nodekey):
             raise Exception("无法注册 已存在同名node", nodekey)
         else:
             # todo 更新状态应该分离
             print('完成注册节点', nodekey)
             rdb.hset(coll, nodekey, dict(faculty=nodefaculty.name, status=NodeStatus.Running.name))
示例#13
0
def find_to_who() -> str:
    """
    todo 负载均衡
    如果当时没有可用 等待
    :return: 一个可用Monitor的nodekey
    """
    rdb = get_db(DB_CONTROL)
    coll = "node"
    while True:
        nodes = rdb.hgetall(coll)
        for nodekey, node_info in nodes.items():
            info = db_loads(node_info)
            if info.get('faculty', None) == NodeFaculty.Monitor.name \
                    and info.get('status', None) == NodeStatus.Running.name:
                print('找到可用Monitor', nodekey)
                return nodekey
            else:
                continue
        print('当前没有可用Monitor,继续搜索')
        time.sleep(5)
示例#14
0
def exe_cmd_stop_node(cur_node: Worker, **params):
    """

    :param cur_node:
    :param params: nodekey:List[str]
    :return:
    """
    rdb = get_db(DB_CONTROL)
    coll = "node"
    target_nodekeys = params.get('nodekey', [])
    if not target_nodekeys:
        pass
    else:
        for nodekey in target_nodekeys:
            if not rdb.hexists(coll, nodekey):
                pass
            else:
                info = db_loads(rdb.hget(coll, nodekey))
                status = info.get('status', None)
                if status == NodeStatus.Running.name:
                    do_send_msg(nodekey, get_stop_message(src=cur_node.id))
                else:
                    pass
示例#15
0
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        db = get_db()
        error = None
        user = db.execute(
            'SELECT * FROM user WHERE username = ?', (username,)
        ).fetchone()

        if user is None:
            error = 'Incorrect username.'
        elif not check_password_hash(user['password'], password):
            error = 'Incorrect password.'

        if error is None:
            session.clear()
            session['user_id'] = user['id']
            return redirect(url_for('home'))

        flash(error)

    return render_template('auth/login.html')