182 Commits

Author SHA1 Message Date
3d163ae362 Update Rust crate serde to 1.0.225
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-20 00:43:17 +00:00
23f21b3a40 Merge pull request 'Update dependency @mui/x-data-grid to ^8.11.3' (#425) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-19 00:41:00 +00:00
9433695222 Merge pull request 'Update dependency @fontsource/roboto to ^5.2.8' (#424) from renovate/fontsource-roboto-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-19 00:40:53 +00:00
c957de60db Update dependency @mui/x-data-grid to ^8.11.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-18 00:42:10 +00:00
d105cb7255 Update dependency @fontsource/roboto to ^5.2.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-18 00:42:08 +00:00
1af7e5ec55 Merge pull request 'Update Rust crate serde_json to 1.0.145' (#423) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-17 00:41:38 +00:00
7e539f0e4a Merge pull request 'Update dependency @fontsource/roboto to ^5.2.7' (#422) from renovate/fontsource-roboto-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-17 00:41:33 +00:00
c47ebc0504 Update Rust crate serde_json to 1.0.145
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-16 00:41:42 +00:00
29118fb7cd Update dependency @fontsource/roboto to ^5.2.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-16 00:41:35 +00:00
0ec546fa63 Merge pull request 'Update dependency typescript-eslint to ^8.43.0' (#421) from renovate/typescript-eslint-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-15 00:41:43 +00:00
4861b97bf8 Update dependency typescript-eslint to ^8.43.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-14 00:42:24 +00:00
bc8093faf1 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.53.1' (#420) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-13 00:42:40 +00:00
97933d72f9 Update dependency eslint-plugin-react-dom to ^1.53.1
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-13 00:42:36 +00:00
554edbf84c Merge pull request 'Update dependency @types/react to ^19.1.13' (#419) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-13 00:42:23 +00:00
650a97c836 Update dependency @types/react to ^19.1.13
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-13 00:42:20 +00:00
ff24b10507 Merge pull request 'Update dependency eslint to ^9.35.0' (#418) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-12 00:41:38 +00:00
7cbd5a5bbf Update dependency eslint to ^9.35.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-12 00:41:37 +00:00
f55cff054c Merge pull request 'Update dependency @mui/x-data-grid to ^8.11.2' (#417) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-12 00:41:35 +00:00
a6dd100eb6 Update dependency @mui/x-data-grid to ^8.11.2
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-12 00:41:32 +00:00
8b4b17083d Merge pull request 'Update Rust crate virt to 0.4.3' (#416) from renovate/virt-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-11 00:40:05 +00:00
7dafca91d4 Merge pull request 'Update Rust crate chrono to 0.4.42' (#415) from renovate/chrono-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-11 00:40:04 +00:00
8dfc166033 Update Rust crate virt to 0.4.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-10 00:40:23 +00:00
6f70ddef8c Update Rust crate chrono to 0.4.42
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-10 00:40:20 +00:00
809e3c9d4e Merge pull request 'Update dependency vite to ^6.3.6' (#414) from renovate/vite-6.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-09 00:40:41 +00:00
e6a86b0097 Update dependency vite to ^6.3.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-09 00:40:30 +00:00
c12f916a94 Merge pull request 'Update dependency @eslint/js to ^9.35.0' (#413) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-08 00:41:31 +00:00
2c9a2e1ac0 Update dependency @eslint/js to ^9.35.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-08 00:41:28 +00:00
99b25fb97e Merge pull request 'Update Rust crate log to 0.4.28' (#412) from renovate/log-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-07 00:41:37 +00:00
ab5f9e1105 Merge pull request 'Update Rust crate image to 0.25.8' (#411) from renovate/image-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-07 00:41:37 +00:00
a867fa311d Update Rust crate log to 0.4.28
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-06 00:41:33 +00:00
5461968282 Update Rust crate image to 0.25.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-06 00:41:31 +00:00
a5af85057f Merge pull request 'Update Rust crate clap to 4.5.47' (#410) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-05 00:27:14 +00:00
79c349ff66 Merge pull request 'Update Rust crate actix-http to 3.11.1' (#409) from renovate/actix-http-3.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-05 00:27:13 +00:00
ced0e4517d Update Rust crate clap to 4.5.47
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-04 00:34:38 +00:00
d0c9c01d63 Update Rust crate actix-http to 3.11.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-04 00:34:36 +00:00
04400ec31e Merge pull request 'Update Rust crate quick-xml to 0.38.3' (#408) from renovate/quick-xml-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-03 00:33:16 +00:00
85785d3568 Merge pull request 'Update Rust crate actix-files to 0.6.7' (#407) from renovate/actix-files-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-03 00:33:13 +00:00
8c5814307b Update Rust crate quick-xml to 0.38.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-02 00:33:20 +00:00
e2d4b1e3b1 Update Rust crate actix-files to 0.6.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-02 00:33:17 +00:00
550e094efe Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.9' (#406) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-01 00:32:07 +00:00
94533e7e71 Update dependency eslint-plugin-react-x to ^1.52.9
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-01 00:32:02 +00:00
5cb9bbbc89 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.9' (#405) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-31 00:32:45 +00:00
f7da80f4c0 Update dependency eslint-plugin-react-dom to ^1.52.9
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-31 00:32:42 +00:00
64d095ec5e Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.8' (#404) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-30 00:31:47 +00:00
5c6caf150e Update dependency eslint-plugin-react-dom to ^1.52.8
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-30 00:31:43 +00:00
43c09bb0ff Merge pull request 'Update dependency @types/react-dom to ^19.1.9' (#403) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-29 00:33:21 +00:00
93dbad2f41 Update dependency @types/react-dom to ^19.1.9
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-29 00:33:20 +00:00
a1e23efd99 Fix cargo clippy issues
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-28 08:05:22 +02:00
cd4b8af445 Merge pull request 'Update dependency @types/react to ^19.1.12' (#402) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-28 00:33:29 +00:00
3c2470e942 Update dependency @types/react to ^19.1.12
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-28 00:33:26 +00:00
de3a1aab1b Merge pull request 'Update dependency @types/react-dom to ^19.1.8' (#401) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-27 00:33:15 +00:00
0149f93721 Update dependency @types/react-dom to ^19.1.8
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-27 00:33:12 +00:00
8daba3e92f Merge pull request 'Update dependency react-syntax-highlighter to ^15.6.6' (#400) from renovate/react-syntax-highlighter-15.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-26 00:31:59 +00:00
8127bfbdbf Update dependency react-syntax-highlighter to ^15.6.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-26 00:31:55 +00:00
7cb9a97025 Merge pull request 'Update Rust crate url to 2.5.7' (#399) from renovate/url-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-25 00:31:48 +00:00
a2fa115e38 Merge pull request 'Update Rust crate thiserror to 2.0.16' (#398) from renovate/thiserror-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-25 00:31:45 +00:00
b8be645121 Update Rust crate url to 2.5.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-24 00:31:39 +00:00
456ffbe062 Update Rust crate thiserror to 2.0.16
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-24 00:31:37 +00:00
5cdd8ba0c5 Merge pull request 'Update dependency @types/react to ^19.1.11' (#397) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-23 00:32:42 +00:00
1e2d499794 Update dependency @types/react to ^19.1.11
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-23 00:32:39 +00:00
144c9af8c7 Merge pull request 'Update dependency react-syntax-highlighter to ^15.6.3' (#396) from renovate/react-syntax-highlighter-15.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-22 00:32:09 +00:00
b7d56880ff Update dependency react-syntax-highlighter to ^15.6.3
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-22 00:32:05 +00:00
20d55be54f Merge pull request 'Update Rust crate serde_json to 1.0.143' (#395) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-21 00:32:49 +00:00
920ee5d636 Merge pull request 'Update Rust crate quick-xml to 0.38.2' (#394) from renovate/quick-xml-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-21 00:32:46 +00:00
1cb4700ac1 Update Rust crate serde_json to 1.0.143
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-20 00:32:16 +00:00
46de03bcc4 Update Rust crate quick-xml to 0.38.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-20 00:32:13 +00:00
8b96d4f0ab Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.6' (#393) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-19 00:32:29 +00:00
48042e2b59 Update dependency eslint-plugin-react-x to ^1.52.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-19 00:32:26 +00:00
b2d6f92d47 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.6' (#392) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-19 00:32:23 +00:00
063a7fc830 Update dependency eslint-plugin-react-dom to ^1.52.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-19 00:32:21 +00:00
0c12822567 Merge pull request 'Update Rust crate thiserror to 2.0.15' (#391) from renovate/thiserror-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-18 00:31:11 +00:00
38f0ac840b Merge pull request 'Update Rust crate reqwest to 0.12.23' (#390) from renovate/reqwest-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-18 00:31:11 +00:00
8db4fd740d Update Rust crate thiserror to 2.0.15
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-17 00:32:46 +00:00
456ab796b3 Update Rust crate reqwest to 0.12.23
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-17 00:32:43 +00:00
2fbc5b04a3 Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.5' (#389) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-16 00:31:14 +00:00
5c2aa39196 Update dependency eslint-plugin-react-x to ^1.52.5
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-16 00:31:13 +00:00
513bda8fe7 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.5' (#388) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-16 00:31:11 +00:00
48b4e4bb2f Update dependency eslint-plugin-react-dom to ^1.52.5
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-16 00:31:06 +00:00
e7cb217e5f Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.4' (#387) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-15 00:32:50 +00:00
a672645225 Update dependency eslint-plugin-react-x to ^1.52.4
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-15 00:32:47 +00:00
3428b5b457 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.4' (#386) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-15 00:32:45 +00:00
15eabf7c66 Update dependency eslint-plugin-react-dom to ^1.52.4
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-15 00:32:43 +00:00
8df6b549ac Merge pull request 'Update Rust crate clap to 4.5.45' (#385) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-14 00:32:20 +00:00
39a896ea20 Merge pull request 'Update Rust crate anyhow to 1.0.99' (#384) from renovate/anyhow-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-14 00:32:19 +00:00
acc6c680d4 Update Rust crate clap to 4.5.45
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-13 00:32:59 +00:00
3fd9f7cff8 Update Rust crate anyhow to 1.0.99
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-13 00:32:57 +00:00
a672329501 Merge pull request 'Update dependency @types/react to ^19.1.10' (#383) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-12 00:32:02 +00:00
5f119688a3 Update dependency @types/react to ^19.1.10
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-12 00:31:58 +00:00
dbf7cc7cac Merge pull request 'Update materialui to ^7.3.1' (#382) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-11 00:32:19 +00:00
6198a8284e Update materialui to ^7.3.1
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-11 00:32:16 +00:00
f0547dd9cc Merge pull request 'Update dependency eslint to ^9.33.0' (#381) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-10 00:31:14 +00:00
fbc2b6fe2a Update dependency eslint to ^9.33.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-10 00:31:11 +00:00
2e3059dad6 Merge pull request 'Update dependency @mui/x-data-grid to ^8.10.0' (#380) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-09 00:31:50 +00:00
c00668f174 Update dependency @mui/x-data-grid to ^8.10.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-09 00:31:48 +00:00
55b74becdc Merge pull request 'Update dependency @eslint/js to ^9.33.0' (#379) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-09 00:31:41 +00:00
d2ca41c59d Update dependency @eslint/js to ^9.33.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-09 00:31:38 +00:00
4df1f413a4 Merge pull request 'Update dependency @types/jest to v30' (#378) from renovate/major-jest-monorepo into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-08 00:19:57 +00:00
3937d6d5de Merge pull request 'Update dependency react-router-dom to ^7.8.0' (#377) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-08 00:19:54 +00:00
9d2667bba3 Update dependency react-router-dom to ^7.8.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-08 00:19:52 +00:00
803f063d64 Update dependency @types/jest to v30
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-07 00:20:40 +00:00
f323d54c18 Merge pull request 'Update Rust crate zip to 4.3.0' (#376) from renovate/zip-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-07 00:20:30 +00:00
ad3fad44e5 Merge pull request 'Update dependency yaml to ^2.8.1' (#375) from renovate/yaml-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-07 00:20:26 +00:00
fc975a5156 Update Rust crate zip to 4.3.0
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-08-06 00:19:43 +00:00
064e5dfef5 Update dependency yaml to ^2.8.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-06 00:19:32 +00:00
6a3a24f724 Merge pull request 'Update Rust crate quick-xml to 0.38.1' (#374) from renovate/quick-xml-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-06 00:19:25 +00:00
8bdc7a11ef Update Rust crate quick-xml to 0.38.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-05 00:19:29 +00:00
2d2602f0f8 Merge pull request 'Update Rust crate tokio to 1.47.1' (#324) from renovate/tokio-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-05 00:19:22 +00:00
095d6d827f Update Rust crate tokio to 1.47.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-04 00:20:18 +00:00
c810c612de Merge pull request 'Update dependency typescript to ^5.9.2' (#373) from renovate/typescript-5.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-03 00:22:45 +00:00
dbcfd527b8 Update dependency typescript to ^5.9.2
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-08-03 00:22:39 +00:00
117c79c855 Merge pull request 'Update Rust crate serde_json to 1.0.142' (#372) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-03 00:22:29 +00:00
8b083e8e26 Update Rust crate serde_json to 1.0.142
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-02 00:21:27 +00:00
32f805aa3f Merge pull request 'Update dependency @mui/x-data-grid to ^8.9.2' (#371) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-02 00:21:19 +00:00
50ec6ecd9f Update dependency @mui/x-data-grid to ^8.9.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-01 00:24:12 +00:00
d3834ff7f7 Merge pull request 'Update Rust crate clap to 4.5.42' (#370) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-01 00:24:05 +00:00
64d8420cee Update Rust crate clap to 4.5.42
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-31 00:19:24 +00:00
796cf757d4 Merge pull request 'Update react' (#369) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-31 00:19:17 +00:00
4bb4f65d48 Update react
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-30 00:18:34 +00:00
5b916ec5a9 Merge pull request 'Update dependency @eslint/js to ^9.32.0' (#335) from renovate/eslint-js-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-30 00:18:28 +00:00
c5e43c7fbf Update dependency @eslint/js to ^9.32.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-29 00:22:19 +00:00
807dfc6635 Merge pull request 'Update Rust crate uuid to 1.17.0' (#368) from renovate/uuid-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-28 00:20:51 +00:00
4e1a2dcdba Update Rust crate uuid to 1.17.0
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-07-28 00:20:50 +00:00
843e53e83a Merge pull request 'Update Rust crate sysinfo to 0.36.1' (#367) from renovate/sysinfo-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-27 00:20:20 +00:00
5f911e6fb4 Update Rust crate sysinfo to 0.36.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-27 00:20:16 +00:00
6c42cd62df Merge pull request 'Update dependency eslint to ^9.32.0' (#366) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-26 00:20:00 +00:00
a4a4954344 Update dependency eslint to ^9.32.0
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-07-26 00:19:58 +00:00
5d20081fca Merge pull request 'Update dependency react-router-dom to ^7.7.1' (#365) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-25 00:20:51 +00:00
f46abedd1a Update dependency react-router-dom to ^7.7.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-25 00:20:48 +00:00
0548e480b4 Merge pull request 'Update Rust crate quick-xml to 0.38.0' (#364) from renovate/quick-xml-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 00:21:06 +00:00
6b9455f6ea Update Rust crate quick-xml to 0.38.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-24 00:21:04 +00:00
17108a52a3 Merge pull request 'Update dependency typescript-eslint to ^8.38.0' (#363) from renovate/typescript-eslint-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 00:20:29 +00:00
47ebc77458 Update dependency typescript-eslint to ^8.38.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-23 00:20:28 +00:00
87e57dea56 Merge pull request 'Update dependency @mui/x-data-grid to ^8.9.1' (#362) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-22 00:25:56 +00:00
24b4c02d9f Update dependency @mui/x-data-grid to ^8.9.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-22 00:25:42 +00:00
f2a3e16a1c Merge pull request 'Update Rust crate rand to 0.9.2' (#361) from renovate/rand-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-21 00:21:31 +00:00
6530a6d8e9 Update Rust crate rand to 0.9.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-21 00:21:29 +00:00
b741d79ba7 Merge pull request 'Update dependency @vitejs/plugin-react to ^4.7.0' (#360) from renovate/vitejs-plugin-react-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-20 00:18:51 +00:00
eeda3ca4ec Update dependency @vitejs/plugin-react to ^4.7.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-20 00:18:48 +00:00
992f91bb8a Merge pull request 'Update Rust crate serde_json to 1.0.141' (#359) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-19 00:22:33 +00:00
2f3ad231c7 Update Rust crate serde_json to 1.0.141
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-19 00:22:23 +00:00
6e41d3c6df Merge pull request 'Update materialui to ^7.2.0' (#358) from renovate/materialui into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-18 02:21:31 +00:00
f57f3f3c9a Update materialui to ^7.2.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-18 00:19:40 +00:00
34fda42766 Merge pull request 'Update dependency react-router-dom to ^7.7.0' (#357) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-17 02:41:12 +00:00
a9536f4091 Update dependency react-router-dom to ^7.7.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-17 00:19:55 +00:00
7770ad3ca7 Merge pull request 'Update dependency typescript-eslint to ^8.37.0' (#356) from renovate/typescript-eslint-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-16 02:28:11 +00:00
02b3373f51 Update dependency typescript-eslint to ^8.37.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-16 00:19:50 +00:00
5153af0618 Merge pull request 'Update dependency eslint to ^9.31.0' (#355) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-15 02:15:03 +00:00
d50c3a00a5 Update dependency eslint to ^9.31.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-15 00:19:02 +00:00
4618c2c081 Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.3' (#354) from renovate/eslint-plugin-react-x-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-14 02:12:21 +00:00
34d78085c8 Update dependency eslint-plugin-react-x to ^1.52.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-14 00:18:46 +00:00
0381b73635 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.3' (#353) from renovate/eslint-plugin-react-dom-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-13 02:20:28 +00:00
2e88529e3d Update dependency eslint-plugin-react-dom to ^1.52.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-13 00:18:37 +00:00
84e3f61902 Merge pull request 'Update dependency @mui/x-data-grid to ^8.8.0' (#352) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-12 02:35:41 +00:00
9623493aee Update dependency @mui/x-data-grid to ^8.8.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-12 00:18:58 +00:00
e5ad7d2fe4 Merge pull request 'Update dependency humanize-duration to ^3.33.0' (#351) from renovate/humanize-duration-3.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-11 02:28:44 +00:00
940179ffe5 Update dependency humanize-duration to ^3.33.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-11 00:19:12 +00:00
f7b27a527b Merge pull request 'Update Rust crate clap to 4.5.41' (#350) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-10 02:45:14 +00:00
caac7dc1bf Update Rust crate clap to 4.5.41
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-10 00:20:01 +00:00
a0f815534b Merge pull request 'Update dependency globals to ^16.3.0' (#349) from renovate/globals-16.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-09 02:31:14 +00:00
928c2c5cb4 Update dependency globals to ^16.3.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-09 00:19:18 +00:00
ddc8b65f8a Merge pull request 'Update dependency eslint to ^9.30.1' (#348) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-08 02:47:12 +00:00
0b67659efa Update dependency eslint to ^9.30.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-08 00:19:22 +00:00
0601d9cad9 Merge pull request 'Update dependency @mui/x-data-grid to ^8.7.0' (#347) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-07 02:12:52 +00:00
a1b6ebd9f5 Update dependency @mui/x-data-grid to ^8.7.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-07 00:18:43 +00:00
b8eedaab51 Merge pull request 'Update Rust crate reqwest to 0.12.22' (#346) from renovate/reqwest-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-06 02:00:23 +00:00
0afc3252c6 Update Rust crate reqwest to 0.12.22
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-06 00:18:48 +00:00
685f1bc502 Merge pull request 'Update dependency react-router-dom to ^7.6.3' (#345) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-05 02:15:49 +00:00
3e642dd638 Update dependency react-router-dom to ^7.6.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-05 00:12:33 +00:00
22ad68e43e Update dependency @emotion/styled to ^11.14.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-04 00:12:22 +00:00
1dd86807fd Fix cargo clippy issues
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-03 08:01:36 +02:00
96747bda89 Update dependency eslint-plugin-react-x to ^1.52.2
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-06-26 00:12:11 +00:00
e15514dd4f Update dependency eslint-plugin-react-dom to ^1.52.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-25 00:12:04 +00:00
7556ee2c06 Update dependency @vitejs/plugin-react to ^4.6.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-24 00:14:13 +00:00
992a902590 Update dependency eslint to ^9.29.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-23 00:24:41 +00:00
100f12e7c1 Update dependency @vitejs/plugin-react to ^4.5.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-22 00:23:00 +00:00
3de66a5873 Fix a bug in sysinfo route with docker containers
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-21 19:06:43 +02:00
49360188f5 Update dependency @mui/x-data-grid to ^8.5.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-21 00:23:42 +00:00
35c48ba846 Update materialui to ^7.1.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-20 00:25:00 +00:00
1ad4262086 Update Rust crate sysinfo to 0.35.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-19 00:23:07 +00:00
b633694f74 Add api client to release
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-06-18 19:07:43 +02:00
ab16bd7bcf Can export entire server configuration
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-17 21:17:25 +02:00
1080ab5cb2 Fix boolean config
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-17 19:13:43 +02:00
25 changed files with 1442 additions and 880 deletions

View File

@@ -46,8 +46,9 @@ steps:
- cd virtweb_backend
- mv /tmp/web_build/dist static
- cargo build --release
- ls -lah target/release/virtweb_backend
- cp target/release/virtweb_backend /tmp/release
- cargo build --release --example api_curl
- ls -lah target/release/virtweb_backend target/release/examples/api_curl
- cp target/release/virtweb_backend target/release/examples/api_curl /tmp/release
- name: gitea_release
image: plugins/gitea-release

File diff suppressed because it is too large Load Diff

View File

@@ -6,9 +6,9 @@ edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
log = "0.4.27"
log = "0.4.28"
env_logger = "0.11.8"
clap = { version = "4.5.40", features = ["derive", "env"] }
clap = { version = "4.5.47", features = ["derive", "env"] }
light-openid = { version = "1.0.4", features = ["crypto-wrapper"] }
lazy_static = "1.5.0"
actix = "0.13.5"
@@ -17,27 +17,27 @@ actix-remote-ip = "0.1.0"
actix-session = { version = "0.10.1", features = ["cookie-session"] }
actix-identity = "0.8.0"
actix-cors = "0.7.1"
actix-files = "0.6.6"
actix-files = "0.6.7"
actix-ws = "0.3.0"
actix-http = "3.11.0"
serde = { version = "1.0.219", features = ["derive"] }
serde_json = "1.0.140"
actix-http = "3.11.1"
serde = { version = "1.0.225", features = ["derive"] }
serde_json = "1.0.145"
serde_yml = "0.0.12"
quick-xml = { version = "0.37.5", features = ["serialize", "overlapped-lists"] }
quick-xml = { version = "0.38.3", features = ["serialize", "overlapped-lists"] }
futures-util = "0.3.31"
anyhow = "1.0.98"
anyhow = "1.0.99"
actix-multipart = "0.7.2"
tempfile = "3.20.0"
reqwest = { version = "0.12.20", features = ["stream"] }
url = "2.5.4"
virt = "0.4.2"
sysinfo = { version = "0.35.1", features = ["serde"] }
uuid = { version = "1.16.0", features = ["v4", "serde"] }
reqwest = { version = "0.12.23", features = ["stream"] }
url = "2.5.7"
virt = "0.4.3"
sysinfo = { version = "0.36.1", features = ["serde"] }
uuid = { version = "1.17.0", features = ["v4", "serde"] }
lazy-regex = "3.4.1"
thiserror = "2.0.12"
image = "0.25.6"
rand = "0.9.1"
tokio = { version = "1.45.0", features = ["rt", "time", "macros"] }
thiserror = "2.0.16"
image = "0.25.8"
rand = "0.9.2"
tokio = { version = "1.47.1", features = ["rt", "time", "macros"] }
futures = "0.3.31"
ipnetwork = { version = "0.21.1", features = ["serde"] }
num = "0.4.3"
@@ -45,3 +45,5 @@ rust-embed = { version = "8.7.2", features = ["mime-guess"] }
dotenvy = "0.15.7"
nix = { version = "0.30.1", features = ["net"] }
basic-jwt = "0.3.0"
zip = "4.3.0"
chrono = "0.4.42"

View File

@@ -27,10 +27,7 @@ impl LibVirtActor {
/// Connect to hypervisor
pub async fn connect() -> anyhow::Result<Self> {
let hypervisor_uri = AppConfig::get().hypervisor_uri.as_deref().unwrap_or("");
log::info!(
"Will connect to hypvervisor at address '{}'",
hypervisor_uri
);
log::info!("Will connect to hypvervisor at address '{hypervisor_uri}'",);
let conn = Connect::open(Some(hypervisor_uri))?;
Ok(Self { m: conn })
@@ -102,7 +99,7 @@ impl Handler<GetDomainXMLReq> for LibVirtActor {
log::debug!("Get domain XML:\n{}", msg.0.as_string());
let domain = Domain::lookup_by_uuid_string(&self.m, &msg.0.as_string())?;
let xml = domain.get_xml_desc(VIR_DOMAIN_XML_SECURE)?;
log::debug!("XML = {}", xml);
log::debug!("XML = {xml}");
DomainXML::parse_xml(&xml)
}
}
@@ -131,7 +128,7 @@ impl Handler<DefineDomainReq> for LibVirtActor {
fn handle(&mut self, mut msg: DefineDomainReq, _ctx: &mut Self::Context) -> Self::Result {
let xml = msg.1.as_xml()?;
log::debug!("Define domain:\n{}", xml);
log::debug!("Define domain:\n{xml}");
let domain = Domain::define_xml(&self.m, &xml)?;
let uuid = XMLUuid::parse_from_str(&domain.get_uuid_string()?)?;
@@ -446,7 +443,7 @@ impl Handler<GetNetworkXMLReq> for LibVirtActor {
log::debug!("Get network XML:\n{}", msg.0.as_string());
let network = Network::lookup_by_uuid_string(&self.m, &msg.0.as_string())?;
let xml = network.get_xml_desc(0)?;
log::debug!("XML = {}", xml);
log::debug!("XML = {xml}");
NetworkXML::parse_xml(&xml)
}
}
@@ -602,7 +599,7 @@ impl Handler<GetNWFilterXMLReq> for LibVirtActor {
log::debug!("Get network filter XML:\n{}", msg.0.as_string());
let filter = NWFilter::lookup_by_uuid_string(&self.m, &msg.0.as_string())?;
let xml = filter.get_xml_desc(0)?;
log::debug!("XML = {}", xml);
log::debug!("XML = {xml}");
NetworkFilterXML::parse_xml(xml)
}
}
@@ -617,7 +614,7 @@ impl Handler<DefineNWFilterReq> for LibVirtActor {
fn handle(&mut self, mut msg: DefineNWFilterReq, _ctx: &mut Self::Context) -> Self::Result {
let xml = msg.1.into_xml()?;
log::debug!("Define network filter:\n{}", xml);
log::debug!("Define network filter:\n{xml}");
let filter = NWFilter::define_xml(&self.m, &xml)?;
let uuid = XMLUuid::parse_from_str(&filter.get_uuid_string()?)?;

View File

@@ -104,10 +104,10 @@ impl Token {
/// Check whether a token is expired or not
pub fn is_expired(&self) -> bool {
if let Some(max_inactivity) = self.max_inactivity {
if max_inactivity + self.last_used < time() {
return true;
}
if let Some(max_inactivity) = self.max_inactivity
&& max_inactivity + self.last_used < time()
{
return true;
}
false
@@ -188,10 +188,10 @@ impl NewToken {
return Some(err);
}
if let Some(t) = self.max_inactivity {
if t < 3600 {
return Some("API tokens shall be valid for at least 1 hour!");
}
if let Some(t) = self.max_inactivity
&& t < 3600
{
return Some("API tokens shall be valid for at least 1 hour!");
}
None

View File

@@ -280,7 +280,7 @@ impl AppConfig {
/// Get VM vnc sockets path for domain
pub fn vnc_socket_for_domain(&self, name: &str) -> PathBuf {
self.vnc_sockets_path().join(format!("vnc-{}", name))
self.vnc_sockets_path().join(format!("vnc-{name}"))
}
/// Get VM root disks storage directory

View File

@@ -31,13 +31,12 @@ pub async fn upload(MultipartForm(mut form): MultipartForm<UploadDiskImageForm>)
}
// Check file mime type
if let Some(mime_type) = file.content_type {
if !constants::ALLOWED_DISK_IMAGES_MIME_TYPES.contains(&mime_type.as_ref()) {
return Ok(HttpResponse::BadRequest().json(format!(
"Unsupported file type for disk upload: {}",
mime_type
)));
}
if let Some(mime_type) = file.content_type
&& !constants::ALLOWED_DISK_IMAGES_MIME_TYPES.contains(&mime_type.as_ref())
{
return Ok(HttpResponse::BadRequest().json(format!(
"Unsupported file type for disk upload: {mime_type}"
)));
}
// Extract and check file name

View File

@@ -31,11 +31,11 @@ pub async fn upload_file(MultipartForm(mut form): MultipartForm<UploadIsoForm>)
return Ok(HttpResponse::BadRequest().json("File is too large!"));
}
if let Some(m) = &file.content_type {
if !constants::ALLOWED_ISO_MIME_TYPES.contains(&m.to_string().as_str()) {
log::error!("Uploaded ISO file has an invalid mimetype!");
return Ok(HttpResponse::BadRequest().json("Invalid mimetype!"));
}
if let Some(m) = &file.content_type
&& !constants::ALLOWED_ISO_MIME_TYPES.contains(&m.to_string().as_str())
{
log::error!("Uploaded ISO file has an invalid mimetype!");
return Ok(HttpResponse::BadRequest().json("Invalid mimetype!"));
}
let file_name = match &file.file_name {
@@ -52,7 +52,7 @@ pub async fn upload_file(MultipartForm(mut form): MultipartForm<UploadIsoForm>)
}
let dest_file = AppConfig::get().iso_storage_path().join(file_name);
log::info!("Will save ISO file {:?}", dest_file);
log::info!("Will save ISO file {dest_file:?}");
if dest_file.exists() {
log::error!("Conflict with uploaded iso file name!");
@@ -87,16 +87,16 @@ pub async fn upload_from_url(req: web::Json<DownloadFromURLReq>) -> HttpResult {
let response = reqwest::get(&req.url).await?;
if let Some(len) = response.content_length() {
if len > constants::ISO_MAX_SIZE.as_bytes() as u64 {
return Ok(HttpResponse::BadRequest().json("File is too large!"));
}
if let Some(len) = response.content_length()
&& len > constants::ISO_MAX_SIZE.as_bytes() as u64
{
return Ok(HttpResponse::BadRequest().json("File is too large!"));
}
if let Some(ct) = response.headers().get("content-type") {
if !constants::ALLOWED_ISO_MIME_TYPES.contains(&ct.to_str()?) {
return Ok(HttpResponse::BadRequest().json("Invalid file mimetype!"));
}
if let Some(ct) = response.headers().get("content-type")
&& !constants::ALLOWED_ISO_MIME_TYPES.contains(&ct.to_str()?)
{
return Ok(HttpResponse::BadRequest().json("Invalid file mimetype!"));
}
let mut stream = response.bytes_stream();

View File

@@ -4,6 +4,7 @@ use actix_web::body::BoxBody;
use actix_web::{HttpResponse, web};
use std::error::Error;
use std::fmt::{Display, Formatter};
use zip::result::ZipError;
pub mod api_tokens_controller;
pub mod auth_controller;
@@ -42,7 +43,7 @@ impl actix_web::error::ResponseError for HttpErr {
}
}
fn error_response(&self) -> HttpResponse<BoxBody> {
log::error!("Error while processing request! {}", self);
log::error!("Error while processing request! {self}");
HttpResponse::InternalServerError().body("Failed to execute request!")
}
@@ -102,6 +103,12 @@ impl From<actix_web::Error> for HttpErr {
}
}
impl From<ZipError> for HttpErr {
fn from(value: ZipError) -> Self {
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
impl From<HttpResponse> for HttpErr {
fn from(value: HttpResponse) -> Self {
HttpErr::HTTPResponse(value)

View File

@@ -1,14 +1,24 @@
use crate::actors::vnc_tokens_actor::VNC_TOKEN_LIFETIME;
use crate::app_config::AppConfig;
use crate::constants;
use crate::constants::{DISK_NAME_MAX_LEN, DISK_NAME_MIN_LEN, DISK_SIZE_MAX, DISK_SIZE_MIN};
use crate::controllers::{HttpResult, LibVirtReq};
use crate::extractors::local_auth_extractor::LocalAuthEnabled;
use crate::libvirt_rest_structures::hypervisor::HypervisorInfo;
use crate::libvirt_rest_structures::net::NetworkInfo;
use crate::libvirt_rest_structures::nw_filter::NetworkFilter;
use crate::libvirt_rest_structures::vm::VMInfo;
use crate::nat::nat_hook;
use crate::utils::net_utils;
use actix_web::{HttpResponse, Responder};
use crate::utils::time_utils::{format_date, time};
use crate::{api_tokens, constants};
use actix_files::NamedFile;
use actix_web::{HttpRequest, HttpResponse, Responder};
use serde::Serialize;
use std::fs::File;
use std::io::Write;
use sysinfo::{Components, Disks, Networks, System};
use zip::ZipWriter;
use zip::write::SimpleFileOptions;
#[derive(serde::Serialize)]
struct StaticConfig {
@@ -199,3 +209,85 @@ pub async fn networks_list() -> HttpResult {
pub async fn bridges_list() -> HttpResult {
Ok(HttpResponse::Ok().json(net_utils::bridges_list()?))
}
/// Add JSON file to ZIP
fn zip_json<E: Serialize, F>(
zip: &mut ZipWriter<File>,
dir: &str,
content: &Vec<E>,
file_name: F,
) -> anyhow::Result<()>
where
F: Fn(&E) -> String,
{
for entry in content {
let file_encoded = serde_json::to_string(&entry)?;
let options = SimpleFileOptions::default()
.compression_method(zip::CompressionMethod::Deflated)
.unix_permissions(0o750);
zip.start_file(format!("{dir}/{}.json", file_name(entry)), options)?;
zip.write_all(file_encoded.as_bytes())?;
}
Ok(())
}
/// Export all configuration elements at once
pub async fn export_all_configs(req: HttpRequest, client: LibVirtReq) -> HttpResult {
// Perform extractions
let vms = client
.get_full_domains_list()
.await?
.into_iter()
.map(VMInfo::from_domain)
.collect::<Result<Vec<_>, _>>()?;
let networks = client
.get_full_networks_list()
.await?
.into_iter()
.map(NetworkInfo::from_xml)
.collect::<Result<Vec<_>, _>>()?;
let nw_filters = client
.get_full_network_filters_list()
.await?
.into_iter()
.map(NetworkFilter::lib2rest)
.collect::<Result<Vec<_>, _>>()?;
let tokens = api_tokens::full_list().await?;
// Create ZIP file
let dest_dir = tempfile::tempdir_in(&AppConfig::get().temp_dir)?;
let zip_path = dest_dir.path().join("export.zip");
let file = File::create(&zip_path)?;
let mut zip = ZipWriter::new(file);
// Encode entities to JSON
zip_json(&mut zip, "vms", &vms, |v| v.name.to_string())?;
zip_json(&mut zip, "networks", &networks, |v| v.name.0.to_string())?;
zip_json(
&mut zip,
"nw_filters",
&nw_filters,
|v| match constants::BUILTIN_NETWORK_FILTER_RULES.contains(&v.name.0.as_str()) {
true => format!("builtin/{}", v.name.0),
false => v.name.0.to_string(),
},
)?;
zip_json(&mut zip, "tokens", &tokens, |v| v.id.0.to_string())?;
// Finalize ZIP and return response
zip.finish()?;
let file = File::open(zip_path)?;
let file = NamedFile::from_file(
file,
format!(
"export_{}.zip",
format_date(time() as i64).unwrap().replace('/', "-")
),
)?;
Ok(file.into_response(&req))
}

View File

@@ -128,21 +128,21 @@ impl FromRequest for ApiAuthExtractor {
));
}
if let Some(ip) = token.ip_restriction {
if !ip.contains(remote_ip.0) {
log::error!(
"Attempt to use a token for an unauthorized IP! {remote_ip:?} token_id={}",
token.id.0
);
return Err(ErrorUnauthorized("Token cannot be used from this IP!"));
}
if let Some(ip) = token.ip_restriction
&& !ip.contains(remote_ip.0)
{
log::error!(
"Attempt to use a token for an unauthorized IP! {remote_ip:?} token_id={}",
token.id.0
);
return Err(ErrorUnauthorized("Token cannot be used from this IP!"));
}
if token.should_update_last_activity() {
if let Err(e) = api_tokens::refresh_last_used(token.id).await {
log::error!("Could not update token last activity! {e}");
return Err(ErrorBadRequest("Couldn't refresh token last activity!"));
}
if token.should_update_last_activity()
&& let Err(e) = api_tokens::refresh_last_used(token.id).await
{
log::error!("Could not update token last activity! {e}");
return Err(ErrorBadRequest("Couldn't refresh token last activity!"));
}
Ok(ApiAuthExtractor { token, claims })

View File

@@ -96,28 +96,28 @@ impl NetworkInfo {
return Err(StructureExtraction("network name is invalid!").into());
}
if let Some(n) = &self.title {
if n.contains('\n') {
return Err(StructureExtraction("Network title contain newline char!").into());
}
if let Some(n) = &self.title
&& n.contains('\n')
{
return Err(StructureExtraction("Network title contain newline char!").into());
}
if let Some(dev) = &self.device {
if !regex!("^[a-zA-Z0-9]+$").is_match(dev) {
return Err(StructureExtraction("Network device name is invalid!").into());
}
if let Some(dev) = &self.device
&& !regex!("^[a-zA-Z0-9]+$").is_match(dev)
{
return Err(StructureExtraction("Network device name is invalid!").into());
}
if let Some(bridge) = &self.bridge_name {
if !regex!("^[a-zA-Z0-9]+$").is_match(bridge) {
return Err(StructureExtraction("Network bridge name is invalid!").into());
}
if let Some(bridge) = &self.bridge_name
&& !regex!("^[a-zA-Z0-9]+$").is_match(bridge)
{
return Err(StructureExtraction("Network bridge name is invalid!").into());
}
if let Some(domain) = &self.domain {
if !regex!("^[a-zA-Z0-9.]+$").is_match(domain) {
return Err(StructureExtraction("Domain name is invalid!").into());
}
if let Some(domain) = &self.domain
&& !regex!("^[a-zA-Z0-9.]+$").is_match(domain)
{
return Err(StructureExtraction("Domain name is invalid!").into());
}
let mut ips = Vec::with_capacity(2);
@@ -303,16 +303,16 @@ impl NetworkInfo {
/// Check if at least one NAT definition was specified on this interface
pub fn has_nat_def(&self) -> bool {
if let Some(ipv4) = &self.ip_v4 {
if ipv4.nat.is_some() {
return true;
}
if let Some(ipv4) = &self.ip_v4
&& ipv4.nat.is_some()
{
return true;
}
if let Some(ipv6) = &self.ip_v6 {
if ipv6.nat.is_some() {
return true;
}
if let Some(ipv6) = &self.ip_v6
&& ipv6.nat.is_some()
{
return true;
}
false

View File

@@ -43,14 +43,12 @@ impl From<&String> for NetworkFilterMacAddressOrVar {
fn extract_mac_address_or_var(
n: &Option<NetworkFilterMacAddressOrVar>,
) -> anyhow::Result<Option<String>> {
if let Some(mac) = n {
if !mac.is_valid() {
return Err(NetworkFilterExtraction(format!(
"Invalid mac address or variable! {}",
mac.0
))
.into());
}
if let Some(mac) = n
&& !mac.is_valid()
{
return Err(
NetworkFilterExtraction(format!("Invalid mac address or variable! {}", mac.0)).into(),
);
}
Ok(n.as_ref().map(|n| n.0.to_string()))
@@ -83,34 +81,34 @@ impl<const V: usize> From<&String> for NetworkFilterIPOrVar<V> {
fn extract_ip_or_var<const V: usize>(
n: &Option<NetworkFilterIPOrVar<V>>,
) -> anyhow::Result<Option<String>> {
if let Some(ip) = n {
if !ip.is_valid() {
return Err(NetworkFilterExtraction(format!(
"Invalid IPv{V} address or variable! {}",
ip.0
))
.into());
}
if let Some(ip) = n
&& !ip.is_valid()
{
return Err(NetworkFilterExtraction(format!(
"Invalid IPv{V} address or variable! {}",
ip.0
))
.into());
}
Ok(n.as_ref().map(|n| n.0.to_string()))
}
fn extract_ip_mask<const V: usize>(n: Option<u8>) -> anyhow::Result<Option<u8>> {
if let Some(mask) = n {
if !net_utils::is_mask_valid(V, mask) {
return Err(NetworkFilterExtraction(format!("Invalid IPv{V} mask! {mask}")).into());
}
if let Some(mask) = n
&& !net_utils::is_mask_valid(V, mask)
{
return Err(NetworkFilterExtraction(format!("Invalid IPv{V} mask! {mask}")).into());
}
Ok(n)
}
fn extract_nw_filter_comment(n: &Option<String>) -> anyhow::Result<Option<String>> {
if let Some(comment) = n {
if comment.len() > 256 || comment.contains('\"') || comment.contains('\n') {
return Err(NetworkFilterExtraction(format!("Invalid comment! {}", comment)).into());
}
if let Some(comment) = n
&& (comment.len() > 256 || comment.contains('\"') || comment.contains('\n'))
{
return Err(NetworkFilterExtraction(format!("Invalid comment! {comment}")).into());
}
Ok(n.clone())
@@ -869,12 +867,10 @@ impl NetworkFilter {
);
}
if let Some(priority) = self.priority {
if !(-1000..=1000).contains(&priority) {
return Err(
NetworkFilterExtraction("Network priority is invalid!".to_string()).into(),
);
}
if let Some(priority) = self.priority
&& !(-1000..=1000).contains(&priority)
{
return Err(NetworkFilterExtraction("Network priority is invalid!".to_string()).into());
}
for fref in &self.join_filters {

View File

@@ -118,22 +118,22 @@ impl VMInfo {
XMLUuid::new_random()
};
if let Some(n) = &self.genid {
if !n.is_valid() {
return Err(StructureExtraction("VM genid is invalid!").into());
}
if let Some(n) = &self.genid
&& !n.is_valid()
{
return Err(StructureExtraction("VM genid is invalid!").into());
}
if let Some(n) = &self.title {
if n.contains('\n') {
return Err(StructureExtraction("VM title contain newline char!").into());
}
if let Some(n) = &self.title
&& n.contains('\n')
{
return Err(StructureExtraction("VM title contain newline char!").into());
}
if let Some(group) = &self.group {
if !regex!("^[a-zA-Z0-9]+$").is_match(&group.0) {
return Err(StructureExtraction("VM group name is invalid!").into());
}
if let Some(group) = &self.group
&& !regex!("^[a-zA-Z0-9]+$").is_match(&group.0)
{
return Err(StructureExtraction("VM group name is invalid!").into());
}
if self.memory < constants::MIN_VM_MEMORY || self.memory > constants::MAX_VM_MEMORY {

View File

@@ -157,6 +157,10 @@ async fn main() -> std::io::Result<()> {
"/api/server/bridges",
web::get().to(server_controller::bridges_list),
)
.route(
"/api/server/export_configs",
web::get().to(server_controller::export_all_configs),
)
// Auth controller
.route(
"/api/auth/local",

View File

@@ -69,8 +69,7 @@ where
if !AppConfig::get().is_allowed_ip(remote_ip.0) {
log::error!(
"An attempt to access VirtWeb from an unauthorized network has been intercepted! {:?}",
remote_ip
"An attempt to access VirtWeb from an unauthorized network has been intercepted! {remote_ip:?}"
);
return Ok(req
.into_response(

View File

@@ -60,10 +60,10 @@ pub struct Nat<IPv> {
impl<IPv> Nat<IPv> {
pub fn check(&self) -> anyhow::Result<()> {
if let NatSourceIP::Interface { name } = &self.host_ip {
if !net_utils::is_net_interface_name_valid(name) {
return Err(NatDefError::InvalidNatDef("Invalid nat interface name!").into());
}
if let NatSourceIP::Interface { name } = &self.host_ip
&& !net_utils::is_net_interface_name_valid(name)
{
return Err(NatDefError::InvalidNatDef("Invalid nat interface name!").into());
}
if let NatHostPort::Range { start, end } = &self.host_port {
@@ -84,10 +84,10 @@ impl<IPv> Nat<IPv> {
return Err(NatDefError::InvalidNatDef("Invalid guest port!").into());
}
if let Some(comment) = &self.comment {
if comment.len() > constants::NET_NAT_COMMENT_MAX_SIZE {
return Err(NatDefError::InvalidNatDef("Comment is too large!").into());
}
if let Some(comment) = &self.comment
&& comment.len() > constants::NET_NAT_COMMENT_MAX_SIZE
{
return Err(NatDefError::InvalidNatDef("Comment is too large!").into());
}
Ok(())

View File

@@ -81,10 +81,10 @@ impl CloudInitConfig {
// Process metadata
let mut metadatas = vec![];
if let Some(inst_id) = &self.instance_id {
metadatas.push(format!("instance-id: {}", inst_id));
metadatas.push(format!("instance-id: {inst_id}"));
}
if let Some(local_hostname) = &self.local_hostname {
metadatas.push(format!("local-hostname: {}", local_hostname));
metadatas.push(format!("local-hostname: {local_hostname}"));
}
if let Some(dsmode) = &self.dsmode {
metadatas.push(format!(

View File

@@ -1,3 +1,4 @@
use chrono::Datelike;
use std::time::{SystemTime, UNIX_EPOCH};
/// Get the current time since epoch
@@ -13,3 +14,15 @@ pub fn time() -> u64 {
.unwrap()
.as_secs()
}
/// Format given UNIX time in a simple format
pub fn format_date(time: i64) -> anyhow::Result<String> {
let date = chrono::DateTime::from_timestamp(time, 0).ok_or(anyhow::anyhow!("invalid date"))?;
Ok(format!(
"{:0>2}/{:0>2}/{}",
date.day(),
date.month(),
date.year()
))
}

File diff suppressed because it is too large Load Diff

View File

@@ -11,46 +11,46 @@
},
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
"@fontsource/roboto": "^5.2.6",
"@emotion/styled": "^11.14.1",
"@fontsource/roboto": "^5.2.8",
"@mdi/js": "^7.4.47",
"@mdi/react": "^1.6.1",
"@monaco-editor/react": "^4.7.0",
"@mui/icons-material": "^7.1.1",
"@mui/material": "^7.1.1",
"@mui/icons-material": "^7.3.1",
"@mui/material": "^7.3.1",
"@mui/x-charts": "^8.3.1",
"@mui/x-data-grid": "^8.3.1",
"@mui/x-data-grid": "^8.11.3",
"date-and-time": "^3.6.0",
"filesize": "^10.1.6",
"humanize-duration": "^3.32.2",
"humanize-duration": "^3.33.0",
"monaco-editor": "^0.52.2",
"monaco-yaml": "^5.4.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-router-dom": "^7.6.2",
"react-syntax-highlighter": "^15.6.1",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-router-dom": "^7.8.0",
"react-syntax-highlighter": "^15.6.6",
"react-vnc": "^3.1.0",
"uuid": "^11.1.0",
"xml-formatter": "^3.6.6",
"yaml": "^2.8.0"
"yaml": "^2.8.1"
},
"devDependencies": {
"@eslint/js": "^9.27.0",
"@eslint/js": "^9.35.0",
"@types/humanize-duration": "^3.27.4",
"@types/jest": "^29.5.14",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@types/jest": "^30.0.0",
"@types/react": "^19.1.13",
"@types/react-dom": "^19.1.9",
"@types/react-syntax-highlighter": "^15.5.13",
"@types/uuid": "^10.0.0",
"@vitejs/plugin-react": "^4.4.1",
"eslint": "^9.27.0",
"eslint-plugin-react-dom": "^1.49.0",
"@vitejs/plugin-react": "^4.7.0",
"eslint": "^9.35.0",
"eslint-plugin-react-dom": "^1.53.1",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"eslint-plugin-react-x": "^1.49.0",
"globals": "^16.1.0",
"typescript": "^5.8.3",
"typescript-eslint": "^8.32.1",
"vite": "^6.3.5"
"eslint-plugin-react-x": "^1.52.9",
"globals": "^16.3.0",
"typescript": "^5.9.2",
"typescript-eslint": "^8.43.0",
"vite": "^6.3.6"
}
}

View File

@@ -232,4 +232,16 @@ export class ServerApi {
})
).data;
}
/**
* Export all server configs
*/
static async ExportServerConfigs(): Promise<Blob> {
return (
await APIClient.exec({
method: "GET",
uri: "/server/export_configs",
})
).data;
}
}

View File

@@ -9,18 +9,21 @@ import {
import Icon from "@mdi/react";
import {
Box,
IconButton,
LinearProgress,
Table,
TableBody,
TableCell,
TableHead,
TableRow,
Tooltip,
Typography,
} from "@mui/material";
import Grid from "@mui/material/Grid";
import { PieChart } from "@mui/x-charts";
import { filesize } from "filesize";
import humanizeDuration from "humanize-duration";
import IosShareIcon from "@mui/icons-material/IosShare";
import React from "react";
import {
DiskInfo,
@@ -31,6 +34,8 @@ import {
import { AsyncWidget } from "../widgets/AsyncWidget";
import { VirtWebPaper } from "../widgets/VirtWebPaper";
import { VirtWebRouteContainer } from "../widgets/VirtWebRouteContainer";
import { useLoadingMessage } from "../hooks/providers/LoadingMessageProvider";
import { useAlert } from "../hooks/providers/AlertDialogProvider";
export function SysInfoRoute(): React.ReactElement {
const [info, setInfo] = React.useState<ServerSystemInfo>();
@@ -52,6 +57,23 @@ export function SysInfoRoute(): React.ReactElement {
export function SysInfoRouteInner(p: {
info: ServerSystemInfo;
}): React.ReactElement {
const alert = useAlert();
const loadingMessage = useLoadingMessage();
const downloadAllConfig = async () => {
try {
loadingMessage.show("Downloading server config...");
const res = await ServerApi.ExportServerConfigs();
const url = URL.createObjectURL(res);
window.location.href = url;
} catch (e) {
console.error("Failed to download server config!", e);
alert(`Failed to download server config! ${e}`);
} finally {
loadingMessage.hide();
}
};
const sumDiskUsage = p.info.disks.reduce(
(prev, disk) => {
return {
@@ -63,7 +85,16 @@ export function SysInfoRouteInner(p: {
);
return (
<VirtWebRouteContainer label="Sysinfo">
<VirtWebRouteContainer
label="Sysinfo"
actions={
<Tooltip title="Export all server configs">
<IconButton onClick={downloadAllConfig}>
<IosShareIcon />
</IconButton>
</Tooltip>
}
>
<Grid container spacing={2}>
{/* Memory */}
<Grid size={{ xs: 4 }}>
@@ -288,7 +319,7 @@ function DiskDetailsTable(p: { disks: DiskInfo[] }): React.ReactElement {
{p.disks.map((e, c) => (
<TableRow hover key={c}>
<TableCell>{e.name}</TableCell>
<TableCell>{e.DiskKind}</TableCell>
<TableCell>{String(e.DiskKind)}</TableCell>
<TableCell>{e.mount_point}</TableCell>
<TableCell>{filesize(e.total_space)}</TableCell>
<TableCell>{filesize(e.available_space)}</TableCell>

View File

@@ -333,8 +333,7 @@ function CloudInitBooleanInput(p: {
label={p.name}
checked={p.yaml.getIn(p.attrPath) === true}
onValueChange={(v) => {
if (v) p.yaml.setIn(p.attrPath, v);
else p.yaml.deleteIn(p.attrPath);
p.yaml.setIn(p.attrPath, v);
p.onChange?.();
}}
/>

View File

@@ -799,6 +799,11 @@ export function TokenRightsEditor(p: {
right={{ verb: "GET", path: "/api/server/bridges" }}
label="Get list of network bridges"
/>
<RouteRight
{...p}
right={{ verb: "GET", path: "/api/server/export_configs" }}
label="Export all configurations"
/>
</RightsSection>
</>
);