Example #1
0
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))
Example #2
0
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)) 
Example #3
0
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))
Example #4
0
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)) 
Example #5
0
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))
Example #6
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})
Example #7
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', {})
Example #8
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
    }