package com.sobey.cmop.mvc.service.redmine; import java.util.List; import org.apache.commons.lang3.StringUtils; import com.sobey.cmop.mvc.constant.CPConstant; import com.sobey.cmop.mvc.constant.ComputeConstant; import com.sobey.cmop.mvc.constant.FieldNameConstant; import com.sobey.cmop.mvc.constant.MdnConstant; import com.sobey.cmop.mvc.constant.MonitorConstant; import com.sobey.cmop.mvc.constant.NetworkConstant; import com.sobey.cmop.mvc.constant.StorageConstant; import com.sobey.cmop.mvc.entity.Application; import com.sobey.cmop.mvc.entity.ComputeItem; import com.sobey.cmop.mvc.entity.CpItem; import com.sobey.cmop.mvc.entity.EipPortItem; import com.sobey.cmop.mvc.entity.ElbPortItem; import com.sobey.cmop.mvc.entity.MdnItem; import com.sobey.cmop.mvc.entity.MdnLiveItem; import com.sobey.cmop.mvc.entity.MdnVodItem; import com.sobey.cmop.mvc.entity.MonitorCompute; import com.sobey.cmop.mvc.entity.MonitorElb; import com.sobey.cmop.mvc.entity.MonitorMail; import com.sobey.cmop.mvc.entity.MonitorPhone; import com.sobey.cmop.mvc.entity.NetworkDnsItem; import com.sobey.cmop.mvc.entity.NetworkEipItem; import com.sobey.cmop.mvc.entity.NetworkElbItem; import com.sobey.cmop.mvc.entity.StorageItem; import com.sobey.framework.utils.StringCommonUtils; public class RedmineTextUtil { /** * 换行 */ private static final String NEWLINE = "\r\n"; /** * 一个空格 */ private static final String BLANK = " "; /** * 生成Compute 的Redmine文本 * * @param content * @param computeItems */ public static void generateCompute(StringBuilder content, List<ComputeItem> computeItems) { if (!computeItems.isEmpty()) { content.append("# +*计算资源信息*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (ComputeItem compute : computeItems) { content.append("标识符(私网IP):").append(BLANK).append(compute.getIdentifier()).append("(") .append(compute.getRemark() + " - ").append(compute.getInnerIp()).append(")").append(NEWLINE); content.append("用途信息:").append(BLANK).append(compute.getRemark()).append(NEWLINE); content.append("配置信息:").append(BLANK).append(ComputeConstant.OS_TYPE_MAP.get(compute.getOsType())) .append(BLANK).append(ComputeConstant.OS_BIT_MAP.get(compute.getOsBit())).append(BLANK); if (ComputeConstant.ComputeType.PCS.toInteger().equals(compute.getComputeType())) { content.append(ComputeConstant.PCSServerType.get(compute.getServerType())).append(NEWLINE); } else { content.append(ComputeConstant.ECSServerType.get(compute.getServerType())).append(NEWLINE); } content.append("关联ESG:").append(BLANK).append(compute.getMountESGDetail()).append(NEWLINE); if (!compute.getApplications().isEmpty()) { content.append("应用信息(应用名称、应用版本、部署路径):").append(NEWLINE); for (Application application : compute.getApplications()) { content.append(BLANK + BLANK + BLANK + BLANK + BLANK).append(application.getName()) .append(BLANK + BLANK).append(application.getVersion()).append(BLANK + BLANK) .append(application.getDeployPath()).append(NEWLINE); } } content.append(NEWLINE); } content.append("</pre>").append(NEWLINE); } } /** * 生成storageItem 的Redmine文本 * * @param content * @param storageItems */ public static void generateStorage(StringBuilder content, List<StorageItem> storageItems) { if (!storageItems.isEmpty()) { content.append("# +*存储资源信息*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (StorageItem storageItem : storageItems) { content.append("标识符:").append(BLANK).append(storageItem.getIdentifier()).append(NEWLINE); content.append("存储类型:").append(BLANK) .append(StorageConstant.StorageType.get(storageItem.getStorageType())).append(NEWLINE); content.append("容量空间:").append(BLANK).append(storageItem.getSpace()).append("GB").append(NEWLINE); content.append("挂载实例:").append(BLANK).append(storageItem.getMountComputes()).append(NEWLINE + NEWLINE); } content.append("</pre>").append(NEWLINE); } } /** * 生成NetworkElbItem 的Redmine文本 * * @param content * @param elbItems * @param computeItems * 当前用户的所有实例Compute */ public static void generateElb(StringBuilder content, List<NetworkElbItem> elbItems) { if (!elbItems.isEmpty()) { content.append("# +*负载均衡器ELB*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (NetworkElbItem elbItem : elbItems) { content.append("标识符(虚拟IP):").append(BLANK).append(elbItem.getIdentifier()).append("(") .append(elbItem.getVirtualIp()).append(")").append(NEWLINE); content.append(FieldNameConstant.Elb.是否保持会话 + ":").append(BLANK) .append(NetworkConstant.KeepSession.get(elbItem.getKeepSession())).append(NEWLINE); content.append(FieldNameConstant.Elb.关联实例 + ":").append(BLANK).append(elbItem.getMountComputes()) .append(NEWLINE); if (!elbItem.getElbPortItems().isEmpty()) { content.append("端口映射(协议、源端口、目标端口):").append(NEWLINE); for (ElbPortItem portItem : elbItem.getElbPortItems()) { content.append(BLANK + BLANK + BLANK + BLANK + BLANK).append(portItem.getProtocol()) .append(BLANK + BLANK).append(portItem.getSourcePort()).append(BLANK + BLANK) .append(portItem.getTargetPort()).append(NEWLINE); } } content.append(NEWLINE); } content.append("</pre>").append(NEWLINE); } } /** * 生成NetworkEipItem 的Redmine文本 * * @param content * @param elbItems */ public static void generateEip(StringBuilder content, List<NetworkEipItem> eipItems) { if (!eipItems.isEmpty()) { content.append("# +*EIP*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (NetworkEipItem eipItem : eipItems) { content.append("标识符(互联网IP):").append(BLANK).append(eipItem.getIdentifier()).append("(") .append(eipItem.getIpAddress()).append(")").append(NEWLINE); content.append("ISP运营商:").append(BLANK).append(NetworkConstant.ISPType.get(eipItem.getIspType())) .append(NEWLINE); if (eipItem.getComputeItem() != null) { // 关联实例 content.append(FieldNameConstant.Eip.关联实例 + ":").append(BLANK) .append(eipItem.getComputeItem().getIdentifier()).append("(") .append(eipItem.getComputeItem().getRemark()).append(" - ") .append(eipItem.getComputeItem().getInnerIp()).append(")").append(NEWLINE); } else if (eipItem.getNetworkElbItem() != null) { // 关联ELB content.append(FieldNameConstant.Eip.关联ELB + ":").append(BLANK) .append(eipItem.getNetworkElbItem().getIdentifier()).append("(") .append(eipItem.getNetworkElbItem().getVirtualIp()).append(")").append("【") .append(eipItem.getNetworkElbItem().getMountComputes()).append("】").append(NEWLINE); } if (!eipItem.getEipPortItems().isEmpty()) { content.append("端口映射(协议、源端口、目标端口):").append(NEWLINE); for (EipPortItem portItem : eipItem.getEipPortItems()) { content.append(BLANK + BLANK + BLANK + BLANK + BLANK).append(portItem.getProtocol()) .append(BLANK + BLANK).append(portItem.getSourcePort()).append(BLANK + BLANK) .append(portItem.getTargetPort()).append(NEWLINE); } } content.append(NEWLINE); } content.append("</pre>").append(NEWLINE); } } /** * 生成NetworkDnsItem 的Redmine文本 * * @param content * @param elbItems */ public static void generateDNS(StringBuilder content, List<NetworkDnsItem> dnsItems) { if (!dnsItems.isEmpty()) { content.append("# +*DNS域名映射*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (NetworkDnsItem networkDnsItem : dnsItems) { content.append("标识符:").append(BLANK).append(networkDnsItem.getIdentifier()).append(NEWLINE); content.append("域名:").append(BLANK).append(networkDnsItem.getDomainName()).append(NEWLINE); content.append("域名类型:").append(BLANK) .append(NetworkConstant.DomainType.get(networkDnsItem.getDomainType())).append(NEWLINE); if (NetworkConstant.DomainType.CNAME.toInteger().equals(networkDnsItem.getDomainType())) { content.append("CNAME域名:").append(BLANK).append(networkDnsItem.getCnameDomain()) .append(NEWLINE + NEWLINE); } else { content.append("目标IP:").append(BLANK).append(networkDnsItem.getMountElbs()) .append(NEWLINE + NEWLINE); } } content.append("</pre>").append(NEWLINE); } } /** * 生成监控邮件列表MonitorMail 的Redmine文本 * * @param content * @param monitorMails */ public static void generateMonitorMail(StringBuilder content, List<MonitorMail> monitorMails) { if (!monitorMails.isEmpty()) { content.append("# +*监控邮件列表*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (MonitorMail monitorMail : monitorMails) { content.append(BLANK).append(monitorMail.getEmail()).append(NEWLINE); } content.append("</pre>").append(NEWLINE); } } /** * 生成监控手机列表MonitorPhone 的Redmine文本 * * @param content * @param monitorPhones */ public static void generateMonitorPhone(StringBuilder content, List<MonitorPhone> monitorPhones) { if (!monitorPhones.isEmpty()) { content.append("# +*监控手机列表*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (MonitorPhone monitorPhone : monitorPhones) { content.append(BLANK).append(monitorPhone.getTelephone()).append(NEWLINE); } content.append("</pre>").append(NEWLINE); } } public static void generateMonitorCompute(StringBuilder content, List<MonitorCompute> monitorComputes) { if (!monitorComputes.isEmpty()) { content.append("# +*实例监控列表*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (MonitorCompute monitorCompute : monitorComputes) { content.append("标识符:").append(BLANK).append(monitorCompute.getIdentifier()).append(NEWLINE); content.append("IP地址:").append(BLANK) .append(monitorCompute.getIpAddress() != null ? monitorCompute.getIpAddress() : "") .append(NEWLINE); content.append("CPU占用率:").append(BLANK).append("报警阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_GT_STRING_KEY.get(monitorCompute.getCpuWarn())) .append(BLANK + BLANK).append("警告阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_GT_STRING_KEY.get(monitorCompute.getCpuCritical())) .append(NEWLINE); content.append("内存占用率:").append(BLANK).append("报警阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_GT_STRING_KEY.get(monitorCompute.getMemoryWarn())) .append(BLANK + BLANK).append("警告阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_GT_STRING_KEY.get(monitorCompute.getMemoryCritical())) .append(NEWLINE); content.append("网络丢包率:").append(BLANK).append("报警阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_GT_STRING_KEY.get(monitorCompute.getPingLossWarn())) .append(BLANK + BLANK).append("警告阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_GT_STRING_KEY.get(monitorCompute.getPingLossCritical())) .append(NEWLINE); content.append("硬盘可用率:").append(BLANK).append("报警阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_LT_STRING_KEY.get(monitorCompute.getDiskWarn())) .append(BLANK + BLANK).append("警告阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_LT_STRING_KEY.get(monitorCompute.getDiskCritical())) .append(NEWLINE); content.append("网络延时率:").append(BLANK).append("报警阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_NET_GT_STRING_KEY.get(monitorCompute.getPingDelayWarn())) .append(BLANK + BLANK).append("警告阀值").append(BLANK) .append(MonitorConstant.THRESHOLD_NET_GT_STRING_KEY.get(monitorCompute.getPingDelayCritical())) .append(NEWLINE); content.append("最大进程数:").append(BLANK).append("报警阀值").append(BLANK) .append(MonitorConstant.MAX_PROCESS_STRING_KEY.get(monitorCompute.getMaxProcessWarn())) .append(BLANK + BLANK).append("警告阀值").append(BLANK) .append(MonitorConstant.MAX_PROCESS_STRING_KEY.get(monitorCompute.getMaxProcessCritical())) .append(NEWLINE); content.append("监控端口:").append(BLANK).append(monitorCompute.getPort()).append(NEWLINE); content.append("监控进程:").append(BLANK).append(monitorCompute.getProcess()).append(NEWLINE); content.append("挂载路径:").append(BLANK).append(monitorCompute.getMountPoint()).append(NEWLINE + NEWLINE); } content.append("</pre>").append(NEWLINE); } } public static void generateMonitorElb(StringBuilder content, List<MonitorElb> monitorElbs) { if (!monitorElbs.isEmpty()) { content.append("# +*ELB监控*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (MonitorElb monitorElb : monitorElbs) { content.append("标识符:").append(BLANK).append(monitorElb.getIdentifier()).append(NEWLINE); content.append("监控ELB:") .append(BLANK) .append(monitorElb.getNetworkElbItem().getIdentifier()) .append("(" + (monitorElb.getNetworkElbItem().getVirtualIp() != null ? monitorElb .getNetworkElbItem().getVirtualIp() : "") + ")").append(NEWLINE + NEWLINE); } content.append("</pre>").append(NEWLINE); } } public static void generateMdn(StringBuilder content, List<MdnItem> mdnItems) { if (!mdnItems.isEmpty()) { content.append("# +*MDN*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (MdnItem mdnItem : mdnItems) { content.append("标识符:").append(BLANK).append(mdnItem.getIdentifier()).append(NEWLINE); content.append("重点覆盖地域:").append(BLANK).append(mdnItem.getCoverArea()).append(NEWLINE); content.append("加速服务带宽:").append(BLANK).append(mdnItem.getBandwidth() + "M").append(NEWLINE); String[] isps = StringUtils.split(mdnItem.getCoverIsp(), ","); String coverIsp = ""; for (String isp : isps) { coverIsp += NetworkConstant.ISPType.mapKeyStr.get(isp) + ","; } content.append("重点覆盖ISP:").append(BLANK) .append(StringCommonUtils.replaceAndSubstringText(coverIsp, ",", ",")) .append(NEWLINE + NEWLINE); if (!mdnItem.getMdnVodItems().isEmpty()) { for (MdnVodItem mdnVodItem : mdnItem.getMdnVodItems()) { content.append("MDN点播加速").append(NEWLINE); content.append("服务子项ID:").append(BLANK).append(mdnVodItem.getId()).append(NEWLINE); content.append(FieldNameConstant.MdnVodItem.点播服务域名 + ":").append(BLANK) .append(mdnVodItem.getVodDomain()).append(NEWLINE); content.append(FieldNameConstant.MdnVodItem.点播播放协议选择 + ":").append(BLANK) .append(mdnVodItem.getVodProtocol()).append(NEWLINE); content.append(FieldNameConstant.MdnVodItem.点播源站出口带宽 + ":").append(BLANK) .append(mdnVodItem.getSourceOutBandwidth()).append(NEWLINE); content.append(FieldNameConstant.MdnVodItem.Streamer地址 + ":").append(BLANK) .append(mdnVodItem.getSourceStreamerUrl()).append(NEWLINE + NEWLINE); } } if (!mdnItem.getMdnLiveItems().isEmpty()) { for (MdnLiveItem mdnLiveItem : mdnItem.getMdnLiveItems()) { content.append("MDN直播加速").append(NEWLINE); content.append("服务子项ID:").append(BLANK).append(mdnLiveItem.getId()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.直播服务域名 + ":").append(BLANK) .append(mdnLiveItem.getLiveDomain()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.直播播放协议选择 + ":").append(BLANK) .append(mdnLiveItem.getLiveProtocol()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.直播源站出口带宽 + ":").append(BLANK) .append(mdnLiveItem.getBandwidth()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.频道名称 + ":").append(BLANK) .append(mdnLiveItem.getName()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.频道GUID + ":").append(BLANK) .append(mdnLiveItem.getGuid()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.直播流输出模式 + ":").append(BLANK) .append(MdnConstant.OutputMode.get(mdnLiveItem.getStreamOutMode())).append(NEWLINE); if (MdnConstant.OutputMode.Encoder模式.toInteger().equals(mdnLiveItem.getStreamOutMode())) { content.append(FieldNameConstant.MdnLiveItem.编码器模式 + ":").append(BLANK) .append(MdnConstant.EncoderMode.get(mdnLiveItem.getEncoderMode())).append(NEWLINE); } if (MdnConstant.OutputMode.Encoder模式.toInteger().equals(mdnLiveItem.getStreamOutMode())) { if (MdnConstant.EncoderMode.拉流模式.toInteger().equals(mdnLiveItem.getEncoderMode())) { if (StringUtils.isNotBlank(mdnLiveItem.getHttpUrl())) { content.append(FieldNameConstant.MdnLiveItem.拉流地址 + ":").append(BLANK) .append(mdnLiveItem.getHttpUrl()).append(NEWLINE); } if (StringUtils.isNotBlank(mdnLiveItem.getHttpBitrate())) { content.append(FieldNameConstant.MdnLiveItem.拉流混合码率 + ":").append(BLANK) .append(mdnLiveItem.getHttpBitrate()).append(NEWLINE); } } else if (MdnConstant.EncoderMode.推流模式.toInteger().equals(mdnLiveItem.getEncoderMode())) { if (StringUtils.isNotBlank(mdnLiveItem.getHlsUrl())) { content.append(FieldNameConstant.MdnLiveItem.推流地址 + ":").append(BLANK) .append(mdnLiveItem.getHlsUrl()).append(NEWLINE); } if (StringUtils.isNotBlank(mdnLiveItem.getHlsBitrate())) { content.append(FieldNameConstant.MdnLiveItem.推流混合码率 + ":").append(BLANK) .append(mdnLiveItem.getHlsBitrate()).append(NEWLINE); } } } else { content.append(FieldNameConstant.MdnLiveItem.HTTP流地址 + ":").append(BLANK) .append(mdnLiveItem.getHttpUrl()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.HTTP流混合码率 + ":").append(BLANK) .append(mdnLiveItem.getHttpBitrate()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.HSL流地址 + ":").append(BLANK) .append(mdnLiveItem.getHlsUrl()).append(NEWLINE); content.append(FieldNameConstant.MdnLiveItem.HSL流混合码率 + ":").append(BLANK) .append(mdnLiveItem.getHlsBitrate()).append(NEWLINE); } content.append(NEWLINE); } } } content.append("</pre>").append(NEWLINE); } } public static void generateCP(StringBuilder content, List<CpItem> cpItems) { if (!cpItems.isEmpty()) { content.append("# +*CP云生产*+").append(NEWLINE); content.append("<pre>").append(NEWLINE); for (CpItem cpItem : cpItems) { content.append("标识符:").append(BLANK).append(cpItem.getIdentifier()).append(NEWLINE); content.append("收录流URL:").append(BLANK).append(cpItem.getRecordStreamUrl()).append(NEWLINE); content.append("收录码率:").append(BLANK) .append(CPConstant.RECORDBITRATE_MAP_STRING_KEY.get(cpItem.getRecordBitrate())).append(NEWLINE); String[] exportEncodes = StringUtils.split(cpItem.getExportEncode(), ","); String exportEncode = ""; for (String key : exportEncodes) { exportEncode += CPConstant.EXPORTENCODE_MAP_STRING_KEY.get(key) + ","; } content.append("输出编码:").append(BLANK) .append(StringCommonUtils.replaceAndSubstringText(exportEncode, ",", ",")).append(NEWLINE); content.append("收录类型:").append(BLANK).append(CPConstant.RecordType.get(cpItem.getRecordType())) .append(NEWLINE); content.append("收录时段:").append(BLANK).append(cpItem.getRecordTime()).append(NEWLINE); content.append("收录时长(小时):").append(BLANK).append(cpItem.getRecordDuration()).append(NEWLINE); if (StringUtils.isNotBlank(cpItem.getPublishUrl())) { content.append("发布接口地址:").append(BLANK).append(cpItem.getPublishUrl()).append(NEWLINE); } content.append("是否推送内容交易平台:").append(BLANK).append(CPConstant.IsPushCtp.get(cpItem.getIsPushCtp())) .append(NEWLINE + NEWLINE); content.append("视频配置").append(NEWLINE); content.append("FTP上传IP:").append(BLANK).append(cpItem.getVideoFtpIp()).append(NEWLINE); content.append("端口:").append(BLANK).append(cpItem.getVideoFtpPort()).append(NEWLINE); content.append("FTP用户名:").append(BLANK).append(cpItem.getVideoFtpUsername()).append(NEWLINE); content.append("FTP密码:").append(BLANK).append(cpItem.getVideoFtpPassword()).append(NEWLINE); content.append("FTP根路径:").append(BLANK).append(cpItem.getVideoFtpRootpath()).append(NEWLINE); content.append("FTP上传路径:").append(BLANK).append(cpItem.getVideoFtpUploadpath()).append(NEWLINE); content.append("输出组类型:").append(BLANK).append(cpItem.getVideoOutputGroup()).append(NEWLINE); content.append("输出方式配置:").append(BLANK) .append(CPConstant.VideoOutputWay.get(Integer.valueOf(cpItem.getVideoOutputWay()))) .append(NEWLINE + NEWLINE); content.append("图片配置:").append(NEWLINE); content.append("FTP上传IP:").append(BLANK).append(cpItem.getPictrueFtpIp()).append(NEWLINE); content.append("端口:").append(BLANK).append(cpItem.getPictrueFtpPort()).append(NEWLINE); content.append("FTP用户名:").append(BLANK).append(cpItem.getPictrueFtpUsername()).append(NEWLINE); content.append("FTP密码:").append(BLANK).append(cpItem.getPictrueFtpPassword()).append(NEWLINE); content.append("FTP根路径:").append(BLANK).append(cpItem.getPictrueFtpRootpath()).append(NEWLINE); content.append("FTP上传路径:").append(BLANK).append(cpItem.getPictrueFtpUploadpath()).append(NEWLINE); content.append("输出组类型:").append(BLANK).append(cpItem.getPictrueOutputGroup()).append(NEWLINE); content.append("输出媒体类型:").append(BLANK).append(cpItem.getPictrueOutputMedia()).append(NEWLINE); } content.append("</pre>").append(NEWLINE); } } }