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
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)
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
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()
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)
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
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)
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)
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
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
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))
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)
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
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')