Beispiel #1
0
 def create(self, request, *args, **kwargs):
     # 删除denied里的key操作
     serializer = self.get_serializer(data=request.data)
     serializer.is_valid(raise_exception=True)
     minions = request.data.get('minion_id')
     # 删除denied里的key比较特殊无法通过saltkey_delete_api来删除因为denied的产生是在已接受key中已经存在了同名的minion_id,然后原来
     # 应该存在于未认证列表中的key就会被salt存放到denied里,而通过salt-key -d删除key会把已接受的key一起删除,官方没有提出解决办法,所以
     # 只能通过命令行cmd的方式用rm删除实际存放的文件来销毁denied里的key
     minions = ' '.join(minions)
     with requests.Session() as s:
         saltapi = SaltAPI(session=s)
         # 注意master的minion_id没有设置错误一般删除没都问题
         response_data = saltapi.cmd_run_api(
             tgt=settings.SITE_SALT_MASTER,
             arg='cd /etc/salt/pki/master/minions_denied/ && rm -rf %s' %
             minions)
         if response_data['status'] is False:
             response_data = {'results': '删除key失败', 'status': False}
             return Response(response_data)
         # 命令rm删除返回值为空,所以return值是[{}]这个值不是空哟所以没出现api失败就表示成功
         else:
             if tasks.saltkey_list():
                 response_data = {'results': '删除key成功', 'status': True}
                 return Response(response_data)
             else:
                 logger.error('删除denied的key在执行刷新saltkey操作即cron.py里的方法时候出错了')
                 response_data = {'results': '删除key失败', 'status': False}
                 return Response(response_data)
Beispiel #2
0
def cmd(self, periodic_name='未命名', tgt='*', tgt_type='glob', execute_cmd=''):
    # periodic_name参数是为了给signals.py里结果入库之前修改task_name使得生成的结果task_name个性化使用的
    with requests.Session() as s:
        saltapi = SaltAPI(session=s)
        response_data = saltapi.cmd_run_api(
            tgt=tgt,
            tgt_type=tgt_type,
            arg=[execute_cmd, "shell='/bin/bash'", "runas='root'"])
        # 当调用api失败的时候会返回false
        if response_data['status'] is False:
            return '任务执行后台出错_error(1),请联系管理员'
        else:
            response_data = response_data['results']['return'][0]
            return response_data
Beispiel #3
0
def cmd(self, periodic_name='未命名', tgt='*', tgt_type='glob', execute_cmd=''):
    if tgt_type == 'list':
        tgt = [tgt]
    with requests.Session() as s:
        saltapi = SaltAPI(session=s)
        response_data = saltapi.cmd_run_api(tgt=tgt, tgt_type=tgt_type,
                                            arg=[execute_cmd, "shell='/bin/bash'",
                                                 "runas='root'"])
        # 当调用api失败的时候会返回false
        if response_data['status'] is False:
            return '任务执行后台出错_error(1),请联系管理员'
        else:
            response_data = response_data['results']['return'][0]
            return response_data
Beispiel #4
0
def nginx_upstream(request):
    reg1 = re.compile(r'\nupstream[^\}]+}')
    reg2 = re.compile(r'\nupstream[^\{]+')
    reg3 = re.compile(r'\#* *server \d[^;]+;')
    reg4 = re.compile(r'\#+ *')
    upstreamlist = []
    try:
        if request.method == 'GET':
            minionid = request.GET.get('minionid')
            nginxip = request.GET.get('nginxip')
            path = request.GET.get('path')
            with requests.Session() as s:
                saltapi = SaltAPI(session=s)
                if saltapi.get_token() is False:
                    logger.error(
                        'nginx_upstream页get操作获取SaltAPI调用get_token请求出错')
                    return render(request, 'nginx/nginx_upstream.html')
                else:
                    response_data = saltapi.cmd_run_api(tgt=minionid,
                                                        arg='cat %s' % path)
                    if response_data is False:
                        logger.error(
                            '获取upstream列表失败可能代入的参数有问题,SaltAPI调用cmd_run_api请求出错'
                        )
                        return render(request, 'nginx/nginx_upstream.html')
                    # 判断upstream_data如果返回值如果为[{}]表明没有这个minionid
                    elif response_data['return'] != [{}]:
                        data_source = response_data['return'][0][minionid]
                        data_list = re.findall(reg1, data_source)
                        for i in data_list:
                            # 获取upstream name
                            b2 = re.search(reg2, i)
                            # 获取upstream server列表
                            b3 = re.findall(reg3, i)
                            # 用空格切割字符串取第二个就是servername了
                            namekey = b2.group().split(' ')[1]
                            # 下面这个如果直接赋值b3会有一些问题,就是出现'##  server'这样的也会被前端输出,所以用了
                            # 正则把这种出现'###  '是全部替换成#这样不仅显示正常,在下面post中获取的前端upstream_server也会正确,很重要
                            upstreamlist.append([
                                namekey,
                                [re.sub(reg4, '#', x.strip()) for x in b3]
                            ])
                        return render(
                            request, 'nginx/nginx_upstream.html', {
                                'upstreamlist': upstreamlist,
                                'minionid': minionid,
                                'nginxip': nginxip,
                                'path': path
                            })
                    else:
                        logger.error('获取upstream列表失败,请确认minion是否存在。。')
                        return render(request, 'nginx/nginx_upstream.html')
        # 切换里面server的up/down状态,其实就是注释加#和不注释而已
        else:
            upstream_name = request.POST.get('upstream_name')
            upstream_server = request.POST.get('upstream_server')
            upstream_status = request.POST.get('upstream_status')
            minionid = request.POST.get('minionid')
            path = request.POST.get('path')
            with requests.Session() as s:
                saltapi = SaltAPI(session=s)
                if saltapi.get_token() is False:
                    logger.error(
                        'nginx_upstream页状态变更操作获取SaltAPI调用get_token请求出错')
                    return JsonResponse({'result': '失败,后台问题', 'status': False})
                else:
                    if upstream_status == 'down':
                        arg = "sed -i '/^upstream *%s/,/^}$/{s/%s/#%s/g}' %s&&free -m" % (
                            upstream_name, upstream_server, upstream_server,
                            path)
                    else:
                        arg = "sed -i '/^upstream *%s/,/^}$/{s/#\+ *%s/%s/g}' %s&&free -m" % (
                            upstream_name, upstream_server, upstream_server,
                            path)
                    response_data = saltapi.cmd_run_api(tgt=minionid, arg=arg)
                    if response_data is False:
                        logger.error(
                            'nginx_upstream页状态变更SaltAPI调用cmd_run_api请求出错')
                        return JsonResponse({
                            'result': '失败,后台问题',
                            'status': False
                        })
                    # 返回值如果为[{}]表明没有这个minionid
                    elif response_data['return'] == [{}]:
                        logger.error(
                            'nginx_upstream页状态变更SaltAPI调用cmd_run_api获取到空值了')
                        return JsonResponse({
                            'result': '失败,后台问题',
                            'status': False
                        })
                    else:
                        return JsonResponse({'result': '成功', 'status': True})
    except Exception as e:
        logger.error('获取upstream列表失败' + str(e))
        return render(request, 'nginx/nginx_upstream.html')