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.
- {db4e-0.44.2 → db4e-0.46.0}/PKG-INFO +1 -1
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DButton.py +3 -1
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DDef.py +1 -1
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DField.py +7 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DFile.py +2 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DLabel.py +6 -2
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DMethod.py +4 -0
- db4e-0.46.0/db4e/Constants/DPane.py +40 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DSelect.py +13 -5
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Db4E.tcss +20 -2
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DbMgr.py +1 -7
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DeplClient.py +9 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DeplMgr.py +7 -9
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/HealthCache.py +7 -7
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/HealthMgr.py +12 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Helper.py +28 -18
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/InstallMgr.py +8 -2
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MessageRouter.py +41 -35
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MiningDb.py +27 -7
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MiningETL.py +171 -63
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/OpsMgr.py +70 -51
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/P2Pool.py +2 -2
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/P2PoolWatcher.py +1 -1
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/PaneCatalogue.py +10 -4
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/SoftwareSystem.py +4 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/XMRig.py +2 -2
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ChainBlocksFoundPane.py +0 -11
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ChainHashratesPane.py +6 -6
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ChainPane.py +1 -1
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/Db4EPane.py +15 -6
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/P2PoolHashratesPane.py +6 -6
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/P2PoolPane.py +36 -17
- db4e-0.46.0/db4e/Panes/P2PoolSharesFoundPane.bar.py +138 -0
- db4e-0.46.0/db4e/Panes/P2PoolSharesFoundPane.py +80 -0
- db4e-0.46.0/db4e/Panes/P2PoolSharesFoundPane.stacked.py +115 -0
- db4e-0.46.0/db4e/Panes/P2PoolTablesPane.py +61 -0
- db4e-0.46.0/db4e/Panes/PaymentsPane.py +62 -0
- db4e-0.44.2/db4e/Panes/UptimePane.py → db4e-0.46.0/db4e/Panes/RuntimePane.py +25 -7
- db4e-0.44.2/db4e/Panes/RuntimeLogPane.py → db4e-0.46.0/db4e/Panes/StartStopLogPane.py +2 -2
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/XMRigHashratesPane.py +6 -6
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/XMRigPane.py +0 -1
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/XMRigRemotePane.py +6 -7
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/systemd/p2pool@.service +9 -9
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/systemd/p2pool@.socket +1 -0
- db4e-0.46.0/db4e/Widgets/Db4EPlot.py +129 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/NavPane.py +5 -5
- {db4e-0.44.2 → db4e-0.46.0}/db4e/data_migration.py +37 -1
- {db4e-0.44.2 → db4e-0.46.0}/db4e/server.py +12 -4
- {db4e-0.44.2 → db4e-0.46.0}/pyproject.toml +1 -1
- db4e-0.44.2/db4e/Constants/DPane.py +0 -37
- db4e-0.44.2/db4e/Widgets/HashratePlot.py +0 -92
- {db4e-0.44.2 → db4e-0.46.0}/LICENSE +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/README.md +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/App.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DDebug.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DDir.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DElem.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DForm.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DJob.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DMining.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DModule.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DMongo.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DOps.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DPlaceholder.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DStatus.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/DSystemD.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Constants/__init__.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/Db4eMsg.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/Quit.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/RefreshNavPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/UpdateTopBar.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Messages/__init__.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Components.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/ConfigMgr.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/ConstGroup.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Db4E.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Db4ELogger.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Db4ESystemD.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/DbCache.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/InternalP2Pool.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/Job.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/JobQueue.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/LocalSoftwareSystem.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MoneroD.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/MoneroDRemote.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/OpsDb.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/P2PoolRemote.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/PaneMgr.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/XMRigRemote.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Modules/__init__.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/DonationsPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/InitialSetupPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/LogViewPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/MoneroDPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/MoneroDRemotePane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/P2PoolRemotePane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/ResultsPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/TUILogPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/WelcomePane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Panes/__init__.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/__init__.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/db4e/conf/db4e-logrotate.conf +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/db4e/systemd/db4e.service +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/bin/monerod +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/bin/start-monerod.sh +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/conf/monerod.ini +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/systemd/monerod@.service +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/monerod-0.18.4.2/systemd/monerod@.socket +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/bin/p2pool +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/bin/start-p2pool.sh +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/conf/p2pool-logrotate.conf +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/conf/p2pool.ini +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/docs/LICENSE +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/p2pool-4.11/docs/README.md +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/bin/xmrig +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/conf/config.json +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/conf/xmrig-logrotate.conf +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Templates/xmrig-6.24.0/systemd/xmrig@.service +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/BarChart.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/Clock.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/DetailPane.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/TopBar.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/Widgets/__init__.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-backup.sh +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-initial-setup.sh +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-install-service.sh +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-metrics.sh +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/bin/db4e-uninstall-service.sh +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/enable_mre.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/test_barchart.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/test_etl.py +0 -0
- {db4e-0.44.2 → db4e-0.46.0}/db4e/test_plot.py +0 -0
|
@@ -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 = "
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
15
|
-
WEEKS_2 = 14
|
|
16
|
-
MONTHS_1 = 30
|
|
17
|
-
MONTHS_3 = 30 *
|
|
18
|
-
MONTHS_6 = 30 *
|
|
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:
|
|
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: #
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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,
|
|
389
|
+
vendor_dir, DDef.LOG_ROTATE, DElem.DB4E + DDef.CONF_SUFFIX)
|
|
384
390
|
|
|
385
391
|
# Populate the config template
|
|
386
392
|
placeholders = {
|