package cn.me.fdfs.service.impl; import cn.me.fdfs.service.BaseService; import cn.me.fdfs.service.FileDataService; import cn.me.fdfs.service.JobService; import cn.me.fdfs.service.WarningService; import cn.me.fdfs.util.BuildMail; import cn.me.fdfs.util.JsshProxy; import cn.me.fdfs.util.Tools; import cn.me.fdfs.vo.*; import com.jcraft.jsch.JSchException; import org.csource.common.MyException; import org.csource.fastdfs.*; import org.hibernate.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; /** * Created with IntelliJ IDEA. * User: devuser * Date: 12-8-28 * Time: 下午5:08 * To change this template use File | Settings | File Templates. */ @Service public class JobServiceImpl extends BaseService implements JobService { private static final Logger logger = LoggerFactory .getLogger(JobServiceImpl.class); @Autowired private WarningService warningService; @Autowired private FileDataService fileDataService; Map<String, Date> datemap = new HashMap<String, Date>(); @Override @Scheduled(cron = "0 0/1 * * * ?") @Transactional(propagation = Propagation.REQUIRED) public void updateGroupByMinute() throws IOException, MyException, JSchException { logger.info("group minute data upate begin..."); List<Group> groups = getGroupInfoByMinute(); Session session = getSession(); for (Group group : groups) { session.save(group); } logger.info("group minute data upated end"); } @Override @Scheduled(cron = "0 0 0/1 * * ?") @Transactional(propagation = Propagation.REQUIRED) public void updateGroupByHour() throws IOException, MyException, JSchException{ logger.info("group hour data upate begin..."); List<GroupHour> groups = getGroupInfoByHour(); Session session = getSession(); for (GroupHour group : groups) { session.save(group); } logger.info("group hour data upated end"); } @Override @Scheduled(cron = "0 0 0 0/1 * ?") @Transactional(propagation = Propagation.REQUIRED) public void updateGroupByDay() throws IOException, MyException, JSchException { logger.info("group day data upate begin..."); List<GroupDay> groups = getGroupInfoByDay(); Session session = getSession(); for (GroupDay group : groups) { session.save(group); } logger.info("group day data upated end"); } private List<Group> getGroupInfoByMinute() throws IOException, MyException, JSchException { List<Group> result = new ArrayList<Group>(); // noinspection ConstantConditions ClientGlobal.init(Tools.getClassPath() + "fdfs_client.conf"); logger.info("network_timeout=" + ClientGlobal.g_network_timeout + "ms"); logger.info("charset=" + ClientGlobal.g_charset); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); if (trackerServer == null) { return result; } StructGroupStat[] groupStats = tracker.listGroups(trackerServer); if (groupStats == null) { logger.error("ERROR! list groups error, error no: " + tracker.getErrorCode()); return result; } logger.info("group count: " + groupStats.length); for (StructGroupStat groupStat : groupStats) { Group group = new Group(); BeanUtils.copyProperties(groupStat, group); StructStorageStat[] storageStats = tracker.listStorages( trackerServer, groupStat.getGroupName()); for (StructStorageStat storageStat : storageStats) { Storage storage = new Storage(); BeanUtils.copyProperties(storageStat, storage); storage.setId(null); System.out.println("getGroupInfoByMinute: storageId:"+storage.getId()); storage.setCurStatus(ProtoCommon .getStorageStatusCaption(storageStat.getStatus())); storage.setGroup(group); storage.setGroupName(group.getGroupName()); group.getStorageList().add(storage); } result.add(group); } Date date = new Date(); String cmd = "ps -aux|grep fdfs"; for (Machine machine : Tools.machines) { List<String> strList = new ArrayList<String>(); if(machine.isConfigType()) strList = Tools.exeRemoteConsole(machine.getIp(), machine.getUsername(), machine.getPassword(), cmd); else strList = new JsshProxy(machine.getIp(),machine.getUsername(),machine.getPort(),machine.getSsh()).execute(cmd).getExecuteLines(); for (String str : strList) { if (str.contains("storage.conf")) { for (Group group : result) { group.setCreated(date); for (Storage storage : group.getStorageList()) { if (machine.getIp().equalsIgnoreCase( storage.getIpAddr())) { String[] strArrray = str.replaceAll(" +", ",") .split(","); storage.setCpu(strArrray[2]); storage.setMem(Float.parseFloat(strArrray[3])); storage.setCreated(date); //warning warning(storage); } warningOffline(storage); } } } } } return result; } private List<GroupHour> getGroupInfoByHour() throws IOException, MyException,JSchException { List<GroupHour> result = new ArrayList<GroupHour>(); // noinspection ConstantConditions ClientGlobal.init(Tools.getClassPath() + "fdfs_client.conf"); logger.info("network_timeout=" + ClientGlobal.g_network_timeout + "ms"); logger.info("charset=" + ClientGlobal.g_charset); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); if (trackerServer == null) { return result; } StructGroupStat[] groupStats = tracker.listGroups(trackerServer); if (groupStats == null) { logger.error("ERROR! list groups error, error no: " + tracker.getErrorCode()); return result; } logger.info("group count: " + groupStats.length); for (StructGroupStat groupStat : groupStats) { GroupHour group = new GroupHour(); BeanUtils.copyProperties(groupStat, group); StructStorageStat[] storageStats = tracker.listStorages( trackerServer, groupStat.getGroupName()); for (StructStorageStat storageStat : storageStats) { StorageHour storage = new StorageHour(); BeanUtils.copyProperties(storageStat, storage); storage.setCurStatus(ProtoCommon .getStorageStatusCaption(storageStat.getStatus())); storage.setId(null); System.out.println("getGroupInfoByHour: storageId:"+storage.getId()); storage.setGroup(group); storage.setGroupName(group.getGroupName()); group.getStorageList().add(storage); } result.add(group); } Date date = new Date(); String cmd = "ps -aux|grep fdfs"; for (Machine machine : Tools.machines) { List<String> strList = new ArrayList<String>(); if(machine.isConfigType()) strList = Tools.exeRemoteConsole(machine.getIp(), machine.getUsername(), machine.getPassword(), cmd); else strList = new JsshProxy(machine.getIp(),machine.getUsername(),machine.getPort(),machine.getSsh()).execute(cmd).getExecuteLines(); for (String str : strList) { if (str.contains("storage.conf")) { for (GroupHour group : result) { group.setCreated(date); for (StorageHour storage : group.getStorageList()) { if (machine.getIp().equalsIgnoreCase( storage.getIpAddr())) { String[] strArrray = str.replaceAll(" +", ",") .split(","); storage.setCpu(strArrray[2]); storage.setMem(Float.parseFloat(strArrray[3])); storage.setCreated(date); } } } } } } return result; } private List<GroupDay> getGroupInfoByDay() throws IOException, MyException, JSchException { List<GroupDay> result = new ArrayList<GroupDay>(); // noinspection ConstantConditions ClientGlobal.init(Tools.getClassPath() + "fdfs_client.conf"); logger.info("network_timeout=" + ClientGlobal.g_network_timeout + "ms"); logger.info("charset=" + ClientGlobal.g_charset); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); if (trackerServer == null) { return result; } StructGroupStat[] groupStats = tracker.listGroups(trackerServer); if (groupStats == null) { logger.error("ERROR! list groups error, error no: " + tracker.getErrorCode()); return result; } logger.info("group count: " + groupStats.length); for (StructGroupStat groupStat : groupStats) { GroupDay group = new GroupDay(); BeanUtils.copyProperties(groupStat, group); StructStorageStat[] storageStats = tracker.listStorages( trackerServer, groupStat.getGroupName()); for (StructStorageStat storageStat : storageStats) { StorageDay storage = new StorageDay(); BeanUtils.copyProperties(storageStat, storage); storage.setCurStatus(ProtoCommon .getStorageStatusCaption(storageStat.getStatus())); storage.setGroup(group); storage.setId(null); storage.setGroupName(group.getGroupName()); System.out.println("getGroupInfoByDay: storageId:"+storage.getId()); group.getStorageList().add(storage); } result.add(group); } Date date = new Date(); String cmd = "ps -aux|grep fdfs"; for (Machine machine : Tools.machines) { List<String> strList = new ArrayList<String>(); if(machine.isConfigType()) strList = Tools.exeRemoteConsole(machine.getIp(), machine.getUsername(), machine.getPassword(), cmd); else strList = new JsshProxy(machine.getIp(),machine.getUsername(),machine.getPort(),machine.getSsh()).execute(cmd).getExecuteLines(); for (String str : strList) { if (str.contains("storage.conf")) { for (GroupDay group : result) { group.setCreated(date); for (StorageDay storage : group.getStorageList()) { if (machine.getIp().equalsIgnoreCase( storage.getIpAddr())) { String[] strArrray = str.replaceAll(" +", ",") .split(","); storage.setCpu(strArrray[2]); storage.setMem(Float.parseFloat(strArrray[3])); storage.setCreated(date); } } } } } } return result; } private void warning(Storage storage) throws IOException, MyException { List<WarningData> warningDatas = warningService.findByIp(storage.getIpAddr()); StringBuffer stringBuffer = new StringBuffer("异常服务器:" + storage.getIpAddr() + "</br>"); if (!warningDatas.isEmpty()) { float wdCup = Float.parseFloat(warningDatas.get(0).getWdCpu()); float wdMem = warningDatas.get(0).getWdMem(); long wdFreeMB = warningDatas.get(0).getWdFreeMB(); boolean res = true; if (Float.parseFloat(storage.getCpu()) > wdCup) { stringBuffer.append("cpu使用率当前值为: " + storage.getCpu() + "% 大于预警值:" + wdCup + "%</br>"); res = false; } if (storage.getMem() > wdMem) { stringBuffer.append("内存使用率当前值为: " + storage.getMem() + "% 大于预警值:" + wdMem + "%</br>"); res = false; } if (storage.getFreeMB() < wdFreeMB) { stringBuffer.append("可用空间当前值为: " + storage.getFreeMB() + "MB 小于预警值:" + wdFreeMB + "MB</br>"); res = false; } if (!res) { BuildMail buildMail = new BuildMail(); List<WarningUser> warningUser = new ArrayList<WarningUser>(); warningUser = warningService.findWarUser(); for (WarningUser wu : warningUser) { buildMail.sendWarning("VivaMe维我", wu.getEmail(), "dfs预警报告", stringBuffer.toString()); } } } } public void warningOffline(Storage storage) throws IOException, MyException { List<WarningData> warningDatas = warningService.findByIp(storage.getIpAddr()); boolean res = false; StringBuffer stringBuffer = new StringBuffer("异常服务器 :" + storage.getIpAddr() + "</br>"); if (storage.getCurStatus().equals("OFFLINE")) { stringBuffer.append("服务器停止工作"); if (datemap.containsKey(storage.getIpAddr())) { Date offdate = datemap.get(storage.getIpAddr()); Date now = new Date(); long temp = now.getTime() - offdate.getTime(); if (temp >= 1000 * 60 * 60) { datemap.put(storage.getIpAddr(), new Date()); res = true; } } else { datemap.put(storage.getIpAddr(), new Date()); res = true; } } else { if (datemap.containsKey(storage.getIpAddr())) { datemap.remove(storage.getIpAddr()); } } if (res) { BuildMail buildMail = new BuildMail(); List<WarningUser> warningUser = new ArrayList<WarningUser>(); warningUser = warningService.findWarUser(); for (WarningUser wu : warningUser) { buildMail.sendWarning("VivaMe维我", wu.getEmail(), "dfs预警报告", stringBuffer.toString()); } } } /** * 每天定时读取logger日志,并入库 */ @Override @Scheduled(cron = "0 0 01 * * ?") public void readDataFromLoggerToDataBase()throws JSchException{ SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); Calendar c = Calendar.getInstance(); c.add(Calendar.DAY_OF_MONTH, -1); Date d = c.getTime(); String date = df.format(d); for (Machine machine : Tools.machines) { String cmd = "cat "+machine.getLogpath()+"/fastdfs_" + date + ".log"; List<String> strList = new ArrayList<String>(); if(machine.isConfigType()) strList = Tools.exeRemoteConsole(machine.getIp(), machine.getUsername(), machine.getPassword(), cmd); else strList = new JsshProxy(machine.getIp(),machine.getUsername(),machine.getPort(),machine.getSsh()).execute(cmd).getExecuteLines(); for (String str : strList) { String data[] = str.split(" "); if (data[8].equals("200")) { //去数据库对应的表tbdownloadfilerecord中查询有没有fileId和对应的ip的DownloadFileRecord存在; DownloadFileRecord downloadFileRecord = fileDataService.getDownloadFileRecordByIpAndFileId(machine.getIp(), data[6]); if (downloadFileRecord != null) { downloadFileRecord.setAccessCount(downloadFileRecord.getAccessCount() + 1); } else { downloadFileRecord = new DownloadFileRecord(); downloadFileRecord.setFileId(data[6]); downloadFileRecord.setSrc_ip(machine.getIp()); downloadFileRecord.setAccessCount(1); } fileDataService.saveDF(downloadFileRecord); } } } } }