Michal 2025-02-08 16:39:16 +01:00
commit 067276ef6a
18 changed files with 3947 additions and 0 deletions

73
build.xml Normal file
View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="jNetServer" default="default" basedir=".">
<description>Builds, tests, and runs the project jNetServer.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar: JAR building
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="jNetServer-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>

13
config.properties Normal file
View File

@ -0,0 +1,13 @@
#Sat Jan 19 23:43:37 CET 2019
mysql_server=cucky.cz
mysql_port=8658
mysql_user=jnet
mysql_password=Michal2407
mysql_database=jnet
server_port=1225
debug=true
ping_attempt=2
ping_timeout=2000
instability_attempt=2
instability_limit=1000

7
log Normal file
View File

@ -0,0 +1,7 @@
03.02.25 16:34:13 I ---------------------------------------------
03.02.25 16:34:13 I jNet Server
03.02.25 16:34:13 I Version: 1 (Mon Feb 03 16:33:44 CET 2025)
03.02.25 16:34:13 I ---------------------------------------------
03.02.25 16:34:13 I
03.02.25 16:34:13 I Loading config ...
03.02.25 16:34:13 E fail. Soubor konfigurace nenalezen config.properties (Systém nemůže nalézt uvedený soubor)

222
log.log Normal file
View File

@ -0,0 +1,222 @@
04.02.25 18:20:10 I ---------------------------------------------
04.02.25 18:20:10 I jNet Server
04.02.25 18:20:10 I Version: 1 (Tue Feb 04 17:54:52 CET 2025)
04.02.25 18:20:10 I ---------------------------------------------
04.02.25 18:20:10 I
04.02.25 18:20:10 I Loading config ...
04.02.25 18:20:10 I successfully
04.02.25 18:20:10 D Debug mode on
04.02.25 18:20:10 I Connecting to a selected database ...
04.02.25 18:20:10 I successfully
04.02.25 18:20:10 I Loading user list ...
04.02.25 18:20:10 I load 2 user(s)
04.02.25 18:20:10 I Loading map list ...
04.02.25 18:20:10 I load 6 map(s)
04.02.25 18:20:10 I Loading object list ...
04.02.25 18:20:10 I load 5 object(s)
04.02.25 18:20:10 I Loading object type ...
04.02.25 18:20:10 I load 12 type(s)
04.02.25 18:20:10 I Loading SNMP profile ...
04.02.25 18:20:10 I load 2 profile(s)
04.02.25 18:20:10 I Loading events ...
04.02.25 18:20:11 I load 259 event(s)
04.02.25 18:20:11 I Ping start ...
04.02.25 18:20:11 I Server is ready and listening on port 1225
04.02.25 18:20:13 D -> Message type: 1
04.02.25 18:20:13 I Authorization request send (kubernetes.docker.internal)
04.02.25 18:20:13 D <- Message type: 3
04.02.25 18:20:13 D -> Message type: 4
04.02.25 18:20:13 I User: michal logged in (kubernetes.docker.internal)
04.02.25 18:20:13 D <- Message type: 5
04.02.25 18:20:13 D <- Message type: 9
04.02.25 18:20:13 D <- For all. Message type: 7
04.02.25 18:20:13 D <- Message type: 13
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 8
04.02.25 18:20:13 D <- Message type: 11
04.02.25 18:20:13 D <- Message type: 11
04.02.25 18:20:13 D <- Message type: 100
04.02.25 18:20:13 D <- Message type: 100
04.02.25 18:20:13 D <- Message type: 100
04.02.25 18:20:13 D <- Message type: 100
04.02.25 18:20:13 D <- Message type: 100
04.02.25 18:20:13 D <- Message type: 100
04.02.25 18:20:13 D <- Message type: 14
04.02.25 18:20:13 D <- Message type: 110
04.02.25 18:20:13 D <- Message type: 107
04.02.25 18:20:13 D <- Message type: 107
04.02.25 18:28:05 D <- For all. Message type: 108
04.02.25 18:28:05 D <- For all. Message type: 101
04.02.25 18:28:05 D <- For all. Message type: 101
04.02.25 18:29:45 D <- For all. Message type: 108
04.02.25 18:29:45 D <- For all. Message type: 101
04.02.25 18:29:45 D <- For all. Message type: 101
04.02.25 18:34:14 D <- For all. Message type: 108
04.02.25 18:34:14 D <- For all. Message type: 101
04.02.25 18:34:14 D <- For all. Message type: 101
04.02.25 18:35:53 D <- For all. Message type: 108
04.02.25 18:35:53 D <- For all. Message type: 101
04.02.25 18:35:54 D <- For all. Message type: 101
04.02.25 18:38:18 D <- For all. Message type: 108
04.02.25 18:38:18 D <- For all. Message type: 101
04.02.25 18:38:18 D <- For all. Message type: 101
04.02.25 18:39:31 D <- For all. Message type: 108
04.02.25 18:39:31 D <- For all. Message type: 101
04.02.25 18:39:31 D <- For all. Message type: 101
04.02.25 18:40:31 D <- For all. Message type: 108
04.02.25 18:40:31 D <- For all. Message type: 101
04.02.25 18:40:31 D <- For all. Message type: 101
04.02.25 18:44:12 D <- For all. Message type: 108
04.02.25 18:44:12 D <- For all. Message type: 101
04.02.25 18:44:13 D <- For all. Message type: 101
04.02.25 18:44:43 D <- For all. Message type: 108
04.02.25 18:44:43 D <- For all. Message type: 101
04.02.25 18:44:44 D <- For all. Message type: 101
04.02.25 18:46:19 D <- For all. Message type: 108
04.02.25 18:46:19 D <- For all. Message type: 101
04.02.25 18:46:20 D <- For all. Message type: 101
04.02.25 18:48:13 D <- For all. Message type: 108
04.02.25 18:48:13 D <- For all. Message type: 101
04.02.25 18:48:14 D <- For all. Message type: 101
04.02.25 18:49:37 D <- For all. Message type: 108
04.02.25 18:49:37 D <- For all. Message type: 101
04.02.25 18:49:37 D <- For all. Message type: 101
04.02.25 18:54:18 D <- For all. Message type: 108
04.02.25 18:54:18 D <- For all. Message type: 101
04.02.25 18:54:18 D <- For all. Message type: 101
04.02.25 18:59:24 D <- For all. Message type: 108
04.02.25 18:59:24 D <- For all. Message type: 101
04.02.25 18:59:27 D <- For all. Message type: 101
04.02.25 18:59:56 D <- For all. Message type: 108
04.02.25 18:59:56 D <- For all. Message type: 101
04.02.25 18:59:56 D <- For all. Message type: 101
04.02.25 19:11:38 D <- For all. Message type: 108
04.02.25 19:11:38 D <- For all. Message type: 101
04.02.25 19:11:39 D <- For all. Message type: 101
04.02.25 19:14:33 D <- For all. Message type: 108
04.02.25 19:14:33 D <- For all. Message type: 101
04.02.25 19:14:33 D <- For all. Message type: 101
04.02.25 19:20:55 D <- For all. Message type: 108
04.02.25 19:20:55 D <- For all. Message type: 101
04.02.25 19:20:55 D <- For all. Message type: 101
04.02.25 19:24:30 D <- For all. Message type: 108
04.02.25 19:24:30 D <- For all. Message type: 101
04.02.25 19:24:30 D <- For all. Message type: 101
04.02.25 19:29:23 D <- For all. Message type: 108
04.02.25 19:29:23 D <- For all. Message type: 101
04.02.25 19:29:24 D <- For all. Message type: 101
04.02.25 19:34:17 D <- For all. Message type: 108
04.02.25 19:34:17 D <- For all. Message type: 101
04.02.25 19:34:18 D <- For all. Message type: 101
04.02.25 19:44:31 D <- For all. Message type: 108
04.02.25 19:44:31 D <- For all. Message type: 101
04.02.25 19:44:31 D <- For all. Message type: 101
04.02.25 19:48:14 D <- For all. Message type: 108
04.02.25 19:48:14 D <- For all. Message type: 101
04.02.25 19:48:14 D <- For all. Message type: 101
04.02.25 19:59:37 D <- For all. Message type: 108
04.02.25 19:59:37 D <- For all. Message type: 101
04.02.25 19:59:38 D <- For all. Message type: 101
04.02.25 20:0:02 D <- For all. Message type: 108
04.02.25 20:0:02 D <- For all. Message type: 101
04.02.25 20:0:03 D <- For all. Message type: 101
04.02.25 20:8:49 D <- For all. Message type: 108
04.02.25 20:8:49 D <- For all. Message type: 101
04.02.25 20:8:50 D <- For all. Message type: 101
04.02.25 20:9:35 D <- For all. Message type: 108
04.02.25 20:9:35 D <- For all. Message type: 101
04.02.25 20:9:35 D <- For all. Message type: 101
04.02.25 20:17:35 D <- For all. Message type: 108
04.02.25 20:17:35 D <- For all. Message type: 101
04.02.25 20:17:35 D <- For all. Message type: 101
04.02.25 20:19:33 D <- For all. Message type: 108
04.02.25 20:19:33 D <- For all. Message type: 101
04.02.25 20:19:33 D <- For all. Message type: 101
04.02.25 20:19:47 D <- For all. Message type: 108
04.02.25 20:19:47 D <- For all. Message type: 101
04.02.25 20:19:47 D <- For all. Message type: 101
04.02.25 20:23:18 D <- For all. Message type: 108
04.02.25 20:23:18 D <- For all. Message type: 101
04.02.25 20:23:19 D <- For all. Message type: 101
04.02.25 20:24:28 D <- For all. Message type: 108
04.02.25 20:24:28 D <- For all. Message type: 101
04.02.25 20:24:29 D <- For all. Message type: 101
04.02.25 20:24:31 D <- For all. Message type: 108
04.02.25 20:24:31 D <- For all. Message type: 101
04.02.25 20:24:31 D <- For all. Message type: 101
04.02.25 20:26:06 D <- For all. Message type: 108
04.02.25 20:26:06 D <- For all. Message type: 101
04.02.25 20:26:06 D <- For all. Message type: 101
04.02.25 20:34:17 D <- For all. Message type: 108
04.02.25 20:34:17 D <- For all. Message type: 101
04.02.25 20:34:18 D <- For all. Message type: 101
04.02.25 20:44:50 D <- For all. Message type: 108
04.02.25 20:44:50 D <- For all. Message type: 101
04.02.25 20:44:53 D <- For all. Message type: 108
04.02.25 20:44:53 D <- For all. Message type: 101
04.02.25 20:44:53 D <- For all. Message type: 101
04.02.25 20:44:53 D <- For all. Message type: 101
04.02.25 20:52:08 D <- For all. Message type: 108
04.02.25 20:52:08 D <- For all. Message type: 101
04.02.25 20:52:09 D <- For all. Message type: 101
04.02.25 20:54:29 D <- For all. Message type: 108
04.02.25 20:54:29 D <- For all. Message type: 101
04.02.25 20:54:30 D <- For all. Message type: 101
04.02.25 21:8:32 D <- For all. Message type: 108
04.02.25 21:8:32 D <- For all. Message type: 101
04.02.25 21:8:32 D <- For all. Message type: 101
04.02.25 21:13:54 D <- For all. Message type: 108
04.02.25 21:13:54 D <- For all. Message type: 101
04.02.25 21:13:55 D <- For all. Message type: 101
04.02.25 21:29:31 D <- For all. Message type: 108
04.02.25 21:29:31 D <- For all. Message type: 101
04.02.25 21:29:31 D <- For all. Message type: 101
04.02.25 21:30:11 D <- For all. Message type: 108
04.02.25 21:30:11 D <- For all. Message type: 101
04.02.25 21:30:12 D <- For all. Message type: 101
04.02.25 21:30:18 D <- For all. Message type: 108
04.02.25 21:30:18 D <- For all. Message type: 101
04.02.25 21:30:19 D <- For all. Message type: 101
04.02.25 21:39:31 D <- For all. Message type: 108
04.02.25 21:39:31 D <- For all. Message type: 101
04.02.25 21:39:31 D <- For all. Message type: 101
04.02.25 21:40:04 D <- For all. Message type: 108
04.02.25 21:40:04 D <- For all. Message type: 101
04.02.25 21:40:05 D <- For all. Message type: 101
04.02.25 21:41:08 D <- For all. Message type: 108
04.02.25 21:41:08 D <- For all. Message type: 101
04.02.25 21:41:08 D <- For all. Message type: 101
04.02.25 21:53:54 D <- For all. Message type: 108
04.02.25 21:53:54 D <- For all. Message type: 101
04.02.25 21:53:55 D <- For all. Message type: 101
04.02.25 21:54:05 D <- For all. Message type: 108
04.02.25 21:54:05 D <- For all. Message type: 101
04.02.25 21:54:05 D <- For all. Message type: 101
04.02.25 21:54:38 D <- For all. Message type: 108
04.02.25 21:54:38 D <- For all. Message type: 101
04.02.25 21:54:38 D <- For all. Message type: 101
04.02.25 22:4:46 D <- For all. Message type: 108
04.02.25 22:4:46 D <- For all. Message type: 101
04.02.25 22:4:47 D <- For all. Message type: 101
04.02.25 22:10:03 D <- For all. Message type: 108
04.02.25 22:10:03 D <- For all. Message type: 101
04.02.25 22:10:03 D <- For all. Message type: 101
04.02.25 22:39:33 D <- For all. Message type: 108
04.02.25 22:39:33 D <- For all. Message type: 101
04.02.25 22:39:34 D <- For all. Message type: 101
04.02.25 22:52:23 D <- For all. Message type: 108
04.02.25 22:52:23 D <- For all. Message type: 101
04.02.25 22:52:24 D <- For all. Message type: 101
04.02.25 22:54:16 D <- For all. Message type: 108
04.02.25 22:54:16 D <- For all. Message type: 101
04.02.25 22:54:16 D <- For all. Message type: 101

3
manifest.mf Normal file
View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build

1789
nbproject/build-impl.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
build.xml.data.CRC32=36922983
build.xml.script.CRC32=49bb365f
build.xml.stylesheet.CRC32=f85dc8f2@1.113.0.48
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=36922983
nbproject/build-impl.xml.script.CRC32=233b34c8
nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.113.0.48

View File

@ -0,0 +1,118 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=jNetServer
application.vendor=cucky
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.modulepath=\
${run.modulepath}
debug.test.classpath=\
${run.test.classpath}
debug.test.modulepath=\
${run.test.modulepath}
# Files in build.classes.dir which should be excluded from distribution jar
dist.archive.excludes=
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/jNetServer.jar
dist.javadoc.dir=${dist.dir}/javadoc
dist.jlink.dir=${dist.dir}/jlink
dist.jlink.output=${dist.jlink.dir}/jNetServer
endorsed.classpath=
excludes=
file.reference.apache-commons-lang3-3.12.0.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\apache-commons-lang3-3.12.0.jar
file.reference.apache-commons-logging-1.2.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\apache-commons-logging-1.2.jar
file.reference.apache-commons-text-1.10.0.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\apache-commons-text-1.10.0.jar
file.reference.icmp4j-all.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\icmp4j-all.jar
file.reference.jna-5.3.1.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\jna-5.3.1.jar
file.reference.jna-platform-5.9.0.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\jna-platform-5.9.0.jar
file.reference.mysql-connector-java-8.0.15.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\mysql-connector-java-8.0.15.jar
file.reference.netty-all-4.1.68.Final.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\netty-all-4.1.68.Final.jar
file.reference.spring-security-crypto-5.8.0.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\spring-security-crypto-5.8.0.jar
includes=**
jar.compress=false
javac.classpath=\
${file.reference.mysql-connector-java-8.0.15.jar}:\
${reference.jNetLib.jar}:\
${file.reference.apache-commons-lang3-3.12.0.jar}:\
${file.reference.netty-all-4.1.68.Final.jar}:\
${file.reference.icmp4j-all.jar}:\
${file.reference.apache-commons-logging-1.2.jar}:\
${file.reference.apache-commons-text-1.10.0.jar}:\
${file.reference.jna-5.3.1.jar}:\
${file.reference.jna-platform-5.9.0.jar}:\
${file.reference.spring-security-crypto-5.8.0.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.external.vm=true
javac.modulepath=
javac.processormodulepath=
javac.processorpath=\
${javac.classpath}
javac.source=23
javac.target=23
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}
javac.test.modulepath=\
${javac.modulepath}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.html5=false
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
# The jlink additional root modules to resolve
jlink.additionalmodules=
# The jlink additional command line parameters
jlink.additionalparam=
jlink.launcher=true
jlink.launcher.name=jNetServer
main.class=jnet.server.Server
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform
project.jNetLib=../jNetLib
reference.jNetLib.jar=${project.jNetLib}/dist/jNetLib.jar
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project.
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
# To set system properties for unit tests define test-sys-prop.name=value:
run.jvmargs=
run.modulepath=\
${javac.modulepath}
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
run.test.modulepath=\
${javac.test.modulepath}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

25
nbproject/project.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>jNetServer</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
<reference>
<foreign-project>jNetLib</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
</references>
</configuration>
</project>

View File

@ -0,0 +1,710 @@
package jnet.server;
import java.sql.Timestamp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import jnet.lib.LogFile;
import jnet.lib.object.Event;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;
import jnet.lib.object.ObjectType;
import jnet.lib.object.SnmpProbe;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.User;
public class Database {
private static Connection connection = null;
private static String host;
private static String port;
private static String database;
private static String user;
private static String password;
public void connect(String host, String port, String database, String user, String password) {
this.host = host;
this.port = port;
this.database = database;
this.user = user;
this.password = password;
connection = connect();
}
private static Connection connect() {
try {
LogFile.printInfo("Connecting to a selected database ...");
Connection connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + ""
+ "?useUnicode=true"
+ "&characterEncoding=UTF-8"
+ "&autoReconnect=true"
+ "&serverTimezone=UTC", user, password);
LogFile.printInfo(" successfully");
return connection;
} catch (SQLException ex) {
LogFile.printErr("MySQL connection exception: " + ex.getMessage());
LogFile.printErr("MySQL host: " + host + " port: " + port + " database: " + database + " user: " + user);
System.exit(0);
}
return null;
}
/**
* vrati aktualni spojeni
*
* @return
* @throws SQLException
*/
public static Connection getCurrentConnection() throws SQLException {
if (connection != null || connection.isClosed()) {
return connection;
} else {
connection = connect();
}
return null;
}
/**
* insert
*
* @param sql dotaz
* @return pri uspesnem vlozeni vrati posledni vlozeny id
*/
public static int insert(String sqlQuery) {
long id = -1;
try {
Statement statement = getCurrentConnection().createStatement();
statement.executeUpdate(sqlQuery, Statement.RETURN_GENERATED_KEYS);
PreparedStatement getLastInsertId = getCurrentConnection().prepareStatement("SELECT LAST_INSERT_ID()");
ResultSet rs = getLastInsertId.executeQuery();
if (rs.next()) {
id = rs.getLong("last_insert_id()");
}
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + " SQL: " + sqlQuery);
}
return (int) id;
}
/**
* update
*
* @param sql sql dotaz
*/
public static void update(String sql) {
try {
Statement statement = getCurrentConnection().createStatement();
statement.executeUpdate(sql);
statement.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + " SQL: " + sql);
}
}
/**
* smaze zaznam z tabulky
*
* @param table nazev tabulky
* @param id id rádku
* @return
*/
static boolean remove(String table, int id) {
try {
String sql = "DELETE FROM " + table + " WHERE id = ?";
PreparedStatement stmt = getCurrentConnection().prepareStatement(sql);
stmt.setInt(1, id);
int affectedRows = stmt.executeUpdate();
if (affectedRows > 0) {
return true;
} else {
return false;
}
} catch (SQLException ex) {
LogFile.printErr("Database error: " + ex.getMessage());
}
return false;
}
/**
* vytvoří tabulku
*
* @param sql string
*/
public static void createTable(String sql) {
try {
Statement statement = getCurrentConnection().createStatement();
statement.executeUpdate(sql);
} catch (SQLException e) {
System.out.println("An error has occured on Table Creation: " + e.getMessage());
}
}
/**
* vráti seznam vsech map
*
* @return ArrayList<Map>
*/
public static ArrayList<Map> getMapList() {
String sql = "SELECT * FROM maps";
ArrayList<Map> list = new ArrayList<Map>();
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
Map m = new Map(
rs.getInt("id"),
rs.getString("name"),
rs.getBoolean("locked"));
list.add(m);
}
rs.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + "query: " + sql);
}
return list;
}
/**
* vrati seznam objektu odpovidajici mape
*
* @param mapId id mapy
* @return ArrayList<MapObject>
*/
public static ArrayList<MapObject> getMapObject(int mapId) {
ArrayList<MapObject> list = new ArrayList<>();
String sql = "SELECT * FROM objects WHERE map = " + mapId;
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet r = statement.executeQuery(sql);
while (r.next()) {
int objId = r.getInt("id");
list.add(new MapObject(
objId,
r.getString("name"),
r.getInt("map"),
r.getInt("objectType"),
r.getString("ip"),
r.getInt("x"),
r.getInt("y"),
r.getString("user"),
r.getString("password"),
r.getString("description"),
r.getString("location"),
r.getInt("snmpProfile"),
getSnmpProbe(objId),
(boolean) (r.getInt("active") == 1),
(r.getInt("winbox") == 1),
r.getString("winboxPort"),
(boolean) (r.getInt("ssh") == 1),
r.getString("sshPort"),
(boolean) (r.getInt("web") == 1),
r.getString("webPort"),
r.getInt("webVerze"),
(boolean) (r.getInt("telnet") == 1),
r.getString("telnetPort"),
(boolean) (r.getInt("sms") == 1),
r.getString("smsPort"),
r.getInt("smsVerze")
));
}
r.close();
statement.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + "query: " + sql);
}
return list;
}
/**
* vrati seznam objektu
*
* @return ArrayList<MapObject>
*/
public static ArrayList<MapObject> getAllMapObject() {
ArrayList<MapObject> list = new ArrayList<>();
String sql = "SELECT * FROM objects";
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet r = statement.executeQuery(sql);
while (r.next()) {
int objId = r.getInt("id");
list.add(new MapObject(
objId,
r.getString("name"),
r.getInt("map"),
r.getInt("objectType"),
r.getString("ip"),
r.getInt("x"),
r.getInt("y"),
r.getString("user"),
r.getString("password"),
r.getString("description"),
r.getString("location"),
r.getInt("snmpProfile"),
getSnmpProbe(objId),
(boolean) (r.getInt("active") == 1),
(r.getInt("winbox") == 1),
r.getString("winboxPort"),
(boolean) (r.getInt("ssh") == 1),
r.getString("sshPort"),
(boolean) (r.getInt("web") == 1),
r.getString("webPort"),
r.getInt("webVerze"),
(boolean) (r.getInt("telnet") == 1),
r.getString("telnetPort"),
(boolean) (r.getInt("sms") == 1),
r.getString("smsPort"),
r.getInt("smsVerze")
));
}
r.close();
statement.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + "query: " + sql);
}
return list;
}
/**
* vrati seznam SNMP probe
*
* @return ArrayList<SnmpProbe>
*/
public static ArrayList<SnmpProbe> getSnmpProbe(int objId) {
ArrayList<SnmpProbe> list = new ArrayList<>();
String sql = "SELECT * FROM snmpProbe WHERE object = " + objId;
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet r = statement.executeQuery(sql);
while (r.next()) {
list.add(new SnmpProbe(
r.getInt("id"),
r.getString("name"),
r.getInt("object")
));
}
r.close();
statement.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + "query: " + sql);
}
return list;
}
/**
* vrati informace o uzivateli podle jmena
*
* @param username
* @return User
*/
static User getUserInfo(String username) {
User u = null;
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet r_con = statement.executeQuery("SELECT * FROM users WHERE username = '" + username + "'");
while (r_con.next()) {
u = new User(r_con.getInt("id"),
username,
r_con.getString("password"),
r_con.getBoolean("add_map"),
r_con.getBoolean("remove_map"),
r_con.getBoolean("edit_map"),
r_con.getBoolean("add_object"),
r_con.getBoolean("remove_object"),
r_con.getBoolean("edit_object"),
r_con.getBoolean("edit_server")
);
}
r_con.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage());
}
return u;
}
/**
* vrati seznam object type
*
* @return ArrayList<ObjectType>
*/
static ArrayList<ObjectType> getObjectType() {
ArrayList<ObjectType> objectType = new ArrayList<>();
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet so = statement.executeQuery("SELECT * FROM objectType");
while (so.next()) {
objectType.add(new ObjectType(
so.getInt("id"),
so.getString("name"),
so.getString("image")
));
}
so.close();
} catch (SQLException ex) {
System.out.println("MySQL exception: " + ex.getMessage());
}
return objectType;
}
/**
* vrati seznam uzivatelu
*
* @return ArrayList<User>
*/
static ArrayList<User> getUsers() {
ArrayList<User> users = new ArrayList<>();
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet su = statement.executeQuery("SELECT * FROM users");
while (su.next()) {
users.add(new User(
su.getInt("id"),
su.getString("username"),
"",
su.getBoolean("add_map"),
su.getBoolean("remove_map"),
su.getBoolean("edit_map"),
su.getBoolean("add_object"),
su.getBoolean("remove_object"),
su.getBoolean("edit_object"),
su.getBoolean("edit_server")
));
}
su.close();
} catch (SQLException ex) {
System.out.println("MySQL exception: " + ex.getMessage());
}
return users;
}
/**
* vrati snmp profily
*
* @return ArrayList<SnmpProfile>
*/
static ArrayList<SnmpProfile> getSnmpProfile() {
ArrayList<SnmpProfile> snmpProfile = new ArrayList<>();
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM snmpProfile");
while (rs.next()) {
snmpProfile.add(new SnmpProfile(
rs.getInt("id"),
rs.getString("name"),
rs.getInt("version"),
rs.getString("port"),
rs.getString("communityRead"),
rs.getString("communityRead")
));
}
rs.close();
} catch (SQLException ex) {
System.out.println("MySQL exception: " + ex.getMessage());
}
return snmpProfile;
}
/**
* vrati seznam udalosti
*
* @param
* @return ArrayList<Event>
*/
public static ArrayList<Event> getEvents() {
ArrayList<Event> list = new ArrayList<>();
String sql = "SELECT * FROM events";
try {
Statement statement = getCurrentConnection().createStatement();
ResultSet r = statement.executeQuery(sql);
while (r.next()) {
list.add(new Event(
r.getInt("id"),
r.getInt("object"),
r.getLong("start"),
r.getLong("finish"),
r.getString("description"),
r.getInt("type")
));
}
r.close();
statement.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + "query: " + sql);
}
return list;
}
/**
* pridá objekt
*
* @param mo MapObject
* @return
*/
static MapObject addMapObject(MapObject mo) {
String query = "INSERT INTO objects ("
+ "name,"
+ "ip,"
+ "x,"
+ "y,"
+ "map,"
+ "objectType,"
+ "active,"
+ "user,"
+ "password,"
+ "description,"
+ "location,"
+ "snmpProfile,"
+ "winbox,"
+ "winboxPort,"
+ "ssh,"
+ "sshPort,"
+ "web,"
+ "webPort,"
+ "webVerze,"
+ "telnet,"
+ "telnetPort,"
+ "sms,"
+ "smsPort,"
+ "smsVerze"
+ ") VALUES ("
+ "'" + mo.getName() + "',"
+ "'" + mo.getIp() + "',"
+ "'" + mo.getX() + "',"
+ "'" + mo.getY() + "',"
+ "'" + mo.getMap() + "',"
+ "'" + mo.getObjectType() + "',"
+ "'" + (mo.isActive() ? 1 : 0) + "',"
+ "'" + mo.getUser() + "',"
+ "'" + mo.getPassword() + "',"
+ "'" + mo.getDescription() + "',"
+ "'" + mo.getLocation() + "',"
+ "'" + mo.getSnmpProfile() + "',"
+ "'" + (mo.isWinbox() ? 1 : 0) + "',"
+ "'" + mo.getWinboxPort() + "',"
+ "'" + (mo.isSsh() ? 1 : 0) + "',"
+ "'" + mo.getSshPort() + "',"
+ "'" + (mo.isWeb() ? 1 : 0) + "',"
+ "'" + mo.getWebPort() + "',"
+ "'" + mo.getWebVerze() + "',"
+ "'" + (mo.isTelnet() ? 1 : 0) + "',"
+ "'" + mo.getTelnetPort() + "',"
+ "'" + (mo.isSms() ? 1 : 0) + "',"
+ "'" + mo.getSmsPort() + "',"
+ "'" + mo.getSmsVerze() + "'"
+ ")";
mo.setId(insert(query));
return mo;
}
/**
* nastaví stav zámku mapy
*
* @param state stav
* @param map map id
*/
static void mapLock(int state, int map) {
update("UPDATE maps SET locked='" + state + "' WHERE id=" + map);
}
/**
* pridá typ objektu
*
* @param ot ObjectType
* @return
*/
static int addObjectType(ObjectType ot) {
return insert("INSERT INTO objectType (name, image) VALUES ('" + ot.getName() + "', '" + ot.getImgStr() + "')");
}
/**
* odebere objekt z databaze
*
* @param id
*/
static void removeObject(int id) {
if (remove("objects", id)) {
LogFile.printInfo("Obejct ID " + id + " removed from database");
} else {
LogFile.printErr("Obejct ID " + id + " not removed from database");
}
}
/**
* odebere mapu z databaze
*
* @param id
*/
static void removeMap(int id) {
if (remove("maps", id)) {
LogFile.printInfo("Map ID " + id + " removed from database");
} else {
LogFile.printErr("Map ID " + id + " not removed from database");
}
}
/**
* pridani mapy
*
* @param name nazev mapy
* @return
*/
static int addMap(String name) {
return insert("INSERT INTO maps (name) VALUES ('" + name + "')");
}
/**
* zmeni pozici objektu
*
* @param id id objektu
* @param x pozice x
* @param y pozice y
*/
static void objectMove(int id, int x, int y) {
update("UPDATE objects SET x='" + x + "', y='" + y + "' WHERE id=" + id);
}
/**
* upravi object
*
* @param mo MapObject
*/
static void updateObject(MapObject mo) {
update("UPDATE objects SET "
+ "name='" + mo.getName() + "', "
+ "ip='" + mo.getIp() + "', "
+ "x='" + mo.getX() + "', "
+ "y='" + mo.getY() + "',"
+ "map='" + mo.getMap() + "', "
+ "objectType='" + mo.getObjectType() + "', "
+ "active='" + (mo.isActive() ? 1 : 0) + "', "
+ "user='" + mo.getUser() + "', "
+ "password='" + mo.getPassword() + "', "
+ "description='" + mo.getDescription() + "', "
+ "location='" + mo.getLocation() + "', "
+ "snmpProfile='" + mo.getSnmpProfile() + "', "
+ "winbox='" + (mo.isWinbox() ? 1 : 0) + "', "
+ "winboxPort='" + mo.getWinboxPort() + "', "
+ "ssh='" + (mo.isSsh() ? 1 : 0) + "', "
+ "sshPort='" + mo.getSshPort() + "', "
+ "web='" + (mo.isWeb() ? 1 : 0) + "', "
+ "webPort='" + mo.getWebPort() + "', "
+ "webVerze='" + mo.getWebVerze() + "', "
+ "telnet='" + (mo.isTelnet() ? 1 : 0) + "', "
+ "telnetPort='" + mo.getTelnetPort() + "', "
+ "sms='" + (mo.isSms() ? 1 : 0) + "', "
+ "smsPort='" + mo.getSmsPort() + "', "
+ "smsVerze='" + mo.getSmsVerze() + "' "
+ "WHERE id=" + mo.getId());
}
public static Event addEvent(int mo_id, String description, int type) {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
Event event = new Event(mo_id,
timestamp.getTime(),
description,
type);
int id = insert("INSERT INTO events ("
+ "object, "
+ "start, "
+ "description, "
+ "type"
+ ") VALUES ("
+ "'" + event.getObject() + "',"
+ "'" + event.getStart() + "',"
+ "'" + event.getDescription() + "',"
+ "'" + event.getType() + "'"
+ ")");
event.setId(id);
return event;
}
public static Event endEvent(int objectId, int type) {
Event event = null;
try {
String select_query = "SELECT * FROM events WHERE object = '" + objectId + "' && type = '" + type + "' ORDER BY id DESC LIMIT 1";
System.err.println(select_query);
PreparedStatement stmt = getCurrentConnection().prepareStatement(select_query);
ResultSet rs = stmt.executeQuery();
// Process the result
if (rs.next()) {
event = new Event(
objectId,
rs.getLong("start"),
rs.getString("description"),
type);
event.setId(rs.getInt("id"));
}
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
event.setEnd(timestamp.getTime());
String update_query = "UPDATE events SET finish='" + event.getEnd() + "' WHERE id=" + event.getId();
update(update_query);
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage());
}
return event;
}
static int addUser(User user) {
return insert("INSERT INTO users ("
+ "username, "
+ "password, "
+ "add_map, "
+ "remove_map, "
+ "edit_map, "
+ "add_object, "
+ "remove_object, "
+ "edit_object, "
+ "edit_server"
+ ") VALUES ("
+ "'"+user.getUsername()+"',"
+ "'"+user.getPassword()+"',"
+ "'"+(user.isAddMap()?1:0)+"',"
+ "'"+(user.isRemoveMap()?1:0)+"',"
+ "'"+(user.isEditMap()?1:0)+"',"
+ "'"+(user.isAddObject()?1:0)+"',"
+ "'"+(user.isRemoveObject()?1:0)+"',"
+ "'"+(user.isEditObject()?1:0)+"',"
+ "'"+(user.isEditServer()?1:0)+"'"
+ ")");
}
static void editUser(User ur) {
String sql = "UPDATE users SET "
+ "username='" + ur.getUsername() + "',"
+ "add_map='" + (ur.isAddMap() ? 1:0) + "',"
+ "remove_map='" + (ur.isRemoveMap() ? 1:0) + "',"
+ "edit_map='" + (ur.isEditMap() ? 1:0) + "',"
+ "add_object='" + (ur.isAddObject() ? 1:0) + "',"
+ "remove_object='" + (ur.isEditObject() ? 1:0) + "',"
+ "edit_object='" + (ur.isRemoveObject() ? 1:0) + "',"
+ "edit_server='" + (ur.isEditServer() ? 1:0) + "'"
+ "WHERE id='" + ur.getId() + "'";
update(sql);
}
static void deleteObjectLog(int objId) {
String sql = "DELETE FROM events WHERE object = " + objId;
try {
Statement statement = getCurrentConnection().createStatement();
statement.executeUpdate(sql);
statement.close();
} catch (SQLException ex) {
LogFile.printErr("MySQL exception: " + ex.getMessage() + " SQL: " + sql);
}
}
}

149
src/jnet/server/Server.java Normal file
View File

@ -0,0 +1,149 @@
package jnet.server;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import jnet.lib.BuilddDate;
import jnet.lib.LogFile;
import jnet.lib.LogWindow;
import jnet.lib.OSValidator;
import jnet.lib.PasswordHashing;
import jnet.lib.PropertiesManager;
import jnet.lib.object.Event;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;
import jnet.lib.object.ObjectType;
import jnet.lib.object.OnlineClients;
import jnet.lib.object.SnmpProbe;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.User;
import jnet.server.network.NettyServer;
import jnet.server.probe.Ping2;
public class Server {
// verze serveru
public static final int SERVER_VERSION = 1;
// minimální verze klienta
public static final int MINIMAL_CLIENT_VERSION = 1;
public static PropertiesManager config;
public static List<Map> maps = new ArrayList<>();
public static ArrayList<MapObject> mapObject= new ArrayList<>();
public static ArrayList<OnlineClients> onlineClients = new ArrayList<>();
public static ArrayList<ObjectType> objectType = new ArrayList<>();
public static ArrayList<SnmpProfile> snmpProfile = new ArrayList<>();
public static ArrayList<SnmpProbe> snmpProbe = new ArrayList<>();
public static ArrayList<User> users = new ArrayList<>();
public static ArrayList<Event> events = new ArrayList<>();
public static void main(String[] args) {
// pokud je hostitelsky system windows otevre logovaci okno
if (OSValidator.isWindows()) {
new LogWindow();
}
LogWindow.addRow("tset");
LogFile.clear();
LogFile.setDebug(false);
LogFile.printInfo("---------------------------------------------");
LogFile.printInfo(" jNet Server ");
LogFile.printInfo(" Version: " + SERVER_VERSION + " (" + BuilddDate.get() + ")");
LogFile.printInfo("---------------------------------------------");
LogFile.printInfo("");
///
/// nahrani konfigurace
///
LogFile.printInfo("Loading config ...");
try {
// Načtení existující konfigurace, pokud soubor existuje
config = new PropertiesManager("config.properties");
config.load();
LogFile.printInfo(" successfully");
} catch (PropertiesManager.FileException | PropertiesManager.ConfigException ex) {
LogFile.printErr(" fail. " + ex.getMessage());
System.exit(0);
}
///
/// debug rezim ?
///
if (config.getBoolean("debug")) {
LogFile.setDebug(true);
LogFile.printDebug("Debug mode on");
}
///
/// pripojeni k databazi
///
new Database().connect(config.getString("mysql_server"),
config.getString("mysql_port"),
config.getString("mysql_database"),
config.getString("mysql_user"),
config.getString("mysql_password"));
///
/// konfigurace z databaze
///
LogFile.printInfo("Loading user list ...");
users = Database.getUsers();
LogFile.printInfo(" load " + users.size() + " user(s)");
LogFile.printInfo("Loading map list ...");
maps = Database.getMapList();
LogFile.printInfo(" load " + maps.size() + " map(s)");
LogFile.printInfo("Loading object list ...");
mapObject = Database.getAllMapObject();
LogFile.printInfo(" load " + mapObject.size() + " object(s)");
LogFile.printInfo("Loading object type ...");
objectType = Database.getObjectType();
LogFile.printInfo(" load " + objectType.size() + " type(s)");
LogFile.printInfo("Loading SNMP profile ...");
snmpProfile = Database.getSnmpProfile();
LogFile.printInfo(" load " + snmpProfile.size() + " profile(s)");
// LogFile.printInfo("Loading SNMP template ...");
// snmpProbe = Database.getSnmpProbe();
// LogFile.printInfo(" load " + snmpProbe.size() + " template(s)");
LogFile.printInfo("Loading events ...");
events = Database.getEvents();
LogFile.printInfo(" load " + events.size() + " event(s)");
///
/// spusteni serveru
///
NettyServer nettyserver = new NettyServer(config.getInt("server_port"));
nettyserver.start();
///
/// spusteni ping probe
///
/// spousete pro kazdou mapu samostatne ?
///
// Ping pp = new Ping();
// pp.start();
Ping2 p2 = new Ping2();
p2.start();
}
}

View File

@ -0,0 +1,336 @@
package jnet.server;
import io.netty.channel.Channel;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
import java.net.InetSocketAddress;
import java.util.ListIterator;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.PasswordHashing;
import jnet.lib.object.Event;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;
import jnet.lib.object.ObjectType;
import jnet.lib.object.OnlineClients;
import jnet.lib.object.ServerConfig;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.User;
public class ServerMessageParser {
private final Channel currentClient;
private static final ChannelGroup channels = new DefaultChannelGroup(
"containers", GlobalEventExecutor.INSTANCE);
public ServerMessageParser(Channel currentClient) {
this.currentClient = currentClient;
}
public void parse(Message msg) {
LogFile.printDebug("-> Message type: " + msg.getType());
ListIterator<Map> iteratorMap = Server.maps.listIterator();
ListIterator<MapObject> iteratorMapObject = Server.mapObject.listIterator();
switch (msg.getType()) {
case Message.CLIENT_VERSION:
int client_version = (int) msg.getMsg();
if (client_version < Server.MINIMAL_CLIENT_VERSION) {
LogFile.printInfo("Outdated client. Sent update request (" + ((InetSocketAddress) currentClient.remoteAddress()).getHostName() + ")");
send(new Message(Message.UPDATE, null));
} else {
LogFile.printInfo("Authorization request send (" + ((InetSocketAddress) currentClient.remoteAddress()).getHostName() + ")");
// oodeslat pozadavek na autorizacni udaje
send(new Message(Message.AUTH_REQUEST, null));
}
break;
case Message.AUTH:
String[] userData = (String[]) msg.getMsg();
String username = userData[0];
String password = userData[1];
int platform = Integer.parseInt(userData[2]);
User u = Database.getUserInfo(username);
if (PasswordHashing.verify(password, u.getPassword())) {
LogFile.printInfo("User: " + username + " logged in (" + ((InetSocketAddress) currentClient.remoteAddress()).getAddress().getHostName() + ")");
// odeslat informaci uzivateli o jeho uspesnem prihlaseni
send(new Message(Message.AUTH_SUCEFULL, null));
// pridani uzivatele mezi pripojene kanaly
channels.add(currentClient);
// vložit uživatele na seznam online uživatelů
InetSocketAddress socketAddress = (InetSocketAddress) currentClient.remoteAddress();
String clientIp = socketAddress.getAddress().getHostAddress();
String clientPort = String.valueOf(socketAddress.getPort());
Server.onlineClients.add(new OnlineClients(
String.valueOf(u.getId()),
u.getUsername(),
clientIp,
clientPort,
platform));
// odeslat informace o prihlasenem uzivateli, opravneni atd
send(new Message(Message.USER_INFO, u));
// odeslat vsem nový seznam pripojenych klientu
sendAll(new Message(Message.ONLINE_CLIENTS, Server.onlineClients));
// odeslat nastaveni serveru
ServerConfig sc = new ServerConfig(
Server.config.getInt("ping_attempt"),
Server.config.getInt("ping_timeout"),
Server.config.getInt("instability_attempt"),
Server.config.getInt("instability_limit"));
send(new Message(Message.SERVER_CONFIG, sc));
// odeslat typy objektu
for (ObjectType ot : Server.objectType) {
send(new Message(Message.OBJECT_TYPE, ot));
}
// odesila seznam uzivatelu
for (User us : Server.users) {
send(new Message(Message.USER, us));
}
// odeslat seznam map
for (Map i : Server.maps) {
send(new Message(Message.MAP, i));
}
// odeslat seznam objektu
send(Message.OBJECT_LIST, Server.mapObject);
// odeslat seznam udalosti
send(new Message(Message.EVENT_LIST, Server.events));
// odeslat seznam snmp profilů
for (SnmpProfile i : Server.snmpProfile) {
send(new Message(Message.SNMP_PROFILE, i));
}
} else {
LogFile.printInfo("Authorization failed (ser: " + username + " )");
}
break;
case Message.NEW_OBJECT_TYPE:
ObjectType not = (ObjectType) msg.getMsg();
int id = Database.addObjectType(not);
not.setId(id);
Server.objectType.add(not);
sendAll(new Message(Message.OBJECT_TYPE, not));
break;
case Message.SET_MAP_LOCK:
int[] data_lock = (int[]) msg.getMsg();
while (iteratorMap.hasNext()) {
Map map = iteratorMap.next();
if (map.getId() == data_lock[0]) {
map.setLock((data_lock[1] == 1));
break;
}
}
// upravit informaci v databazi
Database.mapLock(data_lock[1], data_lock[0]);
// odeslani informace ostatnim
sendAll(new Message(Message.SET_MAP_LOCK, data_lock));
break;
case Message.ADD_OBJECT:
MapObject mo = Database.addMapObject((MapObject) msg.getMsg());
// pridat do seznamu
iteratorMapObject.add(mo);
// odesle všem novy objekt
sendAll(new Message(Message.ADD_OBJECT, mo));
// prida event a odesle ho
Event event = Database.addEvent(mo.getId(), "Přidáno", Event.TYPE_INFO);
sendAll(new Message(Message.EVENT_NEW, event));
// pokud je object vypnuty prida log
if (!mo.isActive()) {
Event event_disable = Database.addEvent(mo.getId(), "Ping vypnut", Event.TYPE_PING_OFF);
sendAll(new Message(Message.EVENT_NEW, event_disable));
}
break;
case Message.REMOVE_OBJECT:
while (iteratorMapObject.hasNext()) {
MapObject obj = iteratorMapObject.next();
if (obj.getId() == (int) msg.getMsg()) {
// odebere z databaze
Database.removeObject(obj.getId());
// odesle informaci o odebrani objektu klientum
sendAll(new Message(Message.REMOVE_OBJECT, obj.getId()));
// odebere ze seznamu
iteratorMapObject.remove();
break;
}
}
break;
case Message.MAP_REMOVE:
while (iteratorMap.hasNext()) {
Map map = iteratorMap.next();
if (map.getId() == (int) msg.getMsg()) {
// odebere z databaze
Database.removeMap(map.getId());
// odesle informaci o odebrani objektu klientum
sendAll(new Message(Message.MAP_REMOVE, map.getId()));
// odebere ze seznamu
iteratorMap.remove();
break;
}
}
break;
case Message.MAP_ADD:
Map map = new Map((String) msg.getMsg());
// přidání mapy do databaze
map.setId(Database.addMap(map.getName()));
//odeslání mapy klientum
send(new Message(Message.MAP, map));
// pridani mapy do seznamu
iteratorMap.add(map);
break;
case Message.OBJECT_MOVE:
int[] data = (int[]) msg.getMsg();
// 0 = obj id
// 2 = x
// 2 = y
// zmenit v databázi
Database.objectMove(data[0], data[1], data[2]);
// zmenit v seznamu
while (iteratorMapObject.hasNext()) {
MapObject obj = iteratorMapObject.next();
if (obj.getId() == data[0]) {
// zmenit pozici
obj.setX(data[1]);
obj.setY(data[2]);
// zapsat zmenu do databaze
Database.objectMove(data[0], data[1], data[2]);
// preposlat zmenu klientum
sendAll(new Message(Message.UPDATE_OBJECT, obj));
break;
}
}
break;
case Message.UPDATE_OBJECT:
MapObject mo_u = (MapObject) msg.getMsg();
// zmenit v databazi
Database.updateObject(mo_u);
// zmenit v seznamu
while (iteratorMapObject.hasNext()) {
if (iteratorMapObject.next().getId() == mo_u.getId()) {
iteratorMapObject.set(mo_u);
break;
}
}
// preposlat zmenu klientum
sendAll(new Message(Message.UPDATE_OBJECT, mo_u));
break;
case Message.DELETE_LOG:
int objId = (int) msg.getMsg();
// vymaže logy v databazi
Database.deleteObjectLog(objId);
// vymaze logy v listu
ListIterator<Event> iterator = Server.events.listIterator();
while (iterator.hasNext()) {
if (iterator.next().getObject() == objId) {
iterator.remove();
break;
}
}
sendAll(new Message(Message.DELETE_LOG, objId));
break;
case Message.USER:
User user = (User) msg.getMsg();
user.setPassword(PasswordHashing.hash(user.getPassword()));
//pridáni do databáze a nastaveni id
user.setId(Database.addUser(user));
// přidání do seznamu
Server.users.add(user);
// odeslat klientum nového uživatele
send(new Message(Message.USER, user));
break;
case Message.USER_EDIT:
User ue = (User) msg.getMsg();
// upraveni v databázi
Database.editUser(ue);
// zmenit v seznamu
ListIterator<User> iteratorUser = Server.users.listIterator();
while (iteratorUser.hasNext()) {
User next = iteratorUser.next();
if (next.getId() == ue.getId()) {
iteratorUser.set(ue);
break;
}
}
// preposlat zmenu klientum
sendAll(new Message(Message.USER_EDIT, ue));
break;
case Message.SERVER_CONFIG:
ServerConfig sc = (ServerConfig) msg.getMsg();
// ulozeni
Server.config.setInt("ping_attempt", sc.getPingAttempt());
Server.config.setInt("ping_timeout", sc.getPingTimeout());
Server.config.setInt("instability_attempt", sc.getInstabilityAttempt());
Server.config.setInt("instability_limit", sc.getInstabilityLimit());
Server.config.save();
//odeslani vsem
sendAll(Message.SERVER_CONFIG, sc);
break;
default:
LogFile.printErr("Neznamy typ zpravy");
}
}
public void send(Message message) {
currentClient.writeAndFlush(message);
LogFile.printDebug("<- Message type: " + message.getType());
}
public void send(int type, Object obj) {
currentClient.writeAndFlush(new Message(type, obj));
LogFile.printDebug("<- Message type: " + type);
}
public static void sendAll(Message message) {
if (channels.isEmpty()) {
return;
}
channels.writeAndFlush(message);
LogFile.printDebug("<- For all. Message type: " + message.getType());
}
public static void sendAll(int type, Object obj) {
if (channels.isEmpty()) {
return;
}
channels.writeAndFlush(new Message(type, obj));
LogFile.printDebug("<- For all. Message type: " + type);
}
public static final void removeClient(Channel ch) {
// odebrani z připojenych kanalu
channels.remove(ch);
// odebrani ze seznamu klientu
InetSocketAddress socketAddress = (InetSocketAddress) ch.remoteAddress();
String clientIp = socketAddress.getAddress().getHostAddress();
String clientPort = String.valueOf(socketAddress.getPort());
for (OnlineClients oc : Server.onlineClients) {
if (oc.getIp().equals(clientIp) && oc.getPort().equals(clientPort)) {
Server.onlineClients.remove(oc);
System.err.println("Client removed");
break;
}
}
// odeslat vsem novy seznam klientu
sendAll(new Message(Message.ONLINE_CLIENTS, Server.onlineClients));
}
}

View File

@ -0,0 +1,61 @@
package jnet.server.network;
import jnet.lib.LogFile;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
/**
*
* @author cucky
*/
public class NettyServer extends Thread {
private int port;
public NettyServer(int port) {
this.port = port;
}
@Override
public void run() {
// Skupiny pro zpracování I/O operací
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// Vytvoření ServerBootstrap pro nastavení serveru
ServerBootstrap serverBootstrap = new ServerBootstrap()
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
//.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast("decoder", new ObjectDecoder(ClassResolvers.weakCachingConcurrentResolver(getClass().getClassLoader())));
ch.pipeline().addLast("encoder", new ObjectEncoder());
ch.pipeline().addLast(new ServerHandler()); // Vlastní handler pro zpracování zpráv
}
});
// Bind serveru na specifikovaný port (např. 8080)
Channel channel = serverBootstrap.bind(port).sync().channel();
LogFile.printInfo("Server is ready and listening on port " + port);
// Čekání na ukončení serveru
channel.closeFuture().sync();
} catch (Exception ex) {
LogFile.printErr("Server exception: " + ex);
} finally {
// Uvolnění prostředků
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}

View File

@ -0,0 +1,40 @@
package jnet.server.network;
import jnet.server.ServerMessageParser;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import jnet.lib.LogFile;
import jnet.lib.Message;
public class ServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof Message) {
Message m = (Message) msg;
new ServerMessageParser(ctx.channel()).parse((Message) msg);
}
if (msg instanceof String) {
System.out.println("Client message: " + msg);
}
}
@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
System.out.println("Client connected");
Channel currentClient = ctx.channel();
currentClient.writeAndFlush(new Message(Message.CLIENT_VERSION, null));
}
@Override
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
LogFile.printInfo("Client disconnected");
ServerMessageParser.removeClient(ctx.channel());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
ctx.close();
}
}

View File

@ -0,0 +1,88 @@
package jnet.server.network;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import io.netty.handler.ssl.util.SelfSignedCertificate;
import java.security.cert.CertificateException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLException;
/**
*
* @author cucky
*/
public class ServerSsl extends Thread {
private int port;
public ServerSsl(int port) {
this.port = port;
}
@Override
public void run() {
try {
// Načtení self-signed certifikátu a privátního klíče
//File certChainFile = new File("cert.pem");
//File privateKeyFile = new File("key.pem");
// Vytvoření SSL kontextu
//SslContext sslContext = SslContextBuilder.forServer(certChainFile, privateKeyFile).build();
// Self-signed certifikát pro server
SelfSignedCertificate ssc = new SelfSignedCertificate();
// SSL kontext pro server
SslContext sslContext = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey())
.trustManager(InsecureTrustManagerFactory.INSTANCE) // Nepožadujeme důvěryhodné klientské certifikáty
.build();
// Skupiny pro zpracování I/O operací
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// Vytvoření ServerBootstrap pro nastavení serveru
ServerBootstrap serverBootstrap = new ServerBootstrap()
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
//.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(sslContext.newHandler(ch.alloc())); // SSL handler
ch.pipeline().addLast(new StringDecoder()); // Dekóduje zprávy přijaté od klienta
ch.pipeline().addLast(new StringEncoder()); // Kóduje zprávy odeslané klientovi
ch.pipeline().addLast(new ServerHandler()); // Vlastní handler pro zpracování zpráv
}
});
// Bind serveru na specifikovaný port (např. 8080)
Channel channel = serverBootstrap.bind(port).sync().channel();
System.out.println("ssl Server is ready and listening on port " + port);
// Čekání na ukončení serveru
channel.closeFuture().sync();
} catch (Exception ex) {
Logger.getLogger(ServerSsl.class.getName()).log(Level.SEVERE, null, ex);
} finally {
// Uvolnění prostředků
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
} catch (SSLException ex) {
Logger.getLogger(ServerSsl.class.getName()).log(Level.SEVERE, null, ex);
} catch (CertificateException ex) {
Logger.getLogger(ServerSsl.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

View File

@ -0,0 +1,136 @@
package jnet.server.probe;
import java.io.IOException;
import java.net.InetAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.Status;
import jnet.lib.object.Event;
import jnet.lib.object.MapObject;
import jnet.server.Database;
import jnet.server.Server;
import jnet.server.ServerMessageParser;
public class Ping extends Thread {
// Perioda opakování v sekundách
private static final int PERIOD = 3;
// Timeout pro ping (v milisekundách)
private static final int TIMEOUT = 2000;
// pocet pokus pro nastaveni offline statusu
private static final int ATTEMPT = 3;
public Ping() {
}
@Override
public void start() {
init();
}
private void init() {
// ExecutorService pro paralelní provádění pingů
ExecutorService executorService = Executors.newCachedThreadPool();
// ScheduledExecutorService pro periodické provádění
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
// Naplánování periodického provádění kontrol
scheduledExecutorService.scheduleAtFixedRate(() -> {
for (MapObject mo : Server.mapObject) {
if (mo.isActive()) {
// Vytvoření úkolu pro pingování každé IP adresy
executorService.submit(() -> {
try {
long responseTime = pingWithResponseTime(mo.getIp());
if (responseTime >= 0) {
isOnline(mo, responseTime);
} else {
isOffline(mo);
}
} catch (Exception e) {
LogFile.printDebug("Chyba pri pingovani " + mo.getIp() + ": " + e.getMessage());
}
});
}
}
}, 0, PERIOD, TimeUnit.SECONDS);
}
// Funkce pro kontrolu dostupnosti IP adresy s timeoutem a zobrazení času odezvy
private static long pingWithResponseTime(String ipAddress) throws IOException, InterruptedException {
InetAddress inet = InetAddress.getByName(ipAddress);
long startTime = System.currentTimeMillis(); // Začátek měření času
boolean reachable = inet.isReachable(TIMEOUT); // Timeout pro ping 5 sekund
long endTime = System.currentTimeMillis(); // Konec měření času
if (reachable) {
return endTime - startTime; // Vrátí dobu odezvy v milisekundách
} else {
return -1; // Pokud není dostupná, vrátí -1
}
}
private void isOnline(MapObject mo, long responseTime) {
// LogFile.printDebug(mo.getName() + "(" + mo.getIp() + ") online, latence: " + responseTime + " ms");
// pokud neni predchozi stav ok odesle novy stav
if (mo.getStatus() != Status.OK) {
// pokud byl predchozi stav offline ukonci event
if (mo.getStatus() == Status.OFFLINE) {
// zapise do logu konec udalosti
Event event = Database.endEvent(mo.getId(), Event.TYPE_PING);
for (int i = 0; i < Server.events.size(); i++) {
if (Server.events.get(i).getId() == event.getId()) {
Server.events.set(i, event);
ServerMessageParser.sendAll(new Message(Message.EVENT_UPDATE, (Event) event));
break;
}
}
// vynuluje počet pokusu o ping
mo.setPingAttemp(0);
// nastavi a odesle stav
setNewState(mo, Status.OK);
}
// pokud byl predchozi stav N/A
if (mo.getStatus() == Status.NA) {
// nastavi a odesle stav
setNewState(mo, Status.OK);
}
}
}
private void setNewState(MapObject mo, int state) {
mo.setStatus(state);
// odesle stav
int[] o = {mo.getId(), state};
ServerMessageParser.sendAll(new Message(Message.STATUS_UPDATE, o));
}
private void isOffline(MapObject mo) {
// zvysi pocet jiz probehlích pokusu o ping
mo.pingAttemp++;
// vyhodnoti
if (mo.getStatus() != Status.OFFLINE && mo.getPingAttemp() >= ATTEMPT) {
int[] o = {mo.getId(), Status.OFFLINE};
// nastavi objektu status
mo.setStatus(Status.OFFLINE);
// zapise do logu
// zapise do databaze
Event event = Database.addEvent(mo.getId(), "offline", Event.TYPE_PING);
Server.events.add(event);
//odesle stav a event klientum
ServerMessageParser.sendAll(new Message(Message.STATUS_UPDATE, o));
ServerMessageParser.sendAll(new Message(Message.EVENT_NEW, event));
}
}
}

View File

@ -0,0 +1,78 @@
package jnet.server.probe;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import jnet.lib.LogFile;
import jnet.lib.Status;
import jnet.lib.object.MapObject;
import jnet.server.Server;
import org.icmp4j.IcmpPingRequest;
import org.icmp4j.IcmpPingResponse;
import org.icmp4j.IcmpPingUtil;
public class Ping2 extends Thread {
// Maximální počet paralelně běžících pingů
private static final int MAX_COUNT = 1000;
// Čekání před dalším opakováním pingu (ms)
private static final int WAITING = 1000;
private static final ExecutorService executor = Executors.newFixedThreadPool(MAX_COUNT);
private static final List<String> hosts = new CopyOnWriteArrayList<>(); // Dynamický seznam hostů
public Ping2() {
}
@Override
public void start() {
LogFile.printInfo("Ping start ...");
startPingLoop();
}
// Metoda pro spuštění opakovaného pingování
private static void startPingLoop() {
while (true) {
Iterator<MapObject> itMapObject = Server.mapObject.iterator();
while (itMapObject.hasNext()) {
MapObject obj = itMapObject.next();
if (obj.isActive()) {
executor.submit(() -> pingHost(obj));
}
}
try {
Thread.sleep(WAITING);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
// Metoda pro provedení jednoho pingu na host
private static void pingHost(MapObject obj) {
try {
IcmpPingRequest request = IcmpPingUtil.createIcmpPingRequest();
request.setHost(obj.getIp());
// Nastavení timeoutu na 3000 ms (3 sekundy)
request.setTimeout(3000);
// Odeslání pingu a zpracování odpovědi
IcmpPingResponse response = IcmpPingUtil.executePingRequest(request);
if (response.getSuccessFlag()) {
//System.out.println("Ping na " + obj.getIp() + " úspěšný. Latence: " + response.getDuration() + " ms");
new PingTestResult(obj).test(Status.OK, response.getDuration());
} else {
System.out.println("Ping na " + obj.getName() + " (obj id: " + obj.getId() + ") selhal. Status: " + response.getErrorMessage());
new PingTestResult(obj).test(Status.OFFLINE, response.getDuration());
}
} catch (Exception e) {
LogFile.printErr("Ping error: " + obj.getIp() + ": " + e.getMessage());
}
}
}

View File

@ -0,0 +1,91 @@
package jnet.server.probe;
import java.util.ListIterator;
import jnet.lib.Message;
import jnet.lib.Status;
import jnet.lib.object.Event;
import jnet.lib.object.MapObject;
import jnet.server.Database;
import jnet.server.Server;
import jnet.server.ServerMessageParser;
public class PingTestResult {
private static MapObject obj;
private static ListIterator<Event> it_event = Server.events.listIterator();
public PingTestResult(MapObject obj) {
this.obj = obj;
}
public static void test(int state, long latency) {
// oveří jestli neni zarizeni vypnuto
if (obj.isActive()) {
// oveří zda je stav rozdilny od predchozího
if (obj.getStatus() != state) {
switch (state) {
case Status.OK:
obj.setPingAttemp(0);
if (obj.getStatus() == Status.OFFLINE) {
// pokud je predchozi stav offline ukonci event
// Event event = Database.endEvent(obj.getId(), Event.TYPE_PING);
// if (event != null) {
// // odesle event klientum
// ServerMessageParser.sendAll(new Message(Message.EVENT_UPDATE, event));
// // aktualizuje v seznamu
// while (it_event.hasNext()) {
// Event e = it_event.next();
// if (e.getId() == event.getId()) {
// it_event.set(e);
// break;
// }
// }
// }
}
// zmena stavu v seznamu
System.out.println("online obj id: " + obj.getId());
changeStateOnObject(state);
// odesle informaci o novem stavu klientum
int[] o = {obj.getId(), state};
ServerMessageParser.sendAll(new Message(Message.STATUS_UPDATE, o));
break;
case Status.OFFLINE:
if (obj.getPingAttemp() >= Server.config.getInt("ping_attempt")) {
// pridáni eventu
Event event = Database.addEvent(obj.getId(), "Offline", Event.TYPE_PING);
it_event.add(event);
// Odeslani eventu klientum
ServerMessageParser.sendAll(new Message(Message.EVENT_NEW, event));
// zmena stavu v seznamu
System.err.println("offline obj id: " + obj.getId());
changeStateOnObject(state);
// odesle informaci o novem stavu klientum
int[] oo = {obj.getId(), state};
ServerMessageParser.sendAll(new Message(Message.STATUS_UPDATE, oo));
} else {
obj.pingAttemp++;
System.out.println("offline obj id: " + obj.getId() + " pokus: " + obj.pingAttemp);
}
break;
default:
System.err.println("default -> " + state);
throw new AssertionError();
}
}
}
}
private static synchronized void changeStateOnObject(int state) {
System.out.println("Change status " + obj.getId() + " -> " + state);
// upravi stav v listu
obj.setStatus(state);
}
}