commit 02/09/2025

This commit is contained in:
2025-09-02 12:34:15 +07:00
parent 7100cf826d
commit ea1defa78e
5 changed files with 224 additions and 45 deletions

View File

@@ -39,7 +39,10 @@ fun main() {
// ada broadcast zone yang tidak valid, delete from queue paging // ada broadcast zone yang tidak valid, delete from queue paging
db.Delete_Queue_Paging_by_index(it.index) db.Delete_Queue_Paging_by_index(it.index)
//TODO check log message yang benar //TODO check log message yang benar
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid broadcast zone") db.Add_Log(
"AAS",
"Cancelled paging message with index ${it.index} due to invalid broadcast zone"
)
} }
} else { } else {
// invalid broadcast zone, delete from queue paging // invalid broadcast zone, delete from queue paging
@@ -51,16 +54,32 @@ fun main() {
// baca kemudian queue table, prioritas 2 // baca kemudian queue table, prioritas 2
db.Read_Queue_Table().forEach { db.Read_Queue_Table().forEach {
if (it.BroadcastZones.isNotBlank()) { if (it.BroadcastZones.isNotBlank()) {
val zz = it.BroadcastZones.split(";")
// cek apakah semua target broadcast zone dari queue table ada di dalam database broadcast zones
if (zz.all { z -> broadcastzones.any { bz -> bz.equals(z) } }) {
// semua target broadcast zone valid, sekarang cek apakah semua target broadcast zone idle
} else {
// ada broadcast zone yang tidak valid, delete from queue table
db.Delete_Queue_Table_by_index(it.index)
//TODO check log message yang benar
db.Add_Log(
"AAS",
"Cancelled table message with index ${it.index} due to invalid broadcast zone"
)
}
} else { } else {
// invalid broadcast zone, delete from queue table // invalid broadcast zone, delete from queue table
db.Delete_Queue_Table_by_index(it.index) db.Delete_Queue_Table_by_index(it.index)
// TODO check log message yang benar
db.Add_Log("AAS", "Cancelled table message with index ${it.index} due to empty broadcast zone")
} }
} }
} }
} }
val web = WebApp(3030, val web = WebApp(
3030,
listOf( listOf(
Pair("admin", "password"), Pair("admin", "password"),
Pair("user", "password") Pair("user", "password")
@@ -69,6 +88,4 @@ fun main() {
web.Start() web.Start()
} }

View File

@@ -21,7 +21,8 @@ class Somecodes {
val processor: CentralProcessor = si.hardware.processor val processor: CentralProcessor = si.hardware.processor
val memory : GlobalMemory = si.hardware.memory val memory : GlobalMemory = si.hardware.memory
val datetimeformat1: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss") val datetimeformat1: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")
val dateformat1: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy")
val timeformat1: DateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss")
const val KB_threshold = 1024.0 const val KB_threshold = 1024.0
const val MB_threshold = KB_threshold * 1024.0 const val MB_threshold = KB_threshold * 1024.0
const val GB_threshold = MB_threshold * 1024.0 const val GB_threshold = MB_threshold * 1024.0
@@ -67,6 +68,10 @@ class Somecodes {
} }
} }
/**
* Get CPU usage using OSHI library.
* @param cb A callback function that receives the CPU usage as a string.
*/
fun getCPUUsage(cb : Consumer<String>){ fun getCPUUsage(cb : Consumer<String>){
CoroutineScope(Dispatchers.Default).launch { CoroutineScope(Dispatchers.Default).launch {
val prev = processor.systemCpuLoadTicks val prev = processor.systemCpuLoadTicks
@@ -106,16 +111,60 @@ class Somecodes {
, (usedMemory.toDouble() / totalMemory * 100)) , (usedMemory.toDouble() / totalMemory * 100))
} }
/**
* Check if a value is a valid non-blank string.
* @param value The value to check.
* @return True if the value is a non-blank string, false otherwise.
*/
fun ValidString(value: Any) : Boolean { fun ValidString(value: Any) : Boolean {
return value is String && value.isNotBlank() return value is String && value.isNotBlank()
} }
/**
* Check if a string is a valid file path and the file exists.
* @param value The string to check.
* @return True if the string is a valid file path, false otherwise.
*/
fun ValidFile(value : String) : Boolean { fun ValidFile(value : String) : Boolean {
if (value.isNotBlank()){ if (value.isNotBlank()){
return Files.exists(Path.of(value)) return Files.exists(Path.of(value))
} }
return false return false
} }
/**
* Check if a string is a valid date in the format "dd/MM/yyyy".
* @param value The string to check.
* @return True if the string is a valid date, false otherwise.
*/
fun ValidDate(value: String): Boolean{
return try{
if (ValidString(value)){
dateformat1.parse(value)
true
} else throw Exception()
} catch (_: Exception){
false
}
}
/**
* Check if a string is a valid time in the format "hh:mm:ss".
* @param value The string to check.
* @return True if the string is a valid time, false otherwise.
*/
fun ValidTime(value: String): Boolean{
return try{
if (ValidString(value)){
timeformat1.parse(value)
true
} else throw Exception()
} catch (_: Exception){
false
}
}
} }

View File

@@ -1,25 +1,10 @@
package database package database
@Suppress("unused")
data class Log( data class Log(
val index: ULong, val index: ULong,
val datenya: String, val datenya: String,
val timenya: String, val timenya: String,
val machine: String, val machine: String,
val description : String val description : String
) { )
@Suppress("unused")
companion object {
fun ValidDate(date: String): Boolean {
// Simple date validation (DD/MM/YYYY)
val regex = Regex("""^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/\d{4}$""")
return regex.matches(date)
}
fun validTime(time: String): Boolean {
// Simple time validation (HH:MM:SS)
val regex = Regex("""^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$""")
return regex.matches(time)
}
}
}

View File

@@ -217,7 +217,7 @@ class MariaDB (
/** /**
* Reloads the ScheduleBank list from the database. * Reloads the ScheduleBank list from the database.
*/ */
private fun Reload_Schedulebank() { fun Reload_Schedulebank() {
SchedulebankList.clear() SchedulebankList.clear()
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
@@ -266,22 +266,24 @@ class MariaDB (
/** /**
* Clears all entries from the schedulebank table in the database and the local list. * Clears all entries from the schedulebank table in the database and the local list.
*/ */
fun Clear_Schedulebank() { fun Clear_Schedulebank() : Boolean {
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE schedulebank") statement?.executeUpdate("TRUNCATE TABLE schedulebank")
Logger.info("Schedulebank table cleared" as Any) Logger.info("Schedulebank table cleared" as Any)
SchedulebankList.clear() SchedulebankList.clear()
return true
} catch (e : Exception) { } catch (e : Exception) {
Logger.error("Error clearing schedulebank table: ${e.message}" as Any) Logger.error("Error clearing schedulebank table: ${e.message}" as Any)
} }
return false
} }
/** /**
* Reloads the language link list from the database. * Reloads the language link list from the database.
*/ */
private fun Reload_LanguageLink() { fun Reload_LanguageLink() {
LanguageLinkList.clear() LanguageLinkList.clear()
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
@@ -324,22 +326,24 @@ class MariaDB (
/** /**
* Clears all entries from the language link table in the database and the local list. * Clears all entries from the language link table in the database and the local list.
*/ */
fun Clear_LanguageLink() { fun Clear_LanguageLink() : Boolean {
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE languagelink") statement?.executeUpdate("TRUNCATE TABLE languagelink")
Logger.info("LanguageLink table cleared" as Any) Logger.info("LanguageLink table cleared" as Any)
LanguageLinkList.clear() LanguageLinkList.clear()
return true
} catch (e : Exception) { } catch (e : Exception) {
Logger.error("Error clearing LanguageLink table: ${e.message}" as Any) Logger.error("Error clearing LanguageLink table: ${e.message}" as Any)
} }
return false
} }
/** /**
* Reloads the soundbank list from the database. * Reloads the soundbank list from the database.
*/ */
private fun Reload_Soundbank() { fun Reload_Soundbank() {
SoundbankList.clear() SoundbankList.clear()
try { try {
@@ -387,22 +391,24 @@ class MariaDB (
/** /**
* Clears all entries from the soundbank table in the database and the local list. * Clears all entries from the soundbank table in the database and the local list.
*/ */
fun Clear_Soundbank() { fun Clear_Soundbank() : Boolean{
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE soundbank") statement?.executeUpdate("TRUNCATE TABLE soundbank")
Logger.info("Soundbank table cleared" as Any) Logger.info("Soundbank table cleared" as Any)
SoundbankList.clear() SoundbankList.clear()
return true
} catch (e : Exception) { } catch (e : Exception) {
Logger.error("Error clearing soundbank table: ${e.message}" as Any) Logger.error("Error clearing soundbank table: ${e.message}" as Any)
} }
return false
} }
/** /**
* Reloads the messagebank list from the database. * Reloads the messagebank list from the database.
*/ */
private fun Reload_Messagebank() { fun Reload_Messagebank() {
MessagebankList.clear() MessagebankList.clear()
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
@@ -450,16 +456,18 @@ class MariaDB (
/** /**
* Clears all entries from the messagebank table in the database and the local list. * Clears all entries from the messagebank table in the database and the local list.
*/ */
fun Clear_Messagebank() { fun Clear_Messagebank() : Boolean{
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE messagebank") statement?.executeUpdate("TRUNCATE TABLE messagebank")
Logger.info("Messagebank table cleared" as Any) Logger.info("Messagebank table cleared" as Any)
MessagebankList.clear() MessagebankList.clear()
return true
} catch (e : Exception) { } catch (e : Exception) {
Logger.error("Error clearing messagebank table: ${e.message}" as Any) Logger.error("Error clearing messagebank table: ${e.message}" as Any)
} }
return false
} }
/** /**
@@ -516,15 +524,17 @@ class MariaDB (
/** /**
* Clears all entries from the queue_table in the database. * Clears all entries from the queue_table in the database.
*/ */
fun Clear_Queue_Table() { fun Clear_Queue_Table() : Boolean {
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE queue_table") statement?.executeUpdate("TRUNCATE TABLE queue_table")
Logger.info("Queue table cleared" as Any) Logger.info("Queue table cleared" as Any)
return true
} catch (e : Exception) { } catch (e : Exception) {
Logger.error("Error clearing queue table: ${e.message}" as Any) Logger.error("Error clearing queue table: ${e.message}" as Any)
} }
return false
} }
/** /**
@@ -578,15 +588,17 @@ class MariaDB (
/** /**
* Clears all entries from the queue_paging in the database. * Clears all entries from the queue_paging in the database.
*/ */
fun Clear_Queue_Paging(){ fun Clear_Queue_Paging() : Boolean{
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE queue_paging") statement?.executeUpdate("TRUNCATE TABLE queue_paging")
Logger.info("Queue paging table cleared" as Any) Logger.info("Queue paging table cleared" as Any)
return true
} catch (e : Exception) { } catch (e : Exception) {
Logger.error("Error clearing queue paging table: ${e.message}" as Any) Logger.error("Error clearing queue paging table: ${e.message}" as Any)
} }
return false
} }
/** /**
@@ -639,15 +651,17 @@ class MariaDB (
/** /**
* Clears all entries from the broadcast_zones in the database. * Clears all entries from the broadcast_zones in the database.
*/ */
fun Clear_BroadcastZones() { fun Clear_BroadcastZones() : Boolean {
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE broadcast_zones") statement?.executeUpdate("TRUNCATE TABLE broadcast_zones")
Logger.info("Broadcast zones table cleared" as Any) Logger.info("Broadcast zones table cleared" as Any)
return true
} catch (e : Exception) { } catch (e : Exception) {
Logger.error("Error clearing broadcast zones table: ${e.message}" as Any) Logger.error("Error clearing broadcast zones table: ${e.message}" as Any)
} }
return false
} }
} }

View File

@@ -1,10 +1,13 @@
package web package web
import codes.Somecodes import codes.Somecodes
import codes.Somecodes.Companion.ValidDate
import codes.Somecodes.Companion.ValidString
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import database.MariaDB import database.MariaDB
import io.javalin.Javalin import io.javalin.Javalin
import io.javalin.apibuilder.ApiBuilder.before import io.javalin.apibuilder.ApiBuilder.before
import io.javalin.apibuilder.ApiBuilder.delete
import io.javalin.apibuilder.ApiBuilder.get import io.javalin.apibuilder.ApiBuilder.get
import io.javalin.apibuilder.ApiBuilder.path import io.javalin.apibuilder.ApiBuilder.path
import io.javalin.apibuilder.ApiBuilder.post import io.javalin.apibuilder.ApiBuilder.post
@@ -111,12 +114,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
println("getTimerList command received") println("getTimerList command received")
SendReply(wsMessageContext, cmd.command, MariaDB.ArrayListtoString(db.SchedulebankList)) SendReply(wsMessageContext, cmd.command, MariaDB.ArrayListtoString(db.SchedulebankList))
} }
"getLog" ->{
println("getLog command received")
}
"getSetting" ->{
println("getSetting command received")
}
else -> { else -> {
SendReply(wsMessageContext, cmd.command, "Unknown command") SendReply(wsMessageContext, cmd.command, "Unknown command")
} }
@@ -135,19 +133,111 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
} }
path("soundbank.html") { path("soundbank.html") {
before {CheckUsers(it)} before {CheckUsers(it)}
get("List"){
// get soundbank list
it.result(MariaDB.ArrayListtoString(db.SoundbankList))
}
delete("List"){
// truncate soundbank table
if (db.Clear_Soundbank()){
it.result("OK")
} else {
it.status(500).result("Failed to truncate soundbank table")
}
}
delete("DeleteByIndex/{index}"){
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null){
it.status(400).result("Invalid index")
} else{
if (db.Delete_Soundbank_by_index(index)){
it.result("OK")
} else {
it.status(500).result("Failed to delete soundbank with index $index")
}
}
}
} }
path("messagebank.html") { path("messagebank.html") {
before { CheckUsers(it) } before { CheckUsers(it) }
get("List"){
// get messagebank list
it.result(MariaDB.ArrayListtoString(db.MessagebankList))
}
delete("List"){
// truncate messagebank table
if (db.Clear_Messagebank()){
it.result("OK")
} else {
it.status(500).result("Failed to truncate messagebank table")
}
}
delete("DeleteByIndex/{index}"){
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null){
it.status(400).result("Invalid index")
} else{
if (db.Delete_Messagebank_by_index(index)){
it.result("OK")
} else {
it.status(500).result("Failed to delete messagebank with index $index")
}
}
}
} }
path("language.html") { path("language.html") {
before { CheckUsers(it) } before { CheckUsers(it) }
get("List"){
// get language link list
it.result(MariaDB.ArrayListtoString(db.LanguageLinkList))
}
delete("List"){
// truncate language link table
if (db.Clear_LanguageLink()){
it.result("OK")
} else {
it.status(500).result("Failed to truncate language link table")
}
}
delete("DeleteByIndex/{index}"){
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null){
it.status(400).result("Invalid index")
} else{
if (db.Delete_LanguageLink_by_index(index)){
it.result("OK")
} else {
it.status(500).result("Failed to delete language link with index $index")
}
}
}
} }
path("log.html") { path("log.html") {
before { CheckUsers(it) } before { CheckUsers(it) }
get("List/<logdate>/<logfilter>"){ get1 ->
val logdate = get1.pathParam("logdate")
val logfilter = get1.pathParam("logfilter")
if (ValidDate(logdate)){
if (ValidString(logfilter)){
// ada log filter
db.GetLog(logdate, logfilter){
get1.result(MariaDB.ArrayListtoString(it))
}
} else {
db.GetLog(logdate){
get1.result(MariaDB.ArrayListtoString(it))
}
}
} else get1.status(400).result("Invalid logdate")
}
} }
path("setting.html") { path("setting.html") {
@@ -156,7 +246,31 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
} }
path("timer.html") { path("timer.html") {
before { CheckUsers(it) } before { CheckUsers(it) }
get("List"){
// get timer list
it.result(MariaDB.ArrayListtoString(db.SchedulebankList))
}
delete("List"){
// truncate timer table
if (db.Clear_Schedulebank()){
it.result("OK")
} else {
it.status(500).result("Failed to truncate schedulebank table")
}
}
delete("DeleteByIndex/{index}"){
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null){
it.status(400).result("Invalid index")
} else{
if (db.Delete_Schedulebank_by_index(index)){
it.result("OK")
} else {
it.status(500).result("Failed to delete schedule with index $index")
}
}
}
} }
} }
}.start(listenPort) }.start(listenPort)