From 80d6ded85eda2f83a8b5780d95820f370c0123c4 Mon Sep 17 00:00:00 2001 From: Jose Alberto Guerra Ugalde Date: Sun, 1 Dec 2024 02:28:38 -0600 Subject: [PATCH] =?UTF-8?q?-=20VERSION=204.11.30=20-=20Se=20quitaron=20lib?= =?UTF-8?q?rerias=20y=20permisos=20que=20no=20se=20usaban.=20-=20Se=20agre?= =?UTF-8?q?g=C3=B3=20la=20opci=C3=B3n=20de=20monitorear=20mas=20de=20un=20?= =?UTF-8?q?servidor.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- B4A/B4XMainPage.bas | 157 +++++++++++++++++++++++++++--------- B4A/C_Subs.bas | 21 +++++ B4A/Files/login.bal | Bin 16391 -> 18004 bytes B4A/Monitor-Keymon.b4a | 18 ++--- B4A/Monitor-Keymon.b4a.meta | 6 +- B4A/NotificationService.bas | 36 ++++----- B4A/Starter.bas | 17 ++++ B4A/monitor.bas | 68 +++++++++++++--- 8 files changed, 243 insertions(+), 80 deletions(-) diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas index e32c55b..4c8fdfb 100644 --- a/B4A/B4XMainPage.bas +++ b/B4A/B4XMainPage.bas @@ -35,8 +35,8 @@ Sub Class_Globals Private p_estatus As Panel Dim cb_conexion As CheckBox Dim cb_internet As CheckBox - Dim cb_dbreqserver As CheckBox - Dim cb_db As CheckBox +' Dim cb_dbreqserver As CheckBox +' Dim cb_db As CheckBox ' Private b_intervalo As Button ' Private b_server As Button Private et_server As EditText @@ -60,6 +60,19 @@ Sub Class_Globals Private l_server As Label Private l_info As Label Private b_guardaCambios As Button + Dim servidores As List + Dim lv_servidores As ListView + Dim lbl, lbl2, lbl3 As B4XView + Private p_dbreqServidores As Panel + Private l_db As Label + Private l_dbreqServer As Label + Dim lv_dbs As ListView + Private p_dbs As Panel + Private p_servidoresActivos As Panel + Private lv_servidoresActivos As ListView + Dim jsn As JSONParser + Dim jsnGnr As JSONGenerator + DIM rp AS RuntimePermissions End Sub Public Sub Initialize @@ -74,9 +87,9 @@ Private Sub B4XPage_Created (Root1 As B4XView) B4XPages.AddPage("Login", login) s.Initialize l_version.Text = Application.VersionName - lv_server.AddSingleLine("http://keymon.lat:1782") - lv_server.AddSingleLine("http://10.0.0.205:1782") - lv_server.AddSingleLine("http://40.123.36.38:1782") +' lv_server.AddSingleLine("http://keymon.lat:1782") +' lv_server.AddSingleLine("http://10.0.0.205:1782") +' lv_server.AddSingleLine("http://40.123.36.38:1782") clv_server.Add(CreateListItem("http://keymon.lat:1782", clv_server.AsView.Width, 35dip), "http://keymon.lat:1782") clv_server.Add(CreateListItem("http://10.0.0.205:1782", clv_server.AsView.Width, 35dip), "http://10.0.0.205:1782") @@ -86,14 +99,53 @@ Private Sub B4XPage_Created (Root1 As B4XView) logger = False #end if s.centraEtiqueta(l_info, Root.Width) + servidores.Initialize +' Private srv1 As Map = CreateMap("nombre": "1781", "servidor": "http://keymon.lat:1781", "intervalo": 30, "timeout": 11000) +' Private srv2 As Map = CreateMap("nombre": "1782", "servidor": "http://keymon.lat:1782", "intervalo": 30, "timeout": 11000) +' Private srv3 As Map = CreateMap("nombre": "1783", "servidor": "http://keymon.lat:1783", "intervalo": 30, "timeout": 11000) +' servidores.AddAll(Array As Object (srv1, srv2, srv3)) +' Private srvrsMap As Map +' srvrsMap.Initialize +' srvrsMap.Put("1781", srv1) +' srvrsMap.Put("1782", srv2) +' srvrsMap.Put("1783", srv3) +' Starter.skmt.ExecNonQuery($"delete from cat_variables where nombre = 'servidores'"$) +' jsnGnr.Initialize2(servidores) +' Starter.skmt.ExecNonQuery($"insert into cat_variables (nombre, valor) values ("servidores", '${jsnGnr.ToString}')"$) + + +' Starter.skmt.ExecNonQuery("insert into cat_servidores (nombre, url, intervalo, timeout) values ('1781', 'http://keymon.lat:1781', '30', '11000')") +' Starter.skmt.ExecNonQuery("insert into cat_servidores (nombre, url, intervalo, timeout) values ('1782', 'http://keymon.lat:1782', '30', '11000')") +' Starter.skmt.ExecNonQuery("insert into cat_servidores (nombre, url, intervalo, timeout) values ('1783', 'http://keymon.lat:1783', '30', '11000')") + lv_servidores.SingleLineLayout.ItemHeight = 22dip + lbl = lv_servidores.SingleLineLayout.Label + lbl.TextColor = Colors.black + lbl.SetTextAlignment("CENTER", "CENTER") + lbl.TextSize = 14 + lv_dbs.SingleLineLayout.ItemHeight = 22dip + lbl2 = lv_dbs.SingleLineLayout.Label + lbl2.TextColor = Colors.black + lbl2.SetTextAlignment("CENTER", "CENTER") + lbl2.TextSize = 14 + lv_servidoresActivos.SingleLineLayout.ItemHeight = 30dip + lbl3 = lv_servidoresActivos.SingleLineLayout.Label + lbl3.TextColor = Colors.black + lbl3.SetTextAlignment("CENTER", "CENTER") + lbl3.TextSize = 16 + p_dbreqServidores.Left = (p_estatus.Width / 2) - (lv_servidores.Width / 2) + lv_servidores.Top = 10 + lv_servidores.Left = 0 + s.centraEtiqueta(l_dbreqServer, p_estatus.Width) + s.centraEtiqueta(l_db, p_estatus.Width) + s.borraArribaDeXXXErrores(3000) + rp.CheckAndRequest(rp.PERMISSION_POST_NOTIFICATIONS) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity_PermissionResult if non-B4XPages. End Sub Sub B4XPage_Appear ' reqManager.Initialize(Me, Starter.DBReqServer) cd1.Initialize(Colors.RGB(16, 141, 0), 10dip) b_ping.Background = cd1 -' bu.Initialize -' batterystatus = bu.BatteryInformation b_monitorActivo.Left = (Root.Width / 2) - (b_monitorActivo.Width / 2) b_ping.Left = (Root.Width / 2) - (b_ping.Width / 2) s.centraPanel(p_estatus, Root.Width) @@ -101,25 +153,25 @@ Sub B4XPage_Appear s.centraEtiqueta(l_ultimoPing, Root.Width) ' s.centraPanel(p_intervalo, Root.Width) s.centraEtiqueta(Label1, Root.Width) - If Not(CheckNotificationAccess) Then - Msgbox2Async($"Se necesita acceso a las notificaciones, haga clic en "Aceptar" y en la siguiente pantalla permita el acceso a la aplicación "${Application.LabelName}"."$, "Permisos necesarios", "Aceptar", "Cancelar", "", Null, True) - Wait For Msgbox_Result (resultado As Int) - If resultado = DialogResponse.POSITIVE Then - b_notifAccess_Click - End If - Private cd1 As ColorDrawable - cd1.Initialize(Colors.red, 10dip) - b_notifAccess.Background = cd1 - b_notifAccess.TextColor = Colors.White - b_notifAccess.Text = "Activar Permisos" - Else - Private cd1 As ColorDrawable - cd1.Initialize(Colors.RGB(109, 221, 101), 10dip) - b_notifAccess.Background = cd1 - b_notifAccess.TextColor = Colors.White - b_notifAccess.Text = "Permisos Activos" - End If - CallSubDelayed(Monitor, "Timer1_Tick") +' If Not(CheckNotificationAccess) Then +' Msgbox2Async($"Se necesita acceso a las notificaciones, haga clic en "Aceptar" y en la siguiente pantalla permita el acceso a la aplicación "${Application.LabelName}"."$, "Permisos necesarios", "Aceptar", "Cancelar", "", Null, True) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' b_notifAccess_Click +' End If +' Private cd1 As ColorDrawable +' cd1.Initialize(Colors.red, 10dip) +' b_notifAccess.Background = cd1 +' b_notifAccess.TextColor = Colors.White +' b_notifAccess.Text = "Activar Permisos" +' Else +' Private cd1 As ColorDrawable +' cd1.Initialize(Colors.RGB(109, 221, 101), 10dip) +' b_notifAccess.Background = cd1 +' b_notifAccess.TextColor = Colors.White +' b_notifAccess.Text = "Permisos Activos" +' End If +' CallSubDelayed(Monitor, "Timer1_Tick") End Sub Private Sub B4XPage_CloseRequest As ResumableSub @@ -135,11 +187,11 @@ End Sub 'Revisa si la aplicación tiene permiso para acceder a las notificaciones. Sub CheckNotificationAccess As Boolean - Dim nstr, pstr As String - Dim r As Reflector - pstr = r.GetStaticField("anywheresoftware.b4a.BA", "packageName") - nstr = ph.GetSettings("enabled_notification_listeners") - Return nstr.Contains(pstr) +' Dim nstr, pstr As String +' Dim r As Reflector +' pstr = r.GetStaticField("anywheresoftware.b4a.BA", "packageName") +' nstr = ph.GetSettings("enabled_notification_listeners") +' Return nstr.Contains(pstr) End Sub Private Sub tb_monitorActivo_CheckedChange(Checked As Boolean) @@ -209,6 +261,15 @@ Private Sub i_engrane_Click et_timeout.Text = s.traeTimeoutDeBD p_engrane.Width = Root.Width p_engrane.Height = Root.Height + Private sa As Cursor = Starter.skmt.ExecQuery("select * from cat_servidores") + If sa.RowCount > 0 Then + lv_servidoresActivos.Clear + For i = 0 To sa.RowCount - 1 + sa.Position = i + lv_servidoresActivos.AddSingleLine(sa.GetString("url")) + Next + End If + s.panelVisible(p_engrane, 0, 0) End Sub @@ -221,7 +282,7 @@ Private Sub b_ping_Click b_ping.Background = cd1 b_ping.Text = "Buscando ..." CallSubDelayed(Monitor, "Timer1_Tick") - CallSubDelayed(Monitor, "probamosConexion") +' CallSubDelayed(Monitor, "probamosConexion") ' Wait For (ph.ShellAsync("ping", Array As String("-c 1","-W 2", "8.8.8.8"))) Complete (Success As Boolean, ExitValue As Int, StdOut As String, StdErr As String) ' If Success Then ' Log("ExitValue:" & ExitValue) @@ -243,9 +304,9 @@ End Sub 'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. Sub b_notifAccess_Click - Dim In As Intent - In.Initialize("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS", "") - StartActivity(In) +' Dim In As Intent +' In.Initialize("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS", "") +' StartActivity(In) End Sub Sub CreateListItem(Text As String, Width As Int, Height As Int) As Panel 'ignore @@ -287,7 +348,9 @@ Private Sub b_guardaCambios_Click Monitor.Interval = et_intervalo.text Starter.skmt.ExecNonQuery($"delete from cat_variables where nombre = 'intervalo'"$) Starter.skmt.ExecNonQuery($"insert into cat_variables (nombre, valor) values ("intervalo", '${et_intervalo.text}')"$) - CallSubDelayed(Monitor, "Timer1_Tick") + Starter.skmt.ExecNonQuery($"delete from cat_servidores where url = '${et_server.text}'"$) + Starter.skmt.ExecNonQuery($"insert into cat_servidores (url, intervalo, timeout) values ('${et_server.text}', '${et_intervalo.text}', '${et_timeout.text}')"$) +' CallSubDelayed(Monitor, "Timer1_Tick") p_engrane.Visible = False 'Guardamos DBReqServer Starter.DBReqServer = et_server.text @@ -295,7 +358,7 @@ Private Sub b_guardaCambios_Click Starter.skmt.ExecNonQuery($"insert into cat_variables (nombre, valor) values ("servidor", '${et_server.text}')"$) CallSubDelayed(Monitor, "reinicializaReqManager") p_engrane.Visible = False - CallSubDelayed(Monitor, "Timer1_Tick") +' CallSubDelayed(Monitor, "Timer1_Tick") 'Guardamos Timeout Monitor.timeout = et_timeout.text Starter.skmt.ExecNonQuery($"delete from cat_variables where nombre = 'timeout'"$) @@ -303,4 +366,24 @@ Private Sub b_guardaCambios_Click CallSubDelayed(Monitor, "Timer1_Tick") p_engrane.Visible = False ToastMessageShow($"Cambios guardados"$, False) +End Sub + + +Private Sub lv_servidoresActivos_ItemClick (Position As Int, Value As Object) + Private sa As Cursor = Starter.skmt.ExecQuery($"select * from cat_servidores where url = '${Value}'"$) + If sa.RowCount > 0 Then + sa.Position = 0 + et_server.Text = sa.GetString("url") + et_intervalo.Text = sa.GetString("intervalo") + et_timeout.Text = sa.GetString("timeout") + End If +End Sub + +Private Sub lv_servidoresActivos_ItemLongClick (Position As Int, Value As Object) + Msgbox2Async($"Esta seguro que desea borrar el servidor ${Value}"$, "AVISO", "SI", "", "NO", Null, True) + Wait For Msgbox_Result (Result As Int) + If Result = DialogResponse.POSITIVE Then + Starter.skmt.ExecNonQuery($"delete from cat_servidores where url = '${Value}'"$) + i_engrane_Click + End If End Sub \ No newline at end of file diff --git a/B4A/C_Subs.bas b/B4A/C_Subs.bas index 2ffff25..5483a2f 100644 --- a/B4A/C_Subs.bas +++ b/B4A/C_Subs.bas @@ -473,4 +473,25 @@ Sub ping Else Log("Error: " & LastException) End If +End Sub + +Sub traeServidorDesdeBD(id As Int) As Map + Private m As Map + m.Initialize + Private x As Cursor = Starter.skmt.ExecQuery($"select * from cat_servidores where id = ${id}"$) + If x.RowCount > 0 Then + For i = 0 To x.RowCount - 1 + x.Position = i + m = CreateMap("nombre":x.GetString("nombre"), "url":x.GetString("url"), "intervalo":x.GetString("intervalo"), "timeout":x.GetString("timeout")) + Next + End If + Return m +End Sub + +'Borramos renglones extra de la tabla de errores +Sub borraArribaDeXXXErrores(limite As Int) 'ignore + If Starter.logger Then LogColor($"Recortamos la tabla de error_log, limite de ${limite}"$, Colors.Magenta) + Starter.skmt.ExecNonQuery($"DELETE FROM error_log WHERE fecha NOT in (SELECT fecha FROM error_log ORDER BY fecha desc LIMIT ${limite})"$) + Starter.skmt.ExecNonQuery("vacuum;") +' if starter.logger then Log("Borramos mas de 100 de errorLog") End Sub \ No newline at end of file diff --git a/B4A/Files/login.bal b/B4A/Files/login.bal index 28eb7239a21fa2398e77060e8ceeee358abe1eb2..d7d856c7ae61e30b1269521b952131276f5bb0c8 100644 GIT binary patch delta 3890 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\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~AddManifestText()~\n~AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~AddManifestText()~\n~AddManifestText() 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~AddPermission(android.permission.INSTALL_PACKAGES)~\n~AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~~\n~AddManifestText()~\n~AddPermission(android.permission.INTERNET)~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~AddApplicationText(~\n~~\n~ ~\n~ ~\n~ ~\n~) +Library6=json +Library7=okhttputils2 +Library8=phone +Library9=randomaccessfile +ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~'AddManifestText(~\n~'~\n~')~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~'AddManifestText()~\n~'AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~'AddManifestText()~\n~'AddManifestText() 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~'AddPermission(android.permission.INSTALL_PACKAGES)~\n~'AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~'AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~'AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~'AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~'SetApplicationAttribute(android:largeHeap, "true")~\n~~\n~AddManifestText()~\n~AddPermission(android.permission.INTERNET)~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~'AddApplicationText(~\n~'~\n~' ~\n~' ~\n~' ~\n~') Module1=B4XMainPage Module2=BatteryUtilities Module3=C_Subs Module4=DBRequestManager Module5=Monitor -Module6=NotificationService +Module6=NotificationServiceXXX Module7=Starter NumberOfFiles=6 NumberOfLibraries=14 NumberOfModules=7 -Version=12.5 +Version=12.8 @EndOfDesignText@ #Region Project Attributes #ApplicationLabel: Monitor Keymon #VersionCode: 1 - #VersionName: 3.11.21 + #VersionName: 4.11.30 'SupportedOrientations possible values: unspecified, landscape or portrait. #SupportedOrientations: portrait #CanInstallToExternalStorage: False diff --git a/B4A/Monitor-Keymon.b4a.meta b/B4A/Monitor-Keymon.b4a.meta index f5275ea..8ad51f2 100644 --- a/B4A/Monitor-Keymon.b4a.meta +++ b/B4A/Monitor-Keymon.b4a.meta @@ -15,13 +15,13 @@ ModuleBreakpoints5= ModuleBreakpoints6= ModuleBreakpoints7= ModuleClosedNodes0= -ModuleClosedNodes1=7,8,9,10,11,14,15,18,19,21,22,24 +ModuleClosedNodes1=8,11,19,21,22,24 ModuleClosedNodes2= ModuleClosedNodes3= ModuleClosedNodes4= ModuleClosedNodes5=5 ModuleClosedNodes6= ModuleClosedNodes7= -NavigationStack=B4XMainPage,Class_Globals,39,0,B4XMainPage,B4XPage_Appear,95,0,B4XMainPage,B4XPage_Created,83,0,Main,Process_Globals,20,0,B4XMainPage,l_info_Click,254,0,B4XMainPage,l_internet_Click,266,0,Visual Designer,login.bal,-100,6,B4XMainPage,l_dbreqserver_Click,265,0,B4XMainPage,b_ping_Click,219,0,B4XMainPage,l_db_Click,260,0,B4XMainPage,b_guardaCambios_Click,283,2 +NavigationStack=Monitor,Process_Globals,22,5,NotificationServiceXXX,Service_Start,28,0,NotificationServiceXXX,Process_Globals,12,0,NotificationServiceXXX,Service_Create,20,0,B4XMainPage,B4XPage_Appear,155,0,B4XMainPage,B4XPage_Created,133,5,Starter,Process_Globals,8,0,Starter,Service_Start,57,0,Monitor,JobDone,148,6,Monitor,Timer1_Tick,54,0,Monitor,Service_Start,38,0 SelectedBuild=0 -VisibleModules=1,7,3,5,6,4 +VisibleModules=1,7,3,5,4 diff --git a/B4A/NotificationService.bas b/B4A/NotificationService.bas index cc34528..e70e840 100644 --- a/B4A/NotificationService.bas +++ b/B4A/NotificationService.bas @@ -11,14 +11,14 @@ Version=11 Sub Process_Globals 'These global variables will be declared once when the application starts. 'These variables can be accessed from all modules. - Dim rp As ReplyAuto +' Dim rp As ReplyAuto ' Dim activo As Boolean = True Dim ultimaNoti As String Dim logger As Boolean = False End Sub Sub Service_Create - rp.Initialize("MonitorKeymon") +' rp.Initialize("MonitorKeymon") #if not(DEBUG) logger = False #end if @@ -27,7 +27,7 @@ End Sub Sub Service_Start (StartingIntent As Intent) ' Log("NotificationService Start") - If rp.HandleIntent(StartingIntent) Then Return +' If rp.HandleIntent(StartingIntent) Then Return DateTime.DateFormat = "mm" ultimaNoti = DateTime.Date(DateTime.now) If logger Then LogColor($"Ultima notificación en el minuto ${ultimaNoti}"$, Colors.green) @@ -37,18 +37,18 @@ Sub Service_Destroy End Sub -Sub MonitorKeymon_NotificationPosted (SBN As StatusBarNotification) - If ultimaNoti = "" Then ultimaNoti = 0 - DateTime.DateFormat = "mm" - Private estaNoti As String = DateTime.Date(DateTime.now) - If estaNoti > 60 Then estaNoti = estaNoti - 60 - If logger Then LogColor("Diferencia de tiempo entre notis = " & (estaNoti - ultimaNoti), Colors.blue) - If logger Then LogColor($"Esta noti en el minuto ${DateTime.Date(DateTime.now)}, ultima noti = ${ultimaNoti}"$, Colors.green) - If logger Then Log(SBN.PackageName) - If ultimaNoti < estaNoti Then - If logger Then LogColor($"******** TIEMPO *******"$, Colors.red) - ultimaNoti = estaNoti - If IsPaused(Monitor) Then StartService(Monitor) - End If - If logger Then LogColor("Monitor inicializado:" & Monitor.Timer1.IsInitialized, Colors.Magenta) -End Sub +'Sub MonitorKeymon_NotificationPosted (SBN As StatusBarNotification) +' If ultimaNoti = "" Then ultimaNoti = 0 +' DateTime.DateFormat = "mm" +' Private estaNoti As String = DateTime.Date(DateTime.now) +' If estaNoti > 60 Then estaNoti = estaNoti - 60 +' If logger Then LogColor("Diferencia de tiempo entre notis = " & (estaNoti - ultimaNoti), Colors.blue) +' If logger Then LogColor($"Esta noti en el minuto ${DateTime.Date(DateTime.now)}, ultima noti = ${ultimaNoti}"$, Colors.green) +' If logger Then Log(SBN.PackageName) +' If ultimaNoti < estaNoti Then +' If logger Then LogColor($"******** TIEMPO *******"$, Colors.red) +' ultimaNoti = estaNoti +' If IsPaused(Monitor) Then StartService(Monitor) +' End If +' If logger Then LogColor("Monitor inicializado:" & Monitor.Timer1.IsInitialized, Colors.Magenta) +'End Sub diff --git a/B4A/Starter.bas b/B4A/Starter.bas index 1d94771..03ec2c6 100644 --- a/B4A/Starter.bas +++ b/B4A/Starter.bas @@ -43,9 +43,26 @@ Sub Service_Start (StartingIntent As Intent) s.Initialize skmt = s.inicializaBD(File.DirInternal, "kmt.db") skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS cat_variables(nombre TEXT, valor text)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS cat_servidores(id INTEGER PRIMARY KEY, nombre TEXT, url text, intervalo TEXT, timeout TEXT)") skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS error_log(error TEXT, fecha text)") If s.traeDBReqServerDeBD <> "N/A" Then DBReqServer = s.traeDBReqServerDeBD ' reqManager.Initialize(Me, DBReqServer) + + Private sa As Cursor = skmt.ExecQuery("select count(*) as cuantos from cat_servidores") + sa.Position = 0 + If sa.GetString("cuantos") = 0 Then + Private sa2 As Cursor = skmt.ExecQuery("select * from cat_variables where nombre = 'servidor'") + If sa2.RowCount > 0 Then + sa2.Position = 0 + skmt.ExecNonQuery($"insert into cat_servidores (url, intervalo, timeout) values ('${sa2.GetString("valor")}', '30', '11000')"$) + End If + End If + Private sa As Cursor = skmt.ExecQuery("select count(*) as cuantos from cat_servidores") + sa.Position = 0 + If sa.GetString("cuantos") = 0 Then + skmt.ExecNonQuery($"insert into cat_servidores (url, intervalo, timeout) values ('http://keymon.lat:1781', '30', '11000')"$) + End If + StartService(Monitor) End Sub ' diff --git a/B4A/monitor.bas b/B4A/monitor.bas index 1d53b6a..ed72b56 100644 --- a/B4A/monitor.bas +++ b/B4A/monitor.bas @@ -26,6 +26,7 @@ Sub Process_Globals Dim DBOk As Boolean = True Dim logger As Boolean = True Dim timeout As Int + Dim cs As CSBuilder End Sub Sub Service_Create @@ -46,7 +47,6 @@ Sub Service_Start (StartingIntent As Intent) Service.StopAutomaticForeground 'Call this when the background task completes (if there is one) Service.StartForeground(nid, s.CreateNotification("...")) StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True) - reqManager.Initialize(Me, Starter.DBReqServer) Timer1_Tick If logger Then LogColor("*************** Monitor Iniciado 👍🏽 **********", Colors.red) End Sub @@ -66,12 +66,14 @@ Sub Timer1_Tick End Sub Sub probamosConexion - If logger Then Log("probamos probamosConexion") + If logger Then Log("###################### "& CRLF& " probamos probamosConexion"& CRLF& " ############") + B4XPages.MainPage.lv_servidores.Clear + B4XPages.MainPage.lv_dbs.Clear If B4XPages.IsInitialized Then B4XPages.MainPage.cb_conexion.Checked = False B4XPages.MainPage.cb_internet.Checked = False - B4XPages.MainPage.cb_dbreqserver.Checked = False - B4XPages.MainPage.cb_db.Checked = False +' B4XPages.MainPage.cb_dbreqserver.Checked = False +' B4XPages.MainPage.cb_db.Checked = False End If If IsConnectedToInternet Then s.ping @@ -88,9 +90,28 @@ Sub probamosConexion s.notiLowReturn("Hay conexion a internet ✅️", "Revisando servidor ...", nid) If B4XPages.IsInitialized Then B4XPages.MainPage.l_status.Text = "Hay conexion a internet!!" Dim cmd As DBCommand - cmd.Initialize - cmd.Name = "select_conexion" - reqManager.ExecuteQuery(cmd, 0, "select_conexion", timeout) + + For i = 0 To B4XPages.MainPage.servidores.Size - 1 + Private esteServidor As Map = B4XPages.MainPage.servidores.Get(i).As(Map) + Log(esteServidor.Get("servidor")) + reqManager.Initialize(Me, esteServidor.Get("servidor")) + cmd.Initialize + cmd.Name = "select_conexion" + reqManager.ExecuteQuery(cmd, 0, "select_conexion_" & i, esteServidor.get("timeout")) + Next + Private sa As Cursor = Starter.skmt.ExecQuery("select * from cat_servidores") + If sa.RowCount > 0 Then + For i = 0 To sa.RowCount - 1 + sa.Position = i + reqManager.Initialize(Me, sa.GetString("url")) + cmd.Initialize + cmd.Name = "select_conexion" + reqManager.ExecuteQuery(cmd, 0, "select_conexion_" & sa.GetString("id"), sa.GetString("timeout")) + Next + End If + + + 'Reiniciamos el timer para cuando llamamos el Sub desde "seleccion" Timer1.Enabled = False Timer1.Interval = Interval * 1000 @@ -117,8 +138,18 @@ Sub JobDone(Job As HttpJob) cd1.Initialize(Colors.Red, 10dip) If B4XPages.IsInitialized Then B4XPages.MainPage.b_ping.Background = cd1 If B4XPages.IsInitialized Then B4XPages.MainPage.b_ping.Text = "DBReqServer KO" - s.notiHigh("ERROR ❌", $"El servidor ${Starter.DBReqServer} NO responde!!"$, nid, Main) Log("Guardamos error en BD") + If Job.Tag.As(String).StartsWith("select_conexion_") Then + Private idServidorX() As String = Regex.Split("_", Job.Tag) +' Log("|" & idServidorX(2) & "|") + Private idServidor As String = idServidorX(2) + Private m As Map = s.traeServidorDesdeBD(idServidor) + s.notiHigh("ERROR ❌", $"El servidor ${m.Get("url").As(String).Replace("http://", "")} NO responde!!"$, nid, Main) + cs.Initialize + B4XPages.MainPage.lv_servidores.AddSingleLine(cs.Color(Colors.red).append($"${m.Get("url").As(String).Replace("http://", "")} - ERROR"$).PopAll) +' B4XPages.MainPage.lv_servidores.AddSingleLine($"${m.Get("url").As(String).Replace("http://", "")} - ERROR"$) + End If + Starter.skmt.ExecNonQuery($"insert into error_log(error, fecha) values ('El servidor ${Starter.DBReqServer} NO responde!!', '${s.fechaKMT(DateTime.Now)}')"$) If Job.ErrorMessage.Contains("failed to connect") Or Job.ErrorMessage.Contains("Failed to connect") Then ' ToastMessageShow("¡Hubo un error contactando al servidor, por favor revise su conexión!", True) @@ -128,8 +159,13 @@ Sub JobDone(Job As HttpJob) If logger Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 If Job.JobName = "DBRequest" Then Dim resultado As DBResult = reqManager.HandleJob(Job) - If resultado.Tag = "select_conexion" Then + If resultado.Tag.As(String).StartsWith("select_conexion_") Then Log("select_conexion") + Private idServidorX() As String = Regex.Split("_", resultado.Tag) + Private idServidor As String = idServidorX(2) + Private m As Map = s.traeServidorDesdeBD(idServidor) + B4XPages.MainPage.lbl.TextColor = Colors.black + B4XPages.MainPage.lv_servidores.AddSingleLine($"${m.Get("url").As(String).Replace("http://", "")} - OK"$) For Each records() As Object In resultado.Rows Private valor As String = records(resultado.Columns.Get("VALOR")) If valor = "OK" Then @@ -137,16 +173,22 @@ Sub JobDone(Job As HttpJob) s.notiLowReturn($"El servidor esta respondiendo ✅"$, "Servidor OK ✅", nid) If B4XPages.IsInitialized Then B4XPages.MainPage.l_status.Text = "El servidor esta respondiendo!!" + B4XPages.MainPage.lv_dbs.AddSingleLine($"${m.Get("url").As(String).Replace("http://", "")} - OK"$) Dim cd1 As ColorDrawable cd1.Initialize(Colors.RGB(16, 141, 0), 10dip) B4XPages.MainPage.b_ping.Background = cd1 B4XPages.MainPage.b_ping.Text = "Servidor Ok" End If Else - s.notiHigh("ERROR ❌", $"El servidor NO esta respondiendo!!"$, nid, Main) + s.notiHigh("ERROR ❌", $"La base de datos ${m.Get("url").As(String).Replace("http://", "")} NO responde!!"$, nid, Main) If B4XPages.IsInitialized Then - B4XPages.MainPage.l_status.Text = "El servidor NO esta respondiendo!!" + B4XPages.MainPage.l_status.Text = "La base de datos NO esta respondiendo!!" Log("Guardamos error en BD") +' B4XPages.MainPage.lbl.TextColor = Colors.red +' Sleep(200) + cs.Initialize + B4XPages.MainPage.lv_dbs.AddSingleLine(cs.Color(Colors.red).append($"${m.Get("url").As(String).Replace("http://", "")} - ERROR"$).PopAll) +' B4XPages.MainPage.lv_dbs.AddSingleLine($"${m.Get("url").As(String).Replace("http://", "")} - ERROR"$) Starter.skmt.ExecNonQuery($"insert into error_log(error, fecha) values ('La BD NO esta respondiendo!!', '${s.fechaKMT(DateTime.Now)}')"$) Dim cd1 As ColorDrawable cd1.Initialize(Colors.Red, 10dip) @@ -164,8 +206,8 @@ Sub JobDone(Job As HttpJob) B4XPages.MainPage.cb_conexion.Checked = InternetOk B4XPages.MainPage.cb_internet.Checked = Starter.ping If DBReqServerOk Then B4XPages.MainPage.cb_internet.Checked = True - B4XPages.MainPage.cb_dbreqserver.Checked = DBReqServerOk - B4XPages.MainPage.cb_db.Checked = DBOk +' B4XPages.MainPage.cb_dbreqserver.Checked = DBReqServerOk +' B4XPages.MainPage.cb_db.Checked = DBOk End If Job.Release End If