def remote_execution(request): """ remote command execution """ ret = '' tgtcheck = '' danger = ('rm', 'reboot', 'init ', 'shutdown') user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'exec': tgt = request.POST.get('tgt') arg = request.POST.get('arg') tgtcheck = HostList.objects.filter(hostname=tgt) argcheck = arg not in danger if tgtcheck and argcheck: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_execution(tgt, 'cmd.run', arg) elif not tgtcheck: ret = '亲,目标主机不正确,请重新输入' elif not argcheck: ret = '亲,命令很危险, 你这样子老大会不开森' Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret': ret}, context_instance=RequestContext(request))
def remote_execution(request): """ remote command execution """ ret = '' tgtcheck = '' danger = ('rm','reboot','init ','shutdown') user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'exec': tgt = request.POST.get('tgt') arg = request.POST.get('arg') tgtcheck = HostList.objects.filter(hostname=tgt) argcheck = arg not in danger if tgtcheck and argcheck: sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_execution(tgt,'cmd.run',arg) elif not tgtcheck: ret = '亲,目标主机不正确,请重新输入' elif not argcheck: ret = '亲,命令很危险, 你这样子老大会不开森' Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret': ret},context_instance=RequestContext(request))
def remote_execution(request): """ remote command execution """ ret = '' tgtcheck = '' danger = ('rm','reboot','init ','shutdown') user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'exec': if request.POST.has_key('Dstart'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh start datanode' elif request.POST.has_key('Dstop'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh stop datanode' elif request.POST.has_key('Dstatus'): arg = 'sudo -u hadoop -s -H /home/hadoop/java/bin/jps' elif request.POST.has_key('Tstart'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh start tasktracker' elif request.POST.has_key('Tstop'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh stop tasktracker' elif request.POST.has_key('Tstatus'): arg = 'sudo -u hadoop -s -H /home/hadoop/java/bin/jps' tgt = request.POST.get('tgt') tgtcheck = HostList_yz1.objects.filter(ip=tgt) argcheck = arg.split()[0] not in danger if tgtcheck and argcheck: sapi = SaltAPI(url=settings_local.SALT_API['url'],username=settings_local.SALT_API['user'],password=settings_local.SALT_API['password']) ret = sapi.remote_execution(tgt,'cmd.run',arg) elif not tgtcheck: ret = '亲,目标主机不正确,请重新输入' elif not argcheck: ret = '亲,命令很危险, 你这样子老大会不开森' Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret': ret},context_instance=RequestContext(request))
def remote_execution(request): """ remote command execution """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] tgtcheck = '' ret_cmd_msg = [] hosts = [] node = '' danger = ('rm','reboot','init ','shutdown') user = request.user ret_err = '' ret = 'none' tgt = 'none' hostlists = HostList.objects.all() if request.method == 'POST': action = request.POST.get('action') tgt = request.POST.getlist('tgt') arg = request.POST.get('arg') if action != '' and len(tgt) != 0 and arg !='': if action == 'exec':#远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_execution(node,'cmd.run',arg) cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+str(ret) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt-run', action='cmd_run', action_ip=ip, username=user, content='%s cmd.run %s' % (node,arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' if action == 'grains':#远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: ret_str_msg = "" argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_execution(node,'grains.item',arg) if type(ret[arg]) == dict: for k, v in ret[arg].items(): ret_str_msg = str(k)+": "+ str(v)+"\n"+ret_str_msg cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+ret_str_msg else: cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+str(ret[arg]) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt', action='grains', action_ip=ip, username=user, content='%s grains.item %s' % (node,arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' elif len(tgt) == 0: ret_err = "目标主机不能为空" elif arg == '': ret_err = "命令不能为空" #Message.objects.create(type='salt', action='execution', action_ip=ip, username=user, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret':ret,'ret_err': ret_err,'ret_cmd_msg':ret_cmd_msg,'hostlists':hostlists,'request':request},context_instance=RequestContext(request))
def remote_execution(request): """ remote command execution """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] tgtcheck = '' ret_cmd_msg = [] hosts = [] node = '' danger = ('rm', 'reboot', 'init ', 'shutdown') user = request.user ret_err = '' ret = 'none' tgt = 'none' hostlists = HostList.objects.all() if request.method == 'POST': action = request.POST.get('action') tgt = request.POST.getlist('tgt') arg = request.POST.get('arg') if action != '' and len(tgt) != 0 and arg != '': if action == 'exec': #远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_execution(node, 'cmd.run', arg) cmd_msg = "\n" + str( node) + ":\n" + "=" * 24 + "\n" + str(ret) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt-run', action='cmd_run', action_ip=ip, username=user, content='%s cmd.run %s' % (node, arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' if action == 'grains': #远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: ret_str_msg = "" argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_execution(node, 'grains.item', arg) if type(ret[arg]) == dict: for k, v in ret[arg].items(): ret_str_msg = str(k) + ": " + str( v) + "\n" + ret_str_msg cmd_msg = "\n" + str( node) + ":\n" + "=" * 24 + "\n" + ret_str_msg else: cmd_msg = "\n" + str( node) + ":\n" + "=" * 24 + "\n" + str(ret[arg]) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt', action='grains', action_ip=ip, username=user, content='%s grains.item %s' % (node, arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' elif len(tgt) == 0: ret_err = "目标主机不能为空" elif arg == '': ret_err = "命令不能为空" #Message.objects.create(type='salt', action='execution', action_ip=ip, username=user, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', { 'ret': ret, 'ret_err': ret_err, 'ret_cmd_msg': ret_cmd_msg, 'hostlists': hostlists, 'request': request }, context_instance=RequestContext(request))
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 }