diff --git a/WebContent/WEB-INF/lib/jsch-0.1.54.jar b/WebContent/WEB-INF/lib/jsch-0.1.54.jar new file mode 100644 index 0000000..426332e Binary files /dev/null and b/WebContent/WEB-INF/lib/jsch-0.1.54.jar differ diff --git a/src/main/java/cfs/common/util/FtpUtil.java b/src/main/java/cfs/common/util/FtpUtil.java index ed9a633..3292581 100644 --- a/src/main/java/cfs/common/util/FtpUtil.java +++ b/src/main/java/cfs/common/util/FtpUtil.java @@ -46,10 +46,12 @@ public class FtpUtil { * @param iPort 포트 * @param strDir 서버경로 */ - public boolean checkFtpServerStatus ( + public int checkFtpServerStatus ( String strHost, String strId, String strPassWord, int iPort, String strDir ){ + int step = 1; + boolean exception = false; ftpClient = new FTPClient(); @@ -61,22 +63,24 @@ public class FtpUtil { int resultCode = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(resultCode)){ ftpClient.disconnect(); - return false; + return step; } ftpClient.setSoTimeout(3000); boolean isLogin = ftpClient.login(strId, strPassWord); if(!isLogin){ - return false; + return step; } - + + step++; + if(strDir != null && !strDir.equals("")){ ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.changeWorkingDirectory(strDir); if (ftpClient.getReplyCode() == 550) { //디렉토리 없음 ftpClient.logout(); - return false; + return step; } } @@ -99,9 +103,10 @@ public class FtpUtil { } if(exception){ - return false; + return step; } - return true; + + return 0; } /** diff --git a/src/main/java/cfs/common/util/SftpUtil.java b/src/main/java/cfs/common/util/SftpUtil.java new file mode 100644 index 0000000..eb8dbf4 --- /dev/null +++ b/src/main/java/cfs/common/util/SftpUtil.java @@ -0,0 +1,161 @@ +package cfs.common.util; + + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + + +@SuppressFBWarnings +@Component +public class SftpUtil { + +static Logger logger = Logger.getLogger(SftpUtil.class.getName()); + + private Session session; + private Channel channel; + private ChannelSftp channelSftp; + + /** + * 서버와 연결에 필요한 값들을 가져와 초기화 시킴 + * @param host 서버 주소 + * @param userName 접속에 사용될 아이디 + * @param passWord 비밀번호 + * @param port 포트번호 + */ + public int checkSftpServerStatus(String host, String userName, String passWord, int port, String path) { + + int step = 1; + + boolean exception = false; + + JSch jsch = new JSch(); + + try { + session = jsch.getSession(userName, host, port); + session.setPassword(passWord); + + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + session.connect(); + channel = session.openChannel("sftp"); + channel.connect(); + if(!channel.isConnected()){ + return step; + } + + channelSftp = (ChannelSftp) channel; + + step++; + + channelSftp.cd(path); + + channelSftp.disconnect(); + + + } catch (JSchException e) { + exception = true; + } catch (Exception e) { + exception = true; + } finally { + if (channelSftp != null && channelSftp.isConnected()){ + try { + channelSftp.disconnect(); + } catch (RuntimeException e) { + exception = true; + } catch (Exception e) { + exception = true; + } + } + } + + if(exception){ + return step; + } + + return 0; + } + + + public boolean init(String host, String userName, String passWord, int port) { + + JSch jsch = new JSch(); + + try { + session = jsch.getSession(userName, host, port); + session.setPassword(passWord); + + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + session.connect(); + channel = session.openChannel("sftp"); + channel.connect(); + channelSftp = (ChannelSftp) channel; + + } catch (JSchException e) { + return false; + } catch (Exception e) { + return false; + } + return true; + } + + + /** + * 하나의 파일을 업로드 한다. + * @param dir 저장시킬 주소(서버) + * @param file 저장할 파일 + */ + public boolean sFtpUpload(String strDir, File file) { + + boolean isResult = true; + FileInputStream in = null; + + try { + in = new FileInputStream(file); + if(channelSftp !=null){ + channelSftp.cd(strDir); + channelSftp.put(in, file.getName()); + }else{ + isResult = false; + } + } catch (SftpException e) { + isResult = false; + } catch (FileNotFoundException e) { + isResult = false; + } finally { + try { + sFtpDisConnection(); + if(in != null) + in.close(); + } catch (IOException e) { + logger.info(e); + } catch (Exception e) { + logger.info(e); + } + } + return isResult; + } + + public void sFtpDisConnection() { + if(channelSftp != null){ + channelSftp.quit(); + } + } +} diff --git a/src/main/java/cfs/schd/config/CfsScheduleCron.java b/src/main/java/cfs/schd/config/CfsScheduleCron.java index 24ab4c4..bc5af53 100644 --- a/src/main/java/cfs/schd/config/CfsScheduleCron.java +++ b/src/main/java/cfs/schd/config/CfsScheduleCron.java @@ -20,6 +20,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import cfs.WASInfo; import cfs.common.util.FtpUtil; +import cfs.common.util.SftpUtil; import cfs.schd.BrsEndOfDayInfo; import cfs.schd.ExemptCarInfo; import cfs.schd.LocalResidentsCarInfo; @@ -38,6 +39,8 @@ public class CfsScheduleCron { @Autowired private FtpUtil ftpUtil; + @Autowired + private SftpUtil sftpUtil; @Resource(name="schdDao") private SchdDao schdDao; @@ -101,7 +104,7 @@ public class CfsScheduleCron { //이그린ESB 연결 체크 Map egreenESB = trsmrcvDao.selectConnectionInfo("EGREEN_ESB_AGENT_FTP"); - boolean egreenESB_OK = ftpUtil.checkFtpServerStatus( + int egreenESB_OK = sftpUtil.checkSftpServerStatus( egreenESB.get("CONNECT_IP"), egreenESB.get("USER_ID"), egreenESB.get("USER_PASS"), @@ -109,7 +112,7 @@ public class CfsScheduleCron { egreenESB.get("PATH_INFO") ); - if(!egreenESB_OK){ + if(egreenESB_OK != 0){ Map map = new HashMap(); //mapOrg.put("ERROR_NAME", "이그린ESB연결실패"); //trsmrcvDao.insertError(map); diff --git a/src/main/java/cfs/trsmrcv/web/TestController.java b/src/main/java/cfs/trsmrcv/web/TestController.java index 17d020c..fcd434b 100644 --- a/src/main/java/cfs/trsmrcv/web/TestController.java +++ b/src/main/java/cfs/trsmrcv/web/TestController.java @@ -1,6 +1,7 @@ package cfs.trsmrcv.web; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; @@ -33,6 +34,7 @@ import cfs.common.util.ConnectUtil; import cfs.common.util.FtpUtil; import cfs.common.util.Result; import cfs.common.util.ResultSmartPlatform; +import cfs.common.util.SftpUtil; import cfs.schd.dao.SchdDao; import cfs.trsmrcv.dao.TrsmrcvDao; @@ -49,6 +51,8 @@ public class TestController { @Autowired private FtpUtil ftpUtil; + @Autowired + private SftpUtil sftpUtil; @RequestMapping(value="/cfs/trsmrcv/sleep.do", method=RequestMethod.GET) public @ResponseBody Map sleep(HttpServletRequest request) throws Exception { @@ -254,14 +258,14 @@ public class TestController { return result; } - @RequestMapping(value="/cfs/trsmrcv/ftptest.do", method=RequestMethod.GET) - public @ResponseBody Map ftptest(HttpServletRequest request) throws Exception { + @RequestMapping(value="/cfs/trsmrcv/sftptest.do", method=RequestMethod.GET) + public @ResponseBody Map sftptest(HttpServletRequest request) throws Exception { ResultSmartPlatform result = new ResultSmartPlatform(); Map connectionInfo = trsmrcvDao.selectConnectionInfo("EGREEN_ESB_AGENT_FTP"); - boolean ftpServerOk = ftpUtil.checkFtpServerStatus( + int ftpServerOk = sftpUtil.checkSftpServerStatus( connectionInfo.get("CONNECT_IP"), connectionInfo.get("USER_ID"), connectionInfo.get("USER_PASS"), @@ -269,7 +273,8 @@ public class TestController { connectionInfo.get("PATH_INFO") ); - if(!ftpServerOk){ + if(ftpServerOk != 0){ + result.setData("errorStep", ftpServerOk); result.setErrorMsg(Result.STATUS_ERROR, "이그린 연계 서버 연결 오류가 발생하였습니다."); return result.getResult(); } @@ -278,6 +283,41 @@ public class TestController { return result.getResult(); } + @RequestMapping(value="/cfs/trsmrcv/sftpUtest.do", method=RequestMethod.GET) + public @ResponseBody Map sftpUtest(HttpServletRequest request) throws Exception { + ResultSmartPlatform result = new ResultSmartPlatform(); + + + Map connectionInfo = trsmrcvDao.selectConnectionInfo("EGREEN_ESB_AGENT_FTP"); + + boolean initResult = sftpUtil.init( + connectionInfo.get("CONNECT_IP"), + connectionInfo.get("USER_ID"), + connectionInfo.get("USER_PASS"), + Integer.parseInt(connectionInfo.get("CONNECT_PORT")) + ); + + if(!initResult){ + result.setErrorMsg(Result.STATUS_ERROR, "이그린 연계 서버 연결 오류가 발생하였습니다."); + return result.getResult(); + } + + File file = new File("test.txt"); + if(!file.exists()){ + file.createNewFile(); + } + boolean uResult = sftpUtil.sFtpUpload(connectionInfo.get("PATH_INFO"), file); + if(!uResult){ + result.setErrorMsg(Result.STATUS_ERROR, "이그린 연계 서버 업로드 오류가 발생하였습니다."); + return result.getResult(); + } + + result.setMsg(ResultSmartPlatform.STATUS_SUCESS, "정상적으로 처리되었습니다."); + return result.getResult(); + } + + + @RequestMapping(value="/cfs/trsmrcv/seoulsmstest.do", method=RequestMethod.GET) public @ResponseBody Map seoulsmstest(HttpServletRequest request) throws Exception { ResultSmartPlatform result = new ResultSmartPlatform();