def post(self, request): form, error = JsonParser(Argument('id', type=int, required=False), Argument('name', help='请输入角色名称'), Argument('desc', required=False)).parse(request.body) if error is None: if form.id: Role.objects.filter(pk=form.id).update(**form) else: Role.objects.create(created_by=request.user, **form) return json_response(error=error)
def parse_json(request): form, error = JsonParser( Argument('o_id', type=int, help='缺少必要参数'), Argument('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数'), Argument('env_id', type=int, help='缺少必要参数'), Argument('data', type=dict, help='缺少必要参数')).parse(request.body) if error is None: data = form.pop('data') _parse(request, form, data) return json_response(error=error)
def post(self, request): form, error = JsonParser( Argument('username', help='请输入登录名'), Argument('password', help='请输入密码'), Argument('nickname', help='请输入姓名'), Argument('role_id', type=int, help='请选择角色'), ).parse(request.body) if error is None: form.password_hash = User.make_password(form.pop('password')) form.created_by = request.user User.objects.create(**form) return json_response(error=error)
def get(self, request): form, error = JsonParser(Argument('id', type=int, help='参数错误'), Argument('path', help='参数错误')).parse(request.GET) if error is None: host = Host.objects.get(pk=form.id) if not host: return json_response(error='未找到指定主机') cli = host.get_ssh() objects = cli.list_dir_attr(form.path) return json_response([parse_sftp_attr(x) for x in objects]) return json_response(error=error)
def patch(self, request): form, error = JsonParser( Argument('id', type=int, required=False), Argument('zone', help='请输入主机类别') ).parse(request.body) if error is None: host = Host.objects.filter(pk=form.id).first() if not host: return json_response(error='未找到指定主机') count = Host.objects.filter(zone=host.zone, deleted_by_id__isnull=True).update(zone=form.zone) return json_response(count) return json_response(error=error)
def delete(self, request): form, error = JsonParser( Argument('id', type=int, help='参数错误'), Argument('file', help='请输入文件路径') ).parse(request.GET) if error is None: host = Host.objects.get(pk=form.id) if not host: return json_response(error='未找到指定主机') cli = host.get_ssh() cli.remove_file(form.file) return json_response(error=error)
def get(self, request): form, error = JsonParser(Argument('id', type=int, help='参数错误'), Argument('path', help='参数错误')).parse(request.GET) if error is None: if not has_host_perm(request.user, form.id): return json_response(error='无权访问主机,请联系管理员') host = Host.objects.get(pk=form.id) if not host: return json_response(error='未找到指定主机') objects = fetch_dir_list(host, form.path) return json_response(objects) return json_response(error=error)
def delete(self, request): form, error = JsonParser(Argument('id', type=int, help='参数错误'), Argument('file', help='请输入文件路径')).parse(request.GET) if error is None: if not has_host_perm(request.user, form.id): return json_response(error='无权访问主机,请联系管理员') host = Host.objects.get(pk=form.id) if not host: return json_response(error='未找到指定主机') with host.get_ssh() as ssh: ssh.remove_file(form.file) return json_response(error=error)
def patch(self, request): form, error = JsonParser( Argument('id', type=int, help='参数错误'), Argument('action', help='参数错误') ).parse(request.body) if error is None: rep = Repository.objects.filter(pk=form.id).first() if not rep: return json_response(error='未找到指定构建记录') if form.action == 'rebuild': Thread(target=dispatch, args=(rep,)).start() return json_response(rep.to_view()) return json_response(error=error)
def batch_valid(request): form, error = JsonParser( Argument('password', required=False), Argument('range', filter=lambda x: x in ('1', '2'), help='参数错误') ).parse(request.body) if error is None: if form.range == '1': # all hosts hosts = Host.objects.all() else: hosts = Host.objects.filter(is_verified=False).all() token = uuid.uuid4().hex Thread(target=batch_sync_host, args=(token, hosts, form.password)).start() return json_response({'token': token, 'hosts': {x.id: {'name': x.name} for x in hosts}}) return json_response(error=error)
def post(self, request): form, error = JsonParser( Argument('id', type=int, required=False), Argument('parent_id', type=int, default=0), Argument('name', help='请输入分组名称') ).parse(request.body) if error is None: if form.id: Group.objects.filter(pk=form.id).update(name=form.name) else: group = Group.objects.create(**form) group.sort_id = group.id group.save() return json_response(error=error)
def get(self, request): form, error = JsonParser( Argument('id', type=int, help='未指定操作对象'), Argument('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数'), Argument('env_id', type=int, help='缺少必要参数'), ).parse(request.GET) if error is None: form.o_id, data = form.pop('id'), [] for item in Config.objects.filter(**form).annotate(update_user=F('updated_by__nickname')): tmp = item.to_dict() tmp['update_user'] = item.update_user data.append(tmp) return json_response(data) return json_response(error=error)
def post(self, request): form, error = JsonParser( Argument('username', help='请输入登录名'), Argument('password', help='请输入密码'), Argument('nickname', help='请输入姓名'), Argument('role_id', type=int, help='请选择角色'), ).parse(request.body) if error is None: if User.objects.filter(username=form.username, deleted_by_id__isnull=True).exists(): return json_response(error=f'已存在登录名为【{form.username}】的用户') form.password_hash = User.make_password(form.pop('password')) form.created_by = request.user User.objects.create(**form) return json_response(error=error)
def post(self, request): form, error = JsonParser( Argument('id', type=int, required=False), Argument('zone', help='请输入主机类型'), Argument('name', help='请输主机名称'), Argument('username', handler=str.strip, help='请输入登录用户名'), Argument('hostname', handler=str.strip, help='请输入主机名或IP'), Argument('port', type=int, help='请输入SSH端口'), Argument('desc', required=False), Argument('password', required=False), ).parse(request.body) if error is None: if valid_ssh(form.hostname, form.port, form.username, form.pop('password')) is False: return json_response('auth fail') if form.id: Host.objects.filter(pk=form.pop('id')).update(**form) elif Host.objects.filter(name=form.name, deleted_by_id__isnull=True).exists(): return json_response(error=f'已存在的主机名称【{form.name}】') else: host = Host.objects.create(created_by=request.user, **form) if request.user.role: request.user.role.add_host_perm(host.id) return json_response(error=error)
def delete(self, request): form, error = JsonParser(Argument('id', type=int, required=False), Argument('expire', required=False)).parse(request.GET) if error is None: if form.id: DeployRequest.objects.filter(pk=form.id, status__in=('0', '1', '-1')).delete() if form.expire: count, _ = DeployRequest.objects.filter( created_at__lt=form.expire).delete() return json_response(count) return json_response(error=error)
def patch(self, request): form, error = JsonParser( Argument('id', type=int, help='参数错误'), Argument('rel_apps', type=list, required=False), Argument('rel_services', type=list, required=False)).parse(request.body) if error is None: app = App.objects.filter(pk=form.id).first() if not app: return json_response(error='未找到指定应用') app.rel_apps = json.dumps(form.rel_apps) app.rel_services = json.dumps(form.rel_services) app.save() return json_response(error=error)
def post(self, request): form, error = JsonParser( Argument('id', type=int, required=False), Argument('type', help='请输入任务类型'), Argument('name', help='请输入任务名称'), Argument('command', help='请输入任务内容'), Argument('targets', type=list, filter=lambda x: len(x), help='请选择执行对象'), Argument('trigger', filter=lambda x: x in dict(Task.TRIGGERS), help='请选择触发器类型'), Argument('trigger_args', help='请输入触发器参数'), Argument('desc', required=False), ).parse(request.body) if error is None: form.targets = json.dumps(form.targets) if form.id: Task.objects.filter(pk=form.id).update( updated_at=human_datetime(), updated_by=request.user, **form) task = Task.objects.filter(pk=form.id).first() if task and task.is_active: form.action = 'modify' form.targets = json.loads(form.targets) rds_cli = get_redis_connection() rds_cli.lpush(settings.SCHEDULE_KEY, json.dumps(form)) else: Task.objects.create(created_by=request.user, **form) return json_response(error=error)
def post(self, request): form, error = JsonParser( Argument('id', type=int, required=False), Argument('name', help='请输入组名'), Argument('contacts', type=list, help='请选择联系人'), Argument('desc', required=False)).parse(request.body) if error is None: form.contacts = json.dumps(form.contacts) if form.id: Group.objects.filter(pk=form.id).update(**form) else: form.created_by = request.user Group.objects.create(**form) return json_response(error=error)
def post(self, request): form, error = JsonParser( Argument('o_id', type=int, help='缺少必要参数'), Argument('env_id', type=int, help='缺少必要参数'), Argument('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数') ).parse(request.body) if error is None: data = [] for item in ConfigHistory.objects.filter(**form).annotate(update_user=F('updated_by__nickname')): tmp = item.to_dict() tmp['action_alias'] = item.get_action_display() tmp['update_user'] = item.update_user data.append(tmp) return json_response(data) return json_response(error=error)
def post(self, request): form, error = JsonParser(Argument('id', type=int, required=False), Argument('name', help='请输入服务名称'), Argument('key', help='请输入唯一标识符'), Argument('desc', required=False)).parse(request.body) if error is None: app = App.objects.filter(key=form.key).first() if app and app.id != form.id: return json_response(error=f'唯一标识符 {form.key} 已存在,请更改后重试') if form.id: App.objects.filter(pk=form.id).update(**form) else: App.objects.create(created_by=request.user, **form) return json_response(error=error)
def patch(self, request): form, error = JsonParser( Argument('id', type=int, required=False), Argument('name', help='机房名称'), Argument('desc', required=False), ).parse(request.body) if error is None: idc = Idc.objects.filter(pk=form.id).first() if not idc: return json_response(error='未找到机房') count = Idc.objects.filter( name=idc.name, deleted_by_id__isnull=True).update(name=form.name) return json_response(count) return json_response(error=error)
def get(self, request): form, error = JsonParser( Argument('id', type=int, help='参数错误'), Argument('file', help='请输入文件路径') ).parse(request.GET) if error is None: host = Host.objects.filter(pk=form.id).first() if not host: return json_response(error='未找到指定主机') filename = os.path.basename(form.file) cli = host.get_ssh().get_client() sftp = cli.open_sftp() f = sftp.open(form.file) return FileResponseAfter(cli.close, f, as_attachment=True, filename=filename) return json_response(error=error)
def post_diff(request): form, error = JsonParser( Argument('o_id', type=int, help='缺少必要参数'), Argument('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数'), Argument('envs', type=list, filter=lambda x: len(x), help='缺少必要参数'), ).parse(request.body) if error is None: data, form.env_id__in = {}, form.pop('envs') for item in Config.objects.filter(**form).order_by('key'): if item.key in data: data[item.key][item.env_id] = item.value else: data[item.key] = {'key': item.key, item.env_id: item.value} return json_response(list(data.values())) return json_response(error=error)
def do_task(request): form, error = JsonParser( Argument('host_ids', type=list, filter=lambda x: len(x), help='请选择执行主机'), Argument('command', help='请输入执行命令内容'), Argument('interpreter', default='sh'), Argument('template_id', type=int, required=False) ).parse(request.body) if error is None: if not has_host_perm(request.user, form.host_ids): return json_response(error='无权访问主机,请联系管理员') token, rds = uuid.uuid4().hex, get_redis_connection() for host in Host.objects.filter(id__in=form.host_ids): data = dict( key=host.id, name=host.name, token=token, interpreter=form.interpreter, hostname=host.hostname, port=host.port, username=host.username, command=form.command, pkey=host.private_key, ) rds.rpush(settings.EXEC_WORKER_KEY, json.dumps(data)) form.host_ids.sort() host_ids = json.dumps(form.host_ids) tmp_str = f'{form.interpreter},{host_ids},{form.command}' digest = hashlib.md5(tmp_str.encode()).hexdigest() record = ExecHistory.objects.filter(user=request.user, digest=digest).first() if form.template_id: template = ExecTemplate.objects.filter(pk=form.template_id).first() if not template or template.body != form.command: form.template_id = None if record: record.template_id = form.template_id record.updated_at = human_datetime() record.save() else: ExecHistory.objects.create( user=request.user, digest=digest, interpreter=form.interpreter, template_id=form.template_id, command=form.command, host_ids=json.dumps(form.host_ids), ) return json_response(token) return json_response(error=error)
def delete(self, request): form, error = JsonParser( Argument('id', type=int, help='请指定操作对象') ).parse(request.GET) if error is None: Deploy.objects.filter(pk=form.id).delete() return json_response(error=error)
def post(self, request): form, error = JsonParser(Argument('data', type=list, help='缺少必要的参数')).parse(request.body) if error is None: for item in form.data: AppSetting.set(**item) return json_response(error=error)
def email_test(request): form, error = JsonParser( Argument('server'), Argument('port', type=int), Argument('username'), Argument('password'), ).parse(request.body) if error is None: try: server = smtplib.SMTP_SSL(form.server, form.port) server.login(form.username, form.password) return json_response() except Exception as e: error = e.smtp_error.decode('utf-8') return json_response(error=error) return json_response(error=error)
def post(self, request): form, error = JsonParser(Argument('id', type=int, required=False), Argument('name', help='请输入模版名称'), Argument('type', help='请选择模版类型'), Argument('body', help='请输入模版内容'), Argument('desc', required=False)).parse(request.body) if error is None: if form.id: form.updated_at = human_datetime() form.updated_by = request.user ExecTemplate.objects.filter(pk=form.pop('id')).update(**form) else: form.created_by = request.user ExecTemplate.objects.create(**form) return json_response(error=error)
def delete(self, request): form, error = JsonParser(Argument('id', type=int, help='请指定操作对象')).parse(request.GET) if error is None: deploy = Deploy.objects.filter( host_ids__regex=fr'[^0-9]{form.id}[^0-9]').annotate( app_name=F('app__name'), env_name=F('env__name')).first() if deploy: return json_response( error= f'应用【{deploy.app_name}】在【{deploy.env_name}】的发布配置关联了该主机,请解除关联后再尝试删除该主机' ) task = Task.objects.filter( targets__regex=fr'[^0-9]{form.id}[^0-9]').first() if task: return json_response( error=f'任务计划中的任务【{task.name}】关联了该主机,请解除关联后再尝试删除该主机') detection = Detection.objects.filter(type__in=('3', '4'), addr=form.id).first() if detection: return json_response( error=f'监控中心的任务【{detection.name}】关联了该主机,请解除关联后再尝试删除该主机') role = Role.objects.filter( host_perms__regex=fr'[^0-9]{form.id}[^0-9]').first() if role: return json_response( error=f'角色【{role.name}】的主机权限关联了该主机,请解除关联后再尝试删除该主机') Host.objects.filter(pk=form.id).update( deleted_at=human_datetime(), deleted_by=request.user, ) return json_response(error=error)
def delete(self, request): form, error = JsonParser(Argument('id', type=int, help='缺少必要参数')).parse(request.GET) if error is None: DeployRequest.objects.filter(pk=form.id, status__in=('0', '1', '-1')).delete() return json_response(error=error)