コード例 #1
0
ファイル: views.py プロジェクト: shuke163/learnpy
 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})
コード例 #2
0
ファイル: views.py プロジェクト: shuke163/learnpy
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})
コード例 #3
0
ファイル: views.py プロジェクト: shuke163/learnpy
 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})
コード例 #4
0
ファイル: views.py プロジェクト: shuke163/learnpy
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
    })
コード例 #5
0
ファイル: views.py プロジェクト: shuke163/learnpy
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})
コード例 #6
0
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()
コード例 #7
0
ファイル: views.py プロジェクト: shuke163/learnpy
 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})
コード例 #8
0
ファイル: views.py プロジェクト: shuke163/learnpy
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': ''})
コード例 #9
0
ファイル: tasks.py プロジェクト: shuke163/learnpy
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
コード例 #10
0
ファイル: views.py プロジェクト: shuke163/learnpy
 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})
コード例 #11
0
ファイル: views.py プロジェクト: shuke163/learnpy
 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})