コード例 #1
0
def minions_fun(request):
    id = request.GET.get('id', '')
    active = request.GET.get('active', '')
    if request.is_ajax() and id and active:
        try:
            minion = Minions.objects.get(id=id)
            salt_server = SaltServer.objects.get(id=minion.salt_server.id)
            sapi = SaltAPI(url=salt_server.url,
                           username=salt_server.username,
                           password=salt_server.password)
            if id:
                if active == 'delete':
                    success = sapi.DeleteKey(minion)
                    if success:
                        minion.status = 'Unknown'
                        minion.save()
                        result = u'KEY"%s"删除成功!' % minion.minion
                    else:
                        result = u'KEY"%s"删除失败!' % minion.minion
                elif active == 'accept':
                    success = sapi.AcceptKey(minion)
                    if success:
                        collect(salt_server.id, minion.minion, 'Accepted')
                        result = u'KEY"%s"接受成功!' % minion.minion
                    else:
                        result = u'KEY"%s"接受失败!' % minion.minion
                elif active == 'grains':
                    result = json.loads(minion.grains)
                elif active == 'pillar':
                    result = json.loads(minion.pillar)
        except Exception as e:
            result = str(e)
        return JsonResponse(result, safe=False)
コード例 #2
0
ファイル: file_remote.py プロジェクト: xiangxiaobaog3/EWP_OMS
def file_remote_rename(request):
    if request.is_ajax() and request.method == 'GET':
        tgt = request.GET.get('tgt')
        path = request.GET.get('path', '').replace('//', '/').rstrip('/')
        name = request.GET.get('name')
        server = request.GET.get('server')
        try:
            salt_server = SaltServer.objects.get(id=server)
            sapi = SaltAPI(url=salt_server.url,
                           username=salt_server.username,
                           password=salt_server.password)
            dst = '/'.join(path.split('/')[0:-1]) + '/' + name

            r = sapi.SaltCmd(tgt,
                             'file.rename',
                             client='local',
                             arg1=path.encode("utf-8"),
                             arg2=dst.encode("utf-8"))['return'][0][tgt]
            if r == True:
                result = {
                    'ret': 1,
                    'msg': u'"%s"已成功重命名为"%s"!' % (path, dst),
                    'dst': dst.encode("utf-8")
                }
            else:
                result = {'ret': 0, 'msg': r}
        except Exception as e:
            result = {'ret': 0, 'msg': str(e)}
        return JsonResponse(result, safe=False)
コード例 #3
0
ファイル: views.py プロジェクト: westos007/OMS-1
def salt_cmd2(idc, tgt, fun, arg, client='local', expr_form="list"):
    salt_server = Salt_Server.objects.get(idc=idc)  #根据机房ID选择对应salt服务端
    sapi = SaltAPI(url=salt_server.url,
                   username=salt_server.username,
                   password=salt_server.password)
    params = {'client': client, 'fun': fun, 'tgt': tgt, 'expr_form': expr_form}
    result = sapi.saltCmd(params)
    print result, type(result)
    return result
コード例 #4
0
ファイル: views.py プロジェクト: westos007/OMS-1
def salt_cmd3(idc, tgt, fun, arg, client="local", expr_form="list"):
    from models import Salt_Server
    salt_server = Salt_Server.objects.get(idc=idc)  #根据机房ID选择对应salt服务端
    sapi = SaltAPI(url=salt_server.url,
                   username=salt_server.username,
                   password=salt_server.password)
    params = {'client': client, 'fun': fun, 'tgt': tgt, 'expr_form': expr_form}
    result = sapi.saltCmd(params)
    return result
コード例 #5
0
def minions(request, server_id):
    server_list = SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:  #id不存在时返回第一个
        salt_server = SaltServer.objects.all()[0]
    context = {'server_list': server_list, 'salt_server': salt_server}

    try:
        sapi = SaltAPI(url=salt_server.url,
                       username=salt_server.username,
                       password=salt_server.password)
        #对所有key刷新minions表数据
        a, d, u, r = sapi.ListKey()
        if a:
            for m in a:
                collect(salt_server.id, m, 'Accepted')
        if d:
            for m in d:
                collect(salt_server.id, m, 'Denied')
        if u:
            for m in u:
                collect(salt_server.id, m, 'Unaccepted')
        if r:
            for m in r:
                collect(salt_server.id, m, 'Rejected')
        #minion不存在对应的key时设为未知
        keys = []
        for s in [a, d, u, r]:
            for m in s:
                keys.append(m)
        minion_list = Minions.objects.filter(salt_server=salt_server)
        ms = []
        for m in minion_list:
            if m.minion not in keys:
                m.status = 'Unknown'
                m.save()
            grains = json.loads(m.grains)
            grains['ipv4'].remove('127.0.0.1')
            obj = {
                'id': m.id,
                'minion': m.minion,
                'ip': grains['ipv4'],
                'os': grains['os'],
                'status': m.status
            }
            ms.append(obj)
        context['minion_list'] = ms
    except Exception as error:
        context['error'] = error
    return render(request, 'SALT/minions.html', context)
コード例 #6
0
def state_fun(request, server_id):
    if request.is_ajax() and request.method == 'GET':
        tgt = request.GET.get('tgt', '')
        env = request.GET.get('env', '')
        state = request.GET.get('state', '')
        states = []
        try:
            salt_server = SaltServer.objects.get(id=server_id)
            sapi = SaltAPI(url=salt_server.url,
                           username=salt_server.username,
                           password=salt_server.password)
            if env:
                if state and tgt:
                    arg = state.rstrip(',')
                    result = sapi.SaltCmd(client='local',
                                          tgt=tgt,
                                          fun='state.sls',
                                          arg=arg,
                                          arg1='saltenv=%s' % env,
                                          expr_form='list')['return'][0]
                    Res = State(client='local',
                                minions=tgt,
                                fun='state.sls',
                                arg=arg,
                                tgt_type='list',
                                server=salt_server,
                                user=request.user.username,
                                result=json.dumps(result))
                    Res.save()
                else:
                    roots = sapi.SaltRun(client='wheel',
                                         fun='file_roots.list_roots'
                                         )['return'][0]['data']['return']
                    dirs = roots[env][0]  #dirs={"/srv/salt/prod/":{}}
                    for root, dirs in dirs.items(
                    ):  #root="/srv/salt/prod/"  dirs={"init":{"epel.sls":"f",}}
                        for dir, files in dirs.items(
                        ):  #dir='init' or 'top.sls'    files={"epel.sls":"f",}
                            if dir == '.svn': pass
                            elif files == "f" and dir.endswith('.sls'):
                                states.append(dir[0:-4])
                            elif isinstance(files, dict):
                                for sls, f in files.items():
                                    if f == 'f' and sls.endswith('.sls'):
                                        states.append('%s.%s' %
                                                      (dir, sls[0:-4]))
                    result = sorted(states)
        except Exception as e:
            result = str(e)
        return JsonResponse(result, safe=False)
コード例 #7
0
ファイル: views.py プロジェクト: xiangxiaobaog3/EWP_OMS
def execute(request):
    idc_list = IDC.objects.order_by('name')
    module_list=Module.objects.filter(client='execution').order_by('name')
    idc=request.GET.get('idc',idc_list[0].id)
    context={'idc_list':idc_list,'module_list':module_list,'idc':long(idc)}
    try:
        salt_server = SaltServer.objects.get(idc=idc,role='Master')
        context['salt_server']=salt_server
        sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
        result=sapi.SaltRun(client='runner',fun='manage.status')
        context['minions_up']=result['return'][0]['up']
        context['minions_down']=result['return'][0]['down']
    except Exception as error:
        context['error']=error
    return render(request,'SALT/execute.html',context)
コード例 #8
0
ファイル: views.py プロジェクト: xiangxiaobaog3/EWP_OMS
def jid_info(request):
    jid = request.GET.get('jid','')
    if jid:
        try:
            r = Result.objects.get(jid=jid)
            if r.result and r.result!='{}' :
                result = json.loads(r.result) #cmd_result.html默认从数据库中读取
            else:
                idc = r.idc_id
                salt_server = SaltServer.objects.get(idc=idc,role='Master')
                sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
                jid_info=sapi.SaltJob(jid)
                result = jid_info['info'][0]['Result']
                r.result=json.dumps(result)
                r.save()
            return JsonResponse(result,safe=False)
        except Exception as error:
            return JsonResponse({'error':error},safe=False)
コード例 #9
0
def deploy(request,server_id):
    server_list=SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:#id不存在时返回第一个
        salt_server = SaltServer.objects.all()[0]

    project_list=SvnProject.objects.filter(salt_server=salt_server).order_by('host')
    context={'server_list':server_list,'salt_server':salt_server,'project_list':project_list}

    try:
        sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
        result=sapi.SaltRun(client='runner',fun='manage.status')
        context['minions_up']=result['return'][0]['up']
        #刷新页面检测并更新项目状态
        for project in project_list:
            path=project.path+'/'+project.target
            svn_info=sapi.SaltCmd(client='local',tgt=project.host,fun='svn.info',arg=path,arg1='fmt=dict')['return'][0][project.host][0]
            if isinstance(svn_info,dict):
                if project.url == svn_info['URL']:
                    project.status=u"已发布"
                    project.info=u"最近修改时间:%s\n最近修改版本:%s\n最新版本:%s"%(svn_info["Last Changed Date"][0:20],svn_info["Last Changed Rev"],svn_info["Revision"])
                else:
                    project.status=u"冲突"
                    project.info=u"SVN路径不匹配:\n本地SVN为'%s'\n项目SVN为'%s'"%(svn_info['URL'],project.url)
                # project.save()
            else:
                #根路径不存在时创建
                if not sapi.SaltCmd(client='local',tgt=project.host,fun='file.directory_exists',arg=project.path)['return'][0][project.host]:
                    sapi.SaltCmd(client='local',tgt=project.host,fun='file.mkdir',arg=project.path)
                #目录未被版本控制,可能SVN未安装
                if not sapi.SaltCmd(client='local',tgt=project.host,fun='pkg.version',arg='subversion')['return'][0][project.host]:
                    sapi.SaltCmd(client='local',tgt=project.host,fun='pkg.install',arg='subversion')
                #签出项目、获取信息并存入库
                sapi.SaltCmd(client='local',tgt=project.host,fun='svn.checkout',arg=project.path,arg0='target=%s'%project.target,arg1='remote=%s'%project.url,arg2='username=%s'%project.username,arg3='password=%s'%project.password)
                project.info=sapi.SaltCmd(client='local',tgt=project.host,fun='svn.info',arg=path,arg1='fmt=dict')['return'][0][project.host][0]
                project.status=u"已发布"
            project.save()
    except Exception as error:
        context['error']=error


    return render(request,'SALT/deploy.html',context)
コード例 #10
0
ファイル: file_remote.py プロジェクト: ljb-2000/EWP_OMS
def file_write_r(request):
    if request.is_ajax():
        if request.method == 'GET':
            master=request.GET.get('master')
            file_path=request.GET.get('file_path')
            file_content=request.GET.get('file_content')
            # print master,path
            salt_server = SaltServer.objects.filter(ip__ip__tgt_id=master)[0]
            # print salt_server
            sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
            # ret = sapi.SaltCmd(client='local',tgt=master,fun='file.write',arg=[file_path,file_content])['return'][0][master]
            if sapi.SaltCmd(client='local',tgt=master,fun='file.file_exists',arg=file_path)['return'][0][master]:
                result  = sapi.SaltCmd(client='local',tgt=master,fun='cmd.run',arg='echo "'+file_content+'" > '+file_path)['return'][0][master]
                if result=="":
                    result=u'文件%s修改成功!' %file_path
            else:
                result = u"文件%s不存在!" % file_path
            print result
            return JsonResponse(result,safe=False)
コード例 #11
0
ファイル: views.py プロジェクト: xiangxiaobaog3/EWP_OMS
def result(request):
    if request.is_ajax():
        if request.method == 'GET':
            id = request.GET.get('id')
            idc = request.GET.get('idc')
            client = request.GET.get('client')
            tgt_type = request.GET.get('tgt_type')
            tgt  = request.GET.get('tgt','')
            fun = request.GET.get('fun')
            arg = request.GET.get('arg','')
            user  = request.user.username
            if id:
                r=Result.objects.get(id=id)
                result = json.loads(r.result) #result.html默认从数据库中读取
                return JsonResponse(result,safe=False)

            try:
                salt_server = SaltServer.objects.get(idc=idc,role='Master') #根据机房ID选择对应salt服务端
                sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
                if re.search('runner',client) or re.search('wheel',client):
                    result=sapi.SaltRun(client=client,fun=fun,arg=arg)
                else:
                    result = sapi.SaltCmd(client=client,tgt=tgt,fun=fun,arg=arg,expr_form=tgt_type)

                if re.search('async',client):
                    jid = result['return'][0]['jid']
                    # minions = ','.join(result['return'][0]['minions'])
                    r=Result(client=client,jid=jid,minions=tgt,fun=fun,arg=arg,tgt_type=tgt_type,idc_id=idc,user=user)
                    res=r.jid #异步命令只返回JID,之后JS会调用jid_info
                else:
                    res=result['return'][0]#同步命令直接返回结果
                    r=Result(client=client,minions=tgt,fun=fun,arg=arg,tgt_type=tgt_type,idc_id=idc,user=user,result=json.dumps(res))
                r.save()
                # res=model_to_dict(r,exclude='result')
                return JsonResponse(res,safe=False)
            except Exception as error:
                return JsonResponse({'Error':"%s"%error},safe=False)

    else:
        idc_list= IDC.objects.all()
        result_list = Result.objects.order_by('-id')
        return render(request, 'SALT/result.html', locals())
コード例 #12
0
ファイル: views.py プロジェクト: xiangxiaobaog3/EWP_OMS
def minions(request):
    idc_list = IDC.objects.order_by('name')
    idc=request.GET.get('idc',idc_list[0].id)
    key=request.GET.get('key','')
    active=request.GET.get('active','')
    context={'idc_list':idc_list,'idc':long(idc)}
    try:
        salt_server = SaltServer.objects.get(ip__server__idc=idc,role='M')
        sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)

        minions=sapi.SaltRun(fun='manage.status')
        print minions
        context['minions_up']=minions['return'][0]['up']
        context['minions_down']=minions['return'][0]['down']
    except Exception as error:
        context['minions_up']=[]
        context['minions_down']=[]
        context['error']=error
    print context
    return render(request,'SALT/minions.html',context)
コード例 #13
0
ファイル: views.py プロジェクト: masterpy/EWP_OPS
def cmd_doc(request):
    salt_server = SaltServer.objects.all()[0]  #选择salt接口中的第一个
    cmd_list = Command.objects.filter(doc='')  #只对未获取帮助信息的命令操作
    sapi = SaltAPI(url=salt_server.url,
                   username=salt_server.username,
                   password=salt_server.password)
    for cmd in cmd_list:
        result = sapi.SaltCmd(client='local',
                              tgt='*',
                              fun='sys.doc',
                              arg=cmd.cmd)  #使用local直接返回结果,不需要异步
        print result
        #{u'return': [{u'saltminion01-41.ewp.com': {u'cmd.script': u'\n    Download a script from a remote location and execute the script locally.\n  ...
        try:
            cmd.doc = result['return'][0].values()[0][cmd.cmd]
        #.replace(" "," ")
        except:
            cmd.doc = u"这个命令没有帮助信息,请点击模块查看官方网站信息!"
        cmd.save()
    return HttpResponseRedirect(reverse('salt:command'))
コード例 #14
0
ファイル: file_remote.py プロジェクト: ljb-2000/EWP_OMS
def file_list(request):
    if request.is_ajax():
        if request.method == 'GET':
            minion=request.GET.get('minion')
            path=request.GET.get('path')
            print minion,path
            idc = HostDetail.objects.get(tgt_id=minion).host.server.idc
            print idc
            salt_server = SaltServer.objects.get(ip__server__idc=idc)
            print salt_server.url,salt_server.username,salt_server.password
            sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
            #目录存在时返回目录列表
            try:
                isdir=sapi.SaltCmd(client='local',tgt=minion,fun='file.directory_exists',arg=path)['return'][0][minion]
                # if isdir:
                #     path_str=path.split('/')
                #     print path_str
                #     if path_str[-1]=='..':
                #         if len(path_str)>3:
                #             path='/'.join(path_str[0:-2])
                #         else:
                #             path='/'
                #         print path
                #     file_list = sapi.SaltCmd(client='local',tgt=minion,fun='file.readdir',arg=path)['return'][0][minion]
                #     file_list.remove('.')
                #     if path=='/':
                #         file_list.remove('..')
                #     result = {'file_list':sorted(file_list) ,'path_type':'dir','pdir':path}
            except Exception as e:
                print e
                result = {'file_list':[e],'path_type':'none'}
            else:
                #文件存在时,返回文件内容,需要加上文件大小限制
                isfile=sapi.SaltCmd(client='local',tgt=minion,fun='file.file_exists',arg=path)['return'][0][minion]
                # if isfile:
                #     file_content=sapi.SaltCmd(client='local',tgt=minion,fun='cmd.run',arg='cat '+path)['return'][0][minion]
                #     result = {'file_content':file_content,'path_type':'file','pdir':path}

            print result
            return JsonResponse(result,safe=False)
コード例 #15
0
def collect(server_id, minion, status='Unknown'):
    try:
        salt_server = SaltServer.objects.get(id=server_id)
        sapi = SaltAPI(url=salt_server.url,
                       username=salt_server.username,
                       password=salt_server.password)
        Minions.objects.get_or_create(minion=minion, salt_server=salt_server)
        Minion = Minions.objects.get(minion=minion, salt_server=salt_server)

        if status == 'Accepted':
            grains = sapi.SaltMinions(minion)['return'][0][minion]
            pillar = sapi.SaltCmd(tgt=minion,
                                  fun='pillar.items',
                                  client='local')['return'][0][minion]
            Minion.grains = json.dumps(grains)
            Minion.pillar = json.dumps(pillar)
        Minion.status = status
        Minion.save()
        result = True
    except Exception as error:
        result = error
    return result
コード例 #16
0
ファイル: views.py プロジェクト: masterpy/EWP_OPS
def cmd_result(request):
    if request.is_ajax():
        if request.method == 'GET':
            idc = request.GET.get('idc')
            tgt_type = request.GET.get('tgt_type')
            # tgt_type = TargetType.objects.get(id=tgt_type_id).name
            tgt = request.GET.get('tgt')
            # client   = request.GET.get('client')
            # client = ClientType.objects.get(id=client_id).name
            fun = request.GET.get('fun')
            arg = request.GET.get('arg', '')
            user = request.user.username
            # print(idc,tgt_type,tgt,client,fun,arg,user)

            salt_server = SaltServer.objects.get(
                ip__server__idc=idc)  #根据机房ID选择对应salt服务端
            sapi = SaltAPI(url=salt_server.url,
                           username=salt_server.username,
                           password=salt_server.password)
            result = sapi.SaltCmd(tgt=tgt,
                                  fun=fun,
                                  arg=arg,
                                  expr_form=tgt_type)
            # if client == 'local_async':
            jid = result['return'][0]['jid']
            minions = ','.join(result['return'][0]['minions'])
            r = Result(jid=jid,
                       minions=minions,
                       fun=fun,
                       arg=arg,
                       tgt_type=tgt_type,
                       idc_id=idc,
                       user=user)
            r.save()
            res = model_to_dict(r, exclude='result')
            return JsonResponse(res, safe=False)
    else:
        result_list = Result.objects.order_by('-id')
        return render(request, 'SALT/cmd_result.html', locals())
コード例 #17
0
def config(request,server_id):
    server_list=SaltServer.objects.all()
    salt_server = SaltServer.objects.get(id=server_id)
    context={'server_list':server_list,'salt_server':salt_server}
    sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
    result=sapi.SaltRun(client='wheel',fun='config.values')
    configs=result['return'][0]['data']['return']
    context['envs']=sorted(configs['file_roots'].keys())
    # context['envs']=sapi.SaltRun(client='runner',fun='fileserver.envs')['return'][0]
    if request.is_ajax() :
        env=request.GET.get('env')
        file=request.GET.get('file')
        content=request.GET.get('content')
        if env:
            if file:
                if content:#写入文件内容,文件会产生[noeol]问题,因此需要在内容最后加个结束符\n
                    try:
                        r=sapi.SaltRun(client='wheel',fun='file_roots.write',path=file,data=content+'\n',saltenv=env)
                        # r=sapi.SaltRun(client='wheel',fun='config.update_config',file_name='test',yaml_contents='{a:1}')
                        success=r['return'][0]['data']['success']
                        if success:
                            res=u"文件%s保存成功!"%file
                        else:
                            res=u"文件%s保存失败!"%file
                    except Exception as error:
                        res=str(error)
                else:#读取环境下文件内容
                    try:
                        path=configs['file_roots'][env][0]+file #每个环境最好只定义一个目录
                        r=sapi.SaltRun(client='wheel',fun='file_roots.read',path=path,saltenv=env)
                        res=r['return'][0]['data']['return']
                        if isinstance(res,str):
                            res={'Error':res}
                        else:
                            res=res[0]
                    except Exception as error:
                        res={'Error':str(error)}
            else:#列出环境下的文件
                try:
                    res=sapi.SaltRun(client='runner',fun='fileserver.file_list',saltenv=env)['return'][0]
                    # res=[]
                    # for f in fs:
                    #     if not re.search('.svn',f) and not re.search('pki/',f):
                    #         res.append(f)
                    res=sapi.SaltRun(client='runner',fun='fileserver.file_list',saltenv=env)['return'][0] #.svn .git已在files.conf配置中过滤
                except Exception as error:
                    res=[str(error)]
        else:
            res=None
        return JsonResponse(res,safe=False)

    else:
        return render(request,'SALT/config.html',context)
コード例 #18
0
ファイル: views.py プロジェクト: xiangxiaobaog3/EWP_OMS
def config(request,server_id):
    server_list=SaltServer.objects.all()
    salt_server = SaltServer.objects.get(id=server_id)
    context={'server_list':server_list,'salt_server':salt_server}
    sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
    result=sapi.SaltRun(client='wheel',fun='config.values')
    configs=result['return'][0]['data']['return']
    context['envs']=sorted(configs['file_roots'].keys())


    if request.is_ajax() :
        env=request.GET.get('env')
        file=request.GET.get('file')
        content=request.GET.get('content')
        if env:
            if file:
                if content:#写入文件内容,文件会产生[noeol]问题,暂时不用此功能
                    # arg='path==%s,,data==%s,,saltenv==%s'%(file,content,env)
                    try:
                        r=sapi.SaltRun(client='wheel',fun='file_roots.write',path=file,data=content,saltenv=env)
                        success=r['return'][0]['data']['success']
                        if success:
                            res=u"文件%s保存成功!"%file
                        else:
                            res=u"文件%s保存失败!"%file
                    except Exception as error:
                        res=str(error)
                else:#读取环境下文件内容
                    try:
                        path=configs['file_roots'][env][0]+file
                        # arg='path==%s,,saltenv==%s'%(path,env)
                        r=sapi.SaltRun(client='wheel',fun='file_roots.read',path=path,saltenv=env)
                        res=r['return'][0]['data']['return']
                        if isinstance(res,str):
                            res={'Error':res}
                        else:
                            res=res[0]
                        print type(res),res
                    except Exception as error:
                        res={'Error':str(error)}
                        print error
            else:#列出环境下的文件
                try:
                    res=sapi.SaltRun(client='runner',fun='fileserver.file_list',saltenv=env)['return'][0]
                    # res=[]
                    # for f in fs:
                    #     if not re.search('.svn',f) and not re.search('pki/',f):
                    #         res.append(f)
                except Exception as error:
                    res=[str(error)]
        else:
            res=None
        return JsonResponse(res,safe=False)

    else:
        return render(request,'SALT/config.html',context)
コード例 #19
0
def deploy_svn(request,server_id):
    #SVN功能按钮
    if request.is_ajax() and request.method == 'GET':
        tgt=request.GET.get('tgt','')
        path=request.GET.get('path','').encode("utf-8")
        active=request.GET.get('active','')
        project_id=request.GET.get('project_id','')

        try:
            salt_server = SaltServer.objects.get(id=server_id)
            sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
            if project_id:
                project=SvnProject.objects.get(id=project_id)#指定项目
                path=project.path+'/'+project.target
                tgt=project.host
            else:
                project=None                                #项目不存在
                projects=SvnProject.objects.filter(host=tgt)
                for p in projects:
                    if path.startswith(p.path+'/'+p.target): #项目子目录
                        project=p
            #SvnProject里没有记录时自动创建,但密码需要在后台设置
            if not project:
                svn_info=sapi.SaltCmd(client='local',tgt=tgt,fun='svn.info',arg=path,arg1='fmt=dict')['return'][0][tgt][0]
                if isinstance(svn_info,dict):
                    result = {'ret':False,'msg':u'SVN项目不存在,请在后台页面添加!','add':True}
                else:
                    result = {'ret':False,'msg':u'错误:%s'%svn_info}
            #提交
            elif active=='commit' or active=='update':
                status=sapi.SaltCmd(client='local',tgt=tgt,fun='svn.status',arg=path)['return'][0][tgt]
                for s in status.split('\n'):
                    l=s.split(' ')
                    if l[0]=='?':
                        sapi.SaltCmd(client='local',tgt=tgt,fun='svn.add',arg=path,arg0=path+'/'+l[-1],arg2='username=%s'%project.username,arg3='password=%s'%project.password)
                    elif l[0]=='!':
                        sapi.SaltCmd(client='local',tgt=tgt,fun='svn.remove',arg=path,arg0=path+'/'+l[-1],arg2='username=%s'%project.username,arg3='password=%s'%project.password)
                ci=sapi.SaltCmd(client='local',tgt=tgt,fun='svn.commit',arg=path,arg1='msg=commit from %s'%tgt,arg2='username=%s'%project.username,arg3='password=%s'%project.password)['return'][0][tgt]
                result = {'ret':True,'msg':u"提交成功!\n%s"%ci}
                #更新(先提交否则会冲突)
                if active=='update':
                    up=sapi.SaltCmd(client='local',tgt=tgt,fun='svn.update',arg=path,arg2='username=%s'%project.username,arg3='password=%s'%project.password)['return'][0][tgt]
                    result = {'ret':True,'msg':u"提交成功!\n%s\n更新成功!\n%s"%(ci,up)}
        except Exception as e:
            result = {'ret':False,'msg':u'错误:%s' % e}
        return JsonResponse(result,safe=False)
コード例 #20
0
def state(request, server_id):
    server_list = SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:  #id不存在时返回第一个
        salt_server = SaltServer.objects.all()[0]

    minion_list = Minions.objects.filter(status="Accepted")
    context = {
        'server_list': server_list,
        'salt_server': salt_server,
        'minion_list': minion_list
    }

    try:
        sapi = SaltAPI(url=salt_server.url,
                       username=salt_server.username,
                       password=salt_server.password)
        context['envs'] = sapi.SaltRun(client='runner',
                                       fun='fileserver.envs')['return'][0]
    except Exception as error:
        context['error'] = error

    return render(request, 'SALT/state.html', context)
コード例 #21
0
ファイル: file_remote.py プロジェクト: xiangxiaobaog3/EWP_OMS
def file_remote_create(request):
    if request.is_ajax() and request.method == 'GET':
        tgt = request.GET.get('tgt')
        name = request.GET.get('name')
        path_r = request.GET.get('path') + '/' + name
        path = path_r.encode('utf-8')
        type = request.GET.get('type')
        server = request.GET.get('server')
        try:
            salt_server = SaltServer.objects.get(id=server)
            sapi = SaltAPI(url=salt_server.url,
                           username=salt_server.username,
                           password=salt_server.password)
            #新建目录或文件
            if type == 'Dir':
                if sapi.SaltCmd(client='local',
                                tgt=tgt,
                                fun='file.directory_exists',
                                arg=path)['return'][0][tgt]:
                    result = {'ret': 0, 'msg': u'目录"%s"已存在!' % path_r}
                else:
                    try:
                        sapi.SaltCmd(client='local',
                                     tgt=tgt,
                                     fun='file.mkdir',
                                     arg=path)
                        result = {'ret': 1, 'msg': u'目录"%s"创建成功!' % path_r}
                    except:
                        result = {'ret': 0, 'msg': u'目录"%s"创建失败!' % path_r}
            elif type == 'File':
                #创建文件,文件不存在时创建,存在则刷新创建时间,内容不变,目录不存在时返回false
                if sapi.SaltCmd(client='local',
                                tgt=tgt,
                                fun='file.file_exists',
                                arg=path)['return'][0][tgt]:
                    result = {'ret': 0, 'msg': u'文件"%s"已存在!' % path}
                elif sapi.SaltCmd(client='local',
                                  tgt=tgt,
                                  fun='file.touch',
                                  arg=path)['return'][0][tgt]:
                    result = {'ret': 1, 'msg': u'文件"%s"创建成功!' % path_r}
            else:
                result = {'ret': 0, 'msg': u'目标类型错误!'}
        except Exception as e:
            result = {'ret': 0, 'msg': u'错误:%s' % e}
        # print result
        return JsonResponse(result, safe=False)
コード例 #22
0
ファイル: views.py プロジェクト: xiangxiaobaog3/EWP_OMS
def command(request):
    module_id = request.GET.get('module_id')
    module_name = request.GET.get('module_name')
    client = request.GET.get('client')
    cmd = request.GET.get('cmd')
    active = request.GET.get('active')
    context={}
    #命令收集
    if active=='collect':
        try:
            salt_server=SaltServer.objects.all()[0]
            sapi = SaltAPI(url=salt_server.url,username=salt_server.username,password=salt_server.password)
            funs=['doc.runner','doc.wheel','doc.execution']
            for fun in funs:
                result = sapi.SaltRun(fun=fun,client='runner')
                cs=result['return'][0]
                for c in cs:
                    Module.objects.get_or_create(client=fun.split('.')[1],name=c.split('.')[0])
                    module=Module.objects.get(client=fun.split('.')[1],name=c.split('.')[0])
                    Command.objects.get_or_create(cmd=c,module=module)
                    command=Command.objects.get(cmd=c,module=module)
                    if not command.doc:
                        command.doc=cs[c]
                        command.save()
            context['success']=u'命令收集完成!'
        except Exception as error:
            context['error']=error


    cmd_list=Command.objects.order_by('cmd')
    module_list=Module.objects.order_by('client','name')
    #按模块过滤
    if  request.method=='GET' and module_id:
            cmd_list = cmd_list.filter(module=module_id)

    if request.is_ajax() and client:
        if re.search('runner',client):
            client='runner'
        elif re.search('wheel',client):
            client='wheel'
        else:
            client='execution'
    #命令帮助信息
        if cmd:
            try:
                command=Command.objects.get(cmd=cmd,module__client=client)
                doc=command.doc.replace("\n","<br>").replace(" ","&nbsp;")
            except Exception as error:
                doc=str(error)
            return JsonResponse(doc,safe=False)
    #请求模块下的命令
        elif module_name:
            cmd_list = cmd_list.filter(module__client=client,module__name=module_name).order_by('-cmd')
            cmd_list = [cmd.cmd for cmd in cmd_list]
            return JsonResponse(cmd_list,safe=False)
    #请求CLIENT下的模块
        else:
            module_list=module_list.filter(client=client)
            module_list=[module.name for module in module_list.order_by('-name')]
            return JsonResponse(module_list,safe=False)

    context['cmd_list']=cmd_list
    context['module_list']=module_list
    return render(request, 'SALT/command.html', context)
コード例 #23
0
ファイル: file_remote.py プロジェクト: xiangxiaobaog3/EWP_OMS
def file_remote(request, server_id):
    server_list = SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:  #id不存在时返回第一个
        salt_server = SaltServer.objects.all()[0]
    context = {'server_list': server_list, 'salt_server': salt_server}
    #返回在线minion
    try:
        sapi = SaltAPI(url=salt_server.url,
                       username=salt_server.username,
                       password=salt_server.password)
        result = sapi.SaltRun(client='runner', fun='manage.status')
        # print result
        context['minions_up'] = result['return'][0]['up']
    except Exception as error:
        context['error'] = error
    #返回请求的目录列表和文件
    if request.method == 'GET':
        tgt = request.GET.get('tgt')
        path = request.GET.get('path', '').replace('//', '/').encode('utf-8')
        if path != '/':
            path = path.rstrip('/')
        dir = None
        if tgt and path:
            try:
                #目录存在时返回目录列表
                sapi = SaltAPI(url=salt_server.url,
                               username=salt_server.username,
                               password=salt_server.password)
                if sapi.SaltCmd(client='local',
                                tgt=tgt,
                                fun='file.directory_exists',
                                arg=path)['return'][0][tgt]:
                    path_str = path.split('/')
                    if path_str[-1] == '..':  #返回上层
                        if len(path_str) > 3:
                            dir = '/'.join(path_str[0:-2])
                        else:
                            dir = '/'
                    else:
                        dir = path
                #文件存在时,返回文件内容,加上文件格式、大小限制
                elif sapi.SaltCmd(client='local',
                                  tgt=tgt,
                                  fun='file.file_exists',
                                  arg=path)['return'][0][tgt]:
                    if os.path.splitext(path)[1] in FILE_FORMAT:
                        stats = sapi.SaltCmd(client='local',
                                             tgt=tgt,
                                             fun='file.stats',
                                             arg=path)['return'][0][tgt]
                        if stats['size'] <= 1024000:
                            content = sapi.SaltCmd(client='local',
                                                   tgt=tgt,
                                                   fun='cmd.run',
                                                   arg='cat ' +
                                                   path)['return'][0][tgt]
                            # result = {'content':content,'type':'file','pdir':path,'stats':stats}
                            context['content'] = content
                            context['stats'] = stats
                        else:
                            # result = {'error':u"文件大小超过1M,拒绝访问!"}
                            context['error'] = u"文件大小超过1M,拒绝访问!"
                    else:
                        # result = {'error':u"文件格式不允许访问,请检查setting.FILE_FORMAT!"}
                        context['error'] = u"文件格式不允许访问,请检查setting.FILE_FORMAT!"
                    path_str = path.rstrip('/').split('/')
                    if len(path_str) > 2:
                        dir = '/'.join(path_str[0:-1])
                    else:
                        dir = '/'
                else:
                    context['error'] = u"目标不存在或者不是目录或文件!"

                # 根据路径获取列表
                if dir:
                    dirs = sapi.SaltCmd(client='local',
                                        tgt=tgt,
                                        fun='file.readdir',
                                        arg=dir)['return'][0][tgt]
                    try:
                        dirs.remove('.').remove('.svn')
                    except:
                        pass
                    if dir == '/':
                        dirs.remove('..')
                    # result = {'dirs':sorted(dirs) ,'type':'dir','pdir':path}
                    context['dir'] = dir
                    context['dir_list'] = dirs
                    context['tgt'] = tgt
                # return JsonResponse(result,safe=False)
            except Exception as e:
                context['error'] = e

    return render(request, 'SALT/file_remote.html', context)