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)
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)
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
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
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)
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)
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)
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)
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)
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)
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())
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)
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'))
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)
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
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())
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)
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)
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)
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)
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)
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(" "," ") 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)
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)