Esempio n. 1
0
def AjaxResult(jid, check_type):
    '''
    定义ajax查询结果函数
    '''

    true = True
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.salt_runner(jid)
    if check_type == 'deploy':
        rst = ret['data']
        rst_all = ''
        for k in rst:
            r_str = ''
            for k1 in rst[k]:
                if 'cmd_' in k1:
                    v1 = rst[k][k1]
                    if v1['result']:
                        result = u'成功'
                    else:
                        result = u'失败'
                    try:
                        stderr = v1['changes']['stderr']
                    except:
                        stderr = ''
                    v_str = u'运行结果:' + result + u'\n错误:' + stderr + u'\n内容:' + v1[
                        'comment'] + u'\n命令:' + v1['name'] + u'\n开始时间:' + v1[
                            'start_time'] + u'\n耗时:' + str(
                                v1['duration']) + '\n'
                    r_str = u'主机:' + k + '\n' + v_str + '-' * 80 + '\n'
            rst_all = rst_all + r_str
    else:
        rst_all = ''
        for k in ret:
            r_str = u'主机:' + k + u'\n运行结果:\n' + ret[k] + '\n' + '-' * 80 + '\n'
            rst_all = rst_all + r_str

    try:
        # 记录查询操作日志
        message = get_object_or_404(Message, action=jid)
        m = re.search('\[([^:]*)\]', message.content)
        module = m.groups()[0]
        message.content = '[%s]\n----\n%s' % (module, rst_all)
        message.save()
    except:
        print 'Err'
        pass

    return rst_all
Esempio n. 2
0
def salt_advanced_manage(request):
    ret = ''
    if request.method == 'POST':
        if request.is_ajax():
            tgt_selects = request.POST.getlist('tgt_select', None)
            args = request.POST.getlist('arg', None)
            checkgrp = request.POST.getlist('ifcheck', None)
            check_type = request.POST.get('check_type', None)
            if check_type == 'panel-group':
                expr_form = 'nodegroup'
            else:
                expr_form = 'list'
            s = '::'.join(str(i) for i in checkgrp)
            checkgrp = s.replace('0::1', '1').split('::')
            sapi = SaltAPI(url=settings.SALT_API['url'],
                           username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            for i in range(0, len(tgt_selects)):
                try:
                    jid = sapi.remote_execution(tgt_selects[i], 'cmd.run',
                                                args[i] + ';echo ":::"$?',
                                                expr_form)
                    if check_type == 'panel-group':
                        s = SaltGroup.objects.get(groupname=tgt_selects[i])
                        s_len = s.minions.all().count()
                    else:
                        s = tgt_selects[i].split(',')
                        s_len = len(s)
                    rst = {}
                    while (len(rst) < s_len):
                        rst = sapi.salt_runner(jid)
                        #time.sleep(1)
                    j = 0
                    for k in rst:
                        ret = ret + u'L%s-%s 主机:' % (
                            i, j) + k + '\n运行结果:\n' + rst[k] + '\n'
                        j = j + 1
                        r = rst[k].split(':::')[-1].strip()
                        if r != '0':
                            ret = ret + '%s 执行失败!\nJobs NO. %s\n' % (
                                args[i], jid) + '-' * 80 + '\n'
                            if checkgrp[i] == '0':
                                try:
                                    Message.objects.create(
                                        type=u'部署管理',
                                        user=request.user,
                                        action=jid,
                                        action_ip=UserIP(request),
                                        content=u'高级管理 %s' % ret)
                                except:
                                    print 'Log Err'
                                return HttpResponse(json.dumps(ret))
                            else:
                                continue
                        else:
                            ret = ret + '%s 执行成功!\nJobs NO. %s\n' % (
                                args[i], jid) + '-' * 80 + '\n'
                except:
                    print 'Err'
            try:
                Message.objects.create(type=u'部署管理',
                                       user=request.user,
                                       action=jid,
                                       action_ip=UserIP(request),
                                       content=u'高级管理 %s' % ret)
            except:
                print 'Log Err'

            return HttpResponse(json.dumps(ret))

    return render(request, 'salt_remote_exec_advance.html', {'ret': ret})
Esempio n. 3
0
def salt_file_download(request):
    def file_iterator(file_name, chunk_size=512):
        with open(file_name) as f:
            while True:
                c = f.read(chunk_size)
                if c:
                    yield c
                else:
                    break

    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])

    if request.method == 'POST':
        if request.POST.get('type') == 'list':
            rst = RemoteExec(request, fun='cmd.run')
            return HttpResponse(json.dumps(rst['ret']))
        else:
            tgt_list = request.POST.get('tgt_select', None)
            arg = request.POST.get('arg', None)
            jid = sapi.remote_execution(
                tgt_list, 'cmd.run',
                'if [ -d %s ];then echo 0;else echo 1;fi' % arg, 'list')
            rst = sapi.salt_runner(jid)
            if rst[tgt_list] == '0':
                return HttpResponse(json.dumps(arg))
            elif rst[tgt_list] == '1':
                return HttpResponse(json.dumps("download"))
            else:
                print 'Err'
    if request.method == 'GET':
        if request.GET.get('type') == 'download':
            tgt_select = request.GET.get('tgt_select', None)
            arg = request.GET.get('arg', None)
            remote_file = arg
            ret_bak = sapi.file_bak(tgt_select, 'cp.push', remote_file, 'list')
            if tgt_select == 'localhost':
                return render(request, 'redirect.html', {})
            remote_path = remote_file.replace(remote_file.split('/')[-1], '')
            dl_path = './media/salt/filedownload/user_%s/%s%s' % (
                request.user.id, tgt_select, remote_path)
            dl_file = '%s%s' % (dl_path, remote_file.split('/')[-1])
            if not os.path.exists(dl_path):
                os.makedirs(dl_path)
            try:
                shutil.copy(
                    '/var/cache/salt/master/minions/%s/files/%s' %
                    (tgt_select, remote_file), dl_file)
                tar_file = make_tar(dl_file, '/tmp')
                dl_filename = 'attachment;filename="{0}"'.format(
                    tar_file.replace('/tmp/',
                                     '%s%s' % (tgt_select, remote_path)))
                ret = u'主机:%s\n结果:远程文件 %s 下载成功!' % (tgt_select, remote_file)
                Message.objects.create(type=u'文件管理',
                                       user=request.user,
                                       action=u'文件下载',
                                       action_ip=UserIP(request),
                                       content=u'下载文件 \n%s' % ret)
                response = StreamingHttpResponse(file_iterator(tar_file))
                response['Content-Type'] = 'application/octet-stream'
                response['Content-Disposition'] = dl_filename

                return response

            except:
                print 'No such file or dirctory'
                ret = u'主机:%s\n结果:远程文件 %s 下载失败,请确认文件是否存在!' % (tgt_select,
                                                              remote_file)
                Message.objects.create(type=u'文件管理',
                                       user=request.user,
                                       action=u'文件下载',
                                       action_ip=UserIP(request),
                                       content=u'下载文件 \n%s' % ret)
                return render(request, 'salt_file_download.html', {'ret': ret})

    return render(request, 'salt_file_download.html', {})
Esempio n. 4
0
def RemoteExec(request, fun, group=False):
    '''
    定义远程命令函数
    '''

    danger = []
    for i in UserCommand.objects.filter(name='ENGINEDEV'):
        danger = i.command.split(',')
    if len(danger) == 0:
        danger = ['reboot', 'shutdown']
    check = False
    is_group = False
    ret = ''
    jid = ''
    arg = ''
    if request.method == 'POST':
        if request.is_ajax():
            if request.POST.get('check_type') == 'panel-group':
                grp = request.POST.get('tgt_select')
                tgt_list = SaltGroup.objects.get(nickname=grp).groupname
                expr_form = 'nodegroup'
                is_group = True
            else:
                tgt_select = request.POST.getlist('tgt_select[]')
                if not tgt_select:
                    tgt_list = request.POST.get('tgt_select')
                else:
                    tgt_list = ','.join(tgt_select)
                expr_form = 'list'
            if fun == 'cmd.run':
                arg = request.POST.get('arg')
            else:
                arg = request.POST.get('module_list')
                arg = 'module.user_%s.%s' % (request.user.id, arg)
            sapi = SaltAPI(url=settings.SALT_API['url'],
                           username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            if arg not in danger or request.user.is_superuser:
                try:
                    if fun == 'cmd.run':
                        jid = sapi.remote_execution(tgt_list, fun,
                                                    arg + ';echo ":::"$?',
                                                    expr_form)
                        if is_group:
                            s = SaltGroup.objects.get(groupname=tgt_list)
                            s_len = s.minions.all().count()
                        else:
                            s = tgt_list.split(',')
                            s_len = len(s)
                        rst = {}
                        while (len(rst) < s_len):
                            rst = sapi.salt_runner(jid)
                            #time.sleep(1)
                        for k in rst:
                            ret = ret + u'主机:' + k + '\n运行结果:\n%s\n' % rst[k]
                            r = rst[k].split(':::')[-1].strip()
                            if r != '0':
                                ret = ret + '%s 执行失败!\n' % arg + '-' * 80 + '\n'
                            else:
                                ret = ret + '%s 执行成功!\n' % arg + '-' * 80 + '\n'

                    else:
                        jid = sapi.remote_execution(tgt_list, fun, arg,
                                                    expr_form)
                        rst = sapi.salt_runner(jid)
                        rst = ret['data']
                        rst_all = ''
                        for k in rst:
                            r_str = ''
                            for k1 in rst[k]:
                                if 'cmd_' in k1:
                                    v1 = rst[k][k1]
                                    if v1['result']:
                                        result = u'成功'
                                    else:
                                        result = u'失败'
                                    try:
                                        stderr = v1['changes']['stderr']
                                    except:
                                        stderr = ''
                                    v_str = u'运行结果:' + result + u'\n错误:' + stderr + u'\n内容:' + v1[
                                        'comment'] + u'\n命令:' + v1[
                                            'name'] + u'\n开始时间:' + v1[
                                                'start_time'] + u'\n耗时:' + str(
                                                    v1['duration']) + '\n'
                                    r_str = u'主机:' + k + '\n' + v_str + '-' * 80 + '\n'
                            rst_all = rst_all + r_str
                        ret = rst_all
                except:
                    pass
                if not arg or not tgt_list:
                    ret = u'未选择主机或未输入命令...'
                if ret:
                    ret = ret + '\nJobs NO. %s' % jid
                else:
                    check = True
                    ret = u'命令执行中,请稍候查询结果...\nJobs NO. %s' % jid
            else:
                ret = u'无权限执行此命令!'
    return {
        'ret': ret,
        'arg': arg,
        'jid': jid,
        'check': check,
        'is_group': is_group
    }