def get(): form, error = JsonParser( Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('tpl_query', type=dict, required=False), ).parse(request.args) if error is None: tpl_data = HostExecTemplate.query if form.page == -1: return json_response({ 'data': [x.to_json() for x in tpl_data.all()], 'total': -1 }) if form.tpl_query['name_field']: tpl_data = tpl_data.filter( HostExecTemplate.tpl_name.like('%{}%'.format( form.tpl_query['name_field']))) if form.tpl_query['type_field']: tpl_data = tpl_data.filter_by( tpl_type=form.tpl_query['type_field']) result = tpl_data.limit(form.pagesize).offset( (form.page - 1) * form.pagesize).all() return json_response({ 'data': [x.to_json() for x in result], 'total': tpl_data.count() }) return json_response(message=error)
def get(): form, error = JsonParser( Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('job_group', type=str, required=False),).parse(request.args) if error is None: if form.job_group: job = Job.query.filter_by(group=form.job_group).order_by(Job.enabled.desc()) else: job = Job.query.order_by(Job.enabled.desc()) total = job.count() job_data = job.limit(form.pagesize).offset((form.page - 1) * form.pagesize).all() jobs = [x.to_json() for x in job_data] now = datetime.now() for job in jobs: if not job['enabled']: job['next_run_time'] = '未启用' elif str(job['id']) in scheduler.jobs: next_run_time = scheduler.jobs[str(job['id'])].next_run_time if next_run_time is None: job['next_run_time'] = '已过期' else: job['next_run_time'] = human_diff_time(next_run_time.replace(tzinfo=None), now) elif job['trigger'] == 'date' and now > datetime.strptime(job['trigger_args'], '%Y-%m-%d %H:%M:%S'): job['next_run_time'] = '已过期' else: job['next_run_time'] = '异常' return json_response({'data': jobs, 'total': total}) return json_response(message=error)
def post(): form, error = JsonParser( Argument('app_id', type=int), Argument('env_id', type=int), Argument('menu_id', type=int), Argument('message', default=''), Argument('host_ids', type=list) ).parse() if error is None: pro = App.query.get_or_404(form.app_id) env = Environment.query.get_or_404(form.env_id) menu = DeployMenu.query.get_or_404(form.menu_id) ctr_name = '%s.%s' % (pro.identify, env.identify) if menu.position == 2: cli = Host.query.get_or_404(form.host_ids[0]) ctr = Container(cli.docker_uri, ctr_name) if menu.display_type == 2: exec_code, _ = ctr.exec_command_with_base64(menu.command, form.message, with_exit_code=True) return json_response(exec_code) elif menu.display_type == 1: token = uuid.uuid4().hex queue = QueuePool.make_queue(token, 1) queue.containers = [ctr] Thread(target=do_exec_with_stream, args=(token, ctr, menu.command, form.message, 10 * 60)).start() return json_response(token) # 发布区自定义菜单只允许通知成功与否,固无需判断display_type elif menu.position == 1: token = uuid.uuid4().hex hosts = Host.query.filter(Host.id.in_(form.host_ids)).all() queue = QueuePool.make_queue(token, len(hosts)) for cli in hosts: ctr = Container(cli.docker_uri, ctr_name) Thread(target=do_exec, args=(queue, ctr, cli.name, menu.command, form.message)).start() return json_response({'token': token, 'data': [{'name': x.name} for x in hosts]})
def post(): form, error = JsonParser('name', 'group', 'desc', 'command_user', 'command', 'targets', Argument('command_user', default='root')).parse() if error is None: Job(**form).save() return json_response(message=error)
def post(): form, error = JsonParser('user_id', 'db_user', 'db_password', 'db_database', 'db_priv', Argument('desc', nullable=True, required=False)).parse() if error is None: if not User.query.filter_by(id=form.user_id).first(): return json_response(message="管理员账号错误") if UserInfo.query.filter_by(user_id=form.user_id, db_user=form.db_user).first(): return json_response(message="账号已存在,不能重复创建") cli = User.query.get_or_404(form.user_id) try: with MysqlClient(ip=cli.db_host, user=cli.db_user, password=cli.db_password, port=cli.db_port, db=form.db_database) as f: f.grant_priv(form.db_user, form.db_password, form.db_database, form.db_priv) except Exception as e: return json_response(message='连接失败') host = UserInfo(user_id=form.user_id, db_user=form.db_user, db_password=form.db_password, desc=form.desc) host.save() userpriv = UserPriv(account_id=host.id, db_database=form.db_database, db_priv=form.db_priv) userpriv.save() return json_response(host) return json_response(message=error)
def put(cfg_id): form, error = JsonParser( Argument('type', default='', filter=lambda x: x in ['private', 'public']), 'short_name', 'desc', 'value').parse() if error is None: config_key = ConfigKey.query.get_or_404(cfg_id) owner = type_id_to_model_instance(config_key.owner_type, config_key.owner_id) if form.type in ['private']: form.name = form.pop('short_name').upper() else: form.name = (owner.identify + '_' + form.pop('short_name')).upper() exists_key = first_config_key(config_key.owner_type, config_key.owner_id, form) if exists_key and exists_key.id != cfg_id: return json_response(message='重复的变量名称!') for env_id, value in form.pop('value').items(): config_value = ConfigValue.query.filter_by( env_id=env_id, key_id=config_key.id).first() if config_value: config_value.update(value=value) else: ConfigValue(key_id=config_key.id, env_id=env_id, value=value).save() config_key.update(**form) return json_response() return json_response(message=error)
def changeprivileges(priv_id): form, error = JsonParser('db_priv', 'user_id', 'account_id').parse() if form.db_priv == '只读': form.db_priv = '0' elif form.db_priv == '读写': form.db_priv = '1' else: return json_response(message='权限传递错误') if error is None: host = UserPriv.query.get_or_404(priv_id) account = UserInfo.query.get_or_404(form.account_id) cli = User.query.get_or_404(form.user_id) try: with MysqlClient(ip=cli.db_host, user=cli.db_user, password=cli.db_password, port=cli.db_port) as f: f.revoke_priv(account.db_user, host.db_database, host.db_priv) f.grant_priv(account.db_user, account.db_password, host.db_database, form.db_priv, 0) host.update(db_priv=form.db_priv) return json_response() except Exception as e: return json_response(message='连接失败') return json_response(message=error)
def adddatabase(account_id): form, error = JsonParser('db_database', 'db_priv').parse() account = UserInfo.query.get_or_404(account_id) cli = User.query.get_or_404(account.user_id) if error is None: try: with MysqlClient(ip=cli.db_host, user=cli.db_user, password=cli.db_password, port=cli.db_port) as f: res = f.basename() sql = 'create database ' + form.db_database if form.db_database in res: return json_response(message='数据库已存在不能重复创建') f.execute(sql) f.grant_priv(account.db_user, '', form.db_database, form.db_priv, 0) userpriv = UserPriv(account_id=account_id, db_database=form.db_database, db_priv=form.db_priv) userpriv.save() return json_response() except Exception as e: return json_response(message='连接失败') return json_response(message=error)
def get_schedule(): form, error = JsonParser( Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('job_group', type=str, required=False), Argument('job_name', type=str, required=False), Argument('job_id', type=int, required=False), ).parse(request.args) if error is None: job = db.session.query(JobSchedule) if form.job_group: job = JobSchedule.query.filter_by(group=form.job_group).order_by( JobSchedule.update_time.desc()) if form.job_name: job = job.filter( JobSchedule.job_name.like("%" + form.job_name + "%")) if form.job_id: job = job.filter_by(job_id=form.job_id) job = job.order_by(JobSchedule.update_time.desc()) total = job.count() job_data = job.limit(form.pagesize).offset( (form.page - 1) * form.pagesize).all() jobs = [x.to_json() for x in job_data] return json_response({'data': jobs, 'total': total}) return json_response(message=error)
def kill_job(): form, error = JsonParser( 'job_schedule_name', 'kill_user', 'hosts_id', 'id', Argument('command', type=str, default='bash /tensorflow/arena_stop/arena_job_kill.sh', required=False), ).parse() print("hosts_id" + str(form.hosts_id) + " command:" + form.command) # 这里操作是ssh后初始化环境变量 new_command = "source /etc/profile &&. /etc/profile && " + form.command + " " + form.kill_user + " " + form.job_schedule_name + " " + str( form.id) if error is None: ip_list = Host.query.filter(Host.id.in_(tuple(form.hosts_id))).all() token = uuid.uuid4().hex q = QueuePool.make_queue(token, len(ip_list)) for h in ip_list: print(h.ssh_ip) Thread(target=hosts_exec, args=(q, h.ssh_ip, 'ad_user', h.ssh_port, new_command)).start() return json_response(token) return json_response(message=error)
def put(img_id): form, error = JsonParser('desc').parse() if error is None: image = Image.query.get_or_404(img_id) image.update(**form) return json_response() return json_response(message=error)
def put(job_id): form, error = JsonParser('name', 'group', 'desc', 'command', 'targets', Argument('command_user', default='root')).parse() if error is None: job = Job.query.get_or_404(job_id) job.update(**form) return json_response(message=error)
def get(): form, error = JsonParser( Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('host_query', type=dict, default={}), ).parse(request.args) if error is None: host_data = Host.query if form.page == -1: return json_response({ 'data': [x.to_json() for x in host_data.all()], 'total': -1 }) if form.host_query.get('name_field'): host_data = host_data.filter( Host.name.like('%{}%'.format(form.host_query['name_field']))) if form.host_query.get('zone_field'): host_data = host_data.filter_by(zone=form.host_query['zone_field']) result = host_data.limit(form.pagesize).offset( (form.page - 1) * form.pagesize).all() return json_response({ 'data': [x.to_json() for x in result], 'total': host_data.count() }) return json_response(message=error)
def post(): form, error = JsonParser('name', 'identify', 'desc', 'priority').parse() if error is None: env = Environment(**form) env.save() return json_response(env) return json_response(message=error)
def bind_menus(app_id): all_valid_menus = get_built_in_menus() form, error = JsonParser( Argument('name', filter=lambda x: x in all_valid_menus, help='无效的菜单名称!', default=''), Argument('command', default='')).parse() if error is None: if form.name is '': # 可能通过发布页提供的添加预定义菜单的请求,格式[{name: 'x', desc: 'x', command: 'x'} ...] post_data = request.get_json() if isinstance(post_data, list) and all([ isinstance(x, dict) and x['name'] in all_valid_menus for x in post_data ]): for item in post_data: tmp = all_valid_menus[item['name']] tmp['command'] = item.get('command') tmp['app_id'] = app_id DeployMenu.upsert({ 'app_id': app_id, 'name': item['name'] }, **tmp) return json_response() else: return json_response(message='错误的参数!') form.desc = get_built_in_menus()[form.name]['desc'] form.app_id = app_id DeployMenu.upsert({'app_id': app_id, 'name': form.name}, **form) return json_response(message=error)
def bind_hosts(app_id): form, error = JsonParser('ids', 'env_id').parse() if error is None: pro = App.query.get_or_404(app_id) env = Environment.query.get_or_404(form.env_id) old_relationships = AppHostRel.query.filter_by(env_id=form.env_id, app_id=app_id).all()[:] for host_id in form.ids: rel = AppHostRel(env_id=form.env_id, app_id=app_id, host_id=host_id) if rel in old_relationships: old_relationships.remove(rel) else: rel.add() for old_rel in old_relationships: host = Host.query.get_or_404(old_rel.host_id) try: app_process = Container(host.docker_uri, '%s.%s' % (pro.identify, env.identify)).info if app_process: return json_response( message='在主机 <%s> 上已经部署了该应用,请删除已部署的容器后再尝试解除关联!' % host.name) except DockerException: pass old_rel.delete(commit=False) db.session.commit() return json_response() return json_response(message=error)
def login(): form, error = JsonParser('username', 'password').parse() if error is None: user = User.query.filter_by(username=form.username).first() if user: if user.is_active: if user.verify_password(form.password): login_limit.pop(form.username, None) # token = uuid.uuid4().hex token = user.access_token user.access_token = token user.token_expired = time.time() + 8 * 60 * 60 user.save() return json_response({ 'token': token, 'is_supper': user.is_supper, 'nickname': user.nickname, 'permissions': list(user.permissions) }) else: login_limit[form.username] += 1 if login_limit[form.username] >= 3: user.update(is_active=False) return json_response(message='用户名或密码错误,连续3次错误将会被禁用') else: return json_response(message='用户已被禁用,请联系管理员') elif login_limit[form.username] >= 3: return json_response(message='用户已被禁用,请联系管理员') else: login_limit[form.username] += 1 return json_response(message='用户名或密码错误,连续3次错误将会被禁用') else: return json_response(message='请输入用户名和密码')
def get(): form, error = JsonParser( Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('name', type=str, required=False), ).parse(request.args) if error is None: user = User.query.filter_by(is_supper=False) if form.name: user = user.filter(User.nickname.like('%{}%'.format(form.name))) total = user.count() users = [] now_time = datetime.now() for item in user.limit(form.pagesize).offset( (form.page - 1) * form.pagesize).all(): data = item.to_json(excludes=('password_hash', 'access_token', 'token_expired')) if item.token_expired: data['last_login'] = human_diff_time( now_time, datetime.fromtimestamp(item.token_expired - 8 * 60 * 60)) + '前' else: data['last_login'] = '******' users.append(data) return json_response({'data': users, 'total': total}) return json_response(message=error)
def get(): form, error = JsonParser( Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('notify_query', type=dict, required=False), ).parse(request.args) if error is None: notify_data = NotifyWay.query if form.page == -1: return json_response({ 'data': [x.to_json() for x in notify_data.all()], 'total': -1 }) if form.notify_query.get('name_field'): notify_data = notify_data.filter( NotifyWay.name.like('%{}%'.format( form.notify_query['name_field']))) result = notify_data.limit(form.pagesize).offset( (form.page - 1) * form.pagesize).all() return json_response({ 'data': [x.to_json() for x in result], 'total': notify_data.count() }) return json_response(message=error)
def setting_post(owner_id): form, error = JsonParser( Argument('name', filter=lambda x: x in [ '__MEM_LIMIT', '__NETWORK_MODE', '__EXPOSE_PORT', '__BIND_VOLUME', '__DNS_SERVER', '__HOST_NAME' ], help='无效的设置参数!'), Argument('value', type=dict), 'desc').parse() if error is None: ok, message = valid_app_setting(form.name, form.value.values()) if not ok: return json_response(message=message) values = form.pop('value') config_key = ConfigKey.query.filter_by(owner_type='app', owner_id=owner_id, name=form.name, type='system').first() if not config_key: config_key = ConfigKey(owner_type='app', owner_id=owner_id, type='system', **form).save() for env_id, value in values.items(): config_value = ConfigValue.query.filter_by( env_id=env_id, key_id=config_key.id).first() if config_value: config_value.update(value=value) else: ConfigValue(key_id=config_key.id, env_id=env_id, value=value).save() return json_response() return json_response(message=error)
def post(): form, error = JsonParser('tpl_name', 'tpl_type', 'tpl_content', Argument('tpl_desc', nullable=True, required=False)).parse() if error is None: tpl = HostExecTemplate(**form) tpl.save() return json_response(tpl) return json_response(message=error)
def put(host_id): form, error = JsonParser('name', 'type', 'zone', 'docker_uri', 'ssh_ip', 'ssh_port', Argument('desc', nullable=True, required=False)).parse() if error is None: host = Host.query.get_or_404(host_id) host.update(**form) return json_response(host) return json_response(message=error)
def post(): form, error = JsonParser('name', 'type', 'zone', 'docker_uri', 'ssh_ip', 'ssh_port', Argument('desc', nullable=True, required=False)).parse() if error is None: host = Host(**form) host.save() return json_response(host) return json_response(message=error)
def put(env_id): form, error = JsonParser('name', 'identify', 'desc', 'priority').parse() if error is None: env = Environment.query.get_or_404(env_id) env.update(**form) env.save() return json_response(env) return json_response(message=error)
def publish_permission(role_id): form, error = JsonParser(Argument('app_ids', type=list), Argument('env_ids', type=list)).parse() if error is None: str_app_ids = [str(x) for x in form.app_ids] str_env_ids = [str(x) for x in form.env_ids] role = Role.query.get_or_404(role_id) role.update(app_ids=','.join(str_app_ids), env_ids=','.join(str_env_ids)) return json_response(message=error)
def put(tpl_id): form, error = JsonParser('tpl_name', 'tpl_type', 'tpl_content', Argument('tpl_desc', nullable=True, required=False)).parse() if error is None: tpl = HostExecTemplate.query.get_or_404(tpl_id) tpl.update(**form) return json_response(tpl) return json_response(message=error)
def put(user_id): form, error = JsonParser('name', 'type', 'zone', 'db_host', 'db_user', 'db_password','db_port', Argument('desc', nullable=True, required=False)).parse() if error is None: host = User.query.get_or_404(user_id) host.update(**form) return json_response(host) return json_response(message=error)
def post(): form, error = JsonParser('name', 'type', 'zone', 'db_host', 'db_user', 'db_password','db_port', Argument('desc', nullable=True, required=False)).parse() if error is None: host = User(**form) host.save() return json_response(host) return json_response(message=error)
def post_image(img_id): form, error = JsonParser(args.name, args.desc, args.value).parse() if error is None: if ImageConfig.query.filter_by(img_id=img_id, name=form.name).first(): return json_response(message='已存在相同的变量名称!') ImageConfig(img_id=img_id, **form).save() return json_response() return json_response(message=error)
def setting_info(): form, error = JsonParser( Argument('nickname', help='请输入昵称'), Argument('mobile', help='请输入手机号码'), Argument('email', help='请输入电子邮件地址'), ).parse() if error is None: g.user.update(**form) return json_response(message=error)