def get_script_versions(request, script_id): """ get all versions for given script. """ user = request.user status = 500 data = {} try: script = _script.get_script_by_params(pk=script_id, is_delete=False, is_once=False) if not script: msg = u'未找到该id对应脚本' else: versions = _script.get_versions_by_params(script=script, is_delete=False) vers_info = {} [vers_info.update({ver.id: ver.name}) for ver in versions] msg = u'操作成功' status = 200 data.update({"versions": vers_info}) except Exception, e: msg = u"未知错误" error = traceback.format_exc() print error logger.error(error)
def script_edit(request): user = request.user sdicts = {} code = 500 try: script_id = request.POST.get('script_id') script_name = request.POST.get('script_name') script_describe = request.POST.get('script_describe') script = _script.get_script_by_params(id=script_id) scripts = _script.get_scripts_by_params( name=script_name, create_user=user, is_delete=False).exclude(id=script.id) if scripts: return HttpResponse(json.dumps({"status": 500, "msg": u"作业名称已存在"})) script.name = script_name script.describe = script_describe script.update_user = user script.save() script_type_display = script.get_script_type_display() version_list = _script.get_versions_by_params(script=script, is_delete=False) code = 200 except Exception, e: code = 500 msg = u'保存脚本名称失败'
def script_edit(request): user = request.user sdicts = {} code = 500 try: script_id = request.POST.get('script_id') script_name = request.POST.get('script_name') script_describe = request.POST.get('script_describe') script = _script.get_script_by_params(id=script_id) scripts = _script.get_scripts_by_params(name=script_name,create_user=user,is_delete=False).exclude(id=script.id) if scripts: return HttpResponse(json.dumps({ "status":500, "msg": u"作业名称已存在" })) script.name = script_name script.describe = script_describe script.update_user = user script.save() script_type_display = script.get_script_type_display() version_list = _script.get_versions_by_params(script=script,is_delete=False) code = 200 except Exception,e: code = 500 msg = u'保存脚本名称失败'
def script_add(request): user = request.user sdicts = {} code = 500 if request.method == 'POST': try: check_id = request.POST.get('check_id') script_name = request.POST.get('new_script_name') script_describe = request.POST.get('new_script_describe') script_type = request.POST.get('new_script_type') file_content = request.POST.get('new_file_content') script = _script.get_script_by_params(name=script_name,create_user=user,is_delete=False) if script: return HttpResponse(json.dumps({ "status":500, "msg": u"作业名称已存在" })) script = _script.create_script_by_params(name=script_name,create_user=user) script.script_type = script_type script.update_user = user script.describe = script_describe script.save() script_type_display = enum_script.SCIPT_TYPE_CHOICES[int(script.script_type)-1][1] version_list = _script.get_versions_by_params(script=script,is_delete=False) version_name = '%s_%s'%(check_id,user.username) version = _script.get_or_create_version_by_params(script=script,name=version_name)[0] file_doc_num = version.id % 100 file_doc_path = os.path.join(MEDIA_ROOT,'scripts','%s'%file_doc_num) if not os.path.exists(file_doc_path): os.mkdir(file_doc_path) suffix = enum_script.SCIPT_TYPE_DICT.get(int(script.script_type)) filename = u'%s.%s'%(version_name, suffix) file_path = os.path.join(file_doc_path,filename) f = open(file_path, 'wb') try: f.write(file_content) except Exception,e: print e finally: f.close() md5sum = calc_md5(file_path) fileserver_save_file(file_path,user.username,md5sum) version.sfile = u'%s/%s'%(file_doc_num, filename) version.save() code = 200 except Exception,e: code = 500 msg = u'保存脚本失败'
def script_view(request): user = request.user sdicts = {} code = 500 try: script_id = request.POST.get('script_id') script = _script.get_script_by_params(id=script_id) script_type_display = script.get_script_type_display() version_list = _script.get_versions_by_params(script=script,is_delete=False) code = 200 except Exception,e: code = 500
def script_view(request): user = request.user sdicts = {} code = 500 try: script_id = request.POST.get('script_id') script = _script.get_script_by_params(id=script_id) script_type_display = script.get_script_type_display() version_list = _script.get_versions_by_params(script=script, is_delete=False) code = 200 except Exception, e: code = 500
def script_describe_edit(request): user = request.user sdicts = {} code = 500 try: script_id = request.POST.get('script_id') script_describe = request.POST.get('script_describe') script = _script.get_script_by_params(id=script_id) script.describe = script_describe script.update_user = user script.save() script_type_display = script.get_script_type_display() version_list = _script.get_versions_by_params(script=script,is_delete=False) code = 200 except Exception,e: code = 500 msg = u'保存脚本描述失败'
def script_delete(request): ''' delete script ''' sdicts = {} script_id = request.POST.get('script_id', 0) user = request.user script = _script.get_script_by_params(id=script_id) if script: versions = _script.get_versions_by_params(script=script, is_delete=False) # jobStepScripts = _job.get_jobStepScripts_by_params(step__job__is_delete=False,version__in=versions) templateStepScripts = _template.get_templateStepScripts_by_params( step__template__is_delete=False, version__in=versions) # if jobStepScripts: # sdicts = {'result':0} # sdicts['showMsg'] = _(u"删除失败: 当前脚本存在关联的作业实例") # elif templateStepScripts: # sdicts = {'result':0} # sdicts['showMsg'] = _(u"删除失败: 当前脚本存在关联的作业模板") if templateStepScripts: sdicts = {'result': 0} sdicts['showMsg'] = _(u"删除失败: 当前脚本存在关联的作业实例") else: script.is_delete = True script.update_user = user script.save() sdicts['result'] = 1 sdicts['showMsg'] = _(u"删除成功") else: sdicts = {'result': 0} sdicts['showMsg'] = _(u"删除失败") # table_fields = [u'脚本名称', u'脚本描述', u'创建人', u'创建时间', u'最后修改人', u'最后修改时间', u'操作'] table_fields = [u'脚本名称', u'脚本描述', u'创建人', u'最后修改人', u'已授权用户', u'操作'] ajax_url = u'/script_manage/list/' template_file = "script_manage/contentDiv.html" html = render_to_string(template_file, locals()) sdicts['html'] = html return HttpResponse(json.dumps(sdicts, cls=LazyEncoder))
def script_describe_edit(request): user = request.user sdicts = {} code = 500 try: script_id = request.POST.get('script_id') script_describe = request.POST.get('script_describe') script = _script.get_script_by_params(id=script_id) script.describe = script_describe script.update_user = user script.save() script_type_display = script.get_script_type_display() version_list = _script.get_versions_by_params(script=script, is_delete=False) code = 200 except Exception, e: code = 500 msg = u'保存脚本描述失败'
def script_delete(request): ''' delete script ''' sdicts = {} script_id = request.POST.get('script_id',0) user = request.user script = _script.get_script_by_params(id=script_id) if script: versions = _script.get_versions_by_params(script=script,is_delete=False) # jobStepScripts = _job.get_jobStepScripts_by_params(step__job__is_delete=False,version__in=versions) templateStepScripts = _template.get_templateStepScripts_by_params(step__template__is_delete=False,version__in=versions) # if jobStepScripts: # sdicts = {'result':0} # sdicts['showMsg'] = _(u"删除失败: 当前脚本存在关联的作业实例") # elif templateStepScripts: # sdicts = {'result':0} # sdicts['showMsg'] = _(u"删除失败: 当前脚本存在关联的作业模板") if templateStepScripts: sdicts = {'result':0} sdicts['showMsg'] = _(u"删除失败: 当前脚本存在关联的作业实例") else: script.is_delete = True script.update_user = user script.save() sdicts['result'] = 1 sdicts['showMsg'] = _(u"删除成功") else: sdicts = {'result':0} sdicts['showMsg'] = _(u"删除失败") # table_fields = [u'脚本名称', u'脚本描述', u'创建人', u'创建时间', u'最后修改人', u'最后修改时间', u'操作'] table_fields = [u'脚本名称', u'脚本描述', u'创建人', u'最后修改人', u'已授权用户', u'操作'] ajax_url = u'/script_manage/list/' template_file = "script_manage/contentDiv.html" html = render_to_string(template_file, locals()) sdicts['html'] = html return HttpResponse(json.dumps(sdicts, cls=LazyEncoder))
def get_script_versions(request,script_id): """ get all versions for given script. """ user = request.user status = 500 data = {} try: script = _script.get_script_by_params(pk=script_id,is_delete=False,is_once=False) if not script: msg = u'未找到该id对应脚本' else: versions = _script.get_versions_by_params(script=script,is_delete=False) vers_info = {} [vers_info.update({ver.id:ver.name}) for ver in versions] msg = u'操作成功' status = 200 data.update({"versions":vers_info}) except Exception,e: msg = u"未知错误" error = traceback.format_exc() print error logger.error(error)
def script_execute(request): ''' @author: wx execute script ''' user = request.user logger.debug("### start execute script...") script_name = request.POST.get('script_once_name') script_type = request.POST.get('script_once_type') file_content = request.POST.get('file_content') script_account = request.POST.get('script_account') account = _account.get_account_by_params(id=int(script_account)) timeout = request.POST.get('script_once_timeout') if timeout: timeout = int(timeout) else: timeout = 0 parameter = request.POST.get('script_once_parameter').strip() ip_area_hide = request.POST.get('ip-area-script-hide') minion_info_dict = json.loads(ip_area_hide) script = _script.get_script_by_params(name=script_name, create_user=user, is_delete=False) if script: return HttpResponse( json.dumps({ "status": 500, "result": { "msg": u"作业名称已存在" } })) try: script = _script.create_script_by_params(name=script_name, create_user=user) script.script_type = script_type script.update_user = user script.is_once = True script.save() now = datetime.datetime.now() version_name = '%s_%s' % (datetime.datetime.strftime( now, '%Y%m%d%H%M%S'), user.username) version = _script.get_or_create_version_by_params(script=script, name=version_name)[0] file_doc_num = version.id % 100 file_doc_path = os.path.join(MEDIA_ROOT, 'scripts', '%s' % file_doc_num) if not os.path.exists(file_doc_path): os.mkdir(file_doc_path) suffix = enum_script.SCIPT_TYPE_DICT.get(int(script.script_type)) filename = u'%s.%s' % (version_name, suffix) file_path = os.path.join(file_doc_path, filename) f = open(file_path, 'wb') try: f.write(file_content) except Exception, e: print e finally: f.close() md5sum = calc_md5(file_path) fileserver_save_file(file_path, user.username, md5sum) version.sfile = u'%s/%s' % (file_doc_num, filename) version.save() # minion-ip map minion_id_map = {} # add all minion item to ip_set. ip_set = set() if minion_info_dict: for (item, minion_info) in minion_info_dict.items(): if item == 'total' or item == 'num': continue minion_id = item ip_str = minion_info[3] ip_list = ip_str.split('<br>') minion_ip = ip_list[0] if minion_id in minion_id_map.keys(): continue minion_id_map.update({minion_id: item}) ip_set.add(minion_ip) template = _template.get_or_create_template_by_params( name=u'一次性脚本模板')[0] template.template_type = enum_template.TEMPLATE_TYPE99 template.account = account template.target = json.dumps(list(ip_set)) template.save() templateStep = _template.get_or_create_templateStep_by_params( template=template, name=version_name)[0] templateStep.step_type = enum_template.STEP_TYPE_SCRIPT templateStep.order = 1 templateStep.save() templateStepScript = _template.get_or_create_templateStepScript_by_params( step=templateStep, version=version)[0] templateStepScript.parameter = parameter templateStepScript.timeout = timeout templateStepScript.save() job = _job.get_or_create_job_by_params(template=template, name=script_name)[0] job.account = account job.target = json.dumps(list(ip_set)) job.create_user = user job.update_user = user job.save() jobStep = _job.get_or_create_jobStep_by_params( job=job, template_step=templateStep, name=u'一次性脚本操作')[0] jobStep.target = job.target jobStep.step_type = enum_template.STEP_TYPE_SCRIPT jobStep.order = 1 jobStep.save() jobStepScript = _job.get_or_create_jobStepScript_by_params( step=jobStep, version=version)[0] jobStepScript.parameter = parameter jobStepScript.timeout = timeout jobStepScript.save() logger.debug("start handle job...") result = handle_job(job, user) logger.debug("script_result:%s" % (result)) return HttpResponse(json.dumps(result))
def script_add(request): user = request.user sdicts = {} code = 500 if request.method == 'POST': try: check_id = request.POST.get('check_id') script_name = request.POST.get('new_script_name') script_describe = request.POST.get('new_script_describe') script_type = request.POST.get('new_script_type') file_content = request.POST.get('new_file_content') script = _script.get_script_by_params(name=script_name, create_user=user, is_delete=False) if script: return HttpResponse( json.dumps({ "status": 500, "msg": u"作业名称已存在" })) script = _script.create_script_by_params(name=script_name, create_user=user) script.script_type = script_type script.update_user = user script.describe = script_describe script.save() script_type_display = enum_script.SCIPT_TYPE_CHOICES[ int(script.script_type) - 1][1] version_list = _script.get_versions_by_params(script=script, is_delete=False) version_name = '%s_%s' % (check_id, user.username) version = _script.get_or_create_version_by_params( script=script, name=version_name)[0] file_doc_num = version.id % 100 file_doc_path = os.path.join(MEDIA_ROOT, 'scripts', '%s' % file_doc_num) if not os.path.exists(file_doc_path): os.mkdir(file_doc_path) suffix = enum_script.SCIPT_TYPE_DICT.get(int(script.script_type)) filename = u'%s.%s' % (version_name, suffix) file_path = os.path.join(file_doc_path, filename) f = open(file_path, 'wb') try: f.write(file_content) except Exception, e: print e finally: f.close() md5sum = calc_md5(file_path) fileserver_save_file(file_path, user.username, md5sum) version.sfile = u'%s/%s' % (file_doc_num, filename) version.save() code = 200 except Exception, e: code = 500 msg = u'保存脚本失败'
def script_execute(request): ''' @author: wx execute script ''' user = request.user logger.debug("### start execute script...") script_name = request.POST.get('script_once_name') script_type = request.POST.get('script_once_type') file_content = request.POST.get('file_content') script_account = request.POST.get('script_account') account = _account.get_account_by_params(id=int(script_account)) timeout = request.POST.get('script_once_timeout') if timeout: timeout = int(timeout) else: timeout = 0 parameter = request.POST.get('script_once_parameter').strip() ip_area_hide = request.POST.get('ip-area-script-hide') minion_info_dict = json.loads(ip_area_hide) script = _script.get_script_by_params(name=script_name,create_user=user,is_delete=False) if script: return HttpResponse(json.dumps({ "status":500, "result":{ "msg": u"作业名称已存在" } })) try: script = _script.create_script_by_params(name=script_name,create_user=user) script.script_type = script_type script.update_user = user script.is_once = True script.save() now = datetime.datetime.now() version_name = '%s_%s'%(datetime.datetime.strftime(now, '%Y%m%d%H%M%S'),user.username) version = _script.get_or_create_version_by_params(script=script,name=version_name)[0] file_doc_num = version.id % 100 file_doc_path = os.path.join(MEDIA_ROOT,'scripts','%s'%file_doc_num) if not os.path.exists(file_doc_path): os.mkdir(file_doc_path) suffix = enum_script.SCIPT_TYPE_DICT.get(int(script.script_type)) filename = u'%s.%s'%(version_name, suffix) file_path = os.path.join(file_doc_path,filename) f = open(file_path, 'wb') try: f.write(file_content) except Exception,e: print e finally: f.close() md5sum = calc_md5(file_path) fileserver_save_file(file_path,user.username,md5sum) version.sfile = u'%s/%s'%(file_doc_num, filename) version.save() # minion-ip map minion_id_map = {} # add all minion item to ip_set. ip_set = set() if minion_info_dict: for (item, minion_info) in minion_info_dict.items(): if item == 'total' or item == 'num': continue minion_id = item ip_str = minion_info[3] ip_list = ip_str.split('<br>') minion_ip = ip_list[0] if minion_id in minion_id_map.keys(): continue minion_id_map.update({minion_id:item}) ip_set.add(minion_ip) template = _template.get_or_create_template_by_params(name=u'一次性脚本模板')[0] template.template_type = enum_template.TEMPLATE_TYPE99 template.account = account template.target = json.dumps(list(ip_set)) template.save() templateStep = _template.get_or_create_templateStep_by_params(template=template,name=version_name)[0] templateStep.step_type = enum_template.STEP_TYPE_SCRIPT templateStep.order = 1 templateStep.save() templateStepScript = _template.get_or_create_templateStepScript_by_params(step=templateStep, version=version)[0] templateStepScript.parameter = parameter templateStepScript.timeout = timeout templateStepScript.save() job = _job.get_or_create_job_by_params(template=template,name=script_name)[0] job.account = account job.target = json.dumps(list(ip_set)) job.create_user=user job.update_user = user job.save() jobStep = _job.get_or_create_jobStep_by_params(job=job,template_step=templateStep,name=u'一次性脚本操作')[0] jobStep.target = job.target jobStep.step_type = enum_template.STEP_TYPE_SCRIPT jobStep.order = 1 jobStep.save() jobStepScript = _job.get_or_create_jobStepScript_by_params(step=jobStep, version=version)[0] jobStepScript.parameter = parameter jobStepScript.timeout = timeout jobStepScript.save() logger.debug("start handle job...") result = handle_job(job,user) logger.debug("script_result:%s"%(result)) return HttpResponse(json.dumps(result))
def update_auth(request): ''' 更新用户授权. ''' result = {} status = 500 data = {} msg = '' try: user = request.user req = request.POST req_type = req.get("auth_type", "") obj_ids = req.getlist('obj_list[]', []) select_ids = req.getlist("user_list[]", []) logger.debug( "start update auth, auth_type:{0}, obj_ids:{1}, user_names:{2}". format(req_type, ','.join(obj_ids), ','.join(select_ids))) if req_type not in PERM_PTYPE_MAP.keys(): msg = u'授权类型错误' raise Exception, msg if not obj_ids or not isinstance(obj_ids, list): msg = u'未勾选或所选对象类型错误' raise Exception, msg user_names = [] logger.debug("request:{0}".format(req)) auth_type = PERM_PTYPE_MAP.get(req_type) msg = u'不允许二次授权,请重新选择' for obj_id in obj_ids: if auth_type == PERM_PTYPE_TEMPLATE and _template.get_template_by_params( id=obj_id).create_user != user: raise Exception, msg if auth_type == PERM_PTYPE_JOB and _job.get_job_by_params( id=obj_id).create_user != user: raise Exception, msg if auth_type == PERM_PTYPE_SCRIPT and _script.get_script_by_params( id=obj_id).create_user != user: raise Exception, msg msg = "" for select_id in select_ids: if str(select_id).startswith('emp_'): user_names.append(select_id.split('_')[1]) for obj_id in obj_ids: logger.debug( "==> start update perm for object id:{0}".format(obj_id)) old_perms = Perm.objects.filter(ptype=PERM_PTYPE_MAP[req_type], object_id=obj_id, is_delete=False).values_list('id') old_perm_ids = [i[0] for i in old_perms] new_perm_ids = set() scripts = None if auth_type == PERM_PTYPE_TEMPLATE: #获取所有该模板的脚本 steps = TemplateStep.objects.filter( template__id=obj_id, step_type=enum_template.STEP_TYPE_SCRIPT, is_delete=False) script_steps = TemplateStepScript.objects.filter( step__in=steps) scripts = [step.version.script for step in script_steps] for user_name in user_names: to_user = User.objects.get(username=user_name) p, is_create = Perm.objects.get_or_create( ptype=PERM_PTYPE_MAP[req_type], object_id=obj_id, is_delete=False, create_user=user, to_user=to_user) new_perm_ids.add(p.id) if is_create: logger.debug( 'perm of user:{0} to {1}_id:{2} is created'.format( user_name, req_type, obj_id)) else: logger.debug( 'perm of user:{0} to {1}_id:{2} already exists.'. format(user_name, req_type, obj_id)) ### 自动脚本授权 if auth_type == PERM_PTYPE_TEMPLATE: for script in scripts: p, is_create = Perm.objects.get_or_create( ptype=PERM_PTYPE_SCRIPT, object_id=script.id, is_delete=False, create_user=user, to_user=to_user) logger.debug( "create auth for script:{0} to user:{1},is_create:{2}" .format(script.id, to_user.username, is_create)) discard_perms = set(old_perm_ids).difference(new_perm_ids) if discard_perms: names = [ i[0] for i in Perm.objects.filter( id__in=discard_perms).values_list('to_user__username') ] logger.debug("drop perms of {0} to {1}_id:{2}".format( ','.join(names), req_type, obj_id)) Perm.objects.filter(id__in=discard_perms).update( is_delete=True) ### 脚本授权回收. if auth_type == PERM_PTYPE_TEMPLATE: script_ids = [script.id for script in scripts] or [] for script_id in script_ids: rel_script_steps = TemplateStepScript.objects.filter( version__script__id=script_id, step__is_delete=False) rel_template_ids = [ script_step.step.template.id for script_step in rel_script_steps ] for name in names: # 存在其他关联模板授权的不进行回收该脚本. if Perm.objects.filter( ptype=PERM_PTYPE_TEMPLATE, object_id__in=rel_template_ids, is_delete=False, to_user__username=name).count() > 0: logger.debug( "other template using this template, no revoke,user:{0},script_id:{1}" .format(name, script_id)) else: logger.debug( "revoke auth, script_id:{0}, user:{1}". format(script_id, name)) Perm.objects.filter( ptype=PERM_PTYPE_SCRIPT, object_id=script_id, is_delete=False, create_user=user, to_user__username=name).update( is_delete=True) logger.debug("==> update perm successfully!\n") msg = u'授权更新成功' status = 200 logger.debug("## All perm update successfully!\n") except Exception, e: msg = u'授权更新失败' if not msg else msg error = traceback.format_exc() print error logger.error(error)