db4e 0.44.2__tar.gz → 0.46.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. {db4e-0.44.2 → db4e-0.46.0}/PKG-INFO +1 -1
  2. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DButton.py +3 -1
  3. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DDef.py +1 -1
  4. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DField.py +7 -0
  5. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DFile.py +2 -0
  6. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DLabel.py +6 -2
  7. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DMethod.py +4 -0
  8. db4e-0.46.0/db4e/Constants/DPane.py +40 -0
  9. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DSelect.py +13 -5
  10. {db4e-0.44.2 → db4e-0.46.0}/db4e/Db4E.tcss +20 -2
  11. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DbMgr.py +1 -7
  12. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DeplClient.py +9 -0
  13. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DeplMgr.py +7 -9
  14. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/HealthCache.py +7 -7
  15. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/HealthMgr.py +12 -0
  16. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Helper.py +28 -18
  17. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/InstallMgr.py +8 -2
  18. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MessageRouter.py +41 -35
  19. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MiningDb.py +27 -7
  20. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MiningETL.py +171 -63
  21. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/OpsMgr.py +70 -51
  22. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/P2Pool.py +2 -2
  23. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/P2PoolWatcher.py +1 -1
  24. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/PaneCatalogue.py +10 -4
  25. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/SoftwareSystem.py +4 -0
  26. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/XMRig.py +2 -2
  27. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ChainBlocksFoundPane.py +0 -11
  28. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ChainHashratesPane.py +6 -6
  29. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ChainPane.py +1 -1
  30. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/Db4EPane.py +15 -6
  31. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/P2PoolHashratesPane.py +6 -6
  32. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/P2PoolPane.py +36 -17
  33. db4e-0.46.0/db4e/Panes/P2PoolSharesFoundPane.bar.py +138 -0
  34. db4e-0.46.0/db4e/Panes/P2PoolSharesFoundPane.py +80 -0
  35. db4e-0.46.0/db4e/Panes/P2PoolSharesFoundPane.stacked.py +115 -0
  36. db4e-0.46.0/db4e/Panes/P2PoolTablesPane.py +61 -0
  37. db4e-0.46.0/db4e/Panes/PaymentsPane.py +62 -0
  38. db4e-0.44.2/db4e/Panes/UptimePane.py → db4e-0.46.0/db4e/Panes/RuntimePane.py +25 -7
  39. db4e-0.44.2/db4e/Panes/RuntimeLogPane.py → db4e-0.46.0/db4e/Panes/StartStopLogPane.py +2 -2
  40. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/XMRigHashratesPane.py +6 -6
  41. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/XMRigPane.py +0 -1
  42. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/XMRigRemotePane.py +6 -7
  43. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/systemd/p2pool@.service +9 -9
  44. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/systemd/p2pool@.socket +1 -0
  45. db4e-0.46.0/db4e/Widgets/Db4EPlot.py +129 -0
  46. {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/NavPane.py +5 -5
  47. {db4e-0.44.2 → db4e-0.46.0}/db4e/data_migration.py +37 -1
  48. {db4e-0.44.2 → db4e-0.46.0}/db4e/server.py +12 -4
  49. {db4e-0.44.2 → db4e-0.46.0}/pyproject.toml +1 -1
  50. db4e-0.44.2/db4e/Constants/DPane.py +0 -37
  51. db4e-0.44.2/db4e/Widgets/HashratePlot.py +0 -92
  52. {db4e-0.44.2 → db4e-0.46.0}/LICENSE +0 -0
  53. {db4e-0.44.2 → db4e-0.46.0}/README.md +0 -0
  54. {db4e-0.44.2 → db4e-0.46.0}/db4e/App.py +0 -0
  55. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DDebug.py +0 -0
  56. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DDir.py +0 -0
  57. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DElem.py +0 -0
  58. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DForm.py +0 -0
  59. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DJob.py +0 -0
  60. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DMining.py +0 -0
  61. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DModule.py +0 -0
  62. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DMongo.py +0 -0
  63. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DOps.py +0 -0
  64. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DPlaceholder.py +0 -0
  65. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DStatus.py +0 -0
  66. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DSystemD.py +0 -0
  67. {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/__init__.py +0 -0
  68. {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/Db4eMsg.py +0 -0
  69. {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/Quit.py +0 -0
  70. {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/RefreshNavPane.py +0 -0
  71. {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/UpdateTopBar.py +0 -0
  72. {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/__init__.py +0 -0
  73. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Components.py +0 -0
  74. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/ConfigMgr.py +0 -0
  75. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/ConstGroup.py +0 -0
  76. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Db4E.py +0 -0
  77. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Db4ELogger.py +0 -0
  78. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Db4ESystemD.py +0 -0
  79. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DbCache.py +0 -0
  80. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/InternalP2Pool.py +0 -0
  81. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Job.py +0 -0
  82. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/JobQueue.py +0 -0
  83. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/LocalSoftwareSystem.py +0 -0
  84. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MoneroD.py +0 -0
  85. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MoneroDRemote.py +0 -0
  86. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/OpsDb.py +0 -0
  87. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/P2PoolRemote.py +0 -0
  88. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/PaneMgr.py +0 -0
  89. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/XMRigRemote.py +0 -0
  90. {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/__init__.py +0 -0
  91. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/DonationsPane.py +0 -0
  92. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/InitialSetupPane.py +0 -0
  93. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/LogViewPane.py +0 -0
  94. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/MoneroDPane.py +0 -0
  95. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/MoneroDRemotePane.py +0 -0
  96. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/P2PoolRemotePane.py +0 -0
  97. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ResultsPane.py +0 -0
  98. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/TUILogPane.py +0 -0
  99. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/WelcomePane.py +0 -0
  100. {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/__init__.py +0 -0
  101. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/__init__.py +0 -0
  102. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/db4e/conf/db4e-logrotate.conf +0 -0
  103. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/db4e/systemd/db4e.service +0 -0
  104. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/bin/monerod +0 -0
  105. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/bin/start-monerod.sh +0 -0
  106. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/conf/monerod.ini +0 -0
  107. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/systemd/monerod@.service +0 -0
  108. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/systemd/monerod@.socket +0 -0
  109. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/bin/p2pool +0 -0
  110. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/bin/start-p2pool.sh +0 -0
  111. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/conf/p2pool-logrotate.conf +0 -0
  112. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/conf/p2pool.ini +0 -0
  113. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/docs/LICENSE +0 -0
  114. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/docs/README.md +0 -0
  115. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/bin/xmrig +0 -0
  116. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/conf/config.json +0 -0
  117. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/conf/xmrig-logrotate.conf +0 -0
  118. {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/systemd/xmrig@.service +0 -0
  119. {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/BarChart.py +0 -0
  120. {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/Clock.py +0 -0
  121. {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/DetailPane.py +0 -0
  122. {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/TopBar.py +0 -0
  123. {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/__init__.py +0 -0
  124. {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-backup.sh +0 -0
  125. {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-initial-setup.sh +0 -0
  126. {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-install-service.sh +0 -0
  127. {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-metrics.sh +0 -0
  128. {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-uninstall-service.sh +0 -0
  129. {db4e-0.44.2 → db4e-0.46.0}/db4e/enable_mre.py +0 -0
  130. {db4e-0.44.2 → db4e-0.46.0}/db4e/test_barchart.py +0 -0
  131. {db4e-0.44.2 → db4e-0.46.0}/db4e/test_etl.py +0 -0
  132. {db4e-0.44.2 → db4e-0.46.0}/db4e/test_plot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: db4e
3
- Version: 0.44.2
3
+ Version: 0.46.0
4
4
  Summary: A unified Monero XMR mining dashboard for deployment, operation and real-time analytics.
5
5
  License: GPL-3.0-or-later
6
6
  License-File: LICENSE
@@ -18,11 +18,13 @@ class DButton(ConstGroup):
18
18
  ENABLE : str = "enable_button"
19
19
  HASHRATE : str = "hashrate_button"
20
20
  NEW : str = "new_button"
21
+ PAYMENTS : str = "payments_button"
21
22
  PROCEED : str = "proceed_button"
22
23
  RESTART : str = "restart_button"
23
- SHARES_FOUND : str = "shares_found"
24
+ SHARES_FOUND : str = "shares_found_button"
24
25
  START : str = "start_button"
25
26
  STOP : str = "stop_button"
27
+ TABLES : str = "tables_button"
26
28
  UPDATE : str = "update_button"
27
29
  RUNTIME : str = "runtime_button"
28
30
  UPTIME : str = "uptime_button"
@@ -37,7 +37,7 @@ class DDef(ConstGroup):
37
37
  DB4E_SERVICE_FILE : str = "db4e.service"
38
38
  DB4E_START_SCRIPT : str = "db4e-server"
39
39
  DB4E_UNINSTALL_SCRIPT : str = "db4e-uninstall-service.sh"
40
- DB4E_VERSION : str = "0.44.2"
40
+ DB4E_VERSION : str = "0.46.0"
41
41
  DEPL_COLLECTION : str = "depl"
42
42
  DEV_DIR : str = "dev"
43
43
  DONATION_WALLET : str = "48aTDJfRH2JLcKW2fz4m9HJeLLVK5rMo1bKiNHFc43Ht2e2kPVh2tmk3Md7npz1WsSU7bpgtX2Xnf59RHCLUEaHfQHwao4j"
@@ -28,6 +28,7 @@ class DField(ConstGroup) :
28
28
  DB4E_DIR : str = "db4e_dir"
29
29
  DB4E_LOG_FILE : str = "db4e_log_file"
30
30
  DB4E_MAP : str = "db4es_map"
31
+ DB4E_PLOT : str = "db4e_plot"
31
32
  DEBUG : str = "debug"
32
33
  DEPLOYMENT : str = "deployment"
33
34
  DEPLOYMENT_TYPE : str = "depl_type"
@@ -61,6 +62,7 @@ class DField(ConstGroup) :
61
62
  JOB : str = "job"
62
63
  JOBS : str = "jobs"
63
64
  LABEL : str = "label"
65
+ LABELS : str = "labels"
64
66
  LEVEL : str = "level"
65
67
  LOCAL : str = "local"
66
68
  LOCAL_TIMESTAMP : str = "local_timestamp"
@@ -124,10 +126,12 @@ class DField(ConstGroup) :
124
126
  PYPI_REPO : str = "pypi_repo"
125
127
  PYTHON : str = "python"
126
128
  RADIO_MAP : str = "radio_map"
129
+ RC : str = "rc"
127
130
  REMOTE : str = "remote"
128
131
  RESET_DATA : str = "reset_data"
129
132
  RESULTS : str = "results"
130
133
  RETRY_TIMEOUT : str = "retry_timeout"
134
+ RIGHT : str = "right"
131
135
  RUN_BACKUP : str = "run_backup"
132
136
  RPC_BIND_PORT : str = "rpc_bind_port"
133
137
  RUNTIME_LOG : str = "runtime_log"
@@ -137,11 +141,14 @@ class DField(ConstGroup) :
137
141
  SET_PANE : str = "set_pane"
138
142
  SOCKET_FILE : str = "socket_file"
139
143
  START : str = "start"
144
+ START_STOP_LOG : str = "start_stop_log"
140
145
  STARTING : str = "starting"
141
146
  STATS_MOD : str = "stats_mod"
142
147
  STOP : str = "stop"
143
148
  STOPPING : str = "stopping"
144
149
  STDIN_PATH : str = "stdin_path"
150
+ STDOUT : str = "stdout"
151
+ STDERR : str = "stderr"
145
152
  STRATUM_PORT : str = "stratum_port"
146
153
  SOFTWARE_SYSTEM : str = "software_system"
147
154
  STARTED : str = "started"
@@ -21,6 +21,8 @@ class DFile(ConstGroup):
21
21
  MONGODUMP : str = "mongodump"
22
22
  P2POOL_LOG : str = "p2pool.log"
23
23
  P2POOL_STDIN : str = "p2pool.stdin"
24
+ RM : str = "rm"
25
+ SCRIPT : str = "script"
24
26
  STATS_MOD : str = "stats_mod"
25
27
  SUDO : str = "sudo"
26
28
  SYSTEMCTL : str = "systemctl"
@@ -21,12 +21,13 @@ class DLabel(ConstGroup):
21
21
  API : str = "API"
22
22
  BLOCKCHAIN : str = "Blockchain"
23
23
  BLOCKCHAIN_DIR : str = "Blockchain Directory"
24
+ BLOCKS : str = "Blocks"
24
25
  BLOCKS_FOUND : str = "Blocks Found"
25
26
  CHAIN : str = "Chain"
26
27
  CHAIN_STATS : str = "Chain Stats"
27
28
  CONFIG : str = "Configuration"
28
29
  CONFIG_FILE : str = "Configuration File"
29
- CURRENT_UPTIME : str = "Current Uptime"
30
+ CURRENT : str = "Current"
30
31
  DAYS : str = "Days"
31
32
  DB4E : str = "Db4E Core"
32
33
  DB4E_LONG : str = "Database 4 Everything"
@@ -94,6 +95,7 @@ class DLabel(ConstGroup):
94
95
  P2POOL_WATCHER : str = "P2Pool Watcher"
95
96
  PARENT : str = "Parent"
96
97
  PARENT_ID : str = "Parent ID"
98
+ PAYMENTS : str = "Payments"
97
99
  PLOT : str = "Plot"
98
100
  PRIMARY_SERVER : str = "Primary Server"
99
101
  PRIORITY_NODE_1 : str = "Priority Node 1"
@@ -111,14 +113,16 @@ class DLabel(ConstGroup):
111
113
  SHOW_TIME_STATS : str = "Show Time Stats"
112
114
  SOFTWARE_SYSTEM : str = "Software System"
113
115
  START : str = "Start"
116
+ START_STOP_LOG : str = "Start/Stop Log"
114
117
  STATUS : str = "Status"
115
118
  STARTUP_SCRIPT : str = "Startup Script"
116
119
  STATS_MOD : str = "API stats_mod"
117
120
  STDIN_PATH : str = "Standard Input FIFO"
118
121
  STOP : str = "Stop"
119
122
  STRATUM_PORT : str = "Stratum Port"
123
+ TABLES : str = "Tables"
120
124
  TIMESTAMP : str = "Timestamp"
121
- TOTAL_UPTIME : str = "Total Uptime"
125
+ TOTAL : str = "Total"
122
126
  TUI_LOG : str = "Console Log"
123
127
  TYPE : str = "Type"
124
128
  UPDATE : str = "Update"
@@ -20,8 +20,11 @@ class DMethod(ConstGroup):
20
20
  DISABLE_DEPLOYMENT : str = "disable_deployment"
21
21
  GET_NEW : str = "get_new"
22
22
  GET_DEPL : str = "get_deployment"
23
+ GET_PAYMENTS : str = "get_payments"
23
24
  GET_TUI_LOG : str = "get_tui_log"
24
25
  GET_RUNTIME_LOG : str = "get_runtime_log"
26
+ GET_START_STOP_LOG : str = "get_start_stop_log"
27
+ GET_TABLE_DATA : str = "get_table_data"
25
28
  GET_UPTIME : str = "get_uptime"
26
29
  HASHRATES : str = "hashrates"
27
30
  INITIAL_SETUP : str = "initial_setup"
@@ -33,5 +36,6 @@ class DMethod(ConstGroup):
33
36
  SET_DONATIONS : str = "set_donations"
34
37
  SET_PANE : str = DField.SET_PANE
35
38
  SET_PRIMARY : str = "set_primary"
39
+ SHARES_FOUND : str = "shares_found"
36
40
  UPDATE_DEPLOYMENT : str = "update_deployment"
37
41
  RUNTIME : str = "runtime"
@@ -0,0 +1,40 @@
1
+ """
2
+ db4e/Constants/DPanes.py
3
+
4
+ Database 4 Everything
5
+ Author: Nadim-Daniel Ghaznavi
6
+ Copyright: (c) 2024-2025 Nadim-Daniel Ghaznavi
7
+ GitHub: https://github.com/NadimGhaznavi/db4e
8
+ License: GPL 3.0
9
+ """
10
+
11
+ from db4e.Modules.ConstGroup import ConstGroup
12
+
13
+
14
+ class DPane(ConstGroup):
15
+ CHAIN : str = "ChainPane"
16
+ CHAIN_BLOCKS_FOUND : str = "ChainBlocksFoundPane"
17
+ CHAIN_HASHRATES : str = "ChainHashratesPane"
18
+ DB4E : str = "Db4EPane"
19
+ DONATIONS : str = "DonationsPane"
20
+ INITIAL_SETUP : str = "InitialSetupPane"
21
+ LOG_VIEW : str = "LogViewPane"
22
+ MONEROD_TYPE : str = "MoneroDTypePane"
23
+ MONEROD : str = "MoneroDPane"
24
+ MONEROD_REMOTE : str = "MoneroDRemotePane"
25
+ P2POOL_TYPE : str = "P2PoolTypePane"
26
+ P2POOL : str = "P2PoolPane"
27
+ P2POOL_ANALYTICS : str = "P2PoolAnalyticsPane"
28
+ P2POOL_HASHRATES : str = "P2PoolHashratesPane"
29
+ P2POOL_REMOTE : str = "P2PoolRemotePane"
30
+ P2POOL_SHARES_FOUND : str = "P2PoolSharesFoundPane"
31
+ P2POOL_TABLES : str = "P2PoolTablesPane"
32
+ PAYMENTS : str = "PaymentsPane"
33
+ RESULTS : str = "ResultsPane"
34
+ RUNTIME_LOG : str = "RuntimeLogPane"
35
+ TUI_LOG : str = "TuiLogPane"
36
+ START_STOP_LOG : str = "StartStopLogPane"
37
+ WELCOME : str = "WelcomePane"
38
+ XMRIG : str = "XMRigPane"
39
+ XMRIG_HASHRATES : str = "XMRigHashratesPane"
40
+ XMRIG_REMOTE : str = "XMRigRemotePane"
@@ -11,13 +11,21 @@ db4e/Constants/DSelect.py
11
11
  from db4e.Constants.DLabel import DLabel
12
12
 
13
13
 
14
- WEEKS_1 = 7 * 24
15
- WEEKS_2 = 14 * 24
16
- MONTHS_1 = 30 * 24
17
- MONTHS_3 = 30 * 24 * 3
18
- MONTHS_6 = 30 * 24 * 6
14
+ WEEKS_1 = 7
15
+ WEEKS_2 = 14
16
+ MONTHS_1 = 30
17
+ MONTHS_3 = 30 * 3
18
+ MONTHS_6 = 30 * 6
19
19
 
20
20
  class DSelect:
21
+ HOURS_SELECT_LIST = [
22
+ (DLabel.WEEK_1, WEEKS_1 * 24),
23
+ (DLabel.WEEKS_2, WEEKS_2 * 24),
24
+ (DLabel.MONTH_1, MONTHS_1 * 24),
25
+ (DLabel.MONTHS_3, MONTHS_3 * 24),
26
+ (DLabel.MONTHS_6, MONTHS_6 * 24),
27
+ (DLabel.ALL_TIME, -1)
28
+ ]
21
29
  SELECT_LIST = [
22
30
  (DLabel.WEEK_1, WEEKS_1),
23
31
  (DLabel.WEEKS_2, WEEKS_2),
@@ -326,7 +326,7 @@ Tree {
326
326
  Button {
327
327
  align: center middle;
328
328
  border: round #0c323e;
329
- width: 20;
329
+ width: 15;
330
330
  background: black; }
331
331
 
332
332
  #abort_button {
@@ -361,6 +361,10 @@ Button {
361
361
  color: #5fc442;
362
362
  text-style: bold; }
363
363
 
364
+ #payments_button {
365
+ color: #9a71c9ff;
366
+ text-style: bold; }
367
+
364
368
  #proceed_button {
365
369
  color: #5fc442;
366
370
  text-style: bold; }
@@ -370,7 +374,11 @@ Button {
370
374
  text-style: bold; }
371
375
 
372
376
  #runtime_button {
373
- color: #9a71c9ff;
377
+ color: #4292c4ff;
378
+ text-style: bold; }
379
+
380
+ #shares_found_button {
381
+ color: #4292c4ff;
374
382
  text-style: bold; }
375
383
 
376
384
  #start_button {
@@ -381,6 +389,10 @@ Button {
381
389
  color: #c44242;
382
390
  text-style: bold; }
383
391
 
392
+ #tables_button {
393
+ color: #42c4a4ff;
394
+ text-style: bold; }
395
+
384
396
  #update_button {
385
397
  color: #5fc442;
386
398
  text-style: bold; }
@@ -405,6 +417,12 @@ Button {
405
417
  .new #hashrate_button {
406
418
  display: none; }
407
419
 
420
+ .new #shares_found_button {
421
+ display: none; }
422
+
423
+ .new #tables_button {
424
+ display: none; }
425
+
408
426
  .new #update_button {
409
427
  display: none; }
410
428
 
@@ -48,7 +48,6 @@ class DbMgr:
48
48
  self.mining_col = DDef.MINING_COLLECTION
49
49
  self.depl_col = DDef.DEPL_COLLECTION
50
50
  self.jobs_col = DDef.JOBS_COLLECTION
51
- self.log_col = DDef.LOG_COLLECTION
52
51
  self.log_retention = DDef.LOG_RETENTION_DAYS
53
52
  self.ops_col = DDef.OPS_COLLECTION
54
53
 
@@ -82,9 +81,7 @@ class DbMgr:
82
81
 
83
82
 
84
83
  def ensure_indexes(self):
85
- log_col = self.get_collection(self.log_col)
86
- if "timestamp_1" not in log_col.index_information():
87
- log_col.create_index("timestamp")
84
+ pass
88
85
 
89
86
 
90
87
  @as_worker
@@ -135,9 +132,6 @@ class DbMgr:
135
132
  if aCol not in db_col_names:
136
133
  try:
137
134
  self.db4e.create_collection(aCol)
138
- if aCol == log_col:
139
- log_col = self.get_collection(log_col)
140
- log_col.create_index('timestamp')
141
135
  except CollectionInvalid:
142
136
  # TODO self.log.warning(f"Attempted to create existing collection: {aCol}")
143
137
  pass
@@ -84,6 +84,13 @@ class DeplClient:
84
84
  # Check for duplicate instance names and missing fields
85
85
  self.check_instance_and_fields(elem)
86
86
 
87
+ # Check for errors
88
+ if elem.status() != DStatus.GOOD and elem.status() != DStatus.UNKNOWN:
89
+ print(f"DeplClient:add_deployment(): Add failed: {elem.status()}")
90
+ for msg in elem.get_msgs():
91
+ print(f"DeplClient:add_deployment(): {msg}")
92
+ return elem
93
+
87
94
  class_map = {
88
95
  Db4E: DElem.DB4E,
89
96
  MoneroD: DElem.MONEROD,
@@ -95,6 +102,8 @@ class DeplClient:
95
102
 
96
103
  # Create an add job
97
104
  elem_type = class_map[type(elem)]
105
+
106
+ print(f"DeplClient:add_deployment(): Posting {DJob.NEW} job for {elem}")
98
107
 
99
108
  job = Job(op=DJob.NEW, instance=elem.instance(), elem_type=elem_type, elem=elem)
100
109
  self.job_queue.post_job(job)
@@ -13,7 +13,7 @@ from datetime import datetime
13
13
  from shutil import rmtree
14
14
  import socket
15
15
  from typing import overload
16
- import re
16
+ import subprocess
17
17
 
18
18
 
19
19
  from db4e.Modules.DbCache import DbCache
@@ -28,7 +28,7 @@ from db4e.Modules.P2Pool import P2Pool
28
28
  from db4e.Modules.P2PoolRemote import P2PoolRemote
29
29
  from db4e.Modules.XMRig import XMRig
30
30
  from db4e.Modules.XMRigRemote import XMRigRemote
31
- from db4e.Modules.Helper import uptime_to_minutes
31
+ from db4e.Modules.Helper import uptime_to_minutes, sudo_del_file
32
32
 
33
33
  from db4e.Constants.DField import DField
34
34
  from db4e.Constants.DLabel import DLabel
@@ -328,8 +328,7 @@ class DeplMgr:
328
328
  if os.path.exists(config):
329
329
  os.remove(config)
330
330
  logrotate_config = elem.logrotate_config()
331
- if os.path.exists(logrotate_config):
332
- os.remove(logrotate_config)
331
+ sudo_del_file(logrotate_config)
333
332
  depl_dir = os.path.join(vendor_dir, DDir.P2POOL, elem.instance())
334
333
  if os.path.isdir(depl_dir):
335
334
  rmtree(depl_dir)
@@ -338,8 +337,7 @@ class DeplMgr:
338
337
  if os.path.exists(config):
339
338
  os.remove(config)
340
339
  logrotate_config = elem.logrotate_config()
341
- if os.path.exists(logrotate_config):
342
- os.remove(logrotate_config)
340
+ sudo_del_file(logrotate_config)
343
341
  depl_dir = os.path.join(vendor_dir, DElem.XMRIG, elem.instance())
344
342
  if os.path.isdir(depl_dir):
345
343
  rmtree(depl_dir)
@@ -426,7 +424,7 @@ class DeplMgr:
426
424
  elif type(obj) == XMRig:
427
425
  if obj.parent() != DField.DISABLE:
428
426
  obj.p2pool = self.get_deployment_by_id(obj.parent())
429
- if obj.p2pool.parent() != DField.DISABLE:
427
+ if type(obj.p2pool) == P2Pool and obj.p2pool.parent() != DField.DISABLE:
430
428
  obj.p2pool.monerod = self.get_deployment_by_id(obj.p2pool.parent())
431
429
  obj.instance_map = self.get_deployment_ids_and_instances(DElem.P2POOL)
432
430
  return obj
@@ -494,7 +492,7 @@ class DeplMgr:
494
492
 
495
493
  elif aDir == DDir.LOGROTATE:
496
494
  vendor_dir = self.get_dir(DDir.VENDOR)
497
- return os.path.abspath(os.path.join(vendor_dir, DElem.DB4E, DDir.LOGROTATE))
495
+ return os.path.abspath(os.path.join(vendor_dir, DDir.LOGROTATE))
498
496
 
499
497
  elif aDir == DElem.MONEROD:
500
498
  return DElem.MONEROD + '-' + Default.MONEROD_VERSION
@@ -977,7 +975,7 @@ class DeplMgr:
977
975
  if p2pool.p2p_port != new_p2pool.p2p_port:
978
976
  msg = f"Updated P2P bind port: {p2pool.p2p_port()} > " \
979
977
  f"{new_p2pool.p2p_port()}"
980
- p2pool.p2p_bind_port(new_p2pool.p2p_port())
978
+ p2pool.p2p_port(new_p2pool.p2p_port())
981
979
  p2pool.msg(DLabel.P2POOL_SHORT, DStatus.GOOD, msg)
982
980
  update_config = True
983
981
  update = True
@@ -97,7 +97,7 @@ class HealthCache:
97
97
  return deepcopy(self.db4es_map[DField.INSTANCE][DField.INSTANCE])
98
98
  except KeyError:
99
99
  print(f"HealthCache:check(): Db4E key error: {elem}")
100
- return None
100
+ return elem
101
101
 
102
102
  # Monero
103
103
  elif type(elem) == MoneroD:
@@ -105,7 +105,7 @@ class HealthCache:
105
105
  return deepcopy(self.monerods_map[elem.instance()][DField.INSTANCE])
106
106
  except KeyError:
107
107
  print(f"HealthCache:check(): Monero key error: {elem}")
108
- return None
108
+ return elem
109
109
 
110
110
  # Remote Monero
111
111
  elif type(elem) == MoneroDRemote:
@@ -120,7 +120,7 @@ class HealthCache:
120
120
  return deepcopy(self.p2pools_map[elem.instance()][DField.INSTANCE])
121
121
  except KeyError:
122
122
  print(f"HealthCache:check(): P2Pool key error: {elem}")
123
- return None
123
+ return elem
124
124
 
125
125
  # Remote P2Pool
126
126
  elif type(elem) == P2PoolRemote:
@@ -128,7 +128,7 @@ class HealthCache:
128
128
  return deepcopy(self.p2pools_remote_map[elem.instance()][DField.INSTANCE])
129
129
  except KeyError:
130
130
  print(f"HealthCache:check(): Remote P2Pool key error: {elem}")
131
- return None
131
+ return elem
132
132
 
133
133
  # Internal P2Pool
134
134
  elif type(elem) == InternalP2Pool:
@@ -136,7 +136,7 @@ class HealthCache:
136
136
  return deepcopy(self.int_p2pools_map[elem.instance()][DField.INSTANCE])
137
137
  except KeyError:
138
138
  print(f"HealthCache:check(): InternalP2Pool key error: {elem}")
139
- return None
139
+ return elem
140
140
 
141
141
  # XMRig
142
142
  elif type(elem) == XMRig:
@@ -144,7 +144,7 @@ class HealthCache:
144
144
  return deepcopy(self.xmrigs_map[elem.instance()][DField.INSTANCE])
145
145
  except KeyError:
146
146
  print(f"HealthCache:check(): XMRig key error: {elem}")
147
- return None
147
+ return elem
148
148
 
149
149
  # Remote XMRig
150
150
  elif type(elem) == XMRigRemote:
@@ -152,7 +152,7 @@ class HealthCache:
152
152
  return deepcopy(self.xmrigs_remote_map[elem.instance()])
153
153
  except KeyError:
154
154
  print(f"HealthCache:check(): XMRigRemote key error: {elem}")
155
- return None
155
+ return elem
156
156
 
157
157
  else:
158
158
  raise ValueError(f"Unsupported element type: {type(elem)}")
@@ -29,6 +29,7 @@ from db4e.Constants.DField import DField
29
29
  class HealthMgr:
30
30
 
31
31
  def check(self, elem):
32
+ #print(f"HealthMgr:check(): {elem}")
32
33
  elem.pop_msgs()
33
34
  if type(elem) == Db4E:
34
35
  return self.check_db4e(elem)
@@ -335,6 +336,17 @@ class HealthMgr:
335
336
  if xmrig.parent() == DField.DISABLE:
336
337
  xmrig.msg(DLabel.P2POOL, DStatus.WARN,
337
338
  f"Missing upstream P2pool deployment")
339
+
340
+ # Check the health of the upstream P2Pool
341
+ self.check(xmrig.p2pool)
342
+ if xmrig.p2pool.status() == DStatus.GOOD:
343
+ xmrig.msg(DLabel.P2POOL, DStatus.GOOD,
344
+ f"Upstream P2Pool ({xmrig.p2pool.instance()}) is healthy")
345
+ else:
346
+ xmrig.msg(DLabel.P2POOL, DStatus.WARN,
347
+ f"Upstream P2Pool ({xmrig.p2pool.instance()}) has issues:")
348
+ xmrig.push_msgs(xmrig.p2pool.pop_msgs())
349
+
338
350
 
339
351
  return xmrig
340
352
 
@@ -9,36 +9,20 @@ db4e/Modules/Helper.py
9
9
 
10
10
  Helper functions that are used in multiple modules
11
11
  """
12
- import os, grp, getpass, re
12
+ import os, grp, getpass, re, subprocess
13
13
 
14
14
  from rich import box
15
15
  from rich.table import Table
16
16
 
17
17
  from db4e.Constants.DStatus import DStatus
18
18
  from db4e.Constants.DField import DField
19
- from db4e.Constants.DLabel import DLabel
19
+ from db4e.Constants.DFile import DFile
20
20
 
21
21
 
22
22
 
23
23
  error_color = "#935fcf"
24
24
 
25
25
 
26
- def del_config(config_file: str):
27
- results = []
28
- try:
29
- os.remove(config_file)
30
- results.append(result_row(
31
- DLabel.XMRIG, DStatus.GOOD,
32
- f"Removed old configration file: {config_file}"
33
- ))
34
- except OSError as e:
35
- result_row.append(result_row(
36
- DLabel.XMRIG, DStatus.WARN,
37
- f"Unable to remove {config_file} {e} "
38
- ))
39
- return results
40
-
41
-
42
26
  def get_component_value(data, field_name):
43
27
  """
44
28
  Generic helper to get any component value by field name.
@@ -153,6 +137,32 @@ def set_component_value(rec, updates):
153
137
  return rec
154
138
 
155
139
 
140
+ def sudo_del_file(aFile: str):
141
+ if not os.path.exists(aFile):
142
+ # Nothing to do
143
+ return
144
+
145
+ cmd = [ DFile.SUDO, DFile.RM, "-f", aFile ]
146
+ try:
147
+ proc = subprocess.run(
148
+ cmd,
149
+ stdout=subprocess.PIPE,
150
+ stderr=subprocess.PIPE,
151
+ input=''
152
+ )
153
+ return {
154
+ DField.STDOUT: proc.stdout.decode('utf-8'),
155
+ DField.STDERR: proc.stderr.decode('utf-8'),
156
+ DField.RC: proc.returncode
157
+ }
158
+ except Exception as e:
159
+ return {
160
+ DField.STDOUT: proc.stdout.decode('utf-8'),
161
+ DField.STDERR: proc.stderr.decode('utf-8'),
162
+ DField.RC: proc.returncode
163
+ }
164
+
165
+
156
166
  def uptime_to_minutes(uptime_str: str):
157
167
  pattern = re.compile(r'(?:(\d+)d)?\s*(?:(\d+)h)?\s*(?:(\d+)m)?\s*(?:(\d+)s)?')
158
168
  match = pattern.fullmatch(uptime_str)
@@ -72,6 +72,11 @@ class InstallMgr(Container):
72
72
  self.db_cache.update_one(db4e)
73
73
  return db4e
74
74
 
75
+ # Create base vendor directories
76
+ vendor_dir = db4e.vendor_dir()
77
+ for aDir in [ DDef.BACKUP_DIR, DDef.LOG_ROTATE ]:
78
+ os.makedirs(os.path.join(vendor_dir, aDir))
79
+ db4e.msg(DLabel.VENDOR_DIR, DStatus.GOOD, f"Created directory: {aDir}")
75
80
 
76
81
  # We have everything we need to finish the install. Update the record.
77
82
  self.db_cache.update_one(db4e)
@@ -258,9 +263,10 @@ class InstallMgr(Container):
258
263
  os.makedirs(os.path.join(fq_db4e_dir))
259
264
  db4e.msg(DLabel.DB4E, DStatus.GOOD, f"Created directory: {fq_db4e_dir}")
260
265
  # Create the sub-directories
261
- for sub_dir in [DDef.LOG_DIR, DDef.LOG_ROTATE, DDef.BACKUP_DIR ]:
266
+ for sub_dir in [DDef.LOG_DIR ]:
262
267
  os.mkdir(os.path.join(fq_db4e_dir, sub_dir))
263
268
  db4e.msg(DLabel.DB4E, DStatus.GOOD, f"Created directory: {fq_db4e_dir}/{sub_dir}")
269
+ db4e.msg(DLabel.DB4E, DStatus.GOOD, f"Created directory: {fq_db4e_dir}/{DDef.LOG_ROTATE}")
264
270
  return db4e
265
271
 
266
272
  def _create_monerod_dirs(self, db4e: Db4E) -> Db4E:
@@ -380,7 +386,7 @@ class InstallMgr(Container):
380
386
  logrotate_tmpl = self.depl_mgr.get_logrotate_template(DElem.DB4E)
381
387
  vendor_dir = db4e.vendor_dir()
382
388
  fq_config = os.path.join(
383
- vendor_dir, DElem.DB4E, DDef.LOG_ROTATE, DElem.DB4E + DDef.CONF_SUFFIX)
389
+ vendor_dir, DDef.LOG_ROTATE, DElem.DB4E + DDef.CONF_SUFFIX)
384
390
 
385
391
  # Populate the config template
386
392
  placeholders = {