nuri2설정파일 생성 메소드 추가

main
이범준 1 year ago
parent 1a9ecda173
commit 78d45235b6

@ -1,7 +1,11 @@
package externalsystem.nuri2.service.bean;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import cokr.xit.TextFileMaker;
public abstract class Nuri2ServiceBean {
@ -13,4 +17,420 @@ public abstract class Nuri2ServiceBean {
public abstract String makeScriptFile(HttpServletRequest req);
public final String XMS_PORT = "20000";
public final String ALT_PORT = "40000";
public final String RCS_PORT = "40000";
public final String OUTERNAL_IP_START = "125.";
public final String OUTERNAL_IP_END_RCS_X = ".20";
public final String OUTERNAL_IP_END_RCS_O = ".25";
public final String OUTERNAL_IP_MIDDLE_DUMMY = "60.63";
public final String INTERNAL_IP_START = "10.";
public final String INTERNAL_IP_END = ".235";
//사용자정의컬럼
public final String[] customCols = {
"INPUT_DT varchar(14)","RES_DT varchar(14)",
"REQ_SYS varchar(2)", "MSG_PRPS varchar(2)", "MSG_DTL_PRPS varchar(100)",
"SGG_CD varchar(5)", "TASK_SE_CD varchar(3)"
};
public String makeConfFile(HttpServletRequest req) {
String env = req.getParameter("env");
String sgg = req.getParameter("sgg");
boolean isTest = false;
if("test".equals(env)) {
isTest = true;
}
String dbName = "";
String dbIp = "";
String dbPort = "";
String dbService = req.getParameter("dbService");
String userSchema = req.getParameter("userSchema");
String dbUserId = req.getParameter("dbUserId");
String dbPassword = req.getParameter("dbPassword");
String xms_ip = req.getParameter("xms_ip");
String alt_ip = req.getParameter("alt_ip");
String rcs_ip = req.getParameter("rcs_ip");
String gwanriId = "";
String yeondongId = "";
String yeondongPassword = "";
if("50000".equals(sgg)) {
if(isTest) {
yeondongId = "jejudo02";
dbName = "MARIADB";
} else {
dbName = "MARIADB";
gwanriId = "jejudo01";
yeondongId = "jejudo03";
}
yeondongPassword = "jeju12!@";
}
if(isTest) {
xms_ip = OUTERNAL_IP_START+OUTERNAL_IP_MIDDLE_DUMMY+OUTERNAL_IP_END_RCS_X;
alt_ip = OUTERNAL_IP_START+OUTERNAL_IP_MIDDLE_DUMMY+OUTERNAL_IP_END_RCS_X;
rcs_ip = OUTERNAL_IP_START+OUTERNAL_IP_MIDDLE_DUMMY+OUTERNAL_IP_END_RCS_O;
dbIp = "211.119.124.9";
}
if(isTest && (dbName.equals("MARIADB")||dbName.equals("MYSQL"))) {
dbPort = "4407";
}
String dbDriver = "";
String dbUrl = "";
switch(dbName) {
case "ORACLE" :
dbDriver = "oracle.jdbc.driver.OracleDriver";
dbUrl = "jdbc:oracle:thin:@"+dbIp+":"+dbPort+":"+dbService;
break;
case "MSSQL" :
dbDriver = "net.sourceforge.jtds.jdbc.Driver";
dbUrl = "jdbc:jtds:sqlserver://"+dbIp+":"+dbPort+"/"+dbService
+";encrypt=true;trustServerCertificate=true;useUnicode=true;characterEncoding=UTF-8";
break;
case "MYSQL" :
dbDriver = "com.mysql.cj.jdbc.Driver";
dbUrl = "jdbc:mysql://"+dbIp+":"+dbPort+"/"+dbService
+"?autoReconnect=true&useUnicode=true&zeroDateTimeBehavior=convertToNull&useSSL=false&characterEncoding=utf8";
break;
case "MARIADB" :
dbDriver = "org.mariadb.jdbc.Driver";
dbUrl = "jdbc:mariadb://"+dbIp+":"+dbPort+"/"+dbService
+"?autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
break;
case "PostgreSQL" :
dbDriver = "org.postgresql.Driver";
dbUrl = "jdbc:postgresql://"+dbIp+":"+dbPort+"/"+dbService+"?"+"currentSchema="+userSchema;
break;
case "CUBRID" :
dbDriver = "cubrid.jdbc.driver.CUBRIDDriver";
dbUrl = "jdbc:cubrid:"+dbIp+":"+dbPort+":"+dbService+":::";
break;
case "TIBERO" :
dbDriver = "com.tmax.tibero.jdbc.TbDriver";
dbUrl = "jdbc:tibero:thin:@"+dbIp+":"+dbPort+":"+dbService;
break;
case "ALTIBASE" :
dbDriver = "Altibase.jdbc.driver.AltibaseDriver";
dbUrl = "jdbc:Altibase://"+dbIp+":"+dbPort+"/"+dbService;
break;
}
TextFileMaker conf = new TextFileMaker();
conf.addLine("# Host Info(접속정보)");
conf.addLine(sharps);
conf.addLine("## [XMS]문자(SMS/MMS) 서버 설정");
conf.addLine(sharps);
conf.addLine("xms_ip = "+xms_ip);
conf.addLine("xms_port = "+XMS_PORT);
conf.addLine("xms_id = "+yeondongId);
conf.addLine("xms_pwd = "+yeondongPassword);
conf.addLine("xms_link = ON");
conf.addLine(sharps);
conf.addLine("## [ALT]앱메시지(KAKAO) 서버 설정");
conf.addLine(sharps);
conf.addLine("alt_ip = "+alt_ip);
conf.addLine("alt_port = "+ALT_PORT);
conf.addLine("alt_id = "+yeondongId);
conf.addLine("alt_pwd = "+yeondongPassword);
conf.addLine("alt_link = ON");
conf.addLine(sharps);
conf.addLine("## [RCS]인증(안심)문자(SMS/MMS) 서버 설정");
conf.addLine(sharps);
conf.addLine("rcs_ip = "+rcs_ip);
conf.addLine("rcs_port = "+RCS_PORT);
conf.addLine("rcs_id = "+yeondongId);
conf.addLine("rcs_pwd = "+yeondongPassword);
conf.addLine("rcs_link = ON");
//DB정보
conf.addLine(sharps);
conf.addLine("# 데이터베이스 정보");
conf.addLine(sharps);
String db_name_line = "db_name = "+dbName;
conf.addLine(db_name_line);
String db_driver_line = "db_driver = "+dbDriver;
conf.addLine(db_driver_line);
String db_url_line = "db_url = "+dbUrl;
conf.addLine(db_url_line);
String db_userid_line = "db_userid = "+dbUserId;
conf.addLine(db_userid_line);
String db_password_line = "db_password = "+dbPassword;
conf.addLine(db_password_line);
conf.addLine(sharps);
conf.addLine("# 로그 패스: 로그파일의 위치를 변경 할 수 있지만 기본 폴더를 권장합니다.");
conf.addLine("log_path =");
conf.addLine(sharps);
conf.addLine("# 큐 패스: Que 패스 : Que파일 생성은 기본 폴더를 권장합니다.");
conf.addLine("que_path =");
conf.addLine(sharps);
//# 로그 파일 삭제 옵션 (단위 : 일 | 기본 : 90)
//# log_path 에 설정한 폴더에 있는 log 파일을 삭제한다.
//# 생략 시 90일
//# 해당 파일을 삭제하지 않을 시 0 로 입력
conf.addLine("log_file_life_time = 90");
conf.addLine(sharps);
conf.addLine("# 모바일메시지서비스 Agent 네트워크 통신 암호화 옵션 (AES, OFF | 기본 : AES)");
conf.addLine("nuri_sign = OFF");
conf.addLine(sharps);
conf.addLine("# 모바일메시지서비스 Agent 각 Line 별(xms, alt, rcs) 네트워크 통신 암호화 옵션 (ON, OFF | 기본 : ON)");
conf.addLine("# nuri_sign = AES 설정인 상태에서 전송구간 송수신 암호화 최종 사용 여부");
conf.addLine("xms_sign = ON");
conf.addLine("alt_sign = ON");
conf.addLine("rcs_sign = ON");
conf.addLine(sharps);
//# 전송 속도를 향상하기 위한 모드 변경
//# 이 모드를 설정하면 전송 라인이 병렬로 동작을 하게 된다.
//# 방화벽에서 동일한 서버로 여러 개의 Session 이 동작하는 것에 대해서 허용하도록 해야 한다.
conf.addLine("xms_active_socket = 1");
conf.addLine("alt_active_socket = 1");
conf.addLine("rcs_active_socket = 1");
conf.addLine(sharps);
//# 전송 결과값을 빠르게 받기 위한 Receiver Multi (ON, OFF | 기본 : OFF)
//# Receiver 가 Sender 와 Session 수량이 연결되게 동작을 하게 된다.
//# 방화벽에서 동일한 서버로 여러 개의 Session 이 동작하는 것에 대해서 허용하도록 해야 한다.
conf.addLine("receiver_multi = ON");
conf.addLine(sharps);
//# Nuri2 재시작 시간 설정
//# 설정한 시간에 모든 프로세스를 종료 후 재기동 함.
//# 설정하지 않으면 재시작 하지 않음.
//# (0100 ~ 2400) 분 단위까지 적용 가능.
conf.addLine("nuri_restart_time = 0730");
conf.addLine(sharps);
//# Nuri2 REPORT 결과 갱신 (ON, OFF | 기본 : ON)
//# NRMSG_DATA 에 결과 갱신할 값이 없으면
//# 현재 달과 이전 달을 LOG 테이블을 각각 조회하여 결과 갱신하는 옵션
conf.addLine("report_follow_update = ON");
conf.addLine(sharps);
//# log 테이블 이동 모드 (BATCH, REAL | 기본 : BATCH)
//# BATCH : 전송 완료된 메시지를 일정 수량만큼 묶어서 처리
//# REAL : 전송 완료된 메시지를 실시간으로 log 테이블로 이동
conf.addLine("nuri_log_mode = REAL");
conf.addLine(sharps);
//# log 테이블을 생성 형태 옵션 (LOG, LOG_YYYY, LOG_YYYYMM | 기본 : LOG_YYYYMM)
//# NRMSG_LOG_YYYYMM 형태로 여러 개를 할 것인지
//# NRMSG_LOG 하나로 할 것인지
//# LOG : log 테이블 하나만 생성함
//# LOG_YYYY : log 테이블을 년 별로 나누어 생성함
//# LOG_YYYYMM : log 테이블을 년 매월로 나누어 생성함
conf.addLine("nuri_log_make_mode = LOG_YYYYMM");
conf.addLine(sharps);
//# 결과 완료 값 log 테이블 이동 유무 설정 (ON, OFF | 기본 : ON)
//# 결과 수신 완료 후 NRMSG_DATA 의 값을 NRMSG_LOG_YYYYMM 테이블로 이동 유무 설정
conf.addLine("db_log_move = OFF");
conf.addLine(sharps);
//# 레포트를 기다리는 시간 (단위 : 시간 | 기본 : 82)
//# 이 시간이 지날 경우 더 이상 레포트를 기다리지 않고 해당레코드를 log 테이블로 이동시킨다.
conf.addLine("record_life_time = 82");
conf.addLine(sharps);
//# Agent 의 장애 시 동작 지속 시간 추가 (단위 : 시간 | 기본 : 48)
//# Socket 및 DB 연결이 안 되고 장애가 발생하고 있을 때 동작 지속 시간이
//# 초과하면 Agent 의 기동을 모두 중지함
//# 생략 시 48시간
//# 해당 장애시간에 상관없이 계속 연결을 원할 시 0시로 입력
//# 예) nuri_life_time = 1 (1시간 동안만 동작을 지속하고도 장애 시 Agent 로 종료함)
//# nuri_life_time = 0 (장애가 있어 연결이 안 되고 있어서 Agent 의 동작을 계속 유지함)
conf.addLine("nuri_life_time = 48");
conf.addLine(sharps);
//# 사용하는 테이블의 사용자를 지정하는 옵션
conf.addLine("db_select_user =");
conf.addLine(sharps);
//# 사용하는 테이블명을 변경하는 옵션
//# 기존에 테이블명을 사용자가 임의의 테이블명으로 변경할 수 있다.
conf.addLine("db_table_name.NRMSG_DATA = nuri2_nrmsg_data");
conf.addLine("db_table_name.NRMSG_LOG = nuri2_nrmsg_log");
conf.addLine("db_table_name.NRMSG_RSLT = nuri2_nrmsg_rslt");
conf.addLine("db_table_name.NRMSG_DUPLEX = nuri2_nrmsg_duplex");
conf.addLine(sharps);
//# 사용하는 시퀀스 명을 변경하는 옵션
//# 기존에 시퀀스 명을 사용자가 임의의 시퀀스 명으로 변경할 수 있다.
conf.addLine("db_sequence_name.NRMSG_DATA = NRMSG_DATA_SEQ");
conf.addLine("db_sequence_name.NRMSG_RSLT = NRMSG_RSLT_SEQ");
conf.addLine("db_sequence_name.NRMSG_DUPLEX = NRMSG_DUPLEX_SEQ");
conf.addLine(sharps);
//# 데이터베이스의 사용자 필드, 사용자 인덱스 추가 가능한 총량
//# 필드 및 인덱스는 최대 10개만 가능하다.
//# 예) db_max_count = 5 <-- db_field, db_index 를 5개 이상 설정해 놓아도 5개까지만 추가가 된다.(최대 10개)
conf.addLine("db_max_count = 10");
conf.addLine(sharps);
//# 데이터베이스의 사용자 필드 추가 옵션
//# 생성할 필드명과 데이터 타입 및 옵션 사이엔 스페이스로 구분해 줘야 한다.
//# 아래 예와 같이 설정을 하면 2개의 필드가가 생성되며
//# 테이블 맨 마지막에 MSG_ETC1, MSG_ETC2 필드가 추가된다.
//# 예) db_field = MSG_ETC1 varchar(10)
//# db_field = MSG_ETC2 varchar(10)
for(String customCol : customCols) {
conf.addLine("db_field = "+customCol);
}
conf.addLine(sharps);
//# 데이터베이스의 사용자 인덱스 추가 옵션
//# 생성할 인덱스의 필드와 필드 사이는 콤마로 구분해 줘야 하며
//# 정렬( 오름차순:ASC, 내림차순:DESC) 도 설정할 수 있다.
//# 아래 예와 같이 설정을 하면 3개의 인덱스가 생성되며
//# 인덱스 명은 "IDX_로그테이블명_순서"로 생성이 된다.
//# 예) db_index = MSG_KEY
//# db_index = CUR_STATE DESC, REQ_DATE ASC
//# db_index = CALL_TO
conf.addLine("db_index = ");
conf.addLine(sharps);
//# 전송 데이터 조회 시간 (단위 : 초 | 기본 : 1)
conf.addLine("db_tran_term = 1");
conf.addLine(sharps);
//# DBMS 의 연결 유지를 의한 조회 시간 (단위 : 초 | 기본 : 60)
//# 커넥션 유효 쿼리는 각 DBMS 의 테이블명 조회 방식을 사용함
conf.addLine("db_ping_term = 60");
conf.addLine(sharps);
//# 모바일메시지서비스 G/W 와 연결 상태 확인 시간 (단위 : 초 | 기본 : 50)
conf.addLine("ping_term = 50");
conf.addLine(sharps);
//# The time when sender query to DBMS
//# "ORDER BY NRMSG_DATA.MSG_KEY" 사용 여부 (ON, OFF | 기본 : ON)
//# SELECT 시 ORDER BY NRMSG_DATA.MSG_KEY 를 사용하면
//# DB 서버에 부하가 약간 생기는 문제로 업체가 요청한 옵션.
//# OFF 하면 SELECT 시 CUR_STATE = 1의 값을 무작위로 가져오므로
//# 메시지 사이사이 늦게 전송되는 것이 있음.
//#
//# db_orderby : "ORDER BY NRMSG_DATA.MSG_KEY" 사용여부 (ON, OFF)
conf.addLine("db_orderby = ON");
conf.addLine(sharps);
//# 테이블, 인덱스 생성
conf.addLine("db_create_table = ON");
conf.addLine(sharps);
//# 시퀀스생성
conf.addLine("db_create_sequence = ON");
conf.addLine(sharps);
//# MySQL, MariaDB 전용 옵션 (MyISAM, InnoDB)
//# MySQL TABLE 생성 시 Engine 타입 설정
//# 설정 안 하면 MySQL 기본 설정에 따라 Engine Type 생성
//# "SELECT engine, support FROM information_schema.engines" 질의 시 support 가 default 로 되어 있는 engine
String storageEngine = "InnoDB";
if(dbName.equals("MARIADB")||dbName.equals("MYSQL")) {
storageEngine = "";
}
conf.addLine("db_storage_engine = "+storageEngine);
conf.addLine(sharps);
//모바일메시지서비스 Agent 각 Line 별(xms, alt, rcs) 작동 여부 (ON, OFF | 기본 : ON)
conf.addLine("xms_sender = ON");
conf.addLine("xms_receiver = OFF");
conf.addLine("alt_sender = ON");
conf.addLine("alt_receiver = OFF");
conf.addLine("rcs_sender = ON");
conf.addLine("rcs_receiver = OFF");
conf.addLine(sharps);
//# 메시지 타입별 CharSet
//# 각각의 메시지 타입별로 G/W 에 전송할 Charset 을 설정할 수 있다.
//# 고도화 서버는 모두 UTF-8 기본 값
conf.addLine("charset_sms = UTF-8");
conf.addLine("charset_mms = UTF-8");
conf.addLine("charset_alt = UTF-8");
conf.addLine("charset_rcs = UTF-8");
conf.addLine(sharps);
//# 메시지 MSG_TYPE 별 CONTENTS_TYPE_1 ~ 3
//# CONTENTS_TYPE_1 ~ 3 에 들어가는 전송 타입으로 KAKAO 알림톡, RCS 는 계속 추가 예정
conf.addLine("msg_type.SMS = SMS");
conf.addLine("msg_type.MMS = LMS,MMS");
conf.addLine("msg_type.ALT = ALT,ALI,FRT,FRI,FRW");
conf.addLine("msg_type.RCS = RCS,RCL,RCM,RCT,RCD,RCF,RIT");
conf.addLine(sharps);
//# 모바일메시지서비스 G/W 와 연결 장애 시 실패 사용 여부 (ON, OFF | 기본 : OFF)
//# xxx_sender = ON 인 상태에서 각 메시지 타입별 sender 에 문제가 발생했을 때 적용되는 옵션으로
//# 메시지 전송 시 재전송으로 입력한 경우 실패 값으로 처리하여 2번째 또는 3번째 메시지로 전송하게 한다.
//# 전송할 메시지의 상태 값(MSG_STATE) 6, 결과 코드(RSLT_CODE) 990 으로 모두 실패 처리
conf.addLine("sender_failure_switch = ON");
conf.addLine(sharps);
//# 하루에 한 수신번호에 보낼 수 있는 메시지 수량 (기본 : 10개)
//# 생략 시 10개
//# 0개로 세팅 시 사용 안 함
//# # 메시지 내용과 상관 없이 동일 폰번호에 나가는 건수.
conf.addLine("duplicate_phone_count = 200");
conf.addLine(sharps);
//# Limit Time Zone (전송 제한 시간대 설정)
//# 전송 제한 시작 시간 (0100 ~ 2400) 분 단위까지 적용 가능, 생략 시 24시간 전송 가능.
//# 예) limit_begin = 2100
//# 예) limit_end = 0600
conf.addLine("limit_begin =");
conf.addLine("limit_end =");
conf.addLine(sharps);
//# 현재 시간으로부터 설정 시간(RES_DATE 입력 시간) 이전 시간까지만 전송 (단위 : 시간 | 기본 : 3)
//# 생략 시 3시간
conf.addLine("before_time = 3");
conf.addLine(sharps);
//# Active / Stand By 이중화 사용 여부 (ON, OFF | 기본 : OFF)
//# OFF 일 경우에 동작하지 않는다.
//# 이중화를 사용하고 MMS 전송 시엔 NRMSG_DATA 테이블이 참조하는
//# XMS_FILE_NAME_1 ~ XMS_FILE_NAME_3 경로 값을 꼭 MASTER, SLAVE 서버 각각에
//# 동일한 경로에 저장하여 사용해야 한다.
//# 모듈 이중화 설정.
conf.addLine("duplex_switch = OFF");
conf.addLine("duplex_id = MASTER");
//로그레벨
conf.addLine(sharps);
conf.addLine("log 기록 범위 설정");
conf.addLine("DEBUG : NURI2 의 상세 로그");
conf.addLine("FATAL : NURI2 의 치명적 에러");
conf.addLine("ERROR : NURI2 가 수행 가능 정도의 에러");
conf.addLine("WARN : NURI2 가 시스템에 문제를 일으킬 가능성이 있을 때 사용");
conf.addLine("INFO : NURI2 의 정보용으로 사용");
conf.addLine("console.log_level = INFO");
conf.addLine("system.log_level = INFO");
//파일 생성
conf.makeTxtFile("C:\\Temp",nuri2confName,conf.getFileCn());
return "C:\\Temp" + File.separator + nuri2confName;
}
}

@ -6,6 +6,7 @@ import java.io.OutputStream;
import java.nio.file.Files;
import java.util.function.Consumer;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
@ -15,11 +16,15 @@ import org.springframework.web.servlet.ModelAndView;
import cokr.xit.foundation.Downloadable;
import cokr.xit.foundation.web.AbstractController;
import externalsystem.nuri2.service.bean.LinuxServiceBean;
import externalsystem.nuri2.service.bean.Nuri2ServiceBean;
import externalsystem.nuri2.service.bean.WindowsServiceBean;
@Controller
@RequestMapping(name="모바일 메시지 컨트롤러", value="/mms")
public class nuri2Controller extends AbstractController {
@Resource(name="nuri2ServiceBean")
Nuri2ServiceBean nuri2ServiceBean;
@RequestMapping(name="모듈 실행 스크립트 파일 생성", value="/createScript.do")
public ModelAndView createScript(HttpServletRequest req) {
@ -74,7 +79,41 @@ public class nuri2Controller extends AbstractController {
return mav;
}
@RequestMapping(name="모듈 설정파일 생성", value="/createConf.do")
public ModelAndView createConf(HttpServletRequest req) {
ModelAndView mav = new ModelAndView("downloadView");
String filePath = nuri2ServiceBean.makeConfFile(req);
//다운로드
File file = new File(filePath);
try {
byte[] bytes = Files.readAllBytes(file.toPath());
Consumer<OutputStream> writer = new Consumer<OutputStream>() {
@Override
public void accept(OutputStream os) {
try {
os.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
};
mav.addObject("download",
new Downloadable()
.setContentType("text/plain")
.setWriter(writer)
.setFilename(nuri2ServiceBean.nuri2confName)
);
} catch (IOException e) {
e.printStackTrace();
}
return mav;
}
}

Loading…
Cancel
Save