def put(self, request, *args, **kwargs): errno = 0 error = "" try: with transaction.atomic(): data = json.loads(request.data.get('data')) Tools.serviceGroupCheck(data) items = data.pop("serviceTypes") serviceGroup = ServiceGroup.objects.get(id=data.get('id')) # 不能修改name serviceGroup.remark = data.get('remark') serviceGroup.serviceTypes.clear() for item in items: serviceType = ServiceType.objects.get(id=item) serviceGroup.serviceTypes.add(serviceType) serviceGroup.pillars = json.dumps(data.get('pillars'), sort_keys=True) serviceGroup.hasNewPillars = False serviceGroup.save() # 保存文件 api = SaltAPI() path = settings.PROJECT_ROOT + serviceGroup.name + ".sls" content = Tools.generatePillarContent(serviceGroup) api.writePillar(path, content) # 更新init.sls Tools.addPillarsPathConfig(api, path) except Exception as e: errno = 1 error = str(e) return JsonResponse({'errno': errno, 'error': error})
def doJob(request): errno = 0 error = "" try: stateId = request.GET.get("stateId") state = State.objects.get(id=stateId) serviceIds = json.loads(request.GET.get("serviceIds")) api = SaltAPI() for serviceId in serviceIds: service = Service.objects.get(id=serviceId) try: pillar = {'service_group': service.group.name, 'service_type': service.type.name} rsp = api.cmd(client='local_async', fun="state.sls", targetType='list', target=service.host.saltId, arg=[state.fun], kwarg={'pillar': pillar}) jid = rsp['return'][0]["jid"] job = ServiceJob.objects.create(jid=jid, service=service, state=state) service.currentJobId = job.id service.currentJobDesc = job.state.name except Exception: service.currentJobId = -1 service.currentJobDesc = "" service.status = state.failureStatus service.save() except Exception as e: errno = 1 error = str(e) return JsonResponse({'errno': errno, 'error': error})
def commandResult(request): id = request.GET.get("id") jid = request.GET.get("jid") errno = 0 isNew = False data = {} try: record = None if jid: record = CommandRecord.objects.get(jid=jid) elif id: record = CommandRecord.objects.get(id=id) if record: if record.result and record.result != "{}": data = json.loads(record.result) else: api = SaltAPI() rsp = api.jobs(record.jid) data = rsp['info'][0]['Result'] record.result = json.dumps(data) record.save() isNew = True except CommandRecord.DoesNotExist: errno = 1 except Exception: errno = 2 return JsonResponse({ 'errno': errno, 'error': '', 'data': data, 'isNew': isNew })
def commandRun(request): client = request.GET.get("client") command = Command.objects.get(id=request.GET.get("commandId")) targetType = request.GET.get("targetType") target = request.GET.get("target") arguments = request.GET.get("arguments") cmd = request.GET.get("cmd") arg = [] kwarg = {} if arguments: arr = arguments.split('|') for param in arr: kw = param.split('=') if len(kw) > 1: kwarg[kw[0]] = kw[1] else: arg.append(param) api = SaltAPI() if client == "runner" or client == "runner_async" or client == "wheel": rsp = api.run(client, command.fun, arg, kwarg) else: rsp = api.cmd(client, command.fun, targetType, target, arg, kwarg) if client == "local_async" or client == "runner_async": data = rsp['return'][0]["jid"] record = CommandRecord(cmd=cmd, jid=data, result="") record.save() else: data = rsp['return'][0] record = CommandRecord(cmd=cmd, jid="", result=json.dumps(data)) record.save() return JsonResponse({'errno': 0, 'error': '', 'data': data})
def syncJobStatus(): jobs = ServiceJob.objects.filter(result=None) api = SaltAPI() for job in jobs: rsp = api.jobs(job.jid) data = rsp['info'][0]['Result'] # TODO:任务成功/失败的判断 if data and data != "{}": job.result = json.dumps(data) job.service.currentJobId = -1 job.service.currentJobDesc = "" job.service.status = job.state.successStatus job.service.save() job.save()
def delete(self, request, *args, **kwargs): errno = 0 error = "" try: with transaction.atomic(): id = int(request.data['id']) serviceGroup = ServiceGroup.objects.get(id=id) path = settings.PROJECT_ROOT + serviceGroup.name + ".sls" serviceGroup.delete() api = SaltAPI() # 更新init.sls Tools.delPillarsPathConfig(api, path) # 删除文件 api.deletePillar(path) except Exception as e: errno = 1 error = str(e) return JsonResponse({'errno': errno, 'error': error})
def moduleFunListSync(request): errno = 0 try: api = SaltAPI() moduleTypes = [Module.execution, Module.runner, Module.wheel] for moduleType in moduleTypes: rsp = api.run(client='runner', fun="doc." + moduleType) docs = rsp['return'][0] for fun in docs: arr = fun.split('.') module, created = Module.objects.get_or_create(type=moduleType, name=arr[0]) command, created = Command.objects.get_or_create(module=module, fun=fun) if not command.doc: command.doc = docs[fun] command.save() except Exception: errno = 1 return JsonResponse({'errno': errno, 'error': '', 'data': ''})
def hostSyncTask(): try: try: group = HostGroup.objects.get(name='备用组') except HostGroup.DoesNotExist: group = HostGroup(name='备用组') group.save() api = SaltAPI() rsp = api.minions() datas = rsp['return'][0] onlines = set() updateTime = now() for saltId, data in datas.items(): serialNumber = data['serialnumber'] try: host = Host.objects.get(serialNumber=serialNumber) except Host.DoesNotExist: # 新建的机器全部放在备用组 host = Host(serialNumber=serialNumber, hostGroup=group) ips = data['ip_interfaces'] if 'eth0' in ips and len(ips['eth0']) > 0: host.ip = ips['eth0'][0] if 'eth1' in ips and len(ips['eth1']) > 0: host.ipEth1 = ips['eth1'][0] host.kernel = data['kernel'] host.os = data['os'] host.osArch = data['osarch'] host.osRelease = data['osrelease'] host.saltId = saltId host.saltStatus = Host.ONLINE host.updateTime = updateTime host.save() onlines.add(serialNumber) for host in Host.objects.all(): if host.serialNumber not in onlines: host.saltStatus = Host.OFFLINE host.save() return 0 except Exception: return 1
def delete(self, request, *args, **kwargs): errno = 0 error = "" try: with transaction.atomic(): id = int(request.data['id']) state = State.objects.get(id=id) deletePaths = [] for jinja in state.jinjas.all(): deletePaths.append(jinja.path) jinja.delete() deletePaths.append(state.path) state.delete() # 删除文件 api = SaltAPI() for path in deletePaths: api.deleteFile(path) except Exception as e: errno = 1 error = str(e) return JsonResponse({'errno': errno, 'error': error})
def post(self, request, *args, **kwargs): errno = 0 error = "" try: with transaction.atomic(): data = json.loads(request.data.get('data')) Tools.stateCheck(data) data.pop('id') items = data.pop('jinjas') state = State.objects.create(**data) for item in items: item.pop('id') jinja = Jinja.objects.create(**item) state.jinjas.add(jinja) state.pillars = json.dumps(Tools.getPillars(state), sort_keys=True) state.save() # 保存文件 api = SaltAPI() api.writeFile(state.path, state.content) for jinja in state.jinjas.all(): api.writeFile(jinja.path, jinja.content) except Exception as e: errno = 1 error = str(e) return JsonResponse({'errno': errno, 'error': error})
def put(self, request, *args, **kwargs): errno = 0 error = "" try: with transaction.atomic(): data = json.loads(request.data.get('data')) Tools.stateCheck(data) state = State.objects.get(id=data.get('id')) deletePaths = [] if state.path != data.get('path'): deletePaths.append(state.path) state.name = data.get('name') state.remark = data.get('remark') state.fun = data.get('fun') state.path = data.get('path') state.content = data.get('content') state.successStatus = data.get('successStatus') state.failureStatus = data.get('failureStatus') currentJinjaIds = [] for item in data.get('jinjas'): if item.get('id') == "": # 新增 item.pop('id') jinja = Jinja.objects.create(**item) state.jinjas.add(jinja) currentJinjaIds.append(jinja.id) else: # 修改 jinja = Jinja.objects.get(id=item.get('id')) if jinja.path != item.get('path'): deletePaths.append(jinja.path) jinja.name = item.get('name') jinja.path = item.get('path') jinja.content = item.get('content') jinja.save() currentJinjaIds.append(jinja.id) for jinja in state.jinjas.all(): if jinja.id not in currentJinjaIds: # 已删除 deletePaths.append(jinja.path) jinja.delete() pillars = Tools.getPillars(state) if Tools.isPillarsAdd(json.loads(state.pillars), pillars): for serviceType in state.servicetype_set.all(): for serviceGroup in serviceType.servicegroup_set.all(): serviceGroup.hasNewPillars = True serviceGroup.save() state.pillars = json.dumps(pillars, sort_keys=True) state.save() # 保存文件 api = SaltAPI() api.writeFile(state.path, state.content) for jinja in state.jinjas.all(): api.writeFile(jinja.path, jinja.content) # 删除文件 for path in deletePaths: api.deleteFile(path) except Exception as e: errno = 1 error = str(e) return JsonResponse({'errno': errno, 'error': error})