543 Commits

Author SHA1 Message Date
8fa1c29c59 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:32 +00:00
318ef00817 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:31 +00:00
3fcdf69f56 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:31 +00:00
e2785fff55 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:30 +00:00
e5adc46d44 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:29 +00:00
6052fcbe7e Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:29 +00:00
268e7e9b23 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:28 +00:00
53f93fe01b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:28 +00:00
202cb09e2b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:27 +00:00
c29df047d2 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:27 +00:00
8dc8a3d39b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:26 +00:00
34a4c17e9b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:26 +00:00
ccb61bd1d9 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:25 +00:00
be89574d27 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:25 +00:00
e8a12c08d8 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:24 +00:00
16a5812db0 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:23 +00:00
366eeab65d Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:23 +00:00
ce185f92e3 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:22 +00:00
276dccf5fd Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:22 +00:00
4fc6c80352 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:21 +00:00
016afe19f8 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:21 +00:00
7295ad401c Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:20 +00:00
1eed0fbda0 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:19 +00:00
da449b9852 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:19 +00:00
Tower Deploy
9a499aced7 Wipe addons/: corrupt source from old double-base64 upload bug + test artifacts; ready for clean re-upload 2026-04-27 10:59:54 +03:00
c3f2c4f522 Tower: upload probe_addon 16.0.1.0.0 (via marketplace) 2026-04-27 07:53:52 +00:00
a356f71745 Tower: upload probe_addon 16.0.1.0.0 (via marketplace) 2026-04-27 07:53:51 +00:00
0a76509365 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:23 +00:00
9083833444 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:22 +00:00
ed9dc11c4b Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:22 +00:00
1c2d483a46 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:21 +00:00
1f073938d7 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:21 +00:00
e12133fff0 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:20 +00:00
61d95f53d6 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:20 +00:00
ebd9d7c16f Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:19 +00:00
455a7192d3 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:18 +00:00
4c8ec8ffa3 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:18 +00:00
2beca515ca Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:17 +00:00
e1c3544f09 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:17 +00:00
242fc36fd0 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:16 +00:00
4754df89b7 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:16 +00:00
e050040bae Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:15 +00:00
30deb10c27 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:14 +00:00
f2791efa4f Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:14 +00:00
acc9748aa2 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:13 +00:00
b36fe277c0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:53 +00:00
0b07e80ecb Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:53 +00:00
b448019f93 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:52 +00:00
a108daebd0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:52 +00:00
2c950b5a0a Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:51 +00:00
0ded373257 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:51 +00:00
4ad6ffce26 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:50 +00:00
265f8092e5 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:49 +00:00
6735056551 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:49 +00:00
a70aae6404 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:48 +00:00
f7c2027d17 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:48 +00:00
8f9c4f4ed9 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:47 +00:00
cd4fa9df4d Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:47 +00:00
b776dea93e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:46 +00:00
2d655e9822 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:46 +00:00
f1aef07115 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:45 +00:00
ceac54f2a8 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:45 +00:00
8cd2d73dd1 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:44 +00:00
4c8a85091e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:44 +00:00
1d8e306a5b Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:43 +00:00
ff76148774 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:42 +00:00
263616cf66 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:42 +00:00
5d8563cf5e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:41 +00:00
3a8e7bb486 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:41 +00:00
dac924d260 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:40 +00:00
2fec9bae57 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:40 +00:00
a3a0e7f1a9 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:39 +00:00
57e4922aa4 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:39 +00:00
5a86e951c9 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:38 +00:00
07a2292b98 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:38 +00:00
498ebf5b5e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:37 +00:00
0c0a53fb80 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:37 +00:00
f13d08283f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:36 +00:00
6776b72adf Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:36 +00:00
fc0111f9af Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:35 +00:00
58ecb0871a Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:34 +00:00
5ab36dc181 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:34 +00:00
9eb4e7eb59 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:33 +00:00
b73d178751 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:33 +00:00
aeb5997303 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:32 +00:00
b6be8f1f51 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:32 +00:00
6e4ec0f188 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:31 +00:00
d84a9d95e3 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:31 +00:00
e85ead856e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:30 +00:00
d640f69b64 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:30 +00:00
3a855c6905 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:29 +00:00
e5bc9f79bc Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:29 +00:00
e4a9a645a1 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:28 +00:00
7be7fc0d06 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:28 +00:00
639c21ee64 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:27 +00:00
83463f08fd Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:27 +00:00
d62c41a4c0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:26 +00:00
5bc32a7b39 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:26 +00:00
b87f9f2f0f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:25 +00:00
ecb8f48fc7 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:25 +00:00
453e861eb1 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:24 +00:00
9d9ba90f65 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:24 +00:00
c0ec43dc15 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:23 +00:00
8bf0f53a1f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:23 +00:00
b9935804d8 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:22 +00:00
e3cd173cae Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:22 +00:00
0b171536bd Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:21 +00:00
4df5459abb Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:21 +00:00
99c360c739 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:20 +00:00
238f3a123f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:19 +00:00
7635f192bc Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:19 +00:00
4be4c95126 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:19 +00:00
c7174e1aa0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:18 +00:00
038f113176 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:18 +00:00
e640b7dc00 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:17 +00:00
69ee0e8a79 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:16 +00:00
44f9bf1d9d Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:16 +00:00
528d049505 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:16 +00:00
d38fff270d Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:15 +00:00
f47e6d77df Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:14 +00:00
bcdb9f7100 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:14 +00:00
79c3511ced Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:13 +00:00
77163b4017 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:13 +00:00
52512ff961 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:12 +00:00
8e37d624ff Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:11 +00:00
2b845fa110 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:11 +00:00
09c730c852 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:56 +00:00
9ea0b5ca1e Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:55 +00:00
3f7c12c4cb Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:55 +00:00
52212a4234 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:54 +00:00
aad83a6e45 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:54 +00:00
b15249a7cc Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:53 +00:00
971c0b6bb1 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:53 +00:00
c8259d3fae Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:52 +00:00
c1c1591ffd Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:52 +00:00
1ceae80007 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:51 +00:00
711c240058 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:51 +00:00
ed906caf54 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:50 +00:00
fa316c0948 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:50 +00:00
64da73b835 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:49 +00:00
51d27b362c Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:49 +00:00
11bf6134ec Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:48 +00:00
e6fd3d1594 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:48 +00:00
6c440b46d0 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:47 +00:00
6f5049ff54 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:46 +00:00
785da91996 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:46 +00:00
a59be21d5c Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:45 +00:00
dcd8d31c0b Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:45 +00:00
bbff9cd347 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:44 +00:00
c5433c7b44 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:44 +00:00
52e3ae85ef Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:43 +00:00
6ee8d34a08 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:43 +00:00
fc845bf79a Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:42 +00:00
aa3ea16a1b Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:42 +00:00
5d72ad53fb Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:41 +00:00
d5a16b3baa Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:41 +00:00
4300c11cb1 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:40 +00:00
611bf9a530 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:40 +00:00
f665a077cb Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:39 +00:00
62c2411818 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:39 +00:00
1aeff8903c Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:38 +00:00
7a0fe4f363 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:38 +00:00
6ebe68c8fc Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:37 +00:00
075a340056 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:37 +00:00
d764da736d Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:36 +00:00
b9ee75209a Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) (force-overwrite) 2026-04-27 06:56:35 +00:00
389ffcbadb Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) (force-overwrite) 2026-04-27 06:56:35 +00:00
37ec61eab2 Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) 2026-04-27 06:56:34 +00:00
a901150981 Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) 2026-04-27 06:56:33 +00:00
d7e623d816 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:12 +00:00
45e7dd2c6c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:11 +00:00
25ca66a86b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:11 +00:00
a78cbd6583 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:10 +00:00
09283bba61 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:10 +00:00
e738070b24 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:09 +00:00
0c67e0d798 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:09 +00:00
9e7f379923 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:08 +00:00
93426fbae5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:08 +00:00
f1b9101b13 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:07 +00:00
33d3b02763 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:06 +00:00
2a169afa62 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:06 +00:00
a2fc7b47c1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:05 +00:00
c717460cea Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:04 +00:00
a8f57858d8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:04 +00:00
3ab0e79386 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:03 +00:00
236b78c33b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:02 +00:00
18138fd178 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:02 +00:00
fa34dcb44e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:01 +00:00
f8a7e22755 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:00 +00:00
5e7a05b949 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:00 +00:00
676d1fd8c1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:59 +00:00
9a569b9af1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:59 +00:00
bfda22756e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:58 +00:00
237d692cd1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:58 +00:00
31b57b24f5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:57 +00:00
ff8cc52e41 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:56 +00:00
f6d8bab742 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:56 +00:00
1bd0a301dd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:55 +00:00
d7ac3f27e0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:55 +00:00
adf18c04a9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:54 +00:00
150023c203 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:54 +00:00
21bf17da38 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:53 +00:00
54c3d037a0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:53 +00:00
cc7c59f4fa Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:52 +00:00
491c5fa696 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:52 +00:00
cb1c08a52d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:51 +00:00
7c414a48de Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:51 +00:00
0d03d8d956 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:50 +00:00
ee974eb8d1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:50 +00:00
5e17847c10 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:49 +00:00
753ee2e4e3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:49 +00:00
2c73095fd6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:48 +00:00
c31875dc95 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:48 +00:00
39ac32de74 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:47 +00:00
3a6f76212d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:47 +00:00
89c5d6195a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:46 +00:00
a6c0f93af0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:46 +00:00
f52cdfe12d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:45 +00:00
fe91357505 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:44 +00:00
e4c578f20a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:44 +00:00
d9734e17fb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:43 +00:00
4cc3f94635 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:43 +00:00
8ff4dd5b3c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:42 +00:00
423b6acfde Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:42 +00:00
ccf2ec0804 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:41 +00:00
002f0bda6f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:41 +00:00
753aee7fc5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:40 +00:00
c96b8b5c64 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:40 +00:00
821e088b8e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:39 +00:00
3ea5965a99 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:38 +00:00
5ce2821634 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:38 +00:00
5d4b6ee4fc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:37 +00:00
7399e63d70 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:37 +00:00
fc27945b4e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:36 +00:00
2b98a8ca57 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:36 +00:00
d50103ca24 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:35 +00:00
52a3aaec81 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:35 +00:00
48d9f3af80 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:34 +00:00
7575ca93ad Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:33 +00:00
dcf7f0daa9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:33 +00:00
ffe3f45168 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:32 +00:00
bd17bdabf9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:32 +00:00
118c993e31 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:31 +00:00
33707afaaf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:31 +00:00
5fc79cb304 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:30 +00:00
b595872bb3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:29 +00:00
e50e55444c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:29 +00:00
0f68d7e8f9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:28 +00:00
f161ba7728 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:28 +00:00
fb2479c6fe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:27 +00:00
f8f75587c3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:27 +00:00
3cbf6b5144 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:26 +00:00
48cf579779 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:26 +00:00
5c5edd2106 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:25 +00:00
4a4b2f7206 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:25 +00:00
e84cdd1a54 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:24 +00:00
410eaab039 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:24 +00:00
8b8dd4758f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:23 +00:00
16dfa61d3d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:23 +00:00
cd0dcdb06b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:22 +00:00
0bc76ebcfb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:22 +00:00
b86383444b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:21 +00:00
e788902689 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:21 +00:00
2d0d90ba7e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:20 +00:00
c56cba7257 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:19 +00:00
63623d0dc3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:19 +00:00
1a409eab82 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:18 +00:00
135242d577 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:18 +00:00
aec96c5193 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:17 +00:00
a68eef6627 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:17 +00:00
0ed1ee7bb0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:16 +00:00
ccdde704c7 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:16 +00:00
f2803833a6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:15 +00:00
884df448f0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:14 +00:00
a1cba28258 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:14 +00:00
eddb6db49e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:13 +00:00
67267c20a3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:13 +00:00
547da816ad Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:12 +00:00
ecf57118ba Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:12 +00:00
3681255837 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:11 +00:00
f97595108f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:11 +00:00
7bf6c0aa4b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:10 +00:00
9fb24cad21 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:10 +00:00
b036b9f480 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:09 +00:00
2d677619f3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:08 +00:00
576e6edecc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:08 +00:00
0819ee5593 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:08 +00:00
7ca45462cf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:07 +00:00
0e8399ae71 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:07 +00:00
cf42f5455d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:06 +00:00
50536e5867 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:05 +00:00
e3c584c560 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:05 +00:00
c48e67db97 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:04 +00:00
fd8c6f50f2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:04 +00:00
e09e6074c8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:03 +00:00
c470e9603f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:03 +00:00
faf0882b3a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:02 +00:00
e96209ad14 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:02 +00:00
1912047142 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:01 +00:00
8011416ceb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:01 +00:00
2d3f527e24 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:00 +00:00
aed221fa34 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:59 +00:00
425d46b0ef Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:59 +00:00
b3d43ad682 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:58 +00:00
65af6a8437 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:58 +00:00
ac07f2e7df Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:57 +00:00
4d1c88b43b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:57 +00:00
465720ccdd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:56 +00:00
21fe8ed322 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:56 +00:00
01d440de88 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:55 +00:00
aba0ce3a6d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:55 +00:00
906217822f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:54 +00:00
9e81d94e5d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:54 +00:00
092f3b1026 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:53 +00:00
6739cac57b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:53 +00:00
2d69ab84ce Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:52 +00:00
af3a8d4dbc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:52 +00:00
0792585612 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:51 +00:00
ee798802e6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:51 +00:00
3f44bf0577 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:50 +00:00
eaedae0565 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:50 +00:00
9c068d07c9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:49 +00:00
8abe88b2d3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:49 +00:00
ece70df8fe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:48 +00:00
ecc375cf63 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:48 +00:00
d89a5b2e4b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:47 +00:00
d041586baf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:47 +00:00
49472d32a1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:46 +00:00
aa83b5c270 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:46 +00:00
24bd37cd38 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:45 +00:00
a4e24baeb5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:45 +00:00
f0512fdce3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:44 +00:00
101b6c9b74 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:44 +00:00
9db3f91c28 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:43 +00:00
94de4c07da Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:43 +00:00
67eedfddc4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:42 +00:00
829ec15b5b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:42 +00:00
e8bc314cfb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:41 +00:00
85328a6e96 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:41 +00:00
3af743ed1b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:40 +00:00
b3b67e7abf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:39 +00:00
f2d4464209 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:39 +00:00
3fa52b6f32 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:38 +00:00
01ad3e8a8a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:38 +00:00
fc4bbe2568 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:37 +00:00
d1a407c6b8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:37 +00:00
a210ca3e17 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:36 +00:00
276f4a5aa4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:36 +00:00
56b5e117f1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:35 +00:00
00c5630072 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:35 +00:00
f3a4594386 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:34 +00:00
ed335e5010 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:34 +00:00
cdd5dbb5ea Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:24 +00:00
0e51ca5bce Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:24 +00:00
0f24587641 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:23 +00:00
5b1f74e263 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:23 +00:00
0a2171ae91 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:22 +00:00
09573a7cfc Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:22 +00:00
686c4f2698 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:21 +00:00
9273950afc Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:21 +00:00
add6fe3994 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:20 +00:00
581efc0235 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:20 +00:00
b1d9b4810f Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:19 +00:00
a868059124 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:18 +00:00
2ceb788c2e Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:18 +00:00
3ca93dfc54 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:18 +00:00
e8315b207d Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:17 +00:00
3090536fc7 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:17 +00:00
c5034b43ab Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:16 +00:00
6b4b7939b0 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:16 +00:00
99be7c765a Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:15 +00:00
a018275ebf Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:14 +00:00
fb9777247a Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:14 +00:00
1e8239c7e2 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:13 +00:00
81b127648b Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:13 +00:00
4c5e3f2f28 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:12 +00:00
9fb7d3ff42 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:56 +00:00
ac3093b5dc Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:55 +00:00
975d29fa31 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:55 +00:00
94adb5f348 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:54 +00:00
fba8cc9acd Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:54 +00:00
0fb75fa95f Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:53 +00:00
840c4ac3a9 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:52 +00:00
16613c86a7 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:52 +00:00
0c43591378 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:51 +00:00
9ea6ac8d24 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:51 +00:00
394210c99b Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:50 +00:00
0a7c8c70b0 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:50 +00:00
50cfffdb19 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:49 +00:00
262f2ceef5 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:49 +00:00
5377ca3d57 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:48 +00:00
2fc48951c8 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:48 +00:00
b5308c583c Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:47 +00:00
ffc4690cf5 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:47 +00:00
aace3488c5 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:46 +00:00
9782ca679d Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:46 +00:00
258500d3f7 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:37 +00:00
20a3a2d33d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:37 +00:00
09b6d24303 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:36 +00:00
244569004b Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:36 +00:00
773928cf47 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:35 +00:00
0b60b46a40 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:35 +00:00
4a4797e49d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:34 +00:00
a26a507d31 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:34 +00:00
151578461e Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:33 +00:00
c219e1c5e6 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:33 +00:00
701190a853 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:32 +00:00
4a5d224e26 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:32 +00:00
c948ed897f Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:31 +00:00
9f83c4003a Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:31 +00:00
60ad89af8d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:30 +00:00
f59c3ac6e4 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:30 +00:00
25aae80175 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:29 +00:00
8a784023df Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:29 +00:00
d105b3086e Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:28 +00:00
e68734af4d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:28 +00:00
80aca5c42e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:35 +00:00
91cc351b9f Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:34 +00:00
3727eff0a1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:34 +00:00
98e8f2c77f Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:33 +00:00
d9cc0ef9d3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:33 +00:00
20e5e555f1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:32 +00:00
156a6a6cb6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:32 +00:00
2c57c4598c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:31 +00:00
130678682c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:31 +00:00
ca706b0281 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:30 +00:00
9ff2b454fb Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:30 +00:00
5362042060 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:29 +00:00
59c05047e6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:29 +00:00
dabc32defa Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:28 +00:00
d0ba4497b8 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:28 +00:00
cbdbb2cb4f Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:27 +00:00
8090db41fd Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:27 +00:00
e4b8bf49c6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:26 +00:00
f91e4f7f47 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:26 +00:00
2185ab4d96 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:25 +00:00
8b55326dbd Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:25 +00:00
29de3846b7 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:24 +00:00
781f6703f2 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:24 +00:00
7901b11a6d Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:23 +00:00
136351e574 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:22 +00:00
004fe34221 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:22 +00:00
dc15afe84c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:21 +00:00
298b4baeae Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:21 +00:00
efa72f8d96 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:21 +00:00
d5d8cca96e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:20 +00:00
34676028f9 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:20 +00:00
6639a57225 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:19 +00:00
e084da09e7 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:18 +00:00
8afc6b5c10 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:18 +00:00
28b558e0eb Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:18 +00:00
18d55d8ef9 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:17 +00:00
ded62cb3f1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:17 +00:00
da00ab06c2 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:16 +00:00
4021aeef49 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:15 +00:00
3cf5653f0d Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:15 +00:00
779e44f63a Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:14 +00:00
17f8d7bb98 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:14 +00:00
47e0d157a2 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:13 +00:00
bcfaf764a4 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:13 +00:00
cd38fe180c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:12 +00:00
51b54d0dc6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:12 +00:00
a452163d96 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:11 +00:00
1457492697 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:11 +00:00
c7ce387900 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:10 +00:00
7131dbd052 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:10 +00:00
1a2c8df31e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:09 +00:00
d2d280c2e3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:09 +00:00
7480c912b5 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:08 +00:00
307fb2c8a3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:08 +00:00
85dcab4226 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:07 +00:00
da7bb49726 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:07 +00:00
17c5b9b811 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:06 +00:00
458ca8b40c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:06 +00:00
9bf906a371 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:05 +00:00
b1e7ce7277 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:05 +00:00
0fb461e3df Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:43 +00:00
fdb9083e95 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:42 +00:00
ab645f0fe9 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:42 +00:00
290ce48514 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:41 +00:00
b6c35b9f76 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:41 +00:00
5c90e911b0 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:40 +00:00
b63181ae6b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:39 +00:00
bc72822fe4 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:39 +00:00
29d6e2157c Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:38 +00:00
6b851b5033 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:38 +00:00
cad2a32394 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:38 +00:00
b251ba9709 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:37 +00:00
812fb1ff32 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:36 +00:00
0e299769bb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:36 +00:00
956fed6616 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:35 +00:00
ef982e5d22 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:35 +00:00
fe589090d7 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:34 +00:00
6100570511 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:34 +00:00
c25370304e Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:33 +00:00
203d561a5d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:33 +00:00
987367d1ca Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:32 +00:00
f7523e073f Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:32 +00:00
f42fd8a333 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:31 +00:00
bf39b6c79e Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:30 +00:00
33dbbb5178 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:30 +00:00
db79948886 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:29 +00:00
cf09b40b4a Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:29 +00:00
fbc5aedf35 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:28 +00:00
31c0f1566b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:28 +00:00
16786404e1 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:27 +00:00
050d68c0d1 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:27 +00:00
9f807e8e1d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:26 +00:00
851c2d0239 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:26 +00:00
f9ab417fdf Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:25 +00:00
6702e0714f Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:25 +00:00
fa16558cda Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:24 +00:00
5328e0be5d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:24 +00:00
1bd02406d4 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:23 +00:00
a4c34fb326 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:23 +00:00
80a70b758d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:22 +00:00
0a333efddb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:22 +00:00
a4cf1a2957 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:21 +00:00
59e5709f28 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:21 +00:00
1195eb23b1 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:13 +00:00
69f00977ae Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:12 +00:00
fc8b8b8a9a Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:12 +00:00
07a3160ed5 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:11 +00:00
1496fbfa53 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:11 +00:00
780593c0b6 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:10 +00:00
db891f43ce Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:10 +00:00
3357d9a86b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:09 +00:00
43a7ca4b5e Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:09 +00:00
c764a356ce Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:08 +00:00
4a881b9eaf Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:08 +00:00
76d70ea861 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:07 +00:00
959a04e1cc Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:07 +00:00
bf8fbcc9e3 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:06 +00:00
f9fe46154a Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:06 +00:00
c97921b2ea Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:05 +00:00
95967f2f45 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:05 +00:00
552c05599f Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:04 +00:00
837d110796 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:04 +00:00
fcc7e84300 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:03 +00:00
9080bc85f2 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:03 +00:00
512f1a8f4d Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:02 +00:00
4faa6b9af4 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:02 +00:00
019ee02912 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:01 +00:00
24 changed files with 1821 additions and 0 deletions

View File

@@ -0,0 +1,122 @@
=========================
Cetmix Tower Server Queue
=========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:bcdbf27340bb59ec9a0cf443b108e2d6b27cf7c64466b47585fbd02410ef071b
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-cetmix%2Fcetmix--tower-lightgray.png?logo=github
:target: https://github.com/cetmix/cetmix-tower/tree/16.0/cetmix_tower_server_queue
:alt: cetmix/cetmix-tower
|badge1| |badge2| |badge3|
This module implements asynchronous task execution for `Cetmix
Tower <https://cetmix.com/tower>`__.
It requires the `queue_job <https://github.com/OCA/queue/queue_job>`__
module to be installed and configured in the Odoo instance.
Please refer to the `official
documentation <https://cetmix.com/tower>`__ for detailed information.
**Table of contents**
.. contents::
:local:
Configuration
=============
Please refer to the `official
documentation <https://cetmix.com/tower>`__ for detailed configuration
instructions.
Usage
=====
Please refer to the `official
documentation <https://cetmix.com/tower>`__ for detailed usage
instructions.
Changelog
=========
16.0.2.0.0 (2026-03-23)
-----------------------
- Features: Jets! (4700)
16.0.1.2.0 (2025-11-12)
-----------------------
- Features: Use the 'web_notify' module to send user notifications.
(5074)
16.0.1.1.4 (2025-11-05)
-----------------------
- Bugfixes: Finish multiple commands at once. (5062)
16.0.1.1.3 (2025-10-13)
-----------------------
- Features: Terminate running flight plan manually (3410)
16.0.1.1.0 (2025-07-16)
-----------------------
- Features: cetmix_tower_server_queue: Add async file upload/download
via job queue (3720)
- Features: Terminate command with error if job has failed (4718)
16.0.1.0.2 (2025-05-16)
-----------------------
- Features: 'sudo' parameter is not passed to command. (4678)
16.0.1.0.1 (2025-05-09)
-----------------------
- Bugfixes: Non-critical issues and performance improvements. (4611)
16.0.1.0.0
----------
Release for Odoo 16.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/cetmix/cetmix-tower/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/cetmix/cetmix-tower/issues/new?body=module:%20cetmix_tower_server_queue%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Cetmix
Maintainers
-----------
This module is part of the `cetmix/cetmix-tower <https://github.com/cetmix/cetmix-tower/tree/16.0/cetmix_tower_server_queue>`_ project on GitHub.
You are welcome to contribute.

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,19 @@
# Copyright (C) 2022 Cetmix OÜ
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Cetmix Tower Server Queue",
"summary": "Cetmix Tower asynchronous task execution using 'queue_job'",
"version": "16.0.2.0.0",
"development_status": "Beta",
"category": "Productivity",
"website": "https://tower.cetmix.com",
"author": "Cetmix",
"license": "AGPL-3",
"installable": True,
"auto_install": True,
"depends": ["cetmix_tower_server", "queue_job"],
"data": [
"views/cx_tower_command_log_view.xml",
"views/cx_tower_file_view.xml",
],
}

View File

@@ -0,0 +1,150 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * cetmix_tower_server_queue
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,help:cetmix_tower_server_queue.field_cx_tower_command_log__command_status
msgid ""
"0 if command finished successfully.\n"
"-100 general error,\n"
"-101 not found,\n"
"-201 another instance of this command is running,\n"
"-202 no runner found for the command action,\n"
"-203 Python code execution failed\n"
"-205 plan line condition check failed\n"
"503 if SSH connection error occurred\n"
"601 if queue job failed"
msgstr ""
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_cx_tower_command_log
msgid "Cetmix Tower Command Log"
msgstr ""
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_cx_tower_file
msgid "Cetmix Tower File"
msgstr ""
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_cx_tower_server
msgid "Cetmix Tower Server"
msgstr ""
#. module: cetmix_tower_server_queue
#: model_terms:ir.ui.view,arch_db:cetmix_tower_server_queue.cx_tower_file_view_form
msgid "Error"
msgstr ""
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,field_description:cetmix_tower_server_queue.field_cx_tower_command_log__command_status
msgid "Exit Code"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "Failure"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "File downloaded!"
msgstr ""
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,help:cetmix_tower_server_queue.field_cx_tower_file__is_being_processed
msgid "File is currently being processed"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "File uploaded!"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "File(s) %(name)s download failed: %(error)s"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "File(s) %(name)s upload failed: %(error)s"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "Files downloaded!"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "Files uploaded!"
msgstr ""
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,field_description:cetmix_tower_server_queue.field_cx_tower_file__is_being_processed
msgid "Is Being Processed"
msgstr ""
#. module: cetmix_tower_server_queue
#: model_terms:ir.ui.view,arch_db:cetmix_tower_server_queue.cx_tower_file_view_form
msgid "Processing"
msgstr ""
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_queue_job
#: model:ir.model.fields,field_description:cetmix_tower_server_queue.field_cx_tower_command_log__queue_job_id
msgid "Queue Job"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#: model_terms:ir.ui.view,arch_db:cetmix_tower_server_queue.cx_tower_file_view_form
#, python-format
msgid "Success"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "The following files are already being processed: %(name)s"
msgstr ""
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid ""
"Unable to upload file '%(f)s'.\n"
"Upload operation is not supported for 'server' type files."
msgstr ""

View File

@@ -0,0 +1,148 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * cetmix_tower_server_queue
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,help:cetmix_tower_server_queue.field_cx_tower_command_log__command_status
msgid ""
"0 if command finished successfully.\n"
"-100 general error,\n"
"-101 not found,\n"
"-201 another instance of this command is running,\n"
"-202 no runner found for the command action,\n"
"-203 Python code execution failed\n"
"-205 plan line condition check failed\n"
"503 if SSH connection error occurred\n"
"601 if queue job failed"
msgstr "0 se il comando è stato completato correttamente.-100 errore generale,-101 non trovato,-201 un'altra istanza di questo comando è in esecuzione,-202 nessun runner trovato per l'azione del comando,-203 esecuzione del codice Python non riuscita,-205 controllo delle condizioni della riga del piano non riuscito,503 se si è verificato un errore di connessione SSH,601 se il processo in coda non è riuscito."
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_cx_tower_command_log
msgid "Cetmix Tower Command Log"
msgstr "Registro comando Cetmix Tower"
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_cx_tower_file
msgid "Cetmix Tower File"
msgstr "File Cetmix Tower"
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_cx_tower_server
msgid "Cetmix Tower Server"
msgstr "Server Cetmix Tower"
#. module: cetmix_tower_server_queue
#: model_terms:ir.ui.view,arch_db:cetmix_tower_server_queue.cx_tower_file_view_form
msgid "Error"
msgstr "Errore"
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,field_description:cetmix_tower_server_queue.field_cx_tower_command_log__command_status
msgid "Exit Code"
msgstr "Codice uscita"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "Failure"
msgstr "Fallimento"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "File downloaded!"
msgstr "File scaricato!"
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,help:cetmix_tower_server_queue.field_cx_tower_file__is_being_processed
msgid "File is currently being processed"
msgstr "Il file è in lavorazione"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "File uploaded!"
msgstr "File caricato!"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "Files downloaded!"
msgstr "File scaricati!"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "Files uploaded!"
msgstr "File caricati!"
#. module: cetmix_tower_server_queue
#: model:ir.model.fields,field_description:cetmix_tower_server_queue.field_cx_tower_file__is_being_processed
msgid "Is Being Processed"
msgstr "In lavorazione"
#. module: cetmix_tower_server_queue
#: model_terms:ir.ui.view,arch_db:cetmix_tower_server_queue.cx_tower_file_view_form
msgid "Processing"
msgstr "Lavorazione"
#. module: cetmix_tower_server_queue
#: model:ir.model,name:cetmix_tower_server_queue.model_queue_job
#: model:ir.model.fields,field_description:cetmix_tower_server_queue.field_cx_tower_command_log__queue_job_id
msgid "Queue Job"
msgstr "Accoda lavoro"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#: model_terms:ir.ui.view,arch_db:cetmix_tower_server_queue.cx_tower_file_view_form
#, python-format
msgid "Success"
msgstr "Successo"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid "The following files are already being processed: %(name)s"
msgstr "I seguenti file sono già in fase di elaborazione: %(name)s"
#. module: cetmix_tower_server_queue
#. odoo-python
#: code:addons/cetmix_tower_server_queue/models/cx_tower_file.py:0
#, python-format
msgid ""
"Unable to upload file '%(f)s'.\n"
"Upload operation is not supported for 'server' type files."
msgstr ""
"Impossibile caricare il file '%(f)s'.\n"
"L'operazione di caricamento non è supportata per i file di tipo 'server'."
#~ msgid "Display Name"
#~ msgstr "Nome visualizzato"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Ultima modifica il"

View File

@@ -0,0 +1,4 @@
from . import cx_tower_command_log
from . import cx_tower_server
from . import queue_job
from . import cx_tower_file

View File

@@ -0,0 +1,82 @@
# Copyright (C) 2025 Cetmix OÜ
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo import fields, models, tools
from odoo.addons.cetmix_tower_server.models.constants import (
COMMAND_STOPPED,
COMMAND_TIMED_OUT,
)
from odoo.addons.queue_job.job import CANCELLED
_logger = logging.getLogger(__name__)
class CxTowerCommandLog(models.Model):
_inherit = "cx.tower.command.log"
queue_job_id = fields.Many2one(
"queue.job",
readonly=True,
groups="queue_job.group_queue_job_manager",
)
command_status = fields.Integer(
help="0 if command finished successfully.\n"
"-100 general error,\n"
"-101 not found,\n"
"-201 another instance of this command is running,\n"
"-202 no runner found for the command action,\n"
"-203 Python code execution failed\n"
"-205 plan line condition check failed\n"
"503 if SSH connection error occurred\n"
"601 if queue job failed"
)
def finish(
self, finish_date=None, status=None, response=None, error=None, **kwargs
):
"""Finish the command log
Args:
finish_date (Datetime, optional): Command finish date. Defaults to None.
status (Integer, optional): Command status. Defaults to None.
response (Text, optional): Command response. Defaults to None.
error (Text, optional): Command error. Defaults to None.
"""
# Filter out command logs that are already stopped
command_logs_to_process = self.filtered(
lambda log: log.command_status != COMMAND_STOPPED
)
if not command_logs_to_process:
return
# Avoid finishing the command log multiple times at the same time
try:
with self.env.cr.savepoint(), tools.mute_logger("odoo.sql_db"):
self.env.cr.execute(
f"SELECT command_status FROM {self._table} WHERE id IN %s FOR UPDATE NOWAIT", # noqa: E501
(tuple(command_logs_to_process.ids),),
)
except Exception as e:
_logger.error(
"Could not acquire lock on command logs %s, skipping finish: %s",
command_logs_to_process.ids,
e,
)
return
# Update the related queue job state if the command timed out
if status == COMMAND_TIMED_OUT:
for command_log in command_logs_to_process:
if command_log.queue_job_id:
command_log.queue_job_id.sudo()._change_job_state(
CANCELLED, result=error
)
return super(CxTowerCommandLog, command_logs_to_process).finish(
finish_date, status, response, error, **kwargs
)

View File

@@ -0,0 +1,184 @@
# Copyright (C) 2025 Cetmix OÜ
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo import _, fields, models
from odoo.exceptions import UserError
_logger = logging.getLogger(__name__)
class CxTowerFile(models.Model):
_inherit = "cx.tower.file"
is_being_processed = fields.Boolean(
copy=False,
help="File is currently being processed",
)
def _check_files_being_processed(self, raise_error):
"""
Check if any file in the recordset is being processed.
True if at least one file is already processing and raise_error is False.
False if no files are currently being processed.
The caller uses the boolean to decide whether to continue or abort.
"""
processing_files = self.filtered(lambda rec: rec.is_being_processed)
if processing_files:
if raise_error:
raise UserError(
_(
"The following files are already being processed: %(name)s",
name=", ".join(processing_files.mapped("name")),
)
)
else:
return True
return False
def upload(self, raise_error=False):
"""
Trigger asynchronous upload via job queue.
"""
# Check if the file is already being processed
if self._check_files_being_processed(raise_error):
return
self.write({"server_response": False, "is_being_processed": True})
# Enqueue the upload if not already in a queue job;
# otherwise, execute immediately
if not self.env.context.get("job_uuid"):
self.with_delay()._do_upload(raise_error=raise_error)
else:
self._do_upload(raise_error=raise_error)
def download(self, raise_error=False):
"""
Trigger asynchronous download via job queue.
"""
# Check if the file is already being processed
if self._check_files_being_processed(raise_error):
return
self.write({"server_response": False, "is_being_processed": True})
# Enqueue the download if not already in a queue job;
# otherwise, execute immediately
if not self.env.context.get("job_uuid"):
self.with_delay()._do_download(raise_error=raise_error)
else:
self._do_download(raise_error=raise_error)
def _do_upload(self, raise_error=True):
"""
Uploads the files within a job context and notifies the user on success.
Logs the error if an exception occurs;
failure state is managed by the parent method.
"""
try:
with self.env.cr.savepoint():
result = super().upload(raise_error=raise_error)
single_msg = _("File uploaded!")
plural_msg = _("Files uploaded!")
self.env.user.notify_success(
message=single_msg if len(self) == 1 else plural_msg,
title=_("Success"),
# This notification should not be sticky
# to avoid blocking the user's screen
sticky=False,
)
return result
except Exception as e:
if not raise_error:
self.env.user.notify_danger(
message=_(
"File(s) %(name)s upload failed: %(error)s",
name=", ".join(self.mapped("name")),
error=str(e),
),
title=_("Failure"),
sticky=self.env["ir.config_parameter"]
.sudo()
.get_param("cetmix_tower_server.notification_type_error", "sticky")
== "sticky",
)
_logger.error("File %s upload failed: %s", str(self), str(e))
else:
raise
finally:
self.write({"is_being_processed": False})
def _do_download(self, raise_error=True):
"""
Downloads the files within a job context and notifies the user on success.
Logs the error if an exception occurs;
failure state is managed by the parent method.
"""
try:
with self.env.cr.savepoint():
result = super().download(raise_error=raise_error)
single_msg = _("File downloaded!")
plural_msg = _("Files downloaded!")
self.env.user.notify_success(
message=single_msg if len(self) == 1 else plural_msg,
title=_("Success"),
# This notification should not be sticky
# to avoid blocking the user's screen
sticky=False,
)
return result
except Exception as e:
if not raise_error:
self.env.user.notify_danger(
message=_(
"File(s) %(name)s download failed: %(error)s",
name=", ".join(self.mapped("name")),
error=str(e),
),
title=_("Failure"),
sticky=self.env["ir.config_parameter"]
.sudo()
.get_param("cetmix_tower_server.notification_type_error", "sticky")
== "sticky",
)
_logger.error("File %s download failed: %s", str(self), str(e))
else:
raise
finally:
self.write({"is_being_processed": False})
def action_pull_from_server(self):
"""
Pull file from server without notification.
"""
tower_files = self.filtered(lambda file_: file_.source == "tower")
server_files = self - tower_files
tower_files.action_get_current_server_code()
server_files.download(raise_error=False)
def action_push_to_server(self):
"""
Push the file to server without success notification.
"""
server_files = self.filtered(lambda file_: file_.source == "server")
if server_files:
return {
"type": "ir.actions.client",
"tag": "display_notification",
"params": {
"title": _("Failure"),
"message": _(
"Unable to upload file '%(f)s'.\n"
"Upload operation is not supported for 'server' type files.",
f=", ".join(server_files.mapped("rendered_name")),
),
"sticky": False,
},
}
self.upload(raise_error=False)

View File

@@ -0,0 +1,86 @@
# Copyright (C) 2022 Cetmix OÜ
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class CxTowerServer(models.Model):
_inherit = "cx.tower.server"
def _command_runner_wrapper(
self,
command,
log_record,
rendered_command_code,
sudo=None,
rendered_command_path=None,
ssh_connection=None,
**kwargs,
):
# If the flight plan log has an entry on the parent flight plan log,
# it means that this flight plan was launched from another plan,
# this plan should be launched as a synchronous command to
# preserve the order of execution of commands with actions
# "Run Flight Plan", "Trigger Jet Action" and "Create Waypoint".
# Use runner only if command log record is provided.
if (
log_record
and not log_record.plan_log_id.parent_flight_plan_log_id
and command.action
not in [
"jet_action",
"create_waypoint",
]
):
job = self.with_delay()._queue_command_runner_wrapper(
command=command,
log_record=log_record,
rendered_command_code=rendered_command_code,
sudo=sudo,
rendered_command_path=rendered_command_path,
ssh_connection=ssh_connection,
**kwargs,
)
log_record.sudo().queue_job_id = job.db_record().id
# Otherwise fallback to `super` to return the command output
else:
return super()._command_runner_wrapper(
command=command,
log_record=log_record,
rendered_command_code=rendered_command_code,
sudo=sudo,
rendered_command_path=rendered_command_path,
ssh_connection=ssh_connection,
**kwargs,
)
def _queue_command_runner_wrapper(
self,
command,
log_record,
rendered_command_code,
sudo=None,
rendered_command_path=None,
ssh_connection=None,
**kwargs,
):
# avoid executing command if plan was stopped
log_record.invalidate_recordset(["plan_log_id"])
plan_log_id = log_record.plan_log_id
if plan_log_id:
plan_log_id.invalidate_recordset(["is_stopped"])
# If plan was stopped, stop the command
if plan_log_id.is_stopped:
log_record.stop()
return
return self._command_runner(
command=command,
log_record=log_record,
rendered_command_code=rendered_command_code,
sudo=sudo,
rendered_command_path=rendered_command_path,
ssh_connection=ssh_connection,
**kwargs,
)

View File

@@ -0,0 +1,23 @@
# Copyright 2013-2020 Camptocamp SA
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
from odoo import models
class QueueJob(models.Model):
_inherit = "queue.job"
QUEUE_JOB_ERROR = 601
def write(self, vals):
"""
Override write method to update command status
and write error information in the log record
"""
if vals.get("state") == "failed":
log_record = self.kwargs.get("log_record")
if log_record:
log_record.finish(
status=self.QUEUE_JOB_ERROR,
error=vals.get("exc_info"),
)
return super().write(vals)

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1 @@
Please refer to the [official documentation](https://cetmix.com/tower) for detailed configuration instructions.

View File

@@ -0,0 +1,5 @@
This module implements asynchronous task execution for [Cetmix Tower](https://cetmix.com/tower).
It requires the [queue_job](https://github.com/OCA/queue/queue_job) module to be installed and configured in the Odoo instance.
Please refer to the [official documentation](https://cetmix.com/tower) for detailed information.

View File

@@ -0,0 +1,39 @@
## 16.0.2.0.0 (2026-03-23)
- Features: Jets! (4700)
## 16.0.1.2.0 (2025-11-12)
- Features: Use the 'web_notify' module to send user notifications. (5074)
## 16.0.1.1.4 (2025-11-05)
- Bugfixes: Finish multiple commands at once. (5062)
## 16.0.1.1.3 (2025-10-13)
- Features: Terminate running flight plan manually (3410)
## 16.0.1.1.0 (2025-07-16)
- Features: cetmix_tower_server_queue: Add async file upload/download via job queue (3720)
- Features: Terminate command with error if job has failed (4718)
## 16.0.1.0.2 (2025-05-16)
- Features: 'sudo' parameter is not passed to command. (4678)
## 16.0.1.0.1 (2025-05-09)
- Bugfixes: Non-critical issues and performance improvements. (4611)
## 16.0.1.0.0
Release for Odoo 16.0

View File

@@ -0,0 +1 @@
Please refer to the [official documentation](https://cetmix.com/tower) for detailed usage instructions.

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,491 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Cetmix Tower Server Queue</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="cetmix-tower-server-queue">
<h1 class="title">Cetmix Tower Server Queue</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:bcdbf27340bb59ec9a0cf443b108e2d6b27cf7c64466b47585fbd02410ef071b
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/cetmix/cetmix-tower/tree/16.0/cetmix_tower_server_queue"><img alt="cetmix/cetmix-tower" src="https://img.shields.io/badge/github-cetmix%2Fcetmix--tower-lightgray.png?logo=github" /></a></p>
<p>This module implements asynchronous task execution for <a class="reference external" href="https://cetmix.com/tower">Cetmix
Tower</a>.</p>
<p>It requires the <a class="reference external" href="https://github.com/OCA/queue/queue_job">queue_job</a>
module to be installed and configured in the Odoo instance.</p>
<p>Please refer to the <a class="reference external" href="https://cetmix.com/tower">official
documentation</a> for detailed information.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#changelog" id="toc-entry-3">Changelog</a><ul>
<li><a class="reference internal" href="#section-1" id="toc-entry-4">16.0.2.0.0 (2026-03-23)</a></li>
<li><a class="reference internal" href="#section-2" id="toc-entry-5">16.0.1.2.0 (2025-11-12)</a></li>
<li><a class="reference internal" href="#section-3" id="toc-entry-6">16.0.1.1.4 (2025-11-05)</a></li>
<li><a class="reference internal" href="#section-4" id="toc-entry-7">16.0.1.1.3 (2025-10-13)</a></li>
<li><a class="reference internal" href="#section-5" id="toc-entry-8">16.0.1.1.0 (2025-07-16)</a></li>
<li><a class="reference internal" href="#section-6" id="toc-entry-9">16.0.1.0.2 (2025-05-16)</a></li>
<li><a class="reference internal" href="#section-7" id="toc-entry-10">16.0.1.0.1 (2025-05-09)</a></li>
<li><a class="reference internal" href="#section-8" id="toc-entry-11">16.0.1.0.0</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-12">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-13">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-14">Authors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-15">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>Please refer to the <a class="reference external" href="https://cetmix.com/tower">official
documentation</a> for detailed configuration
instructions.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>Please refer to the <a class="reference external" href="https://cetmix.com/tower">official
documentation</a> for detailed usage
instructions.</p>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#toc-entry-3">Changelog</a></h1>
<div class="section" id="section-1">
<h2><a class="toc-backref" href="#toc-entry-4">16.0.2.0.0 (2026-03-23)</a></h2>
<ul class="simple">
<li>Features: Jets! (4700)</li>
</ul>
</div>
<div class="section" id="section-2">
<h2><a class="toc-backref" href="#toc-entry-5">16.0.1.2.0 (2025-11-12)</a></h2>
<ul class="simple">
<li>Features: Use the web_notify module to send user notifications.
(5074)</li>
</ul>
</div>
<div class="section" id="section-3">
<h2><a class="toc-backref" href="#toc-entry-6">16.0.1.1.4 (2025-11-05)</a></h2>
<ul class="simple">
<li>Bugfixes: Finish multiple commands at once. (5062)</li>
</ul>
</div>
<div class="section" id="section-4">
<h2><a class="toc-backref" href="#toc-entry-7">16.0.1.1.3 (2025-10-13)</a></h2>
<ul class="simple">
<li>Features: Terminate running flight plan manually (3410)</li>
</ul>
</div>
<div class="section" id="section-5">
<h2><a class="toc-backref" href="#toc-entry-8">16.0.1.1.0 (2025-07-16)</a></h2>
<ul class="simple">
<li>Features: cetmix_tower_server_queue: Add async file upload/download
via job queue (3720)</li>
<li>Features: Terminate command with error if job has failed (4718)</li>
</ul>
</div>
<div class="section" id="section-6">
<h2><a class="toc-backref" href="#toc-entry-9">16.0.1.0.2 (2025-05-16)</a></h2>
<ul class="simple">
<li>Features: sudo parameter is not passed to command. (4678)</li>
</ul>
</div>
<div class="section" id="section-7">
<h2><a class="toc-backref" href="#toc-entry-10">16.0.1.0.1 (2025-05-09)</a></h2>
<ul class="simple">
<li>Bugfixes: Non-critical issues and performance improvements. (4611)</li>
</ul>
</div>
<div class="section" id="section-8">
<h2><a class="toc-backref" href="#toc-entry-11">16.0.1.0.0</a></h2>
<p>Release for Odoo 16.0</p>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-12">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/cetmix/cetmix-tower/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/cetmix/cetmix-tower/issues/new?body=module:%20cetmix_tower_server_queue%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-13">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-14">Authors</a></h2>
<ul class="simple">
<li>Cetmix</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-15">Maintainers</a></h2>
<p>This module is part of the <a class="reference external" href="https://github.com/cetmix/cetmix-tower/tree/16.0/cetmix_tower_server_queue">cetmix/cetmix-tower</a> project on GitHub.</p>
<p>You are welcome to contribute.</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,3 @@
from . import test_command
from . import test_command_log
from . import test_file

View File

@@ -0,0 +1,145 @@
from datetime import timedelta
from unittest.mock import patch
from odoo.fields import Datetime
from odoo.tools import mute_logger
from odoo.addons.cetmix_tower_server.tests.common import TestTowerCommon
class TestTowerCommand(TestTowerCommon):
"""Test suite for verifying zombie command detection and related
queue job cancellation.
Tests in this class verify that commands which have been running
longer than the timeout are properly detected as zombies, and their
associated queue jobs are cancelled.
"""
@classmethod
def setUpClass(cls):
super().setUpClass()
# Set command timeout to 10 seconds
cls.env["ir.config_parameter"].sudo().set_param(
"cetmix_tower_server.command_timeout", "10"
)
# Set old time to 20 seconds ago (older than timeout)
# to simulate running command in past
now = Datetime.now()
cls.old_time = now - timedelta(seconds=20)
def _patch_command_runner(self, command_type, runner_method):
"""Helper to patch a command runner to simulate a zombie command.
Args:
command_type: Type of command runner to patch ('ssh' or 'python_code')
runner_method: Original method to wrap
Returns:
A context manager that applies the patch
"""
def _wrapper(*args, **kwargs):
# Modify args to disable log record finishing
args = list(args)
if len(args) > 1:
args[1] = False # Set log_record to False
return runner_method(*args, **kwargs)
return patch.object(
self.registry["cx.tower.server"],
f"_command_runner_{command_type}",
_wrapper,
)
def _verify_zombie_command_job_cancellation(self, command_action):
"""Verify zombie command is detected and job is cancelled.
Args:
command_action: Action type ('ssh_command' or 'python_code')
"""
# check zombie command logs
domain = [
("is_running", "=", True),
("start_date", "=", self.old_time),
("command_action", "=", command_action),
]
zombie_command_logs = self.env["cx.tower.command.log"].search(domain)
self.assertEqual(
len(zombie_command_logs), 1, "Zombie command log should be created"
)
self.assertTrue(
zombie_command_logs.queue_job_id,
"Zombie command log should have queue job",
)
job = zombie_command_logs.queue_job_id
self.assertTrue(job.exists(), "Zombie command job should exist")
self.assertEqual(job.state, "pending", "Zombie command job should be pending")
# run process to kill zombie command
self.server_test_1._check_zombie_commands()
# check that command log is cancelled
self.assertEqual(
job.state, "cancelled", "Zombie command job should be cancelled"
)
def test_check_zombie_ssh_command_queue(self):
"""
Test that zombie ssh command is killed and job is cancelled
"""
# Create test commands
ssh_command = self.Command.create(
{
"name": "Test SSH Command",
"code": "ls -la",
"action": "ssh_command",
}
)
# patch command runner to not finish log record
cx_tower_server_obj = self.registry["cx.tower.server"]
_command_runner_ssh_super = cx_tower_server_obj._command_runner_ssh
with self._patch_command_runner("ssh", _command_runner_ssh_super):
# run zombie command with log creation in past
self.server_test_1.run_command(
ssh_command, log={"start_date": self.old_time}
)
# check zombie command logs
self._verify_zombie_command_job_cancellation("ssh_command")
@mute_logger("py.warnings")
def test_check_zombie_python_command_queue(self):
"""
Test that zombie python command is killed and job is cancelled
"""
# Create test commands
python_command = self.Command.create(
{
"name": "Test Python Command",
"code": "print('test')",
"action": "python_code",
}
)
# patch command runner to not finish log record
cx_tower_server_obj = self.registry["cx.tower.server"]
_command_runner_python_code_super = (
cx_tower_server_obj._command_runner_python_code
)
with self._patch_command_runner(
"python_code", _command_runner_python_code_super
):
# run zombie command with log creation in past
self.server_test_1.run_command(
python_command, log={"start_date": self.old_time}
)
# check zombie command logs
self._verify_zombie_command_job_cancellation("python_code")

View File

@@ -0,0 +1,37 @@
from odoo.addons.cetmix_tower_server.tests.common import TestTowerCommon
from odoo.addons.queue_job.job import Job
class TestTowerCommand(TestTowerCommon):
"""
Test cases for command log state on queue_job failure
"""
def test_command_log_state_on_job_fail(self):
command = self.env["cx.tower.command"].create(
{
"name": "Test Command",
"action": "ssh_command",
"code": "echo 'Hello World'",
}
)
self.assertTrue(command.id, "Command should be created successfully")
self.server_test_1.run_command(command=command)
command_log = self.env["cx.tower.command.log"].search(
[("command_id", "=", command.id)], order="id desc", limit=1
)
self.assertTrue(command_log, "Command log should be created")
job = command_log.queue_job_id
self.assertTrue(job, "Queue job should be associated with command log")
job_obj = Job.load(self.env, job.uuid)
job_obj.set_failed()
job_obj.store()
self.assertEqual(job.state, "failed", "Job should be in failed state")
self.assertEqual(
command_log.command_status,
self.env["queue.job"].QUEUE_JOB_ERROR,
"Command log should be in failed state",
)

View File

@@ -0,0 +1,201 @@
from odoo import exceptions
from odoo.addons.cetmix_tower_server.tests.common import TestTowerCommon
from odoo.addons.queue_job.tests.common import trap_jobs
class TestCxTowerFileQueue(TestTowerCommon):
def setUp(self):
super().setUp()
self.file_template = self.FileTemplate.create(
{
"name": "Test",
"file_name": "test.txt",
"server_dir": "/var/tmp",
"code": "Hello, world!",
}
)
def test_async_upload_operations(self):
"""Test that upload operations are processed asynchronously"""
# Create unique files specifically for this test
upload_file = self.File.create(
{
"source": "tower",
"template_id": self.file_template.id,
"server_id": self.server_test_1.id,
"name": "upload_test_1",
"auto_sync": False,
}
)
upload_file_2 = self.File.create(
{
"name": "upload_test_2",
"source": "server",
"server_id": self.server_test_1.id,
"server_dir": "/var/tmp",
"auto_sync": False,
}
)
with trap_jobs() as trap:
upload_file.upload()
upload_file_2.upload()
self.assertEqual(len(trap.enqueued_jobs), 2)
upload_file.write({"server_response": "ok", "is_being_processed": False})
upload_file_2.write({"server_response": "ok", "is_being_processed": False})
# Refresh records to get updated values
upload_file.invalidate_recordset()
upload_file_2.invalidate_recordset()
# Verify the expected state
self.assertEqual(upload_file.server_response, "ok")
self.assertFalse(upload_file.is_being_processed)
self.assertEqual(upload_file_2.server_response, "ok")
self.assertFalse(upload_file_2.is_being_processed)
def test_async_download_operations(self):
"""Test that download operations are processed asynchronously"""
# Create unique files specifically for this test
download_file = self.File.create(
{
"source": "tower",
"template_id": self.file_template.id,
"server_id": self.server_test_1.id,
"name": "download_test_1",
"auto_sync": False,
}
)
download_file_2 = self.File.create(
{
"name": "download_test_2",
"source": "server",
"server_id": self.server_test_1.id,
"server_dir": "/var/tmp",
"auto_sync": False,
}
)
with trap_jobs() as trap:
download_file.download()
download_file_2.download()
# Verify jobs were created
self.assertEqual(len(trap.enqueued_jobs), 2)
download_file.write({"server_response": "ok", "is_being_processed": False})
download_file_2.write(
{"server_response": "ok", "is_being_processed": False}
)
# Refresh records to get updated values
download_file.invalidate_recordset()
download_file_2.invalidate_recordset()
# Verify the expected state
self.assertEqual(download_file.server_response, "ok")
self.assertFalse(download_file.is_being_processed)
self.assertEqual(download_file_2.server_response, "ok")
self.assertFalse(download_file_2.is_being_processed)
def test_upload_error_handling(self):
"""Test error handling in async upload operations"""
error_file = self.File.create(
{
"source": "tower",
"template_id": self.file_template.id,
"server_id": self.server_test_1.id,
"name": "error_handling_test",
"auto_sync": False,
}
)
# Set context to force the mock in ssh_upload_file to raise error
error_context = {"raise_upload_error": "Forced upload error"}
with trap_jobs() as trap:
# This will trigger job creation but the job would fail if executed
error_file.with_context(**error_context).upload(raise_error=True)
# Verify job was created
self.assertEqual(len(trap.enqueued_jobs), 1)
# Simulate what would happen if the job executed and failed
error_file.write({"server_response": "error", "is_being_processed": False})
error_file.invalidate_recordset()
self.assertEqual(error_file.server_response, "error")
self.assertFalse(error_file.is_being_processed)
def test_download_error_handling(self):
"""Test error handling in async download operations"""
error_file = self.File.create(
{
"source": "server",
"server_id": self.server_test_1.id,
"server_dir": "/var/tmp",
"name": "download_error_test",
}
)
# Set context to force the mock in ssh_download_file to raise error
error_context = {"raise_download_error": "Forced download error"}
with trap_jobs() as trap:
# This will trigger job creation but the job would fail if executed
error_file.with_context(**error_context).download(raise_error=True)
# Verify job was created
self.assertEqual(len(trap.enqueued_jobs), 1)
# Simulate what would happen if the job executed and failed
error_file.write({"server_response": "error", "is_being_processed": False})
error_file.invalidate_recordset()
self.assertEqual(error_file.server_response, "error")
self.assertFalse(error_file.is_being_processed)
def test_already_processing_check(self):
"""Test that files being processed cannot be processed again"""
processing_file = self.File.create(
{
"source": "tower",
"template_id": self.file_template.id,
"server_id": self.server_test_1.id,
"name": "processing_test_file",
"is_being_processed": True,
}
)
self.assertTrue(processing_file.is_being_processed)
# Test with raising error
with self.assertRaises(exceptions.UserError):
processing_file.upload(raise_error=True)
# Test without raising error - should not create job
with trap_jobs() as trap:
processing_file.upload(raise_error=False)
# No job should be created since file is already being processed
self.assertEqual(len(trap.enqueued_jobs), 0)
# Verify still marked as processing
self.assertTrue(processing_file.is_being_processed)
# Same tests for download
with self.assertRaises(exceptions.UserError):
processing_file.download(raise_error=True)
with trap_jobs() as trap:
processing_file.download(raise_error=False)
# No job should be created
self.assertEqual(len(trap.enqueued_jobs), 0)
self.assertTrue(processing_file.is_being_processed)

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="cx_tower_command_log_view_form" model="ir.ui.view">
<field name="name">cx.tower.command.log.view.form</field>
<field name="model">cx.tower.command.log</field>
<field
name="inherit_id"
ref="cetmix_tower_server.cx_tower_command_log_view_form"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='command_id']" position="after">
<field
name="queue_job_id"
attrs="{'invisible': [('queue_job_id', '=', False)]}"
/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="cx_tower_file_view_form" model="ir.ui.view">
<field name="name">cx.tower.file.view.form</field>
<field name="model">cx.tower.file</field>
<field name="inherit_id" ref="cetmix_tower_server.cx_tower_file_view_form" />
<field name="arch" type="xml">
<xpath expr="//form/sheet/group" position="before">
<field name="is_being_processed" invisible="1" />
<field name="server_response" invisible="1" />
<widget
name="web_ribbon"
title="Processing"
bg_color="bg-info"
attrs="{'invisible': [('is_being_processed', '=', False)]}"
/>
<widget
name="web_ribbon"
title="Success"
bg_color="bg-success"
attrs="{'invisible': ['|', ('is_being_processed', '=', True), ('server_response', '!=', 'ok')]}"
/>
<widget
name="web_ribbon"
title="Error"
bg_color="bg-danger"
attrs="{'invisible': ['|', ('is_being_processed', '=', True), ('server_response', 'in', ('ok', False))]}"
/>
</xpath>
</field>
</record>
<record id="cx_tower_queue_file_view_tree" model="ir.ui.view">
<field name="name">cx.tower.queue.file.view.tree</field>
<field name="model">cx.tower.file</field>
<field name="inherit_id" ref="cetmix_tower_server.cx_tower_file_view_tree" />
<field name="arch" type="xml">
<xpath expr="//tree" position="inside">
<field name="is_being_processed" invisible="1" />
<field name="server_response" invisible="1" />
</xpath>
<xpath expr="//tree" position="attributes">
<attribute name="decoration-info">
is_being_processed == True
</attribute>
<attribute name="decoration-success">
is_being_processed != True and server_response == 'ok'
</attribute>
<attribute name="decoration-danger">
is_being_processed != True and server_response not in ('ok', False)
</attribute>
</xpath>
</field>
</record>
</odoo>