mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-10-12 16:00:33 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c986b04667 | ||
|
|
754e016f20 | ||
|
|
f67ce75492 | ||
|
|
e236ca5607 | ||
|
|
10e74c4fe4 | ||
|
|
473c0a5ff2 | ||
|
|
7fbe6e4091 | ||
|
|
65dbb53a07 | ||
|
|
c21910c203 | ||
|
|
1728511bad | ||
|
|
e63f6672f8 | ||
|
|
7fa9754ce7 | ||
|
|
475e4ca629 | ||
|
|
32dee74edf | ||
|
|
6715559925 | ||
|
|
2f380c9f2f | ||
|
|
0aebb0d2db | ||
|
|
b7cf9aab2b | ||
|
|
ea2f1875bc | ||
|
|
83524940ed | ||
|
|
8c33eb8409 | ||
|
|
644655af86 | ||
|
|
8082f4d2ca | ||
|
|
3c896bc5f8 | ||
|
|
5c7ce6d8d4 | ||
|
|
222702f66b | ||
|
|
b3b3feb1b9 | ||
|
|
133140040b | ||
|
|
d70f903432 | ||
|
|
f77f305316 | ||
|
|
13b5908442 | ||
|
|
d1335db986 | ||
|
|
1e8836ad95 | ||
|
|
d155217ce3 | ||
|
|
9ddb996a44 | ||
|
|
226eccf5f1 | ||
|
|
4b2d6f0ef2 | ||
|
|
f1c9ad45a7 | ||
|
|
93489c85fa | ||
|
|
8cead06d7b | ||
|
|
625cd9f32f | ||
|
|
9aab3b42af | ||
|
|
6684cd57d7 | ||
|
|
00d95d6e19 | ||
|
|
36f03e5daf | ||
|
|
7c395a6bf8 | ||
|
|
e9a7cac5fd | ||
|
|
9f00b431d4 | ||
|
|
1705d44378 | ||
|
|
537e2c730c | ||
|
|
b4dc6b1ab0 | ||
|
|
1f22285cf4 | ||
|
|
1d546236e4 | ||
|
|
982e0bbd3e | ||
|
|
5a67a62733 | ||
|
|
961ebd30a1 | ||
|
|
9819546694 | ||
|
|
5c8d391a73 | ||
|
|
0e84b9a2a7 | ||
|
|
1f58da501e | ||
|
|
0041184a3e | ||
|
|
112468949d | ||
|
|
7e03e94460 | ||
|
|
fd9b299b14 | ||
|
|
37932d7fb2 | ||
|
|
f0f2087f54 | ||
|
|
f3de09e5d7 | ||
|
|
1a8c1613a4 | ||
|
|
5209275f28 | ||
|
|
924e59d948 | ||
|
|
87a39cab3a | ||
|
|
f9a70757a1 | ||
|
|
741acee393 | ||
|
|
c964a02088 | ||
|
|
ba71613ae6 | ||
|
|
5493b41381 | ||
|
|
c3f45d4787 | ||
|
|
a8a92da483 | ||
|
|
a77e61a861 | ||
|
|
e589728987 | ||
|
|
cc3cdef5f3 | ||
|
|
7101af0594 | ||
|
|
df6cda7143 | ||
|
|
62beb534d2 | ||
|
|
9a70bf1c2d | ||
|
|
6f4559c7cd | ||
|
|
8b2bcdc814 | ||
|
|
0f6ddf26fd | ||
|
|
ebe472a9db | ||
|
|
c1a87baad7 | ||
|
|
c7f185a184 | ||
|
|
4ca2ba5482 | ||
|
|
727b74895d | ||
|
|
6c3f56516f | ||
|
|
4833cf2d3c | ||
|
|
b5ca015632 | ||
|
|
1c82034111 | ||
|
|
e45d723f3d | ||
|
|
627e6852db | ||
|
|
1725767789 | ||
|
|
3e1f2b4934 | ||
|
|
140d20a21d | ||
|
|
6e933fc83c | ||
|
|
79ff565995 | ||
|
|
39691698c9 | ||
|
|
4bedddb557 | ||
|
|
f9547752f5 | ||
|
|
96b37cb024 | ||
|
|
30d874bc91 | ||
|
|
32bc8d922b | ||
|
|
a95d9aa27a | ||
|
|
7f4f5a0a47 | ||
|
|
65a7193bc6 | ||
|
|
64f79b4fdd | ||
|
|
31d2af554e | ||
|
|
e0f2910710 | ||
|
|
f89ab607b4 | ||
|
|
61fa07b8f2 | ||
|
|
9653df185a | ||
|
|
8f7d3df76d | ||
|
|
2aa89699c1 | ||
|
|
46b8d3bd80 | ||
|
|
8a7be481b0 | ||
|
|
21bd94d3a3 | ||
|
|
d337190b59 | ||
|
|
7073e83d94 | ||
|
|
537ff49c0b | ||
|
|
4b1f643c70 | ||
|
|
b8b873836d | ||
|
|
021334c2c8 | ||
|
|
635d86a1a5 | ||
|
|
607eae3ca8 | ||
|
|
66428c0a8e | ||
|
|
c0404a4ec5 | ||
|
|
77ef3b7096 | ||
|
|
498052f4c9 | ||
|
|
958c55eab8 | ||
|
|
d3cddd175a | ||
|
|
6cd130677e | ||
|
|
33b90e3979 | ||
|
|
e1e2b97e88 | ||
|
|
8e4e1dc749 | ||
|
|
1eb5830238 | ||
|
|
5db2ccbb22 | ||
|
|
47e04a14ad | ||
|
|
a13c58eb18 | ||
|
|
15d77ceb46 | ||
|
|
af8fa6763f | ||
|
|
ed66d22bdb | ||
|
|
5209db3abc | ||
|
|
35ea1a1d6c | ||
|
|
b0a053b397 | ||
|
|
a8b3390ce9 | ||
|
|
4266e39d84 | ||
|
|
5620b6e736 | ||
|
|
289e4190ff | ||
|
|
9250412296 | ||
|
|
9c5370508e | ||
|
|
a145bfdc5b | ||
|
|
db2b38eedb | ||
|
|
9303ee399f | ||
|
|
d64cb3dc58 | ||
|
|
62871acfbb | ||
|
|
7401906b03 | ||
|
|
5aa3c29684 | ||
|
|
91745f592f | ||
|
|
564333ea03 | ||
|
|
7b543ea5fe | ||
|
|
fc5e583481 | ||
|
|
1767b1a9c1 | ||
|
|
930c340e37 | ||
|
|
58531d3995 | ||
|
|
4b7c1390fb | ||
|
|
2337d6f13a | ||
|
|
cb8ecd55ed | ||
|
|
33ad31dba2 | ||
|
|
294c3f128b | ||
|
|
0899f4e9db | ||
|
|
788f4d8307 | ||
|
|
2451d6bed2 | ||
|
|
c547de875a | ||
|
|
ffead783aa | ||
|
|
d742c7d333 | ||
|
|
1025cd3535 | ||
|
|
de402ea724 | ||
|
|
3af07a42d6 | ||
|
|
e5b7e99cce | ||
|
|
365936bf57 | ||
|
|
2b7562f546 | ||
|
|
e7f4e312b9 | ||
|
|
98d3870477 | ||
|
|
b1ceb2e53d | ||
|
|
075d2468ea | ||
|
|
8b9e7aef4a | ||
|
|
15e499c1e9 | ||
|
|
55ccb9fe61 | ||
|
|
a5816f1dc9 | ||
|
|
95a613f59f | ||
|
|
6777941dee | ||
|
|
e55128b7fa | ||
|
|
9ac11002f8 | ||
|
|
1cc7bfb4a9 | ||
|
|
e59534e54f | ||
|
|
8c2368c1d2 | ||
|
|
8e8f181cae | ||
|
|
2fcab77565 | ||
|
|
d29f0c6c31 | ||
|
|
79f1b1458b | ||
|
|
b279ee6b82 | ||
|
|
c64a58d814 | ||
|
|
57c60ab3f8 | ||
|
|
e37d90d6e1 | ||
|
|
22055ed99a | ||
|
|
e263331b94 | ||
|
|
eb3d613e3d | ||
|
|
cc23444776 | ||
|
|
1931d3f262 | ||
|
|
79cbbbdf0a | ||
|
|
38cd785aa3 | ||
|
|
dabec3f87a | ||
|
|
6c94cb2bdf | ||
|
|
f67bdf0c22 | ||
|
|
6c51b31270 | ||
|
|
ef6e342737 | ||
|
|
ac0ef98dde | ||
|
|
523775e56b | ||
|
|
b6e741a150 | ||
|
|
54357fbe2b | ||
|
|
040dda5bec | ||
|
|
77b4d58fb8 | ||
|
|
0c9e551492 | ||
|
|
2ba1e2e22e | ||
|
|
d8a08a6c0c | ||
|
|
2c92226f88 | ||
|
|
cd9cb9b9c9 | ||
|
|
b2777055bc | ||
|
|
c8673b60bb | ||
|
|
21975dff2d | ||
|
|
6ab14185e0 | ||
|
|
1f70646952 | ||
|
|
c90ed9e873 | ||
|
|
e4ee07d36b | ||
|
|
8fb3e78554 | ||
|
|
01ab004876 | ||
|
|
6205eac51c | ||
|
|
d9a5418029 | ||
|
|
74a8e61f3e | ||
|
|
e18472f1a3 | ||
|
|
e3dea80cb7 | ||
|
|
50947f4ddc | ||
|
|
d302bc07b3 | ||
|
|
c6df20e565 | ||
|
|
6f9a1321d1 | ||
|
|
eb4eb31578 | ||
|
|
f8f5fcfca2 | ||
|
|
4e7b654090 | ||
|
|
e8059d3676 | ||
|
|
ffadc6721b | ||
|
|
e2e774d215 | ||
|
|
f23d3678fb | ||
|
|
dfade50bd8 | ||
|
|
d25b5f4f2a | ||
|
|
9a17bc74b0 | ||
|
|
015605526d | ||
|
|
099896dc96 | ||
|
|
aa1bc6fa8e | ||
|
|
f27a429fc5 | ||
|
|
f4587d0ae5 | ||
|
|
41bae1e636 | ||
|
|
5295fd08d4 | ||
|
|
36fdf05d2b | ||
|
|
5794dbc0a6 | ||
|
|
c10474db69 | ||
|
|
d68309fd44 | ||
|
|
1c634756a0 | ||
|
|
ae536550c3 | ||
|
|
63d5d70314 | ||
|
|
0be73600e5 | ||
|
|
c9cc064f51 | ||
|
|
dc47eb5ae4 | ||
|
|
955d9db699 | ||
|
|
3c1549e288 | ||
|
|
9fd030b6c3 | ||
|
|
63a10691b3 | ||
|
|
5674673c5d | ||
|
|
74f29e3dc3 | ||
|
|
1dac8593ae | ||
|
|
71fd123be1 | ||
|
|
d4d66cad2e | ||
|
|
c78a6ec047 | ||
|
|
1ae3198b10 | ||
|
|
a6c172b1ab | ||
|
|
9e9d68f841 | ||
|
|
123e6b90a3 | ||
|
|
00b4a6caf5 | ||
|
|
8642e20d19 | ||
|
|
2b81f7ef7a | ||
|
|
c08e83e5d4 | ||
|
|
863ee5c172 | ||
|
|
a91f372fbd | ||
|
|
825acd5b46 | ||
|
|
70e64e648f | ||
|
|
7855e89ca9 | ||
|
|
75273abda7 | ||
|
|
02b278ecff | ||
|
|
e43d7b7a59 | ||
|
|
61f321a04d | ||
|
|
7885b00213 | ||
|
|
2ad882b7c2 | ||
|
|
2546809013 | ||
|
|
4fcf3e11cd | ||
|
|
1f6cd6f4e9 | ||
|
|
5c1ce232db | ||
|
|
172e9e212b | ||
|
|
279a16c256 | ||
|
|
e772cdff3c | ||
|
|
8881827f9d | ||
|
|
d9579901fe | ||
|
|
682d78698f | ||
|
|
2cc8567c2f | ||
|
|
184a214bff | ||
|
|
c6376541ed | ||
|
|
6aca579854 | ||
|
|
15bc6cf884 | ||
|
|
895dde74dd | ||
|
|
c477d20a05 | ||
|
|
2fdb1700e5 | ||
|
|
11764e1ba5 | ||
|
|
3212e23f43 | ||
|
|
84a58f2bb1 | ||
|
|
191396c78a | ||
|
|
956a64c692 | ||
|
|
6f9a8d5afe | ||
|
|
9424d061fa | ||
|
|
3db8e47679 | ||
|
|
5602741550 | ||
|
|
1ef3f540c2 | ||
|
|
51846895d5 | ||
|
|
551542c99c | ||
|
|
ab13ddec48 | ||
|
|
2d1792c6de | ||
|
|
3aedb7e82d | ||
|
|
a9c9f0272a | ||
|
|
8606427e8c | ||
|
|
3d3d22dc06 | ||
|
|
23a3a5cf74 | ||
|
|
0f5410d225 | ||
|
|
1b7be836ef | ||
|
|
66e7223db9 | ||
|
|
d801b811d4 | ||
|
|
307029272e | ||
|
|
9aa3caab16 | ||
|
|
b47a4525dc | ||
|
|
38ab0d9ca0 | ||
|
|
38985671c6 | ||
|
|
d1c2a69820 | ||
|
|
3a1b9fedd1 | ||
|
|
8119ba75fc | ||
|
|
be4c22012e | ||
|
|
60fef48cf0 | ||
|
|
bb72ea0fc0 | ||
|
|
af48fed3c2 | ||
|
|
ce3fa94708 | ||
|
|
7f9f4ae740 | ||
|
|
8bec6f2b28 | ||
|
|
b397363c9d | ||
|
|
acb800b505 | ||
|
|
ec37af2f18 | ||
|
|
d2b030e698 | ||
|
|
c6f496f2a5 | ||
|
|
722e1929f1 | ||
|
|
f9a20ec443 | ||
|
|
f5568d4874 | ||
|
|
87bbe4ee12 | ||
|
|
a034b03c1d | ||
|
|
470f4e4db7 | ||
|
|
9428efd8c0 | ||
|
|
bf4d91b68b | ||
|
|
781155b029 | ||
|
|
3caf0ac529 | ||
|
|
7d25228e55 | ||
|
|
4fb099912e | ||
|
|
b3350b54b3 | ||
|
|
cd4e0374d0 | ||
|
|
5d2084fda4 | ||
|
|
8c32fa3e6c | ||
|
|
fef13211a0 | ||
|
|
5ff5b0a5ad | ||
|
|
8ac9d022b6 | ||
|
|
2c02dc07e9 | ||
|
|
ba999c516a | ||
|
|
28303ffa82 | ||
|
|
1f9a3aa51a | ||
|
|
656dda234c | ||
|
|
63b62f4074 | ||
|
|
158180a052 | ||
|
|
dbe479e920 | ||
|
|
7aefa34871 | ||
|
|
7d92436b92 | ||
|
|
66a070c239 | ||
|
|
bb9d9042f0 | ||
|
|
a5d86d4c00 | ||
|
|
e867deb547 | ||
|
|
af15659d99 | ||
|
|
f63658db9e | ||
|
|
d4edf2f874 | ||
|
|
94f7d78cc9 | ||
|
|
5cede39e5c | ||
|
|
508ac2ae84 | ||
|
|
997b820a42 | ||
|
|
5de83985e3 | ||
|
|
c0220dbed0 | ||
|
|
2e9305b9b1 | ||
|
|
b18bdea1c9 | ||
|
|
25fb431163 | ||
|
|
ac43f00273 | ||
|
|
8ccf1fcbf3 | ||
|
|
b2803f574b | ||
|
|
bbc14bb723 | ||
|
|
e89311d5d4 | ||
|
|
b5e56c6b65 | ||
|
|
3d2023858c | ||
|
|
74b48a18be | ||
|
|
42f61f60fb | ||
|
|
e32a11910e | ||
|
|
dc9fdf897b | ||
|
|
35c946a064 | ||
|
|
747a0c45ee | ||
|
|
8e03b24b0c | ||
|
|
18c65c3096 | ||
|
|
3b306f990a | ||
|
|
92fa6552b1 | ||
|
|
a39dc33770 | ||
|
|
0a42d4942c | ||
|
|
8086d5cecb | ||
|
|
a6875614f6 | ||
|
|
6b061fa327 | ||
|
|
b416e6b6f1 | ||
|
|
ac1f49f8dd | ||
|
|
6ddee2649d | ||
|
|
fd14f53cb9 | ||
|
|
029e2210f5 | ||
|
|
69769e6203 | ||
|
|
2a21f194d3 | ||
|
|
e46d8c5812 | ||
|
|
938605a169 | ||
|
|
c3cc26a136 | ||
|
|
dda83b6307 | ||
|
|
48e2e01a57 | ||
|
|
d6b00967ca | ||
|
|
6d4c1f8e79 | ||
|
|
e88fe0ac2f | ||
|
|
496c0b50b4 | ||
|
|
9d73d74c63 | ||
|
|
7e4e12107a | ||
|
|
5b15de91e6 | ||
|
|
98b3dc9d7d | ||
|
|
c05e610b13 | ||
|
|
63f9368e26 | ||
|
|
3f47a6e701 | ||
|
|
d7c9b3b192 | ||
|
|
063ed23acb | ||
|
|
7c33dd9026 | ||
|
|
a853d8c869 | ||
|
|
4ddeb81972 | ||
|
|
4dd9f00637 | ||
|
|
49f3779fd2 | ||
|
|
7389aad122 | ||
|
|
bf095c677c | ||
|
|
fb929687d8 | ||
|
|
bddcf76fc3 | ||
|
|
9370bdb5ac | ||
|
|
ef6d8bb17b | ||
|
|
99c2eb04c9 | ||
|
|
d83b673c90 | ||
|
|
7498f3f66b | ||
|
|
147eda529c | ||
|
|
c1f0da4248 | ||
|
|
8656dada06 | ||
|
|
217d780ed1 | ||
|
|
fe62dc18fa | ||
|
|
d0e95903c9 | ||
|
|
1ec7f519c6 | ||
|
|
450e8b18cf | ||
|
|
bb882286aa | ||
|
|
d9bbde9e50 | ||
|
|
29746d1b32 | ||
|
|
5f211961ae | ||
|
|
91d364b18b | ||
|
|
f1677f5a67 | ||
|
|
fd270263f4 | ||
|
|
81c1e90e54 | ||
|
|
3b737184ea | ||
|
|
4779bffceb | ||
|
|
4209ee4486 | ||
|
|
6ca352bf85 | ||
|
|
a4d77a1cc2 | ||
|
|
b9367abfb9 | ||
|
|
a6062897d5 | ||
|
|
1afe84ed02 | ||
|
|
388458f759 | ||
|
|
512ff23f19 | ||
|
|
45a32ff255 | ||
|
|
e4e2d76f75 | ||
|
|
282e196534 | ||
|
|
e4fbd3cf86 | ||
|
|
402931862f | ||
|
|
a70e2635ab | ||
|
|
8c9ae38017 | ||
|
|
3920076bd9 | ||
|
|
55cbf572e0 | ||
|
|
c4bd4734a5 | ||
|
|
e7810febd6 | ||
|
|
0bc9e85734 | ||
|
|
4d85ae5fa6 | ||
|
|
a7342d6ef2 | ||
|
|
5b0fccd19a | ||
|
|
ebbfed711c | ||
|
|
d631888d09 | ||
|
|
afd62e8539 | ||
|
|
4aca66c417 | ||
|
|
944463e9a8 | ||
|
|
cf4274afdc | ||
|
|
102f7c316d | ||
|
|
ffc81ea85a | ||
|
|
02d22ba63f | ||
|
|
51e98623c9 | ||
|
|
8e94170fed | ||
|
|
42cee513e0 | ||
|
|
2c18382f46 | ||
|
|
3773412139 | ||
|
|
e17bbdd6a7 | ||
|
|
82a0f3a770 | ||
|
|
11e16abe64 | ||
|
|
6db79f4b7b | ||
|
|
977a4be3c1 | ||
|
|
51ae668154 | ||
|
|
c6fe487e46 | ||
|
|
ec4533e7de | ||
|
|
3b73de32ad | ||
|
|
da5668ac27 | ||
|
|
c1039fb7f2 | ||
|
|
c82d6838c5 | ||
|
|
c40c7b57cb | ||
|
|
009237a35a | ||
|
|
f4f6f65b4c | ||
|
|
313a8a3380 | ||
|
|
f686e7cbc4 | ||
|
|
7fa39687b5 | ||
|
|
9d84120181 | ||
|
|
3be0dab8a3 | ||
|
|
3a9275d5fa | ||
|
|
6296aa04c6 | ||
|
|
cfe9e94e16 | ||
|
|
902d329e78 | ||
|
|
62f59eb1c3 | ||
|
|
a7d4c4ebec | ||
|
|
0ca96621d4 | ||
|
|
7ea179c2da | ||
|
|
6982396572 | ||
|
|
36c4fbfeee | ||
|
|
868c6f47a0 | ||
|
|
74695ab276 | ||
|
|
cb74d8d51b | ||
|
|
eaa620b081 | ||
|
|
18ab07ec4f | ||
|
|
e86bc9a8db | ||
|
|
75837c87b4 | ||
|
|
9a73095a8f | ||
|
|
9242bf6482 | ||
|
|
f552a0ac36 | ||
|
|
141e2f61eb | ||
|
|
b6d7b319f2 | ||
|
|
4cdc6c80ec | ||
|
|
cee9d7ffb0 | ||
|
|
3f48bdb216 | ||
|
|
2cef8dcea4 | ||
|
|
c327936db1 | ||
|
|
1b53cd4ca8 | ||
|
|
08f9f6f8e5 | ||
|
|
fb6b2729c6 | ||
|
|
aa55a18ed8 | ||
|
|
6c74c64b29 | ||
|
|
fddbf34684 | ||
|
|
ea878bba73 | ||
|
|
db002ec915 | ||
|
|
606d3c1717 | ||
|
|
b0fbb39cd3 | ||
|
|
2478d26c59 | ||
|
|
e072620f9b | ||
|
|
dd3419bf52 | ||
|
|
f12e70ef5d | ||
|
|
2836207850 | ||
|
|
4253b48bba | ||
|
|
ff36b65af4 | ||
|
|
1ef4803954 | ||
|
|
08ebbee328 | ||
|
|
d8e4144d46 | ||
|
|
0b1819576d | ||
|
|
6ce33754a8 | ||
|
|
21e0808a86 | ||
|
|
3480182473 | ||
|
|
e516158294 | ||
|
|
c8ee0af152 | ||
|
|
3b82d2a1ee | ||
|
|
274fd526b7 | ||
|
|
86b0e01d9d | ||
|
|
c06ba18023 | ||
|
|
f462591e9c | ||
|
|
da23b8e6d9 | ||
|
|
a1799f5b4b | ||
|
|
34496f6a00 | ||
|
|
5d8208a061 | ||
|
|
f94e60c53c | ||
|
|
dd70be51b3 | ||
|
|
12e1a6a855 | ||
|
|
07648367c1 | ||
|
|
5b86ca38e0 | ||
|
|
79d9d9dfc2 | ||
|
|
e667477f4b | ||
|
|
0367149386 | ||
|
|
3d0ce2add4 | ||
|
|
17224b8920 | ||
|
|
05d125c762 | ||
|
|
e1a268b21d | ||
|
|
c486e8a354 | ||
|
|
eba74d91b3 | ||
|
|
613f8c2b57 | ||
|
|
16e2ad64a2 | ||
|
|
3274895dcf | ||
|
|
7367d47d27 | ||
|
|
4ed2a03222 | ||
|
|
586df4627a | ||
|
|
25181b6c27 | ||
|
|
72e6b9b188 | ||
|
|
e2efa20582 | ||
|
|
2cebb1beca | ||
|
|
fb24a699e6 | ||
|
|
1c16a0a69f | ||
|
|
26e480f242 | ||
|
|
fcf864156d | ||
|
|
d773391763 | ||
|
|
b47d63330e | ||
|
|
026ed1eb42 | ||
|
|
fb80724a96 | ||
|
|
a7ab866e95 | ||
|
|
06f636c9aa | ||
|
|
bbc5b8b731 | ||
|
|
cd154b13a9 | ||
|
|
f71a8a1603 | ||
|
|
d2ecae7e97 | ||
|
|
649e7b1912 | ||
|
|
2a97b0a9de | ||
|
|
5ca02a1dcf | ||
|
|
f088cec4d5 | ||
|
|
dde40064d2 | ||
|
|
597000ce52 | ||
|
|
4597cb26a1 | ||
|
|
e16ab09253 | ||
|
|
595be6f470 | ||
|
|
7afe9ac878 | ||
|
|
1f53b64b08 | ||
|
|
49ca336dd6 | ||
|
|
7cabb54c4e | ||
|
|
f55841f41c | ||
|
|
8983cb6186 | ||
|
|
222181baff | ||
|
|
02c002bda6 | ||
|
|
a5fbd01ea5 | ||
|
|
3652e07988 | ||
|
|
6ed000985c | ||
|
|
4a8b524a7c | ||
|
|
39509ad9a8 | ||
|
|
f977a2488d | ||
|
|
e7b1aadb0e | ||
|
|
339b085db7 | ||
|
|
a7c00900d8 | ||
|
|
99023569fc | ||
|
|
e4478da423 | ||
|
|
d0bb9165bf | ||
|
|
72a0e0200e | ||
|
|
5d83f21a26 | ||
|
|
56936aa6cd | ||
|
|
f4a649dc2f | ||
|
|
464ca8d272 | ||
|
|
7897bdabc4 | ||
|
|
3675c2f3f3 | ||
|
|
4eb264bea4 | ||
|
|
129e864975 | ||
|
|
7f05c1ef33 | ||
|
|
97d6d9c69f | ||
|
|
8937acee13 | ||
|
|
7518c5fe95 | ||
|
|
45fbb9f010 | ||
|
|
eff55da020 | ||
|
|
e87bf0b3fc | ||
|
|
3f141346fa | ||
|
|
34b39f6eb8 | ||
|
|
b8fd8ee0d9 | ||
|
|
b8895f215c | ||
|
|
c4b3efeb9d | ||
|
|
8f0c84c2a5 | ||
|
|
90b9c53420 | ||
|
|
46f9f4f561 | ||
|
|
de265a19b2 | ||
|
|
8af6868694 | ||
|
|
b1dde54e38 | ||
|
|
0a6163c89b | ||
|
|
07d0b37692 | ||
|
|
ac9881dd4c | ||
|
|
280c1b4fea | ||
|
|
6b24ee23e6 | ||
|
|
d93f8c5e6e | ||
|
|
384f065040 | ||
|
|
672fedc7e5 | ||
|
|
0433a26a07 | ||
|
|
4ebd4bddee | ||
|
|
030ab743f3 | ||
|
|
d4623a68dd | ||
|
|
a38d1c96d8 | ||
|
|
61ddf89fdd | ||
|
|
5c7d9b4ffe | ||
|
|
563ea985a4 | ||
|
|
657b2ddc8a | ||
|
|
50221c2ace | ||
|
|
b0bf3be707 | ||
|
|
caaf05897a | ||
|
|
0354b11ddb | ||
|
|
bdcf9b075e | ||
|
|
ab77aa2b5b | ||
|
|
1d54dcc95c | ||
|
|
0138d481a6 | ||
|
|
ba6cdc6e10 | ||
|
|
389d9c652f | ||
|
|
4942c6c206 | ||
|
|
40e264e0d4 | ||
|
|
b73b851245 | ||
|
|
49a777e2d8 | ||
|
|
7df43aeb59 | ||
|
|
86047c48e4 | ||
|
|
6000a206a8 | ||
|
|
da75f050e2 | ||
|
|
7ed81996b8 | ||
|
|
2040f8f3b0 | ||
|
|
c216726449 | ||
|
|
a33b17d5da | ||
|
|
58c994a3e2 | ||
|
|
98d01556c2 | ||
|
|
fd21e8de14 | ||
|
|
37ef2059f1 | ||
|
|
41c49ca95f | ||
|
|
1999f102bf | ||
|
|
aa91bb88bc | ||
|
|
7410a41331 | ||
|
|
a987370657 | ||
|
|
1883b05f26 | ||
|
|
c408619042 | ||
|
|
1181b13c83 | ||
|
|
c1aef03f09 | ||
|
|
6609871b1e | ||
|
|
813f1718fb | ||
|
|
49bcc14df7 | ||
|
|
28108a1c02 | ||
|
|
c169dfa395 | ||
|
|
3b26a692b6 | ||
|
|
9a6b51b092 | ||
|
|
c3121fcd38 | ||
|
|
7e8581a7de | ||
|
|
0ba83d1353 | ||
|
|
a302e100ec | ||
|
|
4f58fd492d | ||
|
|
0b06a4fac6 | ||
|
|
4e1a7bf42c | ||
|
|
ef2fb1c62e | ||
|
|
f5fcbcd87a | ||
|
|
986bffaf2b | ||
|
|
766a2a0546 | ||
|
|
291b594ad9 | ||
|
|
7742e3da38 | ||
|
|
c5f70eae4c | ||
|
|
8bdf02c4c0 | ||
|
|
8abe132c25 | ||
|
|
3a447b02a1 | ||
|
|
aa718eef88 | ||
|
|
60b1c9ba32 | ||
|
|
9b50581fd4 | ||
|
|
ee33fdab89 | ||
|
|
c8f19467ba | ||
|
|
1fc0f1c71b | ||
|
|
2258ba108d | ||
|
|
d21f4ffae6 | ||
|
|
4bd9c4c0fc | ||
|
|
29165f0f6f | ||
|
|
f75b786916 | ||
|
|
011914339e | ||
|
|
08a07214ef | ||
|
|
f682f07dbc | ||
|
|
50e99f1f4c | ||
|
|
feabc488fe | ||
|
|
72d3f5071b | ||
|
|
27dc662430 | ||
|
|
80e233c4a6 | ||
|
|
a099308a82 | ||
|
|
6f0673f184 | ||
|
|
b428e699db | ||
|
|
f4334eadc0 | ||
|
|
a2a6503030 | ||
|
|
9c22005b79 | ||
|
|
7448953b7d | ||
|
|
18214095ab | ||
|
|
bcfc78e510 | ||
|
|
cc6b506176 | ||
|
|
c61828fb39 | ||
|
|
23876ed186 | ||
|
|
ac4962cf19 | ||
|
|
d9e7c8d880 | ||
|
|
ea25b800d2 | ||
|
|
7ba06e73d7 | ||
|
|
39cf26628f | ||
|
|
ea7f324a9d | ||
|
|
789d451ea2 | ||
|
|
7313f3d591 | ||
|
|
1662546bef | ||
|
|
53f75086ec | ||
|
|
81fcc61ec9 | ||
|
|
324a47966b | ||
|
|
5a0c50b9a2 | ||
|
|
66465beb39 | ||
|
|
c5d403f10a | ||
|
|
598098c2ed | ||
|
|
bff1a8ad60 | ||
|
|
592e315f21 | ||
|
|
76933bc6ef | ||
|
|
0dc312db64 | ||
|
|
4deb92e715 | ||
|
|
bc95e47b92 | ||
|
|
f2335d313c | ||
|
|
4c287f4a2d | ||
|
|
0a6e1c275b | ||
|
|
ff2dc05e7f | ||
|
|
f62ce085bf | ||
|
|
29306827ba | ||
|
|
222d07175a | ||
|
|
663196c3d9 | ||
|
|
df839714a3 | ||
|
|
dcb004e983 | ||
|
|
cee0604efc | ||
|
|
dfbd364f60 | ||
|
|
339d6732d7 | ||
|
|
b0dbfb4c7c | ||
|
|
021603d25d | ||
|
|
a875e1ec5c | ||
|
|
5c5904216b | ||
|
|
1dae294d76 | ||
|
|
acbb151b15 | ||
|
|
a1311a2a0d | ||
|
|
bc8d564ce8 | ||
|
|
97cdf7bc78 | ||
|
|
ce69b4de01 | ||
|
|
e880df8142 | ||
|
|
a35ca87778 | ||
|
|
5a34e2d380 | ||
|
|
abf3247c50 | ||
|
|
8663ed129d | ||
|
|
c0a0f4c801 | ||
|
|
e84aa49003 | ||
|
|
6f45b90520 | ||
|
|
0685984a80 | ||
|
|
5f33c083bf | ||
|
|
ab0e0f3f43 | ||
|
|
6b62b84157 | ||
|
|
fd9627576b | ||
|
|
39f334f3a2 | ||
|
|
ca84909716 | ||
|
|
283609cf2d | ||
|
|
9591409fe2 | ||
|
|
9cf52ccc97 | ||
|
|
261cb2061b | ||
|
|
f45af6e0cc | ||
|
|
c752ea4959 | ||
|
|
b2b578a5f0 | ||
|
|
47e60bfdcb | ||
|
|
780b6cdec9 | ||
|
|
0a5b13a418 | ||
|
|
ebdc3f05de | ||
|
|
aad79077bf | ||
|
|
00b25b39c5 | ||
|
|
dd6a709053 | ||
|
|
99b04e3635 | ||
|
|
2e06b78409 | ||
|
|
c7d603e142 | ||
|
|
4fcf845934 | ||
|
|
83cefb2a72 | ||
|
|
7ab40996e0 | ||
|
|
bbe4d49947 | ||
|
|
b6fbacc992 | ||
|
|
89491eac56 | ||
|
|
acf27693b2 | ||
|
|
5fd9d20f99 | ||
|
|
fd9c421969 | ||
|
|
f5bae6d75c | ||
|
|
4ac8bc7bd2 | ||
|
|
ec81d0d2c3 | ||
|
|
815b633fb8 | ||
|
|
c69c76f97d | ||
|
|
75197db3e6 | ||
|
|
d09d686378 | ||
|
|
d6f16cf700 | ||
|
|
536a5fc1a0 | ||
|
|
a07df9d7fe | ||
|
|
e9c195c778 | ||
|
|
0637ca308b | ||
|
|
fd1e0e72a0 | ||
|
|
34b80373c7 | ||
|
|
1ade1b8d8b | ||
|
|
19fa30fb96 | ||
|
|
efe7815a7e | ||
|
|
e9b4ff1932 | ||
|
|
0dca3fc997 | ||
|
|
4e6ebb53ac | ||
|
|
83ed835c9e | ||
|
|
7bcc897379 | ||
|
|
cd2109fefe | ||
|
|
d337c4726d | ||
|
|
356e6a4ef6 | ||
|
|
037da3a7fd | ||
|
|
18462296ae | ||
|
|
1d76e54b0d | ||
|
|
22c903f555 | ||
|
|
6d4d53e2c7 | ||
|
|
6b81ae1b7b | ||
|
|
5b62a0f2b3 | ||
|
|
137465683a | ||
|
|
6be7b4a75a | ||
|
|
58ca377418 | ||
|
|
b173e808c7 | ||
|
|
ec44ba9335 | ||
|
|
f54ac59ff7 | ||
|
|
db44204c1a | ||
|
|
ec01aef71a | ||
|
|
b706774b5b | ||
|
|
9eee2d6b6f | ||
|
|
c9d4e2a4b5 | ||
|
|
4c4df5cbb0 | ||
|
|
cb69128838 | ||
|
|
81af207dc5 | ||
|
|
5e9c43fc71 | ||
|
|
fb44e3c1e2 | ||
|
|
7e23ae126a | ||
|
|
7e229c05e7 | ||
|
|
764fc8fec4 | ||
|
|
ad17918c84 | ||
|
|
d7013727b9 | ||
|
|
6a8bd11fc9 | ||
|
|
4df0c3e461 | ||
|
|
f8f47b51e9 | ||
|
|
b735178fcd | ||
|
|
1759c2c81e | ||
|
|
2be7054b40 | ||
|
|
c77d2f7dd6 | ||
|
|
3256ac9f44 | ||
|
|
b156ef9476 | ||
|
|
c49c16cbb5 | ||
|
|
2b7ec9ffe1 | ||
|
|
c2ad006a19 | ||
|
|
c12bab477c | ||
|
|
fe39545cf6 | ||
|
|
39d3b819fb | ||
|
|
04a0e15899 | ||
|
|
3dc81d85e9 | ||
|
|
5a8ddde495 | ||
|
|
4e6f872c02 | ||
|
|
e76836f394 |
@@ -6,6 +6,7 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
generic_handler:
|
generic_handler:
|
||||||
name: Add Labels to PR
|
name: Add Labels to PR
|
||||||
|
if: github.repository == '1Panel-dev/1Panel'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|||||||
+27
-3
@@ -1,33 +1,43 @@
|
|||||||
name: Create Release And Upload Cloudflare R2
|
name: Build And Publish (OSS + R2)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- 'v*'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-release:
|
create-release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '20.2'
|
node-version: '22.19.0'
|
||||||
|
|
||||||
- name: Build Web
|
- name: Build Web
|
||||||
run: |
|
run: |
|
||||||
cd frontend && npm install && npm run build:pro
|
cd frontend && npm install && npm run build:pro
|
||||||
env:
|
env:
|
||||||
NODE_OPTIONS: --max-old-space-size=8192
|
NODE_OPTIONS: --max-old-space-size=8192
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '1.23'
|
go-version: '1.24'
|
||||||
|
cache-dependency-path: |
|
||||||
|
core/go.sum
|
||||||
|
agent/go.sum
|
||||||
|
|
||||||
- name: Build Release
|
- name: Build Release
|
||||||
uses: goreleaser/goreleaser-action@v6
|
uses: goreleaser/goreleaser-action@v6
|
||||||
with:
|
with:
|
||||||
distribution: goreleaser
|
distribution: goreleaser
|
||||||
version: '~> v2'
|
version: '~> v2'
|
||||||
args: release --skip=publish --clean
|
args: release --skip=publish --clean
|
||||||
|
|
||||||
- name: Upload Assets
|
- name: Upload Assets
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
@@ -36,10 +46,24 @@ jobs:
|
|||||||
files: |
|
files: |
|
||||||
dist/*.tar.gz
|
dist/*.tar.gz
|
||||||
dist/checksums.txt
|
dist/checksums.txt
|
||||||
|
|
||||||
|
- name: Setup OSSUTIL
|
||||||
|
uses: yizhoumo/setup-ossutil@v2
|
||||||
|
with:
|
||||||
|
endpoint: ${{ secrets.OSS_ENDPOINT }}
|
||||||
|
access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
|
||||||
|
access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
|
||||||
|
ossutil-version: '1.7.18'
|
||||||
|
|
||||||
|
- name: Upload Assets to OSS
|
||||||
|
run: |
|
||||||
|
ossutil cp -r dist/ oss://resource-fit2cloud-com/1panel/package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --only-current-dir --force
|
||||||
|
|
||||||
- name: Setup Rclone
|
- name: Setup Rclone
|
||||||
uses: AnimMouse/setup-rclone@v1
|
uses: AnimMouse/setup-rclone@v1
|
||||||
with:
|
with:
|
||||||
rclone_config: ${{ secrets.RCLONE_CONFIG }}
|
rclone_config: ${{ secrets.RCLONE_CONFIG }}
|
||||||
|
|
||||||
- name: Upload to Cloudflare R2
|
- name: Upload to Cloudflare R2
|
||||||
run: |
|
run: |
|
||||||
rclone copy dist/ cloudflare_r2:package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --progress
|
rclone copy dist/ cloudflare_r2:package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --progress
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
name: Create Release And Upload assets
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
jobs:
|
|
||||||
create-release:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout Code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20.2'
|
|
||||||
- name: Build Web
|
|
||||||
run: |
|
|
||||||
cd frontend && npm install && npm run build:pro
|
|
||||||
env:
|
|
||||||
NODE_OPTIONS: --max-old-space-size=8192
|
|
||||||
- name: Setup Go
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '1.23'
|
|
||||||
- name: Build Release
|
|
||||||
uses: goreleaser/goreleaser-action@v6
|
|
||||||
with:
|
|
||||||
distribution: goreleaser
|
|
||||||
version: '~> v2'
|
|
||||||
args: release --skip=publish --clean
|
|
||||||
- name: Upload Assets
|
|
||||||
uses: softprops/action-gh-release@v1
|
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
|
||||||
with:
|
|
||||||
draft: true
|
|
||||||
files: |
|
|
||||||
dist/*.tar.gz
|
|
||||||
dist/checksums.txt
|
|
||||||
- name: Setup OSSUTIL
|
|
||||||
uses: yizhoumo/setup-ossutil@v2
|
|
||||||
with:
|
|
||||||
endpoint: ${{ secrets.OSS_ENDPOINT }}
|
|
||||||
access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
|
|
||||||
access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
|
|
||||||
ossutil-version: '1.7.18'
|
|
||||||
- name: Upload Assets to OSS
|
|
||||||
run: ossutil cp -r dist/ oss://resource-fit2cloud-com/1panel/package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --only-current-dir --force
|
|
||||||
@@ -8,6 +8,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
sonarcloud:
|
sonarcloud:
|
||||||
name: SonarCloud
|
name: SonarCloud
|
||||||
|
if: github.repository == '1Panel-dev/1Panel'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ name: Synchronize to Gitee
|
|||||||
on: [push]
|
on: [push]
|
||||||
jobs:
|
jobs:
|
||||||
repo-sync:
|
repo-sync:
|
||||||
|
if: github.repository == '1Panel-dev/1Panel'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Mirror the Github organization repos to Gitee.
|
- name: Mirror the Github organization repos to Gitee.
|
||||||
|
|||||||
+13
-2
@@ -44,12 +44,17 @@ frontend/src/xpack
|
|||||||
agent/xpack
|
agent/xpack
|
||||||
agent/router/entry_xpack.go
|
agent/router/entry_xpack.go
|
||||||
agent/server/init_xpack.go
|
agent/server/init_xpack.go
|
||||||
|
agent/utils/xpack/xpack.go
|
||||||
agent/utils/xpack/xpack_xpack.go
|
agent/utils/xpack/xpack_xpack.go
|
||||||
core/xpack
|
core/xpack
|
||||||
core/router/entry_xpack.go
|
core/router/entry_xpack.go
|
||||||
core/server/init_xpack.go
|
core/server/init_xpack.go
|
||||||
|
core/utils/xpack/xpack.go
|
||||||
core/utils/xpack/xpack_xpack.go
|
core/utils/xpack/xpack_xpack.go
|
||||||
xpack
|
core/xpack-ee
|
||||||
|
core/router/entry_xpackee.go
|
||||||
|
core/server/init_xpackee.go
|
||||||
|
core/utils/xpack/xpack_xpackee.go
|
||||||
|
|
||||||
.history/
|
.history/
|
||||||
dist/
|
dist/
|
||||||
@@ -62,4 +67,10 @@ cmd/server/fileList.txt
|
|||||||
1Panel.code-workspace
|
1Panel.code-workspace
|
||||||
|
|
||||||
core/.golangci.yml
|
core/.golangci.yml
|
||||||
agent/.golangci.yml
|
agent/.golangci.yml
|
||||||
|
|
||||||
|
.opencode
|
||||||
|
openspec
|
||||||
|
CLAUDE.md
|
||||||
|
AGENTS.md
|
||||||
|
opencode.json
|
||||||
+5
-8
@@ -32,9 +32,7 @@ builds:
|
|||||||
- arm
|
- arm
|
||||||
- ppc64le
|
- ppc64le
|
||||||
- s390x
|
- s390x
|
||||||
hooks:
|
- riscv64
|
||||||
post:
|
|
||||||
- ./ci/script.sh compress_binary {{ .Path }} {{ .Arch }}
|
|
||||||
|
|
||||||
- id: core
|
- id: core
|
||||||
dir: core
|
dir: core
|
||||||
@@ -57,9 +55,7 @@ builds:
|
|||||||
- arm
|
- arm
|
||||||
- ppc64le
|
- ppc64le
|
||||||
- s390x
|
- s390x
|
||||||
hooks:
|
- riscv64
|
||||||
post:
|
|
||||||
- ./ci/script.sh compress_binary {{ .Path }} {{ .Arch }}
|
|
||||||
|
|
||||||
archives:
|
archives:
|
||||||
- formats: [ 'tar.gz' ]
|
- formats: [ 'tar.gz' ]
|
||||||
@@ -68,11 +64,12 @@ archives:
|
|||||||
wrap_in_directory: true
|
wrap_in_directory: true
|
||||||
files:
|
files:
|
||||||
- 1pctl
|
- 1pctl
|
||||||
|
- install.sh
|
||||||
- 1panel-core.service
|
- 1panel-core.service
|
||||||
- 1panel-agent.service
|
- 1panel-agent.service
|
||||||
- install.sh
|
- initscript/*
|
||||||
- GeoIP.mmdb
|
|
||||||
- lang/*
|
- lang/*
|
||||||
|
- GeoIP.mmdb
|
||||||
|
|
||||||
checksum:
|
checksum:
|
||||||
name_template: 'checksums.txt'
|
name_template: 'checksums.txt'
|
||||||
|
|||||||
@@ -30,20 +30,20 @@ build_frontend:
|
|||||||
|
|
||||||
build_core_on_linux:
|
build_core_on_linux:
|
||||||
cd $(CORE_PATH) \
|
cd $(CORE_PATH) \
|
||||||
&& GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)
|
&& CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)
|
||||||
|
|
||||||
build_agent_on_linux:
|
build_agent_on_linux:
|
||||||
cd $(AGENT_PATH) \
|
cd $(AGENT_PATH) \
|
||||||
&& GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)
|
&& CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)
|
||||||
|
|
||||||
build_core_on_darwin:
|
build_core_on_darwin:
|
||||||
cd $(CORE_PATH) \
|
cd $(CORE_PATH) \
|
||||||
&& GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)
|
&& CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)
|
||||||
|
|
||||||
build_agent_on_darwin:
|
build_agent_on_darwin:
|
||||||
cd $(AGENT_PATH) \
|
cd $(AGENT_PATH) \
|
||||||
&& GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)
|
&& CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)
|
||||||
|
|
||||||
build_all: build_frontend build_core_on_linux build_agent_on_linux
|
build_all: build_frontend build_core_on_linux build_agent_on_linux
|
||||||
|
|
||||||
build_on_local: clean_assets build_frontend build_core_on_darwin build_agent_on_darwin upx_bin
|
build_on_local: clean_assets build_frontend build_core_on_darwin build_agent_on_darwin
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<p align="center"><a href="https://1panel.pro"><img src="https://resource.1panel.pro/img/1panel-logo.png" alt="1Panel" width="300" /></a></p>
|
<p align="center"><a href="https://1panel.pro"><img src="https://resource.1panel.pro/img/1panel-logo.png" alt="1Panel" width="300" /></a></p>
|
||||||
<p align="center"><b>Top-Rated Web-based Linux Server Management Tool</b><br>Best VPS control panel<br>新一代的 Linux 服务器运维管理面板</p>
|
<h3 align="center">Take control of your VPS with 1Panel</h3>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://trendshift.io/repositories/2462" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2462" alt="1Panel-dev%2F1Panel | Trendshift" style="width: 240px; height: auto;" /></a>
|
<a href="https://trendshift.io/repositories/2462" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2462" alt="1Panel-dev%2F1Panel | Trendshift" style="width: 240px; height: auto;" /></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -30,27 +30,27 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
------------------------------
|
------------------------------
|
||||||
|
## What is 1Panel?
|
||||||
|
|
||||||
1Panel is an open-source, modern web-based control panel for Linux server management.
|
1Panel is a modern, open-source VPS control panel that streamlines administration through an intuitive, clean web interface.
|
||||||
|
|
||||||
- **Efficient Management**: Through a user-friendly web graphical interface, 1Panel enables users to effortlessly manage their Linux servers. Key features include host monitoring, file management, database administration, container management, LLMs management.
|
## Key Features
|
||||||
- **Rapid Website Deployment**: With deep integration of the popular open-source website building software WordPress, 1Panel streamlines the process of domain binding and SSL certificate configuration, all achievable with just one click.
|
|
||||||
- **Application Store**: 1Panel curates a wide range of high-quality open-source tools and applications, facilitating easy installation and updates for its users.
|
- **One-Click OpenClaw Deployment**: Seamlessly deploy OpenClaw agents, host local LLMs using Ollama, and monitor GPU utilization—all within a unified workspace.
|
||||||
- **Security and Reliability**: By leveraging containerization and secure application deployment practices, 1Panel minimizes vulnerability exposure. It further enhances security through integrated firewall management and log auditing capabilities.
|
- **One-Click Website Deployment**: Launch production-ready websites instantly with automatic domain binding, SSL certificate provisioning, and configuration—zero manual setup required.
|
||||||
- **One-Click Backup & Restore**: Data protection is made simple with 1Panel's one-click backup and restore functionality, supporting various cloud storage solutions to ensure data integrity and availability.
|
- **Curated App Marketplace**: Discover, install, and update trusted open-source applications (Nextcloud, Bitwarden, Umami, and more) with a single click.
|
||||||
|
- **Centralized Server Management**: Monitor system resources and manage files, databases, containers, and services effortlessly through a unified, intuitive dashboard.
|
||||||
|
- **Enterprise-Grade Security**: Strengthen your defenses with container isolation, firewall controls, audit logging, and secure deployment practices—ensuring compliance and peace of mind.
|
||||||
|
- **Intelligent Backup & Restore**: Schedule automated backups or perform instant restores to local storage or major cloud platforms (AWS S3, Cloudflare R2, and more), with flexible retention and destination options.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
Execute the script below and follow the prompts to install 1Panel:
|
Execute the script below and follow the prompts to install 1Panel:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -sSL https://resource.1panel.pro/quick_start.sh -o quick_start.sh && bash quick_start.sh
|
bash -c "$(curl -sSL https://resource.1panel.pro/v2/quick_start.sh)"
|
||||||
```
|
```
|
||||||
|
|
||||||
Please refer to our [documentation](https://docs.1panel.pro/quick_start/) for more details.
|
|
||||||
|
|
||||||
中国用户请使用这个 [安装脚本](https://1panel.cn/docs/installation/online_installation/),其应用数量比国际版本更丰富。
|
|
||||||
|
|
||||||
## Screenshot
|
## Screenshot
|
||||||
|
|
||||||

|

|
||||||
@@ -73,4 +73,4 @@ Licensed under The GNU General Public License version 3 (GPLv3) (the "License")
|
|||||||
|
|
||||||
<https://www.gnu.org/licenses/gpl-3.0.html>
|
<https://www.gnu.org/licenses/gpl-3.0.html>
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
|
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
|
||||||
|
|||||||
@@ -0,0 +1,476 @@
|
|||||||
|
package v2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Create Agent
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentCreateReq true "request"
|
||||||
|
// @Success 200 {object} dto.AgentItem
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents [post]
|
||||||
|
func (b *BaseApi) CreateAgent(c *gin.Context) {
|
||||||
|
var req dto.AgentCreateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := agentService.Create(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Page Agents
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.SearchWithPage true "request"
|
||||||
|
// @Success 200 {object} dto.PageResult
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/search [post]
|
||||||
|
func (b *BaseApi) PageAgents(c *gin.Context) {
|
||||||
|
var req dto.SearchWithPage
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
total, list, err := agentService.Page(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, dto.PageResult{
|
||||||
|
Items: list,
|
||||||
|
Total: total,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Delete Agent
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentDeleteReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/delete [post]
|
||||||
|
func (b *BaseApi) DeleteAgent(c *gin.Context) {
|
||||||
|
var req dto.AgentDeleteReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.Delete(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Reset Agent token
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentTokenResetReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/token/reset [post]
|
||||||
|
func (b *BaseApi) ResetAgentToken(c *gin.Context) {
|
||||||
|
var req dto.AgentTokenResetReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.ResetToken(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Update Agent model config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentModelConfigUpdateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/model/update [post]
|
||||||
|
func (b *BaseApi) UpdateAgentModelConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentModelConfigUpdateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.UpdateModelConfig(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Get Providers
|
||||||
|
// @Success 200 {array} dto.ProviderInfo
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/providers [get]
|
||||||
|
func (b *BaseApi) GetAgentProviders(c *gin.Context) {
|
||||||
|
list, err := agentService.GetProviders()
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, list)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Create Agent account
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentAccountCreateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/accounts [post]
|
||||||
|
func (b *BaseApi) CreateAgentAccount(c *gin.Context) {
|
||||||
|
var req dto.AgentAccountCreateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.CreateAccount(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Update Agent account
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentAccountUpdateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/accounts/update [post]
|
||||||
|
func (b *BaseApi) UpdateAgentAccount(c *gin.Context) {
|
||||||
|
var req dto.AgentAccountUpdateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.UpdateAccount(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Page Agent accounts
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentAccountSearch true "request"
|
||||||
|
// @Success 200 {object} dto.PageResult
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/accounts/search [post]
|
||||||
|
func (b *BaseApi) PageAgentAccounts(c *gin.Context) {
|
||||||
|
var req dto.AgentAccountSearch
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
total, list, err := agentService.PageAccounts(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, dto.PageResult{
|
||||||
|
Items: list,
|
||||||
|
Total: total,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Verify Agent account
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentAccountVerifyReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/accounts/verify [post]
|
||||||
|
func (b *BaseApi) VerifyAgentAccount(c *gin.Context) {
|
||||||
|
var req dto.AgentAccountVerifyReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.VerifyAccount(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Delete Agent account
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentAccountDeleteReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/accounts/delete [post]
|
||||||
|
func (b *BaseApi) DeleteAgentAccount(c *gin.Context) {
|
||||||
|
var req dto.AgentAccountDeleteReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.DeleteAccount(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Get Agent Feishu channel config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentFeishuConfigReq true "request"
|
||||||
|
// @Success 200 {object} dto.AgentFeishuConfig
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/feishu/get [post]
|
||||||
|
func (b *BaseApi) GetAgentFeishuConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentFeishuConfigReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := agentService.GetFeishuConfig(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Update Agent Feishu channel config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentFeishuConfigUpdateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/feishu/update [post]
|
||||||
|
func (b *BaseApi) UpdateAgentFeishuConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentFeishuConfigUpdateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.UpdateFeishuConfig(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Get Agent Telegram channel config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentTelegramConfigReq true "request"
|
||||||
|
// @Success 200 {object} dto.AgentTelegramConfig
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/telegram/get [post]
|
||||||
|
func (b *BaseApi) GetAgentTelegramConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentTelegramConfigReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := agentService.GetTelegramConfig(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Update Agent Telegram channel config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentTelegramConfigUpdateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/telegram/update [post]
|
||||||
|
func (b *BaseApi) UpdateAgentTelegramConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentTelegramConfigUpdateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.UpdateTelegramConfig(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Get Agent Discord channel config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentDiscordConfigReq true "request"
|
||||||
|
// @Success 200 {object} dto.AgentDiscordConfig
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/discord/get [post]
|
||||||
|
func (b *BaseApi) GetAgentDiscordConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentDiscordConfigReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := agentService.GetDiscordConfig(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Update Agent Discord channel config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentDiscordConfigUpdateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/discord/update [post]
|
||||||
|
func (b *BaseApi) UpdateAgentDiscordConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentDiscordConfigUpdateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.UpdateDiscordConfig(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Get Agent Browser config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentBrowserConfigReq true "request"
|
||||||
|
// @Success 200 {object} dto.AgentBrowserConfig
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/browser/get [post]
|
||||||
|
func (b *BaseApi) GetAgentBrowserConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentBrowserConfigReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := agentService.GetBrowserConfig(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Update Agent Browser config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentBrowserConfigUpdateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/browser/update [post]
|
||||||
|
func (b *BaseApi) UpdateAgentBrowserConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentBrowserConfigUpdateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.UpdateBrowserConfig(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Get Agent Other config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentOtherConfigReq true "request"
|
||||||
|
// @Success 200 {object} dto.AgentOtherConfig
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/other/get [post]
|
||||||
|
func (b *BaseApi) GetAgentOtherConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentOtherConfigReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := agentService.GetOtherConfig(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Update Agent Other config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentOtherConfigUpdateReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/other/update [post]
|
||||||
|
func (b *BaseApi) UpdateAgentOtherConfig(c *gin.Context) {
|
||||||
|
var req dto.AgentOtherConfigUpdateReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.UpdateOtherConfig(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Approve Agent Feishu pairing code
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentFeishuPairingApproveReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/feishu/approve [post]
|
||||||
|
func (b *BaseApi) ApproveAgentFeishuPairing(c *gin.Context) {
|
||||||
|
var req dto.AgentFeishuPairingApproveReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.ApproveFeishuPairing(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags AI
|
||||||
|
// @Summary Approve Agent channel pairing code
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.AgentChannelPairingApproveReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /ai/agents/channel/pairing/approve [post]
|
||||||
|
func (b *BaseApi) ApproveAgentChannelPairing(c *gin.Context) {
|
||||||
|
var req dto.AgentChannelPairingApproveReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := agentService.ApproveChannelPairing(req); err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
@@ -60,7 +60,7 @@ func (b *BaseApi) RecreateOllamaModel(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /ai/ollama/model/close [post]
|
// @Router /ai/ollama/close [post]
|
||||||
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"关闭 Ollama 模型连接 [name]","formatEN":"close conn for Ollama model [name]"}
|
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"关闭 Ollama 模型连接 [name]","formatEN":"close conn for Ollama model [name]"}
|
||||||
func (b *BaseApi) CloseOllamaModel(c *gin.Context) {
|
func (b *BaseApi) CloseOllamaModel(c *gin.Context) {
|
||||||
var req dto.OllamaModelName
|
var req dto.OllamaModelName
|
||||||
|
|||||||
+63
-2
@@ -1,10 +1,13 @@
|
|||||||
package v2
|
package v2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
||||||
"github.com/1Panel-dev/1Panel/agent/i18n"
|
"github.com/1Panel-dev/1Panel/agent/i18n"
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/utils/appicon"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -26,7 +29,7 @@ func (b *BaseApi) SearchApp(c *gin.Context) {
|
|||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
helper.SuccessWithData(c, list)
|
helper.SuccessWithDataGzipped(c, list)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags App
|
// @Tags App
|
||||||
@@ -161,7 +164,7 @@ func (b *BaseApi) InstallApp(c *gin.Context) {
|
|||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
install, err := appService.Install(req)
|
install, err := appService.Install(req, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
@@ -192,3 +195,61 @@ func (b *BaseApi) GetAppListUpdate(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.SuccessWithData(c, res)
|
helper.SuccessWithData(c, res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags App
|
||||||
|
// @Summary Get app icon by app_id
|
||||||
|
// @Accept json
|
||||||
|
// @Param appId path integer true "app id"
|
||||||
|
// @Success 200 {file} file "app icon"
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /apps/icon/:key [get]
|
||||||
|
func (b *BaseApi) GetAppIcon(c *gin.Context) {
|
||||||
|
appKey, err := helper.GetStrParamByKey(c, "key")
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
iconBytes, filename, etag, err := appService.GetAppIcon(appKey)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(iconBytes) == 0 {
|
||||||
|
c.Status(http.StatusNoContent)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Header("Cache-Control", "public, max-age=2592000")
|
||||||
|
|
||||||
|
if etag != "" && filename != "" {
|
||||||
|
c.Header("ETag", etag)
|
||||||
|
if c.GetHeader("If-None-Match") == etag {
|
||||||
|
c.Status(http.StatusNotModified)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Data(http.StatusOK, appicon.ContentTypePNG, iconBytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags App
|
||||||
|
// @Summary Search app detail by appkey and version
|
||||||
|
// @Accept json
|
||||||
|
// @Param appId path integer true "app key"
|
||||||
|
// @Param version path string true "app version"
|
||||||
|
// @Success 200 {object} response.AppDetailSimpleDTO
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /apps/detail/node/:appKey/:version [get]
|
||||||
|
func (b *BaseApi) GetAppDetailForNode(c *gin.Context) {
|
||||||
|
appKey := c.Param("appKey")
|
||||||
|
version := c.Param("version")
|
||||||
|
appDetailDTO, err := appService.GetAppDetailByKey(appKey, version)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, appDetailDTO)
|
||||||
|
}
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ func (b *BaseApi) LoadPort(c *gin.Context) {
|
|||||||
// @Success 200 {object} response.DatabaseConn
|
// @Success 200 {object} response.DatabaseConn
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /apps/installed/conninfo/:key [get]
|
// @Router /apps/installed/conninfo [post]
|
||||||
func (b *BaseApi) LoadConnInfo(c *gin.Context) {
|
func (b *BaseApi) LoadConnInfo(c *gin.Context) {
|
||||||
var req dto.OperationWithNameAndType
|
var req dto.OperationWithNameAndType
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -294,7 +294,7 @@ func (b *BaseApi) GetParams(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /apps/installed/params/update [post]
|
// @Router /apps/installed/params/update [post]
|
||||||
// @x-panel-log {"bodyKeys":["installId"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用参数修改 [installId]","formatEN":"Application param update [installId]"}
|
// @x-panel-log {"bodyKeys":["installId"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"installId","isList":false,"db":"app_installs","output_column":"name","output_value":"name"}],"formatZH":"应用参数修改 [name]","formatEN":"Application param update [name]"}
|
||||||
func (b *BaseApi) UpdateInstalled(c *gin.Context) {
|
func (b *BaseApi) UpdateInstalled(c *gin.Context) {
|
||||||
var req request.AppInstalledUpdate
|
var req request.AppInstalledUpdate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -349,3 +349,15 @@ func (b *BaseApi) GetAppInstallInfo(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.SuccessWithData(c, info)
|
helper.SuccessWithData(c, info)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) UpdateAppInstallSort(c *gin.Context) {
|
||||||
|
var req request.AppInstallSort
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := appInstallService.UpdateSort(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,6 +25,23 @@ func (b *BaseApi) CheckBackupUsed(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Backup Account
|
||||||
|
// @Summary Check backup account
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.BackupOperate true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /backups/check [post]
|
||||||
|
func (b *BaseApi) CheckBackup(c *gin.Context) {
|
||||||
|
var req dto.BackupOperate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.SuccessWithData(c, backupService.CheckConn(req))
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Backup Account
|
// @Tags Backup Account
|
||||||
// @Summary Create backup account
|
// @Summary Create backup account
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -74,7 +91,7 @@ func (b *BaseApi) RefreshToken(c *gin.Context) {
|
|||||||
// @Success 200 {array} object
|
// @Success 200 {array} object
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /buckets [post]
|
// @Router /backups/buckets [post]
|
||||||
func (b *BaseApi) ListBuckets(c *gin.Context) {
|
func (b *BaseApi) ListBuckets(c *gin.Context) {
|
||||||
var req dto.ForBuckets
|
var req dto.ForBuckets
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -133,6 +150,28 @@ func (b *BaseApi) UpdateBackup(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Backup Account
|
||||||
|
// @Summary Upload file for recover
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.UploadForRecover true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /backups/upload [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["filePath"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"上传备份文件 [filePath]","formatEN":"upload backup file [filePath]"}
|
||||||
|
func (b *BaseApi) UploadForRecover(c *gin.Context) {
|
||||||
|
var req dto.UploadForRecover
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := backupService.UploadForRecover(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Backup Account
|
// @Tags Backup Account
|
||||||
// @Summary Load backup account options
|
// @Summary Load backup account options
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -273,7 +312,7 @@ func (b *BaseApi) SearchBackupRecordsByCronjob(c *gin.Context) {
|
|||||||
// @Success 200 {string} filePath
|
// @Success 200 {string} filePath
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /backup/record/download [post]
|
// @Router /backups/record/download [post]
|
||||||
// @x-panel-log {"bodyKeys":["source","fileName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"下载备份记录 [source][fileName]","formatEN":"download backup records [source][fileName]"}
|
// @x-panel-log {"bodyKeys":["source","fileName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"下载备份记录 [source][fileName]","formatEN":"download backup records [source][fileName]"}
|
||||||
func (b *BaseApi) DownloadRecord(c *gin.Context) {
|
func (b *BaseApi) DownloadRecord(c *gin.Context) {
|
||||||
var req dto.DownloadRecord
|
var req dto.DownloadRecord
|
||||||
@@ -296,7 +335,7 @@ func (b *BaseApi) DownloadRecord(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /backup/record/description/update [post]
|
// @Router /backups/record/description/update [post]
|
||||||
func (b *BaseApi) UpdateRecordDescription(c *gin.Context) {
|
func (b *BaseApi) UpdateRecordDescription(c *gin.Context) {
|
||||||
var req dto.UpdateDescription
|
var req dto.UpdateDescription
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -317,7 +356,7 @@ func (b *BaseApi) UpdateRecordDescription(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /record/del [post]
|
// @Router /backups/record/del [post]
|
||||||
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"backup_records","output_column":"file_name","output_value":"files"}],"formatZH":"删除备份记录 [files]","formatEN":"delete backup records [files]"}
|
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"backup_records","output_column":"file_name","output_value":"files"}],"formatZH":"删除备份记录 [files]","formatEN":"delete backup records [files]"}
|
||||||
func (b *BaseApi) DeleteBackupRecord(c *gin.Context) {
|
func (b *BaseApi) DeleteBackupRecord(c *gin.Context) {
|
||||||
var req dto.BatchDeleteReq
|
var req dto.BatchDeleteReq
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ func (b *BaseApi) SearchClam(c *gin.Context) {
|
|||||||
// @Success 200 {object} dto.ClamBaseInfo
|
// @Success 200 {object} dto.ClamBaseInfo
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /toolbox/clam/base [get]
|
// @Router /toolbox/clam/base [post]
|
||||||
func (b *BaseApi) LoadClamBaseInfo(c *gin.Context) {
|
func (b *BaseApi) LoadClamBaseInfo(c *gin.Context) {
|
||||||
info, err := clamService.LoadBaseInfo()
|
info, err := clamService.LoadBaseInfo()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -152,7 +152,7 @@ func (b *BaseApi) CleanClamRecord(c *gin.Context) {
|
|||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err := clamService.CleanRecord(req); err != nil {
|
if err := clamService.CleanRecord(req.ID); err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -174,7 +174,7 @@ func (b *BaseApi) SearchClamRecord(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
total, list, err := clamService.LoadRecords(req)
|
total, list, err := clamService.SearchRecords(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
@@ -186,29 +186,6 @@ func (b *BaseApi) SearchClamRecord(c *gin.Context) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Clam
|
|
||||||
// @Summary Load clam record detail
|
|
||||||
// @Accept json
|
|
||||||
// @Param request body dto.ClamLogReq true "request"
|
|
||||||
// @Success 200 {string} content
|
|
||||||
// @Security ApiKeyAuth
|
|
||||||
// @Security Timestamp
|
|
||||||
// @Router /toolbox/clam/record/log [post]
|
|
||||||
func (b *BaseApi) LoadClamRecordLog(c *gin.Context) {
|
|
||||||
var req dto.ClamLogReq
|
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
content, err := clamService.LoadRecordLog(req)
|
|
||||||
if err != nil {
|
|
||||||
helper.InternalServer(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
helper.SuccessWithData(c, content)
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Tags Clam
|
// @Tags Clam
|
||||||
// @Summary Load clam file
|
// @Summary Load clam file
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -289,7 +266,7 @@ func (b *BaseApi) HandleClamScan(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := clamService.HandleOnce(req); err != nil {
|
if err := clamService.HandleOnce(req.ID); err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,28 @@ func (b *BaseApi) CreateComposeTemplate(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Container Compose-template
|
||||||
|
// @Summary Bacth compose template
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.ComposeTemplateBatch true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /containers/template/batch [post]
|
||||||
|
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"批量导入编排模版","formatEN":"batch import compose templates"}
|
||||||
|
func (b *BaseApi) BatchComposeTemplate(c *gin.Context) {
|
||||||
|
var req dto.ComposeTemplateBatch
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := composeTemplateService.Batch(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Container Compose-template
|
// @Tags Container Compose-template
|
||||||
// @Summary Page compose templates
|
// @Summary Page compose templates
|
||||||
// @Accept json
|
// @Accept json
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ func (b *BaseApi) LoadContainerUsers(c *gin.Context) {
|
|||||||
// @Summary List containers
|
// @Summary List containers
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {array} string
|
// @Success 200 {array} dto.ContainerOptions
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/list [post]
|
// @Router /containers/list [post]
|
||||||
@@ -65,6 +65,23 @@ func (b *BaseApi) ListContainer(c *gin.Context) {
|
|||||||
helper.SuccessWithData(c, containerService.List())
|
helper.SuccessWithData(c, containerService.List())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Container
|
||||||
|
// @Summary List containers by image
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Success 200 {array} dto.ContainerOptions
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /containers/list/byimage [post]
|
||||||
|
func (b *BaseApi) ListContainerByImage(c *gin.Context) {
|
||||||
|
var req dto.OperationWithName
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.SuccessWithData(c, containerService.ListByImage(req.Name))
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Container
|
// @Tags Container
|
||||||
// @Summary Load containers status
|
// @Summary Load containers status
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -246,6 +263,27 @@ func (b *BaseApi) ContainerListStats(c *gin.Context) {
|
|||||||
helper.SuccessWithData(c, data)
|
helper.SuccessWithData(c, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Summary Load container stats size
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.OperationWithName true "request"
|
||||||
|
// @Success 200 {object} dto.ContainerItemStats
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /containers/item/stats [post]
|
||||||
|
func (b *BaseApi) ContainerItemStats(c *gin.Context) {
|
||||||
|
var req dto.OperationWithName
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := containerService.ContainerItemStats(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Container
|
// @Tags Container
|
||||||
// @Summary Create container
|
// @Summary Create container
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -268,27 +306,6 @@ func (b *BaseApi) ContainerCreate(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Container
|
|
||||||
// @Summary Create container by command
|
|
||||||
// @Accept json
|
|
||||||
// @Param request body dto.ContainerCreateByCommand true "request"
|
|
||||||
// @Success 200
|
|
||||||
// @Security ApiKeyAuth
|
|
||||||
// @Security Timestamp
|
|
||||||
// @Router /containers/command [post]
|
|
||||||
func (b *BaseApi) ContainerCreateByCommand(c *gin.Context) {
|
|
||||||
var req dto.ContainerCreateByCommand
|
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := containerService.ContainerCreateByCommand(req); err != nil {
|
|
||||||
helper.InternalServer(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
helper.Success(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Tags Container
|
// @Tags Container
|
||||||
// @Summary Upgrade container
|
// @Summary Upgrade container
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -297,7 +314,7 @@ func (b *BaseApi) ContainerCreateByCommand(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/upgrade [post]
|
// @Router /containers/upgrade [post]
|
||||||
// @x-panel-log {"bodyKeys":["name","image"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新容器镜像 [name][image]","formatEN":"upgrade container image [name][image]"}
|
// @x-panel-log {"bodyKeys":["names","image"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新容器镜像 [names][image]","formatEN":"upgrade container image [names][image]"}
|
||||||
func (b *BaseApi) ContainerUpgrade(c *gin.Context) {
|
func (b *BaseApi) ContainerUpgrade(c *gin.Context) {
|
||||||
var req dto.ContainerUpgrade
|
var req dto.ContainerUpgrade
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -355,6 +372,28 @@ func (b *BaseApi) CleanContainerLog(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Container
|
||||||
|
// @Summary Clean compose log
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.ComposeLogClean true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /containers/compose/clean/log [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理容器编排 [name] 日志","formatEN":"clean compose [name] logs"}
|
||||||
|
func (b *BaseApi) CleanComposeLog(c *gin.Context) {
|
||||||
|
var req dto.ComposeLogClean
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := containerService.ComposeLogClean(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Container
|
// @Tags Container
|
||||||
// @Summary Rename Container
|
// @Summary Rename Container
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -464,13 +503,12 @@ func (b *BaseApi) Inspect(c *gin.Context) {
|
|||||||
helper.SuccessWithData(c, result)
|
helper.SuccessWithData(c, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Router /containers/download/log [post]
|
|
||||||
func (b *BaseApi) DownloadContainerLogs(c *gin.Context) {
|
func (b *BaseApi) DownloadContainerLogs(c *gin.Context) {
|
||||||
var req dto.ContainerLog
|
var req dto.ContainerLog
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err := containerService.DownloadContainerLogs(req.ContainerType, req.Container, req.Since, strconv.Itoa(int(req.Tail)), c)
|
err := containerService.DownloadContainerLogs(req.ContainerType, req.Container, req.Since, strconv.Itoa(int(req.Tail)), req.Timestamp, c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
}
|
}
|
||||||
@@ -672,15 +710,37 @@ func (b *BaseApi) ComposeUpdate(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Container Compose
|
||||||
|
// @Summary Load compose environment variables
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.FilePath true "request"
|
||||||
|
// @Success 200 {array} string
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /containers/compose/env [post]
|
||||||
|
func (b *BaseApi) LoadComposeEnv(c *gin.Context) {
|
||||||
|
var req dto.FilePath
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := containerService.LoadComposeEnv(req.Path)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Container
|
// @Tags Container
|
||||||
// @Summary Container logs
|
// @Summary Container logs
|
||||||
// @Param container query string false "容器名称"
|
// @Param container query string false "容器名称"
|
||||||
// @Param since query string false "时间筛选"
|
// @Param since query string false "时间筛选"
|
||||||
// @Param follow query string false "是否追踪"
|
// @Param follow query string false "是否追踪"
|
||||||
// @Param tail query string false "显示行号"
|
// @Param tail query string false "显示行号"
|
||||||
|
// @Param timestamp query string false "是否显示时间"
|
||||||
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/search/log [post]
|
// @Router /containers/search/log [get]
|
||||||
func (b *BaseApi) ContainerStreamLogs(c *gin.Context) {
|
func (b *BaseApi) ContainerStreamLogs(c *gin.Context) {
|
||||||
c.Header("Content-Type", "text/event-stream")
|
c.Header("Content-Type", "text/event-stream")
|
||||||
c.Header("Cache-Control", "no-cache")
|
c.Header("Cache-Control", "no-cache")
|
||||||
@@ -690,6 +750,7 @@ func (b *BaseApi) ContainerStreamLogs(c *gin.Context) {
|
|||||||
since := c.Query("since")
|
since := c.Query("since")
|
||||||
follow := c.Query("follow") == "true"
|
follow := c.Query("follow") == "true"
|
||||||
tail := c.Query("tail")
|
tail := c.Query("tail")
|
||||||
|
timestamp := c.Query("timestamp") == "true"
|
||||||
|
|
||||||
container := c.Query("container")
|
container := c.Query("container")
|
||||||
compose := c.Query("compose")
|
compose := c.Query("compose")
|
||||||
@@ -699,6 +760,7 @@ func (b *BaseApi) ContainerStreamLogs(c *gin.Context) {
|
|||||||
Since: since,
|
Since: since,
|
||||||
Follow: follow,
|
Follow: follow,
|
||||||
Tail: tail,
|
Tail: tail,
|
||||||
|
Timestamp: timestamp,
|
||||||
Type: "container",
|
Type: "container",
|
||||||
}
|
}
|
||||||
if compose != "" {
|
if compose != "" {
|
||||||
|
|||||||
+23
-25
@@ -211,7 +211,7 @@ func (b *BaseApi) LoadRecordLog(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /cronjobs/records/clean [post]
|
// @Router /cronjobs/records/clean [post]
|
||||||
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"清空计划任务记录 [name]","formatEN":"clean cronjob [name] records"}
|
// @x-panel-log {"bodyKeys":["cronjobID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"cronjobID","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"清空计划任务记录 [name]","formatEN":"clean cronjob [name] records"}
|
||||||
func (b *BaseApi) CleanRecord(c *gin.Context) {
|
func (b *BaseApi) CleanRecord(c *gin.Context) {
|
||||||
var req dto.CronjobClean
|
var req dto.CronjobClean
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -226,6 +226,28 @@ func (b *BaseApi) CleanRecord(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Cronjob
|
||||||
|
// @Summary Handle stop job
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.OperateByID true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /cronjobs/stop [post]
|
||||||
|
func (b *BaseApi) StopCronJob(c *gin.Context) {
|
||||||
|
var req dto.OperateByID
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cronjobService.HandleStop(req.ID); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Cronjob
|
// @Tags Cronjob
|
||||||
// @Summary Delete cronjob
|
// @Summary Delete cronjob
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -314,30 +336,6 @@ func (b *BaseApi) UpdateCronjobStatus(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Cronjob
|
|
||||||
// @Summary Download cronjob records
|
|
||||||
// @Accept json
|
|
||||||
// @Param request body dto.CronjobDownload true "request"
|
|
||||||
// @Success 200
|
|
||||||
// @Security ApiKeyAuth
|
|
||||||
// @Security Timestamp
|
|
||||||
// @Router /cronjobs/download [post]
|
|
||||||
// @x-panel-log {"bodyKeys":["recordID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"recordID","isList":false,"db":"job_records","output_column":"file","output_value":"file"}],"formatZH":"下载计划任务记录 [file]","formatEN":"download the cronjob record [file]"}
|
|
||||||
func (b *BaseApi) TargetDownload(c *gin.Context) {
|
|
||||||
var req dto.CronjobDownload
|
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
filePath, err := cronjobService.Download(req)
|
|
||||||
if err != nil {
|
|
||||||
helper.InternalServer(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.File(filePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Tags Cronjob
|
// @Tags Cronjob
|
||||||
// @Summary Handle cronjob once
|
// @Summary Handle cronjob once
|
||||||
// @Accept json
|
// @Accept json
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func (b *BaseApi) LoadDashboardOsInfo(c *gin.Context) {
|
|||||||
// @Tags Dashboard
|
// @Tags Dashboard
|
||||||
// @Summary Load app launcher
|
// @Summary Load app launcher
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Success 200 {Array} dto.AppLauncher
|
// @Success 200 {array} dto.AppLauncher
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /dashboard/app/launcher [get]
|
// @Router /dashboard/app/launcher [get]
|
||||||
@@ -37,14 +37,14 @@ func (b *BaseApi) LoadAppLauncher(c *gin.Context) {
|
|||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
helper.SuccessWithData(c, data)
|
helper.SuccessWithDataGzipped(c, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Dashboard
|
// @Tags Dashboard
|
||||||
// @Summary Load app launcher options
|
// @Summary Load app launcher options
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.SearchByFilter true "request"
|
// @Param request body dto.SearchByFilter true "request"
|
||||||
// @Success 200 {Array} dto.LauncherOption
|
// @Success 200 {array} dto.LauncherOption
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /dashboard/app/launcher/option [post]
|
// @Router /dashboard/app/launcher/option [post]
|
||||||
@@ -83,6 +83,38 @@ func (b *BaseApi) UpdateAppLauncher(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Dashboard
|
||||||
|
// @Summary Load quick jump options
|
||||||
|
// @Success 200 {array} dto.QuickJump
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /dashboard/quick/option [get]
|
||||||
|
func (b *BaseApi) LoadQuickOption(c *gin.Context) {
|
||||||
|
helper.SuccessWithData(c, dashboardService.LoadQuickOptions())
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Dashboard
|
||||||
|
// @Summary Update quick jump
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.ChangeQuicks true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /dashboard/quick/change [post]
|
||||||
|
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"切换快速跳转","formatEN":"change quick jump"}
|
||||||
|
func (b *BaseApi) UpdateQuickJump(c *gin.Context) {
|
||||||
|
var req dto.ChangeQuicks
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := dashboardService.ChangeQuick(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Dashboard
|
// @Tags Dashboard
|
||||||
// @Summary Load dashboard base info
|
// @Summary Load dashboard base info
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -147,6 +179,28 @@ func (b *BaseApi) LoadDashboardCurrentInfo(c *gin.Context) {
|
|||||||
helper.SuccessWithData(c, data)
|
helper.SuccessWithData(c, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Dashboard
|
||||||
|
// @Summary Load top cpu processes
|
||||||
|
// @Success 200 {array} dto.Process
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /dashboard/current/top/cpu [get]
|
||||||
|
func (b *BaseApi) LoadDashboardTopCPU(c *gin.Context) {
|
||||||
|
data := dashboardService.LoadTopCPU()
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Dashboard
|
||||||
|
// @Summary Load top memory processes
|
||||||
|
// @Success 200 {array} dto.Process
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /dashboard/current/top/mem [get]
|
||||||
|
func (b *BaseApi) LoadDashboardTopMem(c *gin.Context) {
|
||||||
|
data := dashboardService.LoadTopMem()
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Dashboard
|
// @Tags Dashboard
|
||||||
// @Summary System restart
|
// @Summary System restart
|
||||||
// @Accept json
|
// @Accept json
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ func (b *BaseApi) GetDatabase(c *gin.Context) {
|
|||||||
// @Success 200 {array} string
|
// @Success 200 {array} string
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /db/remote/del/check [post]
|
// @Router /databases/db/del/check [post]
|
||||||
func (b *BaseApi) DeleteCheckDatabase(c *gin.Context) {
|
func (b *BaseApi) DeleteCheckDatabase(c *gin.Context) {
|
||||||
var req dto.OperateByID
|
var req dto.OperateByID
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
|||||||
@@ -195,27 +195,26 @@ func (b *BaseApi) SearchMysql(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Database Mysql
|
// @Tags Database Mysql
|
||||||
// @Summary List mysql database names
|
// @Summary List mysql database format collation options
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.PageInfo true "request"
|
// @Param request body dto.OperationWithName true "request"
|
||||||
// @Success 200 {array} dto.MysqlOption
|
// @Success 200 {array} dto.MysqlFormatCollationOption
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /databases/options [get]
|
// @Router /databases/format/options [post]
|
||||||
func (b *BaseApi) ListDBName(c *gin.Context) {
|
func (b *BaseApi) ListDBFormatCollationOptions(c *gin.Context) {
|
||||||
list, err := mysqlService.ListDBOption()
|
var req dto.OperationWithName
|
||||||
if err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
helper.InternalServer(c, err)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
helper.SuccessWithData(c, mysqlService.LoadFormatOption(req))
|
||||||
helper.SuccessWithData(c, list)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Database Mysql
|
// @Tags Database Mysql
|
||||||
// @Summary Load mysql database from remote
|
// @Summary Load mysql database from remote
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.MysqlLoadDB true "request"
|
// @Param request body dto.MysqlLoadDB true "request"
|
||||||
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /databases/load [post]
|
// @Router /databases/load [post]
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ func (b *BaseApi) SearchPostgresql(c *gin.Context) {
|
|||||||
// @Summary Load postgresql database from remote
|
// @Summary Load postgresql database from remote
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.PostgresqlLoadDB true "request"
|
// @Param request body dto.PostgresqlLoadDB true "request"
|
||||||
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /databases/pg/:database/load [post]
|
// @Router /databases/pg/:database/load [post]
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func (b *BaseApi) LoadDeviceBaseInfo(c *gin.Context) {
|
|||||||
// @Tags Device
|
// @Tags Device
|
||||||
// @Summary list time zone options
|
// @Summary list time zone options
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Success 200 {Array} string
|
// @Success 200 {array} string
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /toolbox/device/zone/options [get]
|
// @Router /toolbox/device/zone/options [get]
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
package v2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// @Tags Disk Management
|
||||||
|
// @Summary Get complete disk information
|
||||||
|
// @Description Get information about all disks including partitioned and unpartitioned disks
|
||||||
|
// @Produce json
|
||||||
|
// @Success 200 {object} response.CompleteDiskInfo
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/disks [get]
|
||||||
|
func (b *BaseApi) GetCompleteDiskInfo(c *gin.Context) {
|
||||||
|
diskInfo, err := diskService.GetCompleteDiskInfo()
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, diskInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Disk Management
|
||||||
|
// @Summary Partition disk
|
||||||
|
// @Description Create partition and format disk with specified filesystem
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.DiskPartitionRequest true "partition request"
|
||||||
|
// @Success 200 {string} string "Partition created successfully"
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/disks/partition [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["device", "filesystem", "mountPoint"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"对磁盘 [device] 进行分区,文件系统 [filesystem],挂载点 [mountPoint]","formatEN":"Partition disk [device] with filesystem [filesystem], mount point [mountPoint]"}
|
||||||
|
func (b *BaseApi) PartitionDisk(c *gin.Context) {
|
||||||
|
var req request.DiskPartitionRequest
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := diskService.PartitionDisk(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.SuccessWithData(c, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Disk Management
|
||||||
|
// @Summary Mount disk
|
||||||
|
// @Description Mount partition to specified mount point
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.DiskMountRequest true "mount request"
|
||||||
|
// @Success 200 {string} string "Disk mounted successfully"
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/disks/mount [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["device", "mountPoint"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"挂载磁盘 [device] 到 [mountPoint]","formatEN":"Mount disk [device] to [mountPoint]"}
|
||||||
|
func (b *BaseApi) MountDisk(c *gin.Context) {
|
||||||
|
var req request.DiskMountRequest
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := diskService.MountDisk(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Disk Management
|
||||||
|
// @Summary Unmount disk
|
||||||
|
// @Description Unmount partition from mount point
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.DiskUnmountRequest true "unmount request"
|
||||||
|
// @Success 200 {string} string "Disk unmounted successfully"
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/disks/unmount [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["device", "mountPoint"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"卸载磁盘 [device] 从 [mountPoint]","formatEN":"Unmount disk [device] from [mountPoint]"}
|
||||||
|
func (b *BaseApi) UnmountDisk(c *gin.Context) {
|
||||||
|
var req request.DiskUnmountRequest
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := diskService.UnmountDisk(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
// @Tags Container Docker
|
// @Tags Container Docker
|
||||||
// @Summary Load docker status
|
// @Summary Load docker status
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {string} dto.DockerStatus
|
// @Success 200 {object} dto.DockerStatus
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/docker/status [get]
|
// @Router /containers/docker/status [get]
|
||||||
@@ -24,7 +24,7 @@ func (b *BaseApi) LoadDockerStatus(c *gin.Context) {
|
|||||||
// @Tags Container Docker
|
// @Tags Container Docker
|
||||||
// @Summary Load docker daemon.json
|
// @Summary Load docker daemon.json
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {object} string
|
// @Success 200 {string} string
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/daemonjson/file [get]
|
// @Router /containers/daemonjson/file [get]
|
||||||
|
|||||||
@@ -17,8 +17,10 @@ var (
|
|||||||
appInstallService = service.NewIAppInstalledService()
|
appInstallService = service.NewIAppInstalledService()
|
||||||
appIgnoreUpgradeService = service.NewIAppIgnoreUpgradeService()
|
appIgnoreUpgradeService = service.NewIAppIgnoreUpgradeService()
|
||||||
|
|
||||||
aiToolService = service.NewIAIToolService()
|
aiToolService = service.NewIAIToolService()
|
||||||
mcpServerService = service.NewIMcpServerService()
|
mcpServerService = service.NewIMcpServerService()
|
||||||
|
tensorrtLLMService = service.NewITensorRTLLMService()
|
||||||
|
agentService = service.NewIAgentService()
|
||||||
|
|
||||||
containerService = service.NewIContainerService()
|
containerService = service.NewIContainerService()
|
||||||
composeTemplateService = service.NewIComposeTemplateService()
|
composeTemplateService = service.NewIComposeTemplateService()
|
||||||
@@ -37,7 +39,9 @@ var (
|
|||||||
fileService = service.NewIFileService()
|
fileService = service.NewIFileService()
|
||||||
sshService = service.NewISSHService()
|
sshService = service.NewISSHService()
|
||||||
firewallService = service.NewIFirewallService()
|
firewallService = service.NewIFirewallService()
|
||||||
|
iptablesService = service.NewIIptablesService()
|
||||||
monitorService = service.NewIMonitorService()
|
monitorService = service.NewIMonitorService()
|
||||||
|
systemService = service.NewISystemService()
|
||||||
|
|
||||||
deviceService = service.NewIDeviceService()
|
deviceService = service.NewIDeviceService()
|
||||||
fail2banService = service.NewIFail2BanService()
|
fail2banService = service.NewIFail2BanService()
|
||||||
@@ -71,4 +75,6 @@ var (
|
|||||||
taskService = service.NewITaskService()
|
taskService = service.NewITaskService()
|
||||||
groupService = service.NewIGroupService()
|
groupService = service.NewIGroupService()
|
||||||
alertService = service.NewIAlertService()
|
alertService = service.NewIAlertService()
|
||||||
|
|
||||||
|
diskService = service.NewIDiskService()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func (b *BaseApi) LoadFail2BanBaseInfo(c *gin.Context) {
|
|||||||
// @Summary Page fail2ban ip list
|
// @Summary Page fail2ban ip list
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.Fail2BanSearch true "request"
|
// @Param request body dto.Fail2BanSearch true "request"
|
||||||
// @Success 200 {Array} string
|
// @Success 200 {array} string
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /toolbox/fail2ban/search [post]
|
// @Router /toolbox/fail2ban/search [post]
|
||||||
@@ -51,6 +51,7 @@ func (b *BaseApi) SearchFail2Ban(c *gin.Context) {
|
|||||||
// @Summary Operate fail2ban
|
// @Summary Operate fail2ban
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.Operate true "request"
|
// @Param request body dto.Operate true "request"
|
||||||
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /toolbox/fail2ban/operate [post]
|
// @Router /toolbox/fail2ban/operate [post]
|
||||||
@@ -72,7 +73,8 @@ func (b *BaseApi) OperateFail2Ban(c *gin.Context) {
|
|||||||
// @Tags Fail2ban
|
// @Tags Fail2ban
|
||||||
// @Summary Operate sshd of fail2ban
|
// @Summary Operate sshd of fail2ban
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.Operate true "request"
|
// @Param request body dto.Fail2BanSet true "request"
|
||||||
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /toolbox/fail2ban/operate/sshd [post]
|
// @Router /toolbox/fail2ban/operate/sshd [post]
|
||||||
|
|||||||
+119
-5
@@ -90,7 +90,7 @@ func (b *BaseApi) GetFileTree(c *gin.Context) {
|
|||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
helper.SuccessWithData(c, tree)
|
helper.SuccessWithDataGzipped(c, tree)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags File
|
// @Tags File
|
||||||
@@ -265,6 +265,33 @@ func (b *BaseApi) GetContent(c *gin.Context) {
|
|||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if info.Size > 2*1024 && info.Size < 5*1024*1024 {
|
||||||
|
helper.SuccessWithDataGzipped(c, info)
|
||||||
|
} else {
|
||||||
|
helper.SuccessWithData(c, info)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags File
|
||||||
|
// @Summary Preview file content
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.FileContentReq true "request"
|
||||||
|
// @Success 200 {object} response.FileInfo
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /files/preview [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"预览文件内容 [path]","formatEN":"Preview file content [path]"}
|
||||||
|
func (b *BaseApi) PreviewContent(c *gin.Context) {
|
||||||
|
var req request.FileContentReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
info, err := fileService.GetPreviewContent(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
helper.SuccessWithData(c, info)
|
helper.SuccessWithData(c, info)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,9 +548,14 @@ func (b *BaseApi) Download(c *gin.Context) {
|
|||||||
file, err := os.Open(filePath)
|
file, err := os.Open(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
info, _ := file.Stat()
|
info, err := file.Stat()
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
c.Header("Content-Length", strconv.FormatInt(info.Size(), 10))
|
c.Header("Content-Length", strconv.FormatInt(info.Size(), 10))
|
||||||
c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(info.Name()))
|
c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(info.Name()))
|
||||||
http.ServeContent(c.Writer, c.Request, info.Name(), info.ModTime(), file)
|
http.ServeContent(c.Writer, c.Request, info.Name(), info.ModTime(), file)
|
||||||
@@ -841,7 +873,11 @@ func (b *BaseApi) ReadFileByLine(c *gin.Context) {
|
|||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
helper.SuccessWithData(c, res)
|
if res.TotalLines > 100 {
|
||||||
|
helper.SuccessWithDataGzipped(c, res)
|
||||||
|
} else {
|
||||||
|
helper.SuccessWithData(c, res)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags File
|
// @Tags File
|
||||||
@@ -880,7 +916,7 @@ func (b *BaseApi) GetPathByType(c *gin.Context) {
|
|||||||
// @Success 200 {object} dto.DiskInfo
|
// @Success 200 {object} dto.DiskInfo
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mount [post]
|
// @Router /files/mount [post]
|
||||||
func (b *BaseApi) GetHostMount(c *gin.Context) {
|
func (b *BaseApi) GetHostMount(c *gin.Context) {
|
||||||
disks := fileService.GetHostMount()
|
disks := fileService.GetHostMount()
|
||||||
helper.SuccessWithData(c, disks)
|
helper.SuccessWithData(c, disks)
|
||||||
@@ -892,7 +928,7 @@ func (b *BaseApi) GetHostMount(c *gin.Context) {
|
|||||||
// @Success 200 {object} response.UserGroupResponse
|
// @Success 200 {object} response.UserGroupResponse
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /user/group [post]
|
// @Router /files/user/group [post]
|
||||||
func (b *BaseApi) GetUsersAndGroups(c *gin.Context) {
|
func (b *BaseApi) GetUsersAndGroups(c *gin.Context) {
|
||||||
res, err := fileService.GetUsersAndGroups()
|
res, err := fileService.GetUsersAndGroups()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -901,3 +937,81 @@ func (b *BaseApi) GetUsersAndGroups(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.SuccessWithData(c, res)
|
helper.SuccessWithData(c, res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags File
|
||||||
|
// @Summary Convert file
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.FileConvert true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /files/convert [post]
|
||||||
|
func (b *BaseApi) ConvertFile(c *gin.Context) {
|
||||||
|
var req request.FileConvertRequest
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fileService.Convert(req)
|
||||||
|
helper.SuccessWithData(c, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags File
|
||||||
|
// @Summary Convert file
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.PageInfo true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /files/convert/log [post]
|
||||||
|
func (b *BaseApi) ConvertLog(c *gin.Context) {
|
||||||
|
var req dto.PageInfo
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
total, logs, err := fileService.ConvertLog(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, dto.PageResult{
|
||||||
|
Items: logs,
|
||||||
|
Total: total,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags File
|
||||||
|
// @Summary Batch get file remarks
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.FileRemarkBatch true "request"
|
||||||
|
// @Success 200 {object} response.FileRemarksRes
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /files/remarks [post]
|
||||||
|
func (b *BaseApi) BatchGetFileRemarks(c *gin.Context) {
|
||||||
|
var req request.FileRemarkBatch
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
remarks := fileService.BatchGetRemarks(req)
|
||||||
|
helper.SuccessWithData(c, response.FileRemarksRes{Remarks: remarks})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags File
|
||||||
|
// @Summary Set file remark
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.FileRemarkUpdate true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /files/remark [post]
|
||||||
|
func (b *BaseApi) SetFileRemark(c *gin.Context) {
|
||||||
|
var req request.FileRemarkUpdate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := fileService.SetRemark(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,12 +8,19 @@ import (
|
|||||||
|
|
||||||
// @Tags Firewall
|
// @Tags Firewall
|
||||||
// @Summary Load firewall base info
|
// @Summary Load firewall base info
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.OperationWithName true "request"
|
||||||
// @Success 200 {object} dto.FirewallBaseInfo
|
// @Success 200 {object} dto.FirewallBaseInfo
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/firewall/base [get]
|
// @Router /hosts/firewall/base [post]
|
||||||
func (b *BaseApi) LoadFirewallBaseInfo(c *gin.Context) {
|
func (b *BaseApi) LoadFirewallBaseInfo(c *gin.Context) {
|
||||||
data, err := firewallService.LoadBaseInfo()
|
var req dto.OperationWithName
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := firewallService.LoadBaseInfo(req.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
@@ -63,7 +70,7 @@ func (b *BaseApi) OperateFirewall(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := firewallService.OperateFirewall(req.Operation); err != nil {
|
if err := firewallService.OperateFirewall(req); err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -95,14 +102,14 @@ func (b *BaseApi) OperatePortRule(c *gin.Context) {
|
|||||||
|
|
||||||
// OperateForwardRule
|
// OperateForwardRule
|
||||||
// @Tags Firewall
|
// @Tags Firewall
|
||||||
// @Summary Create group
|
// @Summary Operate forward rule
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.ForwardRuleOperate true "request"
|
// @Param request body dto.ForwardRuleOperate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/firewall/forward [post]
|
// @Router /hosts/firewall/forward [post]
|
||||||
// @x-panel-log {"bodyKeys":["source_port"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新端口转发规则 [source_port]","formatEN":"update port forward rules [source_port]"}
|
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新端口转发规则","formatEN":"update port forward rules"}
|
||||||
func (b *BaseApi) OperateForwardRule(c *gin.Context) {
|
func (b *BaseApi) OperateForwardRule(c *gin.Context) {
|
||||||
var req dto.ForwardRuleOperate
|
var req dto.ForwardRuleOperate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -117,7 +124,7 @@ func (b *BaseApi) OperateForwardRule(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Firewall
|
// @Tags Firewall
|
||||||
// @Summary Create group
|
// @Summary Operate Ip rule
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.AddrRuleOperate true "request"
|
// @Param request body dto.AddrRuleOperate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
@@ -139,7 +146,7 @@ func (b *BaseApi) OperateIPRule(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Firewall
|
// @Tags Firewall
|
||||||
// @Summary Create group
|
// @Summary Batch operate rule
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.BatchRuleOperate true "request"
|
// @Param request body dto.BatchRuleOperate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
@@ -181,7 +188,7 @@ func (b *BaseApi) UpdateFirewallDescription(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Firewall
|
// @Tags Firewall
|
||||||
// @Summary Create group
|
// @Summary Update port rule
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.PortRuleUpdate true "request"
|
// @Param request body dto.PortRuleUpdate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
@@ -202,7 +209,7 @@ func (b *BaseApi) UpdatePortRule(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Firewall
|
// @Tags Firewall
|
||||||
// @Summary Create group
|
// @Summary Update Ip rule
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.AddrRuleUpdate true "request"
|
// @Param request body dto.AddrRuleUpdate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
@@ -221,3 +228,112 @@ func (b *BaseApi) UpdateAddrRule(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Firewall
|
||||||
|
// @Summary search iptables filter rules
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.SearchPageWithType true "request"
|
||||||
|
// @Success 200 {object} dto.PageResult
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/firewall/filter/search [post]
|
||||||
|
func (b *BaseApi) SearchFilterRules(c *gin.Context) {
|
||||||
|
var req dto.SearchPageWithType
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
total, list, err := iptablesService.Search(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.SuccessWithData(c, dto.PageResult{
|
||||||
|
Items: list,
|
||||||
|
Total: total,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Firewall
|
||||||
|
// @Summary Operate iptables filter rule
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.IptablesRuleOp true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/firewall/filter/rule/operate [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["operation","chain"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operation] filter规则到 [chain]","formatEN":"[operation] filter rule to [chain]"}
|
||||||
|
func (b *BaseApi) OperateFilterRule(c *gin.Context) {
|
||||||
|
var req dto.IptablesRuleOp
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := iptablesService.OperateRule(req, true); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Firewall
|
||||||
|
// @Summary Batch operate iptables filter rules
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.IptablesBatchOperate true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/firewall/filter/rule/batch [post]
|
||||||
|
func (b *BaseApi) BatchOperateFilterRule(c *gin.Context) {
|
||||||
|
var req dto.IptablesBatchOperate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := iptablesService.BatchOperate(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Firewall
|
||||||
|
// @Summary Apply/Unload/Init iptables filter
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.IptablesOp true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/firewall/filter/operate [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["operate"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operate] iptables filter 防火墙","formatEN":"[operate] iptables filter firewall"}
|
||||||
|
func (b *BaseApi) OperateFilterChain(c *gin.Context) {
|
||||||
|
var req dto.IptablesOp
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := iptablesService.Operate(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Firewall
|
||||||
|
// @Summary load chain status with name
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.OperationWithName true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/firewall/filter/chain/status [post]
|
||||||
|
func (b *BaseApi) LoadChainStatus(c *gin.Context) {
|
||||||
|
var req dto.OperationWithName
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.SuccessWithData(c, iptablesService.LoadChainStatus(req))
|
||||||
|
}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ func (b *BaseApi) LoadFtpLogInfo(c *gin.Context) {
|
|||||||
// @Summary Operate FTP
|
// @Summary Operate FTP
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.Operate true "request"
|
// @Param request body dto.Operate true "request"
|
||||||
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /toolbox/ftp/operate [post]
|
// @Router /toolbox/ftp/operate [post]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /agent/groups [post]
|
// @Router /groups [post]
|
||||||
// @x-panel-log {"bodyKeys":["name","type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建组 [name][type]","formatEN":"create group [name][type]"}
|
// @x-panel-log {"bodyKeys":["name","type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建组 [name][type]","formatEN":"create group [name][type]"}
|
||||||
func (b *BaseApi) CreateGroup(c *gin.Context) {
|
func (b *BaseApi) CreateGroup(c *gin.Context) {
|
||||||
var req dto.GroupCreate
|
var req dto.GroupCreate
|
||||||
@@ -35,7 +35,7 @@ func (b *BaseApi) CreateGroup(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /agent/groups/del [post]
|
// @Router /groups/del [post]
|
||||||
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"groups","output_column":"name","output_value":"name"},{"input_column":"id","input_value":"id","isList":false,"db":"groups","output_column":"type","output_value":"type"}],"formatZH":"删除组 [type][name]","formatEN":"delete group [type][name]"}
|
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"groups","output_column":"name","output_value":"name"},{"input_column":"id","input_value":"id","isList":false,"db":"groups","output_column":"type","output_value":"type"}],"formatZH":"删除组 [type][name]","formatEN":"delete group [type][name]"}
|
||||||
func (b *BaseApi) DeleteGroup(c *gin.Context) {
|
func (b *BaseApi) DeleteGroup(c *gin.Context) {
|
||||||
var req dto.OperateByID
|
var req dto.OperateByID
|
||||||
@@ -57,7 +57,7 @@ func (b *BaseApi) DeleteGroup(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /agent/groups/update [post]
|
// @Router /groups/update [post]
|
||||||
// @x-panel-log {"bodyKeys":["name","type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新组 [name][type]","formatEN":"update group [name][type]"}
|
// @x-panel-log {"bodyKeys":["name","type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新组 [name][type]","formatEN":"update group [name][type]"}
|
||||||
func (b *BaseApi) UpdateGroup(c *gin.Context) {
|
func (b *BaseApi) UpdateGroup(c *gin.Context) {
|
||||||
var req dto.GroupUpdate
|
var req dto.GroupUpdate
|
||||||
@@ -79,7 +79,7 @@ func (b *BaseApi) UpdateGroup(c *gin.Context) {
|
|||||||
// @Success 200 {array} dto.OperateByType
|
// @Success 200 {array} dto.OperateByType
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /agent/groups/search [post]
|
// @Router /groups/search [post]
|
||||||
func (b *BaseApi) ListGroup(c *gin.Context) {
|
func (b *BaseApi) ListGroup(c *gin.Context) {
|
||||||
var req dto.OperateByType
|
var req dto.OperateByType
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package helper
|
package helper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"compress/gzip"
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/agent/global"
|
"github.com/1Panel-dev/1Panel/agent/global"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
@@ -46,6 +50,42 @@ func SuccessWithData(ctx *gin.Context, data interface{}) {
|
|||||||
ctx.Abort()
|
ctx.Abort()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var gzipWriterPool = sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return gzip.NewWriter(nil)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func SuccessWithDataGzipped(ctx *gin.Context, data interface{}) {
|
||||||
|
if !strings.Contains(ctx.GetHeader("Accept-Encoding"), "gzip") {
|
||||||
|
SuccessWithData(ctx, data)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if data == nil {
|
||||||
|
data = gin.H{}
|
||||||
|
}
|
||||||
|
res := dto.Response{
|
||||||
|
Code: http.StatusOK,
|
||||||
|
Data: data,
|
||||||
|
}
|
||||||
|
jsonBytes, err := json.Marshal(res)
|
||||||
|
if err != nil {
|
||||||
|
ErrorWithDetail(ctx, http.StatusInternalServerError, "ErrInternalServer", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.Header("Content-Encoding", "gzip")
|
||||||
|
ctx.Header("Content-Type", "application/json; charset=utf-8")
|
||||||
|
ctx.Status(http.StatusOK)
|
||||||
|
|
||||||
|
gz := gzipWriterPool.Get().(*gzip.Writer)
|
||||||
|
gz.Reset(ctx.Writer)
|
||||||
|
_, _ = gz.Write(jsonBytes)
|
||||||
|
_ = gz.Close()
|
||||||
|
gzipWriterPool.Put(gz)
|
||||||
|
ctx.Abort()
|
||||||
|
}
|
||||||
|
|
||||||
func Success(ctx *gin.Context) {
|
func Success(ctx *gin.Context) {
|
||||||
res := dto.Response{
|
res := dto.Response{
|
||||||
Code: http.StatusOK,
|
Code: http.StatusOK,
|
||||||
@@ -116,7 +156,11 @@ func CheckBind(req interface{}, c *gin.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ErrResponse(ctx *gin.Context, code int) {
|
func GetParamInt32(paramName string, c *gin.Context) (int32, error) {
|
||||||
ctx.JSON(code, nil)
|
idParam, ok := c.Params.Get(paramName)
|
||||||
ctx.Abort()
|
if !ok {
|
||||||
|
return 0, errors.New("error id in path")
|
||||||
|
}
|
||||||
|
intNum, _ := strconv.Atoi(idParam)
|
||||||
|
return int32(intNum), nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ func (b *BaseApi) GetToolStatus(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/tool/create [post]
|
// @Router /hosts/tool/init [post]
|
||||||
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建 [type] 配置","formatEN":"create [type] config"}
|
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建 [type] 配置","formatEN":"create [type] config"}
|
||||||
func (b *BaseApi) InitToolConfig(c *gin.Context) {
|
func (b *BaseApi) InitToolConfig(c *gin.Context) {
|
||||||
var req request.HostToolCreate
|
var req request.HostToolCreate
|
||||||
@@ -95,28 +95,6 @@ func (b *BaseApi) OperateToolConfig(c *gin.Context) {
|
|||||||
helper.SuccessWithData(c, config)
|
helper.SuccessWithData(c, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Host tool
|
|
||||||
// @Summary Get tool logs
|
|
||||||
// @Accept json
|
|
||||||
// @Param request body request.HostToolLogReq true "request"
|
|
||||||
// @Success 200 {string} logContent
|
|
||||||
// @Security ApiKeyAuth
|
|
||||||
// @Security Timestamp
|
|
||||||
// @Router /hosts/tool/log [post]
|
|
||||||
func (b *BaseApi) GetToolLog(c *gin.Context) {
|
|
||||||
var req request.HostToolLogReq
|
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
logContent, err := hostToolService.GetToolLog(req)
|
|
||||||
if err != nil {
|
|
||||||
helper.InternalServer(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
helper.SuccessWithData(c, logContent)
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Tags Host tool
|
// @Tags Host tool
|
||||||
// @Summary Create Supervisor process
|
// @Summary Create Supervisor process
|
||||||
// @Accept json
|
// @Accept json
|
||||||
|
|||||||
@@ -9,14 +9,14 @@ import (
|
|||||||
// @Tags Container Image
|
// @Tags Container Image
|
||||||
// @Summary Page images
|
// @Summary Page images
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.SearchWithPage true "request"
|
// @Param request body dto.PageImage true "request"
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {object} dto.PageResult
|
// @Success 200 {object} dto.PageResult
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/image/search [post]
|
// @Router /containers/image/search [post]
|
||||||
func (b *BaseApi) SearchImage(c *gin.Context) {
|
func (b *BaseApi) SearchImage(c *gin.Context) {
|
||||||
var req dto.SearchWithPage
|
var req dto.PageImage
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ func (b *BaseApi) ListRepo(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/repo/status [get]
|
// @Router /containers/repo/status [post]
|
||||||
func (b *BaseApi) CheckRepoStatus(c *gin.Context) {
|
func (b *BaseApi) CheckRepoStatus(c *gin.Context) {
|
||||||
var req dto.OperateByID
|
var req dto.OperateByID
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
// @Success 200 {object} response.McpServersRes
|
// @Success 200 {object} response.McpServersRes
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/search [post]
|
// @Router /ai/mcp/search [post]
|
||||||
func (b *BaseApi) PageMcpServers(c *gin.Context) {
|
func (b *BaseApi) PageMcpServers(c *gin.Context) {
|
||||||
var req request.McpServerSearch
|
var req request.McpServerSearch
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -30,7 +30,7 @@ func (b *BaseApi) PageMcpServers(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/server [post]
|
// @Router /ai/mcp/server [post]
|
||||||
func (b *BaseApi) CreateMcpServer(c *gin.Context) {
|
func (b *BaseApi) CreateMcpServer(c *gin.Context) {
|
||||||
var req request.McpServerCreate
|
var req request.McpServerCreate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -51,7 +51,7 @@ func (b *BaseApi) CreateMcpServer(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/server/update [post]
|
// @Router /ai/mcp/server/update [post]
|
||||||
func (b *BaseApi) UpdateMcpServer(c *gin.Context) {
|
func (b *BaseApi) UpdateMcpServer(c *gin.Context) {
|
||||||
var req request.McpServerUpdate
|
var req request.McpServerUpdate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -72,7 +72,7 @@ func (b *BaseApi) UpdateMcpServer(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/server/del [post]
|
// @Router /ai/mcp/server/del [post]
|
||||||
func (b *BaseApi) DeleteMcpServer(c *gin.Context) {
|
func (b *BaseApi) DeleteMcpServer(c *gin.Context) {
|
||||||
var req request.McpServerDelete
|
var req request.McpServerDelete
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -93,7 +93,7 @@ func (b *BaseApi) DeleteMcpServer(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/server/op [post]
|
// @Router /ai/mcp/server/op [post]
|
||||||
func (b *BaseApi) OperateMcpServer(c *gin.Context) {
|
func (b *BaseApi) OperateMcpServer(c *gin.Context) {
|
||||||
var req request.McpServerOperate
|
var req request.McpServerOperate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -114,7 +114,7 @@ func (b *BaseApi) OperateMcpServer(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/domain/bind [post]
|
// @Router /ai/mcp/domain/bind [post]
|
||||||
func (b *BaseApi) BindMcpDomain(c *gin.Context) {
|
func (b *BaseApi) BindMcpDomain(c *gin.Context) {
|
||||||
var req request.McpBindDomain
|
var req request.McpBindDomain
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -135,7 +135,7 @@ func (b *BaseApi) BindMcpDomain(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/domain/update [post]
|
// @Router /ai/mcp/domain/update [post]
|
||||||
func (b *BaseApi) UpdateMcpBindDomain(c *gin.Context) {
|
func (b *BaseApi) UpdateMcpBindDomain(c *gin.Context) {
|
||||||
var req request.McpBindDomainUpdate
|
var req request.McpBindDomainUpdate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -155,7 +155,7 @@ func (b *BaseApi) UpdateMcpBindDomain(c *gin.Context) {
|
|||||||
// @Success 200 {object} response.McpBindDomainRes
|
// @Success 200 {object} response.McpBindDomainRes
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /mcp/domain/get [get]
|
// @Router /ai/mcp/domain/get [get]
|
||||||
func (b *BaseApi) GetMcpBindDomain(c *gin.Context) {
|
func (b *BaseApi) GetMcpBindDomain(c *gin.Context) {
|
||||||
res, err := mcpServerService.GetBindDomain()
|
res, err := mcpServerService.GetBindDomain()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/shirou/gopsutil/v3/disk"
|
"github.com/shirou/gopsutil/v4/disk"
|
||||||
"github.com/shirou/gopsutil/v3/net"
|
"github.com/shirou/gopsutil/v4/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// @Tags Monitor
|
// @Tags Monitor
|
||||||
@@ -28,6 +28,27 @@ func (b *BaseApi) LoadMonitor(c *gin.Context) {
|
|||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
helper.SuccessWithDataGzipped(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Monitor
|
||||||
|
// @Summary Load monitor data
|
||||||
|
// @Param request body dto.MonitorGPUSearch true "request"
|
||||||
|
// @Success 200 {object} dto.MonitorGPUData
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/monitor/gpu/search [post]
|
||||||
|
func (b *BaseApi) LoadGPUMonitor(c *gin.Context) {
|
||||||
|
var req dto.MonitorGPUSearch
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := monitorService.LoadGPUMonitorData(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
helper.SuccessWithData(c, data)
|
helper.SuccessWithData(c, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,3 +126,7 @@ func (b *BaseApi) GetIOOptions(c *gin.Context) {
|
|||||||
sort.Strings(options)
|
sort.Strings(options)
|
||||||
helper.SuccessWithData(c, options)
|
helper.SuccessWithData(c, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) GetCPUOptions(c *gin.Context) {
|
||||||
|
helper.SuccessWithData(c, monitorService.LoadGPUOptions())
|
||||||
|
}
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ func (b *BaseApi) BuildNginx(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /openresty/module/update [post]
|
// @Router /openresty/modules/update [post]
|
||||||
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新 OpenResty 模块","formatEN":"Update OpenResty module"}
|
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新 OpenResty 模块","formatEN":"Update OpenResty module"}
|
||||||
func (b *BaseApi) UpdateNginxModule(c *gin.Context) {
|
func (b *BaseApi) UpdateNginxModule(c *gin.Context) {
|
||||||
var req request.NginxModuleUpdate
|
var req request.NginxModuleUpdate
|
||||||
@@ -161,13 +161,13 @@ func (b *BaseApi) GetNginxModules(c *gin.Context) {
|
|||||||
// @Tags OpenResty
|
// @Tags OpenResty
|
||||||
// @Summary Operate default HTTPs
|
// @Summary Operate default HTTPs
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body request.NginxOperateReq true "request"
|
// @Param request body request.NginxDefaultHTTPSUpdate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /openresty/https [post]
|
// @Router /openresty/https [post]
|
||||||
func (b *BaseApi) OperateDefaultHTTPs(c *gin.Context) {
|
func (b *BaseApi) OperateDefaultHTTPs(c *gin.Context) {
|
||||||
var req request.NginxOperateReq
|
var req request.NginxDefaultHTTPSUpdate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,3 +36,39 @@ func (b *BaseApi) StopProcess(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Process
|
||||||
|
// @Summary Get Process Info By PID
|
||||||
|
// @Param pid path int true "PID"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /process/{pid} [get]
|
||||||
|
func (b *BaseApi) GetProcessInfoByPID(c *gin.Context) {
|
||||||
|
pid, err := helper.GetParamInt32("pid", c)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := processService.GetProcessInfoByPID(pid)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Process
|
||||||
|
// @Summary Get Listening Process
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /process/listening [post]
|
||||||
|
func (b *BaseApi) GetListeningProcess(c *gin.Context) {
|
||||||
|
procs, err := processService.GetListeningProcess(c)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, procs)
|
||||||
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ func (b *BaseApi) DeleteRuntime(c *gin.Context) {
|
|||||||
// @Success 200 {array} dto.AppResource
|
// @Success 200 {array} dto.AppResource
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /installed/delete/check/:id [get]
|
// @Router /runtimes/installed/delete/check/:id [get]
|
||||||
func (b *BaseApi) DeleteRuntimeCheck(c *gin.Context) {
|
func (b *BaseApi) DeleteRuntimeCheck(c *gin.Context) {
|
||||||
runTimeId, err := helper.GetIntParamByKey(c, "id")
|
runTimeId, err := helper.GetIntParamByKey(c, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -459,7 +459,7 @@ func (b *BaseApi) GetSupervisorProcess(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /runtimes/supervisor/process/operate [post]
|
// @Router /runtimes/supervisor/process [post]
|
||||||
func (b *BaseApi) OperateSupervisorProcess(c *gin.Context) {
|
func (b *BaseApi) OperateSupervisorProcess(c *gin.Context) {
|
||||||
var req request.PHPSupervisorProcessConfig
|
var req request.PHPSupervisorProcessConfig
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -480,7 +480,7 @@ func (b *BaseApi) OperateSupervisorProcess(c *gin.Context) {
|
|||||||
// @Success 200 {string} content
|
// @Success 200 {string} content
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /runtimes/supervisor/process/file/operate [post]
|
// @Router /runtimes/supervisor/process/file [post]
|
||||||
func (b *BaseApi) OperateSupervisorProcessFile(c *gin.Context) {
|
func (b *BaseApi) OperateSupervisorProcessFile(c *gin.Context) {
|
||||||
var req request.PHPSupervisorProcessFileReq
|
var req request.PHPSupervisorProcessFileReq
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -497,7 +497,7 @@ func (b *BaseApi) OperateSupervisorProcessFile(c *gin.Context) {
|
|||||||
// @Tags Runtime
|
// @Tags Runtime
|
||||||
// @Summary Update PHP container config
|
// @Summary Update PHP container config
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body request.PHPContainerUpdate true "request"
|
// @Param request body request.PHPContainerConfig true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
@@ -518,7 +518,7 @@ func (b *BaseApi) UpdatePHPContainer(c *gin.Context) {
|
|||||||
// @Summary Get PHP container config
|
// @Summary Get PHP container config
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param id path integer true "request"
|
// @Param id path integer true "request"
|
||||||
// @Success 200 {object} response.PHPContainerConfig
|
// @Success 200 {object} request.PHPContainerConfig
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /runtimes/php/container/:id [get]
|
// @Router /runtimes/php/container/:id [get]
|
||||||
@@ -539,7 +539,7 @@ func (b *BaseApi) GetPHPContainerConfig(c *gin.Context) {
|
|||||||
// @Tags Runtime
|
// @Tags Runtime
|
||||||
// @Summary Update runtime remark
|
// @Summary Update runtime remark
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body request.RuntimeRemarkUpdate true "request"
|
// @Param request body request.RuntimeRemark true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
@@ -555,3 +555,25 @@ func (b *BaseApi) UpdateRuntimeRemark(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Runtime
|
||||||
|
// @Summary Get PHP runtime status
|
||||||
|
// @Accept json
|
||||||
|
// @Param id path integer true "request"
|
||||||
|
// @Success 200 {object} map[string]interface{}
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /runtimes/php/fpm/status/:id [get]
|
||||||
|
func (b *BaseApi) GetFPMStatus(c *gin.Context) {
|
||||||
|
id, err := helper.GetParamID(c)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := runtimeService.GetFPMStatus(id)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, data)
|
||||||
|
}
|
||||||
|
|||||||
+79
-37
@@ -2,12 +2,10 @@ package v2
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"os"
|
|
||||||
"os/user"
|
|
||||||
"path"
|
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/model"
|
||||||
"github.com/1Panel-dev/1Panel/agent/global"
|
"github.com/1Panel-dev/1Panel/agent/global"
|
||||||
"github.com/1Panel-dev/1Panel/agent/utils/ssh"
|
"github.com/1Panel-dev/1Panel/agent/utils/ssh"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -71,14 +69,49 @@ func (b *BaseApi) LoadBaseDir(c *gin.Context) {
|
|||||||
helper.SuccessWithData(c, global.Dir.DataDir)
|
helper.SuccessWithData(c, global.Dir.DataDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags System Setting
|
||||||
|
// @Summary Load local conn
|
||||||
|
// @Success 200 {object} dto.SSHConnData
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /settings/ssh/conn [get]
|
||||||
|
func (b *BaseApi) LoadLocalConn(c *gin.Context) {
|
||||||
|
helper.SuccessWithData(c, settingService.GetLocalConn())
|
||||||
|
}
|
||||||
|
|
||||||
func (b *BaseApi) CheckLocalConn(c *gin.Context) {
|
func (b *BaseApi) CheckLocalConn(c *gin.Context) {
|
||||||
_, err := loadLocalConn()
|
client, err := loadLocalConn()
|
||||||
|
if err == nil && client != nil {
|
||||||
|
client.Close()
|
||||||
|
}
|
||||||
helper.SuccessWithData(c, err == nil)
|
helper.SuccessWithData(c, err == nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags System Setting
|
||||||
|
// @Summary Update local is conn
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.SSHDefaultConn true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /settings/ssh/conn/default [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["defaultConn"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"本地终端默认连接 [defaultConn]","formatEN":"update system default conn [defaultConn]"}
|
||||||
|
func (b *BaseApi) SetDefaultIsConn(c *gin.Context) {
|
||||||
|
var req dto.SSHDefaultConn
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := settingService.SetDefaultIsConn(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags System Setting
|
// @Tags System Setting
|
||||||
// @Summary Check local conn info
|
// @Summary Check local conn info
|
||||||
// @Success 200 {bool} isOk
|
// @Success 200 {boolean} isOk
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /settings/ssh/check/info [post]
|
// @Router /settings/ssh/check/info [post]
|
||||||
@@ -87,6 +120,7 @@ func (b *BaseApi) CheckLocalConnByInfo(c *gin.Context) {
|
|||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
helper.SuccessWithData(c, settingService.TestConnByInfo(req))
|
helper.SuccessWithData(c, settingService.TestConnByInfo(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,51 +130,38 @@ func (b *BaseApi) CheckLocalConnByInfo(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /settings/ssh [post]
|
// @Router /settings/ssh [post]
|
||||||
func (b *BaseApi) SaveLocalConnInfo(c *gin.Context) {
|
func (b *BaseApi) SaveLocalConn(c *gin.Context) {
|
||||||
var req dto.SSHConnData
|
var req dto.SSHConnData
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
helper.SuccessWithData(c, settingService.SaveConnInfo(req))
|
|
||||||
|
if err := settingService.SaveConnInfo(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadLocalConn() (*ssh.SSHClient, error) {
|
func loadLocalConn() (*ssh.SSHClient, error) {
|
||||||
itemPath := ""
|
connInfoInDB := settingService.GetSettingByKey("LocalSSHConn")
|
||||||
currentInfo, _ := user.Current()
|
|
||||||
if len(currentInfo.HomeDir) == 0 {
|
|
||||||
itemPath = "/root/.ssh/id_ed25519_1panel"
|
|
||||||
} else {
|
|
||||||
itemPath = path.Join(currentInfo.HomeDir, ".ssh/id_ed25519_1panel")
|
|
||||||
}
|
|
||||||
if _, err := os.Stat(itemPath); err != nil {
|
|
||||||
_ = sshService.CreateRootCert(dto.CreateRootCert{EncryptionMode: "ed25519", Name: "1panel", Description: "1Panel Terminal"})
|
|
||||||
}
|
|
||||||
|
|
||||||
privateKey, _ := os.ReadFile(itemPath)
|
|
||||||
connWithKey := ssh.ConnInfo{
|
|
||||||
Addr: "127.0.0.1",
|
|
||||||
User: "root",
|
|
||||||
Port: 22,
|
|
||||||
AuthMode: "key",
|
|
||||||
PrivateKey: privateKey,
|
|
||||||
}
|
|
||||||
client, err := ssh.NewClient(connWithKey)
|
|
||||||
if err == nil {
|
|
||||||
return client, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
connInfoInDB, err := settingService.GetSSHInfo()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(connInfoInDB) == 0 {
|
if len(connInfoInDB) == 0 {
|
||||||
return nil, errors.New("no such ssh conn info in db!")
|
return nil, errors.New("no such ssh conn info in db!")
|
||||||
}
|
}
|
||||||
var connInDB ssh.ConnInfo
|
var connInDB model.LocalConnInfo
|
||||||
if err := json.Unmarshal([]byte(connInfoInDB), &connInDB); err != nil {
|
if err := json.Unmarshal([]byte(connInfoInDB), &connInDB); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return ssh.NewClient(connInDB)
|
sshInfo := ssh.ConnInfo{
|
||||||
|
Addr: connInDB.Addr,
|
||||||
|
Port: int(connInDB.Port),
|
||||||
|
User: connInDB.User,
|
||||||
|
AuthMode: connInDB.AuthMode,
|
||||||
|
Password: connInDB.Password,
|
||||||
|
PrivateKey: []byte(connInDB.PrivateKey),
|
||||||
|
PassPhrase: []byte(connInDB.PassPhrase),
|
||||||
|
}
|
||||||
|
return ssh.NewClient(sshInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags System Setting
|
// @Tags System Setting
|
||||||
@@ -159,3 +180,24 @@ func (b *BaseApi) GetSettingByKey(c *gin.Context) {
|
|||||||
value := settingService.GetSettingByKey(key)
|
value := settingService.GetSettingByKey(key)
|
||||||
helper.SuccessWithData(c, value)
|
helper.SuccessWithData(c, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags System Setting
|
||||||
|
// @Summary Save common description
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.CommonDescription true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /settings/description/save [post]
|
||||||
|
func (b *BaseApi) SaveDescription(c *gin.Context) {
|
||||||
|
var req dto.CommonDescription
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := settingService.SaveDescription(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ func (b *BaseApi) CreateSnapshot(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := snapshotService.SnapshotCreate(nil, req, 0, 0, 0); err != nil {
|
if err := snapshotService.SnapshotCreate(nil, req, 0, 3); err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,7 @@ func (b *BaseApi) CreateSnapshot(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /settings/snapshot/recrete [post]
|
// @Router /settings/snapshot/recreate [post]
|
||||||
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"snapshots","output_column":"name","output_value":"name"}],"formatZH":"重试创建快照 [name]","formatEN":"recrete the snapshot [name]"}
|
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"snapshots","output_column":"name","output_value":"name"}],"formatZH":"重试创建快照 [name]","formatEN":"recrete the snapshot [name]"}
|
||||||
func (b *BaseApi) RecreateSnapshot(c *gin.Context) {
|
func (b *BaseApi) RecreateSnapshot(c *gin.Context) {
|
||||||
var req dto.OperateByID
|
var req dto.OperateByID
|
||||||
|
|||||||
+107
-48
@@ -53,7 +53,7 @@ func (b *BaseApi) OperateSSH(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/ssh/update [post]
|
// @Router /hosts/ssh/update [post]
|
||||||
// @x-panel-log {"bodyKeys":["key","value"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改 SSH 配置 [key] => [value]","formatEN":"update SSH setting [key] => [value]"}
|
// @x-panel-log {"bodyKeys":["key","newValue"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改 SSH 配置 [key] => [newValue]","formatEN":"update SSH setting [key] => [newValue]"}
|
||||||
func (b *BaseApi) UpdateSSH(c *gin.Context) {
|
func (b *BaseApi) UpdateSSH(c *gin.Context) {
|
||||||
var req dto.SSHUpdate
|
var req dto.SSHUpdate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -68,21 +68,23 @@ func (b *BaseApi) UpdateSSH(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags SSH
|
// @Tags SSH
|
||||||
// @Summary Update host SSH setting by file
|
// @Summary Generate host SSH secret
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.SSHConf true "request"
|
// @Param request body dto.RootCertOperate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/conffile/update [post]
|
// @Router /hosts/ssh/cert [post]
|
||||||
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改 SSH 配置文件","formatEN":"update SSH conf"}
|
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"生成 SSH 密钥 ","formatEN":"generate SSH secret"}
|
||||||
func (b *BaseApi) UpdateSSHByfile(c *gin.Context) {
|
func (b *BaseApi) CreateRootCert(c *gin.Context) {
|
||||||
var req dto.SSHConf
|
var req dto.RootCertOperate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if err := loadCertAfterDecrypt(&req); err != nil {
|
||||||
if err := sshService.UpdateByFile(req.File); err != nil {
|
helper.BadRequest(c, err)
|
||||||
|
}
|
||||||
|
if err := sshService.CreateRootCert(req); err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -90,45 +92,23 @@ func (b *BaseApi) UpdateSSHByfile(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags SSH
|
// @Tags SSH
|
||||||
// @Summary Generate host SSH secret
|
// @Summary Update host SSH secret
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.CreateRootCert true "request"
|
// @Param request body dto.RootCertOperate true "request"
|
||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/ssh/cert [post]
|
// @Router /hosts/ssh/cert/update [post]
|
||||||
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"生成 SSH 密钥 ","formatEN":"generate SSH secret"}
|
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"生成 SSH 密钥 ","formatEN":"generate SSH secret"}
|
||||||
func (b *BaseApi) CreateRootCert(c *gin.Context) {
|
func (b *BaseApi) EditRootCert(c *gin.Context) {
|
||||||
var req dto.CreateRootCert
|
var req dto.RootCertOperate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if len(req.PassPhrase) != 0 {
|
if err := loadCertAfterDecrypt(&req); err != nil {
|
||||||
passPhrase, err := base64.StdEncoding.DecodeString(req.PassPhrase)
|
helper.BadRequest(c, err)
|
||||||
if err != nil {
|
|
||||||
helper.BadRequest(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.PassPhrase = string(passPhrase)
|
|
||||||
}
|
}
|
||||||
if len(req.PrivateKey) != 0 {
|
if err := sshService.EditRootCert(req); err != nil {
|
||||||
privateKey, err := base64.StdEncoding.DecodeString(req.PrivateKey)
|
|
||||||
if err != nil {
|
|
||||||
helper.BadRequest(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.PrivateKey = string(privateKey)
|
|
||||||
}
|
|
||||||
if len(req.PublicKey) != 0 {
|
|
||||||
publicKey, err := base64.StdEncoding.DecodeString(req.PublicKey)
|
|
||||||
if err != nil {
|
|
||||||
helper.BadRequest(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.PublicKey = string(publicKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := sshService.CreateRootCert(req); err != nil {
|
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -201,7 +181,7 @@ func (b *BaseApi) DeleteRootCert(c *gin.Context) {
|
|||||||
// @Summary Load host SSH logs
|
// @Summary Load host SSH logs
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.SearchSSHLog true "request"
|
// @Param request body dto.SearchSSHLog true "request"
|
||||||
// @Success 200 {object} dto.SSHLog
|
// @Success 200 {object} dto.PageResult
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/ssh/log [post]
|
// @Router /hosts/ssh/log [post]
|
||||||
@@ -211,7 +191,54 @@ func (b *BaseApi) LoadSSHLogs(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := sshService.LoadLog(c, req)
|
total, data, err := sshService.LoadLog(c, req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.SuccessWithData(c, dto.PageResult{
|
||||||
|
Total: total,
|
||||||
|
Items: data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags SSH
|
||||||
|
// @Summary Export host SSH logs
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.SearchSSHLog true "request"
|
||||||
|
// @Success 200 {string} path
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/ssh/log/export [post]
|
||||||
|
func (b *BaseApi) ExportSSHLogs(c *gin.Context) {
|
||||||
|
var req dto.SearchSSHLog
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tmpFile, err := sshService.ExportLog(c, req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, tmpFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags SSH
|
||||||
|
// @Summary Load host SSH conf
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body dto.OperationWithName true "request"
|
||||||
|
// @Success 200 {string} conf
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/ssh/file [post]
|
||||||
|
func (b *BaseApi) LoadSSHFile(c *gin.Context) {
|
||||||
|
var req dto.OperationWithName
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := sshService.LoadSSHFile(req.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
@@ -220,16 +247,48 @@ func (b *BaseApi) LoadSSHLogs(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @Tags SSH
|
// @Tags SSH
|
||||||
// @Summary Load host SSH conf
|
// @Summary Update host SSH setting by file
|
||||||
// @Success 200 {string} conf
|
// @Accept json
|
||||||
|
// @Param request body dto.SSHConf true "request"
|
||||||
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /hosts/ssh/conf [get]
|
// @Router /hosts/ssh/file/update [post]
|
||||||
func (b *BaseApi) LoadSSHConf(c *gin.Context) {
|
// @x-panel-log {"bodyKeys":["key"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改 SSH 配置文件 [key]","formatEN":"update SSH conf [key]"}
|
||||||
data, err := sshService.LoadSSHConf()
|
func (b *BaseApi) UpdateSSHByFile(c *gin.Context) {
|
||||||
if err != nil {
|
var req dto.SettingUpdate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sshService.UpdateByFile(req); err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
helper.SuccessWithData(c, data)
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadCertAfterDecrypt(req *dto.RootCertOperate) error {
|
||||||
|
if len(req.PassPhrase) != 0 {
|
||||||
|
passPhrase, err := base64.StdEncoding.DecodeString(req.PassPhrase)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.PassPhrase = string(passPhrase)
|
||||||
|
}
|
||||||
|
if len(req.PrivateKey) != 0 {
|
||||||
|
privateKey, err := base64.StdEncoding.DecodeString(req.PrivateKey)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.PrivateKey = string(privateKey)
|
||||||
|
}
|
||||||
|
if len(req.PublicKey) != 0 {
|
||||||
|
publicKey, err := base64.StdEncoding.DecodeString(req.PublicKey)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.PublicKey = string(publicKey)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package v2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// @Tags Host
|
||||||
|
// @Summary Check if a system component exists
|
||||||
|
// @Accept json
|
||||||
|
// @Param name path string true "Component name to check (e.g., rsync, docker)"
|
||||||
|
// @Success 200 {object} response.ComponentInfo
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /hosts/components/{name} [get]
|
||||||
|
func (b *BaseApi) CheckComponentExistence(c *gin.Context) {
|
||||||
|
name := c.Param("name")
|
||||||
|
if name == "" {
|
||||||
|
helper.BadRequest(c, errors.New("empty component name"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
info := systemService.IsComponentExist(name)
|
||||||
|
helper.SuccessWithData(c, info)
|
||||||
|
}
|
||||||
@@ -32,7 +32,7 @@ func (b *BaseApi) PageTasks(c *gin.Context) {
|
|||||||
|
|
||||||
// @Tags TaskLog
|
// @Tags TaskLog
|
||||||
// @Summary Get the number of executing tasks
|
// @Summary Get the number of executing tasks
|
||||||
// @Success 200 {object} int64
|
// @Success 200 {integer} int64
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /logs/tasks/executing/count [get]
|
// @Router /logs/tasks/executing/count [get]
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package v2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (b *BaseApi) PageTensorRTLLMs(c *gin.Context) {
|
||||||
|
var req request.TensorRTLLMSearch
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
list := tensorrtLLMService.Page(req)
|
||||||
|
helper.SuccessWithData(c, list)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) CreateTensorRTLLM(c *gin.Context) {
|
||||||
|
var req request.TensorRTLLMCreate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := tensorrtLLMService.Create(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) UpdateTensorRTLLM(c *gin.Context) {
|
||||||
|
var req request.TensorRTLLMUpdate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := tensorrtLLMService.Update(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) DeleteTensorRTLLM(c *gin.Context) {
|
||||||
|
var req request.TensorRTLLMDelete
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := tensorrtLLMService.Delete(req.ID)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) OperateTensorRTLLM(c *gin.Context) {
|
||||||
|
var req request.TensorRTLLMOperate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := tensorrtLLMService.Operate(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
@@ -86,15 +85,16 @@ func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
source := c.Query("source")
|
source := c.Query("source")
|
||||||
var containerID string
|
|
||||||
var initCmd []string
|
var initCmd []string
|
||||||
switch source {
|
switch source {
|
||||||
case "redis", "redis-cluster":
|
case "redis", "redis-cluster":
|
||||||
containerID, initCmd, err = loadRedisInitCmd(c, source)
|
initCmd, err = loadRedisInitCmd(c, source)
|
||||||
case "ollama":
|
case "ollama":
|
||||||
containerID, initCmd, err = loadOllamaInitCmd(c)
|
initCmd, err = loadOllamaInitCmd(c)
|
||||||
case "container":
|
case "container":
|
||||||
containerID, initCmd, err = loadContainerInitCmd(c)
|
initCmd, err = loadContainerInitCmd(c)
|
||||||
|
case "database":
|
||||||
|
initCmd, err = loadDatabaseInitCmd(c)
|
||||||
default:
|
default:
|
||||||
if wshandleError(wsConn, fmt.Errorf("not support such source %s", source)) {
|
if wshandleError(wsConn, fmt.Errorf("not support such source %s", source)) {
|
||||||
return
|
return
|
||||||
@@ -103,12 +103,10 @@ func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
|
|||||||
if wshandleError(wsConn, err) {
|
if wshandleError(wsConn, err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pidMap := loadMapFromDockerTop(containerID)
|
|
||||||
slave, err := terminal.NewCommand("docker", initCmd...)
|
slave, err := terminal.NewCommand("docker", initCmd...)
|
||||||
if wshandleError(wsConn, err) {
|
if wshandleError(wsConn, err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer killBash(containerID, strings.ReplaceAll(strings.Join(initCmd, " "), fmt.Sprintf("exec -it %s ", containerID), ""), pidMap)
|
|
||||||
defer slave.Close()
|
defer slave.Close()
|
||||||
|
|
||||||
tty, err := terminal.NewLocalWsSession(cols, rows, wsConn, slave, false)
|
tty, err := terminal.NewLocalWsSession(cols, rows, wsConn, slave, false)
|
||||||
@@ -127,18 +125,18 @@ func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
|
|||||||
_ = wsConn.WriteControl(websocket.CloseMessage, nil, dt)
|
_ = wsConn.WriteControl(websocket.CloseMessage, nil, dt)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadRedisInitCmd(c *gin.Context, redisType string) (string, []string, error) {
|
func loadRedisInitCmd(c *gin.Context, redisType string) ([]string, error) {
|
||||||
name := c.Query("name")
|
name := c.Query("name")
|
||||||
from := c.Query("from")
|
from := c.Query("from")
|
||||||
commands := []string{"exec", "-it"}
|
commands := []string{"exec", "-it"}
|
||||||
database, err := databaseService.Get(name)
|
database, err := databaseService.Get(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, fmt.Errorf("no such database in db, err: %v", err)
|
return nil, fmt.Errorf("no such database in db, err: %v", err)
|
||||||
}
|
}
|
||||||
if from == "local" {
|
if from == "local" {
|
||||||
redisInfo, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Name: name, Type: redisType})
|
redisInfo, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Name: name, Type: redisType})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, fmt.Errorf("no such app in db, err: %v", err)
|
return nil, fmt.Errorf("no such app in db, err: %v", err)
|
||||||
}
|
}
|
||||||
name = redisInfo.ContainerName
|
name = redisInfo.ContainerName
|
||||||
commands = append(commands, []string{name, "redis-cli"}...)
|
commands = append(commands, []string{name, "redis-cli"}...)
|
||||||
@@ -152,38 +150,61 @@ func loadRedisInitCmd(c *gin.Context, redisType string) (string, []string, error
|
|||||||
commands = append(commands, []string{"-a", database.Password, "--no-auth-warning"}...)
|
commands = append(commands, []string{"-a", database.Password, "--no-auth-warning"}...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return name, commands, nil
|
return commands, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadOllamaInitCmd(c *gin.Context) (string, []string, error) {
|
func loadOllamaInitCmd(c *gin.Context) ([]string, error) {
|
||||||
name := c.Query("name")
|
name := c.Query("name")
|
||||||
if cmd.CheckIllegal(name) {
|
if cmd.CheckIllegal(name) {
|
||||||
return "", nil, fmt.Errorf("ollama model %s contains illegal characters", name)
|
return nil, fmt.Errorf("ollama model %s contains illegal characters", name)
|
||||||
}
|
}
|
||||||
ollamaInfo, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Name: "", Type: "ollama"})
|
ollamaInfo, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Name: "", Type: "ollama"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, fmt.Errorf("no such app in db, err: %v", err)
|
return nil, fmt.Errorf("no such app in db, err: %v", err)
|
||||||
}
|
}
|
||||||
containerName := ollamaInfo.ContainerName
|
containerName := ollamaInfo.ContainerName
|
||||||
return containerName, []string{"exec", "-it", containerName, "ollama", "run", name}, nil
|
return []string{"exec", "-it", containerName, "ollama", "run", name}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadContainerInitCmd(c *gin.Context) (string, []string, error) {
|
func loadContainerInitCmd(c *gin.Context) ([]string, error) {
|
||||||
containerID := c.Query("containerid")
|
containerID := c.Query("containerid")
|
||||||
command := c.Query("command")
|
command := c.Query("command")
|
||||||
user := c.Query("user")
|
user := c.Query("user")
|
||||||
if cmd.CheckIllegal(user, containerID, command) {
|
if cmd.CheckIllegal(user, containerID, command) {
|
||||||
return "", nil, fmt.Errorf("the command contains illegal characters. command: %s, user: %s, containerID: %s", command, user, containerID)
|
return nil, fmt.Errorf("the command contains illegal characters. command: %s, user: %s, containerID: %s", command, user, containerID)
|
||||||
}
|
}
|
||||||
if len(command) == 0 || len(containerID) == 0 {
|
if len(command) == 0 || len(containerID) == 0 {
|
||||||
return "", nil, fmt.Errorf("error param of command: %s or containerID: %s", command, containerID)
|
return nil, fmt.Errorf("error param of command: %s or containerID: %s", command, containerID)
|
||||||
}
|
}
|
||||||
commands := []string{"exec", "-it", containerID, command}
|
commands := []string{"exec", "-it", containerID, command}
|
||||||
if len(user) != 0 {
|
if len(user) != 0 {
|
||||||
commands = []string{"exec", "-it", "-u", user, containerID, command}
|
commands = []string{"exec", "-it", "-u", user, containerID, command}
|
||||||
}
|
}
|
||||||
|
|
||||||
return containerID, commands, nil
|
return commands, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadDatabaseInitCmd(c *gin.Context) ([]string, error) {
|
||||||
|
database := c.Query("database")
|
||||||
|
databaseType := c.Query("databaseType")
|
||||||
|
if len(database) == 0 || len(databaseType) == 0 {
|
||||||
|
return nil, fmt.Errorf("error param of database: %s or database type: %s", database, databaseType)
|
||||||
|
}
|
||||||
|
databaseConn, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Type: databaseType, Name: database})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("no such database in db, err: %v", err)
|
||||||
|
}
|
||||||
|
commands := []string{"exec", "-it", databaseConn.ContainerName}
|
||||||
|
switch databaseType {
|
||||||
|
case "mysql", "mysql-cluster":
|
||||||
|
commands = append(commands, []string{"mysql", "-uroot", "-p" + databaseConn.Password}...)
|
||||||
|
case "mariadb":
|
||||||
|
commands = append(commands, []string{"mariadb", "-uroot", "-p" + databaseConn.Password}...)
|
||||||
|
case "postgresql", "postgresql-cluster":
|
||||||
|
commands = []string{"exec", "-e", fmt.Sprintf("PGPASSWORD=%s", databaseConn.Password), "-it", databaseConn.ContainerName, "psql", "-t", "-U", databaseConn.Username}
|
||||||
|
}
|
||||||
|
|
||||||
|
return commands, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func wshandleError(ws *websocket.Conn, err error) bool {
|
func wshandleError(ws *websocket.Conn, err error) bool {
|
||||||
@@ -206,45 +227,9 @@ func wshandleError(ws *websocket.Conn, err error) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadMapFromDockerTop(containerID string) map[string]string {
|
|
||||||
pidMap := make(map[string]string)
|
|
||||||
sudo := cmd.SudoHandleCmd()
|
|
||||||
|
|
||||||
stdout, err := cmd.RunDefaultWithStdoutBashCf("%s docker top %s -eo pid,command ", sudo, containerID)
|
|
||||||
if err != nil {
|
|
||||||
return pidMap
|
|
||||||
}
|
|
||||||
lines := strings.Split(stdout, "\n")
|
|
||||||
for _, line := range lines {
|
|
||||||
parts := strings.Fields(line)
|
|
||||||
if len(parts) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pidMap[parts[0]] = strings.Join(parts[1:], " ")
|
|
||||||
}
|
|
||||||
return pidMap
|
|
||||||
}
|
|
||||||
|
|
||||||
func killBash(containerID, comm string, pidMap map[string]string) {
|
|
||||||
sudo := cmd.SudoHandleCmd()
|
|
||||||
newPidMap := loadMapFromDockerTop(containerID)
|
|
||||||
for pid, command := range newPidMap {
|
|
||||||
isOld := false
|
|
||||||
for pid2 := range pidMap {
|
|
||||||
if pid == pid2 {
|
|
||||||
isOld = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !isOld && command == comm {
|
|
||||||
_, _ = cmd.RunDefaultWithStdoutBashCf("%s kill -9 %s", sudo, pid)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var upGrader = websocket.Upgrader{
|
var upGrader = websocket.Upgrader{
|
||||||
ReadBufferSize: 1024,
|
ReadBufferSize: 4096,
|
||||||
WriteBufferSize: 1024 * 1024 * 10,
|
WriteBufferSize: 16384,
|
||||||
CheckOrigin: func(r *http.Request) bool {
|
CheckOrigin: func(r *http.Request) bool {
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
|
|||||||
+193
-7
@@ -73,7 +73,7 @@ func (b *BaseApi) GetWebsiteOptions(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /websites [post]
|
// @Router /websites [post]
|
||||||
// @x-panel-log {"bodyKeys":["primaryDomain"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建网站 [primaryDomain]","formatEN":"Create website [primaryDomain]"}
|
// @x-panel-log {"bodyKeys":["alias"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建网站 [alias]","formatEN":"Create website [alias]"}
|
||||||
func (b *BaseApi) CreateWebsite(c *gin.Context) {
|
func (b *BaseApi) CreateWebsite(c *gin.Context) {
|
||||||
var req request.WebsiteCreate
|
var req request.WebsiteCreate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -506,7 +506,7 @@ func (b *BaseApi) GetProxyConfig(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /websites/proxies/update [post]
|
// @Router /websites/proxies/update [post]
|
||||||
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改网站 [domain] 反向代理配置 ","formatEN":"Update domain [domain] proxy config"}
|
// @x-panel-log {"bodyKeys":["id","name","operate"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改 [operate] 网站 [domain] 反向代理配置 [name] ","formatEN":"Update [operate] domain [domain] proxy config [name]"}
|
||||||
func (b *BaseApi) UpdateProxyConfig(c *gin.Context) {
|
func (b *BaseApi) UpdateProxyConfig(c *gin.Context) {
|
||||||
var req request.WebsiteProxyConfig
|
var req request.WebsiteProxyConfig
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -520,6 +520,50 @@ func (b *BaseApi) UpdateProxyConfig(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Delete proxy config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.WebsiteProxyDel true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/proxies/delete [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["id","name"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"删除网站 [domain] 反向代理配置 [name] ","formatEN":"Delete domain [domain] proxy config [name]"}
|
||||||
|
func (b *BaseApi) DeleteProxyConfig(c *gin.Context) {
|
||||||
|
var req request.WebsiteProxyDel
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := websiteService.DeleteProxy(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Update proxy config status
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.WebsiteProxyStatusUpdate true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/proxies/status [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["id","name","status"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改网站 [domain] 反向代理配置 [name] 状态 [status] ","formatEN":"Update domain [domain] proxy config [name] status [status]"}
|
||||||
|
func (b *BaseApi) UpdateProxyConfigStatus(c *gin.Context) {
|
||||||
|
var req request.WebsiteProxyStatusUpdate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := websiteService.UpdateProxyStatus(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Website
|
// @Tags Website
|
||||||
// @Summary Update proxy file
|
// @Summary Update proxy file
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -527,8 +571,8 @@ func (b *BaseApi) UpdateProxyConfig(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /websites/proxy/file [post]
|
// @Router /websites/proxies/file [post]
|
||||||
// @x-panel-log {"bodyKeys":["websiteID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteID","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"更新反向代理文件 [domain]","formatEN":"Nginx conf proxy file update [domain]"}
|
// @x-panel-log {"bodyKeys":["websiteID","name"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteID","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改网站 [domain] 反向代理配置文件 [name] ","formatEN":"Update domain [domain] proxy config file [name]"}
|
||||||
func (b *BaseApi) UpdateProxyConfigFile(c *gin.Context) {
|
func (b *BaseApi) UpdateProxyConfigFile(c *gin.Context) {
|
||||||
var req request.NginxProxyUpdate
|
var req request.NginxProxyUpdate
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -672,7 +716,7 @@ func (b *BaseApi) UpdateAntiLeech(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /websites/redirect/update [post]
|
// @Router /websites/redirect/update [post]
|
||||||
// @x-panel-log {"bodyKeys":["websiteID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteID","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改网站 [domain] 重定向理配置 ","formatEN":"Update domain [domain] redirect config"}
|
// @x-panel-log {"bodyKeys":["websiteID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteID","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改网站 [domain] 重定向配置 ","formatEN":"Update domain [domain] redirect config"}
|
||||||
func (b *BaseApi) UpdateRedirectConfig(c *gin.Context) {
|
func (b *BaseApi) UpdateRedirectConfig(c *gin.Context) {
|
||||||
var req request.NginxRedirectReq
|
var req request.NginxRedirectReq
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -840,7 +884,7 @@ func (b *BaseApi) CreateLoadBalance(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /websites/lbs/delete [post]
|
// @Router /websites/lbs/del [post]
|
||||||
func (b *BaseApi) DeleteLoadBalance(c *gin.Context) {
|
func (b *BaseApi) DeleteLoadBalance(c *gin.Context) {
|
||||||
var req request.WebsiteLBDelete
|
var req request.WebsiteLBDelete
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
@@ -953,7 +997,7 @@ func (b *BaseApi) GetProxyCache(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /websites/realip [post]
|
// @Router /websites/realip/config [post]
|
||||||
// @x-panel-log {"bodyKeys":["websiteID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteID","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改 [domain] 网站真实IP配置 ","formatEN":"Modify the real IP configuration of [domain] website"}
|
// @x-panel-log {"bodyKeys":["websiteID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteID","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改 [domain] 网站真实IP配置 ","formatEN":"Modify the real IP configuration of [domain] website"}
|
||||||
func (b *BaseApi) SetRealIPConfig(c *gin.Context) {
|
func (b *BaseApi) SetRealIPConfig(c *gin.Context) {
|
||||||
var req request.WebsiteRealIP
|
var req request.WebsiteRealIP
|
||||||
@@ -1121,3 +1165,145 @@ func (b *BaseApi) OperateCrossSiteAccess(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Exec Composer
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.ExecComposerReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/exec/composer [post]
|
||||||
|
func (b *BaseApi) ExecComposer(c *gin.Context) {
|
||||||
|
var req request.ExecComposerReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteService.ExecComposer(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Batch operate websites
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.BatchWebsiteOp true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/batch/operate [post]
|
||||||
|
func (b *BaseApi) BatchOpWebsites(c *gin.Context) {
|
||||||
|
var req request.BatchWebsiteOp
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteService.BatchOpWebsite(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Batch set website group
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.BatchWebsiteGroup true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/batch/group [post]
|
||||||
|
func (b *BaseApi) BatchSetWebsiteGroup(c *gin.Context) {
|
||||||
|
var req request.BatchWebsiteGroup
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteService.BatchSetGroup(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Get CORS Config
|
||||||
|
// @Accept json
|
||||||
|
// @Param id path int true "id"
|
||||||
|
// @Success 200 {object} request.CorsConfig
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/cors/{id} [get]
|
||||||
|
func (b *BaseApi) GetCORSConfig(c *gin.Context) {
|
||||||
|
id, err := helper.GetParamID(c)
|
||||||
|
if err != nil {
|
||||||
|
helper.BadRequest(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := websiteService.GetCors(id)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Update CORS Config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.CorsConfigReq true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/cors/update [post]
|
||||||
|
func (b *BaseApi) UpdateCORSConfig(c *gin.Context) {
|
||||||
|
var req request.CorsConfigReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteService.UpdateCors(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Update Stream Config
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.StreamUpdate true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/stream/update [post]
|
||||||
|
func (b *BaseApi) UpdateStreamConfig(c *gin.Context) {
|
||||||
|
var req request.StreamUpdate
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteService.UpdateStream(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Batch set HTTPS for websites
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.BatchWebsiteHttps true "request"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/batch/https [post]
|
||||||
|
func (b *BaseApi) BatchSetHttps(c *gin.Context) {
|
||||||
|
var req request.BatchWebsiteHttps
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteService.BatchSetHttps(c, req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|||||||
+117
-18
@@ -1,11 +1,14 @@
|
|||||||
package v2
|
package v2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
|
"mime/multipart"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/model"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
||||||
@@ -22,27 +25,39 @@ import (
|
|||||||
// @Router /websites/ssl/search [post]
|
// @Router /websites/ssl/search [post]
|
||||||
func (b *BaseApi) PageWebsiteSSL(c *gin.Context) {
|
func (b *BaseApi) PageWebsiteSSL(c *gin.Context) {
|
||||||
var req request.WebsiteSSLSearch
|
var req request.WebsiteSSLSearch
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
total, accounts, err := websiteSSLService.Page(req)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithDataGzipped(c, dto.PageResult{
|
||||||
|
Total: total,
|
||||||
|
Items: accounts,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Tags Website SSL
|
||||||
|
// @Summary List website ssl
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body request.WebsiteSSLListReq true "request"
|
||||||
|
// @Success 200 {array} response.WebsiteSSLDTO
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/ssl/list [post]
|
||||||
|
func (b *BaseApi) ListWebsiteSSL(c *gin.Context) {
|
||||||
|
var req request.WebsiteSSLListReq
|
||||||
if err := helper.CheckBind(&req, c); err != nil {
|
if err := helper.CheckBind(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(req.PageInfo, dto.PageInfo{}) {
|
list, err := websiteSSLService.Search(req)
|
||||||
total, accounts, err := websiteSSLService.Page(req)
|
if err != nil {
|
||||||
if err != nil {
|
helper.InternalServer(c, err)
|
||||||
helper.InternalServer(c, err)
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
helper.SuccessWithData(c, dto.PageResult{
|
|
||||||
Total: total,
|
|
||||||
Items: accounts,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
list, err := websiteSSLService.Search(req)
|
|
||||||
if err != nil {
|
|
||||||
helper.InternalServer(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
helper.SuccessWithData(c, list)
|
|
||||||
}
|
}
|
||||||
|
helper.SuccessWithDataGzipped(c, list)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags Website SSL
|
// @Tags Website SSL
|
||||||
@@ -216,6 +231,78 @@ func (b *BaseApi) UploadWebsiteSSL(c *gin.Context) {
|
|||||||
helper.Success(c)
|
helper.Success(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Website SSL
|
||||||
|
// @Summary Upload SSL file
|
||||||
|
// @Accept multipart/form-data
|
||||||
|
// @Param type formData string true "type"
|
||||||
|
// @Param description formData string false "description"
|
||||||
|
// @Param sslID formData string false "sslID"
|
||||||
|
// @Param privateKeyFile formData file true "privateKeyFile"
|
||||||
|
// @Param certificateFile formData file true "certificateFile"
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security Timestamp
|
||||||
|
// @Router /websites/ssl/upload/file [post]
|
||||||
|
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"上传 ssl 文件 [type]","formatEN":"Upload ssl file [type]"}
|
||||||
|
func (b *BaseApi) UploadSSLFile(c *gin.Context) {
|
||||||
|
var req request.WebsiteSSLFileUpload
|
||||||
|
|
||||||
|
req.Description = c.PostForm("description")
|
||||||
|
sslID := c.PostForm("sslID")
|
||||||
|
if sslID != "" {
|
||||||
|
req.SSLID, _ = strconv.ParseUint(sslID, 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
privateKeyFile, err := c.FormFile("privateKeyFile")
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
certificateFile, err := c.FormFile("certificateFile")
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
privateKeyContent, err := readUploadedFile(privateKeyFile)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
certificateContent, err := readUploadedFile(certificateFile)
|
||||||
|
if err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uploadReq := request.WebsiteSSLUpload{
|
||||||
|
Type: "paste",
|
||||||
|
PrivateKey: string(privateKeyContent),
|
||||||
|
Certificate: string(certificateContent),
|
||||||
|
Description: req.Description,
|
||||||
|
SSLID: uint(req.SSLID),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := websiteSSLService.Upload(uploadReq); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func readUploadedFile(fileHeader *multipart.FileHeader) ([]byte, error) {
|
||||||
|
file, err := fileHeader.Open()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
return io.ReadAll(file)
|
||||||
|
}
|
||||||
|
|
||||||
// @Tags Website SSL
|
// @Tags Website SSL
|
||||||
// @Summary Download SSL file
|
// @Summary Download SSL file
|
||||||
// @Accept json
|
// @Accept json
|
||||||
@@ -245,3 +332,15 @@ func (b *BaseApi) DownloadWebsiteSSL(c *gin.Context) {
|
|||||||
c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(info.Name()))
|
c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(info.Name()))
|
||||||
http.ServeContent(c.Writer, c.Request, info.Name(), info.ModTime(), file)
|
http.ServeContent(c.Writer, c.Request, info.Name(), info.ModTime(), file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) ImportMasterSSL(c *gin.Context) {
|
||||||
|
var req model.WebsiteSSL
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteSSLService.ImportMasterSSL(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.Success(c)
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,253 @@
|
|||||||
|
package dto
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type AgentCreateReq struct {
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
AppVersion string `json:"appVersion" validate:"required"`
|
||||||
|
WebUIPort int `json:"webUIPort" validate:"required"`
|
||||||
|
BridgePort int `json:"bridgePort"`
|
||||||
|
AgentType string `json:"agentType"`
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
APIType string `json:"apiType"`
|
||||||
|
MaxTokens int `json:"maxTokens"`
|
||||||
|
ContextWindow int `json:"contextWindow"`
|
||||||
|
AccountID uint `json:"accountId"`
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
BaseURL string `json:"baseURL"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
|
Advanced bool `json:"advanced"`
|
||||||
|
ContainerName string `json:"containerName"`
|
||||||
|
AllowPort bool `json:"allowPort"`
|
||||||
|
SpecifyIP string `json:"specifyIP"`
|
||||||
|
RestartPolicy string `json:"restartPolicy"`
|
||||||
|
CpuQuota float64 `json:"cpuQuota"`
|
||||||
|
MemoryLimit float64 `json:"memoryLimit"`
|
||||||
|
MemoryUnit string `json:"memoryUnit"`
|
||||||
|
PullImage bool `json:"pullImage"`
|
||||||
|
EditCompose bool `json:"editCompose"`
|
||||||
|
DockerCompose string `json:"dockerCompose"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentItem struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
AgentType string `json:"agentType"`
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
ProviderName string `json:"providerName"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
APIType string `json:"apiType"`
|
||||||
|
MaxTokens int `json:"maxTokens"`
|
||||||
|
ContextWindow int `json:"contextWindow"`
|
||||||
|
BaseURL string `json:"baseUrl"`
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
AppInstallID uint `json:"appInstallId"`
|
||||||
|
AccountID uint `json:"accountId"`
|
||||||
|
AppVersion string `json:"appVersion"`
|
||||||
|
Container string `json:"containerName"`
|
||||||
|
WebUIPort int `json:"webUIPort"`
|
||||||
|
BridgePort int `json:"bridgePort"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
ConfigPath string `json:"configPath"`
|
||||||
|
Upgradable bool `json:"upgradable"`
|
||||||
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentDeleteReq struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
|
ForceDelete bool `json:"forceDelete"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentTokenResetReq struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentModelConfigUpdateReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
AccountID uint `json:"accountId" validate:"required"`
|
||||||
|
Model string `json:"model" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentAccountCreateReq struct {
|
||||||
|
Provider string `json:"provider" validate:"required"`
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
APIKey string `json:"apiKey" validate:"required"`
|
||||||
|
RememberAPIKey bool `json:"rememberApiKey"`
|
||||||
|
BaseURL string `json:"baseURL"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
APIType string `json:"apiType"`
|
||||||
|
MaxTokens int `json:"maxTokens"`
|
||||||
|
ContextWindow int `json:"contextWindow"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentAccountUpdateReq struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
APIKey string `json:"apiKey" validate:"required"`
|
||||||
|
RememberAPIKey bool `json:"rememberApiKey"`
|
||||||
|
BaseURL string `json:"baseURL"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
APIType string `json:"apiType"`
|
||||||
|
MaxTokens int `json:"maxTokens"`
|
||||||
|
ContextWindow int `json:"contextWindow"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
SyncAgents bool `json:"syncAgents"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentAccountVerifyReq struct {
|
||||||
|
Provider string `json:"provider" validate:"required"`
|
||||||
|
APIKey string `json:"apiKey" validate:"required"`
|
||||||
|
BaseURL string `json:"baseURL"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentAccountDeleteReq struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentAccountSearch struct {
|
||||||
|
PageInfo
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentAccountInfo struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
ProviderName string `json:"providerName"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
RememberAPIKey bool `json:"rememberApiKey"`
|
||||||
|
BaseURL string `json:"baseUrl"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
APIType string `json:"apiType"`
|
||||||
|
MaxTokens int `json:"maxTokens"`
|
||||||
|
ContextWindow int `json:"contextWindow"`
|
||||||
|
Verified bool `json:"verified"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProviderModelInfo struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProviderInfo struct {
|
||||||
|
Sort uint `json:"-"`
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
DisplayName string `json:"displayName"`
|
||||||
|
BaseURL string `json:"baseUrl"`
|
||||||
|
Models []ProviderModelInfo `json:"models"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentFeishuConfigReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentFeishuConfigUpdateReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
BotName string `json:"botName" validate:"required"`
|
||||||
|
AppID string `json:"appId" validate:"required"`
|
||||||
|
AppSecret string `json:"appSecret" validate:"required"`
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
DmPolicy string `json:"dmPolicy" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentFeishuPairingApproveReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
PairingCode string `json:"pairingCode" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentFeishuConfig struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
DmPolicy string `json:"dmPolicy"`
|
||||||
|
BotName string `json:"botName"`
|
||||||
|
AppID string `json:"appId"`
|
||||||
|
AppSecret string `json:"appSecret"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentTelegramConfigReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentTelegramConfigUpdateReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
DmPolicy string `json:"dmPolicy" validate:"required"`
|
||||||
|
BotToken string `json:"botToken" validate:"required"`
|
||||||
|
Proxy string `json:"proxy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentTelegramConfig struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
DmPolicy string `json:"dmPolicy"`
|
||||||
|
BotToken string `json:"botToken"`
|
||||||
|
Proxy string `json:"proxy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentChannelPairingApproveReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
Type string `json:"type" validate:"required,oneof=feishu telegram discord"`
|
||||||
|
PairingCode string `json:"pairingCode" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentDiscordConfigReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentDiscordConfigUpdateReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
DmPolicy string `json:"dmPolicy" validate:"required"`
|
||||||
|
GroupPolicy string `json:"groupPolicy" validate:"required,oneof=open allowlist disabled"`
|
||||||
|
Token string `json:"token" validate:"required"`
|
||||||
|
Proxy string `json:"proxy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentDiscordConfig struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
DmPolicy string `json:"dmPolicy"`
|
||||||
|
GroupPolicy string `json:"groupPolicy"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
Proxy string `json:"proxy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentBrowserConfigReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentBrowserConfigUpdateReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
Headless bool `json:"headless"`
|
||||||
|
NoSandbox bool `json:"noSandbox"`
|
||||||
|
DefaultProfile string `json:"defaultProfile" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentBrowserConfig struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
ExecutablePath string `json:"executablePath"`
|
||||||
|
Headless bool `json:"headless"`
|
||||||
|
NoSandbox bool `json:"noSandbox"`
|
||||||
|
DefaultProfile string `json:"defaultProfile"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentOtherConfigReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentOtherConfigUpdateReq struct {
|
||||||
|
AgentID uint `json:"agentId" validate:"required"`
|
||||||
|
UserTimezone string `json:"userTimezone" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AgentOtherConfig struct {
|
||||||
|
UserTimezone string `json:"userTimezone"`
|
||||||
|
}
|
||||||
+44
-29
@@ -36,40 +36,43 @@ type AlertSearch struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AlertDTO struct {
|
type AlertDTO struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Cycle uint `json:"cycle"`
|
Cycle uint `json:"cycle"`
|
||||||
Count uint `json:"count"`
|
Count uint `json:"count"`
|
||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Project string `json:"project"`
|
Project string `json:"project"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
SendCount uint `json:"sendCount"`
|
SendCount uint `json:"sendCount"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
AdvancedParams string `json:"advancedParams"`
|
||||||
UpdatedAt time.Time `json:"updatedAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
UpdatedAt time.Time `json:"updatedAt"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AlertCreate struct {
|
type AlertCreate struct {
|
||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
Cycle uint `json:"cycle"`
|
Cycle uint `json:"cycle"`
|
||||||
Count uint `json:"count"`
|
Count uint `json:"count"`
|
||||||
Method string `json:"method" validate:"required"`
|
Method string `json:"method" validate:"required"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Project string `json:"project"`
|
Project string `json:"project"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
SendCount uint `json:"sendCount"`
|
SendCount uint `json:"sendCount"`
|
||||||
|
AdvancedParams string `json:"advancedParams"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AlertUpdate struct {
|
type AlertUpdate struct {
|
||||||
ID uint `json:"id" validate:"required"`
|
ID uint `json:"id" validate:"required"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Cycle uint `json:"cycle"`
|
Cycle uint `json:"cycle"`
|
||||||
Count uint `json:"count"`
|
Count uint `json:"count"`
|
||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Project string `json:"project"`
|
Project string `json:"project"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
SendCount uint `json:"sendCount"`
|
SendCount uint `json:"sendCount"`
|
||||||
|
AdvancedParams string `json:"advancedParams"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteRequest struct {
|
type DeleteRequest struct {
|
||||||
@@ -289,6 +292,7 @@ type AlertConfigTest struct {
|
|||||||
Host string `json:"host"`
|
Host string `json:"host"`
|
||||||
Port int `json:"port"`
|
Port int `json:"port"`
|
||||||
Sender string `json:"sender"`
|
Sender string `json:"sender"`
|
||||||
|
UserName string `json:"userName"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
DisplayName string `json:"displayName"`
|
DisplayName string `json:"displayName"`
|
||||||
Encryption string `json:"encryption"` // "ssl" / "tls" / "none"
|
Encryption string `json:"encryption"` // "ssl" / "tls" / "none"
|
||||||
@@ -313,15 +317,26 @@ type AlertCommonConfig struct {
|
|||||||
|
|
||||||
type AlertSmsConfig struct {
|
type AlertSmsConfig struct {
|
||||||
Phone string `json:"phone"`
|
Phone string `json:"phone"`
|
||||||
AlertDailyNum uint `json:"alertDailyNum"`
|
AlertDailyNum string `json:"alertDailyNum"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AlertEmailConfig struct {
|
type AlertEmailConfig struct {
|
||||||
Host string `json:"host"`
|
Host string `json:"host"`
|
||||||
Port int `json:"port"`
|
Port int `json:"port"`
|
||||||
Sender string `json:"sender"`
|
Sender string `json:"sender"`
|
||||||
|
UserName string `json:"userName"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
DisplayName string `json:"displayName"`
|
DisplayName string `json:"displayName"`
|
||||||
Encryption string `json:"encryption"` // "ssl" / "tls" / "none"
|
Encryption string `json:"encryption"` // "ssl" / "tls" / "none"
|
||||||
Recipient string `json:"recipient"`
|
Recipient string `json:"recipient"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AgentInfo struct {
|
||||||
|
NodeName string `json:"nodeName"`
|
||||||
|
NodeAddr string `json:"nodeAddr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AlertWebhookConfig struct {
|
||||||
|
DisplayName string `json:"displayName"`
|
||||||
|
Url string `json:"url"`
|
||||||
|
}
|
||||||
|
|||||||
+23
-19
@@ -12,6 +12,8 @@ type AppDatabase struct {
|
|||||||
DbUser string `json:"PANEL_DB_USER"`
|
DbUser string `json:"PANEL_DB_USER"`
|
||||||
Password string `json:"PANEL_DB_USER_PASSWORD"`
|
Password string `json:"PANEL_DB_USER_PASSWORD"`
|
||||||
DatabaseName string `json:"DATABASE_NAME"`
|
DatabaseName string `json:"DATABASE_NAME"`
|
||||||
|
Format string `json:"format"`
|
||||||
|
Collation string `json:"collation"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AuthParam struct {
|
type AuthParam struct {
|
||||||
@@ -82,25 +84,26 @@ type ExtraProperties struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AppProperty struct {
|
type AppProperty struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Tags []string `json:"tags"`
|
Tags []string `json:"tags"`
|
||||||
ShortDescZh string `json:"shortDescZh" yaml:"shortDescZh"`
|
ShortDescZh string `json:"shortDescZh" yaml:"shortDescZh"`
|
||||||
ShortDescEn string `json:"shortDescEn" yaml:"shortDescEn"`
|
ShortDescEn string `json:"shortDescEn" yaml:"shortDescEn"`
|
||||||
Description Locale `json:"description"`
|
Description Locale `json:"description"`
|
||||||
Key string `json:"key"`
|
Key string `json:"key"`
|
||||||
Required []string `json:"Required"`
|
Required []string `json:"Required"`
|
||||||
CrossVersionUpdate bool `json:"crossVersionUpdate"`
|
CrossVersionUpdate bool `json:"crossVersionUpdate" yaml:"crossVersionUpdate"`
|
||||||
Limit int `json:"limit"`
|
Limit int `json:"limit" yaml:"limit"`
|
||||||
Recommend int `json:"recommend"`
|
Recommend int `json:"recommend" yaml:"recommend"`
|
||||||
Website string `json:"website"`
|
Website string `json:"website"`
|
||||||
Github string `json:"github"`
|
Github string `json:"github"`
|
||||||
Document string `json:"document"`
|
Document string `json:"document"`
|
||||||
Architectures []string `json:"architectures"`
|
Architectures []string `json:"architectures"`
|
||||||
MemoryRequired int `json:"memoryRequired"`
|
MemoryRequired int `json:"memoryRequired" yaml:"memoryRequired"`
|
||||||
GpuSupport bool `json:"gpuSupport"`
|
GpuSupport bool `json:"gpuSupport" yaml:"gpuSupport"`
|
||||||
Version float64 `json:"version"`
|
Version float64 `json:"version"`
|
||||||
Deprecated float64 `json:"deprecated"`
|
Deprecated float64 `json:"deprecated"`
|
||||||
|
BatchInstallSupport bool `json:"batchInstallSupport"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AppConfigVersion struct {
|
type AppConfigVersion struct {
|
||||||
@@ -128,6 +131,7 @@ type Locale struct {
|
|||||||
Zh string `json:"zh"`
|
Zh string `json:"zh"`
|
||||||
Ko string `json:"ko"`
|
Ko string `json:"ko"`
|
||||||
Tr string `json:"tr"`
|
Tr string `json:"tr"`
|
||||||
|
Es string `json:"es-es" yaml:"es-es"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AppForm struct {
|
type AppForm struct {
|
||||||
|
|||||||
+22
-6
@@ -33,6 +33,12 @@ type BackupInfo struct {
|
|||||||
RememberAuth bool `json:"rememberAuth"`
|
RememberAuth bool `json:"rememberAuth"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type BackupCheckRes struct {
|
||||||
|
IsOk bool `json:"isOk"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
}
|
||||||
|
|
||||||
type ForBuckets struct {
|
type ForBuckets struct {
|
||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
AccessKey string `json:"accessKey"`
|
AccessKey string `json:"accessKey"`
|
||||||
@@ -53,13 +59,19 @@ type BackupOption struct {
|
|||||||
IsPublic bool `json:"isPublic"`
|
IsPublic bool `json:"isPublic"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UploadForRecover struct {
|
||||||
|
FilePath string `json:"filePath"`
|
||||||
|
TargetDir string `json:"targetDir"`
|
||||||
|
}
|
||||||
|
|
||||||
type CommonBackup struct {
|
type CommonBackup struct {
|
||||||
Type string `json:"type" validate:"required,oneof=app mysql mariadb redis website postgresql mysql-cluster postgresql-cluster redis-cluster"`
|
Type string `json:"type" validate:"required,oneof=app mysql mariadb redis website postgresql mysql-cluster postgresql-cluster redis-cluster"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
DetailName string `json:"detailName"`
|
DetailName string `json:"detailName"`
|
||||||
Secret string `json:"secret"`
|
Secret string `json:"secret"`
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
FileName string `json:"fileName"`
|
FileName string `json:"fileName"`
|
||||||
|
Args []string `json:"args"`
|
||||||
|
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
}
|
}
|
||||||
@@ -72,6 +84,7 @@ type CommonRecover struct {
|
|||||||
Secret string `json:"secret"`
|
Secret string `json:"secret"`
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
BackupRecordID uint `json:"backupRecordID"`
|
BackupRecordID uint `json:"backupRecordID"`
|
||||||
|
Timeout int `json:"timeout"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type RecordSearch struct {
|
type RecordSearch struct {
|
||||||
@@ -94,6 +107,9 @@ type BackupRecords struct {
|
|||||||
DownloadAccountID uint `json:"downloadAccountID"`
|
DownloadAccountID uint `json:"downloadAccountID"`
|
||||||
FileDir string `json:"fileDir"`
|
FileDir string `json:"fileDir"`
|
||||||
FileName string `json:"fileName"`
|
FileName string `json:"fileName"`
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+16
-9
@@ -30,8 +30,10 @@ type ClamInfo struct {
|
|||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
InfectedStrategy string `json:"infectedStrategy"`
|
InfectedStrategy string `json:"infectedStrategy"`
|
||||||
InfectedDir string `json:"infectedDir"`
|
InfectedDir string `json:"infectedDir"`
|
||||||
LastHandleDate string `json:"lastHandleDate"`
|
LastRecordStatus string `json:"lastRecordStatus"`
|
||||||
|
LastRecordTime string `json:"lastRecordTime"`
|
||||||
Spec string `json:"spec"`
|
Spec string `json:"spec"`
|
||||||
|
Timeout uint `json:"timeout"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
AlertCount uint `json:"alertCount"`
|
AlertCount uint `json:"alertCount"`
|
||||||
AlertMethod string `json:"alertMethod"`
|
AlertMethod string `json:"alertMethod"`
|
||||||
@@ -41,6 +43,7 @@ type ClamLogSearch struct {
|
|||||||
PageInfo
|
PageInfo
|
||||||
|
|
||||||
ClamID uint `json:"clamID"`
|
ClamID uint `json:"clamID"`
|
||||||
|
Status string `json:"status"`
|
||||||
StartTime time.Time `json:"startTime"`
|
StartTime time.Time `json:"startTime"`
|
||||||
EndTime time.Time `json:"endTime"`
|
EndTime time.Time `json:"endTime"`
|
||||||
}
|
}
|
||||||
@@ -56,13 +59,16 @@ type ClamFileReq struct {
|
|||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ClamLog struct {
|
type ClamRecord struct {
|
||||||
Name string `json:"name"`
|
ID uint `json:"id"`
|
||||||
ScanDate string `json:"scanDate"`
|
TaskID string `json:"taskID"`
|
||||||
ScanTime string `json:"scanTime"`
|
StartTime time.Time `json:"startTime"`
|
||||||
InfectedFiles string `json:"infectedFiles"`
|
ScanTime string `json:"scanTime"`
|
||||||
TotalError string `json:"totalError"`
|
InfectedFiles string `json:"infectedFiles"`
|
||||||
Status string `json:"status"`
|
TotalError string `json:"totalError"`
|
||||||
|
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ClamCreate struct {
|
type ClamCreate struct {
|
||||||
@@ -72,6 +78,7 @@ type ClamCreate struct {
|
|||||||
InfectedStrategy string `json:"infectedStrategy"`
|
InfectedStrategy string `json:"infectedStrategy"`
|
||||||
InfectedDir string `json:"infectedDir"`
|
InfectedDir string `json:"infectedDir"`
|
||||||
Spec string `json:"spec"`
|
Spec string `json:"spec"`
|
||||||
|
Timeout uint `json:"timeout"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
AlertCount uint `json:"alertCount"`
|
AlertCount uint `json:"alertCount"`
|
||||||
AlertTitle string `json:"alertTitle"`
|
AlertTitle string `json:"alertTitle"`
|
||||||
@@ -86,6 +93,7 @@ type ClamUpdate struct {
|
|||||||
InfectedStrategy string `json:"infectedStrategy"`
|
InfectedStrategy string `json:"infectedStrategy"`
|
||||||
InfectedDir string `json:"infectedDir"`
|
InfectedDir string `json:"infectedDir"`
|
||||||
Spec string `json:"spec"`
|
Spec string `json:"spec"`
|
||||||
|
Timeout uint `json:"timeout"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
AlertCount uint `json:"alertCount"`
|
AlertCount uint `json:"alertCount"`
|
||||||
AlertTitle string `json:"alertTitle"`
|
AlertTitle string `json:"alertTitle"`
|
||||||
@@ -98,7 +106,6 @@ type ClamUpdateStatus struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ClamDelete struct {
|
type ClamDelete struct {
|
||||||
RemoveRecord bool `json:"removeRecord"`
|
|
||||||
RemoveInfected bool `json:"removeInfected"`
|
RemoveInfected bool `json:"removeInfected"`
|
||||||
Ids []uint `json:"ids" validate:"required"`
|
Ids []uint `json:"ids" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ type ComposeTemplateCreate struct {
|
|||||||
Content string `json:"content"`
|
Content string `json:"content"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ComposeTemplateBatch struct {
|
||||||
|
Templates []ComposeTemplateCreate `json:"templates" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
type ComposeTemplateUpdate struct {
|
type ComposeTemplateUpdate struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
|
|||||||
+103
-59
@@ -15,8 +15,9 @@ type PageContainer struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type InspectReq struct {
|
type InspectReq struct {
|
||||||
ID string `json:"id" validate:"required"`
|
ID string `json:"id" validate:"required"`
|
||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
|
Detail string `json:"detail"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContainerInfo struct {
|
type ContainerInfo struct {
|
||||||
@@ -37,6 +38,9 @@ type ContainerInfo struct {
|
|||||||
AppName string `json:"appName"`
|
AppName string `json:"appName"`
|
||||||
AppInstallName string `json:"appInstallName"`
|
AppInstallName string `json:"appInstallName"`
|
||||||
Websites []string `json:"websites"`
|
Websites []string `json:"websites"`
|
||||||
|
|
||||||
|
IsPinned bool `json:"isPinned"`
|
||||||
|
Description string `json:"description"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContainerOptions struct {
|
type ContainerOptions struct {
|
||||||
@@ -45,14 +49,13 @@ type ContainerOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ContainerStatus struct {
|
type ContainerStatus struct {
|
||||||
All uint `json:"all"`
|
Created int `json:"created"`
|
||||||
Created uint `json:"created"`
|
Running int `json:"running"`
|
||||||
Running uint `json:"running"`
|
Paused int `json:"paused"`
|
||||||
Paused uint `json:"paused"`
|
Restarting int `json:"restarting"`
|
||||||
Restarting uint `json:"restarting"`
|
Removing int `json:"removing"`
|
||||||
Removing uint `json:"removing"`
|
Exited int `json:"exited"`
|
||||||
Exited uint `json:"exited"`
|
Dead int `json:"dead"`
|
||||||
Dead uint `json:"dead"`
|
|
||||||
|
|
||||||
ContainerCount int `json:"containerCount"`
|
ContainerCount int `json:"containerCount"`
|
||||||
ComposeCount int `json:"composeCount"`
|
ComposeCount int `json:"composeCount"`
|
||||||
@@ -61,8 +64,6 @@ type ContainerStatus struct {
|
|||||||
NetworkCount int `json:"networkCount"`
|
NetworkCount int `json:"networkCount"`
|
||||||
VolumeCount int `json:"volumeCount"`
|
VolumeCount int `json:"volumeCount"`
|
||||||
RepoCount int `json:"repoCount"`
|
RepoCount int `json:"repoCount"`
|
||||||
|
|
||||||
ImageSize uint64 `json:"imageSize"`
|
|
||||||
}
|
}
|
||||||
type ResourceLimit struct {
|
type ResourceLimit struct {
|
||||||
CPU int `json:"cpu"`
|
CPU int `json:"cpu"`
|
||||||
@@ -70,18 +71,16 @@ type ResourceLimit struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ContainerOperate struct {
|
type ContainerOperate struct {
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
ContainerID string `json:"containerID"`
|
ForcePull bool `json:"forcePull"`
|
||||||
ForcePull bool `json:"forcePull"`
|
Name string `json:"name" validate:"required"`
|
||||||
Name string `json:"name" validate:"required"`
|
Image string `json:"image" validate:"required"`
|
||||||
Image string `json:"image" validate:"required"`
|
|
||||||
Network string `json:"network"`
|
Hostname string `json:"hostname"`
|
||||||
Hostname string `json:"hostname"`
|
DomainName string `json:"domainName"`
|
||||||
DomainName string `json:"domainName"`
|
DNS []string `json:"dns"`
|
||||||
MacAddr string `json:"macAddr"`
|
Networks []ContainerNetwork `json:"networks"`
|
||||||
DNS []string `json:"dns"`
|
|
||||||
Ipv4 string `json:"ipv4"`
|
|
||||||
Ipv6 string `json:"ipv6"`
|
|
||||||
PublishAllPorts bool `json:"publishAllPorts"`
|
PublishAllPorts bool `json:"publishAllPorts"`
|
||||||
ExposedPorts []PortHelper `json:"exposedPorts"`
|
ExposedPorts []PortHelper `json:"exposedPorts"`
|
||||||
Tty bool `json:"tty"`
|
Tty bool `json:"tty"`
|
||||||
@@ -96,23 +95,48 @@ type ContainerOperate struct {
|
|||||||
Privileged bool `json:"privileged"`
|
Privileged bool `json:"privileged"`
|
||||||
AutoRemove bool `json:"autoRemove"`
|
AutoRemove bool `json:"autoRemove"`
|
||||||
Volumes []VolumeHelper `json:"volumes"`
|
Volumes []VolumeHelper `json:"volumes"`
|
||||||
|
ExtraHosts []ExtraHost `json:"extraHosts"`
|
||||||
Labels []string `json:"labels"`
|
Labels []string `json:"labels"`
|
||||||
Env []string `json:"env"`
|
Env []string `json:"env"`
|
||||||
RestartPolicy string `json:"restartPolicy"`
|
RestartPolicy string `json:"restartPolicy"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ExtraHost struct {
|
||||||
|
Hostname string `json:"hostname"`
|
||||||
|
IP string `json:"ip"`
|
||||||
|
}
|
||||||
|
type ContainerNetwork struct {
|
||||||
|
Network string `json:"network"`
|
||||||
|
Ipv4 string `json:"ipv4"`
|
||||||
|
Ipv6 string `json:"ipv6"`
|
||||||
|
MacAddr string `json:"macAddr"`
|
||||||
|
}
|
||||||
|
|
||||||
type ContainerCreateByCommand struct {
|
type ContainerCreateByCommand struct {
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
Command string `json:"command"`
|
Command string `json:"command"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContainerUpgrade struct {
|
type ContainerUpgrade struct {
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
Name string `json:"name" validate:"required"`
|
Names []string `json:"names" validate:"required"`
|
||||||
Image string `json:"image" validate:"required"`
|
Image string `json:"image" validate:"required"`
|
||||||
ForcePull bool `json:"forcePull"`
|
ForcePull bool `json:"forcePull"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ContainerItemStats struct {
|
||||||
|
SizeRw int64 `json:"sizeRw"`
|
||||||
|
SizeRootFs int64 `json:"sizeRootFs"`
|
||||||
|
|
||||||
|
ContainerUsage int64 `json:"containerUsage"`
|
||||||
|
ContainerReclaimable int64 `json:"containerReclaimable"`
|
||||||
|
ImageUsage int64 `json:"imageUsage"`
|
||||||
|
ImageReclaimable int64 `json:"imageReclaimable"`
|
||||||
|
VolumeUsage int64 `json:"volumeUsage"`
|
||||||
|
VolumeReclaimable int64 `json:"volumeReclaimable"`
|
||||||
|
BuildCacheUsage int64 `json:"buildCacheUsage"`
|
||||||
|
BuildCacheReclaimable int64 `json:"buildCacheReclaimable"`
|
||||||
|
}
|
||||||
type ContainerListStats struct {
|
type ContainerListStats struct {
|
||||||
ContainerID string `json:"containerID"`
|
ContainerID string `json:"containerID"`
|
||||||
|
|
||||||
@@ -144,6 +168,7 @@ type VolumeHelper struct {
|
|||||||
SourceDir string `json:"sourceDir"`
|
SourceDir string `json:"sourceDir"`
|
||||||
ContainerDir string `json:"containerDir"`
|
ContainerDir string `json:"containerDir"`
|
||||||
Mode string `json:"mode"`
|
Mode string `json:"mode"`
|
||||||
|
Shared string `json:"shared"`
|
||||||
}
|
}
|
||||||
type PortHelper struct {
|
type PortHelper struct {
|
||||||
HostIP string `json:"hostIP"`
|
HostIP string `json:"hostIP"`
|
||||||
@@ -153,6 +178,7 @@ type PortHelper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ContainerOperation struct {
|
type ContainerOperation struct {
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
Names []string `json:"names" validate:"required"`
|
Names []string `json:"names" validate:"required"`
|
||||||
Operation string `json:"operation" validate:"required,oneof=up start stop restart kill pause unpause remove"`
|
Operation string `json:"operation" validate:"required,oneof=up start stop restart kill pause unpause remove"`
|
||||||
}
|
}
|
||||||
@@ -209,11 +235,12 @@ type NetworkCreate struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Volume struct {
|
type Volume struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Labels []string `json:"labels"`
|
Labels []VolumeOption `json:"labels"`
|
||||||
Driver string `json:"driver"`
|
Driver string `json:"driver"`
|
||||||
Mountpoint string `json:"mountpoint"`
|
Mountpoint string `json:"mountpoint"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
Options []VolumeOption `json:"options"`
|
||||||
}
|
}
|
||||||
type VolumeCreate struct {
|
type VolumeCreate struct {
|
||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
@@ -221,7 +248,10 @@ type VolumeCreate struct {
|
|||||||
Options []string `json:"options"`
|
Options []string `json:"options"`
|
||||||
Labels []string `json:"labels"`
|
Labels []string `json:"labels"`
|
||||||
}
|
}
|
||||||
|
type VolumeOption struct {
|
||||||
|
Key string `json:"key"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
}
|
||||||
type BatchDelete struct {
|
type BatchDelete struct {
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
Force bool `json:"force"`
|
Force bool `json:"force"`
|
||||||
@@ -229,48 +259,61 @@ type BatchDelete struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ComposeInfo struct {
|
type ComposeInfo struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
CreatedAt string `json:"createdAt"`
|
CreatedAt string `json:"createdAt"`
|
||||||
CreatedBy string `json:"createdBy"`
|
CreatedBy string `json:"createdBy"`
|
||||||
ContainerNumber int `json:"containerNumber"`
|
ContainerCount int `json:"containerCount"`
|
||||||
ConfigFile string `json:"configFile"`
|
RunningCount int `json:"runningCount"`
|
||||||
Workdir string `json:"workdir"`
|
ConfigFile string `json:"configFile"`
|
||||||
Path string `json:"path"`
|
Workdir string `json:"workdir"`
|
||||||
Containers []ComposeContainer `json:"containers"`
|
Path string `json:"path"`
|
||||||
Env []string `json:"env"`
|
Containers []ComposeContainer `json:"containers"`
|
||||||
|
Env string `json:"env"`
|
||||||
}
|
}
|
||||||
type ComposeContainer struct {
|
type ComposeContainer struct {
|
||||||
ContainerID string `json:"containerID"`
|
ContainerID string `json:"containerID"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
CreateTime string `json:"createTime"`
|
CreateTime string `json:"createTime"`
|
||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
|
Ports []string `json:"ports"`
|
||||||
}
|
}
|
||||||
type ComposeCreate struct {
|
type ComposeCreate struct {
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
From string `json:"from" validate:"required,oneof=edit path template"`
|
From string `json:"from" validate:"required,oneof=edit path template"`
|
||||||
File string `json:"file"`
|
File string `json:"file"`
|
||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
Template uint `json:"template"`
|
Template uint `json:"template"`
|
||||||
Env []string `json:"env"`
|
Env string `json:"env"`
|
||||||
|
ForcePull bool `json:"forcePull"`
|
||||||
}
|
}
|
||||||
type ComposeOperation struct {
|
type ComposeOperation struct {
|
||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
Operation string `json:"operation" validate:"required,oneof=up start stop down delete"`
|
Operation string `json:"operation" validate:"required,oneof=up start restart stop down delete"`
|
||||||
WithFile bool `json:"withFile"`
|
WithFile bool `json:"withFile"`
|
||||||
|
Force bool `json:"force"`
|
||||||
}
|
}
|
||||||
type ComposeUpdate struct {
|
type ComposeUpdate struct {
|
||||||
Name string `json:"name" validate:"required"`
|
TaskID string `json:"taskID"`
|
||||||
Path string `json:"path" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
Content string `json:"content" validate:"required"`
|
Path string `json:"path" validate:"required"`
|
||||||
Env []string `json:"env"`
|
DetailPath string `json:"detailPath"`
|
||||||
|
Content string `json:"content" validate:"required"`
|
||||||
|
Env string `json:"env"`
|
||||||
|
ForcePull bool `json:"forcePull"`
|
||||||
|
}
|
||||||
|
type ComposeLogClean struct {
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
Path string `json:"path" validate:"required"`
|
||||||
|
DetailPath string `json:"detailPath"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContainerLog struct {
|
type ContainerLog struct {
|
||||||
Container string `json:"container" validate:"required"`
|
Container string `json:"container" validate:"required"`
|
||||||
Since string `json:"since"`
|
Since string `json:"since"`
|
||||||
Tail uint `json:"tail"`
|
Tail uint `json:"tail"`
|
||||||
|
Timestamp bool `json:"timestamp"`
|
||||||
ContainerType string `json:"containerType"`
|
ContainerType string `json:"containerType"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,5 +323,6 @@ type StreamLog struct {
|
|||||||
Since string
|
Since string
|
||||||
Follow bool
|
Follow bool
|
||||||
Tail string
|
Tail string
|
||||||
|
Timestamp bool
|
||||||
Type string
|
Type string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,10 +49,17 @@ type CronjobOperate struct {
|
|||||||
Timeout uint `json:"timeout" validate:"number,min=1"`
|
Timeout uint `json:"timeout" validate:"number,min=1"`
|
||||||
IgnoreErr bool `json:"ignoreErr"`
|
IgnoreErr bool `json:"ignoreErr"`
|
||||||
Secret string `json:"secret"`
|
Secret string `json:"secret"`
|
||||||
|
Args string `json:"args"`
|
||||||
|
|
||||||
AlertCount uint `json:"alertCount"`
|
AlertCount uint `json:"alertCount"`
|
||||||
AlertTitle string `json:"alertTitle"`
|
AlertTitle string `json:"alertTitle"`
|
||||||
AlertMethod string `json:"alertMethod"`
|
AlertMethod string `json:"alertMethod"`
|
||||||
|
|
||||||
|
CleanLogConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type CleanLogConfig struct {
|
||||||
|
Scopes []string `json:"scopes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SnapshotRule struct {
|
type SnapshotRule struct {
|
||||||
@@ -65,11 +72,6 @@ type CronjobUpdateStatus struct {
|
|||||||
Status string `json:"status" validate:"required"`
|
Status string `json:"status" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type CronjobDownload struct {
|
|
||||||
RecordID uint `json:"recordID" validate:"required"`
|
|
||||||
BackupAccountID uint `json:"backupAccountID" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CronjobClean struct {
|
type CronjobClean struct {
|
||||||
IsDelete bool `json:"isDelete"`
|
IsDelete bool `json:"isDelete"`
|
||||||
CleanData bool `json:"cleanData"`
|
CleanData bool `json:"cleanData"`
|
||||||
@@ -122,6 +124,7 @@ type CronjobInfo struct {
|
|||||||
LastRecordTime string `json:"lastRecordTime"`
|
LastRecordTime string `json:"lastRecordTime"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
Secret string `json:"secret"`
|
Secret string `json:"secret"`
|
||||||
|
Args string `json:"args"`
|
||||||
|
|
||||||
AlertCount uint `json:"alertCount"`
|
AlertCount uint `json:"alertCount"`
|
||||||
}
|
}
|
||||||
@@ -161,6 +164,7 @@ type CronjobTrans struct {
|
|||||||
IgnoreErr bool `json:"ignoreErr"`
|
IgnoreErr bool `json:"ignoreErr"`
|
||||||
SnapshotRule SnapshotTransHelper `json:"snapshotRule"`
|
SnapshotRule SnapshotTransHelper `json:"snapshotRule"`
|
||||||
Secret string `json:"secret"`
|
Secret string `json:"secret"`
|
||||||
|
Args string `json:"args"`
|
||||||
|
|
||||||
SourceAccounts []string `json:"sourceAccounts"`
|
SourceAccounts []string `json:"sourceAccounts"`
|
||||||
DownloadAccount string `json:"downloadAccount"`
|
DownloadAccount string `json:"downloadAccount"`
|
||||||
|
|||||||
+34
-10
@@ -13,25 +13,44 @@ type DashboardBase struct {
|
|||||||
Platform string `json:"platform"`
|
Platform string `json:"platform"`
|
||||||
PlatformFamily string `json:"platformFamily"`
|
PlatformFamily string `json:"platformFamily"`
|
||||||
PlatformVersion string `json:"platformVersion"`
|
PlatformVersion string `json:"platformVersion"`
|
||||||
|
PrettyDistro string `json:"prettyDistro"`
|
||||||
KernelArch string `json:"kernelArch"`
|
KernelArch string `json:"kernelArch"`
|
||||||
KernelVersion string `json:"kernelVersion"`
|
KernelVersion string `json:"kernelVersion"`
|
||||||
VirtualizationSystem string `json:"virtualizationSystem"`
|
VirtualizationSystem string `json:"virtualizationSystem"`
|
||||||
IpV4Addr string `json:"ipV4Addr"`
|
IpV4Addr string `json:"ipV4Addr"`
|
||||||
SystemProxy string `json:"systemProxy"`
|
SystemProxy string `json:"systemProxy"`
|
||||||
|
|
||||||
CPUCores int `json:"cpuCores"`
|
CPUCores int `json:"cpuCores"`
|
||||||
CPULogicalCores int `json:"cpuLogicalCores"`
|
CPULogicalCores int `json:"cpuLogicalCores"`
|
||||||
CPUModelName string `json:"cpuModelName"`
|
CPUModelName string `json:"cpuModelName"`
|
||||||
|
CPUMhz float64 `json:"cpuMhz"`
|
||||||
|
|
||||||
|
QuickJumps []QuickJump `json:"quickJump"`
|
||||||
CurrentInfo DashboardCurrent `json:"currentInfo"`
|
CurrentInfo DashboardCurrent `json:"currentInfo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ChangeQuicks struct {
|
||||||
|
Quicks []QuickJump `json:"quicks"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type QuickJump struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Alias string `json:"alias"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Detail string `json:"detail"`
|
||||||
|
Recommend int `json:"recommend"`
|
||||||
|
IsShow bool `json:"isShow"`
|
||||||
|
Router string `json:"router"`
|
||||||
|
}
|
||||||
|
|
||||||
type OsInfo struct {
|
type OsInfo struct {
|
||||||
OS string `json:"os"`
|
OS string `json:"os"`
|
||||||
Platform string `json:"platform"`
|
Platform string `json:"platform"`
|
||||||
PlatformFamily string `json:"platformFamily"`
|
PlatformFamily string `json:"platformFamily"`
|
||||||
KernelArch string `json:"kernelArch"`
|
KernelArch string `json:"kernelArch"`
|
||||||
KernelVersion string `json:"kernelVersion"`
|
KernelVersion string `json:"kernelVersion"`
|
||||||
|
PrettyDistro string `json:"prettyDistro"`
|
||||||
|
|
||||||
DiskSize int64 `json:"diskSize"`
|
DiskSize int64 `json:"diskSize"`
|
||||||
}
|
}
|
||||||
@@ -42,9 +61,10 @@ type NodeCurrent struct {
|
|||||||
Load15 float64 `json:"load15"`
|
Load15 float64 `json:"load15"`
|
||||||
LoadUsagePercent float64 `json:"loadUsagePercent"`
|
LoadUsagePercent float64 `json:"loadUsagePercent"`
|
||||||
|
|
||||||
CPUUsedPercent float64 `json:"cpuUsedPercent"`
|
CPUUsedPercent float64 `json:"cpuUsedPercent"`
|
||||||
CPUUsed float64 `json:"cpuUsed"`
|
CPUUsed float64 `json:"cpuUsed"`
|
||||||
CPUTotal int `json:"cpuTotal"`
|
CPUTotal int `json:"cpuTotal"`
|
||||||
|
CPUDetailedPercent []float64 `json:"cpuDetailedPercent"`
|
||||||
|
|
||||||
MemoryTotal uint64 `json:"memoryTotal"`
|
MemoryTotal uint64 `json:"memoryTotal"`
|
||||||
MemoryAvailable uint64 `json:"memoryAvailable"`
|
MemoryAvailable uint64 `json:"memoryAvailable"`
|
||||||
@@ -68,10 +88,11 @@ type DashboardCurrent struct {
|
|||||||
Load15 float64 `json:"load15"`
|
Load15 float64 `json:"load15"`
|
||||||
LoadUsagePercent float64 `json:"loadUsagePercent"`
|
LoadUsagePercent float64 `json:"loadUsagePercent"`
|
||||||
|
|
||||||
CPUPercent []float64 `json:"cpuPercent"`
|
CPUPercent []float64 `json:"cpuPercent"`
|
||||||
CPUUsedPercent float64 `json:"cpuUsedPercent"`
|
CPUUsedPercent float64 `json:"cpuUsedPercent"`
|
||||||
CPUUsed float64 `json:"cpuUsed"`
|
CPUUsed float64 `json:"cpuUsed"`
|
||||||
CPUTotal int `json:"cpuTotal"`
|
CPUTotal int `json:"cpuTotal"`
|
||||||
|
CPUDetailedPercent []float64 `json:"cpuDetailedPercent"`
|
||||||
|
|
||||||
MemoryTotal uint64 `json:"memoryTotal"`
|
MemoryTotal uint64 `json:"memoryTotal"`
|
||||||
MemoryUsed uint64 `json:"memoryUsed"`
|
MemoryUsed uint64 `json:"memoryUsed"`
|
||||||
@@ -100,6 +121,9 @@ type DashboardCurrent struct {
|
|||||||
GPUData []GPUInfo `json:"gpuData"`
|
GPUData []GPUInfo `json:"gpuData"`
|
||||||
XPUData []XPUInfo `json:"xpuData"`
|
XPUData []XPUInfo `json:"xpuData"`
|
||||||
|
|
||||||
|
TopCPUItems []Process `json:"topCPUItems"`
|
||||||
|
TopMemItems []Process `json:"topMemItems"`
|
||||||
|
|
||||||
ShotTime time.Time `json:"shotTime"`
|
ShotTime time.Time `json:"shotTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+31
-16
@@ -38,6 +38,7 @@ type MysqlDBInfo struct {
|
|||||||
From string `json:"from"`
|
From string `json:"from"`
|
||||||
MysqlName string `json:"mysqlName"`
|
MysqlName string `json:"mysqlName"`
|
||||||
Format string `json:"format"`
|
Format string `json:"format"`
|
||||||
|
Collation string `json:"collation"`
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
Permission string `json:"permission"`
|
Permission string `json:"permission"`
|
||||||
@@ -57,13 +58,19 @@ type MysqlDBCreate struct {
|
|||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
From string `json:"from" validate:"required,oneof=local remote"`
|
From string `json:"from" validate:"required,oneof=local remote"`
|
||||||
Database string `json:"database" validate:"required"`
|
Database string `json:"database" validate:"required"`
|
||||||
Format string `json:"format" validate:"required,oneof=utf8mb4 utf8 gbk big5"`
|
Format string `json:"format" validate:"required"`
|
||||||
|
Collation string `json:"collation"`
|
||||||
Username string `json:"username" validate:"required"`
|
Username string `json:"username" validate:"required"`
|
||||||
Password string `json:"password" validate:"required"`
|
Password string `json:"password" validate:"required"`
|
||||||
Permission string `json:"permission" validate:"required"`
|
Permission string `json:"permission" validate:"required"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MysqlFormatCollationOption struct {
|
||||||
|
Format string `json:"format"`
|
||||||
|
Collations []string `json:"collations"`
|
||||||
|
}
|
||||||
|
|
||||||
type BindUser struct {
|
type BindUser struct {
|
||||||
Database string `json:"database" validate:"required"`
|
Database string `json:"database" validate:"required"`
|
||||||
DB string `json:"db" validate:"required"`
|
DB string `json:"db" validate:"required"`
|
||||||
@@ -251,6 +258,7 @@ type DatabaseInfo struct {
|
|||||||
Version string `json:"version"`
|
Version string `json:"version"`
|
||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
Port uint `json:"port"`
|
Port uint `json:"port"`
|
||||||
|
InitialDB string `json:"initialDB"`
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
|
|
||||||
@@ -281,14 +289,15 @@ type DatabaseItem struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type DatabaseCreate struct {
|
type DatabaseCreate struct {
|
||||||
Name string `json:"name" validate:"required,max=256"`
|
Name string `json:"name" validate:"required,max=256"`
|
||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
From string `json:"from" validate:"required,oneof=local remote"`
|
From string `json:"from" validate:"required,oneof=local remote"`
|
||||||
Version string `json:"version" validate:"required"`
|
Version string `json:"version" validate:"required"`
|
||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
Port uint `json:"port"`
|
Port uint `json:"port"`
|
||||||
Username string `json:"username" validate:"required"`
|
InitialDB string `json:"initialDB"`
|
||||||
Password string `json:"password"`
|
Username string `json:"username" validate:"required"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
|
||||||
SSL bool `json:"ssl"`
|
SSL bool `json:"ssl"`
|
||||||
RootCert string `json:"rootCert"`
|
RootCert string `json:"rootCert"`
|
||||||
@@ -301,13 +310,14 @@ type DatabaseCreate struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type DatabaseUpdate struct {
|
type DatabaseUpdate struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
Version string `json:"version" validate:"required"`
|
Version string `json:"version" validate:"required"`
|
||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
Port uint `json:"port"`
|
Port uint `json:"port"`
|
||||||
Username string `json:"username" validate:"required"`
|
InitialDB string `json:"initialDB"`
|
||||||
Password string `json:"password"`
|
Username string `json:"username" validate:"required"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
|
||||||
SSL bool `json:"ssl"`
|
SSL bool `json:"ssl"`
|
||||||
RootCert string `json:"rootCert"`
|
RootCert string `json:"rootCert"`
|
||||||
@@ -329,3 +339,8 @@ type LoadRedisStatus struct {
|
|||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DBResource struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ type SwapHelper struct {
|
|||||||
Size uint64 `json:"size"`
|
Size uint64 `json:"size"`
|
||||||
Used string `json:"used"`
|
Used string `json:"used"`
|
||||||
|
|
||||||
IsNew bool `json:"isNew"`
|
IsNew bool `json:"isNew"`
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TimeZoneOptions struct {
|
type TimeZoneOptions struct {
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package dto
|
||||||
|
|
||||||
|
type LsblkDevice struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Size string `json:"size"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
MountPoint *string `json:"mountpoint"`
|
||||||
|
FsType *string `json:"fstype"`
|
||||||
|
Model *string `json:"model"`
|
||||||
|
Serial string `json:"serial"`
|
||||||
|
Tran string `json:"tran"`
|
||||||
|
Rota bool `json:"rota"`
|
||||||
|
Children []LsblkDevice `json:"children,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type LsblkOutput struct {
|
||||||
|
BlockDevices []LsblkDevice `json:"blockdevices"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DiskFormatRequest struct {
|
||||||
|
Device string `json:"device" `
|
||||||
|
Filesystem string `json:"filesystem" `
|
||||||
|
Label string `json:"label,omitempty" `
|
||||||
|
QuickFormat bool `json:"quickFormat,omitempty"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package dto
|
||||||
|
|
||||||
|
type LogFileRes struct {
|
||||||
|
Lines []string `json:"lines"`
|
||||||
|
IsEndOfFile bool `json:"isEndOfFile"`
|
||||||
|
TotalPages int `json:"totalPages"`
|
||||||
|
TotalLines int `json:"totalLines"`
|
||||||
|
}
|
||||||
@@ -4,6 +4,8 @@ type FirewallBaseInfo struct {
|
|||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
IsExist bool `json:"isExist"`
|
IsExist bool `json:"isExist"`
|
||||||
IsActive bool `json:"isActive"`
|
IsActive bool `json:"isActive"`
|
||||||
|
IsInit bool `json:"isInit"`
|
||||||
|
IsBind bool `json:"isBind"`
|
||||||
Version string `json:"version"`
|
Version string `json:"version"`
|
||||||
PingStatus string `json:"pingStatus"`
|
PingStatus string `json:"pingStatus"`
|
||||||
}
|
}
|
||||||
@@ -17,11 +19,14 @@ type RuleSearch struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type FirewallOperation struct {
|
type FirewallOperation struct {
|
||||||
Operation string `json:"operation" validate:"required,oneof=start stop restart disablePing enablePing"`
|
Operation string `json:"operation" validate:"required,oneof=start stop restart disableBanPing enableBanPing"`
|
||||||
|
WithDockerRestart bool `json:"withDockerRestart"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PortRuleOperate struct {
|
type PortRuleOperate struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
Operation string `json:"operation" validate:"required,oneof=add remove"`
|
Operation string `json:"operation" validate:"required,oneof=add remove"`
|
||||||
|
Chain string `json:"chain"`
|
||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
Port string `json:"port" validate:"required"`
|
Port string `json:"port" validate:"required"`
|
||||||
Protocol string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"`
|
Protocol string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"`
|
||||||
@@ -36,6 +41,7 @@ type ForwardRuleOperate struct {
|
|||||||
Operation string `json:"operation" validate:"required,oneof=add remove"`
|
Operation string `json:"operation" validate:"required,oneof=add remove"`
|
||||||
Num string `json:"num"`
|
Num string `json:"num"`
|
||||||
Protocol string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"`
|
Protocol string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"`
|
||||||
|
Interface string `json:"interface"`
|
||||||
Port string `json:"port" validate:"required"`
|
Port string `json:"port" validate:"required"`
|
||||||
TargetIP string `json:"targetIP"`
|
TargetIP string `json:"targetIP"`
|
||||||
TargetPort string `json:"targetPort" validate:"required"`
|
TargetPort string `json:"targetPort" validate:"required"`
|
||||||
@@ -44,8 +50,11 @@ type ForwardRuleOperate struct {
|
|||||||
|
|
||||||
type UpdateFirewallDescription struct {
|
type UpdateFirewallDescription struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Address string `json:"address"`
|
Chain string `json:"chain"`
|
||||||
Port string `json:"port"`
|
SrcIP string `json:"srcIP"`
|
||||||
|
DstIP string `json:"dstIP"`
|
||||||
|
SrcPort string `json:"srcPort"`
|
||||||
|
DstPort string `json:"dstPort"`
|
||||||
Protocol string `json:"protocol"`
|
Protocol string `json:"protocol"`
|
||||||
Strategy string `json:"strategy" validate:"required,oneof=accept drop"`
|
Strategy string `json:"strategy" validate:"required,oneof=accept drop"`
|
||||||
|
|
||||||
@@ -53,6 +62,7 @@ type UpdateFirewallDescription struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AddrRuleOperate struct {
|
type AddrRuleOperate struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
Operation string `json:"operation" validate:"required,oneof=add remove"`
|
Operation string `json:"operation" validate:"required,oneof=add remove"`
|
||||||
Address string `json:"address" validate:"required"`
|
Address string `json:"address" validate:"required"`
|
||||||
Strategy string `json:"strategy" validate:"required,oneof=accept drop"`
|
Strategy string `json:"strategy" validate:"required,oneof=accept drop"`
|
||||||
@@ -74,3 +84,30 @@ type BatchRuleOperate struct {
|
|||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
Rules []PortRuleOperate `json:"rules"`
|
Rules []PortRuleOperate `json:"rules"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IptablesOp struct {
|
||||||
|
Name string `json:"name" validate:"required,oneof=1PANEL_INPUT 1PANEL_OUTPUT 1PANEL_BASIC"`
|
||||||
|
Operate string `json:"operate" validate:"required,oneof=init-base init-forward init-advance bind-base unbind-base bind unbind"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type IptablesRuleOp struct {
|
||||||
|
Operation string `json:"operation" validate:"required,oneof=add remove"`
|
||||||
|
ID uint `json:"id"`
|
||||||
|
Chain string `json:"chain" validate:"required,oneof=1PANEL_BASIC 1PANEL_BASIC_BEFORE 1PANEL_INPUT 1PANEL_OUTPUT"`
|
||||||
|
Protocol string `json:"protocol"`
|
||||||
|
SrcIP string `json:"srcIP"`
|
||||||
|
SrcPort uint `json:"srcPort"`
|
||||||
|
DstIP string `json:"dstIP"`
|
||||||
|
DstPort uint `json:"dstPort"`
|
||||||
|
Strategy string `json:"strategy" validate:"required,oneof=accept drop reject"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type IptablesBatchOperate struct {
|
||||||
|
Rules []IptablesRuleOp `json:"rules"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type IptablesChainStatus struct {
|
||||||
|
IsBind bool `json:"isBind"`
|
||||||
|
DefaultStrategy string `json:"defaultStrategy"`
|
||||||
|
}
|
||||||
|
|||||||
+20
-7
@@ -2,16 +2,27 @@ package dto
|
|||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
|
type PageImage struct {
|
||||||
|
PageInfo
|
||||||
|
Name string `json:"name"`
|
||||||
|
OrderBy string `json:"orderBy" validate:"required,oneof=size tags createdAt isUsed"`
|
||||||
|
Order string `json:"order" validate:"required,oneof=null ascending descending"`
|
||||||
|
}
|
||||||
|
|
||||||
type ImageInfo struct {
|
type ImageInfo struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
IsUsed bool `json:"isUsed"`
|
IsUsed bool `json:"isUsed"`
|
||||||
Tags []string `json:"tags"`
|
Tags []string `json:"tags"`
|
||||||
Size string `json:"size"`
|
Size int64 `json:"size"`
|
||||||
|
|
||||||
|
IsPinned bool `json:"isPinned"`
|
||||||
|
Description string `json:"description"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ImageLoad struct {
|
type ImageLoad struct {
|
||||||
Path string `json:"path" validate:"required"`
|
TaskID string `json:"taskID"`
|
||||||
|
Paths []string `json:"paths" validate:"required,dive,required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ImageBuild struct {
|
type ImageBuild struct {
|
||||||
@@ -20,17 +31,18 @@ type ImageBuild struct {
|
|||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
Dockerfile string `json:"dockerfile" validate:"required"`
|
Dockerfile string `json:"dockerfile" validate:"required"`
|
||||||
Tags []string `json:"tags"`
|
Tags []string `json:"tags"`
|
||||||
|
Args []string `json:"args"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ImagePull struct {
|
type ImagePull struct {
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
RepoID uint `json:"repoID"`
|
RepoID uint `json:"repoID"`
|
||||||
ImageName string `json:"imageName" validate:"required"`
|
ImageName []string `json:"imageName" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ImageTag struct {
|
type ImageTag struct {
|
||||||
SourceID string `json:"sourceID" validate:"required"`
|
SourceID string `json:"sourceID" validate:"required"`
|
||||||
TargetName string `json:"targetName" validate:"required"`
|
Tags []string `json:"tags" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ImagePush struct {
|
type ImagePush struct {
|
||||||
@@ -41,6 +53,7 @@ type ImagePush struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ImageSave struct {
|
type ImageSave struct {
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
TagName string `json:"tagName" validate:"required"`
|
TagName string `json:"tagName" validate:"required"`
|
||||||
Path string `json:"path" validate:"required"`
|
Path string `json:"path" validate:"required"`
|
||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
|
|||||||
@@ -4,25 +4,78 @@ import "time"
|
|||||||
|
|
||||||
type MonitorSearch struct {
|
type MonitorSearch struct {
|
||||||
Param string `json:"param" validate:"required,oneof=all cpu memory load io network"`
|
Param string `json:"param" validate:"required,oneof=all cpu memory load io network"`
|
||||||
Info string `json:"info"`
|
IO string `json:"io"`
|
||||||
|
Network string `json:"network"`
|
||||||
StartTime time.Time `json:"startTime"`
|
StartTime time.Time `json:"startTime"`
|
||||||
EndTime time.Time `json:"endTime"`
|
EndTime time.Time `json:"endTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MonitorData struct {
|
type MonitorData struct {
|
||||||
Param string `json:"param" validate:"required,oneof=cpu memory load io network"`
|
Param string `json:"param"`
|
||||||
Date []time.Time `json:"date"`
|
Date []time.Time `json:"date"`
|
||||||
Value []interface{} `json:"value"`
|
Value []interface{} `json:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Process struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Pid int32 `json:"pid"`
|
||||||
|
Percent float64 `json:"percent"`
|
||||||
|
Memory uint64 `json:"memory"`
|
||||||
|
Cmd string `json:"cmd"`
|
||||||
|
User string `json:"user"`
|
||||||
|
}
|
||||||
|
|
||||||
type MonitorSetting struct {
|
type MonitorSetting struct {
|
||||||
MonitorStatus string `json:"monitorStatus"`
|
MonitorStatus string `json:"monitorStatus"`
|
||||||
MonitorStoreDays string `json:"monitorStoreDays"`
|
MonitorStoreDays string `json:"monitorStoreDays"`
|
||||||
MonitorInterval string `json:"monitorInterval"`
|
MonitorInterval string `json:"monitorInterval"`
|
||||||
DefaultNetwork string `json:"defaultNetwork"`
|
DefaultNetwork string `json:"defaultNetwork"`
|
||||||
|
DefaultIO string `json:"defaultIO"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MonitorSettingUpdate struct {
|
type MonitorSettingUpdate struct {
|
||||||
Key string `json:"key" validate:"required,oneof=MonitorStatus MonitorStoreDays MonitorInterval DefaultNetwork"`
|
Key string `json:"key" validate:"required,oneof=MonitorStatus MonitorStoreDays MonitorInterval DefaultNetwork DefaultIO"`
|
||||||
Value string `json:"value"`
|
Value string `json:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MonitorGPUOptions struct {
|
||||||
|
GPUType string `json:"gpuType"`
|
||||||
|
ChartHide []GPUChartHide `json:"chartHide"`
|
||||||
|
Options []string `json:"options"`
|
||||||
|
}
|
||||||
|
type GPUChartHide struct {
|
||||||
|
ProductName string `json:"productName"`
|
||||||
|
Process bool `json:"process"`
|
||||||
|
GPU bool `json:"gpu"`
|
||||||
|
Memory bool `json:"memory"`
|
||||||
|
Power bool `json:"power"`
|
||||||
|
Temperature bool `json:"temperature"`
|
||||||
|
Speed bool `json:"speed"`
|
||||||
|
}
|
||||||
|
type MonitorGPUSearch struct {
|
||||||
|
ProductName string `json:"productName"`
|
||||||
|
StartTime time.Time `json:"startTime"`
|
||||||
|
EndTime time.Time `json:"endTime"`
|
||||||
|
}
|
||||||
|
type MonitorGPUData struct {
|
||||||
|
Date []time.Time `json:"date"`
|
||||||
|
GPUValue []float64 `json:"gpuValue"`
|
||||||
|
TemperatureValue []float64 `json:"temperatureValue"`
|
||||||
|
PowerTotal []float64 `json:"powerTotal"`
|
||||||
|
PowerUsed []float64 `json:"powerUsed"`
|
||||||
|
PowerPercent []float64 `json:"powerPercent"`
|
||||||
|
MemoryTotal []float64 `json:"memoryTotal"`
|
||||||
|
MemoryUsed []float64 `json:"memoryUsed"`
|
||||||
|
MemoryPercent []float64 `json:"memoryPercent"`
|
||||||
|
SpeedValue []int `json:"speedValue"`
|
||||||
|
|
||||||
|
ProcessCount []int `json:"processCount"`
|
||||||
|
GPUProcesses [][]GPUProcess `json:"gpuProcesses"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GPUProcess struct {
|
||||||
|
Pid string `json:"pid"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
ProcessName string `json:"processName"`
|
||||||
|
UsedMemory string `json:"usedMemory"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -73,12 +73,13 @@ type NginxUpstream struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type NginxUpstreamServer struct {
|
type NginxUpstreamServer struct {
|
||||||
Server string `json:"server"`
|
Server string `json:"server"`
|
||||||
Weight int `json:"weight"`
|
Weight int `json:"weight"`
|
||||||
FailTimeout string `json:"failTimeout"`
|
FailTimeout int `json:"failTimeout"`
|
||||||
MaxFails int `json:"maxFails"`
|
FailTimeoutUnit string `json:"failTimeoutUnit"`
|
||||||
MaxConns int `json:"maxConns"`
|
MaxFails int `json:"maxFails"`
|
||||||
Flag string `json:"flag"`
|
MaxConns int `json:"maxConns"`
|
||||||
|
Flag string `json:"flag"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var LBAlgorithms = map[string]struct{}{"ip_hash": {}, "least_conn": {}}
|
var LBAlgorithms = map[string]struct{}{"ip_hash": {}, "least_conn": {}}
|
||||||
|
|||||||
@@ -22,7 +22,16 @@ type AppInstallCreate struct {
|
|||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
Services map[string]string `json:"services"`
|
Services map[string]string `json:"services"`
|
||||||
TaskID string `json:"taskID"`
|
TaskID string `json:"taskID"`
|
||||||
|
|
||||||
AppContainerConfig
|
AppContainerConfig
|
||||||
|
NodePushConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type NodePushConfig struct {
|
||||||
|
Nodes []string `json:"nodes"`
|
||||||
|
PushNode bool `json:"pushNode"`
|
||||||
|
AppKey string `json:"appKey"`
|
||||||
|
Version string `json:"version"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AppContainerConfig struct {
|
type AppContainerConfig struct {
|
||||||
@@ -40,17 +49,19 @@ type AppContainerConfig struct {
|
|||||||
WebUI string `json:"webUI"`
|
WebUI string `json:"webUI"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
SpecifyIP string `json:"specifyIP"`
|
SpecifyIP string `json:"specifyIP"`
|
||||||
|
RestartPolicy string `json:"restartPolicy" validate:"omitempty,oneof=always unless-stopped no on-failure"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AppInstalledSearch struct {
|
type AppInstalledSearch struct {
|
||||||
dto.PageInfo
|
dto.PageInfo
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Tags []string `json:"tags"`
|
Tags []string `json:"tags"`
|
||||||
Update bool `json:"update"`
|
Update bool `json:"update"`
|
||||||
Unused bool `json:"unused"`
|
Unused bool `json:"unused"`
|
||||||
All bool `json:"all"`
|
All bool `json:"all"`
|
||||||
Sync bool `json:"sync"`
|
Sync bool `json:"sync"`
|
||||||
|
CheckUpdate bool `json:"checkUpdate"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AppInstalledInfo struct {
|
type AppInstalledInfo struct {
|
||||||
@@ -127,3 +138,12 @@ type AppUpdateVersion struct {
|
|||||||
AppInstallID uint `json:"appInstallID" validate:"required"`
|
AppInstallID uint `json:"appInstallID" validate:"required"`
|
||||||
UpdateVersion string `json:"updateVersion"`
|
UpdateVersion string `json:"updateVersion"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AppInstallSortItem struct {
|
||||||
|
InstallID uint `json:"installID"`
|
||||||
|
SortOrder int `json:"sortOrder"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AppInstallSort struct {
|
||||||
|
Items []AppInstallSortItem `json:"items" validate:"required"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package request
|
||||||
|
|
||||||
|
type DiskPartitionRequest struct {
|
||||||
|
Device string `json:"device" validate:"required"`
|
||||||
|
Filesystem string `json:"filesystem" validate:"required,oneof=ext4 xfs"`
|
||||||
|
Label string `json:"label"`
|
||||||
|
AutoMount bool `json:"autoMount"`
|
||||||
|
MountPoint string `json:"mountPoint" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DiskMountRequest struct {
|
||||||
|
Device string `json:"device" validate:"required"`
|
||||||
|
MountPoint string `json:"mountPoint" validate:"required"`
|
||||||
|
Filesystem string `json:"filesystem" validate:"required,oneof=ext4 xfs"`
|
||||||
|
AutoMount bool `json:"autoMount"`
|
||||||
|
NoFail bool `json:"noFail"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DiskUnmountRequest struct {
|
||||||
|
MountPoint string `json:"mountPoint" validate:"required"`
|
||||||
|
}
|
||||||
@@ -13,7 +13,6 @@ type FileContentReq struct {
|
|||||||
Path string `json:"path" validate:"required"`
|
Path string `json:"path" validate:"required"`
|
||||||
IsDetail bool `json:"isDetail"`
|
IsDetail bool `json:"isDetail"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SearchUploadWithPage struct {
|
type SearchUploadWithPage struct {
|
||||||
dto.PageInfo
|
dto.PageInfo
|
||||||
Path string `json:"path" validate:"required"`
|
Path string `json:"path" validate:"required"`
|
||||||
@@ -148,3 +147,28 @@ type FileExistReq struct {
|
|||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
Dir string `json:"dir" validate:"required"`
|
Dir string `json:"dir" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FileConvert struct {
|
||||||
|
Path string `json:"path" validate:"required"`
|
||||||
|
Type string `json:"type" validate:"required"`
|
||||||
|
InputFile string `json:"inputFile" validate:"required"`
|
||||||
|
Extension string `json:"extension" validate:"required"`
|
||||||
|
OutputFormat string `json:"outputFormat" validate:"required"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileConvertRequest struct {
|
||||||
|
Files []FileConvert `json:"files" validate:"required"`
|
||||||
|
OutputPath string `json:"outputPath" validate:"required"`
|
||||||
|
DeleteSource bool `json:"deleteSource"`
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileRemarkBatch struct {
|
||||||
|
Paths []string `json:"paths" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileRemarkUpdate struct {
|
||||||
|
Path string `json:"path" validate:"required"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ type SupervisorProcessConfig struct {
|
|||||||
Numprocs string `json:"numprocs"`
|
Numprocs string `json:"numprocs"`
|
||||||
AutoRestart string `json:"autoRestart"`
|
AutoRestart string `json:"autoRestart"`
|
||||||
AutoStart string `json:"autoStart"`
|
AutoStart string `json:"autoStart"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SupervisorProcessFileReq struct {
|
type SupervisorProcessFileReq struct {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ type McpServerCreate struct {
|
|||||||
HostIP string `json:"hostIP"`
|
HostIP string `json:"hostIP"`
|
||||||
StreamableHttpPath string `json:"streamableHttpPath"`
|
StreamableHttpPath string `json:"streamableHttpPath"`
|
||||||
OutputTransport string `json:"outputTransport" validate:"required"`
|
OutputTransport string `json:"outputTransport" validate:"required"`
|
||||||
|
Type string `json:"type" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type McpServerUpdate struct {
|
type McpServerUpdate struct {
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ type NginxCommonReq struct {
|
|||||||
|
|
||||||
type NginxAntiLeechUpdate struct {
|
type NginxAntiLeechUpdate struct {
|
||||||
WebsiteID uint `json:"websiteID" validate:"required"`
|
WebsiteID uint `json:"websiteID" validate:"required"`
|
||||||
Extends string `json:"extends" validate:"required"`
|
Extends string `json:"extends"`
|
||||||
Return string `json:"return" validate:"required"`
|
Return string `json:"return"`
|
||||||
Enable bool `json:"enable" `
|
Enable bool `json:"enable" `
|
||||||
ServerNames []string `json:"serverNames"`
|
ServerNames []string `json:"serverNames"`
|
||||||
Cache bool `json:"cache"`
|
Cache bool `json:"cache"`
|
||||||
@@ -130,3 +130,8 @@ type NginxModuleUpdate struct {
|
|||||||
type NginxOperateReq struct {
|
type NginxOperateReq struct {
|
||||||
Operate string `json:"operate" validate:"required,oneof=enable disable"`
|
Operate string `json:"operate" validate:"required,oneof=enable disable"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NginxDefaultHTTPSUpdate struct {
|
||||||
|
Operate string `json:"operate" validate:"required,oneof=enable disable"`
|
||||||
|
SSLRejectHandshake bool `json:"sslRejectHandshake"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ type NodeConfig struct {
|
|||||||
ExposedPorts []ExposedPort `json:"exposedPorts"`
|
ExposedPorts []ExposedPort `json:"exposedPorts"`
|
||||||
Environments []Environment `json:"environments"`
|
Environments []Environment `json:"environments"`
|
||||||
Volumes []Volume `json:"volumes"`
|
Volumes []Volume `json:"volumes"`
|
||||||
|
ExtraHosts []ExtraHost `json:"extraHosts"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Environment struct {
|
type Environment struct {
|
||||||
@@ -49,6 +50,11 @@ type ExposedPort struct {
|
|||||||
HostIP string `json:"hostIP"`
|
HostIP string `json:"hostIP"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ExtraHost struct {
|
||||||
|
Hostname string `json:"hostname"`
|
||||||
|
IP string `json:"ip"`
|
||||||
|
}
|
||||||
|
|
||||||
type RuntimeDelete struct {
|
type RuntimeDelete struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
ForceDelete bool `json:"forceDelete"`
|
ForceDelete bool `json:"forceDelete"`
|
||||||
@@ -100,6 +106,7 @@ type PHPConfigUpdate struct {
|
|||||||
Scope string `json:"scope" validate:"required"`
|
Scope string `json:"scope" validate:"required"`
|
||||||
DisableFunctions []string `json:"disableFunctions"`
|
DisableFunctions []string `json:"disableFunctions"`
|
||||||
UploadMaxSize string `json:"uploadMaxSize"`
|
UploadMaxSize string `json:"uploadMaxSize"`
|
||||||
|
MaxExecutionTime string `json:"maxExecutionTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PHPFileUpdate struct {
|
type PHPFileUpdate struct {
|
||||||
@@ -134,6 +141,7 @@ type PHPContainerConfig struct {
|
|||||||
ExposedPorts []ExposedPort `json:"exposedPorts"`
|
ExposedPorts []ExposedPort `json:"exposedPorts"`
|
||||||
Environments []Environment `json:"environments"`
|
Environments []Environment `json:"environments"`
|
||||||
Volumes []Volume `json:"volumes"`
|
Volumes []Volume `json:"volumes"`
|
||||||
|
ExtraHosts []ExtraHost `json:"extraHosts"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type RuntimeRemark struct {
|
type RuntimeRemark struct {
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package request
|
||||||
|
|
||||||
|
import "github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
|
|
||||||
|
type TensorRTLLMSearch struct {
|
||||||
|
dto.PageInfo
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TensorRTLLMCreate struct {
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
ContainerName string `json:"containerName" validate:"required"`
|
||||||
|
Version string `json:"version" validate:"required"`
|
||||||
|
ModelDir string `json:"modelDir" validate:"required"`
|
||||||
|
Image string `json:"image" validate:"required"`
|
||||||
|
Command string `json:"command" validate:"required"`
|
||||||
|
ModelType string `json:"modelType"`
|
||||||
|
ModelSpeedup bool `json:"modelSpeedup"`
|
||||||
|
DockerConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type TensorRTLLMUpdate struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
TensorRTLLMCreate
|
||||||
|
}
|
||||||
|
|
||||||
|
type TensorRTLLMDelete struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TensorRTLLMOperate struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
Operate string `json:"operate" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DockerConfig struct {
|
||||||
|
ExposedPorts []ExposedPort `json:"exposedPorts"`
|
||||||
|
Environments []Environment `json:"environments"`
|
||||||
|
Volumes []Volume `json:"volumes"`
|
||||||
|
}
|
||||||
@@ -38,6 +38,22 @@ type WebsiteCreate struct {
|
|||||||
FtpConfig
|
FtpConfig
|
||||||
DataBaseConfig
|
DataBaseConfig
|
||||||
SSLConfig
|
SSLConfig
|
||||||
|
StreamConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type StreamConfig struct {
|
||||||
|
StreamPorts string `json:"streamPorts"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Algorithm string `json:"algorithm"`
|
||||||
|
UDP bool `json:"udp"`
|
||||||
|
|
||||||
|
Servers []dto.NginxUpstreamServer `json:"servers"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StreamUpdate struct {
|
||||||
|
WebsiteID uint `json:"websiteID" validate:"required"`
|
||||||
|
|
||||||
|
StreamConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteOptionReq struct {
|
type WebsiteOptionReq struct {
|
||||||
@@ -95,6 +111,7 @@ type WebsiteDelete struct {
|
|||||||
DeleteApp bool `json:"deleteApp"`
|
DeleteApp bool `json:"deleteApp"`
|
||||||
DeleteBackup bool `json:"deleteBackup"`
|
DeleteBackup bool `json:"deleteBackup"`
|
||||||
ForceDelete bool `json:"forceDelete"`
|
ForceDelete bool `json:"forceDelete"`
|
||||||
|
DeleteDB bool `json:"deleteDB"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteOp struct {
|
type WebsiteOp struct {
|
||||||
@@ -102,6 +119,36 @@ type WebsiteOp struct {
|
|||||||
Operate string `json:"operate"`
|
Operate string `json:"operate"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type BatchWebsiteOp struct {
|
||||||
|
IDs []uint `json:"ids" validate:"required"`
|
||||||
|
Operate string `json:"operate" validate:"required"`
|
||||||
|
TaskID string `json:"taskID" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BatchWebsiteGroup struct {
|
||||||
|
IDs []uint `json:"ids" validate:"required"`
|
||||||
|
GroupID uint `json:"groupID" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BatchWebsiteHttps struct {
|
||||||
|
IDs []uint `json:"ids" validate:"required"`
|
||||||
|
TaskID string `json:"taskID" validate:"required"`
|
||||||
|
WebsiteSSLID uint `json:"websiteSSLId"`
|
||||||
|
Type string `json:"type" validate:"oneof=existed auto manual"`
|
||||||
|
PrivateKey string `json:"privateKey"`
|
||||||
|
Certificate string `json:"certificate"`
|
||||||
|
PrivateKeyPath string `json:"privateKeyPath"`
|
||||||
|
CertificatePath string `json:"certificatePath"`
|
||||||
|
ImportType string `json:"importType"`
|
||||||
|
HttpConfig string `json:"httpConfig" validate:"oneof=HTTPSOnly HTTPAlso HTTPToHTTPS"`
|
||||||
|
SSLProtocol []string `json:"SSLProtocol"`
|
||||||
|
Algorithm string `json:"algorithm"`
|
||||||
|
Hsts bool `json:"hsts"`
|
||||||
|
HstsIncludeSubDomains bool `json:"hstsIncludeSubDomains"`
|
||||||
|
HttpsPorts []int `json:"httpsPorts"`
|
||||||
|
Http3 bool `json:"http3"`
|
||||||
|
}
|
||||||
|
|
||||||
type WebsiteRedirectUpdate struct {
|
type WebsiteRedirectUpdate struct {
|
||||||
WebsiteID uint `json:"websiteId" validate:"required"`
|
WebsiteID uint `json:"websiteId" validate:"required"`
|
||||||
Key string `json:"key" validate:"required"`
|
Key string `json:"key" validate:"required"`
|
||||||
@@ -152,21 +199,22 @@ type WebsiteDomainDelete struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteHTTPSOp struct {
|
type WebsiteHTTPSOp struct {
|
||||||
WebsiteID uint `json:"websiteId" validate:"required"`
|
WebsiteID uint `json:"websiteId" validate:"required"`
|
||||||
Enable bool `json:"enable"`
|
Enable bool `json:"enable"`
|
||||||
WebsiteSSLID uint `json:"websiteSSLId"`
|
WebsiteSSLID uint `json:"websiteSSLId"`
|
||||||
Type string `json:"type" validate:"oneof=existed auto manual"`
|
Type string `json:"type" validate:"oneof=existed auto manual"`
|
||||||
PrivateKey string `json:"privateKey"`
|
PrivateKey string `json:"privateKey"`
|
||||||
Certificate string `json:"certificate"`
|
Certificate string `json:"certificate"`
|
||||||
PrivateKeyPath string `json:"privateKeyPath"`
|
PrivateKeyPath string `json:"privateKeyPath"`
|
||||||
CertificatePath string `json:"certificatePath"`
|
CertificatePath string `json:"certificatePath"`
|
||||||
ImportType string `json:"importType"`
|
ImportType string `json:"importType"`
|
||||||
HttpConfig string `json:"httpConfig" validate:"oneof=HTTPSOnly HTTPAlso HTTPToHTTPS"`
|
HttpConfig string `json:"httpConfig" validate:"oneof=HTTPSOnly HTTPAlso HTTPToHTTPS"`
|
||||||
SSLProtocol []string `json:"SSLProtocol"`
|
SSLProtocol []string `json:"SSLProtocol"`
|
||||||
Algorithm string `json:"algorithm"`
|
Algorithm string `json:"algorithm"`
|
||||||
Hsts bool `json:"hsts"`
|
Hsts bool `json:"hsts"`
|
||||||
HttpsPorts []int `json:"httpsPorts"`
|
HstsIncludeSubDomains bool `json:"hstsIncludeSubDomains"`
|
||||||
Http3 bool `json:"http3"`
|
HttpsPorts []int `json:"httpsPorts"`
|
||||||
|
Http3 bool `json:"http3"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteNginxUpdate struct {
|
type WebsiteNginxUpdate struct {
|
||||||
@@ -203,22 +251,50 @@ type WebsiteUpdateDirPermission struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteProxyConfig struct {
|
type WebsiteProxyConfig struct {
|
||||||
ID uint `json:"id" validate:"required"`
|
ID uint `json:"id" validate:"required"`
|
||||||
Operate string `json:"operate" validate:"required"`
|
Operate string `json:"operate" validate:"required"`
|
||||||
Enable bool `json:"enable" `
|
Enable bool `json:"enable" `
|
||||||
Cache bool `json:"cache" `
|
Cache bool `json:"cache" `
|
||||||
CacheTime int `json:"cacheTime" `
|
CacheTime int `json:"cacheTime"`
|
||||||
CacheUnit string `json:"cacheUnit"`
|
CacheUnit string `json:"cacheUnit"`
|
||||||
Name string `json:"name" validate:"required"`
|
ServerCacheTime int `json:"serverCacheTime"`
|
||||||
Modifier string `json:"modifier"`
|
ServerCacheUnit string `json:"serverCacheUnit"`
|
||||||
Match string `json:"match" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
ProxyPass string `json:"proxyPass" validate:"required"`
|
Modifier string `json:"modifier"`
|
||||||
ProxyHost string `json:"proxyHost" validate:"required"`
|
Match string `json:"match" validate:"required"`
|
||||||
Content string `json:"content"`
|
ProxyPass string `json:"proxyPass" validate:"required"`
|
||||||
FilePath string `json:"filePath"`
|
ProxyHost string `json:"proxyHost" validate:"required"`
|
||||||
Replaces map[string]string `json:"replaces"`
|
Content string `json:"content"`
|
||||||
SNI bool `json:"sni"`
|
FilePath string `json:"filePath"`
|
||||||
ProxySSLName string `json:"proxySSLName"`
|
Replaces map[string]string `json:"replaces"`
|
||||||
|
SNI bool `json:"sni"`
|
||||||
|
ProxySSLName string `json:"proxySSLName"`
|
||||||
|
CorsConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type WebsiteProxyDelete struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WebsiteProxyStatusUpdate struct {
|
||||||
|
ID uint `json:"id" validate:"required"`
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
Status string `json:"status" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CorsConfig struct {
|
||||||
|
Cors bool `json:"cors"`
|
||||||
|
AllowOrigins string `json:"allowOrigins"`
|
||||||
|
AllowMethods string `json:"allowMethods"`
|
||||||
|
AllowHeaders string `json:"allowHeaders"`
|
||||||
|
AllowCredentials bool `json:"allowCredentials"`
|
||||||
|
Preflight bool `json:"preflight"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CorsConfigReq struct {
|
||||||
|
WebsiteID uint `json:"websiteID" validate:"required"`
|
||||||
|
CorsConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteProxyReq struct {
|
type WebsiteProxyReq struct {
|
||||||
@@ -246,6 +322,7 @@ type WebsiteHtmlReq struct {
|
|||||||
type WebsiteHtmlUpdate struct {
|
type WebsiteHtmlUpdate struct {
|
||||||
Type string `json:"type" validate:"required"`
|
Type string `json:"type" validate:"required"`
|
||||||
Content string `json:"content" validate:"required"`
|
Content string `json:"content" validate:"required"`
|
||||||
|
Sync bool `json:"sync"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteLBCreate struct {
|
type WebsiteLBCreate struct {
|
||||||
@@ -283,8 +360,8 @@ type WebsiteRealIP struct {
|
|||||||
|
|
||||||
type ChangeDatabase struct {
|
type ChangeDatabase struct {
|
||||||
WebsiteID uint `json:"websiteID" validate:"required"`
|
WebsiteID uint `json:"websiteID" validate:"required"`
|
||||||
DatabaseID uint `json:"databaseID" validate:"required"`
|
DatabaseID uint `json:"databaseID" `
|
||||||
DatabaseType string `json:"databaseType" validate:"required"`
|
DatabaseType string `json:"databaseType" `
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteProxyDel struct {
|
type WebsiteProxyDel struct {
|
||||||
@@ -296,3 +373,13 @@ type CrossSiteAccessOp struct {
|
|||||||
WebsiteID uint `json:"websiteID" validate:"required"`
|
WebsiteID uint `json:"websiteID" validate:"required"`
|
||||||
Operation string `json:"operation" validate:"required,oneof=Enable Disable"`
|
Operation string `json:"operation" validate:"required,oneof=Enable Disable"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ExecComposerReq struct {
|
||||||
|
Command string `json:"command" validate:"required"`
|
||||||
|
ExtCommand string `json:"extCommand"`
|
||||||
|
Mirror string `json:"mirror" validate:"required"`
|
||||||
|
Dir string `json:"dir" validate:"required"`
|
||||||
|
User string `json:"user" validate:"required"`
|
||||||
|
WebsiteID uint `json:"websiteID" validate:"required"`
|
||||||
|
TaskID string `json:"taskID" validate:"required"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,6 +6,12 @@ type WebsiteSSLSearch struct {
|
|||||||
dto.PageInfo
|
dto.PageInfo
|
||||||
AcmeAccountID string `json:"acmeAccountID"`
|
AcmeAccountID string `json:"acmeAccountID"`
|
||||||
Domain string `json:"domain"`
|
Domain string `json:"domain"`
|
||||||
|
OrderBy string `json:"orderBy" validate:"omitempty,oneof=created_at expire_date"`
|
||||||
|
Order string `json:"order" validate:"omitempty,oneof=null ascending descending"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WebsiteSSLListReq struct {
|
||||||
|
AcmeAccountID string `json:"acmeAccountID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteSSLCreate struct {
|
type WebsiteSSLCreate struct {
|
||||||
@@ -27,6 +33,9 @@ type WebsiteSSLCreate struct {
|
|||||||
Nameserver2 string `json:"nameserver2"`
|
Nameserver2 string `json:"nameserver2"`
|
||||||
ExecShell bool `json:"execShell"`
|
ExecShell bool `json:"execShell"`
|
||||||
Shell string `json:"shell"`
|
Shell string `json:"shell"`
|
||||||
|
PushNode bool `json:"pushNode"`
|
||||||
|
Nodes string `json:"nodes"`
|
||||||
|
IsIp bool `json:"isIp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteDNSReq struct {
|
type WebsiteDNSReq struct {
|
||||||
@@ -58,6 +67,7 @@ type WebsiteAcmeAccountCreate struct {
|
|||||||
EabHmacKey string `json:"eabHmacKey"`
|
EabHmacKey string `json:"eabHmacKey"`
|
||||||
UseProxy bool `json:"useProxy"`
|
UseProxy bool `json:"useProxy"`
|
||||||
CaDirURL string `json:"caDirURL"`
|
CaDirURL string `json:"caDirURL"`
|
||||||
|
UseEAB bool `json:"useEAB"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteAcmeAccountUpdate struct {
|
type WebsiteAcmeAccountUpdate struct {
|
||||||
@@ -105,6 +115,8 @@ type WebsiteSSLUpdate struct {
|
|||||||
Nameserver2 string `json:"nameserver2"`
|
Nameserver2 string `json:"nameserver2"`
|
||||||
ExecShell bool `json:"execShell"`
|
ExecShell bool `json:"execShell"`
|
||||||
Shell string `json:"shell"`
|
Shell string `json:"shell"`
|
||||||
|
PushNode bool `json:"pushNode"`
|
||||||
|
Nodes string `json:"nodes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteSSLUpload struct {
|
type WebsiteSSLUpload struct {
|
||||||
@@ -151,3 +163,9 @@ type WebsiteCAObtain struct {
|
|||||||
type WebsiteCARenew struct {
|
type WebsiteCARenew struct {
|
||||||
SSLID uint `json:"SSLID" validate:"required"`
|
SSLID uint `json:"SSLID" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type WebsiteSSLFileUpload struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
SSLID uint64 `json:"sslID"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,22 +29,18 @@ type AppDTO struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AppItem struct {
|
type AppItem struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Key string `json:"key"`
|
Key string `json:"key"`
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Icon string `json:"icon"`
|
Status string `json:"status"`
|
||||||
Type string `json:"type"`
|
Installed bool `json:"installed"`
|
||||||
Status string `json:"status"`
|
Limit int `json:"limit"`
|
||||||
Resource string `json:"resource"`
|
Tags []string `json:"tags"`
|
||||||
Installed bool `json:"installed"`
|
GpuSupport bool `json:"gpuSupport"`
|
||||||
Versions []string `json:"versions"`
|
Recommend int `json:"recommend"`
|
||||||
Limit int `json:"limit"`
|
Type string `json:"type"`
|
||||||
Tags []TagDTO `json:"tags"`
|
BatchInstallSupport bool `json:"batchInstallSupport"`
|
||||||
Github string `json:"github"`
|
|
||||||
Website string `json:"website"`
|
|
||||||
GpuSupport bool `json:"gpuSupport"`
|
|
||||||
Recommend int `json:"recommend"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type TagDTO struct {
|
type TagDTO struct {
|
||||||
@@ -66,6 +62,7 @@ type AppInstalledCheck struct {
|
|||||||
InstallPath string `json:"installPath"`
|
InstallPath string `json:"installPath"`
|
||||||
HttpPort int `json:"httpPort"`
|
HttpPort int `json:"httpPort"`
|
||||||
HttpsPort int `json:"httpsPort"`
|
HttpsPort int `json:"httpsPort"`
|
||||||
|
WebsiteDir string `json:"websiteDir"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AppDetailDTO struct {
|
type AppDetailDTO struct {
|
||||||
@@ -79,6 +76,10 @@ type AppDetailDTO struct {
|
|||||||
GpuSupport bool `json:"gpuSupport"`
|
GpuSupport bool `json:"gpuSupport"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AppDetailSimpleDTO struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
type IgnoredApp struct {
|
type IgnoredApp struct {
|
||||||
Icon string `json:"icon"`
|
Icon string `json:"icon"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
@@ -125,8 +126,12 @@ type AppInstallDTO struct {
|
|||||||
WebUI string `json:"webUI"`
|
WebUI string `json:"webUI"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
Favorite bool `json:"favorite"`
|
Favorite bool `json:"favorite"`
|
||||||
|
SortOrder int `json:"sortOrder"`
|
||||||
App AppDetail `json:"app"`
|
App AppDetail `json:"app"`
|
||||||
Container string `json:"container"`
|
Container string `json:"container"`
|
||||||
|
IsEdit bool `json:"isEdit"`
|
||||||
|
LinkDB bool `json:"linkDB"`
|
||||||
|
ServiceName string `json:"serviceName"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AppInstallInfo struct {
|
type AppInstallInfo struct {
|
||||||
@@ -138,6 +143,8 @@ type AppInstallInfo struct {
|
|||||||
HttpPort int `json:"HttpPort"`
|
HttpPort int `json:"HttpPort"`
|
||||||
Container string `json:"container"`
|
Container string `json:"container"`
|
||||||
ComposePath string `json:"composePath"`
|
ComposePath string `json:"composePath"`
|
||||||
|
AppKey string `json:"appKey"`
|
||||||
|
AppPorts []int `json:"appPorts"`
|
||||||
|
|
||||||
Env map[string]interface{} `json:"env"`
|
Env map[string]interface{} `json:"env"`
|
||||||
}
|
}
|
||||||
@@ -175,6 +182,7 @@ type AppParam struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AppConfig struct {
|
type AppConfig struct {
|
||||||
Params []AppParam `json:"params"`
|
Params []AppParam `json:"params"`
|
||||||
|
RawCompose string `json:"rawCompose"`
|
||||||
request.AppContainerConfig
|
request.AppContainerConfig
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package response
|
||||||
|
|
||||||
|
type DiskInfo struct {
|
||||||
|
DiskBasicInfo
|
||||||
|
Partitions []DiskBasicInfo `json:"partitions"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DiskBasicInfo struct {
|
||||||
|
Device string `json:"device"`
|
||||||
|
Size string `json:"size"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
DiskType string `json:"diskType"`
|
||||||
|
IsRemovable bool `json:"isRemovable"`
|
||||||
|
IsSystem bool `json:"isSystem"`
|
||||||
|
Filesystem string `json:"filesystem"`
|
||||||
|
Used string `json:"used"`
|
||||||
|
Avail string `json:"avail"`
|
||||||
|
UsePercent int `json:"usePercent"`
|
||||||
|
MountPoint string `json:"mountPoint"`
|
||||||
|
IsMounted bool `json:"isMounted"`
|
||||||
|
Serial string `json:"serial"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CompleteDiskInfo struct {
|
||||||
|
Disks []DiskInfo `json:"disks"`
|
||||||
|
UnpartitionedDisks []DiskBasicInfo `json:"unpartitionedDisks"`
|
||||||
|
SystemDisks []DiskInfo `json:"systemDisks"`
|
||||||
|
TotalDisks int `json:"totalDisks"`
|
||||||
|
TotalCapacity int64 `json:"totalCapacity"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MountInfo struct {
|
||||||
|
Device string `json:"device"`
|
||||||
|
MountPoint string `json:"mountPoint"`
|
||||||
|
Filesystem string `json:"filesystem"`
|
||||||
|
Options string `json:"options"`
|
||||||
|
}
|
||||||
@@ -44,6 +44,7 @@ type FileLineContent struct {
|
|||||||
TaskStatus string `json:"taskStatus"`
|
TaskStatus string `json:"taskStatus"`
|
||||||
Lines []string `json:"lines"`
|
Lines []string `json:"lines"`
|
||||||
Scope string `json:"scope"`
|
Scope string `json:"scope"`
|
||||||
|
TotalLines int `json:"totalLines"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FileExist struct {
|
type FileExist struct {
|
||||||
@@ -72,3 +73,15 @@ type DepthDirSizeRes struct {
|
|||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
Size int64 `json:"size"`
|
Size int64 `json:"size"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FileConvertLog struct {
|
||||||
|
Date string `json:"date"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Log string `json:"log"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileRemarksRes struct {
|
||||||
|
Remarks map[string]string `json:"remarks"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ type SupervisorProcessConfig struct {
|
|||||||
Status []ProcessStatus `json:"status"`
|
Status []ProcessStatus `json:"status"`
|
||||||
AutoRestart string `json:"autoRestart"`
|
AutoRestart string `json:"autoRestart"`
|
||||||
AutoStart string `json:"autoStart"`
|
AutoStart string `json:"autoStart"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProcessStatus struct {
|
type ProcessStatus struct {
|
||||||
|
|||||||
@@ -82,5 +82,6 @@ type NginxBuildConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type NginxConfigRes struct {
|
type NginxConfigRes struct {
|
||||||
Https bool `json:"https"`
|
Https bool `json:"https"`
|
||||||
|
SSLRejectHandshake bool `json:"sslRejectHandshake"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ type RuntimeDTO struct {
|
|||||||
ExposedPorts []request.ExposedPort `json:"exposedPorts"`
|
ExposedPorts []request.ExposedPort `json:"exposedPorts"`
|
||||||
Environments []request.Environment `json:"environments"`
|
Environments []request.Environment `json:"environments"`
|
||||||
Volumes []request.Volume `json:"volumes"`
|
Volumes []request.Volume `json:"volumes"`
|
||||||
|
ExtraHosts []request.ExtraHost `json:"extraHosts"`
|
||||||
ContainerStatus string `json:"containerStatus"`
|
ContainerStatus string `json:"containerStatus"`
|
||||||
Container string `json:"container"`
|
Container string `json:"container"`
|
||||||
Remark string `json:"remark"`
|
Remark string `json:"remark"`
|
||||||
@@ -78,3 +79,8 @@ type PHPExtensionRes struct {
|
|||||||
Extensions []string `json:"extensions"`
|
Extensions []string `json:"extensions"`
|
||||||
SupportExtensions []SupportExtension `json:"supportExtensions"`
|
SupportExtensions []SupportExtension `json:"supportExtensions"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FpmStatusItem struct {
|
||||||
|
Key string `json:"key"`
|
||||||
|
Value interface{} `json:"value"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package response
|
||||||
|
|
||||||
|
type ComponentInfo struct {
|
||||||
|
Exists bool `json:"exists"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
Error string `json:"error"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package response
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TensorRTLLMsRes struct {
|
||||||
|
Items []TensorRTLLMDTO `json:"items"`
|
||||||
|
Total int64 `json:"total"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TensorRTLLMDTO struct {
|
||||||
|
model.TensorRTLLM
|
||||||
|
Version string `json:"version"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
Dir string `json:"dir"`
|
||||||
|
ModelDir string `json:"modelDir"`
|
||||||
|
Image string `json:"image"`
|
||||||
|
Command string `json:"command"`
|
||||||
|
|
||||||
|
ExposedPorts []request.ExposedPort `json:"exposedPorts"`
|
||||||
|
Environments []request.Environment `json:"environments"`
|
||||||
|
Volumes []request.Volume `json:"volumes"`
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package response
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/model"
|
"github.com/1Panel-dev/1Panel/agent/app/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -16,6 +17,10 @@ type WebsiteDTO struct {
|
|||||||
RuntimeType string `json:"runtimeType"`
|
RuntimeType string `json:"runtimeType"`
|
||||||
SiteDir string `json:"siteDir"`
|
SiteDir string `json:"siteDir"`
|
||||||
OpenBaseDir bool `json:"openBaseDir"`
|
OpenBaseDir bool `json:"openBaseDir"`
|
||||||
|
Algorithm string `json:"algorithm"`
|
||||||
|
UDP bool `json:"udp"`
|
||||||
|
|
||||||
|
Servers []dto.NginxUpstreamServer `json:"servers"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteRes struct {
|
type WebsiteRes struct {
|
||||||
@@ -35,8 +40,10 @@ type WebsiteRes struct {
|
|||||||
SSLStatus string `json:"sslStatus"`
|
SSLStatus string `json:"sslStatus"`
|
||||||
AppInstallID uint `json:"appInstallId"`
|
AppInstallID uint `json:"appInstallId"`
|
||||||
ChildSites []string `json:"childSites"`
|
ChildSites []string `json:"childSites"`
|
||||||
|
ParentSite string `json:"parentSite"`
|
||||||
RuntimeType string `json:"runtimeType"`
|
RuntimeType string `json:"runtimeType"`
|
||||||
Favorite bool `json:"favorite"`
|
Favorite bool `json:"favorite"`
|
||||||
|
IPV6 bool `json:"IPV6"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteOption struct {
|
type WebsiteOption struct {
|
||||||
@@ -58,15 +65,16 @@ type WebsiteNginxConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteHTTPS struct {
|
type WebsiteHTTPS struct {
|
||||||
Enable bool `json:"enable"`
|
Enable bool `json:"enable"`
|
||||||
HttpConfig string `json:"httpConfig"`
|
HttpConfig string `json:"httpConfig"`
|
||||||
SSL model.WebsiteSSL `json:"SSL"`
|
SSL model.WebsiteSSL `json:"SSL"`
|
||||||
SSLProtocol []string `json:"SSLProtocol"`
|
SSLProtocol []string `json:"SSLProtocol"`
|
||||||
Algorithm string `json:"algorithm"`
|
Algorithm string `json:"algorithm"`
|
||||||
Hsts bool `json:"hsts"`
|
Hsts bool `json:"hsts"`
|
||||||
HttpsPorts []int `json:"httpsPorts"`
|
HstsIncludeSubDomains bool `json:"hstsIncludeSubDomains"`
|
||||||
HttpsPort string `json:"httpsPort"`
|
HttpsPorts []int `json:"httpsPorts"`
|
||||||
Http3 bool `json:"http3"`
|
HttpsPort string `json:"httpsPort"`
|
||||||
|
Http3 bool `json:"http3"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebsiteLog struct {
|
type WebsiteLog struct {
|
||||||
@@ -80,6 +88,7 @@ type PHPConfig struct {
|
|||||||
Params map[string]string `json:"params"`
|
Params map[string]string `json:"params"`
|
||||||
DisableFunctions []string `json:"disableFunctions"`
|
DisableFunctions []string `json:"disableFunctions"`
|
||||||
UploadMaxSize string `json:"uploadMaxSize"`
|
UploadMaxSize string `json:"uploadMaxSize"`
|
||||||
|
MaxExecutionTime string `json:"maxExecutionTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type NginxRewriteRes struct {
|
type NginxRewriteRes struct {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ type SettingInfo struct {
|
|||||||
NtpSite string `json:"ntpSite"`
|
NtpSite string `json:"ntpSite"`
|
||||||
|
|
||||||
DefaultNetwork string `json:"defaultNetwork"`
|
DefaultNetwork string `json:"defaultNetwork"`
|
||||||
|
DefaultIO string `json:"defaultIO"`
|
||||||
LastCleanTime string `json:"lastCleanTime"`
|
LastCleanTime string `json:"lastCleanTime"`
|
||||||
LastCleanSize string `json:"lastCleanSize"`
|
LastCleanSize string `json:"lastCleanSize"`
|
||||||
LastCleanData string `json:"lastCleanData"`
|
LastCleanData string `json:"lastCleanData"`
|
||||||
@@ -36,6 +37,7 @@ type SyncTime struct {
|
|||||||
|
|
||||||
type CleanData struct {
|
type CleanData struct {
|
||||||
SystemClean []CleanTree `json:"systemClean"`
|
SystemClean []CleanTree `json:"systemClean"`
|
||||||
|
BackupClean []CleanTree `json:"backupClean"`
|
||||||
UploadClean []CleanTree `json:"uploadClean"`
|
UploadClean []CleanTree `json:"uploadClean"`
|
||||||
DownloadClean []CleanTree `json:"downloadClean"`
|
DownloadClean []CleanTree `json:"downloadClean"`
|
||||||
SystemLogClean []CleanTree `json:"systemLogClean"`
|
SystemLogClean []CleanTree `json:"systemLogClean"`
|
||||||
@@ -61,6 +63,10 @@ type Clean struct {
|
|||||||
Size uint64 `json:"size"`
|
Size uint64 `json:"size"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SSHDefaultConn struct {
|
||||||
|
WithReset bool `json:"withReset"`
|
||||||
|
DefaultConn string `json:"defaultConn"`
|
||||||
|
}
|
||||||
type SSHConnData struct {
|
type SSHConnData struct {
|
||||||
Addr string `json:"addr" validate:"required"`
|
Addr string `json:"addr" validate:"required"`
|
||||||
Port uint `json:"port" validate:"required,number,max=65535,min=1"`
|
Port uint `json:"port" validate:"required,number,max=65535,min=1"`
|
||||||
@@ -69,6 +75,8 @@ type SSHConnData struct {
|
|||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
PrivateKey string `json:"privateKey"`
|
PrivateKey string `json:"privateKey"`
|
||||||
PassPhrase string `json:"passPhrase"`
|
PassPhrase string `json:"passPhrase"`
|
||||||
|
|
||||||
|
LocalSSHConnShow string `json:"localSSHConnShow"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SystemProxy struct {
|
type SystemProxy struct {
|
||||||
@@ -78,3 +86,11 @@ type SystemProxy struct {
|
|||||||
User string `json:"user"`
|
User string `json:"user"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CommonDescription struct {
|
||||||
|
ID string `json:"id" validate:"required"`
|
||||||
|
Type string `json:"type" validate:"required"`
|
||||||
|
DetailType string `json:"detailType"`
|
||||||
|
IsPinned bool `json:"isPinned"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ type DataTree struct {
|
|||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
Key string `json:"key"`
|
Key string `json:"key"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
IsLocal bool `json:"isLocal"`
|
||||||
Size uint64 `json:"size"`
|
Size uint64 `json:"size"`
|
||||||
IsCheck bool `json:"isCheck"`
|
IsCheck bool `json:"isCheck"`
|
||||||
IsDisable bool `json:"isDisable"`
|
IsDisable bool `json:"isDisable"`
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ type SSHInfo struct {
|
|||||||
CurrentUser string `json:"currentUser"`
|
CurrentUser string `json:"currentUser"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreateRootCert struct {
|
type RootCertOperate struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Mode string `json:"mode"`
|
Mode string `json:"mode"`
|
||||||
EncryptionMode string `json:"encryptionMode" validate:"required,oneof=rsa ed25519 ecdsa dsa"`
|
EncryptionMode string `json:"encryptionMode" validate:"required,oneof=rsa ed25519 ecdsa dsa"`
|
||||||
@@ -54,12 +55,6 @@ type SearchSSHLog struct {
|
|||||||
Info string `json:"info"`
|
Info string `json:"info"`
|
||||||
Status string `json:"Status" validate:"required,oneof=Success Failed All"`
|
Status string `json:"Status" validate:"required,oneof=Success Failed All"`
|
||||||
}
|
}
|
||||||
type SSHLog struct {
|
|
||||||
Logs []SSHHistory `json:"logs"`
|
|
||||||
TotalCount int `json:"totalCount"`
|
|
||||||
SuccessfulCount int `json:"successfulCount"`
|
|
||||||
FailedCount int `json:"failedCount"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SSHHistory struct {
|
type SSHHistory struct {
|
||||||
Date time.Time `json:"date"`
|
Date time.Time `json:"date"`
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type Agent struct {
|
||||||
|
BaseModel
|
||||||
|
Name string `json:"name" gorm:"not null;unique"`
|
||||||
|
AgentType string `json:"agentType" gorm:"default:openclaw"`
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
APIType string `json:"apiType"`
|
||||||
|
MaxTokens int `json:"maxTokens"`
|
||||||
|
ContextWindow int `json:"contextWindow"`
|
||||||
|
BaseURL string `json:"baseUrl"`
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
AppInstallID uint `json:"appInstallId"`
|
||||||
|
AccountID uint `json:"accountId"`
|
||||||
|
ConfigPath string `json:"configPath"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type AgentAccount struct {
|
||||||
|
BaseModel
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
BaseURL string `json:"baseUrl"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
APIType string `json:"apiType"`
|
||||||
|
MaxTokens int `json:"maxTokens"`
|
||||||
|
ContextWindow int `json:"contextWindow"`
|
||||||
|
RememberAPIKey bool `json:"rememberApiKey"`
|
||||||
|
Verified bool `json:"verified"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (AgentAccount) TableName() string {
|
||||||
|
return "agent_provider_accounts"
|
||||||
|
}
|
||||||
@@ -3,14 +3,15 @@ package model
|
|||||||
type Alert struct {
|
type Alert struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
Title string `gorm:"type:varchar(256);not null" json:"title"`
|
Title string `gorm:"type:varchar(256);not null" json:"title"`
|
||||||
Type string `gorm:"type:varchar(64);not null" json:"type"`
|
Type string `gorm:"type:varchar(64);not null" json:"type"`
|
||||||
Cycle uint `gorm:"type:integer;not null" json:"cycle"`
|
Cycle uint `gorm:"type:integer;not null" json:"cycle"`
|
||||||
Count uint `gorm:"type:integer;not null" json:"count"`
|
Count uint `gorm:"type:integer;not null" json:"count"`
|
||||||
Project string `gorm:"type:varchar(64)" json:"project"`
|
Project string `gorm:"type:varchar(64)" json:"project"`
|
||||||
Status string `gorm:"type:varchar(64);not null" json:"status"`
|
Status string `gorm:"type:varchar(64);not null" json:"status"`
|
||||||
Method string `gorm:"type:varchar(64);not null" json:"method"`
|
Method string `gorm:"type:varchar(64);not null" json:"method"`
|
||||||
SendCount uint `gorm:"type:integer" json:"sendCount"`
|
SendCount uint `gorm:"type:integer" json:"sendCount"`
|
||||||
|
AdvancedParams string `gorm:"type:longText" json:"advancedParams"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AlertTask struct {
|
type AlertTask struct {
|
||||||
@@ -43,3 +44,12 @@ type AlertConfig struct {
|
|||||||
Status string `gorm:"type:varchar(64);not null" json:"status"`
|
Status string `gorm:"type:varchar(64);not null" json:"status"`
|
||||||
Config string `gorm:"type:varchar(256);not null" json:"config"`
|
Config string `gorm:"type:varchar(256);not null" json:"config"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type LoginLog struct {
|
||||||
|
BaseModel
|
||||||
|
IP string `json:"ip"`
|
||||||
|
Address string `json:"address"`
|
||||||
|
Agent string `json:"agent"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ type App struct {
|
|||||||
MemoryRequired int `json:"memoryRequired"`
|
MemoryRequired int `json:"memoryRequired"`
|
||||||
GpuSupport bool `json:"gpuSupport"`
|
GpuSupport bool `json:"gpuSupport"`
|
||||||
RequiredPanelVersion float64 `json:"requiredPanelVersion"`
|
RequiredPanelVersion float64 `json:"requiredPanelVersion"`
|
||||||
|
BatchInstallSupport bool `json:"batchInstallSupport" yaml:"batchInstallSupport"`
|
||||||
|
|
||||||
Details []AppDetail `json:"-" gorm:"-:migration"`
|
Details []AppDetail `json:"-" gorm:"-:migration"`
|
||||||
TagsKey []string `json:"tags" yaml:"tags" gorm:"-"`
|
TagsKey []string `json:"tags" yaml:"tags" gorm:"-"`
|
||||||
@@ -43,11 +44,17 @@ type App struct {
|
|||||||
func (i *App) IsLocalApp() bool {
|
func (i *App) IsLocalApp() bool {
|
||||||
return i.Resource == constant.ResourceLocal
|
return i.Resource == constant.ResourceLocal
|
||||||
}
|
}
|
||||||
|
func (i *App) IsCustomApp() bool {
|
||||||
|
return i.Resource == constant.AppResourceCustom
|
||||||
|
}
|
||||||
|
|
||||||
func (i *App) GetAppResourcePath() string {
|
func (i *App) GetAppResourcePath() string {
|
||||||
if i.IsLocalApp() {
|
if i.IsLocalApp() {
|
||||||
//这里要去掉本地应用的local前缀
|
|
||||||
return filepath.Join(global.Dir.LocalAppResourceDir, strings.TrimPrefix(i.Key, "local"))
|
return filepath.Join(global.Dir.LocalAppResourceDir, strings.TrimPrefix(i.Key, "local"))
|
||||||
}
|
}
|
||||||
|
if i.IsCustomApp() {
|
||||||
|
return filepath.Join(global.Dir.CustomAppResourceDir, i.Key)
|
||||||
|
}
|
||||||
return filepath.Join(global.Dir.RemoteAppResourceDir, i.Key)
|
return filepath.Join(global.Dir.RemoteAppResourceDir, i.Key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ type AppInstall struct {
|
|||||||
HttpsPort int `json:"httpsPort"`
|
HttpsPort int `json:"httpsPort"`
|
||||||
WebUI string `json:"webUI"`
|
WebUI string `json:"webUI"`
|
||||||
Favorite bool `json:"favorite"`
|
Favorite bool `json:"favorite"`
|
||||||
|
SortOrder int `json:"sortOrder" gorm:"default:0"`
|
||||||
|
|
||||||
App App `json:"app" gorm:"-:migration"`
|
App App `json:"app" gorm:"-:migration"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,3 +4,14 @@ type AppLauncher struct {
|
|||||||
BaseModel
|
BaseModel
|
||||||
Key string `json:"key"`
|
Key string `json:"key"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type QuickJump struct {
|
||||||
|
BaseModel
|
||||||
|
Name string `json:"name"`
|
||||||
|
Alias string `json:"alias"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Detail string `json:"detail"`
|
||||||
|
Recommend int `json:"recommend"`
|
||||||
|
IsShow bool `json:"isShow"`
|
||||||
|
Router string `json:"router"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,5 +27,8 @@ type BackupRecord struct {
|
|||||||
FileDir string `json:"fileDir"`
|
FileDir string `json:"fileDir"`
|
||||||
FileName string `json:"fileName"`
|
FileName string `json:"fileName"`
|
||||||
|
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-1
@@ -1,14 +1,33 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
type Clam struct {
|
type Clam struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
Name string `gorm:"not null" json:"name"`
|
Name string `gorm:"not null" json:"name"`
|
||||||
Status string `json:"status"`
|
|
||||||
Path string `gorm:"not null" json:"path"`
|
Path string `gorm:"not null" json:"path"`
|
||||||
InfectedStrategy string `json:"infectedStrategy"`
|
InfectedStrategy string `json:"infectedStrategy"`
|
||||||
InfectedDir string `json:"infectedDir"`
|
InfectedDir string `json:"infectedDir"`
|
||||||
Spec string `json:"spec"`
|
Spec string `json:"spec"`
|
||||||
|
RetryTimes uint `json:"retryTimes"`
|
||||||
|
Timeout uint `json:"timeout"`
|
||||||
EntryID int `json:"entryID"`
|
EntryID int `json:"entryID"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
|
|
||||||
|
Status string `json:"status"`
|
||||||
|
IsExecuting bool `json:"isExecuting"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClamRecord struct {
|
||||||
|
BaseModel
|
||||||
|
|
||||||
|
ClamID uint `json:"clamID"`
|
||||||
|
TaskID string `json:"taskID"`
|
||||||
|
StartTime time.Time `json:"startTime"`
|
||||||
|
ScanTime string `json:"scanTime"`
|
||||||
|
InfectedFiles string `json:"infectedFiles"`
|
||||||
|
TotalError string `json:"totalError"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BackupAccounts ---> SourceAccountIDs
|
|
||||||
// BackupAccounts ---> DownloadAccountID
|
|
||||||
type Cronjob struct {
|
type Cronjob struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
@@ -39,11 +37,15 @@ type Cronjob struct {
|
|||||||
Timeout uint `json:"timeout"`
|
Timeout uint `json:"timeout"`
|
||||||
IgnoreErr bool `json:"ignoreErr"`
|
IgnoreErr bool `json:"ignoreErr"`
|
||||||
RetainCopies uint64 `json:"retainCopies"`
|
RetainCopies uint64 `json:"retainCopies"`
|
||||||
|
Args string `json:"args"`
|
||||||
|
|
||||||
Status string `json:"status"`
|
IsExecuting bool `json:"isExecuting"`
|
||||||
EntryIDs string `json:"entryIDs"`
|
Status string `json:"status"`
|
||||||
Records []JobRecords `json:"records"`
|
EntryIDs string `json:"entryIDs"`
|
||||||
Secret string `json:"secret"`
|
Records []JobRecords `json:"records"`
|
||||||
|
Secret string `json:"secret"`
|
||||||
|
|
||||||
|
Config string `json:"config"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type JobRecords struct {
|
type JobRecords struct {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ type Database struct {
|
|||||||
From string `json:"from" gorm:"not null"`
|
From string `json:"from" gorm:"not null"`
|
||||||
Address string `json:"address" gorm:"not null"`
|
Address string `json:"address" gorm:"not null"`
|
||||||
Port uint `json:"port" gorm:"not null"`
|
Port uint `json:"port" gorm:"not null"`
|
||||||
|
InitialDB string `json:"initialDB"`
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ type DatabaseMysql struct {
|
|||||||
From string `json:"from" gorm:"not null;default:local"`
|
From string `json:"from" gorm:"not null;default:local"`
|
||||||
MysqlName string `json:"mysqlName" gorm:"not null"`
|
MysqlName string `json:"mysqlName" gorm:"not null"`
|
||||||
Format string `json:"format" gorm:"not null"`
|
Format string `json:"format" gorm:"not null"`
|
||||||
|
Collation string `json:"collation"`
|
||||||
Username string `json:"username" gorm:"not null"`
|
Username string `json:"username" gorm:"not null"`
|
||||||
Password string `json:"password" gorm:"not null"`
|
Password string `json:"password" gorm:"not null"`
|
||||||
Permission string `json:"permission" gorm:"not null"`
|
Permission string `json:"permission" gorm:"not null"`
|
||||||
|
|||||||
+11
-14
@@ -3,19 +3,16 @@ package model
|
|||||||
type Firewall struct {
|
type Firewall struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
Type string `gorm:"not null" json:"type"`
|
Type string `json:"type"`
|
||||||
Port string `gorm:"not null" json:"port"`
|
Port string `json:"port"` // Deprecated
|
||||||
Protocol string `gorm:"not null" json:"protocol"`
|
Address string `json:"address"` // Deprecated
|
||||||
Address string `gorm:"not null" json:"address"`
|
|
||||||
|
Chain string `json:"chain"`
|
||||||
|
Protocol string `json:"protocol"`
|
||||||
|
SrcIP string `json:"srcIP"`
|
||||||
|
SrcPort string `json:"srcPort"`
|
||||||
|
DstIP string `json:"dstIP"`
|
||||||
|
DstPort string `json:"dstPort"`
|
||||||
Strategy string `gorm:"not null" json:"strategy"`
|
Strategy string `gorm:"not null" json:"strategy"`
|
||||||
Description string `gorm:"not null" json:"description"`
|
Description string `json:"description"`
|
||||||
}
|
|
||||||
|
|
||||||
type Forward struct {
|
|
||||||
BaseModel
|
|
||||||
|
|
||||||
Protocol string `gorm:"not null" json:"protocol"`
|
|
||||||
Port string `gorm:"not null" json:"port"`
|
|
||||||
TargetIP string `gorm:"not null" json:"targetIP"`
|
|
||||||
TargetPort string `gorm:"not null" json:"targetPort"`
|
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user