Exemplo n.º 1
0
Arquivo: views.py Projeto: wxxyd/iauto
 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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
Arquivo: views.py Projeto: zzti/spug
 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)
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
Arquivo: views.py Projeto: ShiYY/spug
 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)
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
 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)
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
 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)
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
Arquivo: views.py Projeto: wxxyd/iauto
    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)
Exemplo n.º 15
0
 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)
Exemplo n.º 16
0
 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)
Exemplo n.º 17
0
Arquivo: views.py Projeto: zzti/spug
 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)
Exemplo n.º 18
0
 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)
Exemplo n.º 19
0
 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)
Exemplo n.º 20
0
 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)
Exemplo n.º 21
0
 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)
Exemplo n.º 22
0
Arquivo: views.py Projeto: ShiYY/spug
 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)
Exemplo n.º 23
0
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)
Exemplo n.º 24
0
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)
Exemplo n.º 25
0
 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)
Exemplo n.º 26
0
 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)
Exemplo n.º 27
0
Arquivo: views.py Projeto: ymyang/spug
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)
Exemplo n.º 28
0
 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)
Exemplo n.º 29
0
Arquivo: views.py Projeto: 9233/spug
 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)
Exemplo n.º 30
0
 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)