def get_client_name(request): utils = request.POST.get('utils', '') try: utils = int(utils) utils_manage = UtilsManage.objects.get(id=utils) except: return JsonResponse({ "ret": 0, "data": "Commvault工具未配置。", }) else: _, sqlserver_credit = get_credit_info(utils_manage.content) try: dm = SQLApi.CVApi(sqlserver_credit) clientname_list = dm.get_clients_name() except Exception as e: print(e) return JsonResponse({ "ret": 0, "data": "获取客户端基础信息失败。", }) else: return JsonResponse({ "ret": 1, "data": clientname_list, })
def get_backup_status(request): whole_list = [] utils_manage_id = request.POST.get('utils_manage_id', '') try: utils_manage_id = int(utils_manage_id) utils_manage = UtilsManage.objects.get(id=utils_manage_id) except: return JsonResponse({ "ret": 0, "data": "Commvault工具未配置。", }) else: _, sqlserver_credit = get_credit_info(utils_manage.content) try: dm = SQLApi.CVApi(sqlserver_credit) whole_list = dm.get_backup_status() for num, wl in enumerate(whole_list): clientname_rowspan = get_rowspan(whole_list, clientname=wl['clientname']) idataagent_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent']) type_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent'], type=wl['type']) # 时间 try: whole_list[num][ "startdate"] = "{:%Y-%m-%d %H:%M:%S}".format( whole_list[num]["startdate"]) except Exception as e: whole_list[num]["startdate"] = "" whole_list[num]['clientname_rowspan'] = clientname_rowspan whole_list[num]['idataagent_rowspan'] = idataagent_rowspan whole_list[num]['type_rowspan'] = type_rowspan dm.close() except Exception as e: return JsonResponse({ "ret": 0, "data": "获取备份状态信息失败。", }) return JsonResponse({ "ret": 1, "data": whole_list, })
def get_backup_content(request): utils_manage_id = request.POST.get('utils_manage_id', '') try: utils_manage_id = int(utils_manage_id) utils_manage = UtilsManage.objects.get(id=utils_manage_id) except: return JsonResponse({ "ret": 0, "data": "Commvault工具未配置。", }) else: _, sqlserver_credit = get_credit_info(utils_manage.content) whole_list = [] try: dm = SQLApi.CVApi(sqlserver_credit) whole_list = dm.get_backup_content() for num, wl in enumerate(whole_list): clientname_rowspan = get_rowspan(whole_list, clientname=wl['clientname']) idataagent_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent']) type_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent'], type=wl['type']) subclient_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent'], type=wl['type'], subclient=wl['subclient']) whole_list[num]['clientname_rowspan'] = clientname_rowspan whole_list[num]['idataagent_rowspan'] = idataagent_rowspan whole_list[num]['type_rowspan'] = type_rowspan whole_list[num]['subclient_rowspan'] = subclient_rowspan except Exception as e: print(e) return JsonResponse({ "ret": 0, "data": "获取存储策略信息失败。", }) else: return JsonResponse({ "ret": 1, "data": whole_list, })
def get_dashboard(request): util = request.POST.get('util', '') startdate = (datetime.datetime.now() - datetime.timedelta(hours=24)).strftime("%Y-%m-%d") enddate = (datetime.datetime.now()).strftime("%Y-%m-%d") clientid = '' jobstatus = '' try: util = int(util) except: return JsonResponse({ "ret": 0, "data": [], }) # 24小时作业显示成功,执行中,失败状态的个数 error_job_list = [] show_job_status_num = '' util_manages = UtilsManage.objects.exclude(state='9').filter(id=util) if len(util_manages) > 0: util = util_manages[0] if util.util_type.upper() == 'COMMVAULT': commvault_credit, sqlserver_credit = get_credit_info(util.content) try: dm = SQLApi.CVApi(sqlserver_credit) # 24小时作业 _, show_job_status_num = dm.get_cv_joblist(startdate=startdate, enddate=enddate, clientid=clientid, jobstatus=jobstatus) # 异常事件 job_list = dm.display_error_job_list(startdate=startdate, enddate=enddate, clientid=clientid) error_job_list = job_list[0:50] except Exception as e: print(e) return JsonResponse({ "ret": 0, "data": "获取信息失败。", }) return JsonResponse({ "error_job_list": error_job_list, "show_job_status_num": show_job_status_num, })
def oraclerecoverydata(request): if request.user.is_authenticated(): origin_id = request.GET.get('origin_id', '') result = [] try: origin_id = int(origin_id) origin = Origin.objects.get(id=origin_id) utils_manage = origin.utils _, sqlserver_credit = get_credit_info(utils_manage.content) dm = SQLApi.CVApi(sqlserver_credit) result = dm.get_oracle_backup_job_list(origin.client_name) dm.close() except Exception as e: print(e) return JsonResponse({"data": result}) else: return HttpResponseRedirect("/login")
def get_frameworkstate(request): util = request.POST.get('util', '') try: util = int(util) except: raise Http404() state = 0 util_manages = UtilsManage.objects.exclude(state='9').filter(id=util) if len(util_manages) > 0: util = util_manages[0] if util.util_type.upper() == 'COMMVAULT': commvault_credit, sqlserver_credit = get_credit_info(util.content) # 先判断网络 netresult = ping(commvault_credit["webaddr"]) if netresult is not None: # 网络正常时取接口信息 cvToken = CV_RestApi_Token() commvault_credit["token"] = "" commvault_credit["lastlogin"] = 0 cvToken.login(commvault_credit) if not cvToken.isLogin: state = 1 # 网络正常时取数据库信息 dm = SQLApi.CVApi(sqlserver_credit) if dm.isconnected() is not None: # 数据库正常时取ma信息 ma_info = dm.get_ma_info() for ma in ma_info: netresult = ping(ma["InterfaceName"]) if netresult is None: state = 1 for ma in ma_info: if ma["Offline"] == 0: break else: state = 2 else: state = 2 return JsonResponse({ "ret": 1, "data": state, })
def get_top5_app_capacity(request): util = request.POST.get('util', '') top5_app_list = [] try: util = int(util) utils_manage = UtilsManage.objects.get(id=util) except: return JsonResponse({ "ret": 0, "data": "Commvault工具未配置。", }) else: _, sqlserver_credit = get_credit_info(utils_manage.content) try: dm = SQLApi.CVApi(sqlserver_credit) ret = dm.get_backup_content() except: pass else: # 客户端相同的应用程序大小相加 client_name = "" for r in ret: if r["clientname"] == client_name: continue app_capacity = 0 client_name = r["clientname"] for ir in ret: if client_name == ir["clientname"]: app_capacity += ir["numbytesuncomp"] top5_app_list.append({ "client_name": client_name, "app_capacity": round(app_capacity / 1024 / 1024 / 1024, 2) }) # str(round(int(pfu[0].AllocatedBaseSize)/1024,2))+'GB' client_name = r["clientname"] top5_app_list.sort(key=lambda e: e['app_capacity'], reverse=True) return JsonResponse({"data": str(top5_app_list)})
def get_instance_list(um): # 解析出账户信息 _, sqlserver_credit = get_credit_info(um.content) ############################################# # clientid, clientname, agent, instance, os # ############################################# dm = SQLApi.CVApi(sqlserver_credit) instance_data = dm.get_all_instance() dm.close() instance_list = [] for od in instance_data: instance_list.append({ "clientid": od["clientid"], "clientname": od["clientname"], "agent": od["agent"], "instance": od["instance"], }) return {'utils_manage': um.id, 'instance_list': instance_list}
def get_display_error_job(request): util = request.GET.get('util', '') startdate = request.GET.get('startdate', '') enddate = request.GET.get('enddate', '') clientid = request.GET.get('clientid', '') try: clientid = int(clientid) except: clientid = "" try: util = int(util) except: return JsonResponse({ "ret": 0, "data": [], }) job_list = [] util_manages = UtilsManage.objects.exclude(state='9').filter(id=util) if len(util_manages) > 0: util = util_manages[0] if util.util_type.upper() == 'COMMVAULT': commvault_credit, sqlserver_credit = get_credit_info(util.content) try: dm = SQLApi.CVApi(sqlserver_credit) job_list = dm.display_error_job_list(startdate=startdate, enddate=enddate, clientid=clientid) except Exception as e: print(e) return JsonResponse({ "ret": 0, "data": "获取信息失败。", }) return JsonResponse({"data": job_list})
def get_client_info(request): utils_manage_id = request.POST.get('utils_manage_id', '') try: utils_manage_id = int(utils_manage_id) utils_manage = UtilsManage.objects.get(id=utils_manage_id) except: return JsonResponse({ "ret": 0, "data": "Commvault工具未配置。", }) else: _, sqlserver_credit = get_credit_info(utils_manage.content) try: dm = SQLApi.CVApi(sqlserver_credit) whole_list = dm.get_clients_info() dm.close() for client in whole_list: client["net"] = "正常" # for i in range(4): # netresult = os.system(u'ping -n 1 ' + client["network_interface"]) # if netresult == 0: # client["net"] = "正常" # break; # else: # client["net"] = "中断" except Exception as e: print(e) return JsonResponse({ "ret": 0, "data": "获取客户端基础信息失败。", }) else: return JsonResponse({ "ret": 1, "data": whole_list, })
def dooraclerecovery(request): if request.user.is_authenticated(): sourceClient = request.POST.get('sourceClient', '') destClient = request.POST.get('destClient', '') restoreTime = request.POST.get('restoreTime', '') browseJobId = request.POST.get('browseJobId', '') agent = request.POST.get('agent', '') data_path = request.POST.get('data_path', '') copy_priority = request.POST.get('copy_priority', '') try: copy_priority = int(copy_priority) except: pass data_sp = request.POST.get('data_sp', '') ################################# # sourceClient>> instance_name # ################################# instance = "" try: cur_origin = Origin.objects.exclude(state="9").get( client_name=sourceClient) except Origin.DoesNotExist as e: return HttpResponse("恢复任务启动失败, 源客户端不存在。") else: oracle_info = json.loads(cur_origin.info) if oracle_info: try: instance = oracle_info["instance"] except: pass if not instance: return HttpResponse("恢复任务启动失败, 数据库实例不存在。") utils_content = cur_origin.utils.content if cur_origin.utils else "" commvault_credit, sqlserver_credit = get_credit_info(utils_content) # restoreTime对应curSCN号 dm = SQLApi.CVApi(sqlserver_credit) oraclecopys = dm.get_oracle_backup_job_list(sourceClient) # print("> %s" % restoreTime) curSCN = "" if restoreTime: for i in oraclecopys: if i["subclient"] == "default" and i[ 'LastTime'] == restoreTime: # print('>>>>>1') print(i['LastTime']) curSCN = i["cur_SCN"] break else: for i in oraclecopys: if i["subclient"] == "default": # print('>>>>>2') curSCN = i["cur_SCN"] break if copy_priority == 2: # 辅助拷贝状态 auxcopys = dm.get_all_auxcopys() jobs_controller = dm.get_job_controller() dm.close() # 判断当前存储策略是否有辅助拷贝未完成 auxcopy_completed = True for job in jobs_controller: if job['storagePolicy'] == data_sp and job[ 'operation'] == "Aux Copy": auxcopy_completed = False break # 假设未恢复成功 # auxcopy_status = 'ERROR' print('当前备份记录对应的辅助拷贝状态 %s' % auxcopy_completed) if not auxcopy_completed: # 找到成功的辅助拷贝,开始时间在辅助拷贝前的、值对应上的主拷贝备份时间点(最终转化UTC) for auxcopy in auxcopys: if auxcopy['storagepolicy'] == data_sp and auxcopy[ 'jobstatus'] in ["Completed", "Success"]: bytesxferred = auxcopy['bytesxferred'] end_tag = False for orcl_copy in oraclecopys: try: orcl_copy_starttime = datetime.datetime.strptime( orcl_copy['StartTime'], "%Y-%m-%d %H:%M:%S") aux_copy_starttime = datetime.datetime.strptime( auxcopy['startdate'], "%Y-%m-%d %H:%M:%S") if orcl_copy[ 'numbytesuncomp'] == bytesxferred and orcl_copy_starttime < aux_copy_starttime and \ orcl_copy['subclient'] == "default": # 获取enddate,转化时间 curSCN = orcl_copy['cur_SCN'] end_tag = True break except Exception as e: print(e) if end_tag: break dm.close() # print('Rac %s' % curSCN) oraRestoreOperator = { "curSCN": curSCN, "browseJobId": None, "data_path": data_path, "copy_priority": copy_priority, "restoreTime": restoreTime } # print("> %s > %s, %s, %s" % (oraRestoreOperator, sourceClient, destClient, instance)) cvToken = CV_RestApi_Token() cvToken.login(commvault_credit) cvAPI = CV_API(cvToken) if agent.upper() == "ORACLE DATABASE": if cvAPI.restoreOracleBackupset(sourceClient, destClient, instance, oraRestoreOperator): return HttpResponse("恢复任务已经启动。" + cvAPI.msg) else: return HttpResponse("恢复任务启动失败。" + cvAPI.msg) elif agent.upper() == "ORACLE RAC": oraRestoreOperator["browseJobId"] = browseJobId if cvAPI.restoreOracleRacBackupset(sourceClient, destClient, instance, oraRestoreOperator): return HttpResponse("恢复任务已经启动。" + cvAPI.msg) else: return HttpResponse("恢复任务启动失败。" + cvAPI.msg) else: return HttpResponse("无当前模块,恢复任务启动失败。") else: return HttpResponseRedirect("/login")
def get_schedule_policy(request): whole_list = [] utils_manage_id = request.POST.get('utils_manage_id', '') try: utils_manage_id = int(utils_manage_id) utils_manage = UtilsManage.objects.get(id=utils_manage_id) except: return JsonResponse({ "ret": 0, "data": "Commvault工具未配置。", }) else: _, sqlserver_credit = get_credit_info(utils_manage.content) try: # all_client_manage = Origin.objects.exclude(state="9").values("client_name") # tmp_client_manage = [tmp_client["client_name"] for tmp_client in all_client_manage] dm = SQLApi.CVApi(sqlserver_credit) whole_list = dm.get_schedule_policy() ordered_whole_list = [] dm.close() for num, wl in enumerate(whole_list): schedule_dict = OrderedDict() clientname_rowspan = get_rowspan(whole_list, clientname=wl['clientname']) idataagent_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent']) type_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent'], type=wl['type']) # 子客户端,计划策略,备份类型 subclient_rowspan = get_rowspan(whole_list, clientname=wl['clientname'], idataagent=wl['idataagent'], type=wl['type'], subclient=wl['subclient']) if wl['scheduePolicy']: scheduePolicy_rowspan = get_rowspan( whole_list, clientname=wl['clientname'], idataagent=wl['idataagent'], type=wl['type'], subclient=wl['subclient'], scheduePolicy=wl['scheduePolicy']) else: scheduePolicy_rowspan = 1 if wl['schedbackuptype'] and wl['scheduePolicy']: schedbackuptype_rowspan = get_rowspan( whole_list, clientname=wl['clientname'], idataagent=wl['idataagent'], type=wl['type'], subclient=wl['subclient'], scheduePolicy=wl['scheduePolicy'], schedbackuptype=wl['schedbackuptype']) else: schedbackuptype_rowspan = 1 schedule_dict['clientname_rowspan'] = clientname_rowspan schedule_dict['idataagent_rowspan'] = idataagent_rowspan schedule_dict['type_rowspan'] = type_rowspan schedule_dict['subclient_rowspan'] = subclient_rowspan schedule_dict['scheduePolicy_rowspan'] = scheduePolicy_rowspan schedule_dict[ 'schedbackuptype_rowspan'] = schedbackuptype_rowspan schedule_dict["clientname"] = wl["clientname"] schedule_dict["idataagent"] = wl["idataagent"] schedule_dict["type"] = wl["type"] schedule_dict["subclient"] = wl["subclient"] schedule_dict["scheduePolicy"] = wl["scheduePolicy"] if wl[ "scheduePolicy"] else "无" schedule_dict["schedbackuptype"] = wl["schedbackuptype"] if wl[ "schedbackuptype"] else "无" schedule_dict["schedpattern"] = wl["schedpattern"] if wl[ "schedpattern"] else "无" schedule_dict["option"] = { "schedpattern": wl["schedpattern"], "schednextbackuptime": wl["schednextbackuptime"], "scheduleName": wl["scheduleName"], "schedinterval": wl["schedinterval"], "schedbackupday": wl["schedbackupday"], "schedbackuptype": wl["schedbackuptype"], } ordered_whole_list.append(schedule_dict) except Exception as e: print(e) return JsonResponse({ "ret": 0, "data": "获取计划策略信息失败。", }) else: return JsonResponse({ "ret": 1, "data": ordered_whole_list, })
def get_ma_disk_space(request): """ 获取总容量 :param request: :return: """ status = 1 data = [] info = '' utils_id = request.POST.get('util', '') # 监控页面url 磁盘空间 url funs = Fun.objects.all() disk_space = "/" client_list = "/" for fun in funs: if "disk_space" in fun.url: disk_space = "{0}?util={1}".format(fun.url, utils_id) if "client_list" in fun.url: client_list = "{0}?util={1}".format(fun.url, utils_id) try: utils_id = int(utils_id) utils_manage = UtilsManage.objects.get(id=utils_id) except: status = 0 info = 'Commvault工具未配置。' else: _, sqlserver_credit = get_credit_info(utils_manage.content) try: dm = SQLApi.CVApi(sqlserver_credit) ret = dm.get_library_space_info() dm.close() capacity_available = 0 space_reserved = 0 total_space = 0 for r in ret: if type(r["CapacityAvailable"]) == int: capacity_available += r["CapacityAvailable"] if type(r["SpaceReserved"]) == int: space_reserved += r["SpaceReserved"] if type(r["TotalSpaceMB"]) == int: total_space += r["TotalSpaceMB"] capacity_available_percent = round( (capacity_available / total_space) * 100, 2) space_reserved_percent = round( (space_reserved / total_space) * 100, 2) used_space_percent = round( (100 - capacity_available_percent - space_reserved_percent), 2) data = { "capacity_available_percent": capacity_available_percent, "space_reserved_percent": space_reserved_percent, "used_space_percent": used_space_percent, "total_space": round(total_space / 1024 / 1024, 2), "used_space": round((total_space - space_reserved - capacity_available) / 1024 / 1024, 2), "bk_space_href": disk_space, "client_list_href": client_list } except: pass return JsonResponse({ "status": status, "info": info, "data": data, })
def get_disk_space(request): # MA rowspan 总记录数 # 库 rowspan 相同库记录数 status = 1 data = [] info = '' utils_manage_id = request.POST.get('utils_manage_id', '') try: utils_manage_id = int(utils_manage_id) utils_manage = UtilsManage.objects.get(id=utils_manage_id) except: status = 0 info = 'Commvault工具未配置。' else: _, sqlserver_credit = get_credit_info(utils_manage.content) try: dm = SQLApi.CVApi(sqlserver_credit) data = dm.get_library_space_info() dm.close() # 遍历所有记录 总记录数 def get_rowspan(total_list, **kwargs): row_span = 0 display_name = kwargs.get('DisplayName', '') library_name = kwargs.get('LibraryName', '') if all([display_name, library_name]): for tl in total_list: if tl['DisplayName'] == display_name and tl[ 'LibraryName'] == library_name: row_span += 1 if display_name and not library_name: for tl in total_list: if tl['DisplayName'] == display_name: row_span += 1 return row_span for num, lsi in enumerate(data): display_name_rowspan = get_rowspan( data, DisplayName=lsi['DisplayName']) library_name_rowspan = get_rowspan( data, DisplayName=lsi['DisplayName'], LibraryName=lsi['LibraryName']) # 时间 try: data[num][ "LastBackupTime"] = "{:%Y-%m-%d %H:%M:%S}".format( data[num]["LastBackupTime"]) except Exception as e: data[num]["LastBackupTime"] = "" # 是否可用 if data[num]["Offline"] == 0: data[num][ "Offline"] = '<i class="fa fa-plug" style="color:green; height:20px;width:14px;"></i>' else: data[num][ "Offline"] = '<i class="fa fa-plug" style="color:red; height:20px;width:14px;"></i>' data[num]['display_name_rowspan'] = display_name_rowspan data[num]['library_name_rowspan'] = library_name_rowspan except Exception as e: print(e) status = 0 info = '获取磁盘容量信息失败: {e}。'.format(e=e) return JsonResponse({"status": status, "info": info, "data": data})
def get_framework(request): util = request.POST.get('util', '') try: util = int(util) except: raise Http404() frameworkdata = {} util_manages = UtilsManage.objects.exclude(state='9').filter(id=util) if len(util_manages) > 0: util = util_manages[0] if util.util_type.upper() == 'COMMVAULT': commvault_credit, sqlserver_credit = get_credit_info(util.content) commserve = { 'host': '无法获取', 'version': '无法获取', 'sp': '无法获取', 'os': '无法获取', 'net': '无法获取', 'apiport': '无法获取', 'apiconnect': '无法获取', 'dbname': '无法获取', 'dbconnect': '无法获取', } mas = [] # 先判断网络 netresult = ping(commvault_credit["webaddr"]) if netresult is not None: commserve["net"] = "正常" # 网络正常时取数据库信息 commserve["dbname"] = sqlserver_credit["SQLServerDataBase"] dm = SQLApi.CVApi(sqlserver_credit) if dm.isconnected() is not None: commserve["dbconnect"] = "正常" # 数据库连接正常,取cs信息 commserv_info = dm.get_commserv_info() if commserv_info is not None: commserve["host"] = commserv_info[3] commserve["version"] = commserv_info[0] commserve["sp"] = commserv_info[1] commserve["os"] = commserv_info[2] # 数据库连接正常,取ma信息 ma_info = dm.get_ma_info() for ma in ma_info: netresult = ping(ma["InterfaceName"]) if netresult is not None: ma["net"] = "正常" else: ma["net"] = "中断" if ma["Offline"] == 0: ma["Offline"] = "在线" else: ma["Offline"] = "离线" try: ma["TotalSpaceMB"] = round( ma["TotalSpaceMB"] / 1024 / 1024, 2) except: pass try: ma["TotalFreeSpaceMB"] = round( ma["TotalFreeSpaceMB"] / 1024 / 1024, 2) except: pass try: ma["Percent"] = round( (ma["TotalSpaceMB"] - ma["TotalFreeSpaceMB"]) / ma["TotalSpaceMB"] * 100, 2) except: ma["Percent"] = 0 try: ma["SpaceReserved"] = round( ma["SpaceReserved"] / 1024 / 1024, 2) except: pass ma["CapacityAvailable"] = ma["TotalFreeSpaceMB"] try: ma["CapacityAvailable"] = ma[ "TotalFreeSpaceMB"] - ma["SpaceReserved"] except: pass mas.append(ma) frameworkdata["ma"] = mas else: commserve["dbconnect"] = "中断" commserve["apiport"] = commvault_credit["port"] # 网络正常时取接口信息 cvToken = CV_RestApi_Token() commvault_credit["token"] = "" commvault_credit["lastlogin"] = 0 cvToken.login(commvault_credit) if cvToken.isLogin: commserve["apiconnect"] = "正常" else: commserve["apiconnect"] = "中断" else: commserve["net"] = "中断" frameworkdata["commserve"] = commserve return JsonResponse({ "ret": 1, "data": frameworkdata, })