def salt_pillar_del(request): try: _id = request.POST.get("id") orm = saltstack_pillar.objects.get(id=_id) for i in orm.center_server.split(","): master_dir = commands.getoutput( '''ssh %s "grep -A2 '^pillar_roots' /etc/salt/master |grep 'base:' -A1|grep '-'|cut -d'-' -f2"''' % CENTER_SERVER[i][0] ) os.system('''ssh %s "rm -r %s/%s\.sls"''' % (CENTER_SERVER[i][0], master_dir, orm.name)) orm.delete() for i in CENTER_SERVER.keys(): master_dir = commands.getoutput( '''ssh %s "grep -A2 '^pillar_roots' /etc/salt/master |grep 'base:' -A1|grep '-'|cut -d'-' -f2"''' % CENTER_SERVER[i][0] ) content_top = """base:\n '*':\n""" for j in saltstack_pillar.objects.all(): if i in j.center_server.split(","): content_top += """ - %s\n""" % j.name content_top += "EOF" if len(re.findall(r"\n", content_top)) < 3: content_top = "" os.system('''ssh %s "cat > %s/top.sls << EOF\n%s"''' % (CENTER_SERVER[i][0], master_dir, content_top)) return HttpResponse(json.dumps({"code": 0, "msg": u"删除成功"}), content_type="application/json") except Exception, e: logger.error(e) return HttpResponse(json.dumps({"code": 1, "msg": u"删除失败"}), content_type="application/json")
def search_server_list(request): try: for i in CENTER_SERVER.keys(): recv_data = client_send_data("{'salt':1,'act':'test.ping','hosts':'*','argv':[]}",CENTER_SERVER[i][0],CENTER_SERVER[i][1]) dict_data = eval(recv_data) for k,v in dict_data.items(): uniq_test = server_list.objects.filter(server_name=k) if v == True and not uniq_test: ip = client_send_data("{'salt':1,'act':'grains.item','hosts':'%s','argv':['ipv4']}" % k,CENTER_SERVER[i][0],CENTER_SERVER[i][1]) ip = eval(ip) ip[k]['ipv4'].pop(0) os = client_send_data("{'salt':1,'act':'grains.item','hosts':'%s','argv':['os']}" % k,CENTER_SERVER[i][0],CENTER_SERVER[i][1]) os = eval(os) belong_to = i server_list.objects.create(server_name=k,ip=ip[k]['ipv4'],os=os[k]['os'],belong_to=belong_to,status=1) elif uniq_test: orm_server = server_list.objects.get(server_name=k) orm_server.status = 1 orm_server.save() for i in server_list.objects.all(): if not i.server_name in dict_data.keys(): i.status = 0 i.save() return HttpResponse(simplejson.dumps({'code':0,'msg':u'获取完成'}),content_type="application/json") except Exception,e: logger.error(e) return HttpResponse(simplejson.dumps({'code':1,'msg':u'获取失败'}),content_type="application/json")
def rsync_dest_dropdown(request): result = {} count = 0 result['rsync_dest_dropdown_list'] = [] for k in CENTER_SERVER.keys(): result['rsync_dest_dropdown_list'].append({'text':k, 'id': count}) count += 1 return HttpResponse(json.dumps(result),content_type="application/json")
def salt_state_dropdown(request): center_server = request.POST.get("center_server") result = {} result["list"] = [] result["edit"] = [] if center_server: for i in center_server.split(","): result["edit"].append({"text": i, "id": CENTER_SERVER[i][3]}) for i in CENTER_SERVER.keys(): result["list"].append({"text": i, "id": CENTER_SERVER[i][3]}) return HttpResponse(json.dumps(result), content_type="application/json")
def salt_state_dropdown(request): center_server = request.POST.get('center_server') result = {} result['list'] = [] result['edit'] = [] if center_server: for i in center_server.split(','): result['edit'].append({'text':i,'id':CENTER_SERVER[i][3]}) for i in CENTER_SERVER.keys(): result['list'].append({'text':i,'id':CENTER_SERVER[i][3]}) return HttpResponse(json.dumps(result),content_type="application/json")
def search_server_list(request): for k,v in CENTER_SERVER.items(): if not check_center_server_up(v[0],v[1]): return HttpResponse(json.dumps({'code':1,'msg':u'无法连接到%s' % k}),content_type="application/json") def gevent_run_all(CENTER_SERVER,client_send_data,server_list,p): for i in CENTER_SERVER.keys(): recv_data = client_send_data(json.dumps({'salt':1,'act':'test.ping','hosts':'*','argv':[]}),CENTER_SERVER[i][0],CENTER_SERVER[i][1]) dict_data = literal_eval(recv_data) for k,v in dict_data.items(): p.spawn(gevent_run,client_send_data,server_list,i,k,v,dict_data) def gevent_run(client_send_data,server_list,i,k,v,dict_data): uniq_test = server_list.objects.filter(server_name=k) if v == True and not uniq_test: inner_ip = client_send_data(json.dumps({'salt':1,'act':'grains.item','hosts':k,'argv':['ipv4']}),CENTER_SERVER[i][0],CENTER_SERVER[i][1]) inner_ip = literal_eval(inner_ip) inner_ip[k]['ipv4'].remove('127.0.0.1') # cmd = ["curl http://www.whereismyip.com/|grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'"] cmd = ['curl http://members.3322.org/dyndns/getip'] external_ip = client_send_data(json.dumps({'salt':1,'act':'cmd.run','hosts':k,'argv':cmd}),CENTER_SERVER[i][0],CENTER_SERVER[i][1]) external_ip = literal_eval(external_ip) external_ip = external_ip[k].split('\n')[-1] os = client_send_data(json.dumps({'salt':1,'act':'grains.item','hosts':k,'argv':['os']}),CENTER_SERVER[i][0],CENTER_SERVER[i][1]) os = literal_eval(os) belong_to = i server_list.objects.create(server_name=k,inner_ip=','.join(inner_ip[k]['ipv4']),external_ip=external_ip,os=os[k]['os'],belong_to=belong_to,status=1) elif uniq_test: orm_server = server_list.objects.get(server_name=k) orm_server.status = 1 orm_server.save() for i in server_list.objects.filter(belong_to=i): if not i.server_name in dict_data.keys(): i.status = 0 i.save() p = Pool() p.spawn(gevent_run_all,CENTER_SERVER,client_send_data,server_list,p) p.join() return HttpResponse(json.dumps({'code':0,'msg':u'获取完成'}),content_type="application/json")
def salt_top_dropdown(request): _id = request.POST.get('id') result = {} result['target'] = {} result['target']['list'] = [] result['target']['edit'] = [] result['state'] = {} result['state']['list'] = [] result['state']['edit'] = [] result['center_server'] = [] count = 0 if _id: orm = saltstack_top.objects.get(id=_id) for i in orm.target.split(','): orm_target = server_list.objects.get(server_name=i) result['target']['edit'].append({'text':i,'id':orm_target.id}) for i in orm.state.split(','): orm_state = saltstack_state.objects.get(name=i) result['state']['edit'].append({'text':i,'id':orm_state.id}) orm = perm.objects.get(username=request.user.username) servers = [] for i in orm.server_groups.split(','): orm_server = server_group_list.objects.get(server_group_name=i) servers += orm_server.members_server.split(',') for i in CENTER_SERVER.keys(): result['center_server'].append({'text':i,'id':count}) count += 1 for i in server_list.objects.all(): if i.server_name in servers: result['target']['list'].append({'text':i.server_name,'id':i.id}) for i in saltstack_state.objects.all(): result['state']['list'].append({'text':i.name,'id':i.id}) return HttpResponse(json.dumps(result),content_type="application/json")
def salt_top_dropdown(request): _id = request.POST.get("id") result = {} result["target"] = {} result["target"]["list"] = [] result["target"]["edit"] = [] result["state"] = {} result["state"]["list"] = [] result["state"]["edit"] = [] result["center_server"] = [] count = 0 if _id: orm = saltstack_top.objects.get(id=_id) for i in orm.target.split(","): orm_target = server_list.objects.get(server_name=i) result["target"]["edit"].append({"text": i, "id": orm_target.id}) for i in orm.state.split(","): orm_state = saltstack_state.objects.get(name=i) result["state"]["edit"].append({"text": i, "id": orm_state.id}) orm = perm.objects.get(username=request.user.username) servers = [] for i in orm.server_groups.split(","): orm_server = server_group_list.objects.get(server_group_name=i) servers += orm_server.members_server.split(",") for i in CENTER_SERVER.keys(): result["center_server"].append({"text": i, "id": count}) count += 1 for i in server_list.objects.all(): if i.server_name in servers: result["target"]["list"].append({"text": i.server_name, "id": i.id}) for i in saltstack_state.objects.all(): result["state"]["list"].append({"text": i.name, "id": i.id}) return HttpResponse(json.dumps(result), content_type="application/json")
def gevent_run_all(CENTER_SERVER,client_send_data,server_list,p): for i in CENTER_SERVER.keys(): recv_data = client_send_data(json.dumps({'salt':1,'act':'test.ping','hosts':'*','argv':[]}),CENTER_SERVER[i][0],CENTER_SERVER[i][1]) dict_data = literal_eval(recv_data) for k,v in dict_data.items(): p.spawn(gevent_run,client_send_data,server_list,i,k,v,dict_data)
def upload_upload(request): flag = request.POST.get('flag') file_name = request.POST.get('file_name') if int(flag) == 0: #开始传输 # orm = upload_files.objects.get(file_name=file_name) rsync_dest = request.POST.get('rsync_dest') rsync_state = request.POST.get('rsync_state') for k,v in CENTER_SERVER.items(): if not check_center_server_up(v[0],v[1]): return HttpResponse(json.dumps({'code':1,'msg':u'无法连接到%s' % k}),content_type="application/json") if rsync_dest: rsync_ip = CENTER_SERVER[rsync_dest][0] if rsync_state: master_dir = commands.getoutput('''ssh %s "grep -A2 '^file_roots' /etc/salt/master |grep 'base:' -A1|grep '-'|cut -d'-' -f2"''' % CENTER_SERVER[rsync_dest][0]) rsync_dir = os.path.join(master_dir,rsync_state) else: rsync_dir = CENTER_SERVER[rsync_dest][2] cmdLine = [] cmdLine.append('rsync') cmdLine.append('--progress') cmdLine.append(BASE_DIR + '/uploads/%s' % file_name) cmdLine.append('%s:%s' % (rsync_ip,rsync_dir)) tmpFile = BASE_DIR + "/tmp/upload.tmp" #临时生成一个文件 fpWrite = open(tmpFile,'w') with open(BASE_DIR + '/tmp/rsync_status_file.tmp','w') as f: pass process = subprocess.Popen(cmdLine,stdout = fpWrite,stderr = subprocess.PIPE); while True: fpRead = open(tmpFile,'r') #这里又重新创建了一个文件读取对象,不知为何,用上面的就是读不出来,改w+也不>行 lines = fpRead.readlines() for line in lines: a = re.search(r'\d+%',line) if a: with open(BASE_DIR + '/tmp/percent.tmp','a') as f: f.write(a.group()) if process.poll() == 0: break; elif process.poll() == None: pass else: break fpWrite.truncate() #此处清空文件,等待记录下一次输出的进度 fpRead.close() time.sleep(0.7) fpWrite.close() os.remove(BASE_DIR + '/tmp/rsync_status_file.tmp') # error = process.stderr.read() # if not error == None: # print 'error info:%s' % error os.remove(tmpFile) #删除临时文件 os.remove(BASE_DIR + '/tmp/percent.tmp') return HttpResponse(json.dumps({'code':0,'msg':u'文件传输成功'}),content_type="application/json") elif int(flag) == 1: #获取百分比 if os.path.exists(BASE_DIR + '/tmp/rsync_status_file.tmp'): process = 1 else: process = 0 if os.path.exists(BASE_DIR + '/tmp/percent.tmp'): with open(BASE_DIR + '/tmp/percent.tmp') as f: data = f.readline() if data: last_percent = re.search(r'\d{1,2}%$',data) if last_percent: return HttpResponse(json.dumps({'code':0,'percent':last_percent.group(),'process':process}),content_type="application/json") else: return HttpResponse(json.dumps({'code':0,'percent':0,'process':process}),content_type="application/json") else: pass return HttpResponse(json.dumps({'code':1,'msg':u'文件传输失败'}),content_type="application/json")