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
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})
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', {})
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 }