shjung 1 жил өмнө
commit
9c24f1df2f
53 өөрчлөгдсөн 3093 нэмэгдсэн , 0 устгасан
  1. 33 0
      .gitignore
  2. 118 0
      .mvn/wrapper/MavenWrapperDownloader.java
  3. BIN
      .mvn/wrapper/maven-wrapper.jar
  4. 2 0
      .mvn/wrapper/maven-wrapper.properties
  5. 175 0
      conf/icmp-ping-server-logback.xml
  6. 43 0
      conf/icmp-ping-server-tibero.properties
  7. 1 0
      conf/icmp-ping-server.pid
  8. 49 0
      conf/icmp-ping-server.properties
  9. BIN
      icmp-ping-server-0.0.1-SNAPSHOT.war
  10. 322 0
      mvnw
  11. 182 0
      mvnw.cmd
  12. 198 0
      pom.xml
  13. 3 0
      src/main/java/META-INF/MANIFEST.MF
  14. 114 0
      src/main/java/com/its/app/CommunicationServerApplication.java
  15. 26 0
      src/main/java/com/its/app/config/ServerConfig.java
  16. 15 0
      src/main/java/com/its/app/mapper/CctvMapper.java
  17. 15 0
      src/main/java/com/its/app/mapper/WcamMapper.java
  18. 46 0
      src/main/java/com/its/app/process/DbmsJobProcess.java
  19. 11 0
      src/main/java/com/its/app/process/DbmsJobType.java
  20. 33 0
      src/main/java/com/its/app/repository/AppRepository.java
  21. 74 0
      src/main/java/com/its/app/scheduler/SchedulerTask.java
  22. 112 0
      src/main/java/com/its/app/service/CctvService.java
  23. 122 0
      src/main/java/com/its/app/service/WcamService.java
  24. 77 0
      src/main/java/com/its/app/thread/IcmpPingThread.java
  25. 23 0
      src/main/java/com/its/app/vo/voIcmpCtlr.java
  26. 14 0
      src/main/java/com/its/app/vo/voIcmpCtlrStts.java
  27. 84 0
      src/main/java/com/its/app/webapp/controller/WebAppController.java
  28. 11 0
      src/main/java/com/its/app/xnetudp/service/CenterCommResponseService.java
  29. 20 0
      src/main/java/com/its/app/xnetudp/thread/CenterCommServerReceiver.java
  30. 3 0
      src/main/resources/META-INF/MANIFEST.MF
  31. 71 0
      src/main/resources/application.properties
  32. 2 0
      src/main/resources/log4jdbc.log4j2.properties
  33. 176 0
      src/main/resources/logback-spring.xml
  34. 45 0
      src/main/resources/mybatis/mapper/Cctv.xml
  35. 66 0
      src/main/resources/mybatis/mapper/UnitSyst.xml
  36. 58 0
      src/main/resources/mybatis/mapper/Wcam.xml
  37. 21 0
      src/main/resources/mybatis/mybatis-config.xml
  38. 53 0
      src/main/resources/static/css/jquery.treegrid.css
  39. 38 0
      src/main/resources/static/js/ajax.js
  40. 1 0
      src/main/resources/static/js/jquery-2.2.4.min.js
  41. 0 0
      src/main/resources/static/js/jquery.treegrid.min.js
  42. 27 0
      src/main/resources/static/js/login.js
  43. 266 0
      src/main/resources/static/js/main.js
  44. 0 0
      src/main/resources/static/js/moment.min.js
  45. 91 0
      src/main/webapp/WEB-INF/jsp/cctv.jsp
  46. 10 0
      src/main/webapp/WEB-INF/jsp/head.jsp
  47. 12 0
      src/main/webapp/WEB-INF/jsp/header.jsp
  48. 60 0
      src/main/webapp/WEB-INF/jsp/log.jsp
  49. 26 0
      src/main/webapp/WEB-INF/jsp/login.jsp
  50. 20 0
      src/main/webapp/WEB-INF/jsp/menu.jsp
  51. 32 0
      src/main/webapp/WEB-INF/jsp/system.jsp
  52. 91 0
      src/main/webapp/WEB-INF/jsp/wcam.jsp
  53. 1 0
      start.bat

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 118 - 0
.mvn/wrapper/MavenWrapperDownloader.java

@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed 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
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+            + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if (mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if (mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if (!outputFile.getParentFile().exists()) {
+            if (!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}

BIN
.mvn/wrapper/maven-wrapper.jar


+ 2 - 0
.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

+ 175 - 0
conf/icmp-ping-server-logback.xml

@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds">
+    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
+
+    <property name="PROJECT_NAME"    value="icmp-ping-server"/>
+    <property name="ROOT_LOG_LEVEL"  value="INFO"/>
+    <property name="LOG_CHARSET"     value="UTF-8" />
+    <property name="LOG_PATH"        value="${user.dir}/logs/"/>
+    <property name="LOG_BACKUP_PATH" value="${user.dir}/logs/backup/"/>
+
+    <property name="LOG_FILE_NAME"             value="${PROJECT_NAME}.log"/>
+    <property name="LOG_FILE_NAME_ERROR"       value="${PROJECT_NAME}.err.log"/>
+    <property name="LOG_FILE_NAME_PATTERN"     value="%d{yyyyMMdd}_%i.log.gz"/>
+    <property name="LOG_FILE_NAME_PACKET"      value="normal"/>
+    <property name="LOG_FILE_NAME_SESSION"     value="icmp-session.log"/>
+    <property name="LOG_FILE_NAME_CENTER_COMM" value="icmp-center-comm.log"/>
+    <property name="LOG_FILE_NAME_SQL"         value="icmp-sql.log"/>
+    <property name="LOG_FILE_NAME_SCHEDULE"    value="icmp-schedule.log"/>
+    <property name="LOG_FILE_NAME_STATISTICS"  value="icmp-statistics.log"/>
+
+    <property name="MAX_FILESIZE" value="10MB"/>
+    <property name="MAX_HISTORY"  value="30"/>
+    <property name="LOG_PATTERN_FILE"        value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_ERROR"       value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%30t] [%5level] %42logger{35}.%-20M ${PID:-} %n%msg%n"/>
+    <property name="LOG_PATTERN_PACKET"      value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_SESSION"     value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_CENTER_COMM" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_SQL"         value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_SCHEDULE"    value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_STATISTICS"  value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_CONSOLE" value="[%d{HH:mm:ss.SSS}] %highlight([%5level]) %highlight(${PID:-}): %cyan(%msg) %n"/>
+
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <withJansi>true</withJansi>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${LOG_PATTERN_CONSOLE}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="PACKET" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <key>id</key>
+            <defaultValue>${LOG_FILE_NAME_PACKET}</defaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${id}" class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <file>${LOG_PATH}icmp-${id}.log</file>
+                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+                    <charset>${LOG_CHARSET}</charset>
+                    <Pattern>${LOG_PATTERN_PACKET}</Pattern>
+                </encoder>
+
+                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+                    <FileNamePattern>${LOG_BACKUP_PATH}${id}.${LOG_FILE_NAME_PATTERN}</FileNamePattern>
+                    <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+                    <maxHistory>${MAX_HISTORY}</maxHistory>
+                </rollingPolicy>
+            </appender>
+        </sift>
+    </appender>
+
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_FILE}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <file>${LOG_PATH}${LOG_FILE_NAME_ERROR}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_ERROR}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME_ERROR}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="CENTER_COMM" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME_CENTER_COMM}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_CENTER_COMM}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}CenterComm/${LOG_FILE_NAME_CENTER_COMM}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="FILE_SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME_SQL}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_SQL}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}SQL/${LOG_FILE_NAME_SQL}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="FILE_SCHEDULE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME_SCHEDULE}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_SCHEDULE}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}Schedule/${LOG_FILE_NAME_SCHEDULE}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <root level="${ROOT_LOG_LEVEL}">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+        <appender-ref ref="ERROR"/>
+    </root>
+
+    <logger name="com.its.app.thread" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="PACKET"/>
+    </logger>
+    <logger name="com.its.app.service" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="PACKET"/>
+    </logger>
+
+    <logger name="com.its.app.scheduler" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE_SCHEDULE"/>
+        <appender-ref ref="ERROR"/>
+    </logger>
+
+    <logger name="com.its.app.xnetwork.udp" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+        <appender-ref ref="CENTER_COMM"/>
+    </logger>
+
+    <!--
+        <logger name="org.apache.ibatis" level="DEBUG" additivity="false">
+            <appender-ref ref="CONSOLE"/>
+            <appender-ref ref="FILE"/>
+            <appender-ref ref="ERROR"/>
+        </logger>
+    -->
+
+    <logger name="jdbc"                level="OFF"   additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.sqlonly"        level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.sqltiming"      level="DEBUG" additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.audit"          level="OFF"   additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.resultset"      level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.resultsettable" level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.connection"     level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+
+</configuration>

+ 43 - 0
conf/icmp-ping-server-tibero.properties

@@ -0,0 +1,43 @@
+#[logging]
+logging.config=conf//icmp-ping-server-logback.xml
+
+# [Application properties]
+process.id=WCM01
+process.name=ICMP Ping Server
+
+#[server config]
+server.threads.dbms=10
+server.threads.work=50
+
+#[server <---> operator]
+server.center.bind.port=6070
+server.center.dump=false
+
+icmp.ping.timeout=5
+
+#[cron tab]
+wcam.crontab = 10 * * * * *
+cctv.crontab = 10 * * * * *
+
+#[Database properties]
+#spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
+spring.datasource.hikari.driver-class-name=com.tmax.tibero.jdbc.TbDriver
+spring.datasource.hikari.jdbc-url=jdbc:tibero:thin:@100.100.10.10:8629:UTIS
+spring.datasource.hikari.username=itsdev
+spring.datasource.hikari.password=itsdev
+
+spring.datasource.hikari.jpool-name=hikari-cp
+spring.datasource.hikari.jmaximum-pool-size=30
+spring.datasource.hikari.jminimum-idle=2
+
+# FOR WEB UI: START
+server.shutdown=graceful
+server.port=80
+server.error.whitelabel.enabled=true
+server.error.include-exception=false
+server.error.include-stacktrace=never
+
+spring.mvc.view.prefix=/WEB-INF/jsp/
+spring.mvc.view.suffix=.jsp
+server.servlet.session.timeout=300
+# FOR WEB UI: END

+ 1 - 0
conf/icmp-ping-server.pid

@@ -0,0 +1 @@
+28308

+ 49 - 0
conf/icmp-ping-server.properties

@@ -0,0 +1,49 @@
+#[logging]
+logging.config=conf//icmp-ping-server-logback.xml
+
+# [Application properties]
+process.id=WCM01
+process.name=ICMP Ping Server
+
+#[server config]
+server.threads.dbms=10
+server.threads.work=50
+
+#[server <---> operator]
+server.center.bind.port=6070
+server.center.dump=false
+
+icmp.ping.timeout=5
+
+#[cron tab]
+wcam.crontab = 10 * * * * *
+cctv.crontab = 10 * * * * *
+
+#[Database properties]
+#spring.datasource.hikari.driver-class-name=com.tmax.tibero.jdbc.TbDriver
+#spring.datasource.hikari.jdbc-url=jdbc:tibero:thin:@192.168.20.29:8629:tibero
+#spring.datasource.hikari.username=gmutis
+#spring.datasource.hikari.password=gmutis
+
+#spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver
+spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
+#spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@127.0.0.1:1521:HANTE
+spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:HANTE
+spring.datasource.hikari.username=gmutis
+spring.datasource.hikari.password=gmutis
+
+spring.datasource.hikari.jpool-name=hikari-cp
+spring.datasource.hikari.jmaximum-pool-size=30
+spring.datasource.hikari.jminimum-idle=2
+
+# FOR WEB UI: START
+server.shutdown=graceful
+server.port=9875
+server.error.whitelabel.enabled=true
+server.error.include-exception=false
+server.error.include-stacktrace=never
+
+spring.mvc.view.prefix=/WEB-INF/jsp/
+spring.mvc.view.suffix=.jsp
+server.servlet.session.timeout=300
+# FOR WEB UI: END

BIN
icmp-ping-server-0.0.1-SNAPSHOT.war


+ 322 - 0
mvnw

@@ -0,0 +1,322 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# 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
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ]; then
+
+  if [ -f /etc/mavenrc ]; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ]; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false
+darwin=false
+mingw=false
+case "$(uname)" in
+CYGWIN*) cygwin=true ;;
+MINGW*) mingw=true ;;
+Darwin*)
+  darwin=true
+  # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+  # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+  if [ -z "$JAVA_HOME" ]; then
+    if [ -x "/usr/libexec/java_home" ]; then
+      export JAVA_HOME="$(/usr/libexec/java_home)"
+    else
+      export JAVA_HOME="/Library/Java/Home"
+    fi
+  fi
+  ;;
+esac
+
+if [ -z "$JAVA_HOME" ]; then
+  if [ -r /etc/gentoo-release ]; then
+    JAVA_HOME=$(java-config --jre-home)
+  fi
+fi
+
+if [ -z "$M2_HOME" ]; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ]; do
+    ls=$(ls -ld "$PRG")
+    link=$(expr "$ls" : '.*-> \(.*\)$')
+    if expr "$link" : '/.*' >/dev/null; then
+      PRG="$link"
+    else
+      PRG="$(dirname "$PRG")/$link"
+    fi
+  done
+
+  saveddir=$(pwd)
+
+  M2_HOME=$(dirname "$PRG")/..
+
+  # make it fully qualified
+  M2_HOME=$(cd "$M2_HOME" && pwd)
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=$(cygpath --unix "$M2_HOME")
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="$( (
+      cd "$M2_HOME"
+      pwd
+    ))"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="$( (
+      cd "$JAVA_HOME"
+      pwd
+    ))"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="$(which javac)"
+  if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=$(which readlink)
+    if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then
+      if $darwin; then
+        javaHome="$(dirname \"$javaExecutable\")"
+        javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac"
+      else
+        javaExecutable="$(readlink -f \"$javaExecutable\")"
+      fi
+      javaHome="$(dirname \"$javaExecutable\")"
+      javaHome=$(expr "$javaHome" : '\(.*\)/bin')
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ]; then
+  if [ -n "$JAVA_HOME" ]; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="$(which java)"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ]; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]; then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ]; do
+    if [ -d "$wdir"/.mvn ]; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=$(
+        cd "$wdir/.."
+        pwd
+      )
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' <"$1")"
+  fi
+}
+
+BASE_DIR=$(find_maven_basedir "$(pwd)")
+if [ -z "$BASE_DIR" ]; then
+  exit 1
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+  if [ "$MVNW_VERBOSE" = true ]; then
+    echo "Found .mvn/wrapper/maven-wrapper.jar"
+  fi
+else
+  if [ "$MVNW_VERBOSE" = true ]; then
+    echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+  fi
+  if [ -n "$MVNW_REPOURL" ]; then
+    jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+  else
+    jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+  fi
+  while IFS="=" read key value; do
+    case "$key" in wrapperUrl)
+      jarUrl="$value"
+      break
+      ;;
+    esac
+  done <"$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+  if [ "$MVNW_VERBOSE" = true ]; then
+    echo "Downloading from: $jarUrl"
+  fi
+  wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+  if $cygwin; then
+    wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
+  fi
+
+  if command -v wget >/dev/null; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found wget ... using wget"
+    fi
+    if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+      wget "$jarUrl" -O "$wrapperJarPath"
+    else
+      wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+    fi
+  elif command -v curl >/dev/null; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found curl ... using curl"
+    fi
+    if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+      curl -o "$wrapperJarPath" "$jarUrl" -f
+    else
+      curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+    fi
+
+  else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Falling back to using Java to download"
+    fi
+    javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+    # For Cygwin, switch paths to Windows format before running javac
+    if $cygwin; then
+      javaClass=$(cygpath --path --windows "$javaClass")
+    fi
+    if [ -e "$javaClass" ]; then
+      if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo " - Compiling MavenWrapperDownloader.java ..."
+        fi
+        # Compiling the Java class
+        ("$JAVA_HOME/bin/javac" "$javaClass")
+      fi
+      if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+        # Running the downloader
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo " - Running MavenWrapperDownloader.java ..."
+        fi
+        ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+      fi
+    fi
+  fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=$(cygpath --path --windows "$M2_HOME")
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 182 - 0
mvnw.cmd

@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%

+ 198 - 0
pom.xml

@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.4.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.its</groupId>
+    <artifactId>icmp-ping-server</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>icmp-ping-server</name>
+    <description>ICMP Ping Server</description>
+
+    <packaging>war</packaging>
+
+    <repositories>
+        <repository>
+            <id>oracle</id>
+            <url>http://maven.jahia.org/maven2</url>
+        </repository>
+    </repositories>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <!-- jar 배포용 -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <!--main 함수가 있는 class 경로-->
+        <start-class>com.its.app.CommunicationServerApplication</start-class>
+        <!--    <webapp.lib>${basedir}/my-repo</webapp.lib> -->
+        <webapp.lib>C://JAVA-Project//repository</webapp.lib>
+    </properties>
+
+    <dependencies>
+        <!-- logback for windows color jansi 1.8 version -->
+        <dependency>
+            <groupId>org.fusesource.jansi</groupId>
+            <artifactId>jansi</artifactId>
+            <version>1.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.its</groupId>
+            <artifactId>its</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${webapp.lib}/its.jar</systemPath>
+        </dependency>
+
+        <dependency>
+            <groupId>com.oracle</groupId>
+            <artifactId>ojdbc7</artifactId>
+            <version>12.1.0.2</version>
+            <scope>system</scope>
+            <systemPath>${webapp.lib}/ojdbc7-12.1.0.2.jar</systemPath>
+        </dependency>
+
+        <dependency>
+            <groupId>tibero6</groupId>
+            <artifactId>tibero6-jdbc</artifactId>
+            <version>1.0.0</version>
+            <scope>system</scope>
+            <systemPath>${webapp.lib}/tibero6-jdbc-14.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>30.1-jre</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.bgee.log4jdbc-log4j2</groupId>
+            <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
+            <version>1.16</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-quartz</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.4</version>
+            <classifier>jdk15</classifier>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-tomcat</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+            <version>4.1.52.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport</artifactId>
+            <version>4.1.52.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.rometools</groupId>
+            <artifactId>rome</artifactId>
+            <version>1.10.0</version>
+        </dependency>
+
+        <!-- FOR WEB UI: START -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <!--
+                <dependency>
+                    <groupId>jstl</groupId>
+                    <artifactId>jstl</artifactId>
+                    <version>1.2</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.tomcat.embed</groupId>
+                    <artifactId>tomcat-embed-jasper</artifactId>
+                </dependency>
+        -->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>jstl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-jasper</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web-services</artifactId>
+        </dependency>
+        <!-- FOR WEB UI: END -->
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 3 - 0
src/main/java/META-INF/MANIFEST.MF

@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.its.app.CommunicationServerApplication
+

+ 114 - 0
src/main/java/com/its/app/CommunicationServerApplication.java

@@ -0,0 +1,114 @@
+package com.its.app;
+
+import com.its.app.config.AppUtils;
+import com.its.app.config.ServerConfig;
+import com.its.app.process.DbmsJobProcess;
+import com.its.app.service.CctvService;
+import com.its.app.service.UnitSystService;
+import com.its.app.service.WcamService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.context.ApplicationPidFileWriter;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@Slf4j
+@EnableAsync
+@Configuration
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.its.app.config", "com.its.app.mapper", "com.its"})
+public class CommunicationServerApplication implements CommandLineRunner, ApplicationListener<ContextClosedEvent>, InitializingBean, DisposableBean {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplicationBuilder()
+                .sources(CommunicationServerApplication.class)
+                .listeners(new ApplicationPidFileWriter("./conf/icmp-ping-server.pid"))
+                .build();
+        application.run(args);
+        //SpringApplication.run(CommunicationServerApplication.class, args);
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+
+        ServerConfig serverConfig = (ServerConfig) AppUtils.getBean(ServerConfig.class);
+        log.info("");
+        log.info("");
+        log.info("************************************************************************************");
+        log.info("**                                                                                **");
+        log.info("**                         Intelligent Traffic System                             **");
+        log.info("**                          ICMP Ping Server Program.                             **");
+        log.info("**                                                                                **");
+        log.info("**                                                                   [ver.1.0]    **");
+        log.info("**          {}", serverConfig.getProcessId());
+        log.info("** startup: {}", serverConfig.getBootingDateTime());
+        log.info("************************************************************************************");
+
+        // init application
+        DbmsJobProcess dbmsJobProcess = (DbmsJobProcess)AppUtils.getBean(DbmsJobProcess.class);
+        dbmsJobProcess.run();
+
+        UnitSystService unitSystService = (UnitSystService)AppUtils.getBean(UnitSystService.class);
+        unitSystService.loadMaster();
+        unitSystService.updateUnitSyst(true);
+
+        CctvService cctvService = (CctvService)AppUtils.getBean(CctvService.class);
+        cctvService.loadDb();
+        cctvService.doJob();
+
+        WcamService wcamService = (WcamService)AppUtils.getBean(WcamService.class);
+        wcamService.loadDb();
+        wcamService.doJob();
+
+        //UdpServerCenterComm udpServerCenterComm = (UdpServerCenterComm)AppUtils.getBean(UdpServerCenterComm.class);
+        //udpServerCenterComm.run();
+
+        // schedule enable
+        serverConfig.setStartSchedule(true);
+    }
+
+    @Override
+    public void onApplicationEvent(ContextClosedEvent event) {
+        log.error("Application Terminated: {}", event.getTimestamp());
+        UnitSystService unitSystService = (UnitSystService) AppUtils.getBean(UnitSystService.class);
+        unitSystService.updateUnitSyst(false);
+
+        CctvService cctvService = (CctvService)AppUtils.getBean(CctvService.class);
+        cctvService.updateCtlrStts(false);
+        
+        WcamService wcamService = (WcamService)AppUtils.getBean(WcamService.class);
+        wcamService.updateCtlrStts(false);
+
+        //UdpServerCenterComm udpServerCenterComm = (UdpServerCenterComm)AppUtils.getBean(UdpServerCenterComm.class);
+        //udpServerCenterComm.getNioEventLoopGroup().shutdownGracefully();
+    }
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        //System.err.println("InitializingBean 인터페이스 구현 메서드입니다. 'Bean'이 생성될 때 마다 호출되는 메서드 입니다.");
+    }
+    @Override
+    public void destroy() throws Exception {
+        //System.err.println("DisposableBean 인터페이스 구현 메서드입니다. 'Bean'이 소멸될 때 마다 호출되는 메서드입니다");
+    }
+
+    /*@Bean
+    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
+        return args -> {
+            System.out.println("Let's inspect the beans provided by Spring Boot:");
+            String[] beanNames = ctx.getBeanDefinitionNames();
+            Arrays.sort(beanNames);
+            for (String beanName : beanNames) {
+                System.out.println(beanName);
+            }
+        };
+    }*/
+
+}

+ 26 - 0
src/main/java/com/its/app/config/ServerConfig.java

@@ -0,0 +1,26 @@
+package com.its.app.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+@Slf4j
+@Getter
+@Setter
+@ToString
+@Configuration
+public class ServerConfig extends AbstractServerConfig {
+    /*
+     *  For Application Server
+     */
+
+    @PostConstruct
+    private void init() {
+        postConstruct();
+    }
+
+}

+ 15 - 0
src/main/java/com/its/app/mapper/CctvMapper.java

@@ -0,0 +1,15 @@
+package com.its.app.mapper;
+
+import com.its.app.vo.voIcmpCtlr;
+import com.its.app.vo.voIcmpCtlrStts;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public abstract interface CctvMapper {
+
+    public abstract List<voIcmpCtlr> selectAll();
+    public abstract int updateStts(@Param("stts") voIcmpCtlrStts obj);
+}

+ 15 - 0
src/main/java/com/its/app/mapper/WcamMapper.java

@@ -0,0 +1,15 @@
+package com.its.app.mapper;
+
+import com.its.app.vo.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public abstract interface WcamMapper {
+
+    public abstract List<voIcmpCtlr> selectAll();
+    public abstract int updateStts(@Param("stts") voIcmpCtlrStts obj);
+    public abstract int insertSttsHs(@Param("stts") voIcmpCtlrStts obj);
+}

+ 46 - 0
src/main/java/com/its/app/process/DbmsJobProcess.java

@@ -0,0 +1,46 @@
+package com.its.app.process;
+
+import com.its.app.config.AppUtils;
+import com.its.app.mapper.CctvMapper;
+import com.its.app.mapper.WcamMapper;
+import com.its.app.vo.voIcmpCtlrStts;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service("dbmsJobProcess")
+public class DbmsJobProcess extends AbstractDbmsJobProcess {
+
+    private WcamMapper wcamMapper;
+    private CctvMapper cctvMapper;
+
+    @Override
+    protected void postConstruct() {
+        this.wcamMapper = (WcamMapper) AppUtils.getBean(WcamMapper.class);
+        this.cctvMapper = (CctvMapper) AppUtils.getBean(CctvMapper.class);
+    }
+
+    @Override
+    public void process(DbmsJobData data) {
+
+        try {
+            int type = data.getType();
+            switch(type) {
+                case DbmsJobType.DATA_TYPE_WCAM_STTS:
+                    voIcmpCtlrStts wcamStts = (voIcmpCtlrStts)data.getData();
+                    this.wcamMapper.updateStts(wcamStts);
+                    if (data.isHistory()) {
+                        this.wcamMapper.insertSttsHs(wcamStts);
+                    }
+                    break;
+                case DbmsJobType.DATA_TYPE_CCTV_STTS:
+                    voIcmpCtlrStts cctvStts = (voIcmpCtlrStts)data.getData();
+                    this.cctvMapper.updateStts(cctvStts);
+                    break;
+            }
+        } catch (Exception e) {
+            log.error("DbmsJobProcess.process: Exception: {}", e.toString());
+        }
+    }
+
+}

+ 11 - 0
src/main/java/com/its/app/process/DbmsJobType.java

@@ -0,0 +1,11 @@
+package com.its.app.process;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class DbmsJobType {
+    public static final int DATA_TYPE_WCAM_STTS = 1;
+    public static final int DATA_TYPE_CCTV_STTS= 2;
+}

+ 33 - 0
src/main/java/com/its/app/repository/AppRepository.java

@@ -0,0 +1,33 @@
+package com.its.app.repository;
+
+import com.its.app.vo.voIcmpCtlr;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+@Getter
+@Setter
+@Slf4j
+public class AppRepository {
+    private static AppRepository _instance = null;
+
+    public ConcurrentHashMap<String, voIcmpCtlr> wcamCtlrMap = null;
+    public ConcurrentHashMap<String, voIcmpCtlr> cctvCtlrMap = null;
+
+    public static AppRepository getInstance() {
+        if (_instance == null) {
+            synchronized (AppRepository.class) {
+                if (_instance == null)
+                    _instance = new AppRepository();
+            }
+        }
+        return _instance;
+    }
+
+    public AppRepository() {
+        this.wcamCtlrMap = new ConcurrentHashMap<>();
+        this.cctvCtlrMap = new ConcurrentHashMap<>();
+    }
+}

+ 74 - 0
src/main/java/com/its/app/scheduler/SchedulerTask.java

@@ -0,0 +1,74 @@
+package com.its.app.scheduler;
+
+import com.its.app.config.ServerConfig;
+import com.its.app.service.CctvService;
+import com.its.app.service.UnitSystService;
+import com.its.app.service.WcamService;
+import com.its.utils.Elapsed;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+
+@Slf4j
+@EnableScheduling
+@Component("schedulerTask")
+public class SchedulerTask {
+
+    private final ServerConfig serverConfig;
+    private final UnitSystService unitSystService;
+    private final WcamService wcamService;
+    private final CctvService cctvService;
+
+    public SchedulerTask(ServerConfig serverConfig, UnitSystService unitSystService, WcamService wcamService, CctvService cctvService) {
+        this.serverConfig = serverConfig;
+        this.unitSystService = unitSystService;
+        this.wcamService = wcamService;
+        this.cctvService = cctvService;
+    }
+
+    //@Scheduled(cron = "*/10 * * * * *") //==> 10초마다 실행
+    @Scheduled(cron = "2 * * * * ?")  // 1분주기 작업 실행
+    public void UnitSystSchedule() {
+        if (!this.serverConfig.isStartSchedule()) {
+            return;
+        }
+        Elapsed elapsed = new Elapsed();
+        log.info("UnitSystSchedule :: start. {}", Thread.currentThread().getName());
+
+        // 1. 프로세스 상태정보 업데이트
+        this.unitSystService.updateUnitSyst(true);
+
+        log.info("UnitSystSchedule :: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+    }
+
+    @Scheduled(cron = "${wcam.crontab:0 10 * * * *}")
+    public void WcamSchedule() {
+        if (!this.serverConfig.isStartSchedule()) {
+            return;
+        }
+        Elapsed elapsed = new Elapsed();
+        log.info("WcamSchedule :: start. {}", Thread.currentThread().getName());
+        this.wcamService.doJob();
+        log.info("WcamSchedule :: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+    }
+
+    @Scheduled(cron = "${cctv.crontab:0 15 * * * *}")
+    public void CctvSchedule() {
+        if (!this.serverConfig.isStartSchedule()) {
+            return;
+        }
+        Elapsed elapsed = new Elapsed();
+        log.info("CctvSchedule :: start. {}", Thread.currentThread().getName());
+        this.cctvService.doJob();
+        log.info("CctvSchedule :: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+    }
+
+    @PreDestroy
+    public void onShutDown() {
+        this.unitSystService.updateUnitSyst(false);
+        log.info("onShutDown updateUnitSyst");
+    }
+}

+ 112 - 0
src/main/java/com/its/app/service/CctvService.java

@@ -0,0 +1,112 @@
+package com.its.app.service;
+
+import com.its.app.config.AppUtils;
+import com.its.app.mapper.CctvMapper;
+import com.its.app.process.DbmsJobType;
+import com.its.app.repository.AppRepository;
+import com.its.app.thread.IcmpPingThread;
+import com.its.app.vo.voIcmpCtlr;
+import com.its.app.vo.voIcmpCtlrStts;
+import com.its.utils.SysUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Service("cctvService")
+@Transactional(rollbackFor = {Exception.class})
+public class CctvService {
+
+    private CctvMapper ctlrMapper;
+    private ConcurrentHashMap<String, voIcmpCtlr> icmpCtlrMap = null;
+
+    @PostConstruct
+    private void init() {
+        log.info("CctvService.init");
+        this.ctlrMapper = (CctvMapper) AppUtils.getBean(CctvMapper.class);
+        this.icmpCtlrMap = new ConcurrentHashMap<>();
+        //loadDb();
+        //doJob();
+    }
+
+    public void loadDb() {
+        try {
+            List<voIcmpCtlr> infoList = this.ctlrMapper.selectAll();
+            for (voIcmpCtlr obj: infoList) {
+                this.icmpCtlrMap.put(obj.getCTLR_NMBR(), obj);
+            }
+            AppRepository.getInstance().setCctvCtlrMap(this.icmpCtlrMap);
+        }
+        catch (Exception e) {
+            log.error("CctvService.loadDb: Exception: {}", e.toString());
+        }
+    }
+
+     public void initJob() {
+        try {
+            for (Map.Entry<String, voIcmpCtlr> obj : this.icmpCtlrMap.entrySet()) {
+                obj.getValue().setDEL_YN("Y");
+            }
+            loadDb();
+        }
+        catch (Exception e) {
+            log.error("CctvService.initJob: Exception: {}", e.toString());
+        }
+    }
+
+    public void doJob() {
+        String keyData = "cctv";
+        MDC.put("id", keyData);
+        log.info("CctvService.doJob Start...");
+
+        boolean insHs = false;
+        Calendar cal = Calendar.getInstance();
+        int min = cal.get(Calendar.MINUTE);
+        if ((min % 5) == 0) {
+            insHs = true;
+            initJob();
+        }
+        String UPDT_DT = SysUtils.getSysTime();
+
+        for (Map.Entry<String, voIcmpCtlr> obj : this.icmpCtlrMap.entrySet()) {
+            if (obj.getValue().getDEL_YN().equals("Y")) {
+                log.info("CctvService.doJob: app CCTV: {}, {}, {}, DELETED.", obj.getValue().getCTLR_NMBR(), obj.getValue().getISTL_LCTN_NM(), obj.getValue().getCTLR_IP());
+                continue;
+            }
+            //log.info("CctvService.doJob: app CCTV: {}, {}, {}", obj.getValue().getCTLR_NMBR(), obj.getValue().getISTL_LCTN_NM(), obj.getValue().getCTLR_IP());
+            IcmpPingThread handler = (IcmpPingThread) AppUtils.getBean(IcmpPingThread.class);
+            handler.run(DbmsJobType.DATA_TYPE_CCTV_STTS, insHs, UPDT_DT, obj.getValue());
+        }
+        log.info("CctvService.doJob ..End...");
+        MDC.remove(keyData);
+        MDC.clear();
+    }
+
+    public void updateCtlrStts(boolean isRun) {
+        String keyData = "cctv";
+        MDC.put("id", keyData);
+
+        String UPDT_DT = SysUtils.getSysTime();
+
+        for (Map.Entry<String, voIcmpCtlr> obj : this.icmpCtlrMap.entrySet()) {
+            if (obj.getValue().getDEL_YN().equals("Y")) {
+                log.info("CctvService.doJob: app CCTV: {}, {}, {}, DELETED.", obj.getValue().getCTLR_NMBR(), obj.getValue().getISTL_LCTN_NM(), obj.getValue().getCTLR_IP());
+                continue;
+            }
+            voIcmpCtlrStts stts = new voIcmpCtlrStts();
+            stts.setCTLR_NMBR(obj.getValue().getCTLR_NMBR());
+            stts.setUPDT_DT(UPDT_DT);
+            stts.setCMNC_STTS_CD("CMS1");   // 비정상으로 기본 설정
+            this.ctlrMapper.updateStts(stts);
+        }
+        MDC.remove(keyData);
+        MDC.clear();
+    }
+}

+ 122 - 0
src/main/java/com/its/app/service/WcamService.java

@@ -0,0 +1,122 @@
+package com.its.app.service;
+
+import com.its.app.config.AppUtils;
+import com.its.app.mapper.WcamMapper;
+import com.its.app.process.DbmsJobType;
+import com.its.app.repository.AppRepository;
+import com.its.app.thread.IcmpPingThread;
+import com.its.app.vo.voIcmpCtlr;
+import com.its.app.vo.voIcmpCtlrStts;
+import com.its.utils.SysUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Service("wcamService")
+@Transactional(rollbackFor = {Exception.class})
+public class WcamService {
+
+    private WcamMapper ctlrMapper;
+    private ConcurrentHashMap<String, voIcmpCtlr> icmpCtlrMap = null;
+
+    @PostConstruct
+    private void init() {
+        log.info("WcamService.init");
+        this.ctlrMapper = (WcamMapper) AppUtils.getBean(WcamMapper.class);
+        this.icmpCtlrMap = new ConcurrentHashMap<>();
+        //loadDb();
+        //doJob();
+    }
+
+    public void loadDb() {
+        try {
+            List<voIcmpCtlr> infoList = this.ctlrMapper.selectAll();
+            for (voIcmpCtlr obj: infoList) {
+                this.icmpCtlrMap.put(obj.getCTLR_NMBR(), obj);
+            }
+            AppRepository.getInstance().setWcamCtlrMap(this.icmpCtlrMap);
+        }
+        catch (Exception e) {
+            log.error("WcamService.loadDb: Exception: {}", e.toString());
+        }
+    }
+
+    public void initJob() {
+        try {
+            for (Map.Entry<String, voIcmpCtlr> obj : this.icmpCtlrMap.entrySet()) {
+                obj.getValue().setDEL_YN("Y");
+            }
+            loadDb();
+        }
+        catch (Exception e) {
+            log.error("WcamService.initJob: Exception: {}", e.toString());
+        }
+    }
+
+    public void doJob() {
+        String keyData = "wcam";
+        MDC.put("id", keyData);
+        log.info("WcamService.doJob: Start...");
+
+        boolean insHs = false;
+        Calendar cal = Calendar.getInstance();
+        int min = cal.get(Calendar.MINUTE);
+        if ((min % 5) == 0) {
+            insHs = true;
+            initJob();
+        }
+        String UPDT_DT = SysUtils.getSysTime();
+
+        for (Map.Entry<String, voIcmpCtlr> obj : this.icmpCtlrMap.entrySet()) {
+            if (obj.getValue().getDEL_YN().equals("Y")) {
+                log.info("WcamService.doJob: app WCAM: {}, {}, {}, DELETED.", obj.getValue().getCTLR_NMBR(), obj.getValue().getISTL_LCTN_NM(), obj.getValue().getCTLR_IP());
+                continue;
+            }
+            //log.info("WcamService.doJob: app WCAM: {}, {}, {}", obj.getValue().getCTLR_NMBR(), obj.getValue().getISTL_LCTN_NM(), obj.getValue().getCTLR_IP());
+            IcmpPingThread handler = (IcmpPingThread) AppUtils.getBean(IcmpPingThread.class);
+            handler.run(DbmsJobType.DATA_TYPE_WCAM_STTS, insHs, UPDT_DT, obj.getValue());
+        }
+        log.info("WcamService.doJob: ..End...");
+        MDC.remove(keyData);
+        MDC.clear();
+    }
+
+    public void updateCtlrStts(boolean isRun) {
+        String keyData = "wcam";
+        MDC.put("id", keyData);
+
+        boolean insHs = false;
+        Calendar cal = Calendar.getInstance();
+        int min = cal.get(Calendar.MINUTE);
+        if ((min % 5) == 0) {
+            insHs = true;
+            initJob();
+        }
+        String UPDT_DT = SysUtils.getSysTime();
+
+        for (Map.Entry<String, voIcmpCtlr> obj : this.icmpCtlrMap.entrySet()) {
+            if (obj.getValue().getDEL_YN().equals("Y")) {
+                log.info("WcamService.doJob: app WCAM: {}, {}, {}, DELETED.", obj.getValue().getCTLR_NMBR(), obj.getValue().getISTL_LCTN_NM(), obj.getValue().getCTLR_IP());
+                continue;
+            }
+            voIcmpCtlrStts stts = new voIcmpCtlrStts();
+            stts.setCTLR_NMBR(obj.getValue().getCTLR_NMBR());
+            stts.setUPDT_DT(UPDT_DT);
+            stts.setCMNC_STTS_CD("CMS1");   // 비정상으로 기본 설정
+            this.ctlrMapper.updateStts(stts);
+            if (insHs) {
+                this.ctlrMapper.insertSttsHs(stts);
+            }
+        }
+        MDC.remove(keyData);
+        MDC.clear();
+    }
+}

+ 77 - 0
src/main/java/com/its/app/thread/IcmpPingThread.java

@@ -0,0 +1,77 @@
+package com.its.app.thread;
+
+import com.its.app.config.AppUtils;
+import com.its.app.process.DbmsJobData;
+import com.its.app.process.DbmsJobProcess;
+import com.its.app.process.DbmsJobType;
+import com.its.app.vo.voIcmpCtlr;
+import com.its.app.vo.voIcmpCtlrStts;
+import com.its.utils.Ping;
+import com.its.utils.SysUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service("icmpPingThread")
+public class IcmpPingThread {
+
+    @Value("${icmp.ping.timeout:#{5}}")
+    private int pingTimeout;
+
+    @Async("icmpPingExecutor")
+    public void run(int type, boolean isHistory, String UPDT_DT, voIcmpCtlr obj) {
+
+        String keyData = "wcam";
+        if (type == DbmsJobType.DATA_TYPE_CCTV_STTS) {
+            keyData = "cctv";
+        }
+        MDC.put("id", keyData);
+
+        voIcmpCtlrStts stts = new voIcmpCtlrStts();
+        stts.setCTLR_NMBR(obj.getCTLR_NMBR());
+        stts.setUPDT_DT(UPDT_DT);
+        stts.setCMNC_STTS_CD("CMS1");   // 비정상으로 기본 설정
+
+        boolean isReachable = false;
+        long startTm = System.nanoTime();
+        long endTm = System.nanoTime();
+        log.info("{}, {}, {}, {}, app try. timeout: {} sec. {}", keyData, obj.getCTLR_NMBR(), obj.getISTL_LCTN_NM(), obj.getCTLR_IP(),
+                this.pingTimeout, Thread.currentThread().getName());
+        try {
+            isReachable = Ping.isReachable(obj.getCTLR_IP(), this.pingTimeout);
+            endTm = System.nanoTime();
+            if (isReachable ) {
+                stts.setCMNC_STTS_CD("CMS0");
+                log.info("{}, {}, {}, {}, is alive. {} ms.", keyData, obj.getCTLR_NMBR(), obj.getISTL_LCTN_NM(), obj.getCTLR_IP(), (endTm - startTm) / 1000000);
+            }
+            else {
+                log.error("{}, {}, {}, {}, is not alive. {} ms.", keyData, obj.getCTLR_NMBR(), obj.getISTL_LCTN_NM(), obj.getCTLR_IP(), (endTm - startTm) / 1000000);
+            }
+        }
+        catch (Exception e) {
+            log.error("{}, {}, {}, {}, Exception: {}", keyData, obj.getCTLR_NMBR(), obj.getISTL_LCTN_NM(), obj.getCTLR_IP(), e.toString());
+        }
+
+        if (isReachable) {
+            obj.setNetState(1);
+        }
+        else {
+            obj.setNetState(0);
+        }
+        obj.setReachable(isReachable);
+        obj.setPingTime(SysUtils.getSysTimeStr());
+
+        DbmsJobProcess icmpPingDataProcess = (DbmsJobProcess) AppUtils.getBean(DbmsJobProcess.class);
+        icmpPingDataProcess.add(new DbmsJobData(type, false, stts));
+        if (isHistory) {
+            icmpPingDataProcess.add(new DbmsJobData(type, true, stts));
+        }
+
+        MDC.remove(keyData);
+        MDC.clear();
+    }
+
+}

+ 23 - 0
src/main/java/com/its/app/vo/voIcmpCtlr.java

@@ -0,0 +1,23 @@
+package com.its.app.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+public class voIcmpCtlr {
+    // Type, MngrNo, ID, Name, IP Address, Last Time, 상태
+    private String CTLR_NMBR;
+    private String CTLR_ID;
+    private String ISTL_LCTN_NM;
+    private String CTLR_IP;
+    private String TYPE_CD;
+    private String TYPE_NM;
+    private String DEL_YN;
+
+    private int     netState;
+    private boolean isReachable;
+    private String  pingTime;
+}

+ 14 - 0
src/main/java/com/its/app/vo/voIcmpCtlrStts.java

@@ -0,0 +1,14 @@
+package com.its.app.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+public class voIcmpCtlrStts {
+    private String CTLR_NMBR;
+    private String CMNC_STTS_CD;
+    private String UPDT_DT;
+}

+ 84 - 0
src/main/java/com/its/app/webapp/controller/WebAppController.java

@@ -0,0 +1,84 @@
+package com.its.app.webapp.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.its.app.config.ServerConfig;
+import com.its.app.repository.AppRepository;
+import com.its.app.vo.voIcmpCtlr;
+import com.its.app.webapp.service.FileService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+@Slf4j
+@Controller
+public class WebAppController {
+
+    private final ResourceLoader resourceLoader;
+    private final ServerConfig serverConfig;
+    private final FileService fileService;
+
+    public WebAppController(ResourceLoader resourceLoader, ServerConfig serverConfig, FileService fileService) {
+        this.resourceLoader = resourceLoader;
+        this.serverConfig = serverConfig;
+        this.fileService = fileService;
+    }
+
+    @RequestMapping(value = {"/cctv"})
+    public String cctv(Model model, HttpServletRequest request) {
+        String result = "cctv";
+        SortedMap<Integer, voIcmpCtlr> ctlrMap = new TreeMap<>();
+        for (Map.Entry<String, voIcmpCtlr> e : AppRepository.getInstance().getCctvCtlrMap().entrySet()) {
+            voIcmpCtlr obj = e.getValue();
+            ctlrMap.put(Integer.valueOf(obj.getCTLR_NMBR()), obj);
+        }
+        model.addAttribute("ServerConfig", this.serverConfig);
+        //model.addAttribute("list", AppRepository.getInstance().getCtlrMap().entrySet());
+        model.addAttribute("list", ctlrMap);
+        model.addAttribute("ServerTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        ObjectMapper mapper = new ObjectMapper();
+        String jsonList = "";
+        try {
+            jsonList = mapper.writeValueAsString(AppRepository.getInstance().getCctvCtlrMap());
+        }
+        catch (IOException e) {
+            log.error("WebAppController.logFiles: Exception: {}", e.toString());
+        }
+        model.addAttribute("objList", jsonList);
+        return result;
+    }
+
+    @RequestMapping(value = {"/wcam"})
+    public String wcam(Model model, HttpServletRequest request) {
+        String result = "wcam";
+        SortedMap<Integer, voIcmpCtlr> ctlrMap = new TreeMap<>();
+        for (Map.Entry<String, voIcmpCtlr> e : AppRepository.getInstance().getWcamCtlrMap().entrySet()) {
+            voIcmpCtlr obj = e.getValue();
+            ctlrMap.put(Integer.valueOf(obj.getCTLR_NMBR()), obj);
+        }
+        model.addAttribute("ServerConfig", this.serverConfig);
+        //model.addAttribute("list", AppRepository.getInstance().getCtlrMap().entrySet());
+        model.addAttribute("list", ctlrMap);
+        model.addAttribute("ServerTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        ObjectMapper mapper = new ObjectMapper();
+        String jsonList = "";
+        try {
+            jsonList = mapper.writeValueAsString(AppRepository.getInstance().getWcamCtlrMap());
+        }
+        catch (IOException e) {
+            log.error("WebAppController.logFiles: Exception: {}", e.toString());
+        }
+        model.addAttribute("objList", jsonList);
+        return result;
+    }
+
+}

+ 11 - 0
src/main/java/com/its/app/xnetudp/service/CenterCommResponseService.java

@@ -0,0 +1,11 @@
+package com.its.app.xnetudp.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service("centerCommResponseService")
+public class CenterCommResponseService {
+
+    // 운영단말로 전송할 경우 여기에서 처리
+}

+ 20 - 0
src/main/java/com/its/app/xnetudp/thread/CenterCommServerReceiver.java

@@ -0,0 +1,20 @@
+package com.its.app.xnetudp.thread;
+
+import com.its.app.xnetudp.protocol.CENTER_COMM_MESSAGE;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service("centerCommServerReceiver")
+public class CenterCommServerReceiver extends AbstractCenterCommServerReceiver {
+
+    @Override
+    public void run(CENTER_COMM_MESSAGE data) {
+        if (data == null) {
+            log.error("CenterCommServerReceiver: RECV Data Packet NULL");
+            return;
+        }
+
+        // 운영단말로 부터 수신한 데이터를 여기서 처리
+    }
+}

+ 3 - 0
src/main/resources/META-INF/MANIFEST.MF

@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.its.app.CommunicationServerApplication
+

+ 71 - 0
src/main/resources/application.properties

@@ -0,0 +1,71 @@
+#[logging]
+spring.devtools.livereload.enabled:false
+logging.config=classpath:logback-spring.xml
+#logging.config=conf//icmp-ping-server-logback.xml
+
+# [Application properties]
+process.id=WCM01
+process.name=ICMP Ping Server
+
+#[server config]
+server.user.id=1
+server.user.pswd=1
+server.threads.dbms=10
+server.threads.work=50
+
+icmp.ping.timeout=5
+
+#[cron tab]
+wcam.crontab = 10 * * * * *
+cctv.crontab = 10 * * * * *
+
+#[Database properties]
+#spring.datasource.hikari.driver-class-name=com.tmax.tibero.jdbc.TbDriver
+#spring.datasource.hikari.jdbc-url=jdbc:tibero:thin:@192.168.20.29:8629:tibero
+#spring.datasource.hikari.username=gmutis
+#spring.datasource.hikari.password=gmutis
+
+#spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver
+spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
+#spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@127.0.0.1:1521:HANTE
+spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:HANTE
+spring.datasource.hikari.username=gmutis
+spring.datasource.hikari.password=gmutis
+
+spring.datasource.hikari.jpool-name=hikari-cp
+spring.datasource.hikari.jmaximum-pool-size=30
+spring.datasource.hikari.jminimum-idle=2
+
+
+#spring.datasource.hikari.driverClassName=oracle.jdbc.OracleDriver
+#spring.datasource.validation-query=SELECT 1 FROM DUAL
+#spring.datasource.default-isolation-level=DEFAULT
+#spring.datasource.dbcp2.initial-size = 50
+#spring.datasource.dbcp2.max-idle = 50
+#spring.datasource.dbcp2.default-query-timeout = 10000
+#spring.datasource.dbcp2.default-auto-commit = true
+
+#spring.datasource.type=com.zaxxer.hikari.HikariDataSource
+#spring.datasource.hikari.driver-class-name=org.h2.Driver
+#spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb
+#spring.datasource.hikari.username=sa
+#spring.datasource.hikari.password=password
+#spring.datasource.hikari.max-wait=10000
+#spring.datasource.hikari.connection-timeout=30000
+#spring.datasource.hikari.idle-timeout=600000
+#spring.datasource.hikari.max-lifetime=1800000
+#spring.datasource.hikari.leak-detection-threshold=600000
+#spring.datasource.hikari.maximum-pool-size=100
+#spring.datasource.hikari.pool-name=MyDataSourcePoolName
+
+# FOR WEB UI: START
+server.shutdown=graceful
+server.port=9875
+server.error.whitelabel.enabled=true
+server.error.include-exception=false
+server.error.include-stacktrace=never
+
+spring.mvc.view.prefix=/WEB-INF/jsp/
+spring.mvc.view.suffix=.jsp
+server.servlet.session.timeout=300
+# FOR WEB UI: END

+ 2 - 0
src/main/resources/log4jdbc.log4j2.properties

@@ -0,0 +1,2 @@
+log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
+log4jdbc.dump.sql.maxlinelength=0

+ 176 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds">
+    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
+
+    <property name="PROJECT_NAME"    value="icmp-ping-server"/>
+    <property name="ROOT_LOG_LEVEL"  value="INFO"/>
+    <property name="LOG_CHARSET"     value="UTF-8" />
+    <property name="LOG_PATH"        value="${user.dir}/logs/"/>
+    <property name="LOG_BACKUP_PATH" value="${user.dir}/logs/backup/"/>
+
+    <property name="LOG_FILE_NAME"             value="${PROJECT_NAME}.log"/>
+    <property name="LOG_FILE_NAME_ERROR"       value="${PROJECT_NAME}.err.log"/>
+    <property name="LOG_FILE_NAME_PATTERN"     value="%d{yyyyMMdd}_%i.log.gz"/>
+    <property name="LOG_FILE_NAME_PACKET"      value="normal"/>
+    <property name="LOG_FILE_NAME_SESSION"     value="icmp-session.log"/>
+    <property name="LOG_FILE_NAME_CENTER_COMM" value="icmp-center-comm.log"/>
+    <property name="LOG_FILE_NAME_SQL"         value="icmp-sql.log"/>
+    <property name="LOG_FILE_NAME_SCHEDULE"    value="icmp-schedule.log"/>
+    <property name="LOG_FILE_NAME_STATISTICS"  value="icmp-statistics.log"/>
+
+    <property name="MAX_FILESIZE" value="10MB"/>
+    <property name="MAX_HISTORY"  value="30"/>
+    <property name="LOG_PATTERN_FILE"        value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_ERROR"       value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%30t] [%5level] %42logger{35}.%-20M ${PID:-} %n%msg%n"/>
+    <property name="LOG_PATTERN_PACKET"      value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_SESSION"     value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_CENTER_COMM" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_SQL"         value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_SCHEDULE"    value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_STATISTICS"  value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
+    <property name="LOG_PATTERN_CONSOLE" value="[%d{HH:mm:ss.SSS}] %highlight([%5level]) %highlight(${PID:-}): %cyan(%msg) %n"/>
+
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <withJansi>true</withJansi>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_CONSOLE}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="PACKET" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <key>id</key>
+            <defaultValue>${LOG_FILE_NAME_PACKET}</defaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${id}" class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <file>${LOG_PATH}icmp-${id}.log</file>
+                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+                    <charset>${LOG_CHARSET}</charset>
+                    <Pattern>${LOG_PATTERN_PACKET}</Pattern>
+                </encoder>
+
+                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+                    <FileNamePattern>${LOG_BACKUP_PATH}${id}.${LOG_FILE_NAME_PATTERN}</FileNamePattern>
+                    <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+                    <maxHistory>${MAX_HISTORY}</maxHistory>
+                </rollingPolicy>
+            </appender>
+        </sift>
+    </appender>
+
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_FILE}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <file>${LOG_PATH}${LOG_FILE_NAME_ERROR}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_ERROR}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME_ERROR}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="CENTER_COMM" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME_CENTER_COMM}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_CENTER_COMM}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}CenterComm/${LOG_FILE_NAME_CENTER_COMM}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="FILE_SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME_SQL}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_SQL}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}SQL/${LOG_FILE_NAME_SQL}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <appender name="FILE_SCHEDULE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}${LOG_FILE_NAME_SCHEDULE}</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>${LOG_CHARSET}</charset>
+            <pattern>${LOG_PATTERN_SCHEDULE}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_BACKUP_PATH}Schedule/${LOG_FILE_NAME_SCHEDULE}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
+            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <root level="${ROOT_LOG_LEVEL}">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+        <appender-ref ref="ERROR"/>
+    </root>
+
+    <logger name="com.its.app.thread" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="PACKET"/>
+    </logger>
+    <logger name="com.its.app.service" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="PACKET"/>
+    </logger>
+
+    <logger name="com.its.app.scheduler" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE_SCHEDULE"/>
+        <appender-ref ref="ERROR"/>
+    </logger>
+
+    <logger name="com.its.app.xnetwork.udp" level="DEBUG" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+        <appender-ref ref="CENTER_COMM"/>
+    </logger>
+
+    <!--
+        <logger name="org.apache.ibatis" level="DEBUG" additivity="false">
+            <appender-ref ref="CONSOLE"/>
+            <appender-ref ref="FILE"/>
+            <appender-ref ref="ERROR"/>
+        </logger>
+    -->
+
+    <logger name="jdbc"                level="OFF"   additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.sqlonly"        level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.sqltiming"      level="DEBUG" additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.audit"          level="OFF"   additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.resultset"      level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.resultsettable" level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+    <logger name="jdbc.connection"     level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="ERROR"/> </logger>
+
+</configuration>

+ 45 - 0
src/main/resources/mybatis/mapper/Cctv.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.its.app.mapper.CctvMapper">
+
+    <select id="selectAll" resultType="com.its.app.vo.voIcmpCtlr">
+    <![CDATA[
+	    SELECT A.CCTV_MNGM_NMBR AS CTLR_NMBR,
+               A.CCTV_CTLR_ID   AS CTLR_ID,
+               A.ISTL_LCTN_NM   AS ISTL_LCTN_NM,
+               A.CCTV_CTLR_IP   AS CTLR_IP,
+               A.CCTV_TYPE      AS TYPE_CD,
+               DECODE(A.CCTV_TYPE, '1', '일반_1',
+                                   '2', '기타_2',
+                                   '3', '기타_3',
+                                        '기타_X') AS TYPE_NM,
+               A.DEL_YN AS DEL_YN
+          FROM TB_CCTV_CTLR A
+         WHERE A.DEL_YN = 'N'
+           AND A.CCTV_TYPE <> '1'
+    ]]>
+    </select>
+
+    <update id="updateStts" parameterType="com.its.app.vo.voIcmpCtlrStts">
+    <![CDATA[
+        MERGE INTO TB_CCTV_STTS L
+        USING (SELECT #{stts.CTLR_NMBR}    AS CCTV_MNGM_NMBR,
+                      #{stts.UPDT_DT}      AS UPDT_DT,
+                      #{stts.CMNC_STTS_CD} AS CMNC_STTS_CD
+                 FROM DUAL) M
+        ON (L.CCTV_MNGM_NMBR = M.CCTV_MNGM_NMBR)
+        WHEN MATCHED THEN
+            UPDATE SET L.UPDT_DT      = M.UPDT_DT,
+                       L.CMNC_STTS_CD = M.CMNC_STTS_CD
+        WHEN NOT MATCHED THEN
+            INSERT (L.CCTV_MNGM_NMBR,
+                    L.UPDT_DT,
+                    L.CMNC_STTS_CD)
+            VALUES (M.CCTV_MNGM_NMBR,
+                    M.UPDT_DT,
+                    M.CMNC_STTS_CD)
+    ]]>
+    </update>
+
+</mapper>

+ 66 - 0
src/main/resources/mybatis/mapper/UnitSyst.xml

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.its.app.mapper.UnitSystMapper">
+
+    <select id="selectCount" resultType="int">
+    <![CDATA[
+        SELECT COUNT(1) AS datacnt FROM TB_UNIT_SYST WHERE A.DEL_YN = 'N'
+    ]]>
+    </select>
+
+    <select id="selectAll" resultType="com.its.app.vo.voUnitSyst">
+    <![CDATA[
+	    SELECT A.SYST_ID	AS SYST_ID,
+	           A.SYST_TYPE	AS SYST_TYPE,
+	           A.SYST_NM	AS SYST_NM,
+	           A.SYST_IP_1	AS SYST_IP_1,
+	           A.SYST_IP_2	AS SYST_IP_2,
+	           TO_NUMBER(NVL(A.PRGM_PORT, '0')) AS PRGM_PORT
+	      FROM TB_UNIT_SYST A
+	     WHERE A.DEL_YN = 'N'
+	     ORDER BY A.SYST_ID
+    ]]>
+    </select>
+
+    <update id="updateUnitSystStts" parameterType="com.its.app.vo.voUnitSystStts">
+    <![CDATA[
+        MERGE INTO TB_UNIT_SYST_STTS L
+        USING (SELECT #{obj.SYST_ID} 	   AS SYST_ID,
+                      #{obj.UPDT_DT} 	   AS UPDT_DT,
+                      #{obj.SYST_STTS_CD} AS SYST_STTS_CD
+                 FROM DUAL) M
+        ON ( L.SYST_ID = M.SYST_ID )
+        WHEN MATCHED THEN
+          UPDATE SET L.UPDT_DT      = M.UPDT_DT,
+                     L.SYST_STTS_CD = M.SYST_STTS_CD
+        WHEN NOT MATCHED THEN
+          INSERT (
+	              L.SYST_ID,
+	              L.UPDT_DT,
+	              L.SYST_STTS_CD
+                 )
+          VALUES (
+	              M.SYST_ID,
+	              M.UPDT_DT,
+	              M.SYST_STTS_CD
+                 )
+    ]]>
+    </update>
+
+    <insert id="insertUnitSystSttsHs" parameterType="com.its.app.vo.voUnitSystStts">
+    <![CDATA[
+          INSERT INTO TB_UNIT_SYST_STTS_HS (
+                  CRTN_DT,
+                  SYST_ID,
+                  SYST_STTS_CD
+                 )
+          VALUES (
+                  #{obj.UPDT_DT},
+                  #{obj.SYST_ID},
+                  #{obj.SYST_STTS_CD}
+                 )
+    ]]>
+    </insert>
+
+</mapper>

+ 58 - 0
src/main/resources/mybatis/mapper/Wcam.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.its.app.mapper.WcamMapper">
+
+    <select id="selectAll" resultType="com.its.app.vo.voIcmpCtlr">
+    <![CDATA[
+        SELECT A.WCAM_CTLR_NMBR AS CTLR_NMBR,
+               A.WCAM_CTLR_ID   AS CTLR_ID,
+               A.WCAM_NM        AS ISTL_LCTN_NM,
+               A.WCAM_CTLR_IP   AS CTLR_IP,
+               A.WCAM_TYPE_CD   AS TYPE_CD,
+               (SELECT CMMN_CD_KOR_NM
+                  FROM TB_CMMN_CD
+                 WHERE CMMN_CLSF_CD = 'WCAM'
+                   AND CMMN_CD      = A.WCAM_TYPE_CD) AS TYPE_NM,
+               A.DEL_YN AS DEL_YN
+          FROM TB_WCAM_CTLR A
+         WHERE A.DEL_YN = 'N'
+    ]]>
+    </select>
+
+    <update id="updateStts" parameterType="com.its.app.vo.voIcmpCtlrStts">
+    <![CDATA[
+        MERGE INTO TB_WCAM_CTLR_STTS L
+        USING (SELECT #{stts.CTLR_NMBR}    AS WCAM_CTLR_NMBR,
+                      #{stts.UPDT_DT}      AS UPDT_DT,
+                      #{stts.CMNC_STTS_CD} AS CMNC_STTS_CD
+                 FROM DUAL) M
+        ON (L.WCAM_CTLR_NMBR = M.WCAM_CTLR_NMBR)
+        WHEN MATCHED THEN
+            UPDATE SET L.UPDT_DT      = M.UPDT_DT,
+                       L.CMNC_STTS_CD = M.CMNC_STTS_CD
+        WHEN NOT MATCHED THEN
+            INSERT (L.WCAM_CTLR_NMBR,
+                    L.UPDT_DT,
+                    L.CMNC_STTS_CD)
+            VALUES (M.WCAM_CTLR_NMBR,
+                    M.UPDT_DT,
+                    M.CMNC_STTS_CD)
+    ]]>
+    </update>
+
+    <insert id="insertSttsHs" parameterType="com.its.app.vo.voIcmpCtlrStts">
+    <![CDATA[
+        INSERT INTO TB_WCAM_CTLR_STTS_HS
+                   (CRTN_DT,
+                    WCAM_CTLR_NMBR,
+                    CMNC_STTS_CD)
+          VALUES (
+                  #{stts.UPDT_DT},
+                  #{stts.CTLR_NMBR},
+                  #{stts.CMNC_STTS_CD}
+                 )
+    ]]>
+    </insert>
+
+</mapper>

+ 21 - 0
src/main/resources/mybatis/mybatis-config.xml

@@ -0,0 +1,21 @@
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	<settings>
+		<setting name="aggressiveLazyLoading" value="false"/>
+		<setting name="jdbcTypeForNull" value="NULL"/>
+		<setting name="cacheEnabled" value="true"/>
+		<setting name="lazyLoadingEnabled" value="false"/>
+		<setting name="multipleResultSetsEnabled" value="true"/>
+		<setting name="useColumnLabel" value="true"/>
+		<setting name="useGeneratedKeys" value="false"/>
+		<setting name="defaultExecutorType" value="REUSE"/>
+		<setting name="defaultStatementTimeout" value="25000"/>
+		<setting name="mapUnderscoreToCamelCase" value="true"/>
+	</settings>
+    
+	<typeAliases>
+	</typeAliases>
+	
+	<typeHandlers>
+	</typeHandlers>
+</configuration>

+ 53 - 0
src/main/resources/static/css/jquery.treegrid.css

@@ -0,0 +1,53 @@
+.treegrid-expander {
+	display: inline-block;
+	margin-left: -24px;
+	position: relative;
+	width: 24px;
+}
+.treegrid-expander {
+	vertical-align: middle;
+}
+.treegrid-expander::after {
+	border: 6px solid transparent;
+	content: ' ';
+	display: block;
+	height: 0;
+	left: 50%;
+	margin-left: -6px;
+	margin-top: -6px;
+	position: absolute;
+	top: 50%;
+	width: 0;
+}
+.treegrid-expander-expanded,
+.treegrid-expander-collapsed {
+	cursor: pointer;
+}
+.treegrid-expander-expanded::after {
+	border-top-color: #ccc;
+}
+.treegrid-expander-collapsed::after {
+	border-left-color: #ccc;
+}
+tr.loading>td>.treegrid-container>.treegrid-expander::after {
+	background: url('../images/loader.gif') center center no-repeat;
+	border: 0;
+	height: 16px;
+	margin-left: -8px;
+	margin-top: -8px;
+	width: 16px;
+}
+.treegrid-move-indicator {
+	border: 5px solid transparent;
+	border-left-color: #000;
+	display: none;
+	width: 0;
+	height: 0;
+	position: absolute;
+	margin-top: -5px;
+	margin-left: -6px;
+}
+.treegrid-container.dragging {
+	margin-left: 0 !important;
+	position: absolute;
+}

+ 38 - 0
src/main/resources/static/js/ajax.js

@@ -0,0 +1,38 @@
+function requestService(url, param, callback, async) {
+    /*
+     * 스프링시큐리티 csrf 토큰 에러때문에  ajax 통신시 해더에 포함해줘야한다.
+     */
+    var token = $("meta[name='_csrf']").attr("content");
+    var header = $("meta[name='_csrf_header']").attr("content");
+
+    if (async) {
+
+        async = true;
+    }
+
+    $.ajax({
+        url: "/" + url
+        , data: encodeURI(param)
+        , cache: false
+        , async: async
+        , type: 'POST'
+        , statusCode: {
+            301: function(resp){
+                window.location.reload();
+            },
+            302: function(resp){
+                window.location.reload();
+            }
+        }
+        , beforeSend: function (xhr) {
+            if(header != null) xhr.setRequestHeader(header, token);
+        }
+
+    })
+        .done(callback)
+        .fail(function (request,status,e) {
+        console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+    });
+}
+
+

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 1 - 0
src/main/resources/static/js/jquery-2.2.4.min.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/main/resources/static/js/jquery.treegrid.min.js


+ 27 - 0
src/main/resources/static/js/login.js

@@ -0,0 +1,27 @@
+function submitForm(msg){
+    document.loginForm.submit();
+}
+
+$(document).ready(function() {
+    var placeholderTarget = $('.textbox input[type="text"], .textbox input[type="password"]');
+
+    //포커스시
+    placeholderTarget.on('focus', function(){
+        $(this).siblings('label').fadeOut('fast');
+    });
+
+    //포커스아웃시
+    placeholderTarget.on('focusout', function(){
+        if($(this).val() == ''){
+            $(this).siblings('label').fadeIn('fast');
+        }
+    });
+
+    $("#password").keyup(function(e){if(e.keyCode === 13)  submitForm(); });
+
+});
+
+
+
+
+

+ 266 - 0
src/main/resources/static/js/main.js

@@ -0,0 +1,266 @@
+
+/*
+ 서버시간 요청 함수
+ */
+var _time_id = null;
+/*requestService("getServerDate","",getServerTimeCallback,true);
+function getServerTimeCallback(result, statusText, xhr){
+    _sever_time =result.serverDate;
+
+}*/
+
+if(_time_id == null) {
+    _time_id = setInterval(severTimeInterval,1000);
+}
+
+function severTimeInterval(){
+    $("#serverTime").text(moment(_sever_time).add("1", "s").format("YYYY-MM-DD HH:mm:ss"));
+    _sever_time = moment(_sever_time).add("1", "s").format("YYYY-MM-DD HH:mm:ss");
+}
+
+/*
+ *  LOG 함수
+ */
+var _fileListTbody = "";
+var _fileViewTimeout = null;
+function fileView(name, path) {
+    if (_fileViewTimeout != null) {
+        clearInterval(_fileViewTimeout);
+        _fileViewTimeout = null;
+    }
+
+    $("#fileTbody").empty();
+    var endPoint = 0;
+
+    function requestLog(){
+        $.ajax({
+            url:"/getFileView",
+            type:"POST",
+            data:"fileName="+name+"&filePath="+path+"&preEndPoint="+endPoint,
+            success:function (data) {
+
+                $("#logFileName").text(name);
+
+                test=data;
+                endPoint = data.endPoint;
+                if(data.log.length < 1) return;
+
+                var tbody="<tr><td>"+data.log+"</td></tr>";
+
+                $("#FilesForm").css("display","none");
+                $("#FileForm").css("display","block");
+
+                //$("#fileTbody").empty();
+                tbodyAppend("fileTbody",tbody);
+                $("#logScroll").scrollTop($('#logScroll')[0].scrollHeight);
+            },
+            error:function (request,status,e) {
+                console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+            }
+        }).done
+
+        if(_fileViewTimeout == null ){
+            _fileViewTimeout = setInterval(requestLog, 1000);
+        }
+    }
+    requestLog();
+}
+
+function fileDownload(name,path) {
+    location.href="/getFileDownload?fileName="+name+"&filePath="+path;
+}
+
+function fileDelete(name,path) {
+    if (!confirm(name+"을 삭제합니다.")) {
+        return;
+    }
+
+    $.ajax({
+        url:"/getFileDelete",
+        type:"POST",
+        data:"fileName="+name+"&filePath="+path,
+        success:function (data) {
+            alert("삭제 했습니다.");
+            $("#logTbody").empty();
+            fileList = data;
+            _fileListTbody="";
+
+            initLogFileList(data);
+            tbodyAppend("logTbody", _fileListTbody);
+            $('.tree-basic').treegrid();
+
+        },
+        error:function (request,status,e) {
+            alert("삭제를 실패했습니다.");
+            console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+        }
+    }).done
+}
+
+function initLogFileList(fileList) {
+
+    fileList.forEach(function (el, index) {
+        console.log(el.type + ', ' + el.fileName + ', ' + el.filePath);
+
+        if (el.type == "dir") {
+            if (el.fileName === "logs"){
+                //_fileListTbody += "<tr class='treegrid-"+el.id+" expanded'>";
+            }
+            else {
+                if (el.parentId  > 1) {
+                    _fileListTbody += "<tr class='treegrid-"+el.id+" expanded treegrid-parent-"+el.parentId+"'>";
+                }
+                else {
+                    _fileListTbody += "<tr class='treegrid-"+el.id+"'>";
+                }
+                _fileListTbody += "<td>"+el.fileName+"</td>";
+                _fileListTbody += "</tr>";
+            }
+        }
+        else {
+            if (el.parentId  > 1) {
+                _fileListTbody += "<tr class='treegrid-"+el.id+" expanded treegrid-parent-"+el.parentId+"'>";
+            }
+            else {
+                _fileListTbody += "<tr class='treegrid-"+el.id+" treegrid-parent-"+el.parentId+"'>";
+            }
+            _fileListTbody +="<td>"+el.fileName+" ("+el.fileSize+" Byte)&nbsp;&nbsp;&nbsp;&nbsp;</td>";
+            _fileListTbody += "<td><a href=javascript:fileView('" + el.fileName+"','" + el.filePath + "');>보기</a>&nbsp;&nbsp;</td>";
+            _fileListTbody += "<td><a href=javascript:fileDownload('" + el.fileName+"','" + el.filePath +"');>다운로드</a>&nbsp;&nbsp;</td>";
+            //_fileListTbody += "<td><a href=javascript:fileDelete('" + el.fileName + "','" + el.filePath + "''\);>delete</a>&nbsp;&nbsp;</td>";
+
+            _fileListTbody += "</tr>";
+        }
+
+        if (el.fileInfos.length > 0) initLogFileList(el.fileInfos);
+    });
+    return _fileListTbody;
+}
+
+/*
+ * CONTROLLER 명령 함수
+ */
+
+// 제어기 연결해제
+function disconnectController(id) {
+    if (!confirm("연결을 종료 하시겠습니까?")) {
+        return;
+    }
+
+    $.ajax({
+        url:"/disconnectController",
+        type:"POST",
+        data:"id="+id,
+        success:function (data) {
+            alert(data);
+            location.href = "/controller";
+        },
+        error:function (request,status,e) {
+            console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+        }
+    }).done
+}
+
+// 전체 제어기 접속횟수 초기화
+function allDisconnectController() {
+    if (!confirm("전체 제어기의 연결을 종료 하시겠습니까?")) {
+        return;
+    }
+
+    $.ajax({
+        url:"/allDisconnectController",
+        type:"POST",
+        success:function (data) {
+            alert(data);
+            location.href = "/controller";
+        },
+        error:function (request,status,e) {
+            console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+        }
+    }).done
+}
+
+// 제어기 접속횟수 초기화
+function resetConnCount(id) {
+    if (!confirm("접속횟수를 초기화 하시겠습니까?")) {
+        return;
+    }
+
+    $.ajax({
+        url:"/resetConnCount",
+        type:"POST",
+        data:"id="+id,
+        success:function (data) {
+            alert(data);
+            location.href = "/controller";
+        },
+        error:function (request,status,e) {
+            console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+        }
+    }).done
+}
+
+// 전체 제어기 접속횟수 초기화
+function allResetConnCount() {
+    if (!confirm("전체 제어기의 접속횟수를 초기화 하시겠습니까?")) {
+        return;
+    }
+
+    $.ajax({
+        url:"/allResetConnCount",
+        type:"POST",
+        success:function (data) {
+            alert(data);
+            location.href = "/controller";
+        },
+        error:function (request,status,e) {
+            console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+        }
+    }).done}
+
+
+// 제어기 리셋
+function resetController(id) {
+}
+
+// 전체 제어기 리셋
+function allResetController(id) {
+}
+
+function controllerPing(id, name, ip) {
+    var infoData = "ping: " + id + ", " + name + ", " + ip + "  =====>     <br/>";
+    tbodyAppend("fileTbody", infoData);
+
+    $.ajax({
+        url:"/getPing",
+        type:"POST",
+        data:"ipAddr="+ip,
+        success:function (data) {
+            var result = "<===== " + data + "<br/>";
+            tbodyAppend("fileTbody", result);
+        },
+        error:function (request,status,e) {
+            console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+e);
+        }
+    }).done
+}
+
+var _controllerList = "";
+function AllControllerPing() {
+    if (_controllerList == "") {
+        return;
+    }
+    $("#fileTbody").innerText = "";
+
+    //document.getElementById("fileTbody").innerHTML = data;
+    for (var el in _controllerList) {
+        controllerPing(_controllerList[el].ctlr_ID, _controllerList[el].istl_LCTN_NM, _controllerList[el].ctlr_IP);
+    }
+}
+
+/*
+ * Tbody 데이터 넣기
+ */
+function tbodyAppend(tagId, tbodyData) {
+    $("#"+tagId).append(tbodyData);
+}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/main/resources/static/js/moment.min.js


+ 91 - 0
src/main/webapp/WEB-INF/jsp/cctv.jsp

@@ -0,0 +1,91 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<jsp:include page="head.jsp"/>
+
+<body>
+
+<div class="container" align="center">
+    <jsp:include page="header.jsp"/>
+    <jsp:include page="menu.jsp"/>
+
+    <div class="content">
+        <table border="0" cellpadding="10" cellspacing="0" width="100%" style="font-weight: bold;font-family:tahoma;font-size:14pt;color:#808080;border-color:#6a5acd" >
+            <tr><td>
+                <fieldset><legend> CCTV Network Ping Information </legend>
+                    <table align="center" border="1" cellpadding="1" cellspacing="0" style="border: 1px solid;font-weight: normal;font-family:tahoma;font-size:12pt;">
+                        <thead>
+                        <tr style="background-color: antiquewhite;">
+                            <th>관리번호</th>
+                            <th>CCTV ID</th>
+                            <th>CCTV 명칭</th>
+                            <th>IP Address</th>
+                            <th>상태</th>
+                            <th>마지막 PING 시간</th>
+                            <th>명령</th>
+                        </tr>
+                        </thead>
+                        <c:forEach var="entry" items="${list}" varStatus="status">
+                            <tr>
+                                <td align="center">${entry.value.CTLR_NMBR}</td>
+                                <td align="center">${entry.value.CTLR_ID}</td>
+                                <td>${entry.value.ISTL_LCTN_NM}</td>
+                                <td>&nbsp;${entry.value.CTLR_IP}&nbsp;</td>
+                                <td align="center">
+                                    <c:choose>
+                                        <c:when test="${entry.value.netState eq '0'}">
+                                            &nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;
+                                        </c:when>
+                                        <c:otherwise>
+                                            &nbsp;&nbsp;Alive&nbsp;&nbsp;
+                                        </c:otherwise>
+                                    </c:choose>
+                                </td>
+                                <td align="center">&nbsp;${entry.value.pingTime}&nbsp;</td>
+                                <td align="center">
+                                    &nbsp;&nbsp;<a href="javascript:controllerPing('${entry.value.CTLR_ID}', '${entry.value.ISTL_LCTN_NM}', '${entry.value.CTLR_IP}')">ping</a>&nbsp;&nbsp;</td>
+                           </tr>
+                        </c:forEach>
+                    </table>
+                    <br>
+                    <table align="center" border="0" cellpadding="1" cellspacing="0" style="font-weight: normal;font-family:tahoma;font-size:12pt;">
+                        <tr>
+                            <td><button type="button" onclick="AllControllerPing()">전체 ping</button></td>
+                        </tr>
+                    </table>
+
+            </fieldset>
+            </td></tr>
+        </table>
+    </div>
+
+    <div class="content">
+        <div class="log" id="log">
+            <fieldset id="FileForm">
+                <legend name="fileName" id="logFileName">Ping Test</legend>
+                <div id="logScroll" style="width: 98%;height: 660px;overflow: auto;margin:5px auto;">
+                    <table >
+                        <tbody id="fileTbody">
+
+                        </tbody>
+                    </table>
+                </div>
+            </fieldset>
+        </div>
+    </div>
+
+</div>
+
+<script type="text/javascript">
+    function init(){
+        _controllerList = ${objList};
+    }
+
+    $(document).ready(function() {
+        init();
+    });
+</script>
+
+</body>
+</html>

+ 10 - 0
src/main/webapp/WEB-INF/jsp/head.jsp

@@ -0,0 +1,10 @@
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>${ServerConfig.processName}</title>
+</head>
+
+<script type="text/javascript" src="/js/moment.min.js"></script>
+<script type="text/javascript" src="/js/jquery-2.2.4.min.js"></script>
+<script type="text/javascript" src="/js/ajax.js"></script>
+<script type="text/javascript" src="/js/main.js"></script>
+<script type="text/javascript" src="/js/login.js"></script>

+ 12 - 0
src/main/webapp/WEB-INF/jsp/header.jsp

@@ -0,0 +1,12 @@
+
+<table width="100%" style="font-family:tahoma;font-size:12pt;color:#808080;border-color:#6a5acd;margin-top: 5px;" border="0" cellpadding="10" cellspacing="0">
+    <tr align="center"><td style="font-size: 24px; font-weight: bold; color: black;">${ServerConfig.processName}</td></tr>
+</table>
+<hr>
+<table width="100%" style="font-family:tahoma;font-size:12pt;color:#808080;border-color:#6a5acd;margin-top: -10px;" border="0" cellpadding="10" cellspacing="0" >
+    <tr align="right"><td id="serverTime" style="font-size: 16px; font-weight: bold; color: black; padding-right: 30px">${ServerTime}</td></tr>
+</table>
+
+<script type="text/javascript">
+    var _sever_time = '${ServerTime}';
+</script>

+ 60 - 0
src/main/webapp/WEB-INF/jsp/log.jsp

@@ -0,0 +1,60 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<jsp:include page="head.jsp"/>
+<Link href="/css/jquery.treegrid.css" rel="stylesheet">
+<body>
+
+<div class="container" align="center">
+    <jsp:include page="header.jsp"/>
+    <jsp:include page="menu.jsp"/>
+
+    <div class="content">
+        <table border="0" cellpadding="10" cellspacing="0" width="600" style="font-weight: bold;font-family:tahoma;font-size:14pt;color:#808080;border-color:#6a5acd" >
+            <tr><td>
+                <fieldset><legend> Log Files </legend>
+                    <table class="table table-bordered tree-basic"  id="logFiles" border="0" cellpadding="1" cellspacing="0" style="width: 100%; font-weight: normal;font-family:tahoma;font-size:12pt;">
+                        <tbody id="logTbody">
+                        </tbody>
+                    </table>
+                </fieldset>
+            </td></tr>
+        </table>
+    </div>
+
+    <div class="content">
+        <div class="log" id="log">
+            <fieldset id="FileForm">
+                <legend name="fileName" id="logFileName">Log File View</legend>
+                <div id="logScroll" style="width: 98%;height: 660px;overflow: auto;margin:5px auto;">
+                    <table >
+                        <tbody id="fileTbody">
+
+                        </tbody>
+                    </table>
+                </div>
+            </fieldset>
+        </div>
+    </div>
+</div>
+
+</div>
+
+
+<script src="/js/jquery.treegrid.min.js"></script>
+<script type="text/javascript">
+    function init(){
+        var fileList = ${fileList};
+        var fileListBody = initLogFileList(fileList);
+        tbodyAppend("logTbody", fileListBody);
+        $('.tree-basic').treegrid();
+    }
+
+    $(document).ready(function() {
+        init();
+    });
+</script>
+
+</body>
+</html>

+ 26 - 0
src/main/webapp/WEB-INF/jsp/login.jsp

@@ -0,0 +1,26 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<jsp:include page="head.jsp"/>
+<body>
+
+<div class="container" align="center">
+    <jsp:include page="header.jsp"/>
+
+    <div class="content">
+        <form id="loginForm" name="loginForm" action="/login" method="post">
+            <table border="0" cellpadding="1" cellspacing="0" style="font-family:tahoma;font-size:10pt;border-color:#kkkkkk;">
+                <tr>
+                    <td width="120" align="right">USER ID :</td>
+                    <td> <input type="text" size="20" maxlength="20" id="username" name="username" style=font-family:tahoma;font-size:10pt;/></td></tr>
+                <tr>
+                    <td width="120" align="right">USER PASSWORD :</td><td> <input type="password" size="20" maxlength="20" id="password" name="password" style=font-family:tahoma;font-size:10pt;/></td></tr>
+                <tr>
+                    <td width="120"></td><td align="left"><input type="submit" value=" LOGIN " style=font-family:tahoma;font-size:10pt;/></td></tr>
+            </table>
+        </form>
+    </div>
+</div>
+
+</body>
+</html>

+ 20 - 0
src/main/webapp/WEB-INF/jsp/menu.jsp

@@ -0,0 +1,20 @@
+<table style="font-family:tahoma;font-size:12pt;color:#808080;border-color:#6a5acd; margin-top: -10px" width="100%" border="0" cellpadding="10" cellspacing="0">
+    <tr><td>
+        <table border=0 cellpadding=0 cellspacing=0 style="font-family:tahoma;font-size:16pt;border-color:#808080;" align="center">
+            <tr>
+                <td><a href="/index">System</a></td>
+                <td width=20></td>
+                <td><a href="/cctv">cctv</a></td>
+                <td width=20></td>
+                <td><a href="/wcam">web camera</a></td>
+                <td width=20></td>
+                <td><a href="/log">Log</a></td>
+                <td width=20></td>
+                <form name="loginForm" method="post" action="/logout">
+                <td><a href="javascript:submitForm();">Logout</a></td>
+                </form>
+            </tr>
+        </table>
+
+    </td></tr>
+</table>

+ 32 - 0
src/main/webapp/WEB-INF/jsp/system.jsp

@@ -0,0 +1,32 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<jsp:include page="head.jsp"/>
+
+<body>
+
+<div class="container" align="center">
+    <jsp:include page="header.jsp"/>
+    <jsp:include page="menu.jsp"/>
+
+    <div class="content">
+        <table border="0" cellpadding="10" cellspacing="0" width="600" style="font-weight: bold;font-family:tahoma;font-size:14pt;color:#808080;border-color:#6a5acd" >
+            <tr><td>
+                <fieldset><legend> System Information </legend>
+                    <table border="0" cellpadding="1" cellspacing="0" style="font-weight: normal;font-family:tahoma;font-size:12pt;">
+                            <tr><td align="right" width="200">          system id : </td> <td><input type="text" value="${ServerConfig.processId}"          disabled /></td></tr>
+                            <tr><td align="right" width="200">       ping timeout : </td> <td><input type="text" value="${ServerConfig.pingTimeout}"        disabled /></td></tr>
+                            <tr><td align="right" width="200">  ping core threads : </td> <td><input type="text" value="${ServerConfig.threadPoolCoreSize}" disabled /></td></tr>
+                            <tr><td align="right" width="200">   ping max threads : </td> <td><input type="text" value="${ServerConfig.threadPoolMaxSize}"  disabled /></td></tr>
+                            <tr><td align="right" width="200">   dbms job threads : </td> <td><input type="text" value="${ServerConfig.serverDbThreads}"    disabled /></td></tr>
+                            <tr><td align="right" width="200">       booting time : </td> <td><input type="text" value="${ServerConfig.bootingDateTime}"    disabled /></td></tr>
+                    </table>
+                </fieldset>
+            </td></tr>
+        </table>
+    </div>
+</div>
+
+
+</body>
+</html>

+ 91 - 0
src/main/webapp/WEB-INF/jsp/wcam.jsp

@@ -0,0 +1,91 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<jsp:include page="head.jsp"/>
+
+<body>
+
+<div class="container" align="center">
+    <jsp:include page="header.jsp"/>
+    <jsp:include page="menu.jsp"/>
+
+    <div class="content">
+        <table border="0" cellpadding="10" cellspacing="0" width="100%" style="font-weight: bold;font-family:tahoma;font-size:14pt;color:#808080;border-color:#6a5acd" >
+            <tr><td>
+                <fieldset><legend> WEB Camera Network Ping Information </legend>
+                    <table align="center" border="1" cellpadding="1" cellspacing="0" style="border: 1px solid;font-weight: normal;font-family:tahoma;font-size:12pt;">
+                        <thead>
+                        <tr style="background-color: antiquewhite;">
+                            <th>관리번호</th>
+                            <th>Camera ID</th>
+                            <th>Camera 명칭</th>
+                            <th>IP Address</th>
+                            <th>상태</th>
+                            <th>마지막 PING 시간</th>
+                            <th>명령</th>
+                        </tr>
+                        </thead>
+                        <c:forEach var="entry" items="${list}" varStatus="status">
+                            <tr>
+                                <td align="center">${entry.value.CTLR_NMBR}</td>
+                                <td align="center">${entry.value.CTLR_ID}</td>
+                                <td>${entry.value.ISTL_LCTN_NM}</td>
+                                <td>&nbsp;${entry.value.CTLR_IP}&nbsp;</td>
+                                <td align="center">
+                                    <c:choose>
+                                        <c:when test="${entry.value.netState eq '0'}">
+                                            &nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;
+                                        </c:when>
+                                        <c:otherwise>
+                                            &nbsp;&nbsp;Alive&nbsp;&nbsp;
+                                        </c:otherwise>
+                                    </c:choose>
+                                </td>
+                                <td align="center">&nbsp;${entry.value.pingTime}&nbsp;</td>
+                                <td align="center">
+                                    &nbsp;&nbsp;<a href="javascript:controllerPing('${entry.value.CTLR_ID}', '${entry.value.ISTL_LCTN_NM}', '${entry.value.CTLR_IP}')">ping</a>&nbsp;&nbsp;</td>
+                            </tr>
+                        </c:forEach>
+                    </table>
+                    <br>
+                    <table align="center" border="0" cellpadding="1" cellspacing="0" style="font-weight: normal;font-family:tahoma;font-size:12pt;">
+                        <tr>
+                            <td><button type="button" onclick="AllControllerPing()">전체 ping</button></td>
+                        </tr>
+                    </table>
+
+            </fieldset>
+            </td></tr>
+        </table>
+    </div>
+
+    <div class="content">
+        <div class="log" id="log">
+            <fieldset id="FileForm">
+                <legend name="fileName" id="logFileName">Ping Test</legend>
+                <div id="logScroll" style="width: 98%;height: 660px;overflow: auto;margin:5px auto;">
+                    <table >
+                        <tbody id="fileTbody">
+
+                        </tbody>
+                    </table>
+                </div>
+            </fieldset>
+        </div>
+    </div>
+
+</div>
+
+<script type="text/javascript">
+    function init(){
+        _controllerList = ${objList};
+    }
+
+    $(document).ready(function() {
+        init();
+    });
+</script>
+
+</body>
+</html>

+ 1 - 0
start.bat

@@ -0,0 +1 @@
+java -jar icmp-ping-server-0.0.1-SNAPSHOT.war --spring.config.location=conf//icmp-ping-server.properties

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно