second commit 20/01/2026
This commit is contained in:
13
.idea/deviceManager.xml
generated
Normal file
13
.idea/deviceManager.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DeviceTable">
|
||||
<option name="columnSorters">
|
||||
<list>
|
||||
<ColumnSorterState>
|
||||
<option name="column" value="Name" />
|
||||
<option name="order" value="ASCENDING" />
|
||||
</ColumnSorterState>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
5
html/assets/bootstrap/css/bootstrap.min.css
vendored
Normal file
5
html/assets/bootstrap/css/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
html/assets/bootstrap/js/bootstrap.min.js
vendored
Normal file
6
html/assets/bootstrap/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
57
html/assets/css/Login-Form-Basic-icons.css
Normal file
57
html/assets/css/Login-Form-Basic-icons.css
Normal file
@@ -0,0 +1,57 @@
|
||||
.bs-icon {
|
||||
--bs-icon-size: .75rem;
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: var(--bs-icon-size);
|
||||
width: calc(var(--bs-icon-size) * 2);
|
||||
height: calc(var(--bs-icon-size) * 2);
|
||||
color: var(--bs-primary);
|
||||
}
|
||||
|
||||
.bs-icon-xs {
|
||||
--bs-icon-size: 1rem;
|
||||
width: calc(var(--bs-icon-size) * 1.5);
|
||||
height: calc(var(--bs-icon-size) * 1.5);
|
||||
}
|
||||
|
||||
.bs-icon-sm {
|
||||
--bs-icon-size: 1rem;
|
||||
}
|
||||
|
||||
.bs-icon-md {
|
||||
--bs-icon-size: 1.5rem;
|
||||
}
|
||||
|
||||
.bs-icon-lg {
|
||||
--bs-icon-size: 2rem;
|
||||
}
|
||||
|
||||
.bs-icon-xl {
|
||||
--bs-icon-size: 2.5rem;
|
||||
}
|
||||
|
||||
.bs-icon.bs-icon-primary {
|
||||
color: var(--bs-white);
|
||||
background: var(--bs-primary);
|
||||
}
|
||||
|
||||
.bs-icon.bs-icon-primary-light {
|
||||
color: var(--bs-primary);
|
||||
background: rgba(var(--bs-primary-rgb), .2);
|
||||
}
|
||||
|
||||
.bs-icon.bs-icon-semi-white {
|
||||
color: var(--bs-primary);
|
||||
background: rgba(255, 255, 255, .5);
|
||||
}
|
||||
|
||||
.bs-icon.bs-icon-rounded {
|
||||
border-radius: .5rem;
|
||||
}
|
||||
|
||||
.bs-icon.bs-icon-circle {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
BIN
html/assets/img/gtc icon 80x80.png
Normal file
BIN
html/assets/img/gtc icon 80x80.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
2
html/assets/js/jquery-3.7.1.min.js
vendored
Normal file
2
html/assets/js/jquery-3.7.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
35
html/home.html
Normal file
35
html/home.html
Normal file
@@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<html data-bs-theme="light" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<title>FarmToAAS</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md bg-body py-3">
|
||||
<div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img class="img-fluid" width="80" height="80" src="assets/img/gtc%20icon%2080x80.png"></span><span>Farm To AAS</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
|
||||
<div class="collapse navbar-collapse" id="navcol-1">
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item"><a class="nav-link active" href="#">Overview</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="#">Setting</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="#">Log</a></li>
|
||||
</ul><button class="btn btn-primary" type="button">Logout</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="row mb-3">
|
||||
<div class="col ms-1 me-1"><label class="col-form-label w-100 h-100">FARM Status : N/A</label></div>
|
||||
<div class="col ms-1 me-1"><label class="col-form-label w-100 h-100">AAS 1 Status : N/A</label></div>
|
||||
<div class="col ms-1 me-1"><label class="col-form-label w-100 h-100">AAS 2 Status : N/A</label></div>
|
||||
<div class="col ms-1 me-1"><label class="col-form-label w-100 h-100">AAS 3 Status : N/A</label></div>
|
||||
</div>
|
||||
<div class="row"></div>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/jquery-3.7.1.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
50
html/log.html
Normal file
50
html/log.html
Normal file
@@ -0,0 +1,50 @@
|
||||
<!DOCTYPE html>
|
||||
<html data-bs-theme="light" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<title>FarmToAAS</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md bg-body py-3">
|
||||
<div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img class="img-fluid" width="80" height="80" src="assets/img/gtc%20icon%2080x80.png"></span><span>Farm To AAS</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
|
||||
<div class="collapse navbar-collapse" id="navcol-1">
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item"><a class="nav-link" href="#">Overview</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="#">Setting</a></li>
|
||||
<li class="nav-item"><a class="nav-link active" href="#">Log</a></li>
|
||||
</ul><button class="btn btn-primary" type="button">Logout</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="row mb-2">
|
||||
<div class="col-2"><label class="col-form-label w-100 h-100 ms-1">Log Chooser</label></div>
|
||||
<div class="col"><input class="form-control-lg" type="date"></div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="table-responsive">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-1">No</th>
|
||||
<th class="col-2">Date</th>
|
||||
<th class="col-2">Time</th>
|
||||
<th class="col-2">Category</th>
|
||||
<th>Message</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="logtablebody">
|
||||
<tr></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/jquery-3.7.1.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
43
html/login.html
Normal file
43
html/login.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html>
|
||||
<html data-bs-theme="light" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<title>FarmToAAS</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<section class="position-relative py-4 py-xl-5">
|
||||
<div class="container">
|
||||
<div class="row mb-5">
|
||||
<div class="col-md-8 col-xl-6 text-center mx-auto">
|
||||
<h2>Log in</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row d-flex justify-content-center">
|
||||
<div class="col-md-6 col-xl-4">
|
||||
<div class="card mb-5">
|
||||
<div class="card-body d-flex flex-column align-items-center">
|
||||
<div class="bs-icon-xl bs-icon-circle bs-icon-primary my-4 bs-icon"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-person">
|
||||
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6m2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0m4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4m-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664z"></path>
|
||||
</svg></div>
|
||||
<form class="text-center" method="post">
|
||||
<div class="mb-3"><input class="form-control" type="text" name="username" placeholder="Username"></div>
|
||||
<div class="mb-3"><input class="form-control" type="password" name="password" placeholder="Password"></div>
|
||||
<div class="mb-3"><button class="btn btn-primary w-100 d-block" type="submit">Login</button></div>
|
||||
<p class="text-muted">Forgot your password?</p>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/jquery-3.7.1.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
73
html/setting.html
Normal file
73
html/setting.html
Normal file
@@ -0,0 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html data-bs-theme="light" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<title>FarmToAAS</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md bg-body py-3">
|
||||
<div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img class="img-fluid" width="80" height="80" src="assets/img/gtc%20icon%2080x80.png"></span><span>Farm To AAS</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
|
||||
<div class="collapse navbar-collapse" id="navcol-1">
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item"><a class="nav-link" href="#">Overview</a></li>
|
||||
<li class="nav-item"><a class="nav-link active" href="#">Setting</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="#">Log</a></li>
|
||||
</ul><button class="btn btn-primary" type="button">Logout</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h4 class="card-title">FARM Setting</h4>
|
||||
<div class="col">
|
||||
<div class="row mb-1">
|
||||
<div class="col-3"><label class="col-form-label w-100 h-100">Broker URL</label></div>
|
||||
<div class="col"><input class="w-100 h-100 ms-1 me-1" type="text" id="brokerurl" placeholder="Broker URL"></div>
|
||||
</div>
|
||||
<div class="row mb-1">
|
||||
<div class="col-3"><label class="col-form-label w-100 h-100">Username</label></div>
|
||||
<div class="col"><input class="w-100 h-100 ms-1 me-1" type="text" id="brokerusername" placeholder="Username"></div>
|
||||
</div>
|
||||
<div class="row mb-1">
|
||||
<div class="col-3"><label class="col-form-label w-100 h-100">Password</label></div>
|
||||
<div class="col"><input class="w-100 h-100 ms-1 me-1" type="password" id="brokerpassword" placeholder="Password"></div>
|
||||
</div>
|
||||
<div class="row mb-1">
|
||||
<div class="col-3"><label class="col-form-label w-100 h-100">Queue Name</label></div>
|
||||
<div class="col"><input class="w-100 h-100 ms-1 me-1" type="text" id="brokerqueue" placeholder="Queue Name"></div>
|
||||
</div>
|
||||
</div><button class="btn btn-primary btn-lg mt-2" id="savefarm" type="button">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h4 class="card-title">AAS Setting</h4>
|
||||
<div class="col">
|
||||
<div class="row mb-1">
|
||||
<div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="AAS IP 1"></div>
|
||||
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="DB Username"></div>
|
||||
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" placeholder="DB Password"></div>
|
||||
</div>
|
||||
<div class="row mb-1">
|
||||
<div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="AAS IP 2"></div>
|
||||
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="DB Username"></div>
|
||||
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" placeholder="DB Password"></div>
|
||||
</div>
|
||||
<div class="row mb-1">
|
||||
<div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="AAS IP 3"></div>
|
||||
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="DB Username"></div>
|
||||
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" placeholder="DB Password"></div>
|
||||
</div>
|
||||
</div><button class="btn btn-primary btn-lg mt-2" id="saveaas" type="button">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/jquery-3.7.1.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -21,7 +21,11 @@ class ActiveMQClient {
|
||||
private lateinit var destination : Queue
|
||||
private lateinit var consumer: MessageConsumer
|
||||
var MessageConsumer : Consumer<Message>?= null
|
||||
init{
|
||||
|
||||
/**
|
||||
* Start ActiveMQ Connection
|
||||
*/
|
||||
fun Start(){
|
||||
try{
|
||||
connection = ActiveMQConnectionFactory(config.ActiveMQ_BrokerURL, config.ActiveMQ_Username, config.ActiveMQ_Password).createConnection()
|
||||
connection.start()
|
||||
@@ -58,9 +62,11 @@ class ActiveMQClient {
|
||||
} catch (e : Exception){
|
||||
Logger.error { "Failed to create connection, Message : ${e.message}" }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop ActiveMQ Connection
|
||||
*/
|
||||
fun Stop(){
|
||||
try{
|
||||
consumer.close()
|
||||
|
||||
@@ -9,8 +9,11 @@ fun main() {
|
||||
config = Config()
|
||||
config.Load()
|
||||
val webUI = WebUI()
|
||||
webUI.Start()
|
||||
val activeclient = ActiveMQClient()
|
||||
activeclient.Start()
|
||||
val mysql = MySQLInjector()
|
||||
mysql.Start()
|
||||
|
||||
activeclient.MessageConsumer = Consumer{ message ->
|
||||
|
||||
|
||||
@@ -16,6 +16,12 @@ class Config {
|
||||
var WebPort : Int
|
||||
get() = prop.getProperty("webport").toInt()
|
||||
set(value) {prop.setProperty("webport", value.toString())}
|
||||
var WebUsername : String
|
||||
get() = prop.getProperty("webusername")
|
||||
set(value) {prop.setProperty("webusername", value)}
|
||||
var WebPassword : String
|
||||
get() = prop.getProperty("webpassword")
|
||||
set(value) {prop.setProperty("webpassword", value)}
|
||||
var ActiveMQ_BrokerURL : String
|
||||
get() = prop.getProperty("activemq_brokerurl")
|
||||
set(value) {prop.setProperty("activemq_brokerurl", value)}
|
||||
@@ -61,6 +67,8 @@ class Config {
|
||||
if (Files.isRegularFile(Path(filename))){
|
||||
prop.load(FileInputStream(filename))
|
||||
if (!prop.contains("webport")) throw Exception("Invalid config file: missing 'webport'")
|
||||
if (!prop.contains("webusername")) throw Exception("Invalid config file: missing 'webusername'")
|
||||
if (!prop.contains("webpassword")) throw Exception("Invalid config file: missing 'webpassword'")
|
||||
if (!prop.contains("activemq_brokerurl")) throw Exception("Invalid config file: missing 'activemq_brokerurl'")
|
||||
if (!prop.contains("activemq_username")) throw Exception("Invalid config file: missing 'activemq_username'")
|
||||
if (!prop.contains("activemq_password")) throw Exception("Invalid config file: missing 'activemq_password'")
|
||||
@@ -103,6 +111,8 @@ class Config {
|
||||
fun CreateDefault(){
|
||||
prop.clear()
|
||||
prop.setProperty("webport", "7000")
|
||||
prop.setProperty("webusername", "admin")
|
||||
prop.setProperty("webpassword", "admin")
|
||||
prop.setProperty("activemq_brokerurl", "tcp://localhost:61616")
|
||||
prop.setProperty("activemq_username", "admin")
|
||||
prop.setProperty("activemq_password", "admin")
|
||||
|
||||
@@ -2,20 +2,110 @@ package Web
|
||||
|
||||
import config
|
||||
import io.javalin.Javalin
|
||||
import io.javalin.apibuilder.ApiBuilder.get
|
||||
import io.javalin.apibuilder.ApiBuilder.path
|
||||
import io.javalin.apibuilder.ApiBuilder.post
|
||||
import io.javalin.apibuilder.ApiBuilder.ws
|
||||
import org.tinylog.Logger
|
||||
|
||||
@Suppress("unused")
|
||||
/**
|
||||
* Start WebUI Server
|
||||
*/
|
||||
class WebUI{
|
||||
private var app : Javalin = Javalin.create { config ->
|
||||
config.staticFiles.add("/html")
|
||||
}.start(config.WebPort)
|
||||
private var app : Javalin = Javalin.create { cfg ->
|
||||
cfg.staticFiles.add("/html")
|
||||
cfg.router.apiBuilder {
|
||||
path("/"){
|
||||
get {
|
||||
if (config.WebUsername==it.cookie("username")){
|
||||
it.redirect("home.html")
|
||||
} else{
|
||||
it.redirect("login.html")
|
||||
}
|
||||
}
|
||||
}
|
||||
path("login"){
|
||||
post{
|
||||
val username = it.formParam("username")
|
||||
val password = it.formParam("password")
|
||||
if (config.WebUsername==username && config.WebPassword==password) {
|
||||
it.cookie("username", username)
|
||||
it.redirect("home.html")
|
||||
} else {
|
||||
it.redirect("/login.html?error=1")
|
||||
}
|
||||
}
|
||||
}
|
||||
path("logout"){
|
||||
get {
|
||||
it.removeCookie("username")
|
||||
it.redirect("login.html")
|
||||
}
|
||||
}
|
||||
path("login.html"){
|
||||
get {
|
||||
it.removeCookie("username")
|
||||
}
|
||||
}
|
||||
path("home.html"){
|
||||
|
||||
get {
|
||||
if (config.WebUsername!=it.cookie("username")){
|
||||
it.redirect("login.html")
|
||||
return@get
|
||||
}
|
||||
|
||||
}
|
||||
ws("/ws"){ ws ->
|
||||
ws.onConnect { wsconnectcontext -> Logger.info { "WebSocket connected: ${wsconnectcontext.sessionId()}"; wsconnectcontext.enableAutomaticPings() } }
|
||||
ws.onClose { wsclosecontext -> Logger.info { "WebSocket closed: ${wsclosecontext.sessionId()}" } }
|
||||
ws.onError { wserrorcontext -> Logger.error { "WebSocket error in session ${wserrorcontext.sessionId()}: ${wserrorcontext.error()?.message}" } }
|
||||
ws.onMessage { wsMessageContext ->
|
||||
// TODO handle incoming messages
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
path("log.html"){
|
||||
get {
|
||||
if (config.WebUsername!=it.cookie("username")){
|
||||
it.redirect("login.html")
|
||||
return@get
|
||||
}
|
||||
val logdate = it.queryParam("logdate")
|
||||
if (logdate.isNullOrEmpty()) return@get
|
||||
|
||||
}
|
||||
}
|
||||
path("setting.html"){
|
||||
get {
|
||||
if (config.WebUsername!=it.cookie("username")){
|
||||
it.redirect("login.html")
|
||||
return@get
|
||||
}
|
||||
// TODO send config values in JSON format
|
||||
}
|
||||
post {
|
||||
// TODO save config values from form parameters
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Start WebUI Server
|
||||
*/
|
||||
fun Start(){
|
||||
app.start(config.WebPort)
|
||||
}
|
||||
/**
|
||||
* Stop WebUI Server
|
||||
*/
|
||||
fun Stop(){
|
||||
app.stop()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,8 +1,18 @@
|
||||
package database
|
||||
|
||||
|
||||
@Suppress("UNUSED")
|
||||
class MySQLInjector {
|
||||
|
||||
/**
|
||||
* Start MySQL Injector
|
||||
*/
|
||||
fun Start(){
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop MySQL Injector
|
||||
*/
|
||||
fun Stop(){
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user