/** * Copyright 2016 benjobs * <p> * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.opencron.server.controller; import com.alibaba.fastjson.JSON; import org.opencron.common.job.Opencron; import org.opencron.common.job.Response; import org.opencron.common.utils.*; import org.opencron.server.domain.Agent; import org.opencron.server.domain.Job; import org.opencron.server.domain.Log; import org.opencron.server.domain.User; import org.opencron.server.job.OpencronTools; import org.opencron.server.service.*; import org.opencron.server.tag.PageBean; import org.opencron.server.vo.ChartVo; import org.opencron.server.vo.Cropper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.awt.*; import java.io.File; import java.util.Date; import java.util.List; import static org.opencron.common.utils.CommonUtils.isEmpty; import static org.opencron.common.utils.CommonUtils.notEmpty; /** * Created by ChenHui on 2016/2/17. */ @Controller public class HomeController extends BaseController { @Autowired private HomeService homeService; @Autowired private RecordService recordService; @Autowired private AgentService agentService; @Autowired private ConfigService configService; @Autowired private ExecuteService executeService; @Autowired private JobService jobService; @Autowired private UserService userService; private Logger logger = LoggerFactory.getLogger(getClass()); @RequestMapping("/home") public String index(HttpSession session, Model model) { /** * agent... */ List<Agent> success = agentService.getOwnerAgentByStatus(session, 1); List<Agent> failed = agentService.getOwnerAgentByStatus(session, 0); model.addAttribute("success", success.size()); model.addAttribute("failed", failed.size()); success.addAll(failed); model.addAttribute("agents", success); /** * job */ List<Job> singleton = jobService.getJobsByJobType(session, Opencron.JobType.SINGLETON); List<Job> flow = jobService.getJobsByJobType(session, Opencron.JobType.FLOW); model.addAttribute("singleton", singleton.size()); model.addAttribute("flow", flow.size()); model.addAttribute("job", singleton.size() + flow.size()); /** * 成功作业,自动执行 */ Long successAutoRecord = recordService.getRecords(session, 1, Opencron.ExecType.AUTO); Long successOperRecord = recordService.getRecords(session, 1, Opencron.ExecType.OPERATOR); model.addAttribute("successAutoRecord", successAutoRecord); model.addAttribute("successOperRecord", successOperRecord); model.addAttribute("successRecord", successAutoRecord + successOperRecord); /** * 失败作业 */ Long failedAutoRecord = recordService.getRecords(session, 0, Opencron.ExecType.AUTO); Long failedOperRecord = recordService.getRecords(session, 0, Opencron.ExecType.OPERATOR); model.addAttribute("failedAutoRecord", failedAutoRecord); model.addAttribute("failedOperRecord", failedOperRecord); model.addAttribute("failedRecord", failedAutoRecord + failedOperRecord); model.addAttribute("startTime", DateUtils.getCurrDayPrevDay(7)); model.addAttribute("endTime", DateUtils.formatSimpleDate(new Date())); return "/home/index"; } @RequestMapping("/record") public void record(HttpSession session, HttpServletResponse response, String startTime, String endTime) { if (isEmpty(startTime)) { startTime = DateUtils.getCurrDayPrevDay(7); } if (isEmpty(endTime)) { endTime = DateUtils.formatSimpleDate(new Date()); } //成功失败折线图数据 List<ChartVo> voList = recordService.getRecord(session, startTime, endTime); if (isEmpty(voList)) { WebUtils.writeJson(response, "null"); } else { WebUtils.writeJson(response, JSON.toJSONString(voList)); } } @RequestMapping("/progress") public void progress(HttpSession session, HttpServletResponse response) { //成功失败折线图数据 ChartVo chartVo = recordService.getAsProgress(session); if (isEmpty(chartVo)) { WebUtils.writeJson(response, "null"); } else { WebUtils.writeJson(response, JSON.toJSONString(chartVo)); } } @RequestMapping("/monitor") public void port(HttpServletResponse response, Long agentId) throws Exception { Agent agent = agentService.getAgent(agentId); Response req = executeService.monitor(agent); /** * 直联 */ String format = "%d_%s"; if (agent.getProxy().equals(Opencron.ConnType.CONN.getType())) { String port = req.getResult().get("port"); String url = String.format("http://%s:%s", agent.getIp(), port); WebUtils.writeHtml(response, String.format(format, agent.getProxy(), url)); } else {//代理 WebUtils.writeHtml(response, String.format(format, agent.getProxy(), JSON.toJSONString(req.getResult()))); } } @RequestMapping("/login") public void login(HttpSession session, HttpServletRequest request, HttpServletResponse response, HttpSession httpSession, @RequestParam String username, @RequestParam String password) throws Exception { //用户信息验证 int status = homeService.checkLogin(request, username, password); if (status == 500) { WebUtils.writeJson(response, "{\"msg\":\"用户名密码错误\"}"); return; } if (status == 200) { //登陆成功了则生成csrf... String csrf = OpencronTools.getCSRF(session); logger.info("[opencron]login seccussful,generate csrf:{}", csrf); User user = OpencronTools.getUser(session); //提示用户更改默认密码 byte[] salt = Encodes.decodeHex(user.getSalt()); byte[] hashPassword = Digests.sha1(DigestUtils.md5Hex("opencron").toUpperCase().getBytes(), salt, 1024); String hashPass = Encodes.encodeHex(hashPassword); String format = "{\"status\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\"}"; if (user.getUserName().equals("opencron") && user.getPassword().equals(hashPass)) { WebUtils.writeJson(response, String.format(format, "edit", "userId", user.getUserId(), "csrf", csrf)); return; } if (user.getHeaderpic() != null) { String name = user.getUserId() + "_140" + user.getPicExtName(); String path = httpSession.getServletContext().getRealPath(File.separator) + "upload" + File.separator + name; IOUtils.writeFile(new File(path), user.getHeaderpic().getBinaryStream()); user.setHeaderPath(WebUtils.getWebUrlPath(request) + "/upload/" + name); } WebUtils.writeJson(response, String.format(format, "success", "url", "/home?csrf=" + csrf, "csrf", csrf)); return; } } @RequestMapping("/logout") public String logout(HttpSession httpSession) throws Exception { OpencronTools.invalidSession(httpSession); return "redirect:/"; } @RequestMapping("/headpic/upload") public void upload(@RequestParam(value = "file", required = false) MultipartFile file, Long userId, String data, HttpServletRequest request, HttpSession httpSession, HttpServletResponse response) throws Exception { String extensionName = null; if (file != null) { extensionName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); extensionName = extensionName.replaceAll("\\?\\d+$", ""); } String successFormat = "{\"result\":\"%s\",\"state\":200}"; String errorFormat = "{\"message\":\"%s\",\"state\":500}"; Cropper cropper = JSON.parseObject(DigestUtils.passBase64(data), Cropper.class); //检查后缀 if (!".BMP,.JPG,.JPEG,.PNG,.GIF".contains(extensionName.toUpperCase())) { WebUtils.writeJson(response, String.format(errorFormat, "格式错误,请上传(bmp,jpg,jpeg,png,gif)格式的图片")); return; } User user = userService.getUserById(userId); if (user == null) { WebUtils.writeJson(response, String.format(errorFormat, "用户信息获取失败")); return; } String path = httpSession.getServletContext().getRealPath("/") + "upload" + File.separator; String picName = user.getUserId() + extensionName.toLowerCase(); File picFile = new File(path, picName); if (!picFile.exists()) { picFile.mkdirs(); } try { file.transferTo(picFile); //检查文件是不是图片 Image image = ImageIO.read(picFile); if (image == null) { WebUtils.writeJson(response, String.format(errorFormat, "格式错误,正确的图片")); picFile.delete(); return; } //检查文件大小 if (picFile.length() / 1024 / 1024 > 5) { WebUtils.writeJson(response, String.format(errorFormat, "文件错误,上传图片大小不能超过5M")); picFile.delete(); return; } //旋转并且裁剪 ImageUtils.instance(picFile).rotate(cropper.getRotate()).clip(cropper.getX(), cropper.getY(), cropper.getWidth(), cropper.getHeight()).build(); //保存入库..... userService.uploadimg(picFile, userId); userService.updateUser(user); String contextPath = WebUtils.getWebUrlPath(request); String imgPath = contextPath + "/upload/" + picName + "?" + System.currentTimeMillis(); user.setHeaderPath(imgPath); user.setHeaderpic(null); httpSession.setAttribute(OpencronTools.LOGIN_USER, user); WebUtils.writeJson(response, String.format(successFormat, imgPath)); logger.info(" upload file successful @ " + picName); } catch (Exception e) { e.printStackTrace(); logger.info("upload exception:" + e.getMessage()); } } @RequestMapping("/notice/view") public String log(HttpSession session, Model model, PageBean pageBean, Long agentId, String sendTime) { model.addAttribute("agents", agentService.getOwnerAgents(session)); if (notEmpty(agentId)) { model.addAttribute("agentId", agentId); } if (notEmpty(sendTime)) { model.addAttribute("sendTime", sendTime); } homeService.getLog(session, pageBean, agentId, sendTime); return "notice/view"; } @RequestMapping("/notice/uncount") public void uncount(HttpSession session, HttpServletResponse response) { Long count = homeService.getUnReadCount(session); WebUtils.writeHtml(response, count.toString()); } /** * 未读取的站类信 * * @param model * @return */ @RequestMapping("/notice/unread") public String nuread(HttpSession session, Model model) { model.addAttribute("message", homeService.getUnReadMessage(session)); return "notice/info"; } @RequestMapping("/notice/detail") public String detail(Model model, Long logId) { Log log = homeService.getLogDetail(logId); if (log == null) { return "/error/404"; } model.addAttribute("sender", configService.getSysConfig().getSenderEmail()); model.addAttribute("log", log); homeService.updateAfterRead(logId); return "notice/detail"; } }