mirror of
https://github.com/serghey-rodin/vesta.git
synced 2025-08-22 06:14:19 -07:00
Compare commits
848 commits
Author | SHA1 | Date | |
---|---|---|---|
|
873693b2ed |
||
|
2a91899846 |
||
|
2a6852b805 |
||
|
f978badd95 |
||
|
73d60c4591 |
||
|
93f4b6c182 |
||
|
343a877f06 | ||
|
1d7978ae2c | ||
|
762d7586e0 | ||
|
564af6aa2d | ||
|
8f6ac637d8 | ||
|
e6df9a65a2 |
||
|
ffd180b4f7 |
||
|
371cc02eda |
||
|
94d60267a8 |
||
|
c053bb4c1c | ||
|
4c78719897 | ||
|
765a67a6eb |
||
|
99cb78ce81 |
||
|
56c66fdef0 | ||
|
a2ebd2efdc |
||
|
c28f745069 | ||
|
1a37b33eb2 |
||
|
ee48d9a406 |
||
|
b4dab88694 |
||
|
51e468c22f |
||
|
7c4e9bad7d |
||
|
0682f7b10c |
||
|
1ce9ec299c | ||
|
e527827174 |
||
|
6714e1d35d | ||
|
d386c3598c |
||
|
39561c32c1 |
||
|
8bc587db41 |
||
|
da853d78cb |
||
|
956bc6697c |
||
|
8efaf5fe93 | ||
|
0b95fc283e |
||
|
969dc68561 |
||
|
653348242f |
||
|
64ddc9cfe8 |
||
|
b7bdfd2d87 | ||
|
0420ecc0e6 | ||
|
22f3dd11e2 |
||
|
df5962fc2e | ||
|
c863a592a5 | ||
|
067d43b418 | ||
|
2f3041bf05 |
||
|
5dc474846b |
||
|
4871bd1326 | ||
|
7ebcab3cbf | ||
|
cae9a1550d | ||
|
7d317c4fe8 |
||
|
84bc07d8f1 |
||
|
97f558465e |
||
|
f8936c6847 |
||
|
1dee07c3f1 |
||
|
2e7083668c | ||
|
bf65cae7f9 |
||
|
c7bef6bf33 |
||
|
bb4fc4c47d |
||
|
e2e3d1d113 |
||
|
bdf140d3c9 |
||
|
f53183cb7f |
||
|
1c46ce5cf7 |
||
|
89b3328a0d |
||
|
0c656b0c20 | ||
|
c308a42d2f | ||
|
5b2c180d86 | ||
|
eb5a045252 |
||
|
09e87f4af6 | ||
|
8ec606d5f6 | ||
|
354bacf1f3 | ||
|
c5612c827a | ||
|
a60b158049 |
||
|
790cd631a6 | ||
|
32a6be9adf |
||
|
51a95b9d72 |
||
|
62d9652437 | ||
|
8f8dbd5b25 |
||
|
60f75bc739 |
||
|
fc2403dc2f |
||
|
ddee8801a4 |
||
|
52a5425a94 |
||
|
85ee500306 | ||
|
85fb81f6d2 | ||
|
f012520f0e | ||
|
96124cca25 | ||
|
185f70651e | ||
|
612b8cbfc0 | ||
|
d67ea881fc |
||
|
604f1948e4 |
||
|
e66ec829f7 | ||
|
334ee00d25 |
||
|
859e65647f | ||
|
387e6c8e0a | ||
|
ec355d8137 | ||
|
b543c0c2f3 | ||
|
ed94787cd0 |
||
|
5f86fab58b | ||
|
335fd746db | ||
|
43a6fc23ef | ||
|
57401060c8 | ||
|
b539119ead | ||
|
2c79b0874b | ||
|
fabe2f1ec7 | ||
|
06a97a5551 |
||
|
b0bcc43154 | ||
|
b8083e008d | ||
|
539a926026 | ||
|
1738423829 | ||
|
474257fd72 | ||
|
8f10e5f94d | ||
|
6e4c59ab0d | ||
|
781933ea48 | ||
|
a7c5714d85 |
||
|
1ab9e12f2c | ||
|
0bb63b01c4 | ||
|
be834ddd17 | ||
|
93e9fe9f99 | ||
|
08513755b2 | ||
|
8e97eb2dad | ||
|
926376295a | ||
|
718e458fc9 | ||
|
dbbbe94d8f | ||
|
bfc94fbd10 | ||
|
fb9d3fddb0 |
||
|
5f0856f1c4 |
||
|
70748e302e |
||
|
7444a6b0a9 |
||
|
638ef7de51 |
||
|
3431bbbd8f |
||
|
f832525f65 |
||
|
350c6fc9c9 |
||
|
2ecb3a10ac | ||
|
7540c9881d | ||
|
b7cf917141 | ||
|
2a12fec5ea | ||
|
4306a4fb4f | ||
|
91e7d9ff4a | ||
|
4a9bfc94ad |
||
|
c520eb283a |
||
|
095e2e9e4a | ||
|
bfe31a82df | ||
|
67f2ad0c99 |
||
|
b6e7c18e29 |
||
|
c12c21ec8b | ||
|
4c6dd0d719 |
||
|
382732f87f | ||
|
1308b508ff | ||
|
4feb62c4c8 | ||
|
404b405656 | ||
|
1ed1505169 | ||
|
aab2b4d31d | ||
|
3f5246b144 | ||
|
1ba4238b84 | ||
|
47dab17c48 | ||
|
6b7dc97731 | ||
|
960e3a20df | ||
|
7a6dc72f29 | ||
|
402a69049c |
||
|
450fa0d7d0 |
||
|
6225820910 |
||
|
2fc0dc34fe |
||
|
6fdfef4e88 |
||
|
df9377519e |
||
|
e01adf78f8 |
||
|
a6884ad898 |
||
|
3a0bcfea66 |
||
|
cc2d60bf05 |
||
|
b4ec733dcc |
||
|
14a9fa4f8b |
||
|
0403b0c4a3 |
||
|
b1ca176d44 |
||
|
d0e9395c9f |
||
|
4affb916ef |
||
|
9aeef63ff4 |
||
|
a6cb9df163 |
||
|
d20a682c1d |
||
|
6aaf189547 |
||
|
cc97aeef02 |
||
|
10a59574d7 |
||
|
9f26aa785e |
||
|
29bdd18e95 |
||
|
88e54a8671 |
||
|
f3872ada4a |
||
|
06ff183f21 |
||
|
b0f65509e0 |
||
|
78133f35aa |
||
|
350a19edb1 |
||
|
98fd0827be |
||
|
a8ff57047c |
||
|
9d2c0ca64c |
||
|
55e58f5cce |
||
|
ffe3e1bbd9 |
||
|
2a2cfee433 |
||
|
76072b7398 |
||
|
b378cf18ed |
||
|
d68ac3993c |
||
|
0cdb05bb03 |
||
|
cde1cd6651 |
||
|
0fcbadda78 |
||
|
d97adaeb6a |
||
|
6b3cd17202 |
||
|
c582ff3766 |
||
|
374d6c6b19 |
||
|
1c801b2d60 |
||
|
1ff5208968 |
||
|
b123fa2178 |
||
|
393c81d46c |
||
|
93eec18723 |
||
|
45b13a2105 |
||
|
f41ad21e1e |
||
|
8a60b257a2 |
||
|
ea1e22613e |
||
|
bbe06d10b6 |
||
|
3c31647926 |
||
|
10bedc72f1 |
||
|
102ecb2c32 |
||
|
d0a21b4859 |
||
|
5f92fc5380 |
||
|
a4e4542a6d |
||
|
c6b79fe5da |
||
|
04bf5fc042 |
||
|
bba7400b8a |
||
|
fb7f6254fa |
||
|
1b85b7b313 |
||
|
d7de756d70 |
||
|
2dc4adb08e | ||
|
246ea6888d | ||
|
8d5c2e2e8e |
||
|
af94a23962 |
||
|
ce5d209c13 |
||
|
ef0f62a59b |
||
|
311827c4b3 |
||
|
f74301b19f |
||
|
ccea621787 |
||
|
c171d5e68e |
||
|
3b96845f8a |
||
|
e0ebf729f3 |
||
|
83d0b9ed90 |
||
|
d9e9c64369 |
||
|
8d9e349b23 |
||
|
a9e46047e9 |
||
|
c377e19df8 | ||
|
b6cadcd992 | ||
|
37fc05081b | ||
|
cfc46bb2a9 |
||
|
cc8a3e0c58 |
||
|
ce417f65a2 |
||
|
7177dbb4e7 |
||
|
e4710ae715 |
||
|
e75b62efad |
||
|
58807feb80 |
||
|
c915bff32e |
||
|
00e1f46276 |
||
|
c9844805a4 |
||
|
c3c4de43d6 |
||
|
a5712542d7 | ||
|
dae2eb0854 | ||
|
993796fcf2 | ||
|
99abd5ed05 |
||
|
931fb5beeb |
||
|
949c011321 |
||
|
9d2ca4b592 |
||
|
f0782d1f82 |
||
|
d0ca10a5d3 |
||
|
ec8631b2d2 |
||
|
9947b17144 | ||
|
6645586fb2 |
||
|
270d29ff06 | ||
|
52c32962a8 | ||
|
ae328a0935 | ||
|
84ef0a118f |
||
|
e82ad200b7 |
||
|
868dd8b146 | ||
|
26c0d3c3f2 | ||
|
743476ad73 | ||
|
015acfc168 |
||
|
8728f4b00d | ||
|
02955ddb47 | ||
|
25e66d471e | ||
|
b16e9b1d4d | ||
|
6d09433447 | ||
|
f23697217b | ||
|
9ab4927ec2 | ||
|
ea2f42e689 | ||
|
8d3473c914 | ||
|
aa8ba1aff1 | ||
|
c83a925c9a | ||
|
ed8d38228b | ||
|
0d66d22150 | ||
|
bebd854b60 | ||
|
7f8313b48f | ||
|
fe6f93faba | ||
|
57fb5a759f | ||
|
cb8cd40b13 | ||
|
a745eb02d8 | ||
|
880496962a | ||
|
3e2178bb6e | ||
|
9ba24729a6 | ||
|
1a02521f76 | ||
|
5c61b3efb1 |
||
|
72fe886a84 | ||
|
0340652bf6 |
||
|
b17b4b205d | ||
|
c9bf443c6a | ||
|
bb44f4197b | ||
|
dbb8b8c674 |
||
|
f0b47b3220 | ||
|
d74ac9980a |
||
|
9de1d46bb6 |
||
|
9c42ce85de |
||
|
a9ddd4159c |
||
|
f9c9ec6fed |
||
|
ce6640010b |
||
|
81842cc878 |
||
|
ef36a47ce0 |
||
|
8d83d0235e |
||
|
de51aa4692 |
||
|
0829d631c9 |
||
|
36c12c618b |
||
|
cbb5356a07 |
||
|
6d6e3f3723 |
||
|
0b0bcf6b15 |
||
|
b67c0f88e4 |
||
|
bf030103da |
||
|
a6028ee4e9 |
||
|
9bceb01622 | ||
|
a6d498e7e2 | ||
|
58e9615d94 |
||
|
7d48d5585f |
||
|
c2abcf3dc9 |
||
|
9c108786e6 |
||
|
a716a3f2cb |
||
|
a78c7ffc92 | ||
|
d24f68a370 |
||
|
e087a04f00 |
||
|
7726ed8956 |
||
|
46db88d266 |
||
|
3e922f8cfe |
||
|
d856c1e080 | ||
|
20c7764485 |
||
|
56ee371a88 |
||
|
390daf416c |
||
|
e6cc11a27b |
||
|
faf7612c7e |
||
|
1e157d4c29 |
||
|
46d080cd8a |
||
|
63b8ef22f6 |
||
|
3069003941 |
||
|
0f08d77fd5 |
||
|
855ba537cd |
||
|
d4bde98d2e |
||
|
7f82e42cc2 |
||
|
e57f620a86 |
||
|
8dd0ef30fe |
||
|
698f9783b4 |
||
|
d563dcd12b | ||
|
f50d8b7d84 | ||
|
3acd228169 |
||
|
a62095aa13 |
||
|
f492c1ee2a |
||
|
0031c93535 |
||
|
9b5ac54d93 |
||
|
5df4dc819f | ||
|
0713570b87 | ||
|
7226a8991f | ||
|
0831a198b8 | ||
|
7603cdea7a | ||
|
2da2c539f1 |
||
|
97a3b40047 | ||
|
af37f5cbef | ||
|
35df8ba980 | ||
|
82b635f8da | ||
|
25706abfb3 | ||
|
425e9f2483 | ||
|
bef5f87618 | ||
|
483c4b943b | ||
|
703a66eb57 | ||
|
e1fb811caf | ||
|
e674bf14fd | ||
|
70319b6a94 | ||
|
ab95d5d88d | ||
|
c28c5d29a3 | ||
|
f0c328375f |
||
|
3cbaab38bf |
||
|
b650ae5bd5 |
||
|
a981ddb468 |
||
|
8f2fdfb8d3 |
||
|
576a0003da |
||
|
a181433231 |
||
|
a420465b39 |
||
|
2bde9c6e47 |
||
|
891dac76fc |
||
|
a67674c1f2 |
||
|
5d9265f84f |
||
|
aeee40865e |
||
|
678c385a81 |
||
|
1637f737e1 |
||
|
90b30a437b |
||
|
1f40804735 | ||
|
180d910131 | ||
|
6a9b7d3507 | ||
|
80ebfc0daa | ||
|
8edf965375 | ||
|
f456afec60 |
||
|
2959165e1a |
||
|
c1b775443d | ||
|
eb03d7bab2 |
||
|
c5cff5bcd6 | ||
|
a7b54d6000 | ||
|
66473a41d9 |
||
|
ae1ec05e66 |
||
|
452a7ad62e |
||
|
12bc7ab544 |
||
|
b7a2728ab0 |
||
|
12fdd9713e |
||
|
3912de3ed0 |
||
|
b3b1ec3c2e |
||
|
4d5ecf05e7 |
||
|
d353421ff4 |
||
|
20027824cf |
||
|
eae7202f52 |
||
|
caf0890ca1 |
||
|
c1d1f13a04 |
||
|
a38770a081 |
||
|
470b88c764 |
||
|
a90c85e6b5 |
||
|
f85989fdbf |
||
|
4a04783d66 |
||
|
b1e826b0a6 |
||
|
19bd87334b |
||
|
e39623308e |
||
|
c11a1b165b |
||
|
579ed37114 |
||
|
49ab4c345c |
||
|
00ab9be534 |
||
|
a4b8ebcf88 |
||
|
cd3ccf5370 |
||
|
5230c3d3b0 |
||
|
bbf745e049 |
||
|
8cbba0ed3e |
||
|
1ede3c055c |
||
|
c28167f37a |
||
|
cf2dc9ccbd |
||
|
6c6520a18c |
||
|
ada32d5535 |
||
|
1806c2a3d6 |
||
|
dca488c0f7 |
||
|
58ddfd4b4d |
||
|
f64e745e20 |
||
|
8ef8d8b722 |
||
|
d449784697 |
||
|
68230531b3 |
||
|
37acc7bf31 |
||
|
faa9d4aa62 |
||
|
75283ef755 |
||
|
b289a46cfb |
||
|
4f086744be |
||
|
40a8461b28 |
||
|
f36148ca01 |
||
|
0226e7b862 |
||
|
064a16043d |
||
|
48f61fcc2c |
||
|
3188ae9999 |
||
|
01d9626b6c |
||
|
3ed733669e |
||
|
4ed0ca484c |
||
|
dc3dec644d |
||
|
6bb56a8742 |
||
|
5ea43b6df6 |
||
|
7a1cdc689e |
||
|
232dbf0d09 |
||
|
5b4d89b47f |
||
|
6a5061a7a9 |
||
|
7aa71c6ca0 |
||
|
b22802478d |
||
|
21ce107c68 |
||
|
edb3fcc2df |
||
|
372770931c |
||
|
a09f097b3b |
||
|
f4d3f7a85f | ||
|
090875a173 | ||
|
43fe755f0b |
||
|
ba6491b23f |
||
|
b510f55e88 |
||
|
bf5aa0fd6e | ||
|
d05a02e0b6 | ||
|
561d7e9f01 | ||
|
7d11db2dd2 | ||
|
e0a3439415 | ||
|
d15e103704 |
||
|
6b2f651418 | ||
|
0d9218e9fc | ||
|
bad8ee8042 | ||
|
3c8c2f2cfb |
||
|
1725a61491 | ||
|
d60c2655ec |
||
|
0bb74cd2bb |
||
|
d334ddc501 |
||
|
2d96e3631f |
||
|
c1fc0208f7 |
||
|
6c072a91c4 |
||
|
a72ecfbcfb |
||
|
45a6824990 |
||
|
18ec586831 |
||
|
7f833efcde |
||
|
3881e36967 |
||
|
9f671ccf90 |
||
|
be300fd82e |
||
|
5852424830 |
||
|
bdb0959e1b |
||
|
d8f372d99c |
||
|
3b58b4a8b7 |
||
|
c79785c790 |
||
|
13e2f473e2 |
||
|
f8734d15e9 |
||
|
7c9afbca32 |
||
|
1dae236693 |
||
|
6689e5c839 |
||
|
fb13db40ce |
||
|
57429a3203 |
||
|
b1e0e6a2a5 |
||
|
8d48fca193 |
||
|
041fd2914f |
||
|
0d85c88d18 |
||
|
8010f5d802 |
||
|
f8b4d42b74 | ||
|
635107b804 | ||
|
49f69ce60d | ||
|
daa33140f4 |
||
|
73cb7667cd | ||
|
4327a3d1bc |
||
|
95a345f2dc | ||
|
cb67641bed | ||
|
3d8b6a87a7 |
||
|
58c6ca95b1 |
||
|
965e23f30c | ||
|
dccd29f455 | ||
|
320455f7c9 | ||
|
d2d399676f | ||
|
41bfca0b21 | ||
|
9f9ee14559 |
||
|
2d0e09e7ca |
||
|
44eabb4e9d |
||
|
c29c7cc8e6 |
||
|
2a8188a207 |
||
|
59695acd10 | ||
|
6b590a6c93 | ||
|
6a8f77db18 |
||
|
46bfba0cae |
||
|
15a6808733 |
||
|
c5ba8b5b65 |
||
|
e1ca04c77c |
||
|
04e4b37f01 |
||
|
aa83fa85f8 |
||
|
eb29a1f374 |
||
|
00bc162fe6 | ||
|
0437c4ac3e | ||
|
2044890bae |
||
|
8c52faab65 |
||
|
64ad51376d |
||
|
784f075fa8 |
||
|
1369a12204 |
||
|
a697ae70f6 |
||
|
0a9aaa1042 |
||
|
59f29ce2f3 |
||
|
768df7293d |
||
|
995f9f8eba |
||
|
c8039a8ed9 |
||
|
ff0e5a00d4 |
||
|
05d77009e3 |
||
|
4edcd354ae |
||
|
483c4b6c7a |
||
|
12e1c00806 |
||
|
37a2216c74 |
||
|
d38c252089 |
||
|
b8ae9fc2bd |
||
|
e672970103 |
||
|
c82e50056d |
||
|
13d713ecc8 |
||
|
0f1fb8aa43 |
||
|
d6e0b4e18f |
||
|
936b225b30 |
||
|
ccc4e5a262 |
||
|
ef422f62f6 |
||
|
46b7d8438f |
||
|
433166a477 |
||
|
61c439554e |
||
|
151f82e519 |
||
|
4073325014 |
||
|
812e001723 |
||
|
49cf569729 |
||
|
4d70c416ca |
||
|
a3982fd477 |
||
|
591bfdaad1 |
||
|
e799566c6b |
||
|
f64909e9a9 |
||
|
9abd3baf2e | ||
|
0760e6a2e6 | ||
|
b9210522f5 |
||
|
e92d7a0960 |
||
|
2dc406aae4 |
||
|
381bc48e96 |
||
|
2996b8afc8 |
||
|
c32fa673e1 | ||
|
5170e5f5aa |
||
|
8a1f8349ec |
||
|
f9a15564e2 |
||
|
6a753f65f2 | ||
|
fa331e6ef2 |
||
|
76319e5a1b |
||
|
5ab9fc5f4a |
||
|
21dd9fae6d |
||
|
32e970d111 |
||
|
06f670046b |
||
|
50205c99ec |
||
|
20735121f7 |
||
|
b9252066e1 | ||
|
8e37c4fa0f | ||
|
cbbf27fc46 | ||
|
9a0bbbfd45 | ||
|
32fbc253a9 | ||
|
14c093a6a1 |
||
|
f6f6f9cfbb |
||
|
defba72215 | ||
|
83bd1f679f | ||
|
cde4269170 | ||
|
d880b5b425 | ||
|
5f68c1b634 | ||
|
67a0e8d108 | ||
|
a1b3aa3a84 | ||
|
1557f9bc8c | ||
|
a7e115fbb3 |
||
|
a12466f5cc | ||
|
7b0597fc41 | ||
|
c7f6bf4e28 |
||
|
a54771261d |
||
|
74334fae11 |
||
|
347e24fb7a |
||
|
13e75fea29 |
||
|
5420b2c95d |
||
|
cbaffbd561 |
||
|
5bd270591c |
||
|
1ea1bf6787 |
||
|
7f20521c5b |
||
|
e7daba868b | ||
|
d6c79c7d7e | ||
|
d2c172641f |
||
|
1ba6d24189 |
||
|
d2764a6481 |
||
|
ebc67f6478 | ||
|
df7cccac4c |
||
|
563a9d8b10 |
||
|
287da0f336 | ||
|
0e484587a8 | ||
|
d2d6b85d43 | ||
|
6825caa764 |
||
|
8bb89d2eb6 | ||
|
6a34f064c4 | ||
|
1c315de8d7 | ||
|
47a22f4a25 |
||
|
4a27e61d60 |
||
|
fbe93aa95b |
||
|
98542d69bc | ||
|
847e4f223b |
||
|
33ba05c35b |
||
|
7958b495c9 | ||
|
1096fcda9c |
||
|
79e34f240b |
||
|
07a7c90cf6 | ||
|
15f77bbf2b |
||
|
fd88749791 |
||
|
f80e6c8df8 |
||
|
18cfd97338 |
||
|
289ff88e4d | ||
|
979d6e7083 |
||
|
41d698b2ce |
||
|
3933ca4cb4 |
||
|
af04e1bdb9 | ||
|
5b4211b3da | ||
|
392caec58e |
||
|
dd19eef3aa |
||
|
bffeed5739 |
||
|
397cf699bb |
||
|
7f3e7d5b63 | ||
|
ece8efd505 | ||
|
ca3a9e0895 | ||
|
b6e26ac479 | ||
|
f4751a4e97 | ||
|
5fc8339a8d | ||
|
ca3956568b | ||
|
17d0fb114e | ||
|
955f3e7510 | ||
|
f59ebc4f65 | ||
|
4922062af6 |
||
|
6b2fafccb2 | ||
|
ee03eff016 | ||
|
e08a123642 |
||
|
4880746f8f |
||
|
f68bb795de | ||
|
4363244c1a |
||
|
f759088dde |
||
|
73a0b3fd95 |
||
|
11eca5dfda |
||
|
55f7598d69 |
||
|
21278272ad |
||
|
90a60579f3 |
||
|
497b7c5a33 |
||
|
c7d84e7b2c |
||
|
84202ca51b |
||
|
71ca858ed2 |
||
|
cd61896176 |
||
|
308da454eb |
||
|
a5d0011ef7 |
||
|
70d5e2537f |
||
|
828c8450e4 |
||
|
d0b1fa6e57 |
||
|
2ddcff2915 |
||
|
eed9f3bf4b |
||
|
5c7fd09642 |
||
|
c1c0443e20 |
||
|
e44a7ca5a2 |
||
|
eca2fdc073 |
||
|
52e9b19df6 |
||
|
cb20b0bfd1 |
||
|
3ecce92e16 |
||
|
ce96bc9388 |
||
|
334436e503 |
||
|
51f3dea7da |
||
|
54cae504f0 |
||
|
5e536570de |
||
|
cdbd689065 |
||
|
e1024e0483 |
||
|
53c58d2bb3 |
||
|
3e0a67113e |
||
|
b06ddecbc1 |
||
|
e9589f586d |
||
|
7a28629ffc |
||
|
73e72183b2 |
||
|
a3f0fa1501 | ||
|
208db116d1 | ||
|
4a3cec1290 | ||
|
4401d706a4 | ||
|
1304a7312d |
||
|
b2649fd3cc | ||
|
b143792750 | ||
|
78bccef43c |
||
|
04a55260ca | ||
|
ed1ad943cf |
||
|
b8375c5833 |
||
|
f1a6b3783c |
||
|
92f70d7178 |
||
|
a5e093da16 | ||
|
0f48ec04f0 | ||
|
85b3578f9c | ||
|
37c69b8f4c | ||
|
3aadf37a82 | ||
|
c80c4c472e | ||
|
e62432e672 |
||
|
97e0e0644d |
||
|
599a07fa60 |
||
|
2ebc6a7ec8 | ||
|
e79de3c834 |
||
|
ad96554e77 |
||
|
314f08b484 | ||
|
19400663ec | ||
|
4e81382cd8 | ||
|
dd2a57e408 | ||
|
2cb01e0c73 | ||
|
4baf5ebc2c |
||
|
91db05f1f8 | ||
|
4f4cc763a7 | ||
|
9148f7c9c2 | ||
|
8d85cdcb2c |
||
|
a21ecd0ad0 | ||
|
b5874764a7 | ||
|
4c751ab693 | ||
|
73e6656986 | ||
|
d14b7d969c |
||
|
17f198cc36 | ||
|
3f9f8d9467 |
||
|
3742d5f13d |
||
|
5fed5bb889 |
||
|
c3cfd66228 |
||
|
d14d4cddfb |
||
|
12306ce834 |
||
|
b7c19a8e63 |
||
|
acf3e0be13 |
||
|
06f6fff118 | ||
|
eaf9d89096 | ||
|
07ec81b6ae |
||
|
c1d87b2823 |
||
|
1034d1bbc2 | ||
|
0d5c3c42a1 | ||
|
efa2b50b4c | ||
|
3fdee2975d | ||
|
ffdae1dca1 |
||
|
6d0e4efe2e |
||
|
b2e75d89b7 |
||
|
082095b164 |
||
|
d942f85d31 |
||
|
7ec123a861 |
||
|
b3d78bbfdb |
||
|
69f01fb227 |
||
|
eb7e6d2fba |
||
|
6b97f7394c |
||
|
58c9656779 | ||
|
4ef7131065 | ||
|
7f734c4fe9 |
||
|
4c1a67a9b1 | ||
|
4cc3c1d287 | ||
|
26c311b773 | ||
|
74fa6d5b0c |
||
|
da5bcbe624 |
||
|
a217391565 |
||
|
40011f8f75 | ||
|
421ecfa62c | ||
|
bc82fcaf71 |
||
|
add956bb62 |
||
|
4b1b1e3299 |
||
|
2e03b516f8 |
||
|
5a108be182 |
||
|
8a217352fe | ||
|
9a9dabb0c9 | ||
|
c042fa2689 | ||
|
bea7ccd25e | ||
|
12409ddeaf |
||
|
a65fb3c2ee | ||
|
8773ac2071 | ||
|
3021abecb6 | ||
|
9585a2a369 |
||
|
c28dcc1037 | ||
|
8c9c4116b0 | ||
|
a7333684a2 | ||
|
9059167db7 |
||
|
351d2a78cf | ||
|
e986e48baf | ||
|
5b834dc8c1 | ||
|
9d7d9f34f7 | ||
|
d7eb12defa | ||
|
6da6d38cfd | ||
|
80f65d54de | ||
|
02afaffa73 | ||
|
3d6eb2c8ea |
||
|
d9686a59f2 |
||
|
2397137578 |
2193 changed files with 116360 additions and 18221 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -4,3 +4,6 @@
|
||||||
*.gz
|
*.gz
|
||||||
.vscode
|
.vscode
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
src/react/node_modules
|
||||||
|
src/react/build
|
||||||
|
/.idea
|
|
@ -1,6 +1,8 @@
|
||||||
[Vesta Control Panel](http://vestacp.com/)
|
[Vesta Control Panel](http://vestacp.com/)
|
||||||
==================================================
|
==================================================
|
||||||
|
|
||||||
|
Vesta is back under active development as of 25 February 2024. We are commited to open source, and will engage with the community to identify the new roadmap for Vesta. Stay tuned!
|
||||||
|
|
||||||
[](https://gitter.im/vesta-cp/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://gitter.im/vesta-cp/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
* Vesta is an open source hosting control panel.
|
* Vesta is an open source hosting control panel.
|
||||||
|
@ -16,7 +18,7 @@ ssh root@your.server
|
||||||
|
|
||||||
Download the installation script, and run it:
|
Download the installation script, and run it:
|
||||||
```bash
|
```bash
|
||||||
curl http://vestacp.com/pub/vst-install.sh | bash
|
curl https://vestacp.com/pub/vst-install.sh | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
How to install (3 step)
|
How to install (3 step)
|
||||||
|
@ -29,7 +31,7 @@ ssh root@your.server
|
||||||
|
|
||||||
Download the installation script:
|
Download the installation script:
|
||||||
```bash
|
```bash
|
||||||
curl -O http://vestacp.com/pub/vst-install.sh
|
curl -O https://vestacp.com/pub/vst-install.sh
|
||||||
```
|
```
|
||||||
Then run it:
|
Then run it:
|
||||||
```bash
|
```bash
|
||||||
|
@ -38,5 +40,5 @@ bash vst-install.sh
|
||||||
|
|
||||||
License
|
License
|
||||||
----------------------------
|
----------------------------
|
||||||
Vesta is licensed under [GPL v3 ](https://github.com/serghey-rodin/vesta/blob/master/LICENSE) license
|
Vesta is licensed under [GPL v3 ](https://github.com/outroll/vesta/blob/master/LICENSE) license
|
||||||
|
|
||||||
|
|
5
SECURITY.md
Normal file
5
SECURITY.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Please report security issues to dev@vestacp.com
|
|
@ -27,7 +27,7 @@ source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
# Checking arg number
|
# Checking arg number
|
||||||
check_args '2' "$#" 'MODULE LICENSE'
|
check_args '2' "$#" 'MODULE LICENSE'
|
||||||
|
is_user_format_valid "$license" "license"
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Action #
|
# Action #
|
||||||
|
@ -35,7 +35,7 @@ check_args '2' "$#" 'MODULE LICENSE'
|
||||||
|
|
||||||
# Activating license
|
# Activating license
|
||||||
v_host='https://vestacp.com/checkout'
|
v_host='https://vestacp.com/checkout'
|
||||||
answer=$(curl -s $v_host/activate.php?licence_key=$license&module=$module)
|
answer=$(curl -s "$v_host/activate.php?licence_key=$license&module=$module")
|
||||||
check_result $? "cant' connect to vestacp.com " $E_CONNECT
|
check_result $? "cant' connect to vestacp.com " $E_CONNECT
|
||||||
|
|
||||||
# Checking server answer
|
# Checking server answer
|
||||||
|
|
|
@ -38,8 +38,7 @@ EOF
|
||||||
sftpc() {
|
sftpc() {
|
||||||
expect -f "-" <<EOF "$@"
|
expect -f "-" <<EOF "$@"
|
||||||
set count 0
|
set count 0
|
||||||
spawn /usr/bin/sftp -o StrictHostKeyChecking=no -o \
|
spawn /usr/bin/sftp -o StrictHostKeyChecking=no -o Port=$port $user@$host
|
||||||
Port=$port $user@$host
|
|
||||||
expect {
|
expect {
|
||||||
"password:" {
|
"password:" {
|
||||||
send "$password\r"
|
send "$password\r"
|
||||||
|
@ -94,12 +93,14 @@ EOF
|
||||||
|
|
||||||
if [ "$type" != 'local' ];then
|
if [ "$type" != 'local' ];then
|
||||||
check_args '4' "$#" "TYPE HOST USERNAME PASSWORD [PATH] [PORT]"
|
check_args '4' "$#" "TYPE HOST USERNAME PASSWORD [PATH] [PORT]"
|
||||||
is_format_valid 'host'
|
is_format_valid 'user' 'host' 'path' 'port'
|
||||||
is_password_valid
|
is_password_valid
|
||||||
if [ "$type" = 'sftp' ]; then
|
if [ "$type" = 'sftp' ]; then
|
||||||
which expect >/dev/null 2>&1
|
which expect >/dev/null 2>&1
|
||||||
check_result $? "expect command not found" $E_NOTEXIST
|
check_result $? "expect command not found" $E_NOTEXIST
|
||||||
fi
|
fi
|
||||||
|
host "$host" >/dev/null 2>&1
|
||||||
|
check_result $? "host connection failed" "$E_CONNECT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -50,12 +50,12 @@ domain_lvl=$(echo "$alias" |grep -o "\." |wc -l)
|
||||||
# Adding second level domain
|
# Adding second level domain
|
||||||
if [ "$domain_lvl" -eq 1 ] || [ "${#top_domain}" -le '6' ]; then
|
if [ "$domain_lvl" -eq 1 ] || [ "${#top_domain}" -le '6' ]; then
|
||||||
$BIN/v-add-dns-domain \
|
$BIN/v-add-dns-domain \
|
||||||
$user $alias $ip '' '' '' '' '' $restart >> /dev/null
|
$user $alias $ip '' '' '' '' '' '' '' '' $restart >> /dev/null
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Adding top-level domain and then its sub
|
# Adding top-level domain and then its sub
|
||||||
$BIN/v-add-dns-domain $user $top_domain $ip '' '' '' '' $restart >> /dev/null
|
$BIN/v-add-dns-domain $user $top_domain $ip '' '' '' '' '' '' '' '' $restart >> /dev/null
|
||||||
|
|
||||||
# Checking top-level domain
|
# Checking top-level domain
|
||||||
if [ ! -e "$USER_DATA/dns/$top_domain.conf" ]; then
|
if [ ! -e "$USER_DATA/dns/$top_domain.conf" ]; then
|
||||||
|
|
|
@ -45,10 +45,12 @@ if [[ $rtype =~ NS|CNAME|MX|PTR|SRV ]]; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dvalue=${dvalue//\"/}
|
if [ $rtype != "CAA" ]; then
|
||||||
|
dvalue=${dvalue//\"/}
|
||||||
|
|
||||||
if [[ "$dvalue" =~ [\;[:space:]] ]]; then
|
if [[ "$dvalue" =~ [\;[:space:]] ]]; then
|
||||||
dvalue='"'"$dvalue"'"'
|
dvalue='"'"$dvalue"'"'
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Additional argument formatting
|
# Additional argument formatting
|
||||||
|
|
|
@ -21,6 +21,12 @@ protocol=$(echo $protocol|tr '[:lower:]' '[:upper:]')
|
||||||
# Defining absolute path to iptables
|
# Defining absolute path to iptables
|
||||||
iptables="/sbin/iptables"
|
iptables="/sbin/iptables"
|
||||||
|
|
||||||
|
# Get vesta port by reading nginx.conf
|
||||||
|
vestaport=$(grep 'listen' $VESTA/nginx/conf/nginx.conf | awk '{print $2}' | sed "s|;||")
|
||||||
|
if [ -z "$vestaport" ]; then
|
||||||
|
vestaport=8083
|
||||||
|
fi
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
source $VESTA/conf/vesta.conf
|
source $VESTA/conf/vesta.conf
|
||||||
|
@ -41,13 +47,19 @@ is_system_enabled "$FIREWALL_SYSTEM" 'FIREWALL_SYSTEM'
|
||||||
|
|
||||||
# Checking known chains
|
# Checking known chains
|
||||||
case $chain in
|
case $chain in
|
||||||
SSH) port=22; protocol=TCP ;;
|
SSH) # Get ssh port by reading ssh config file.
|
||||||
|
sshport=$(grep '^Port ' /etc/ssh/sshd_config | head -1 | cut -d ' ' -f 2)
|
||||||
|
if [ -z "$sshport" ]; then
|
||||||
|
sshport=22
|
||||||
|
fi
|
||||||
|
port=$sshport;
|
||||||
|
protocol=TCP ;;
|
||||||
FTP) port=21; protocol=TCP ;;
|
FTP) port=21; protocol=TCP ;;
|
||||||
MAIL) port='25,465,587,2525,110,995,143,993'; protocol=TCP ;;
|
MAIL) port='25,465,587,2525,110,995,143,993'; protocol=TCP ;;
|
||||||
DNS) port=53; protocol=UDP ;;
|
DNS) port=53; protocol=UDP ;;
|
||||||
WEB) port='80,443'; protocol=TCP ;;
|
WEB) port='80,443'; protocol=TCP ;;
|
||||||
DB) port='3306,5432'; protocol=TCP ;;
|
DB) port='3306,5432'; protocol=TCP ;;
|
||||||
VESTA) port=8083; protocol=TCP ;;
|
VESTA) port=$vestaport; protocol=TCP ;;
|
||||||
*) check_args '2' "$#" 'CHAIN PORT' ;;
|
*) check_args '2' "$#" 'CHAIN PORT' ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,8 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# info: adding letsencrypt ssl cetificate for domain
|
# info: check letsencrypt domain
|
||||||
# options: USER DOMAIN [ALIASES] [RESTART] [NOTIFY]
|
# options: USER DOMAIN [ALIASES]
|
||||||
#
|
#
|
||||||
# The function turns on SSL support for a domain. Parameter ssl_dir is a path
|
# The function check and validates domain with Let's Encript
|
||||||
# to directory where 2 or 3 ssl files can be found. Certificate file
|
|
||||||
# domain.tld.crt and its key domain.tld.key are mandatory. Certificate
|
|
||||||
# authority domain.tld.ca file is optional. If home directory parameter
|
|
||||||
# (ssl_home) is not set, https domain uses public_shtml as separate
|
|
||||||
# documentroot directory.
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
@ -18,8 +13,9 @@
|
||||||
user=$1
|
user=$1
|
||||||
domain=$2
|
domain=$2
|
||||||
aliases=$3
|
aliases=$3
|
||||||
restart=$4
|
|
||||||
notify=$5
|
# LE API
|
||||||
|
API='https://acme-v02.api.letsencrypt.org'
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
|
@ -27,98 +23,346 @@ source $VESTA/func/domain.sh
|
||||||
source $VESTA/conf/vesta.conf
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
# Additional argument formatting
|
# Additional argument formatting
|
||||||
format_domain_idn
|
format_identifier_idn() {
|
||||||
|
identifier_idn=$identifier
|
||||||
|
if [[ "$identifier_idn" = *[![:ascii:]]* ]]; then
|
||||||
|
identifier_idn=$(idn -t --quiet -a $identifier_idn)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# encode base64
|
||||||
|
encode_base64() {
|
||||||
|
cat |base64 |tr '+/' '-_' |tr -d '\r\n='
|
||||||
|
}
|
||||||
|
|
||||||
|
# Let's Encrypt v2 curl function
|
||||||
|
query_le_v2() {
|
||||||
|
|
||||||
|
protected='{"nonce": "'$3'",'
|
||||||
|
protected=''$protected' "url": "'$1'",'
|
||||||
|
protected=''$protected' "alg": "RS256", "kid": "'$KID'"}'
|
||||||
|
content="Content-Type: application/jose+json"
|
||||||
|
|
||||||
|
payload_=$(echo -n "$2" |encode_base64)
|
||||||
|
protected_=$(echo -n "$protected" |encode_base64)
|
||||||
|
signature_=$(printf "%s" "$protected_.$payload_" |\
|
||||||
|
openssl dgst -sha256 -binary -sign $USER_DATA/ssl/user.key |\
|
||||||
|
encode_base64)
|
||||||
|
|
||||||
|
post_data='{"protected":"'"$protected_"'",'
|
||||||
|
post_data=$post_data'"payload":"'"$payload_"'",'
|
||||||
|
post_data=$post_data'"signature":"'"$signature_"'"}'
|
||||||
|
|
||||||
|
# Save http response to file passed as "$4" arg or print to stdout if not provided
|
||||||
|
# http response headers are always sent to stdout
|
||||||
|
local save_to_file=${4:-"/dev/stdout"}
|
||||||
|
curl --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Verifications #
|
# Verifications #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '2' "$#" 'USER DOMAIN [ALIASES] [RESTART] [NOTIFY]'
|
check_args '2' "$#" 'USER DOMAIN [ALIASES]'
|
||||||
is_format_valid 'user' 'domain'
|
is_format_valid 'user' 'domain' 'aliases'
|
||||||
is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
|
is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
|
||||||
is_system_enabled "$WEB_SSL" 'SSL_SUPPORT'
|
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_unsuspended 'user' 'USER' "$user"
|
is_object_unsuspended 'user' 'USER' "$user"
|
||||||
is_object_valid 'web' 'DOMAIN' "$domain"
|
is_object_valid 'web' 'DOMAIN' "$domain"
|
||||||
is_object_unsuspended 'web' 'DOMAIN' "$domain"
|
is_object_unsuspended 'web' 'DOMAIN' "$domain"
|
||||||
|
get_domain_values 'web'
|
||||||
|
|
||||||
|
echo "-----------------------------------------------------------------------------------" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
echo "[$(date)] : v-add-letsencrypt-domain $domain [$aliases]" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
|
||||||
|
# check if alias is the letsencrypt wildcard domain, if not, make the normal checks
|
||||||
|
if [[ "$aliases" != "*.$domain" ]]; then
|
||||||
|
for alias in $(echo "$aliases" |tr ',' '\n' |sort -u); do
|
||||||
|
check_alias="$(echo $ALIAS |tr ',' '\n' |grep ^$alias$)"
|
||||||
|
if [ -z "$check_alias" ]; then
|
||||||
|
echo "[$(date)] : EXIT=domain alias $alias doesn't exist" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_NOTEXIST "domain alias $alias doesn't exist"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi;
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Parsing domain data
|
|
||||||
get_domain_values 'web'
|
|
||||||
|
|
||||||
# Registering LetsEncrypt user account
|
# Registering LetsEncrypt user account
|
||||||
|
echo "[$(date)] : v-add-letsencrypt-user $user" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
$BIN/v-add-letsencrypt-user $user
|
$BIN/v-add-letsencrypt-user $user
|
||||||
|
echo "[$(date)] : result: $?" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
if [ "$?" -ne 0 ]; then
|
if [ "$?" -ne 0 ]; then
|
||||||
touch $VESTA/data/queue/letsencrypt.pipe
|
touch $VESTA/data/queue/letsencrypt.pipe
|
||||||
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
||||||
send_notice "LETSENCRYPT" "Account registration failed"
|
send_notice "LETSENCRYPT" "Account registration failed"
|
||||||
|
echo "[$(date)] : EXIT=LE account registration" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
check_result $E_CONNECT "LE account registration" >/dev/null
|
check_result $E_CONNECT "LE account registration" >/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Parsing LetsEncrypt account data
|
# Parsing LetsEncrypt account data
|
||||||
source $USER_DATA/ssl/le.conf
|
source $USER_DATA/ssl/le.conf
|
||||||
email=$EMAIL
|
|
||||||
|
|
||||||
# Validating domain and aliases
|
# Checking wildcard alias
|
||||||
i=1
|
if [ "$aliases" = "*.$domain" ]; then
|
||||||
for alias in $(echo $domain,$aliases |tr ',' '\n' |sort -u); do
|
echo "[$(date)] : Checking wildcard alias" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
$BIN/v-check-letsencrypt-domain $user $alias
|
wildcard='yes'
|
||||||
if [ "$?" -ne 0 ]; then
|
proto="dns-01"
|
||||||
touch $VESTA/data/queue/letsencrypt.pipe
|
if [ ! -e "$VESTA/data/users/$user/dns/$domain.conf" ]; then
|
||||||
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
echo "[$(date)] : EXIT=DNS domain $domain doesn't exist" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
send_notice "LETSENCRYPT" "$alias validation failed"
|
check_result $E_NOTEXIST "DNS domain $domain doesn't exist"
|
||||||
check_result $E_INVALID "LE domain validation" >/dev/null
|
fi
|
||||||
|
else
|
||||||
|
proto="http-01"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Requesting nonce / STEP 1
|
||||||
|
echo "[$(date)] : --- Requesting nonce / STEP 1 ---" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
echo "[$(date)] : curl -s -I \"$API/directory\"" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
answer=$(curl -s -I "$API/directory")
|
||||||
|
echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
nonce=$(echo "$answer" |grep -i nonce |cut -f2 -d \ |tr -d '\r\n')
|
||||||
|
echo "[$(date)] : nonce=$nonce" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
status=$(echo "$answer"|grep HTTP/ |tail -n1 |cut -f 2 -d ' ')
|
||||||
|
echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [[ "$status" -ne 200 ]]; then
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt nonce request status $status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_CONNECT "Let's Encrypt nonce request status $status"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Placing new order / STEP 2
|
||||||
|
echo "[$(date)] : --- Placing new order / STEP 2 ---" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
url="$API/acme/new-order"
|
||||||
|
payload='{"identifiers":['
|
||||||
|
for identifier in $(echo $domain,$aliases |tr ',' '\n' |sort -u); do
|
||||||
|
format_identifier_idn
|
||||||
|
payload=$payload'{"type":"dns","value":"'$identifier_idn'"},'
|
||||||
|
done
|
||||||
|
payload=$(echo "$payload"|sed "s/,$//")
|
||||||
|
payload=$payload']}'
|
||||||
|
echo "[$(date)] : payload=$payload" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
echo "[$(date)] : query_le_v2 \"$url\" \"$payload\" \"$nonce\"" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
answer=$(query_le_v2 "$url" "$payload" "$nonce")
|
||||||
|
echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
nonce=$(echo "$answer" |grep -i nonce |cut -f2 -d \ |tr -d '\r\n')
|
||||||
|
echo "[$(date)] : nonce=$nonce" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
authz=$(echo "$answer" |grep "acme/authz" |cut -f2 -d '"')
|
||||||
|
echo "[$(date)] : authz=$authz" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
finalize=$(echo "$answer" |grep 'finalize":' |cut -f4 -d '"')
|
||||||
|
echo "[$(date)] : finalize=$finalize" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
status=$(echo "$answer" |grep HTTP/ |tail -n1 |cut -f2 -d ' ')
|
||||||
|
echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [[ "$status" -ne 201 ]]; then
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt new auth status $status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_CONNECT "Let's Encrypt new auth status $status"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Requesting authorization token / STEP 3
|
||||||
|
echo "[$(date)] : --- Requesting authorization token / STEP 3 ---" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
for auth in $authz; do
|
||||||
|
payload=''
|
||||||
|
echo "[$(date)] : for auth=$auth" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
echo "[$(date)] : query_le_v2 \"$auth\" \"$payload\" \"$nonce\"" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
answer=$(query_le_v2 "$auth" "$payload" "$nonce")
|
||||||
|
echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
url=$(echo "$answer" |grep -A3 $proto |grep '"url"' |cut -f 4 -d \")
|
||||||
|
echo "[$(date)] : url=$url" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
token=$(echo "$answer" |grep -A3 $proto |grep token |cut -f 4 -d \")
|
||||||
|
echo "[$(date)] : token=$token" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
nonce=$(echo "$answer" |grep -i nonce |cut -f2 -d \ |tr -d '\r\n')
|
||||||
|
echo "[$(date)] : nonce=$nonce" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
status=$(echo "$answer"|grep HTTP/ |tail -n1 |cut -f 2 -d ' ')
|
||||||
|
echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [[ "$status" -ne 200 ]]; then
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt acme/authz bad status $status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_CONNECT "Let's Encrypt acme/authz bad status $status"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Checking LE limits per account
|
# Configuring challenge / STEP 4
|
||||||
if [ "$i" -gt 100 ]; then
|
echo "[$(date)] : --- Configuring challenge / STEP 4 ---" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
touch $VESTA/data/queue/letsencrypt.pipe
|
echo "[$(date)] : wildcard=$wildcard" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
if [ "$wildcard" = 'yes' ]; then
|
||||||
send_notice 'LETSENCRYPT' 'Limit of domains per account is reached'
|
record=$(printf "%s" "$token.$THUMB" |\
|
||||||
check_result $E_LIMIT "LE can't sign more than 100 domains"
|
openssl dgst -sha256 -binary |encode_base64)
|
||||||
|
old_records=$($BIN/v-list-dns-records $user $domain plain|grep 'TXT')
|
||||||
|
old_records=$(echo "$old_records" |grep _acme-challenge |cut -f 1)
|
||||||
|
for old_record in $old_records; do
|
||||||
|
$BIN/v-delete-dns-record "$user" "$domain" "$old_record"
|
||||||
|
done
|
||||||
|
$BIN/v-add-dns-record "$user" "$domain" "_acme-challenge" "TXT" "$record"
|
||||||
|
exitstatus=$?
|
||||||
|
echo "[$(date)] : v-add-dns-record \"$user\" \"$domain\" \"_acme-challenge\" \"TXT\" \"$record\"" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [ "$exitstatus" -ne 0 ]; then
|
||||||
|
echo "[$(date)] : EXIT=DNS _acme-challenge record wasn't created" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
fi
|
||||||
|
check_result $exitstatus "DNS _acme-challenge record wasn't created"
|
||||||
|
else
|
||||||
|
if [ "$WEB_SYSTEM" = 'nginx' ] || [ ! -z "$PROXY_SYSTEM" ]; then
|
||||||
|
if [ -f "/usr/local/vesta/web/inc/nginx_proxy" ]; then
|
||||||
|
# if vesta is behind main nginx
|
||||||
|
well_known="$HOMEDIR/$user/web/$domain/public_html/.well-known"
|
||||||
|
acme_challenge="$well_known/acme-challenge"
|
||||||
|
mkdir -p $acme_challenge
|
||||||
|
echo "$token.$THUMB" > $acme_challenge/$token
|
||||||
|
echo "[$(date)] : in $acme_challenge/$token we put: $token.$THUMB" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
chown -R $user:$user $well_known
|
||||||
|
else
|
||||||
|
# default nginx method
|
||||||
|
conf="$HOMEDIR/$user/conf/web/nginx.$domain.conf_letsencrypt"
|
||||||
|
sconf="$HOMEDIR/$user/conf/web/snginx.$domain.conf_letsencrypt"
|
||||||
|
# if [ ! -e "$conf" ]; then
|
||||||
|
echo 'location ~ "^/\.well-known/acme-challenge/(.*)$" {' \
|
||||||
|
> $conf
|
||||||
|
echo ' default_type text/plain;' >> $conf
|
||||||
|
echo ' return 200 "$1.'$THUMB'";' >> $conf
|
||||||
|
echo '}' >> $conf
|
||||||
|
# fi
|
||||||
|
echo "[$(date)] : in $conf we put: $THUMB" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [ ! -e "$sconf" ]; then
|
||||||
|
ln -s "$conf" "$sconf"
|
||||||
|
fi
|
||||||
|
echo "[$(date)] : v-restart-proxy" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
$BIN/v-restart-proxy
|
||||||
|
if [ -z "$PROXY_SYSTEM" ]; then
|
||||||
|
# apache-less variant
|
||||||
|
echo "[$(date)] : v-restart-web" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
$BIN/v-restart-web
|
||||||
|
fi
|
||||||
|
exitstatus=$?
|
||||||
|
if [ "$exitstatus" -ne 0 ]; then
|
||||||
|
echo "[$(date)] : EXIT=Proxy restart failed = $exitstatus" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
fi
|
||||||
|
check_result $exitstatus "Proxy restart failed" >/dev/null
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
well_known="$HOMEDIR/$user/web/$domain/public_html/.well-known"
|
||||||
|
acme_challenge="$well_known/acme-challenge"
|
||||||
|
mkdir -p $acme_challenge
|
||||||
|
echo "$token.$THUMB" > $acme_challenge/$token
|
||||||
|
chown -R $user:$user $well_known
|
||||||
|
echo "[$(date)] : in $acme_challenge/$token we put: $token.$THUMB" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
# $BIN/v-restart-web
|
||||||
|
# check_result $? "Web restart failed" >/dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Requesting ACME validation / STEP 5
|
||||||
|
echo "[$(date)] : --- Requesting ACME validation / STEP 5 ---" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
validation_check=$(echo "$answer" |grep '"valid"')
|
||||||
|
echo "[$(date)] : validation_check=$validation_check" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [[ ! -z "$validation_check" ]]; then
|
||||||
|
validation='valid'
|
||||||
|
else
|
||||||
|
validation='pending'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Doing pol check on status
|
||||||
|
i=1
|
||||||
|
while [ "$validation" = 'pending' ]; do
|
||||||
|
echo "[$(date)] : - Doing pol check on status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
payload='{}'
|
||||||
|
echo "[$(date)] : query_le_v2 \"$url\" \"$payload\" \"$nonce\"" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
answer=$(query_le_v2 "$url" "$payload" "$nonce")
|
||||||
|
echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
validation=$(echo "$answer"|grep -A1 $proto |tail -n1|cut -f4 -d \")
|
||||||
|
echo "[$(date)] : validation=$validation" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
nonce=$(echo "$answer" |grep -i nonce |cut -f2 -d \ |tr -d '\r\n')
|
||||||
|
echo "[$(date)] : nonce=$nonce" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
status=$(echo "$answer"|grep HTTP/ |tail -n1 |cut -f 2 -d ' ')
|
||||||
|
echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [[ "$status" -ne 200 ]]; then
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt validation status $status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_CONNECT "Let's Encrypt validation status $status"
|
||||||
|
fi
|
||||||
|
|
||||||
|
i=$((i + 1))
|
||||||
|
if [ "$i" -gt 10 ]; then
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt domain validation timeout" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_CONNECT "Let's Encrypt domain validation timeout"
|
||||||
|
fi
|
||||||
|
sleeping=$((i*2))
|
||||||
|
echo "[$(date)] : sleep $sleeping (i=$i)" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
sleep $sleeping
|
||||||
|
done
|
||||||
|
if [ "$validation" = 'invalid' ]; then
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt domain verification failed" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_CONNECT "Let's Encrypt domain verification failed"
|
||||||
fi
|
fi
|
||||||
i=$((i++))
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Generating CSR
|
|
||||||
ssl_dir=$($BIN/v-generate-ssl-cert "$domain" "$email" "US" "California" \
|
# Generating new ssl certificate
|
||||||
|
ssl_dir=$($BIN/v-generate-ssl-cert "$domain" "info@$domain" "US" "California"\
|
||||||
"San Francisco" "Vesta" "IT" "$aliases" |tail -n1 |awk '{print $2}')
|
"San Francisco" "Vesta" "IT" "$aliases" |tail -n1 |awk '{print $2}')
|
||||||
|
|
||||||
# Signing CSR
|
# Sending CSR to finalize order / STEP 6
|
||||||
crt=$($BIN/v-sign-letsencrypt-csr $user $domain $ssl_dir)
|
echo "[$(date)] : --- Sending CSR to finalize order / STEP 6 ---" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
if [ "$?" -ne 0 ]; then
|
|
||||||
touch $VESTA/data/queue/letsencrypt.pipe
|
|
||||||
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
|
||||||
send_notice "LETSENCRYPT" "$alias validation failed"
|
|
||||||
check_result "$E_INVALID" "LE $domain validation"
|
|
||||||
fi
|
|
||||||
echo "$crt" > $ssl_dir/$domain.crt
|
|
||||||
|
|
||||||
# Dowloading CA certificate
|
csr=$(openssl req -in $ssl_dir/$domain.csr -outform DER |encode_base64)
|
||||||
le_certs='https://letsencrypt.org/certs'
|
payload='{"csr":"'$csr'"}'
|
||||||
x1='lets-encrypt-x1-cross-signed.pem.txt'
|
echo "[$(date)] : query_le_v2 \"$finalize\" \"$payload\" \"$nonce\"" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
x3='lets-encrypt-x3-cross-signed.pem.txt'
|
answer=$(query_le_v2 "$finalize" "$payload" "$nonce")
|
||||||
issuer=$(openssl x509 -text -in $ssl_dir/$domain.crt |grep "Issuer:")
|
echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
if [ -z "$(echo $issuer|grep X3)" ]; then
|
nonce=$(echo "$answer" |grep -i nonce |cut -f2 -d \ |tr -d '\r\n')
|
||||||
curl -s $le_certs/$x1 > $ssl_dir/$domain.ca
|
echo "[$(date)] : nonce=$nonce" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
else
|
status=$(echo "$answer"|grep HTTP/ |tail -n1 |cut -f 2 -d ' ')
|
||||||
curl -s $le_certs/$x3 > $ssl_dir/$domain.ca
|
echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
certificate=$(echo "$answer"|grep 'certificate":' |cut -f4 -d '"')
|
||||||
|
echo "[$(date)] : certificate=$certificate" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [[ "$status" -ne 200 ]]; then
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt finalize bad status $status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_CONNECT "Let's Encrypt finalize bad status $status"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Downloading signed certificate / STEP 7
|
||||||
|
echo "[$(date)] : --- Downloading signed certificate / STEP 7 ---" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
echo "[$(date)] : query_le_v2 \"$certificate\" \"\" \"$nonce\"" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
answer=$(query_le_v2 "$certificate" "" "$nonce" "$ssl_dir/$domain.pem")
|
||||||
|
echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
status=$(echo "$answer"|grep HTTP/ |tail -n1 |cut -f 2 -d ' ')
|
||||||
|
echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [[ "$status" -ne 200 ]]; then
|
||||||
|
[ -d "$ssl_dir" ] && rm -rf "$ssl_dir"
|
||||||
|
echo "[$(date)] : EXIT=Let's Encrypt downloading signed cert failed status: $status" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
check_result $E_NOTEXIST "Let's Encrypt downloading signed cert failed status: $status"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Splitting up downloaded pem
|
||||||
|
# echo "[$(date)] : - Splitting up downloaded pem" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
crt_end=$(grep -n 'END CERTIFICATE' $ssl_dir/$domain.pem |head -n1 |cut -f1 -d:)
|
||||||
|
# echo "[$(date)] : crt_end=$crt_end" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
head -n $crt_end $ssl_dir/$domain.pem > $ssl_dir/$domain.crt
|
||||||
|
|
||||||
|
pem_lines=$(wc -l $ssl_dir/$domain.pem |cut -f 1 -d ' ')
|
||||||
|
# echo "[$(date)] : pem_lines=$pem_lines" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
ca_end=$(grep -n 'BEGIN CERTIFICATE' $ssl_dir/$domain.pem |tail -n1 |cut -f 1 -d :)
|
||||||
|
# echo "[$(date)] : ca_end=$ca_end" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
ca_end=$(( pem_lines - crt_end + 1 ))
|
||||||
|
# echo "[$(date)] : ca_end=$ca_end" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
tail -n $ca_end $ssl_dir/$domain.pem > $ssl_dir/$domain.ca
|
||||||
|
|
||||||
|
# Temporary fix for double "END CERTIFICATE"
|
||||||
|
if [[ $(head -n 1 $ssl_dir/$domain.ca) = "-----END CERTIFICATE-----" ]]; then
|
||||||
|
sed -i '1,2d' $ssl_dir/$domain.ca
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Adding SSL
|
# Adding SSL
|
||||||
ssl_home=$(search_objects 'web' 'LETSENCRYPT' 'yes' 'SSL_HOME')
|
ssl_home=$(search_objects 'web' 'LETSENCRYPT' 'yes' 'SSL_HOME')
|
||||||
$BIN/v-delete-web-domain-ssl $user $domain >/dev/null 2>&1
|
$BIN/v-delete-web-domain-ssl $user $domain >/dev/null 2>&1
|
||||||
|
echo "[$(date)] : v-add-web-domain-ssl $user $domain $ssl_dir $ssl_home" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
$BIN/v-add-web-domain-ssl $user $domain $ssl_dir $ssl_home
|
$BIN/v-add-web-domain-ssl $user $domain $ssl_dir $ssl_home
|
||||||
if [ "$?" -ne '0' ]; then
|
exitstatus=$?
|
||||||
|
echo "[$(date)] : v-add-web-domain-ssl status: $exitstatus" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
if [ "$exitstatus" -ne '0' ]; then
|
||||||
touch $VESTA/data/queue/letsencrypt.pipe
|
touch $VESTA/data/queue/letsencrypt.pipe
|
||||||
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
||||||
|
echo "[$(date)] : EXIT=$domain certificate installation failed" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
send_notice 'LETSENCRYPT' "$domain certificate installation failed"
|
send_notice 'LETSENCRYPT' "$domain certificate installation failed"
|
||||||
check_result $? "SSL install" >/dev/null
|
check_result $exitstatus "SSL install" >/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Adding LE autorenew cronjob
|
# Adding LE autorenew cronjob
|
||||||
|
@ -135,24 +379,20 @@ if [ -z "$LETSENCRYPT" ]; then
|
||||||
fi
|
fi
|
||||||
update_object_value 'web' 'DOMAIN' "$domain" '$LETSENCRYPT' 'yes'
|
update_object_value 'web' 'DOMAIN' "$domain" '$LETSENCRYPT' 'yes'
|
||||||
|
|
||||||
|
reset_web_counter "$user" "$domain" 'LETSENCRYPT_FAIL_COUNT'
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Vesta #
|
# Vesta #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Restarting web
|
|
||||||
$BIN/v-restart-web $restart
|
|
||||||
if [ "$?" -ne 0 ]; then
|
|
||||||
send_notice 'LETSENCRYPT' "web server needs to be restarted manually"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Notifying user
|
|
||||||
send_notice 'LETSENCRYPT' "$domain SSL has been installed successfully"
|
|
||||||
|
|
||||||
# Deleteing task from queue
|
# Deleteing task from queue
|
||||||
touch $VESTA/data/queue/letsencrypt.pipe
|
touch $VESTA/data/queue/letsencrypt.pipe
|
||||||
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
sed -i "/ $domain /d" $VESTA/data/queue/letsencrypt.pipe
|
||||||
|
|
||||||
|
# Notifying user
|
||||||
|
send_notice 'LETSENCRYPT' "$domain SSL has been installed successfully"
|
||||||
|
echo "[$(date)] : EXIT=***** $domain SSL has been installed successfully *****" >> /usr/local/vesta/log/letsencrypt.log
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
log_event "$OK" "$ARGUMENTS"
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# info: register letsencrypt user account
|
# info: register letsencrypt user account
|
||||||
# options: USER [EMAIL]
|
# options: USER
|
||||||
#
|
#
|
||||||
# The function creates and register LetsEncript account key
|
# The function creates and register LetsEncript account
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
@ -11,8 +11,9 @@
|
||||||
|
|
||||||
# Argument definition
|
# Argument definition
|
||||||
user=$1
|
user=$1
|
||||||
email=$2
|
|
||||||
key_size=4096
|
# LE API
|
||||||
|
API='https://acme-v02.api.letsencrypt.org'
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
|
@ -23,15 +24,38 @@ encode_base64() {
|
||||||
cat |base64 |tr '+/' '-_' |tr -d '\r\n='
|
cat |base64 |tr '+/' '-_' |tr -d '\r\n='
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Let's Encrypt v2 curl function
|
||||||
|
query_le_v2() {
|
||||||
|
protected='{"nonce": "'$3'",'
|
||||||
|
protected=''$protected' "url": "'$1'",'
|
||||||
|
protected=''$protected' "alg": "RS256", "jwk": '$jwk'}'
|
||||||
|
content="Content-Type: application/jose+json"
|
||||||
|
|
||||||
|
payload_=$(echo -n "$2" |encode_base64)
|
||||||
|
protected_=$(echo -n "$protected" |encode_base64)
|
||||||
|
signature_=$(printf "%s" "$protected_.$payload_" |\
|
||||||
|
openssl dgst -sha256 -binary -sign $USER_DATA/ssl/user.key |\
|
||||||
|
encode_base64)
|
||||||
|
|
||||||
|
post_data='{"protected":"'"$protected_"'",'
|
||||||
|
post_data=$post_data'"payload":"'"$payload_"'",'
|
||||||
|
post_data=$post_data'"signature":"'"$signature_"'"}'
|
||||||
|
|
||||||
|
curl -s -i -d "$post_data" "$1" -H "$content"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Verifications #
|
# Verifications #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '1' "$#" 'USER [EMAIL]'
|
check_args '1' "$#" 'USER'
|
||||||
is_format_valid 'user'
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
if [ -e "$USER_DATA/ssl/le.conf" ]; then
|
if [ -e "$USER_DATA/ssl/le.conf" ]; then
|
||||||
|
source "$USER_DATA/ssl/le.conf"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$KID" ]; then
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -40,57 +64,57 @@ fi
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
api='https://acme-v01.api.letsencrypt.org'
|
|
||||||
if [ -z "$email" ]; then
|
# Defining user email
|
||||||
email=$(get_user_value '$CONTACT')
|
if [[ -z "$EMAIL" ]]; then
|
||||||
|
EMAIL=$(get_user_value '$CONTACT')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
agreement=$(curl -s -I "$api/terms" |grep Location |cut -f 2 -d \ |tr -d '\r\n')
|
# Defining user agreement
|
||||||
|
agreement=''
|
||||||
|
|
||||||
# Generating key
|
# Generating user key
|
||||||
key="$USER_DATA/ssl/user.key"
|
KEY="$USER_DATA/ssl/user.key"
|
||||||
if [ ! -e "$key" ]; then
|
if [ ! -e "$KEY" ]; then
|
||||||
openssl genrsa -out $key $key_size >/dev/null 2>&1
|
openssl genrsa -out $KEY 4096 >/dev/null 2>&1
|
||||||
chmod 600 $key
|
chmod 600 $KEY
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Defining key exponent
|
# Defining key exponent
|
||||||
exponent=$(openssl pkey -inform pem -in "$key" -noout -text_pub |\
|
if [ -z "$EXPONENT" ]; then
|
||||||
grep Exponent: |cut -f 2 -d '(' |cut -f 1 -d ')' |sed -e 's/x//' |\
|
EXPONENT=$(openssl pkey -inform pem -in "$KEY" -noout -text_pub |\
|
||||||
xxd -r -p |encode_base64)
|
grep Exponent: |cut -f 2 -d '(' |cut -f 1 -d ')' |sed -e 's/x//' |\
|
||||||
|
xxd -r -p |encode_base64)
|
||||||
|
fi
|
||||||
|
|
||||||
# Defining key modulus
|
# Defining key modulus
|
||||||
modulus=$(openssl rsa -in "$key" -modulus -noout |\
|
if [ -z "$MODULUS" ]; then
|
||||||
sed -e 's/^Modulus=//' |xxd -r -p |encode_base64)
|
MODULUS=$(openssl rsa -in "$KEY" -modulus -noout |\
|
||||||
|
sed -e 's/^Modulus=//' |xxd -r -p |encode_base64)
|
||||||
|
fi
|
||||||
|
|
||||||
# Defining key thumb
|
# Defining JWK
|
||||||
thumb='{"e":"'$exponent'","kty":"RSA","n":"'"$modulus"'"}'
|
jwk='{"e":"'$EXPONENT'","kty":"RSA","n":"'"$MODULUS"'"}'
|
||||||
thumb="$(echo -n "$thumb" |openssl dgst -sha256 -binary |encode_base64)"
|
|
||||||
|
|
||||||
# Defining JWK header
|
# Defining key thumbnail
|
||||||
header='{"e":"'$exponent'","kty":"RSA","n":"'"$modulus"'"}'
|
if [ -z "$THUMB" ]; then
|
||||||
header='{"alg":"RS256","jwk":'"$header"'}'
|
THUMB="$(echo -n "$jwk" |openssl dgst -sha256 -binary |encode_base64)"
|
||||||
|
fi
|
||||||
|
|
||||||
# Requesting nonce
|
|
||||||
nonce=$(curl -s -I "$api/directory" |grep Nonce |cut -f 2 -d \ |tr -d '\r\n')
|
|
||||||
protected=$(echo -n '{"nonce":"'"$nonce"'"}' |encode_base64)
|
|
||||||
|
|
||||||
# Defining registration query
|
# Requesting ACME nonce
|
||||||
query='{"resource":"new-reg","contact":["mailto:'"$email"'"],'
|
nonce=$(curl -s -I "$API/directory" |grep -i nonce |cut -f2 -d\ |tr -d '\r\n')
|
||||||
query=$query'"agreement":"'$agreement'"}'
|
|
||||||
payload=$(echo -n "$query" |encode_base64)
|
|
||||||
signature=$(printf "%s" "$protected.$payload" |\
|
|
||||||
openssl dgst -sha256 -binary -sign "$key" |encode_base64)
|
|
||||||
data='{"header":'"$header"',"protected":"'"$protected"'",'
|
|
||||||
data=$data'"payload":"'"$payload"'","signature":"'"$signature"'"}'
|
|
||||||
|
|
||||||
# Sending request to LetsEncrypt API
|
# Creating ACME account
|
||||||
answer=$(curl -s -i -d "$data" "$api/acme/new-reg")
|
url="$API/acme/new-acct"
|
||||||
status=$(echo "$answer" |grep HTTP/1.1 |tail -n1 |cut -f2 -d ' ')
|
payload='{"termsOfServiceAgreed": true}'
|
||||||
|
answer=$(query_le_v2 "$url" "$payload" "$nonce")
|
||||||
|
kid=$(echo "$answer" |grep -i location: |cut -f2 -d ' '|tr -d '\r')
|
||||||
|
|
||||||
# Checking http answer status
|
# Checking answer status
|
||||||
if [[ "$status" -ne "201" ]] && [[ "$status" -ne "409" ]]; then
|
status=$(echo "$answer" |grep HTTP/ |tail -n1 |cut -f2 -d ' ')
|
||||||
check_result $E_CONNECT "LetsEncrypt account registration $status"
|
if [[ "${status:0:2}" -ne "20" ]]; then
|
||||||
|
check_result $E_CONNECT "Let's Encrypt acc registration failed $status"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,12 +123,17 @@ fi
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Adding le.conf
|
# Adding le.conf
|
||||||
echo "EMAIL='$email'" > $USER_DATA/ssl/le.conf
|
if [ ! -e "$USER_DATA/ssl/le.conf" ]; then
|
||||||
echo "EXPONENT='$exponent'" >> $USER_DATA/ssl/le.conf
|
echo "EXPONENT='$EXPONENT'" > $USER_DATA/ssl/le.conf
|
||||||
echo "MODULUS='$modulus'" >> $USER_DATA/ssl/le.conf
|
echo "MODULUS='$MODULUS'" >> $USER_DATA/ssl/le.conf
|
||||||
echo "THUMB='$thumb'" >> $USER_DATA/ssl/le.conf
|
echo "THUMB='$THUMB'" >> $USER_DATA/ssl/le.conf
|
||||||
chmod 660 $USER_DATA/ssl/le.conf
|
echo "EMAIL='$EMAIL'" >> $USER_DATA/ssl/le.conf
|
||||||
|
echo "KID='$kid'" >> $USER_DATA/ssl/le.conf
|
||||||
|
chmod 660 $USER_DATA/ssl/le.conf
|
||||||
|
else
|
||||||
|
sed -i '/^KID=/d' $USER_DATA/ssl/le.conf
|
||||||
|
echo "KID='$kid'" >> $USER_DATA/ssl/le.conf
|
||||||
|
fi
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
log_event "$OK" "$ARGUMENTS"
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
|
@ -45,6 +45,7 @@ is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_unsuspended 'user' 'USER' "$user"
|
is_object_unsuspended 'user' 'USER' "$user"
|
||||||
is_domain_new 'mail' "$domain"
|
is_domain_new 'mail' "$domain"
|
||||||
is_package_full 'MAIL_DOMAINS'
|
is_package_full 'MAIL_DOMAINS'
|
||||||
|
is_dir_symlink $HOMEDIR/$user/mail
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
|
@ -60,8 +60,8 @@ if [ -z "$sys_ip_check" ]; then
|
||||||
/sbin/ip addr add $ip/$cidr dev $interface \
|
/sbin/ip addr add $ip/$cidr dev $interface \
|
||||||
broadcast $broadcast label $iface
|
broadcast $broadcast label $iface
|
||||||
|
|
||||||
# Adding RHEL/CentOS/Fedora startup script
|
# Adding RHEL/CentOS/Fedora/Amazon startup script
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
sys_ip="# Added by vesta"
|
sys_ip="# Added by vesta"
|
||||||
sys_ip="$sys_ip\nDEVICE=$iface"
|
sys_ip="$sys_ip\nDEVICE=$iface"
|
||||||
sys_ip="$sys_ip\nBOOTPROTO=static"
|
sys_ip="$sys_ip\nBOOTPROTO=static"
|
||||||
|
|
106
bin/v-add-sys-mail-ssl
Executable file
106
bin/v-add-sys-mail-ssl
Executable file
|
@ -0,0 +1,106 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: copy mail ssl certificate
|
||||||
|
# options: USER DOMAIN [RESTART]
|
||||||
|
#
|
||||||
|
# The function copies user domain SSL to mail SSL directory
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Argument definition
|
||||||
|
user=$1
|
||||||
|
domain=$2
|
||||||
|
restart=$3
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/func/domain.sh
|
||||||
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
check_args '2' "$#" 'USER DOMAIN [RESTART]'
|
||||||
|
is_format_valid 'user' 'domain'
|
||||||
|
is_system_enabled "$MAIL_SYSTEM" 'MAIL_SYSTEM'
|
||||||
|
is_object_valid 'user' 'USER' "$user"
|
||||||
|
is_object_valid 'web' 'DOMAIN' "$domain"
|
||||||
|
is_object_value_exist 'web' 'DOMAIN' "$domain" '$SSL'
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Defining certificate location
|
||||||
|
dom_crt="/home/$user/conf/web/ssl.$domain.pem"
|
||||||
|
dom_key="/home/$user/conf/web/ssl.$domain.key"
|
||||||
|
vst_crt="$VESTA/ssl/mail.crt"
|
||||||
|
vst_key="$VESTA/ssl/mail.key"
|
||||||
|
|
||||||
|
# Checking certificate
|
||||||
|
if [ ! -e "$dom_crt" ] || [ ! -e "$dom_key" ]; then
|
||||||
|
check_result $E_NOTEXIST "$domain certificate doesn't exist"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Checking difference
|
||||||
|
diff $dom_crt $vst_crt >/dev/null 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
rm -f $vst_crt.old $vst_key.old
|
||||||
|
mv $vst_crt $vst_crt.old >/dev/null 2>&1
|
||||||
|
mv $vst_key $vst_key.old >/dev/null 2>&1
|
||||||
|
cp $dom_crt $vst_crt 2>/dev/null
|
||||||
|
cp $dom_key $vst_key 2>/dev/null
|
||||||
|
chown root:mail $vst_crt $vst_key
|
||||||
|
else
|
||||||
|
restart=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating mail certificate
|
||||||
|
case $MAIL_SYSTEM in
|
||||||
|
exim) conf='/etc/exim/exim.conf';;
|
||||||
|
exim4) conf='/etc/exim4/exim4.conf.template';;
|
||||||
|
esac
|
||||||
|
if [ -e "$conf" ]; then
|
||||||
|
sed -e "s|^tls_certificate.*|tls_certificate = $vst_crt|" \
|
||||||
|
-e "s|^tls_privatekey.*|tls_privatekey = $vst_key|" -i $conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating imap certificate
|
||||||
|
conf="/etc/dovecot/conf.d/10-ssl.conf"
|
||||||
|
if [ ! -z "$IMAP_SYSTEM" ] && [ -e "$conf" ]; then
|
||||||
|
sed -e "s|ssl_cert.*|ssl_cert = <$vst_crt|" \
|
||||||
|
-e "s|ssl_key.*|ssl_key = <$vst_key|" -i $conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Restarting services
|
||||||
|
if [ "$restart" != 'no' ]; then
|
||||||
|
if [ ! -z "$MAIL_SYSTEM" ]; then
|
||||||
|
$BIN/v-restart-service $MAIL_SYSTEM
|
||||||
|
fi
|
||||||
|
if [ ! -z "$IMAP_SYSTEM" ]; then
|
||||||
|
$BIN/v-restart-service $IMAP_SYSTEM
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating vesta.conf
|
||||||
|
if [ -z "$(grep MAIL_CERTIFICATE $VESTA/conf/vesta.conf)" ]; then
|
||||||
|
echo "MAIL_CERTIFICATE='$user:$domain'" >> $VESTA/conf/vesta.conf
|
||||||
|
else
|
||||||
|
sed -i "s/MAIL_CERTIFICATE.*/MAIL_CERTIFICATE='$user:$domain'/g" \
|
||||||
|
$VESTA/conf/vesta.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
||||||
|
exit
|
|
@ -21,7 +21,7 @@ source $VESTA/conf/vesta.conf
|
||||||
# Checking quota package
|
# Checking quota package
|
||||||
quota=$(which --skip-alias --skip-functions quota 2>/dev/null)
|
quota=$(which --skip-alias --skip-functions quota 2>/dev/null)
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
yum -y install quota >/dev/null 2>&1
|
yum -y install quota >/dev/null 2>&1
|
||||||
check_result $? "quota package installation failed" $E_UPDATE
|
check_result $? "quota package installation failed" $E_UPDATE
|
||||||
else
|
else
|
||||||
|
|
97
bin/v-add-sys-vesta-ssl
Executable file
97
bin/v-add-sys-vesta-ssl
Executable file
|
@ -0,0 +1,97 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: add vesta ssl certificate
|
||||||
|
# options: USER DOMAIN [RESTART]
|
||||||
|
#
|
||||||
|
# The function copies user domain SSL to vesta SSL directory
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Argument definition
|
||||||
|
user=$1
|
||||||
|
domain=$2
|
||||||
|
restart=$3
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/func/domain.sh
|
||||||
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
check_args '2' "$#" 'USER DOMAIN [RESTART]'
|
||||||
|
is_format_valid 'user' 'domain'
|
||||||
|
is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
|
||||||
|
is_object_valid 'user' 'USER' "$user"
|
||||||
|
is_object_valid 'web' 'DOMAIN' "$domain"
|
||||||
|
is_object_value_exist 'web' 'DOMAIN' "$domain" '$SSL'
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Defining certificate location
|
||||||
|
dom_crt="/home/$user/conf/web/ssl.$domain.pem"
|
||||||
|
dom_key="/home/$user/conf/web/ssl.$domain.key"
|
||||||
|
vst_crt="$VESTA/ssl/certificate.crt"
|
||||||
|
vst_key="$VESTA/ssl/certificate.key"
|
||||||
|
|
||||||
|
# Checking certificate
|
||||||
|
if [ ! -e "$dom_crt" ] || [ ! -e "$dom_key" ]; then
|
||||||
|
check_result $E_NOTEXIST "$domain certificate doesn't exist"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Checking difference
|
||||||
|
diff $dom_crt $vst_crt >/dev/null 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
rm -f $vst_crt.old $vst_key.old
|
||||||
|
mv $vst_crt $vst_crt.old
|
||||||
|
mv $vst_key $vst_key.old
|
||||||
|
cp $dom_crt $vst_crt 2>/dev/null
|
||||||
|
cp $dom_key $vst_key 2>/dev/null
|
||||||
|
chown root:mail $vst_crt $vst_key
|
||||||
|
else
|
||||||
|
restart=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Restarting services
|
||||||
|
if [ "$restart" != 'no' ]; then
|
||||||
|
if [ ! -z "$MAIL_SYSTEM" ] && [ -z "$MAIL_CERTIFICATE" ]; then
|
||||||
|
$BIN/v-restart-service $MAIL_SYSTEM
|
||||||
|
fi
|
||||||
|
if [ ! -z "$IMAP_SYSTEM" ] && [ -z "$MAIL_CERTIFICATE" ]; then
|
||||||
|
$BIN/v-restart-service $IMAP_SYSTEM
|
||||||
|
fi
|
||||||
|
if [ ! -z "$FTP_SYSTEM" ]; then
|
||||||
|
$BIN/v-restart-service "$FTP_SYSTEM"
|
||||||
|
fi
|
||||||
|
if [ -e "/var/run/vesta-nginx.pid" ]; then
|
||||||
|
kill -HUP $(cat /var/run/vesta-nginx.pid)
|
||||||
|
else
|
||||||
|
service vesta restart
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating vesta.conf
|
||||||
|
if [ -z "$(grep VESTA_CERTIFICATE $VESTA/conf/vesta.conf)" ]; then
|
||||||
|
echo "VESTA_CERTIFICATE='$user:$domain'" >> $VESTA/conf/vesta.conf
|
||||||
|
else
|
||||||
|
sed -i "s/VESTA_CERTIFICATE.*/VESTA_CERTIFICATE='$user:$domain'/g" \
|
||||||
|
$VESTA/conf/vesta.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
||||||
|
exit
|
|
@ -30,37 +30,37 @@ is_package_new() {
|
||||||
is_package_consistent() {
|
is_package_consistent() {
|
||||||
source $pkg_dir/$package.pkg
|
source $pkg_dir/$package.pkg
|
||||||
if [ "$WEB_DOMAINS" != 'unlimited' ]; then
|
if [ "$WEB_DOMAINS" != 'unlimited' ]; then
|
||||||
is_format_valid_int $WEB_DOMAINS 'WEB_DOMAINS'
|
is_int_format_valid $WEB_DOMAINS 'WEB_DOMAINS'
|
||||||
fi
|
fi
|
||||||
if [ "$WEB_ALIASES" != 'unlimited' ]; then
|
if [ "$WEB_ALIASES" != 'unlimited' ]; then
|
||||||
is_format_valid_int $WEB_ALIASES 'WEB_ALIASES'
|
is_int_format_valid $WEB_ALIASES 'WEB_ALIASES'
|
||||||
fi
|
fi
|
||||||
if [ "$DNS_DOMAINS" != 'unlimited' ]; then
|
if [ "$DNS_DOMAINS" != 'unlimited' ]; then
|
||||||
is_format_valid_int $DNS_DOMAINS 'DNS_DOMAINS'
|
is_int_format_valid $DNS_DOMAINS 'DNS_DOMAINS'
|
||||||
fi
|
fi
|
||||||
if [ "$DNS_RECORDS" != 'unlimited' ]; then
|
if [ "$DNS_RECORDS" != 'unlimited' ]; then
|
||||||
is_format_valid_int $DNS_RECORDS 'DNS_RECORDS'
|
is_int_format_valid $DNS_RECORDS 'DNS_RECORDS'
|
||||||
fi
|
fi
|
||||||
if [ "$MAIL_DOMAINS" != 'unlimited' ]; then
|
if [ "$MAIL_DOMAINS" != 'unlimited' ]; then
|
||||||
is_format_valid_int $MAIL_DOMAINS 'MAIL_DOMAINS'
|
is_int_format_valid $MAIL_DOMAINS 'MAIL_DOMAINS'
|
||||||
fi
|
fi
|
||||||
if [ "$MAIL_ACCOUNTS" != 'unlimited' ]; then
|
if [ "$MAIL_ACCOUNTS" != 'unlimited' ]; then
|
||||||
is_format_valid_int $MAIL_ACCOUNTS 'MAIL_ACCOUNTS'
|
is_int_format_valid $MAIL_ACCOUNTS 'MAIL_ACCOUNTS'
|
||||||
fi
|
fi
|
||||||
if [ "$DATABASES" != 'unlimited' ]; then
|
if [ "$DATABASES" != 'unlimited' ]; then
|
||||||
is_format_valid_int $DATABASES 'DATABASES'
|
is_int_format_valid $DATABASES 'DATABASES'
|
||||||
fi
|
fi
|
||||||
if [ "$CRON_JOBS" != 'unlimited' ]; then
|
if [ "$CRON_JOBS" != 'unlimited' ]; then
|
||||||
is_format_valid_int $CRON_JOBS 'CRON_JOBS'
|
is_int_format_valid $CRON_JOBS 'CRON_JOBS'
|
||||||
fi
|
fi
|
||||||
if [ "$DISK_QUOTA" != 'unlimited' ]; then
|
if [ "$DISK_QUOTA" != 'unlimited' ]; then
|
||||||
is_format_valid_int $DISK_QUOTA 'DISK_QUOTA'
|
is_int_format_valid $DISK_QUOTA 'DISK_QUOTA'
|
||||||
fi
|
fi
|
||||||
if [ "$BANDWIDTH" != 'unlimited' ]; then
|
if [ "$BANDWIDTH" != 'unlimited' ]; then
|
||||||
is_format_valid_int $BANDWIDTH 'BANDWIDTH'
|
is_int_format_valid $BANDWIDTH 'BANDWIDTH'
|
||||||
fi
|
fi
|
||||||
if [ "$BACKUPS" != 'unlimited' ]; then
|
if [ "$BACKUPS" != 'unlimited' ]; then
|
||||||
is_format_valid_int $BACKUPS 'BACKUPS'
|
is_int_format_valid $BACKUPS 'BACKUPS'
|
||||||
fi
|
fi
|
||||||
is_format_valid_shell $SHELL
|
is_format_valid_shell $SHELL
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ fi
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Cleaning yum cache
|
# Cleaning yum cache
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
yum -q clean all
|
yum -q clean all
|
||||||
yum="yum -q -y --noplugins --disablerepo=* --enablerepo=vesta"
|
yum="yum -q -y --noplugins --disablerepo=* --enablerepo=vesta"
|
||||||
else
|
else
|
||||||
|
@ -57,7 +57,7 @@ fi
|
||||||
|
|
||||||
# Updating php pacakge
|
# Updating php pacakge
|
||||||
if [ -z "$($VESTA/php/bin/php -v|grep 'PHP 5.6')" ]; then
|
if [ -z "$($VESTA/php/bin/php -v|grep 'PHP 5.6')" ]; then
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
$yum -y update vesta-php
|
$yum -y update vesta-php
|
||||||
check_result $? "vesta-php package upgrade failed" $E_UPDATE
|
check_result $? "vesta-php package upgrade failed" $E_UPDATE
|
||||||
else
|
else
|
||||||
|
@ -67,7 +67,7 @@ if [ -z "$($VESTA/php/bin/php -v|grep 'PHP 5.6')" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Adding vesta-ioncube package
|
# Adding vesta-ioncube package
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
rpm -q vesta-ioncube >/dev/null 2>&1
|
rpm -q vesta-ioncube >/dev/null 2>&1
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
$yum -y install vesta-ioncube >/dev/null 2>&1
|
$yum -y install vesta-ioncube >/dev/null 2>&1
|
||||||
|
@ -82,7 +82,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Adding vesta-softaculous package
|
# Adding vesta-softaculous package
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
rpm -q vesta-softaculous >/dev/null 2>&1
|
rpm -q vesta-softaculous >/dev/null 2>&1
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
$yum -y install vesta-softaculous >/dev/null 2>&1
|
$yum -y install vesta-softaculous >/dev/null 2>&1
|
||||||
|
@ -98,6 +98,8 @@ fi
|
||||||
|
|
||||||
# Installing softaculous
|
# Installing softaculous
|
||||||
if [ ! -e "$VESTA/softaculous/vst_installed" ]; then
|
if [ ! -e "$VESTA/softaculous/vst_installed" ]; then
|
||||||
|
mkdir -p /var/softaculous
|
||||||
|
chown -R admin:admin /var/softaculous
|
||||||
cd $VESTA/softaculous
|
cd $VESTA/softaculous
|
||||||
wget -q http://c.vestacp.com/3rdparty/softaculous_install.inc
|
wget -q http://c.vestacp.com/3rdparty/softaculous_install.inc
|
||||||
$VESTA/php/bin/php softaculous_install.inc
|
$VESTA/php/bin/php softaculous_install.inc
|
||||||
|
@ -105,9 +107,11 @@ if [ ! -e "$VESTA/softaculous/vst_installed" ]; then
|
||||||
touch $VESTA/softaculous/vst_installed
|
touch $VESTA/softaculous/vst_installed
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Adding symlink
|
# Enabling symlink
|
||||||
if [ ! -e "$VESTA/web/softaculous" ]; then
|
if [ -e "$VESTA/disabled_plugins/softaculous" ]; then
|
||||||
ln -s $VESTA/softaculous/vesta $VESTA/web/softaculous
|
if [ ! -e "$VESTA/web/softaculous" ]; then
|
||||||
|
mv $VESTA/disabled_plugins/softaculous $VESTA/web/softaculous
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Updating SOFTACULOUS value
|
# Updating SOFTACULOUS value
|
||||||
|
|
|
@ -47,6 +47,9 @@ is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_unsuspended 'user' 'USER' "$user"
|
is_object_unsuspended 'user' 'USER' "$user"
|
||||||
is_package_full 'WEB_DOMAINS' 'WEB_ALIASES'
|
is_package_full 'WEB_DOMAINS' 'WEB_ALIASES'
|
||||||
is_domain_new 'web' "$domain,$aliases"
|
is_domain_new 'web' "$domain,$aliases"
|
||||||
|
is_dir_symlink $HOMEDIR/$user/web
|
||||||
|
if_dir_exists $HOMEDIR/$user/web/$domain
|
||||||
|
is_dir_symlink $HOMEDIR/$user/web/$domain
|
||||||
if [ ! -z "$ip" ]; then
|
if [ ! -z "$ip" ]; then
|
||||||
is_ip_valid "$ip" "$user"
|
is_ip_valid "$ip" "$user"
|
||||||
else
|
else
|
||||||
|
@ -62,7 +65,7 @@ fi
|
||||||
source $USER_DATA/user.conf
|
source $USER_DATA/user.conf
|
||||||
|
|
||||||
# Creating domain directories
|
# Creating domain directories
|
||||||
mkdir -p $HOMEDIR/$user/web/$domain \
|
sudo -u $user mkdir -p $HOMEDIR/$user/web/$domain \
|
||||||
$HOMEDIR/$user/web/$domain/public_html \
|
$HOMEDIR/$user/web/$domain/public_html \
|
||||||
$HOMEDIR/$user/web/$domain/public_shtml \
|
$HOMEDIR/$user/web/$domain/public_shtml \
|
||||||
$HOMEDIR/$user/web/$domain/document_errors \
|
$HOMEDIR/$user/web/$domain/document_errors \
|
||||||
|
@ -79,7 +82,7 @@ ln -f -s /var/log/$WEB_SYSTEM/domains/$domain.*log \
|
||||||
$HOMEDIR/$user/web/$domain/logs/
|
$HOMEDIR/$user/web/$domain/logs/
|
||||||
|
|
||||||
# Adding domain skeleton
|
# Adding domain skeleton
|
||||||
cp -r $WEBTPL/skel/* $HOMEDIR/$user/web/$domain/ >/dev/null 2>&1
|
sudo -u $user cp -r $WEBTPL/skel/* $HOMEDIR/$user/web/$domain/ >/dev/null 2>&1
|
||||||
for file in $(find "$HOMEDIR/$user/web/$domain/" -type f); do
|
for file in $(find "$HOMEDIR/$user/web/$domain/" -type f); do
|
||||||
sed -i "s/%domain%/$domain/g" $file
|
sed -i "s/%domain%/$domain/g" $file
|
||||||
done
|
done
|
||||||
|
@ -88,9 +91,9 @@ done
|
||||||
chown -R $user:$user $HOMEDIR/$user/web/$domain
|
chown -R $user:$user $HOMEDIR/$user/web/$domain
|
||||||
chown root:$user /var/log/$WEB_SYSTEM/domains/$domain.* $conf
|
chown root:$user /var/log/$WEB_SYSTEM/domains/$domain.* $conf
|
||||||
chmod 640 /var/log/$WEB_SYSTEM/domains/$domain.*
|
chmod 640 /var/log/$WEB_SYSTEM/domains/$domain.*
|
||||||
chmod 751 $HOMEDIR/$user/web/$domain $HOMEDIR/$user/web/$domain/*
|
sudo -u $user chmod 751 $HOMEDIR/$user/web/$domain $HOMEDIR/$user/web/$domain/*
|
||||||
chmod 551 $HOMEDIR/$user/web/$domain/stats $HOMEDIR/$user/web/$domain/logs
|
sudo -u $user chmod 551 $HOMEDIR/$user/web/$domain/stats $HOMEDIR/$user/web/$domain/logs
|
||||||
chmod 644 $HOMEDIR/$user/web/$domain/public_*html/*
|
sudo -u $user chmod 644 $HOMEDIR/$user/web/$domain/public_*html/*.*
|
||||||
|
|
||||||
# Addding PHP-FPM backend
|
# Addding PHP-FPM backend
|
||||||
if [ ! -z "$WEB_BACKEND" ]; then
|
if [ ! -z "$WEB_BACKEND" ]; then
|
||||||
|
@ -112,9 +115,12 @@ if [ "$aliases" = 'none' ]; then
|
||||||
ALIAS=''
|
ALIAS=''
|
||||||
else
|
else
|
||||||
ALIAS="www.$domain"
|
ALIAS="www.$domain"
|
||||||
if [ ! -z "$aliases" ]; then
|
if [ -z "$aliases" ]; then
|
||||||
ALIAS="$ALIAS,$aliases"
|
ALIAS="www.$domain"
|
||||||
|
else
|
||||||
|
ALIAS="$aliases"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ip_alias=$(get_ip_alias $domain)
|
ip_alias=$(get_ip_alias $domain)
|
||||||
if [ ! -z "$ip_alias" ]; then
|
if [ ! -z "$ip_alias" ]; then
|
||||||
ALIAS="$ALIAS,$ip_alias"
|
ALIAS="$ALIAS,$ip_alias"
|
||||||
|
|
|
@ -46,7 +46,7 @@ fi
|
||||||
|
|
||||||
# Allocating backend port
|
# Allocating backend port
|
||||||
backend_port=9000
|
backend_port=9000
|
||||||
ports=$(grep -v '^;' $pool/* 2>/dev/null |grep listen |grep -o :[0-9].*)
|
ports=$(grep listen $pool/* 2>/dev/null |grep -o :[0-9].*)
|
||||||
ports=$(echo "$ports" |sed "s/://" |sort -n)
|
ports=$(echo "$ports" |sed "s/://" |sort -n)
|
||||||
for port in $ports; do
|
for port in $ports; do
|
||||||
if [ "$backend_port" -eq "$port" ]; then
|
if [ "$backend_port" -eq "$port" ]; then
|
||||||
|
|
|
@ -84,7 +84,7 @@ fi
|
||||||
/usr/sbin/useradd $ftp_user \
|
/usr/sbin/useradd $ftp_user \
|
||||||
-s $shell \
|
-s $shell \
|
||||||
-o -u $(id -u $user) \
|
-o -u $(id -u $user) \
|
||||||
-g $(id -u $user) \
|
-g $(id -g $user) \
|
||||||
-M -d "$ftp_path_a" > /dev/null 2>&1
|
-M -d "$ftp_path_a" > /dev/null 2>&1
|
||||||
|
|
||||||
# Set ftp user password
|
# Set ftp user password
|
||||||
|
|
|
@ -120,6 +120,35 @@ check_result $? "Web restart failed" >/dev/null
|
||||||
$BIN/v-restart-proxy $restart
|
$BIN/v-restart-proxy $restart
|
||||||
check_result $? "Proxy restart failed" >/dev/null
|
check_result $? "Proxy restart failed" >/dev/null
|
||||||
|
|
||||||
|
# Updating system ssl dependencies
|
||||||
|
if [ ! -z "$VESTA_CERTIFICATE" ]; then
|
||||||
|
crt_user=$(echo "$VESTA_CERTIFICATE" |cut -f 1 -d :)
|
||||||
|
crt_domain=$(echo "$VESTA_CERTIFICATE" |cut -f 2 -d :)
|
||||||
|
if [ "$user" = "$crt_user" ] && [ "$domain" = "$crt_domain" ]; then
|
||||||
|
$BIN/v-add-sys-vesta-ssl $user $domain >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ ! -z "$MAIL_CERTIFICATE" ]; then
|
||||||
|
crt_user=$(echo "$MAIL_CERTIFICATE" |cut -f 1 -d :)
|
||||||
|
crt_domain=$(echo "$MAIL_CERTIFICATE" |cut -f 2 -d :)
|
||||||
|
if [ "$user" = "$crt_user" ] && [ "$domain" = "$crt_domain" ]; then
|
||||||
|
$BIN/v-add-sys-mail-ssl $user $domain >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -z "$UPDATE_HOSTNAME_SSL" ] && [ "$UPDATE_HOSTNAME_SSL" = "yes" ]; then
|
||||||
|
hostname=$(hostname)
|
||||||
|
if [ "$hostname" = "$domain" ]; then
|
||||||
|
$BIN/v-update-host-certificate $user $domain
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
UPDATE_SSL_SCRIPT=''
|
||||||
|
source $VESTA/conf/vesta.conf
|
||||||
|
if [ ! -z "$UPDATE_SSL_SCRIPT" ]; then
|
||||||
|
eval "$UPDATE_SSL_SCRIPT $user $domain"
|
||||||
|
fi
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
log_history "enabled ssl support for $domain"
|
log_history "enabled ssl support for $domain"
|
||||||
log_event "$OK" "$ARGUMENTS"
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
|
@ -68,8 +68,12 @@ while [ "$la" -ge "$BACKUP_LA_LIMIT" ]; do
|
||||||
(( ++i))
|
(( ++i))
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ -z "$BACKUP_TEMP" ]; then
|
||||||
|
BACKUP_TEMP=$BACKUP
|
||||||
|
fi
|
||||||
|
|
||||||
# Creating temporary directory
|
# Creating temporary directory
|
||||||
tmpdir=$(mktemp -p /tmp -d)
|
tmpdir=$(mktemp -p $BACKUP_TEMP -d)
|
||||||
|
|
||||||
if [ "$?" -ne 0 ]; then
|
if [ "$?" -ne 0 ]; then
|
||||||
echo "Can't create tmp dir $tmpdir" |$SENDMAIL -s "$subj" $email $notify
|
echo "Can't create tmp dir $tmpdir" |$SENDMAIL -s "$subj" $email $notify
|
||||||
|
@ -212,24 +216,32 @@ if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB" != '*' ]; then
|
||||||
cp $USER_DATA/ssl/$domain.* vesta/
|
cp $USER_DATA/ssl/$domain.* vesta/
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Changin dir to documentroot
|
||||||
|
cd $HOMEDIR/$user/web/$domain
|
||||||
|
|
||||||
# Define exclude arguments
|
# Define exclude arguments
|
||||||
exlusion=$(echo -e "$WEB" |tr ',' '\n' |grep "^$domain:")
|
exlusion=$(echo -e "$WEB" |tr ',' '\n' |grep "^$domain:")
|
||||||
set -f
|
set -f
|
||||||
fargs=()
|
fargs=()
|
||||||
fargs+=(--exclude='logs/*')
|
fargs+=(--exclude='./logs/*')
|
||||||
if [ ! -z "$exlusion" ]; then
|
if [ ! -z "$exlusion" ]; then
|
||||||
xdirs="$(echo -e "$exlusion" |tr ':' '\n' |grep -v $domain)"
|
xdirs="$(echo -e "$exlusion" |tr ':' '\n' |grep -v $domain)"
|
||||||
for xpath in $xdirs; do
|
for xpath in $xdirs; do
|
||||||
fargs+=(--exclude=$xpath/*)
|
if [ -d "$xpath" ]; then
|
||||||
echo "$(date "+%F %T") excluding directory $xpath"
|
fargs+=(--exclude=$xpath/*)
|
||||||
msg="$msg\n$(date "+%F %T") excluding directory $xpath"
|
echo "$(date "+%F %T") excluding directory $xpath"
|
||||||
|
msg="$msg\n$(date "+%F %T") excluding directory $xpath"
|
||||||
|
else
|
||||||
|
echo "$(date "+%F %T") excluding file $xpath"
|
||||||
|
msg="$msg\n$(date "+%F %T") excluding file $xpath"
|
||||||
|
fargs+=(--exclude=$xpath)
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
set +f
|
set +f
|
||||||
|
|
||||||
# Backup files
|
# Backup files
|
||||||
cd $HOMEDIR/$user/web/$domain
|
tar --anchored -cpf- ${fargs[@]} * |gzip -$BACKUP_GZIP - > $tmpdir/web/$domain/domain_data.tar.gz
|
||||||
tar -cpf- * ${fargs[@]} |gzip -$BACKUP_GZIP - > $tmpdir/web/$domain/domain_data.tar.gz
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Print total
|
# Print total
|
||||||
|
@ -388,14 +400,17 @@ if [ ! -z "$DB_SYSTEM" ] && [ "$DB" != '*' ]; then
|
||||||
grep "DB='$database'" $conf > vesta/db.conf
|
grep "DB='$database'" $conf > vesta/db.conf
|
||||||
|
|
||||||
dump="$tmpdir/db/$database/$database.$TYPE.sql"
|
dump="$tmpdir/db/$database/$database.$TYPE.sql"
|
||||||
|
dumpgz="$tmpdir/db/$database/$database.$TYPE.sql.gz"
|
||||||
grants="$tmpdir/db/$database/conf/$database.$TYPE.$DBUSER"
|
grants="$tmpdir/db/$database/conf/$database.$TYPE.$DBUSER"
|
||||||
case $TYPE in
|
if [ ! -f "$dumpgz" ]; then
|
||||||
mysql) dump_mysql_database ;;
|
case $TYPE in
|
||||||
pgsql) dump_pgsql_database ;;
|
mysql) dump_mysql_database ;;
|
||||||
esac
|
pgsql) dump_pgsql_database ;;
|
||||||
|
esac
|
||||||
|
|
||||||
# Compress dump
|
# Compress dump
|
||||||
gzip -$BACKUP_GZIP $dump
|
gzip -$BACKUP_GZIP $dump
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Print total
|
# Print total
|
||||||
|
@ -445,11 +460,15 @@ if [ "$USER" != '*' ]; then
|
||||||
fi
|
fi
|
||||||
fargs=()
|
fargs=()
|
||||||
for xpath in $(echo "$USER" |tr ',' '\n'); do
|
for xpath in $(echo "$USER" |tr ',' '\n'); do
|
||||||
fargs+=(-not)
|
if [ -d "$xpath" ]; then
|
||||||
fargs+=(-path)
|
fargs+=(--exclude=$xpath/*)
|
||||||
fargs+=("./$xpath*")
|
echo "$(date "+%F %T") excluding directory $xpath" |\
|
||||||
echo "$(date "+%F %T") excluding directory $xpath" |\
|
|
||||||
tee -a $BACKUP/$user.log
|
tee -a $BACKUP/$user.log
|
||||||
|
else
|
||||||
|
echo "$(date "+%F %T") excluding file $xpath" |\
|
||||||
|
tee -a $BACKUP/$user.log
|
||||||
|
fargs+=(--exclude=$xpath)
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
|
@ -460,11 +479,12 @@ if [ "$USER" != '*' ]; then
|
||||||
exclusion=$(echo "$USER" |tr ',' '\n' |grep "^$udir$")
|
exclusion=$(echo "$USER" |tr ',' '\n' |grep "^$udir$")
|
||||||
if [ -z "$exclusion" ]; then
|
if [ -z "$exclusion" ]; then
|
||||||
((i ++))
|
((i ++))
|
||||||
udir_list="$udir_list $udir"
|
udir_str=$(echo "$udir" |sed -e "s|'|\\\'|g")
|
||||||
|
udir_list="$udir_list $udir_str"
|
||||||
echo -e "$(date "+%F %T") adding $udir" |tee -a $BACKUP/$user.log
|
echo -e "$(date "+%F %T") adding $udir" |tee -a $BACKUP/$user.log
|
||||||
|
|
||||||
# Backup files and dirs
|
# Backup files and dirs
|
||||||
tar -cpf- $udir |gzip -$BACKUP_GZIP - > $tmpdir/user_dir/$udir.tar.gz
|
tar --anchored -cpf- ${fargs[@]} $udir |gzip -$BACKUP_GZIP - > $tmpdir/user_dir/$udir.tar.gz
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
set +f
|
set +f
|
||||||
|
@ -499,7 +519,7 @@ local_backup(){
|
||||||
backup_list=$(ls -lrt $BACKUP/ |awk '{print $9}' |grep "^$user\." | grep ".tar")
|
backup_list=$(ls -lrt $BACKUP/ |awk '{print $9}' |grep "^$user\." | grep ".tar")
|
||||||
backups_count=$(echo "$backup_list" |wc -l)
|
backups_count=$(echo "$backup_list" |wc -l)
|
||||||
if [ "$BACKUPS" -le "$backups_count" ]; then
|
if [ "$BACKUPS" -le "$backups_count" ]; then
|
||||||
backups_rm_number=$((backups_count - BACKUPS))
|
backups_rm_number=$((backups_count - BACKUPS + 1))
|
||||||
|
|
||||||
# Removing old backup
|
# Removing old backup
|
||||||
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
||||||
|
@ -575,7 +595,7 @@ ftp_backup() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Debug info
|
# Debug info
|
||||||
echo -e "$(date "+%F %T") Remote: ftp://$HOST$BPATH/$user.$backup_new_date.tar"
|
echo -e "$(date "+%F %T") Remote: ftp://$HOST/$BPATH/$user.$backup_new_date.tar"
|
||||||
|
|
||||||
# Checking ftp connection
|
# Checking ftp connection
|
||||||
fconn=$(ftpc)
|
fconn=$(ftpc)
|
||||||
|
@ -615,7 +635,7 @@ ftp_backup() {
|
||||||
fi
|
fi
|
||||||
backups_count=$(echo "$backup_list" |wc -l)
|
backups_count=$(echo "$backup_list" |wc -l)
|
||||||
if [ "$backups_count" -ge "$BACKUPS" ]; then
|
if [ "$backups_count" -ge "$BACKUPS" ]; then
|
||||||
backups_rm_number=$((backups_count - BACKUPS))
|
backups_rm_number=$((backups_count - BACKUPS + 1))
|
||||||
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
||||||
backup_date=$(echo $backup |sed -e "s/$user.//" -e "s/.tar$//")
|
backup_date=$(echo $backup |sed -e "s/$user.//" -e "s/.tar$//")
|
||||||
echo -e "$(date "+%F %T") Rotated ftp backup: $backup_date" |\
|
echo -e "$(date "+%F %T") Rotated ftp backup: $backup_date" |\
|
||||||
|
@ -770,7 +790,7 @@ sftp_backup() {
|
||||||
fi
|
fi
|
||||||
backups_count=$(echo "$backup_list" |wc -l)
|
backups_count=$(echo "$backup_list" |wc -l)
|
||||||
if [ "$backups_count" -ge "$BACKUPS" ]; then
|
if [ "$backups_count" -ge "$BACKUPS" ]; then
|
||||||
backups_rm_number=$((backups_count - BACKUPS))
|
backups_rm_number=$((backups_count - BACKUPS + 1))
|
||||||
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
||||||
backup_date=$(echo $backup |sed -e "s/$user.//" -e "s/.tar.*$//")
|
backup_date=$(echo $backup |sed -e "s/$user.//" -e "s/.tar.*$//")
|
||||||
echo -e "$(date "+%F %T") Rotated sftp backup: $backup_date" |\
|
echo -e "$(date "+%F %T") Rotated sftp backup: $backup_date" |\
|
||||||
|
|
|
@ -28,6 +28,9 @@ if [ -z "$BACKUP_SYSTEM" ]; then
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
for user in $(grep '@' /etc/passwd |cut -f1 -d:); do
|
for user in $(grep '@' /etc/passwd |cut -f1 -d:); do
|
||||||
|
if [ ! -f "$VESTA/data/users/$user/user.conf" ]; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
check_suspend=$(grep "SUSPENDED='no'" $VESTA/data/users/$user/user.conf)
|
check_suspend=$(grep "SUSPENDED='no'" $VESTA/data/users/$user/user.conf)
|
||||||
log=$VESTA/log/backup.log
|
log=$VESTA/log/backup.log
|
||||||
if [ ! -z "$check_suspend" ]; then
|
if [ ! -z "$check_suspend" ]; then
|
||||||
|
|
|
@ -52,8 +52,11 @@ salt=$(generate_password "$PW_MATRIX" "8")
|
||||||
md5="{MD5}$($BIN/v-generate-password-hash md5 $salt <<<$password)"
|
md5="{MD5}$($BIN/v-generate-password-hash md5 $salt <<<$password)"
|
||||||
|
|
||||||
if [[ "$MAIL_SYSTEM" =~ exim ]]; then
|
if [[ "$MAIL_SYSTEM" =~ exim ]]; then
|
||||||
|
quota=$(grep $account $VESTA/data/users/${user}/mail/${domain}.conf)
|
||||||
|
quota=$(echo $quota | awk '{ print $7 }' | sed -e "s/'//g" )
|
||||||
|
quota=$(echo $quota | cut -d "=" -f 2 | sed -e "s/unlimited/0/g")
|
||||||
sed -i "/^$account:/d" $HOMEDIR/$user/conf/mail/$domain/passwd
|
sed -i "/^$account:/d" $HOMEDIR/$user/conf/mail/$domain/passwd
|
||||||
str="$account:$md5:$user:mail::$HOMEDIR/$user:$quota"
|
str="$account:$md5:$user:mail::$HOMEDIR/$user:${quota}M"
|
||||||
echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
|
echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ PATH="$PATH:/usr/local/sbin:/sbin:/usr/sbin:/root/bin"
|
||||||
check_args '2' "$#" 'KEY VALUE'
|
check_args '2' "$#" 'KEY VALUE'
|
||||||
is_format_valid 'key'
|
is_format_valid 'key'
|
||||||
|
|
||||||
|
format_no_quotes "$value" 'value'
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Action #
|
# Action #
|
||||||
|
|
|
@ -31,18 +31,16 @@ is_format_valid 'domain'
|
||||||
|
|
||||||
hostname $domain
|
hostname $domain
|
||||||
|
|
||||||
# RHEL/CentOS
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
# RHEL/CentOS/Amazon
|
||||||
touch /etc/sysconfig/network
|
touch /etc/sysconfig/network
|
||||||
if [ -z "$(grep HOSTNAME /etc/sysconfig/network)" ]; then
|
if [ -z "$(grep HOSTNAME /etc/sysconfig/network)" ]; then
|
||||||
echo "HOSTNAME='$domain'" >> /etc/sysconfig/network
|
echo "HOSTNAME='$domain'" >> /etc/sysconfig/network
|
||||||
else
|
else
|
||||||
sed -i "s/HOSTNAME=.*/HOSTNAME='$domain'/" /etc/sysconfig/network
|
sed -i "s/HOSTNAME=.*/HOSTNAME='$domain'/" /etc/sysconfig/network
|
||||||
fi
|
fi
|
||||||
fi
|
else
|
||||||
|
# Debian/Ubuntu
|
||||||
# Debian/Ubuntu
|
|
||||||
if [ ! -e "/etc/redhat-release" ]; then
|
|
||||||
echo "$domain" > /etc/hostname
|
echo "$domain" > /etc/hostname
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -34,48 +34,72 @@ is_ip_valid "$ip"
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Changing nat ip
|
# Updating IP
|
||||||
if [ -z "$(grep NAT= $VESTA/data/ips/$ip)" ]; then
|
if [ -z "$(grep NAT= $VESTA/data/ips/$ip)" ]; then
|
||||||
sed -i "s/^TIME/NAT='$nat_ip'\nTIME/g" $VESTA/data/ips/$ip
|
sed -i "s/^TIME/NAT='$nat_ip'\nTIME/g" $VESTA/data/ips/$ip
|
||||||
|
old=''
|
||||||
|
new=$nat_ip
|
||||||
else
|
else
|
||||||
update_ip_value '$NAT' "$nat_ip"
|
old=$(get_ip_value '$NAT')
|
||||||
fi
|
new=$nat_ip
|
||||||
|
sed -i "s/NAT=.*/NAT='$new'/" $VESTA/data/ips/$ip
|
||||||
# Check ftp system
|
if [ -z "$nat_ip" ]; then
|
||||||
if [ "$FTP_SYSTEM" = 'vsftpd' ]; then
|
new=$ip
|
||||||
|
|
||||||
# Find configuration
|
|
||||||
if [ -e '/etc/vsftpd/vsftpd.conf' ]; then
|
|
||||||
conf='/etc/vsftpd/vsftpd.conf'
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -e '/etc/vsftpd.conf' ]; then
|
|
||||||
conf='/etc/vsftpd.conf'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update config
|
|
||||||
if [ -z "$(grep pasv_address $conf)" ]; then
|
|
||||||
if [ ! -z "$nat_ip" ]; then
|
|
||||||
echo "pasv_address=$nat_ip" >> $conf
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ ! -z "$nat_ip" ]; then
|
|
||||||
sed -i "s/pasv_address=.*/pasv_address='$nat_ip'/g" $conf
|
|
||||||
else
|
|
||||||
sed -i "/pasv_address/d" $conf
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Updating WEB configs
|
||||||
|
if [ ! -z "$old" ] && [ ! -z "$WEB_SYSTEM" ]; then
|
||||||
|
sed -i "s/$old/$new/" $VESTA/data/users/*/web.conf
|
||||||
|
for user in $(ls $VESTA/data/users/); do
|
||||||
|
$BIN/v-rebuild-web-domains $user no
|
||||||
|
done
|
||||||
|
$BIN/v-restart-dns $restart
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating DNS configs
|
||||||
|
if [ ! -z "$old" ] && [ ! -z "$DNS_SYSTEM" ]; then
|
||||||
|
sed -i "s/$old/$new/" $VESTA/data/users/*/dns.conf
|
||||||
|
sed -i "s/$old/$new/" $VESTA/data/users/*/dns/*.conf
|
||||||
|
for user in $(ls $VESTA/data/users/); do
|
||||||
|
$BIN/v-rebuild-dns-domains $user no
|
||||||
|
done
|
||||||
|
$BIN/v-restart-dns $restart
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating FTP
|
||||||
|
if [ ! -z "$old" ] && [ ! -z "$FTP_SYSTEM" ]; then
|
||||||
|
conf=$(find /etc -name $FTP_SYSTEM.conf)
|
||||||
|
if [ -e "$conf" ]; then
|
||||||
|
sed -i "s/$old/$new/g" $conf
|
||||||
|
if [ "$FTP_SYSTEM" = 'vsftpd' ]; then
|
||||||
|
check_pasv=$(grep pasv_address $conf)
|
||||||
|
if [ -z "$check_pasv" ] && [ ! -z "$nat_ip" ]; then
|
||||||
|
echo "pasv_address=$nat_ip" >> $conf
|
||||||
|
fi
|
||||||
|
if [ ! -z "$check_pasv" ] && [ -z "$nat_ip" ]; then
|
||||||
|
sed -i "/pasv_address/d" $conf
|
||||||
|
fi
|
||||||
|
if [ ! -z "$check_pasv" ] && [ ! -z "$nat_ip" ]; then
|
||||||
|
sed -i "s/pasv_address=.*/pasv_address='$nat_ip'/g" $conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
$BIN/v-restart-ftp $restart
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating firewall
|
||||||
|
if [ ! -z "$old" ] && [ ! -z "$FIREWALL_SYSTEM" ]; then
|
||||||
|
sed -i "s/$old/$new/g" $VESTA/data/firewall/*.conf
|
||||||
|
$BIN/v-update-firewall
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Vesta #
|
# Vesta #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Restart ftp server
|
|
||||||
$BIN/v-restart-ftp $restart
|
|
||||||
check_result $? "FTP restart failed" >/dev/null
|
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
log_history "changed associated nat address on $ip to $nat_ip" '' 'admin'
|
log_history "changed associated nat address on $ip to $nat_ip" '' 'admin'
|
||||||
log_event "$OK" "$ARGUMENTS"
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
|
@ -63,6 +63,7 @@ case $service in
|
||||||
spamd) dst=$($BIN/v-list-sys-spamd-config plain);;
|
spamd) dst=$($BIN/v-list-sys-spamd-config plain);;
|
||||||
spamassassin) dst=$($BIN/v-list-sys-spamd-config plain);;
|
spamassassin) dst=$($BIN/v-list-sys-spamd-config plain);;
|
||||||
clamd) dst=$($BIN/v-list-sys-clamd-config plain);;
|
clamd) dst=$($BIN/v-list-sys-clamd-config plain);;
|
||||||
|
clamd.scan) dst=$($BIN/v-list-sys-clamd-config plain);;
|
||||||
cron) dst='/etc/crontab';;
|
cron) dst='/etc/crontab';;
|
||||||
crond) dst='/etc/crontab';;
|
crond) dst='/etc/crontab';;
|
||||||
fail2ban) dst='/etc/fail2ban/jail.local';;
|
fail2ban) dst='/etc/fail2ban/jail.local';;
|
||||||
|
@ -95,13 +96,21 @@ if [ "$update" = 'yes' ] && [ "$restart" != 'no' ]; then
|
||||||
|
|
||||||
if [ "$service" = 'php' ]; then
|
if [ "$service" = 'php' ]; then
|
||||||
if [ "$WEB_SYSTEM" = "nginx" ]; then
|
if [ "$WEB_SYSTEM" = "nginx" ]; then
|
||||||
service=$(ls /etc/init.d/php*fpm* |cut -f 4 -d / |sed -n 1p)
|
if [ $(ps --no-headers -o comm 1) == systemd ]; then
|
||||||
|
service=$(systemctl | grep -o -E "php.*fpm.*\.service")
|
||||||
|
service=${service//.service/}
|
||||||
|
else
|
||||||
|
service=$(ls /etc/init.d/php*fpm* |cut -f 4 -d /)
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
service=$WEB_SYSTEM
|
service=$WEB_SYSTEM
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
service $service restart >/dev/null 2>&1
|
for single_service in $service; do
|
||||||
|
service $single_service restart >/dev/null 2>&1
|
||||||
|
done <<< "$service"
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
for config in $dst; do
|
for config in $dst; do
|
||||||
cat $config.vst.back > $config
|
cat $config.vst.back > $config
|
||||||
|
|
|
@ -16,16 +16,12 @@ force=$3
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/func/domain.sh
|
||||||
source $VESTA/conf/vesta.conf
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
is_package_avalable() {
|
is_package_avalable() {
|
||||||
|
|
||||||
usr_data=$(cat $USER_DATA/user.conf)
|
source $USER_DATA/user.conf
|
||||||
IFS=$'\n'
|
|
||||||
for key in $usr_data; do
|
|
||||||
eval ${key%%=*}=${key#*=}
|
|
||||||
done
|
|
||||||
|
|
||||||
WEB_DOMAINS='0'
|
WEB_DOMAINS='0'
|
||||||
DATABASES='0'
|
DATABASES='0'
|
||||||
MAIL_DOMAINS='0'
|
MAIL_DOMAINS='0'
|
||||||
|
@ -33,9 +29,13 @@ is_package_avalable() {
|
||||||
DISK_QUOTA='0'
|
DISK_QUOTA='0'
|
||||||
BANDWIDTH='0'
|
BANDWIDTH='0'
|
||||||
|
|
||||||
pkg_data=$(cat $VESTA/data/packages/$package.pkg |grep -v TIME |\
|
pkg_data=$(cat $VESTA/data/packages/$package.pkg| egrep -v "TIME|DATE")
|
||||||
grep -v DATE)
|
IFS=$'\n'
|
||||||
eval $pkg_data
|
for str in $pkg_data; do
|
||||||
|
key=$(echo $str |cut -f 1 -d =)
|
||||||
|
value=$(echo $str |cut -f 2 -d \')
|
||||||
|
eval $key="$value"
|
||||||
|
done
|
||||||
|
|
||||||
# Checking usage agains package limits
|
# Checking usage agains package limits
|
||||||
if [ "$WEB_DOMAINS" != 'unlimited' ]; then
|
if [ "$WEB_DOMAINS" != 'unlimited' ]; then
|
||||||
|
@ -73,11 +73,22 @@ is_package_avalable() {
|
||||||
check_result $E_LIMIT "Package doesn't cover BANDWIDTH usage"
|
check_result $E_LIMIT "Package doesn't cover BANDWIDTH usage"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Checking templates
|
||||||
|
is_web_template_valid $WEB_TEMPLATE
|
||||||
|
is_dns_template_valid $DNS_TEMPLATE
|
||||||
|
is_proxy_template_valid $PROXY_TEMPLATE
|
||||||
}
|
}
|
||||||
|
|
||||||
change_user_package() {
|
change_user_package() {
|
||||||
eval $(cat $USER_DATA/user.conf)
|
source $USER_DATA/user.conf
|
||||||
eval $(cat $VESTA/data/packages/$package.pkg |egrep -v "TIME|DATE")
|
pkg_data=$(cat $VESTA/data/packages/$package.pkg| egrep -v "TIME|DATE")
|
||||||
|
IFS=$'\n'
|
||||||
|
for str in $pkg_data; do
|
||||||
|
key=$(echo $str |cut -f 1 -d =)
|
||||||
|
value=$(echo $str |cut -f 2 -d \')
|
||||||
|
eval $key="$value"
|
||||||
|
done
|
||||||
echo "FNAME='$FNAME'
|
echo "FNAME='$FNAME'
|
||||||
LNAME='$LNAME'
|
LNAME='$LNAME'
|
||||||
PACKAGE='$package'
|
PACKAGE='$package'
|
||||||
|
@ -156,7 +167,7 @@ fi
|
||||||
change_user_package
|
change_user_package
|
||||||
|
|
||||||
# Update user shell
|
# Update user shell
|
||||||
shell_conf=$(echo "$pkg_data" | grep 'SHELL' | cut -f 2 -d \')
|
shell_conf=$(echo "$pkg_data" |grep 'SHELL' |cut -f 2 -d \')
|
||||||
shell=$(grep -w "$shell_conf" /etc/shells |head -n1)
|
shell=$(grep -w "$shell_conf" /etc/shells |head -n1)
|
||||||
/usr/bin/chsh -s "$shell" "$user" &>/dev/null
|
/usr/bin/chsh -s "$shell" "$user" &>/dev/null
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,10 @@
|
||||||
user=$1
|
user=$1
|
||||||
password=$2; HIDE=2
|
password=$2; HIDE=2
|
||||||
|
|
||||||
|
# Importing system enviroment as we run this script
|
||||||
|
# mostly by cron wich not read it by itself
|
||||||
|
source /etc/profile
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
source $VESTA/conf/vesta.conf
|
source $VESTA/conf/vesta.conf
|
||||||
|
@ -22,6 +26,9 @@ source $VESTA/conf/vesta.conf
|
||||||
# Verifications #
|
# Verifications #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
if [ "$user" = "root" ]; then
|
||||||
|
check_result $E_FORBIDEN "Changing root password is forbiden"
|
||||||
|
fi
|
||||||
check_args '2' "$#" 'USER PASSWORD'
|
check_args '2' "$#" 'USER PASSWORD'
|
||||||
is_format_valid 'user'
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
|
@ -37,6 +44,10 @@ is_password_valid
|
||||||
echo "$user:$password" | /usr/sbin/chpasswd
|
echo "$user:$password" | /usr/sbin/chpasswd
|
||||||
md5=$(awk -v user=$user -F : 'user == $1 {print $2}' /etc/shadow)
|
md5=$(awk -v user=$user -F : 'user == $1 {print $2}' /etc/shadow)
|
||||||
|
|
||||||
|
if [ "$user" = 'admin' ] && [ -e "$VESTA/web/reset.admin" ]; then
|
||||||
|
rm -f $VESTA/web/reset.admin
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Vesta #
|
# Vesta #
|
||||||
|
|
60
bin/v-change-vesta-port
Normal file
60
bin/v-change-vesta-port
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: change vesta port
|
||||||
|
# options: port
|
||||||
|
#
|
||||||
|
# Function will change vesta port
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Argument definition
|
||||||
|
port=$1
|
||||||
|
|
||||||
|
if [ -z "$VESTA" ]; then
|
||||||
|
VESTA="/usr/local/vesta"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get current vesta port by reading nginx.conf
|
||||||
|
oldport=$(grep 'listen' $VESTA/nginx/conf/nginx.conf | awk '{print $2}' | sed "s|;||")
|
||||||
|
if [ -z "$oldport" ]; then
|
||||||
|
oldport=8083
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Checking permissions
|
||||||
|
if [ "$(id -u)" != '0' ]; then
|
||||||
|
check_result $E_FORBIDEN "You must be root to execute this script"
|
||||||
|
fi
|
||||||
|
|
||||||
|
check_args '1' "$#" 'PORT'
|
||||||
|
is_int_format_valid "$port" 'port number'
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
sed -i "s|$oldport;|$port;|g" $VESTA/nginx/conf/nginx.conf
|
||||||
|
if [ -f "/etc/roundcube/plugins/password/config.inc.php" ]; then
|
||||||
|
sed -i "s|'$oldport'|'$port'|g" /etc/roundcube/plugins/password/config.inc.php
|
||||||
|
fi
|
||||||
|
sed -i "s|'$oldport'|'$port'|g" $VESTA/data/firewall/rules.conf
|
||||||
|
$VESTA/bin/v-update-firewall
|
||||||
|
systemctl restart fail2ban.service
|
||||||
|
sed -i "s| $oldport | $port |g" /etc/iptables.rules
|
||||||
|
systemctl restart vesta
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
||||||
|
exit 0;
|
|
@ -52,7 +52,7 @@ rm -f $pool/$backend_type.conf
|
||||||
|
|
||||||
# Allocating backend port
|
# Allocating backend port
|
||||||
backend_port=9000
|
backend_port=9000
|
||||||
ports=$(grep -v '^;' $pool/* 2>/dev/null |grep listen |grep -o :[0-9].*)
|
ports=$(grep listen $pool/* 2>/dev/null |grep -o :[0-9].*)
|
||||||
ports=$(echo "$ports" |sed "s/://" |sort -n)
|
ports=$(echo "$ports" |sed "s/://" |sort -n)
|
||||||
for port in $ports; do
|
for port in $ports; do
|
||||||
if [ "$backend_port" -eq "$port" ]; then
|
if [ "$backend_port" -eq "$port" ]; then
|
||||||
|
|
|
@ -49,7 +49,7 @@ is_ip_valid "$ip" "$user"
|
||||||
# Preparing variables for vhost replace
|
# Preparing variables for vhost replace
|
||||||
get_domain_values 'web'
|
get_domain_values 'web'
|
||||||
old=$(get_real_ip $IP)
|
old=$(get_real_ip $IP)
|
||||||
new=$ip
|
new=$(get_real_ip $ip)
|
||||||
|
|
||||||
# Replacing vhost
|
# Replacing vhost
|
||||||
replace_web_config "$WEB_SYSTEM" "$TPL.tpl"
|
replace_web_config "$WEB_SYSTEM" "$TPL.tpl"
|
||||||
|
|
40
bin/v-check-api-key
Executable file
40
bin/v-check-api-key
Executable file
|
@ -0,0 +1,40 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: check api key
|
||||||
|
# options: KEY
|
||||||
|
#
|
||||||
|
# The function checks a key file in /usr/local/vesta/data/keys/
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Error: key missmatch"
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
key=$(basename $1)
|
||||||
|
ip=${2-127.0.0.1}
|
||||||
|
time_n_date=$(date +'%T %F')
|
||||||
|
time=$(echo "$time_n_date" |cut -f 1 -d \ )
|
||||||
|
date=$(echo "$time_n_date" |cut -f 2 -d \ )
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
if [ ! -e $VESTA/data/keys/$key ]; then
|
||||||
|
echo "Error: key missmatch"
|
||||||
|
echo "$date $time api $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
echo "$date $time api $ip successfully launched" >> $VESTA/log/auth.log
|
||||||
|
|
||||||
|
exit
|
|
@ -1,162 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# info: check letsencrypt domain
|
|
||||||
# options: USER DOMAIN
|
|
||||||
#
|
|
||||||
# The function check and validates domain with LetsEncript
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Variable&Function #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
# Argument definition
|
|
||||||
user=$1
|
|
||||||
domain=$2
|
|
||||||
|
|
||||||
# Includes
|
|
||||||
source $VESTA/func/main.sh
|
|
||||||
source $VESTA/conf/vesta.conf
|
|
||||||
|
|
||||||
# encode base64
|
|
||||||
encode_base64() {
|
|
||||||
cat |base64 |tr '+/' '-_' |tr -d '\r\n='
|
|
||||||
}
|
|
||||||
|
|
||||||
# Additional argument formatting
|
|
||||||
format_domain_idn
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Verifications #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
check_args '2' "$#" 'USER DOMAIN'
|
|
||||||
is_format_valid 'user' 'domain'
|
|
||||||
is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
|
|
||||||
is_object_valid 'user' 'USER' "$user"
|
|
||||||
is_object_unsuspended 'user' 'USER' "$user"
|
|
||||||
if [ ! -e "$USER_DATA/ssl/le.conf" ]; then
|
|
||||||
check_result $E_NOTEXIST "LetsEncrypt key doesn't exist"
|
|
||||||
fi
|
|
||||||
rdomain=$(egrep "'$domain'|'$domain,|,$domain,|,$domain'" $USER_DATA/web.conf)
|
|
||||||
if [ -z "$rdomain" ]; then
|
|
||||||
check_result $E_NOTEXIST "domain $domain doesn't exist"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Action #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
source $USER_DATA/ssl/le.conf
|
|
||||||
api='https://acme-v01.api.letsencrypt.org'
|
|
||||||
r_domain=$(echo "$rdomain" |cut -f 2 -d \')
|
|
||||||
key="$USER_DATA/ssl/user.key"
|
|
||||||
exponent="$EXPONENT"
|
|
||||||
modulus="$MODULUS"
|
|
||||||
thumb="$THUMB"
|
|
||||||
|
|
||||||
# Defining JWK header
|
|
||||||
header='{"e":"'$exponent'","kty":"RSA","n":"'"$modulus"'"}'
|
|
||||||
header='{"alg":"RS256","jwk":'"$header"'}'
|
|
||||||
|
|
||||||
# Requesting nonce
|
|
||||||
nonce=$(curl -s -I "$api/directory" |grep Nonce |cut -f2 -d \ |tr -d '\r\n')
|
|
||||||
protected=$(echo -n '{"nonce":"'"$nonce"'"}' |encode_base64)
|
|
||||||
|
|
||||||
# Defining ACME query (request challenge)
|
|
||||||
query='{"resource":"new-authz","identifier"'
|
|
||||||
query=$query':{"type":"dns","value":"'"$domain_idn"'"}}'
|
|
||||||
payload=$(echo -n "$query" |encode_base64)
|
|
||||||
signature=$(printf "%s" "$protected.$payload" |\
|
|
||||||
openssl dgst -sha256 -binary -sign "$key" |encode_base64)
|
|
||||||
data='{"header":'"$header"',"protected":"'"$protected"'",'
|
|
||||||
data=$data'"payload":"'"$payload"'","signature":"'"$signature"'"}'
|
|
||||||
|
|
||||||
# Sending request to LetsEncrypt API
|
|
||||||
answer=$(curl -s -i -d "$data" "$api/acme/new-authz")
|
|
||||||
|
|
||||||
# Checking http answer status
|
|
||||||
status=$(echo "$answer" |grep HTTP/1.1 |tail -n1 |cut -f2 -d ' ')
|
|
||||||
if [[ "$status" -ne "201" ]]; then
|
|
||||||
check_result $E_CONNECT "LetsEncrypt challenge request $status"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Parsing domain nonce,token and uri
|
|
||||||
nonce=$(echo "$answer" |grep Nonce |cut -f2 -d \ |tr -d '\r\n')
|
|
||||||
protected=$(echo -n '{"nonce":"'"$nonce"'"}' |encode_base64)
|
|
||||||
token=$(echo "$answer" |grep -A 3 http-01 |grep token |cut -f 4 -d \")
|
|
||||||
uri=$(echo "$answer" |grep -A 3 http-01 |grep uri |cut -f 4 -d \")
|
|
||||||
|
|
||||||
# Adding location wrapper for request challenge
|
|
||||||
if [ "$WEB_SYSTEM" = 'nginx' ] || [ "$PROXY_SYSTEM" = 'nginx' ]; then
|
|
||||||
conf="$HOMEDIR/$user/conf/web/nginx.$r_domain.conf_letsencrypt"
|
|
||||||
sconf="$HOMEDIR/$user/conf/web/snginx.$r_domain.conf_letsencrypt"
|
|
||||||
if [ ! -e "$conf" ]; then
|
|
||||||
echo 'location ~ "^/\.well-known/acme-challenge/(.*)$" {' > $conf
|
|
||||||
echo ' default_type text/plain;' >> $conf
|
|
||||||
echo ' return 200 "$1.'$thumb'";' >> $conf
|
|
||||||
echo '}' >> $conf
|
|
||||||
fi
|
|
||||||
if [ ! -e "$sconf" ]; then
|
|
||||||
ln -s "$conf" "$sconf"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
acme="$HOMEDIR/$user/web/$r_domain/public_html/.well-known/acme-challenge"
|
|
||||||
if [ ! -d "$acme" ]; then
|
|
||||||
mkdir -p $acme
|
|
||||||
fi
|
|
||||||
echo "$token.$thumb" > $acme/$token
|
|
||||||
chown -R $user:$user $HOMEDIR/$user/web/$r_domain/public_html/.well-known
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restarting web server
|
|
||||||
if [ -z "$PROXY_SYSTEM" ]; then
|
|
||||||
$BIN/v-restart-web
|
|
||||||
check_result $? "Proxy restart failed" >/dev/null
|
|
||||||
else
|
|
||||||
$BIN/v-restart-proxy
|
|
||||||
$BIN/v-restart-web
|
|
||||||
check_result $? "Web restart failed" >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Defining ACME query (request validation)
|
|
||||||
query='{"resource":"challenge","type":"http-01","keyAuthorization"'
|
|
||||||
query=$query':"'$token.$thumb'","token":"'$token'"}'
|
|
||||||
payload=$(echo -n "$query" |encode_base64)
|
|
||||||
signature=$(printf "%s" "$protected.$payload" |\
|
|
||||||
openssl dgst -sha256 -binary -sign "$key" |encode_base64)
|
|
||||||
data='{"header":'"$header"',"protected":"'"$protected"'",'
|
|
||||||
data=$data'"payload":"'"$payload"'","signature":"'"$signature"'"}'
|
|
||||||
|
|
||||||
# Sending request to LetsEncrypt API
|
|
||||||
answer=$(curl -s -i -d "$data" "$uri")
|
|
||||||
|
|
||||||
# Checking domain validation status
|
|
||||||
i=1
|
|
||||||
status=$(echo $answer |tr ',' '\n' |grep status |cut -f 4 -d \")
|
|
||||||
location=$(echo "$answer" |grep Location: |awk '{print $2}' |tr -d '\r\n')
|
|
||||||
while [ "$status" = 'pending' ]; do
|
|
||||||
answer=$(curl -s -i "$location")
|
|
||||||
detail="$(echo $answer |tr ',' '\n' |grep detail |cut -f 4 -d \")"
|
|
||||||
status=$(echo "$answer" |tr ',' '\n' |grep status |cut -f 4 -d \")
|
|
||||||
sleep 1
|
|
||||||
i=$((i + 1))
|
|
||||||
if [ "$i" -gt 60 ]; then
|
|
||||||
check_result $E_CONNECT "$detail"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ "$status" = 'invalid' ]; then
|
|
||||||
detail="$(echo $answer |tr ',' '\n' |grep detail |cut -f 4 -d \")"
|
|
||||||
check_result $E_CONNECT "$detail"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Vesta #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
# Logging
|
|
||||||
log_event "$OK" "$ARGUMENTS"
|
|
||||||
|
|
||||||
exit
|
|
100
bin/v-check-user-hash
Executable file
100
bin/v-check-user-hash
Executable file
|
@ -0,0 +1,100 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: check user hash
|
||||||
|
# options: USER HASH [IP]
|
||||||
|
#
|
||||||
|
# The function verifies user hash
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Argument definition
|
||||||
|
user=$1
|
||||||
|
hash=$2; HIDE=2
|
||||||
|
ip=${3-127.0.0.1}
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
time_n_date=$(date +'%T %F')
|
||||||
|
time=$(echo "$time_n_date" |cut -f 1 -d \ )
|
||||||
|
date=$(echo "$time_n_date" |cut -f 2 -d \ )
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
|
||||||
|
check_args '2' "$#" 'USER HASH'
|
||||||
|
is_format_valid 'user'
|
||||||
|
|
||||||
|
# Checking user
|
||||||
|
if [ ! -d "$VESTA/data/users/$user" ] && [ "$user" != 'root' ]; then
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Checking user hash
|
||||||
|
is_hash_valid
|
||||||
|
|
||||||
|
# Checking empty hash
|
||||||
|
if [[ -z "$hash" ]]; then
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
|
||||||
|
# Parsing user's salt
|
||||||
|
shadow=$(grep "^$user:" /etc/shadow | cut -f 2 -d :)
|
||||||
|
|
||||||
|
if echo "$shadow" | grep -qE '^\$[0-9a-z]+\$[^\$]+\$'
|
||||||
|
then
|
||||||
|
salt=$(echo "$shadow" |cut -f 3 -d \$)
|
||||||
|
method=$(echo "$shadow" |cut -f 2 -d \$)
|
||||||
|
if [ "$method" -eq '1' ]; then
|
||||||
|
method='md5'
|
||||||
|
elif [ "$method" -eq '6' ]; then
|
||||||
|
method='sha-512'
|
||||||
|
else
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
salt=${shadow:0:2}
|
||||||
|
method='des'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Checking salt
|
||||||
|
if [ -z "$salt" ]; then
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Comparing hashes
|
||||||
|
if [[ "$shadow" != "$hash" ]]; then
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
echo "$date $time $user $ip successfully logged in" >> $VESTA/log/auth.log
|
||||||
|
|
||||||
|
exit
|
|
@ -82,7 +82,8 @@ if [ -z "$salt" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Generating hash
|
# Generating hash
|
||||||
hash=$($BIN/v-generate-password-hash $method $salt <<< $password)
|
set -o noglob
|
||||||
|
hash=$($BIN/v-generate-password-hash $method $salt <<< "$password")
|
||||||
if [[ -z "$hash" ]]; then
|
if [[ -z "$hash" ]]; then
|
||||||
echo "Error: password missmatch"
|
echo "Error: password missmatch"
|
||||||
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
|
|
@ -35,7 +35,7 @@ check_args '2' "$#" 'MODULE LICENSE'
|
||||||
|
|
||||||
# Activating license
|
# Activating license
|
||||||
v_host='https://vestacp.com/checkout'
|
v_host='https://vestacp.com/checkout'
|
||||||
answer=$(curl -s $v_host/cancel.php?licence_key=$license)
|
answer=$(curl -s "$v_host/cancel.php?licence_key=$license&module=$module")
|
||||||
check_result $? "cant' connect to vestacp.com " $E_CONNECT
|
check_result $? "cant' connect to vestacp.com " $E_CONNECT
|
||||||
|
|
||||||
# Checking server answer
|
# Checking server answer
|
||||||
|
|
|
@ -56,7 +56,7 @@ fi
|
||||||
# Deleting dkim dns record
|
# Deleting dkim dns record
|
||||||
if [ "$DKIM" = 'yes' ] && [ -e "$USER_DATA/dns/$domain.conf" ]; then
|
if [ "$DKIM" = 'yes' ] && [ -e "$USER_DATA/dns/$domain.conf" ]; then
|
||||||
records=$($BIN/v-list-dns-records $user $domain plain)
|
records=$($BIN/v-list-dns-records $user $domain plain)
|
||||||
dkim_records=$(echo "$records" |grep -w '_domainkey' | cut -f 1 -d ' ')
|
dkim_records=$(echo "$records" |grep -w '_domainkey' |cut -f 1)
|
||||||
for id in $dkim_records; do
|
for id in $dkim_records; do
|
||||||
$BIN/v-delete-dns-record $user $domain $id
|
$BIN/v-delete-dns-record $user $domain $id
|
||||||
done
|
done
|
||||||
|
|
75
bin/v-delete-sys-mail-ssl
Executable file
75
bin/v-delete-sys-mail-ssl
Executable file
|
@ -0,0 +1,75 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: delete sys vesta user ssl certificate
|
||||||
|
# options: NONE
|
||||||
|
#
|
||||||
|
# The script disables user domain ssl synchronization
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable & Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
vst_crt="$VESTA/ssl/certificate.crt"
|
||||||
|
vst_key="$VESTA/ssl/certificate.key"
|
||||||
|
|
||||||
|
# Updating mail certificate
|
||||||
|
case $MAIL_SYSTEM in
|
||||||
|
exim) conf='/etc/exim/exim.conf';;
|
||||||
|
exim4) conf='/etc/exim4/exim4.conf.template';;
|
||||||
|
esac
|
||||||
|
if [ -e "$conf" ]; then
|
||||||
|
sed -e "s|^tls_certificate.*|tls_certificate = $vst_crt|" \
|
||||||
|
-e "s|^tls_privatekey.*|tls_privatekey = $vst_key|" -i $conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating imap certificate
|
||||||
|
conf="/etc/dovecot/conf.d/10-ssl.conf"
|
||||||
|
if [ ! -z "$IMAP_SYSTEM" ] && [ -e "$conf" ]; then
|
||||||
|
sed -e "s|ssl_cert.*|ssl_cert = <$vst_crt|" \
|
||||||
|
-e "s|ssl_key.*|ssl_key = <$vst_key|" -i $conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Moving old certificates
|
||||||
|
if [ -e "$VESTA/ssl/mail.crt" ]; then
|
||||||
|
mv -f $VESTA/ssl/mail.crt $VESTA/ssl/mail.crt.old
|
||||||
|
fi
|
||||||
|
if [ -e "VESTA/ssl/mail.key" ]; then
|
||||||
|
mv $VESTA/ssl/mail.key VESTA/ssl/mail.key.old
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating vesta.conf value
|
||||||
|
sed -i "/MAIL_CERTIFICATE=/ d" $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Restarting services
|
||||||
|
if [ "$restart" != 'no' ]; then
|
||||||
|
if [ ! -z "$MAIL_SYSTEM" ]; then
|
||||||
|
$BIN/v-restart-service $MAIL_SYSTEM
|
||||||
|
fi
|
||||||
|
if [ ! -z "$IMAP_SYSTEM" ]; then
|
||||||
|
$BIN/v-restart-service $IMAP_SYSTEM
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
||||||
|
exit
|
37
bin/v-delete-sys-vesta-ssl
Executable file
37
bin/v-delete-sys-vesta-ssl
Executable file
|
@ -0,0 +1,37 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: delete sys vesta user ssl certificate
|
||||||
|
# options: NONE
|
||||||
|
#
|
||||||
|
# The script disables user domain ssl synchronization
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable & Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Updating vesta.conf value
|
||||||
|
sed -i "/VESTA_CERTIFICATE=/ d" $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_event "$OK" "$ARGUMENTS"
|
||||||
|
|
||||||
|
exit
|
|
@ -32,6 +32,8 @@ case $system in
|
||||||
DNS_REC) is_format_valid 'id' ;;
|
DNS_REC) is_format_valid 'id' ;;
|
||||||
*) is_format_valid 'object'
|
*) is_format_valid 'object'
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_unsuspended 'user' 'USER' "$user"
|
is_object_unsuspended 'user' 'USER' "$user"
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,8 @@ fi
|
||||||
|
|
||||||
# Deleting symlink
|
# Deleting symlink
|
||||||
if [ -e "$VESTA/web/softaculous" ]; then
|
if [ -e "$VESTA/web/softaculous" ]; then
|
||||||
rm -f $VESTA/web/softaculous
|
mkdir -p $VESTA/disabled_plugins
|
||||||
|
mv $VESTA/web/softaculous $VESTA/disabled_plugins
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Updating SOFTACULOUS value
|
# Updating SOFTACULOUS value
|
||||||
|
|
|
@ -57,7 +57,13 @@ fi
|
||||||
|
|
||||||
# Deleting old certificate
|
# Deleting old certificate
|
||||||
tmpdir=$(mktemp -p $HOMEDIR/$user/web/$domain/private -d)
|
tmpdir=$(mktemp -p $HOMEDIR/$user/web/$domain/private -d)
|
||||||
rm -f $HOMEDIR/$user/conf/web/ssl.$domain.*
|
|
||||||
|
# remove certificate files - do not use wildcard, as this might remove other domains
|
||||||
|
rm -f $HOMEDIR/$user/conf/web/ssl.$domain.ca
|
||||||
|
rm -f $HOMEDIR/$user/conf/web/ssl.$domain.crt
|
||||||
|
rm -f $HOMEDIR/$user/conf/web/ssl.$domain.key
|
||||||
|
rm -f $HOMEDIR/$user/conf/web/ssl.$domain.pem
|
||||||
|
|
||||||
mv $USER_DATA/ssl/$domain.* $tmpdir
|
mv $USER_DATA/ssl/$domain.* $tmpdir
|
||||||
chown -R $user:$user $tmpdir
|
chown -R $user:$user $tmpdir
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ fi
|
||||||
# Extracting ziped archive
|
# Extracting ziped archive
|
||||||
if [ ! -z "$(echo $src_file |grep -i '.zip')" ]; then
|
if [ ! -z "$(echo $src_file |grep -i '.zip')" ]; then
|
||||||
sudo -u $user mkdir -p "$dst_dir" >/dev/null 2>&1
|
sudo -u $user mkdir -p "$dst_dir" >/dev/null 2>&1
|
||||||
sudo -u $user unzip "$src_file" -d "$dst_dir" >/dev/null 2>&1
|
sudo -u $user unzip -o "$src_file" -d "$dst_dir" >/dev/null 2>&1
|
||||||
rc=$?
|
rc=$?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ fi
|
||||||
|
|
||||||
args_usage='DOMAIN EMAIL COUNTRY STATE CITY ORG UNIT [ALIASES] [FORMAT]'
|
args_usage='DOMAIN EMAIL COUNTRY STATE CITY ORG UNIT [ALIASES] [FORMAT]'
|
||||||
check_args '7' "$#" "$args_usage"
|
check_args '7' "$#" "$args_usage"
|
||||||
is_format_valid 'domain_alias' 'format'
|
is_format_valid 'domain' 'alias' 'format'
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
118
bin/v-get-user-salt
Executable file
118
bin/v-get-user-salt
Executable file
|
@ -0,0 +1,118 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: get user salt
|
||||||
|
# options: USER [IP] [FORMAT]
|
||||||
|
#
|
||||||
|
# The function provides users salt
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Argument definition
|
||||||
|
user=$1
|
||||||
|
ip=${2-127.0.0.1}
|
||||||
|
format=${3-shell}
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
time_n_date=$(date +'%T %F')
|
||||||
|
time=$(echo "$time_n_date" |cut -f 1 -d \ )
|
||||||
|
date=$(echo "$time_n_date" |cut -f 2 -d \ )
|
||||||
|
|
||||||
|
# JSON list function
|
||||||
|
json_list() {
|
||||||
|
echo '{'
|
||||||
|
echo ' "'$user'": {
|
||||||
|
"METHOD": "'$method'",
|
||||||
|
"SALT": "'$salt'",
|
||||||
|
"TIME": "'$time'",
|
||||||
|
"DATE": "'$date'"
|
||||||
|
}'
|
||||||
|
echo '}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# SHELL list function
|
||||||
|
shell_list() {
|
||||||
|
echo "METHOD: $method"
|
||||||
|
echo "SALT: $salt"
|
||||||
|
}
|
||||||
|
|
||||||
|
# PLAIN list function
|
||||||
|
plain_list() {
|
||||||
|
echo -e "$method\t$salt"
|
||||||
|
}
|
||||||
|
|
||||||
|
# CSV list function
|
||||||
|
csv_list() {
|
||||||
|
echo "METHOD,SALT"
|
||||||
|
echo "$method, $salt"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
|
||||||
|
check_args '1' "$#" 'USER [IP] [SALT]'
|
||||||
|
is_format_valid 'user'
|
||||||
|
|
||||||
|
# Checking user
|
||||||
|
if [ ! -d "$VESTA/data/users/$user" ] && [ "$user" != 'root' ]; then
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Parsing user's salt
|
||||||
|
shadow=$(grep "^$user:" /etc/shadow | cut -f 2 -d :)
|
||||||
|
|
||||||
|
if echo "$shadow" | grep -qE '^\$[0-9a-z]+\$[^\$]+\$'
|
||||||
|
then
|
||||||
|
salt=$(echo "$shadow" |cut -f 3 -d \$)
|
||||||
|
method=$(echo "$shadow" |cut -f 2 -d \$)
|
||||||
|
if [ "$method" -eq '1' ]; then
|
||||||
|
method='md5'
|
||||||
|
elif [ "$method" -eq '6' ]; then
|
||||||
|
method='sha-512'
|
||||||
|
else
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
salt=${shadow:0:2}
|
||||||
|
method='des'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$salt" ]; then
|
||||||
|
echo "Error: password missmatch"
|
||||||
|
echo "$date $time $user $ip failed to login" >> $VESTA/log/auth.log
|
||||||
|
exit 9
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Listing data
|
||||||
|
case $format in
|
||||||
|
json) json_list ;;
|
||||||
|
plain) plain_list ;;
|
||||||
|
csv) csv_list ;;
|
||||||
|
shell) shell_list ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
|
||||||
|
exit
|
|
@ -50,7 +50,7 @@ if [ "$flush" = 'records' ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Flush domain
|
# Flush domain
|
||||||
if [ "$flush" ! = 'no' ]; then
|
if [ "$flush" != 'no' ]; then
|
||||||
sed -i "/DOMAIN='$DOMAIN'/d" $USER_DATA/dns.conf 2> /dev/null
|
sed -i "/DOMAIN='$DOMAIN'/d" $USER_DATA/dns.conf 2> /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
||||||
|
is_format_valid 'user' 'domain'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_valid 'dns' 'DOMAIN' "$domain"
|
is_object_valid 'dns' 'DOMAIN' "$domain"
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,8 @@ json_list() {
|
||||||
"EMAIL": "'$EMAIL'",
|
"EMAIL": "'$EMAIL'",
|
||||||
"EXPONENT": "'$EXPONENT'",
|
"EXPONENT": "'$EXPONENT'",
|
||||||
"MODULUS": "'$MODULUS'",
|
"MODULUS": "'$MODULUS'",
|
||||||
"THUMB: "'$THUMB'"
|
"THUMB": "'$THUMB'",
|
||||||
|
"KID": "'$KID'"
|
||||||
}'
|
}'
|
||||||
echo '}'
|
echo '}'
|
||||||
}
|
}
|
||||||
|
@ -35,17 +36,18 @@ shell_list() {
|
||||||
echo "THUMB: $THUMB"
|
echo "THUMB: $THUMB"
|
||||||
echo "EXPONENT: $EXPONENT"
|
echo "EXPONENT: $EXPONENT"
|
||||||
echo "MODULUS: $MODULUS"
|
echo "MODULUS: $MODULUS"
|
||||||
|
echo "KID: $KID"
|
||||||
}
|
}
|
||||||
|
|
||||||
# PLAIN list function
|
# PLAIN list function
|
||||||
plain_list() {
|
plain_list() {
|
||||||
echo -e "$user\t$EMAIL\t$EXPONENT\t$MODULUS\t$THUMB"
|
echo -e "$user\t$EMAIL\t$EXPONENT\t$MODULUS\t$THUMB\t$KID"
|
||||||
}
|
}
|
||||||
|
|
||||||
# CSV list function
|
# CSV list function
|
||||||
csv_list() {
|
csv_list() {
|
||||||
echo "USER,EMAIL,EXPONENT,MODULUS,THUMB"
|
echo "USER,EMAIL,EXPONENT,MODULUS,THUMB,KID"
|
||||||
echo "$user,$EMAIL,$EXPONENT,$MODULUS,$THUMB"
|
echo "$user,$EMAIL,$EXPONENT,$MODULUS,$THUMB,$KID"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,6 +56,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '1' "$#" 'USER [FORMAT]'
|
check_args '1' "$#" 'USER [FORMAT]'
|
||||||
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
if [ ! -e "$USER_DATA/ssl/le.conf" ]; then
|
if [ ! -e "$USER_DATA/ssl/le.conf" ]; then
|
||||||
check_result $E_NOTEXIST "LetsEncrypt user account doesn't exist"
|
check_result $E_NOTEXIST "LetsEncrypt user account doesn't exist"
|
||||||
|
|
|
@ -57,6 +57,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
||||||
|
is_format_valid 'user' 'domain'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_valid 'mail' 'DOMAIN' "$domain"
|
is_object_valid 'mail' 'DOMAIN' "$domain"
|
||||||
|
|
||||||
|
@ -67,7 +68,7 @@ is_object_valid 'mail' 'DOMAIN' "$domain"
|
||||||
|
|
||||||
# Parsing domain keys
|
# Parsing domain keys
|
||||||
if [ -e "$USER_DATA/mail/$domain.pub" ]; then
|
if [ -e "$USER_DATA/mail/$domain.pub" ]; then
|
||||||
pub=$(cat $USER_DATA/mail/$domain.pub |grep -v "KEY-----")
|
pub=$(cat $USER_DATA/mail/$domain.pub |grep -v "KEY-----" |tr -d "\n\r")
|
||||||
pub=$(echo "$pub" |sed ':a;N;$!ba;s/\n/\\n/g')
|
pub=$(echo "$pub" |sed ':a;N;$!ba;s/\n/\\n/g')
|
||||||
else
|
else
|
||||||
pub="DKIM-SUPPORT-IS-NOT-ACTIVATED"
|
pub="DKIM-SUPPORT-IS-NOT-ACTIVATED"
|
||||||
|
|
|
@ -51,7 +51,9 @@ json_list() {
|
||||||
"MAIL_URL": "'$MAIL_URL'",
|
"MAIL_URL": "'$MAIL_URL'",
|
||||||
"DB_PMA_URL": "'$DB_PMA_URL'",
|
"DB_PMA_URL": "'$DB_PMA_URL'",
|
||||||
"DB_PGA_URL": "'$DB_PGA_URL'",
|
"DB_PGA_URL": "'$DB_PGA_URL'",
|
||||||
"SOFTACULOUS": "'$SOFTACULOUS'"
|
"SOFTACULOUS": "'$SOFTACULOUS'",
|
||||||
|
"MAIL_CERTIFICATE": "'$MAIL_CERTIFICATE'",
|
||||||
|
"VESTA_CERTIFICATE": "'$VESTA_CERTIFICATE'"
|
||||||
}
|
}
|
||||||
}'
|
}'
|
||||||
}
|
}
|
||||||
|
@ -138,6 +140,12 @@ shell_list() {
|
||||||
if [ ! -z "$LANGUAGE" ] && [ "$LANGUAGE" != 'en' ]; then
|
if [ ! -z "$LANGUAGE" ] && [ "$LANGUAGE" != 'en' ]; then
|
||||||
echo "Language: $LANGUAGE"
|
echo "Language: $LANGUAGE"
|
||||||
fi
|
fi
|
||||||
|
if [ ! -z "$MAIL_CERTIFICATE" ]; then
|
||||||
|
echo "Mail SSL: $MAIL_CERTIFICATE"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$VESTA_CERTIFICATE" ]; then
|
||||||
|
echo "Vesta SSL: $VESTA_CERTIFICATE"
|
||||||
|
fi
|
||||||
echo "Version: $VERSION"
|
echo "Version: $VERSION"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,7 +159,8 @@ plain_list() {
|
||||||
echo -ne "$CRON_SYSTEM\t$DISK_QUOTA\t$FIREWALL_SYSTEM\t"
|
echo -ne "$CRON_SYSTEM\t$DISK_QUOTA\t$FIREWALL_SYSTEM\t"
|
||||||
echo -ne "$FIREWALL_EXTENSION\t$FILEMANAGER_KEY\t$SFTPJAIL_KEY\t"
|
echo -ne "$FIREWALL_EXTENSION\t$FILEMANAGER_KEY\t$SFTPJAIL_KEY\t"
|
||||||
echo -ne "$REPOSITORY\t$VERSION\t$LANGUAGE\t$BACKUP_GZIP\t$BACKUP\t"
|
echo -ne "$REPOSITORY\t$VERSION\t$LANGUAGE\t$BACKUP_GZIP\t$BACKUP\t"
|
||||||
echo -e "$MAIL_URL\t$DB_PMA_URL\t$DB_PGA_URL"
|
echo -ne "$MAIL_URL\t$DB_PMA_URL\t$DB_PGA_URL\t$MAIL_CERTIFICATE\t"
|
||||||
|
echo -e "$VESTA_CERTIFICATE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,7 +174,8 @@ csv_list() {
|
||||||
echo -n "'CRON_SYSTEM','DISK_QUOTA','FIREWALL_SYSTEM',"
|
echo -n "'CRON_SYSTEM','DISK_QUOTA','FIREWALL_SYSTEM',"
|
||||||
echo -n "'FIREWALL_EXTENSION','FILEMANAGER_KEY','SFTPJAIL_KEY',"
|
echo -n "'FIREWALL_EXTENSION','FILEMANAGER_KEY','SFTPJAIL_KEY',"
|
||||||
echo -n "'REPOSITORY','VERSION','LANGUAGE','BACKUP_GZIP','BACKUP',"
|
echo -n "'REPOSITORY','VERSION','LANGUAGE','BACKUP_GZIP','BACKUP',"
|
||||||
echo -n "'MAIL_URL','DB_PMA_URL','DB_PGA_URL'"
|
echo -n "'MAIL_URL','DB_PMA_URL','DB_PGA_URL', 'SOFTACULOUS',"
|
||||||
|
echo -n "'MAIL_CERTIFICATE','VESTA_CERTIFICATE'"
|
||||||
echo
|
echo
|
||||||
echo -n "'$WEB_SYSTEM','$WEB_RGROUPS','$WEB_PORT','$WEB_SSL',"
|
echo -n "'$WEB_SYSTEM','$WEB_RGROUPS','$WEB_PORT','$WEB_SSL',"
|
||||||
echo -n "'$WEB_SSL_PORT','$WEB_BACKEND','$PROXY_SYSTEM','$PROXY_PORT',"
|
echo -n "'$WEB_SSL_PORT','$WEB_BACKEND','$PROXY_SYSTEM','$PROXY_PORT',"
|
||||||
|
@ -176,6 +186,7 @@ csv_list() {
|
||||||
echo -n "'$FIREWALL_EXTENSION','$FILEMANAGER_KEY','$SFTPJAIL_KEY',"
|
echo -n "'$FIREWALL_EXTENSION','$FILEMANAGER_KEY','$SFTPJAIL_KEY',"
|
||||||
echo -n "'$REPOSITORY','$VERSION','$LANGUAGE','$BACKUP_GZIP','$BACKUP',"
|
echo -n "'$REPOSITORY','$VERSION','$LANGUAGE','$BACKUP_GZIP','$BACKUP',"
|
||||||
echo -n "'$MAIL_URL','$DB_PMA_URL','$DB_PGA_URL', '$SOFTACULOUS'"
|
echo -n "'$MAIL_URL','$DB_PMA_URL','$DB_PGA_URL', '$SOFTACULOUS'"
|
||||||
|
echo -n "'$MAIL_CERTIFICATE','$VESTA_CERTIFICATE'"
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,7 +198,7 @@ csv_list() {
|
||||||
# Listing data
|
# Listing data
|
||||||
case $format in
|
case $format in
|
||||||
json) json_list ;;
|
json) json_list ;;
|
||||||
plain) shell_list ;;
|
plain) plain_list ;;
|
||||||
csv) csv_list ;;
|
csv) csv_list ;;
|
||||||
shell) shell_list ;;
|
shell) shell_list ;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -56,17 +56,18 @@ csv_list() {
|
||||||
HOSTNAME=$(hostname)
|
HOSTNAME=$(hostname)
|
||||||
|
|
||||||
# Check OS/Release
|
# Check OS/Release
|
||||||
if [ -e '/etc/redhat-release' ]; then
|
if [ -d '/etc/sysconfig' ]; then
|
||||||
if [ ! -z "$(grep CentOS /etc/redhat-release)" ]; then
|
if [ -e '/etc/redhat-release' ]; then
|
||||||
OS='CentOS'
|
OS='CentOS'
|
||||||
|
VERSION=$(cat /etc/redhat-release |tr ' ' '\n' |grep [0-9])
|
||||||
else
|
else
|
||||||
OS="RHEL"
|
OS="Amazon"
|
||||||
|
VERSION=$(cat /etc/issue |tr ' ' '\n' |grep [0-9])
|
||||||
fi
|
fi
|
||||||
VERSION=$(cat /etc/redhat-release| tr ' ' '\n' |grep [0-9])
|
|
||||||
else
|
else
|
||||||
if [ "$(lsb_release -si)" == "Ubuntu" ] && [ -e '/etc/debian_version' ]; then
|
if [ "$(lsb_release -si)" == "Ubuntu" ] && [ -e '/etc/debian_version' ]; then
|
||||||
OS="Ubuntu"
|
OS="Ubuntu"
|
||||||
VERSION=$(grep DISTRIB_RELEASE /etc/lsb-release| cut -f 2 -d '=')
|
VERSION=$(grep DISTRIB_RELEASE /etc/lsb-release |cut -f 2 -d '=')
|
||||||
else
|
else
|
||||||
distro=$(head -n1 /etc/issue |cut -f 1 -d ' ')
|
distro=$(head -n1 /etc/issue |cut -f 1 -d ' ')
|
||||||
if [ "$distro" = 'Debian' ]; then
|
if [ "$distro" = 'Debian' ]; then
|
||||||
|
|
135
bin/v-list-sys-mail-ssl
Executable file
135
bin/v-list-sys-mail-ssl
Executable file
|
@ -0,0 +1,135 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: list mail ssl certificate
|
||||||
|
# options: [FORMAT]
|
||||||
|
#
|
||||||
|
# The function of obtaining mail ssl files.
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Argument definition
|
||||||
|
format=${1-shell}
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
|
||||||
|
# JSON list function
|
||||||
|
json_list() {
|
||||||
|
echo '{'
|
||||||
|
echo -e "\t\"MAIL\": {"
|
||||||
|
echo " \"CRT\": \"$crt\","
|
||||||
|
echo " \"KEY\": \"$key\","
|
||||||
|
echo " \"CA\": \"$ca\","
|
||||||
|
echo " \"SUBJECT\": \"$subj\","
|
||||||
|
echo " \"ALIASES\": \"$alt_dns\","
|
||||||
|
echo " \"NOT_BEFORE\": \"$before\","
|
||||||
|
echo " \"NOT_AFTER\": \"$after\","
|
||||||
|
echo " \"SIGNATURE\": \"$signature\","
|
||||||
|
echo " \"PUB_KEY\": \"$pub_key\","
|
||||||
|
echo " \"ISSUER\": \"$issuer\""
|
||||||
|
echo -e "\t}\n}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# SHELL list function
|
||||||
|
shell_list() {
|
||||||
|
if [ ! -z "$crt" ]; then
|
||||||
|
echo -e "$crt"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$key" ]; then
|
||||||
|
echo -e "\n$key"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$crt" ]; then
|
||||||
|
echo
|
||||||
|
echo
|
||||||
|
echo "SUBJECT: $subj"
|
||||||
|
if [ ! -z "$alt_dns" ]; then
|
||||||
|
echo "ALIASES: ${alt_dns//,/ }"
|
||||||
|
fi
|
||||||
|
echo "VALID FROM: $before"
|
||||||
|
echo "VALID TIL: $after"
|
||||||
|
echo "SIGNATURE: $signature"
|
||||||
|
echo "PUB_KEY: $pub_key"
|
||||||
|
echo "ISSUER: $issuer"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# PLAIN list function
|
||||||
|
plain_list() {
|
||||||
|
if [ ! -z "$crt" ]; then
|
||||||
|
echo -e "$crt"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$key" ]; then
|
||||||
|
echo -e "\n$key"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$ca" ]; then
|
||||||
|
echo -e "\n$ca"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$crt" ]; then
|
||||||
|
echo "$subj"
|
||||||
|
echo "${alt_dns//,/ }"
|
||||||
|
echo "$before"
|
||||||
|
echo "$after"
|
||||||
|
echo "$signature"
|
||||||
|
echo "$pub_key"
|
||||||
|
echo "$issuer"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# CSV list function
|
||||||
|
csv_list() {
|
||||||
|
echo -n "CRT,KEY,CA,SUBJECT,ALIASES,NOT_BEFORE,NOT_AFTER,SIGNATURE,"
|
||||||
|
echo "PUB_KEY,ISSUER"
|
||||||
|
echo -n "\"$crt\",\"$key\",\"$ca\",\"$subj\",\"${alt_dns//,/ }\","
|
||||||
|
echo "\"$before\",\"$after\",\"$signature\",\"$pub_key\",\"$issuer\""
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Parsing SSL certificate
|
||||||
|
if [ ! -e "$VESTA/ssl/mail.crt" ] || [ ! -e "$VESTA/ssl/mail.key" ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
crt=$(cat $VESTA/ssl/mail.crt |sed ':a;N;$!ba;s/\n/\\n/g')
|
||||||
|
key=$(cat $VESTA/ssl/mail.key |sed ':a;N;$!ba;s/\n/\\n/g')
|
||||||
|
|
||||||
|
|
||||||
|
# Parsing SSL certificate details without CA
|
||||||
|
info=$(openssl x509 -text -in $VESTA/ssl/mail.crt)
|
||||||
|
subj=$(echo "$info" |grep Subject: |cut -f 2 -d =)
|
||||||
|
before=$(echo "$info" |grep Before: |sed -e "s/.*Before: //")
|
||||||
|
after=$(echo "$info" |grep "After :" |sed -e "s/.*After : //")
|
||||||
|
signature=$(echo "$info" |grep "Algorithm:" |head -n1 )
|
||||||
|
signature=$(echo "$signature"| sed -e "s/.*Algorithm: //")
|
||||||
|
pub_key=$(echo "$info" |grep Public-Key: |cut -f2 -d \( | tr -d \))
|
||||||
|
issuer=$(echo "$info" |grep Issuer: |sed -e "s/.*Issuer: //")
|
||||||
|
alt_dns=$(echo "$info" |grep DNS |sed -e 's/DNS:/\n/g' |tr -d ',')
|
||||||
|
alt_dns=$(echo "$alt_dns" |tr -d ' ' |sed -e "/^$/d")
|
||||||
|
alt_dns=$(echo "$alt_dns" |sed -e ':a;N;$!ba;s/\n/,/g')
|
||||||
|
|
||||||
|
# Listing data
|
||||||
|
case $format in
|
||||||
|
json) json_list ;;
|
||||||
|
plain) plain_list ;;
|
||||||
|
csv) csv_list ;;
|
||||||
|
shell) shell_list ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
exit
|
|
@ -191,7 +191,7 @@ fi
|
||||||
|
|
||||||
# Checking MAIL ANTIVIRUS
|
# Checking MAIL ANTIVIRUS
|
||||||
if [ ! -z "$ANTIVIRUS_SYSTEM" ] && [ "$ANTIVIRUS_SYSTEM" != 'remote' ]; then
|
if [ ! -z "$ANTIVIRUS_SYSTEM" ] && [ "$ANTIVIRUS_SYSTEM" != 'remote' ]; then
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
if [ "$ANTIVIRUS_SYSTEM" == 'clamav' ];then
|
if [ "$ANTIVIRUS_SYSTEM" == 'clamav' ];then
|
||||||
ANTIVIRUS_SYSTEM='clamd'
|
ANTIVIRUS_SYSTEM='clamd'
|
||||||
fi
|
fi
|
||||||
|
@ -220,7 +220,7 @@ if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'remote' ]; then
|
||||||
proc_name=''
|
proc_name=''
|
||||||
service="$db"
|
service="$db"
|
||||||
if [ "$service" = 'mysql' ]; then
|
if [ "$service" = 'mysql' ]; then
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
service='mysqld'
|
service='mysqld'
|
||||||
proc_name='mysqld'
|
proc_name='mysqld'
|
||||||
if [ -e "/usr/lib/systemd/system/mariadb.service" ]; then
|
if [ -e "/usr/lib/systemd/system/mariadb.service" ]; then
|
||||||
|
@ -231,7 +231,7 @@ if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'remote' ]; then
|
||||||
if [ "$service" == 'pgsql' ]; then
|
if [ "$service" == 'pgsql' ]; then
|
||||||
service='postgresql'
|
service='postgresql'
|
||||||
proc_name='postmaster'
|
proc_name='postmaster'
|
||||||
if [ ! -e "/etc/redhat-release" ]; then
|
if [ ! -d "/etc/sysconfig" ]; then
|
||||||
proc_name='postgres'
|
proc_name='postgres'
|
||||||
fi
|
fi
|
||||||
if [ ! -e '/etc/init.d/postgresql' ]; then
|
if [ ! -e '/etc/init.d/postgresql' ]; then
|
||||||
|
|
|
@ -64,7 +64,7 @@ shell_list() {
|
||||||
latest=$(wget -q -T 1 -t 1 http://c.vestacp.com/latest.txt -O -)
|
latest=$(wget -q -T 1 -t 1 http://c.vestacp.com/latest.txt -O -)
|
||||||
|
|
||||||
# Checking installed vesta version
|
# Checking installed vesta version
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
rpm_format="VERSION='%{VERSION}'"
|
rpm_format="VERSION='%{VERSION}'"
|
||||||
rpm_format="$rpm_format RELEASE='%{RELEASE}'"
|
rpm_format="$rpm_format RELEASE='%{RELEASE}'"
|
||||||
rpm_format="$rpm_format ARCH='%{ARCH}'"
|
rpm_format="$rpm_format ARCH='%{ARCH}'"
|
||||||
|
@ -89,7 +89,7 @@ data="NAME='vesta' VERSION='$VERSION' RELEASE='$RELEASE' ARCH='$ARCH'"
|
||||||
data="$data UPDATED='$UPDATED' DESCR='core package' TIME='$TIME' DATE='$DATE'"
|
data="$data UPDATED='$UPDATED' DESCR='core package' TIME='$TIME' DATE='$DATE'"
|
||||||
|
|
||||||
# Checking installed vesta-php version
|
# Checking installed vesta-php version
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
eval $(rpm --queryformat="$rpm_format" -q vesta-php)
|
eval $(rpm --queryformat="$rpm_format" -q vesta-php)
|
||||||
DATE=$(date -d @$UTIME +%F)
|
DATE=$(date -d @$UTIME +%F)
|
||||||
TIME=$(date -d @$UTIME +%T)
|
TIME=$(date -d @$UTIME +%T)
|
||||||
|
@ -107,7 +107,7 @@ data="$data ARCH='$ARCH' UPDATED='$UPDATED' DESCR='php interpreter'"
|
||||||
data="$data TIME='$TIME' DATE='$DATE'"
|
data="$data TIME='$TIME' DATE='$DATE'"
|
||||||
|
|
||||||
# Checking installed vesta-nginx version
|
# Checking installed vesta-nginx version
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
eval $(rpm --queryformat="$rpm_format" -q vesta-nginx)
|
eval $(rpm --queryformat="$rpm_format" -q vesta-nginx)
|
||||||
DATE=$(date -d @$UTIME +%F)
|
DATE=$(date -d @$UTIME +%F)
|
||||||
TIME=$(date -d @$UTIME +%T)
|
TIME=$(date -d @$UTIME +%T)
|
||||||
|
@ -126,7 +126,7 @@ data="$data TIME='$TIME' DATE='$DATE'"
|
||||||
|
|
||||||
# Checking installed vesta-ioncube version
|
# Checking installed vesta-ioncube version
|
||||||
if [ "$SOFTACULOUS" = 'yes' ]; then
|
if [ "$SOFTACULOUS" = 'yes' ]; then
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
eval $(rpm --queryformat="$rpm_format" -q vesta-ioncube)
|
eval $(rpm --queryformat="$rpm_format" -q vesta-ioncube)
|
||||||
DATE=$(date -d @$UTIME +%F)
|
DATE=$(date -d @$UTIME +%F)
|
||||||
TIME=$(date -d @$UTIME +%T)
|
TIME=$(date -d @$UTIME +%T)
|
||||||
|
@ -146,7 +146,7 @@ fi
|
||||||
|
|
||||||
# Checking installed vesta-softaculous version
|
# Checking installed vesta-softaculous version
|
||||||
if [ "$SOFTACULOUS" = 'yes' ]; then
|
if [ "$SOFTACULOUS" = 'yes' ]; then
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
eval $(rpm --queryformat="$rpm_format" -q vesta-softaculous)
|
eval $(rpm --queryformat="$rpm_format" -q vesta-softaculous)
|
||||||
DATE=$(date -d @$UTIME +%F)
|
DATE=$(date -d @$UTIME +%F)
|
||||||
TIME=$(date -d @$UTIME +%T)
|
TIME=$(date -d @$UTIME +%T)
|
||||||
|
|
|
@ -154,6 +154,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '1' "$#" 'USER [FORMAT]'
|
check_args '1' "$#" 'USER [FORMAT]'
|
||||||
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '2' "$#" 'USER BACKUP [FORMAT]'
|
check_args '2' "$#" 'USER BACKUP [FORMAT]'
|
||||||
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_valid 'backup' 'BACKUP' "$backup"
|
is_object_valid 'backup' 'BACKUP' "$backup"
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ json_list() {
|
||||||
i=1
|
i=1
|
||||||
objects=$(grep BACKUP $USER_DATA/backup.conf |wc -l)
|
objects=$(grep BACKUP $USER_DATA/backup.conf |wc -l)
|
||||||
echo "{"
|
echo "{"
|
||||||
while read str; do
|
while read -r str; do
|
||||||
eval $str
|
eval $str
|
||||||
echo -n ' "'$BACKUP'": {
|
echo -n ' "'$BACKUP'": {
|
||||||
"TYPE": "'$TYPE'",
|
"TYPE": "'$TYPE'",
|
||||||
|
|
|
@ -23,7 +23,10 @@ json_list() {
|
||||||
objects=$(echo "$logs" |wc -l)
|
objects=$(echo "$logs" |wc -l)
|
||||||
echo "{"
|
echo "{"
|
||||||
for str in $logs; do
|
for str in $logs; do
|
||||||
eval $str
|
ID=$(echo "$str" |cut -f 2 -d \')
|
||||||
|
DATE=$(echo "$str" |cut -f 4 -d \')
|
||||||
|
TIME=$(echo "$str" |cut -f 6 -d \')
|
||||||
|
CMD=$(echo "$str" |cut -f 8 -d \')
|
||||||
CMD=${CMD//\"/\\\"}
|
CMD=${CMD//\"/\\\"}
|
||||||
echo -n ' "'$ID'": {
|
echo -n ' "'$ID'": {
|
||||||
"CMD": "'$CMD'",
|
"CMD": "'$CMD'",
|
||||||
|
@ -46,13 +49,9 @@ shell_list() {
|
||||||
echo "DATE~TIME~CMD"
|
echo "DATE~TIME~CMD"
|
||||||
echo "----~----~---"
|
echo "----~----~---"
|
||||||
for str in $logs; do
|
for str in $logs; do
|
||||||
eval $str
|
DATE=$(echo "$str" |cut -f 4 -d \')
|
||||||
if [ -z "$DATE" ]; then
|
TIME=$(echo "$str" |cut -f 6 -d \')
|
||||||
DATE='no'
|
CMD=$(echo "$str" |cut -f 8 -d \')
|
||||||
fi
|
|
||||||
if [ -z "$TIME" ]; then
|
|
||||||
TIME='no'
|
|
||||||
fi
|
|
||||||
echo "$DATE~$TIME~$CMD"
|
echo "$DATE~$TIME~$CMD"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
@ -61,7 +60,9 @@ shell_list() {
|
||||||
plain_list() {
|
plain_list() {
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
for str in $logs; do
|
for str in $logs; do
|
||||||
eval $str
|
DATE=$(echo "$str" |cut -f 4 -d \')
|
||||||
|
TIME=$(echo "$str" |cut -f 6 -d \')
|
||||||
|
CMD=$(echo "$str" |cut -f 8 -d \')
|
||||||
echo -e "$ID\t$CMD\t$UNDO\t$TIME\t$DATE"
|
echo -e "$ID\t$CMD\t$UNDO\t$TIME\t$DATE"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
@ -71,7 +72,9 @@ csv_list() {
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
echo "ID,CMD,UNDO,TIME,DATE"
|
echo "ID,CMD,UNDO,TIME,DATE"
|
||||||
for str in $logs; do
|
for str in $logs; do
|
||||||
eval $str
|
DATE=$(echo "$str" |cut -f 4 -d \')
|
||||||
|
TIME=$(echo "$str" |cut -f 6 -d \')
|
||||||
|
CMD=$(echo "$str" |cut -f 8 -d \')
|
||||||
echo "$ID,\"$CMD\",\"$UNDO\",$TIME,$DATE"
|
echo "$ID,\"$CMD\",\"$UNDO\",$TIME,$DATE"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ json_list() {
|
||||||
echo '{'
|
echo '{'
|
||||||
echo ' "'$PACKAGE'": {
|
echo ' "'$PACKAGE'": {
|
||||||
"WEB_TEMPLATE": "'$WEB_TEMPLATE'",
|
"WEB_TEMPLATE": "'$WEB_TEMPLATE'",
|
||||||
|
"BACKEND_TEMPLATE": "'$BACKEND_TEMPLATE'",
|
||||||
"PROXY_TEMPLATE": "'$PROXY_TEMPLATE'",
|
"PROXY_TEMPLATE": "'$PROXY_TEMPLATE'",
|
||||||
"DNS_TEMPLATE": "'$DNS_TEMPLATE'",
|
"DNS_TEMPLATE": "'$DNS_TEMPLATE'",
|
||||||
"WEB_DOMAINS": "'$WEB_DOMAINS'",
|
"WEB_DOMAINS": "'$WEB_DOMAINS'",
|
||||||
|
@ -47,6 +48,7 @@ json_list() {
|
||||||
shell_list() {
|
shell_list() {
|
||||||
echo "PACKAGE: $PACKAGE"
|
echo "PACKAGE: $PACKAGE"
|
||||||
echo "WEB TEMPLATE: $WEB_TEMPLATE"
|
echo "WEB TEMPLATE: $WEB_TEMPLATE"
|
||||||
|
echo "BACKEND_TEMPLATE: $BACKEND_TEMPLATE"
|
||||||
echo "PROXY TEMPLATE: $PROXY_TEMPLATE"
|
echo "PROXY TEMPLATE: $PROXY_TEMPLATE"
|
||||||
echo "DNS TEMPLATE: $DNS_TEMPLATE"
|
echo "DNS TEMPLATE: $DNS_TEMPLATE"
|
||||||
echo "WEB DOMAINS: $WEB_DOMAINS"
|
echo "WEB DOMAINS: $WEB_DOMAINS"
|
||||||
|
@ -68,7 +70,7 @@ shell_list() {
|
||||||
|
|
||||||
# PLAIN list function
|
# PLAIN list function
|
||||||
plain_list() {
|
plain_list() {
|
||||||
echo -ne "$PACKAGE\t$WEB_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
|
echo -ne "$PACKAGE\t$WEB_TEMPLATE\t$BACKEND_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
|
||||||
echo -ne "$WEB_DOMAINS\t$WEB_ALIASES\t$DNS_DOMAINS\t$DNS_RECORDS\t"
|
echo -ne "$WEB_DOMAINS\t$WEB_ALIASES\t$DNS_DOMAINS\t$DNS_RECORDS\t"
|
||||||
echo -ne "$MAIL_DOMAINS\t$MAIL_ACCOUNTS\t$DATABASES\t$CRON_JOBS\t"
|
echo -ne "$MAIL_DOMAINS\t$MAIL_ACCOUNTS\t$DATABASES\t$CRON_JOBS\t"
|
||||||
echo -e "$DISK_QUOTA\t$BANDWIDTH\t$NS\t$SHELL\t$BACKUPS\t$TIME\t$DATE"
|
echo -e "$DISK_QUOTA\t$BANDWIDTH\t$NS\t$SHELL\t$BACKUPS\t$TIME\t$DATE"
|
||||||
|
@ -76,11 +78,11 @@ plain_list() {
|
||||||
|
|
||||||
# CSV list function
|
# CSV list function
|
||||||
csv_list() {
|
csv_list() {
|
||||||
echo -n "PACKAGE,WEB_TEMPLATE,PROXY_TEMPLATE,DNS_TEMPLATE,"
|
echo -n "PACKAGE,WEB_TEMPLATE,BACKEND_TEMPLATE,PROXY_TEMPLATE,DNS_TEMPLATE,"
|
||||||
echo -n "WEB_DOMAINS,WEB_ALIASES,DNS_DOMAINS,DNS_RECORDS,"
|
echo -n "WEB_DOMAINS,WEB_ALIASES,DNS_DOMAINS,DNS_RECORDS,"
|
||||||
echo -n "MAIL_DOMAINS,MAIL_ACCOUNTS,DATABASES,CRON_JOBS,"
|
echo -n "MAIL_DOMAINS,MAIL_ACCOUNTS,DATABASES,CRON_JOBS,"
|
||||||
echo "DISK_QUOTA,BANDWIDTH,NS,SHELL,BACKUPS,TIME,DATE"
|
echo "DISK_QUOTA,BANDWIDTH,NS,SHELL,BACKUPS,TIME,DATE"
|
||||||
echo -n "$PACKAGE,$WEB_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
|
echo -n "$PACKAGE,$WEB_TEMPLATE,$BACKEND_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
|
||||||
echo -n "$WEB_DOMAINS,$WEB_ALIASES,$DNS_DOMAINS,$DNS_RECORDS,"
|
echo -n "$WEB_DOMAINS,$WEB_ALIASES,$DNS_DOMAINS,$DNS_RECORDS,"
|
||||||
echo -n "$MAIL_DOMAINS,$MAIL_ACCOUNTS,$DATABASES,$CRON_JOBS,"
|
echo -n "$MAIL_DOMAINS,$MAIL_ACCOUNTS,$DATABASES,$CRON_JOBS,"
|
||||||
echo "$DISK_QUOTA,$BANDWIDTH,\"$NS\",$SHELL,$BACKUPS,$TIME,$DATE"
|
echo "$DISK_QUOTA,$BANDWIDTH,\"$NS\",$SHELL,$BACKUPS,$TIME,$DATE"
|
||||||
|
|
|
@ -27,6 +27,7 @@ json_list() {
|
||||||
source $VESTA/data/packages/$package
|
source $VESTA/data/packages/$package
|
||||||
echo -n ' "'$PACKAGE'": {
|
echo -n ' "'$PACKAGE'": {
|
||||||
"WEB_TEMPLATE": "'$WEB_TEMPLATE'",
|
"WEB_TEMPLATE": "'$WEB_TEMPLATE'",
|
||||||
|
"BACKEND_TEMPLATE": "'$BACKEND_TEMPLATE'",
|
||||||
"PROXY_TEMPLATE": "'$PROXY_TEMPLATE'",
|
"PROXY_TEMPLATE": "'$PROXY_TEMPLATE'",
|
||||||
"DNS_TEMPLATE": "'$DNS_TEMPLATE'",
|
"DNS_TEMPLATE": "'$DNS_TEMPLATE'",
|
||||||
"WEB_DOMAINS": "'$WEB_DOMAINS'",
|
"WEB_DOMAINS": "'$WEB_DOMAINS'",
|
||||||
|
@ -65,7 +66,7 @@ shell_list() {
|
||||||
package_data=$(cat $VESTA/data/packages/$package)
|
package_data=$(cat $VESTA/data/packages/$package)
|
||||||
package_data=$(echo "$package_data" |sed -e 's/unlimited/unlim/g')
|
package_data=$(echo "$package_data" |sed -e 's/unlimited/unlim/g')
|
||||||
eval $package_data
|
eval $package_data
|
||||||
echo -n "$PACKAGE $WEB_TEMPLATE $WEB_DOMAINS $DNS_DOMAINS "
|
echo -n "$PACKAGE $WEB_TEMPLATE $BACKEND_TEMPLATE $WEB_DOMAINS $DNS_DOMAINS "
|
||||||
echo "$MAIL_DOMAINS $DATABASES $SHELL $DISK_QUOTA $BANDWIDTH"
|
echo "$MAIL_DOMAINS $DATABASES $SHELL $DISK_QUOTA $BANDWIDTH"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
@ -75,7 +76,7 @@ plain_list() {
|
||||||
for package in $packages; do
|
for package in $packages; do
|
||||||
source $VESTA/data/packages/$package
|
source $VESTA/data/packages/$package
|
||||||
PACKAGE=${package/.pkg/}
|
PACKAGE=${package/.pkg/}
|
||||||
echo -ne "$PACKAGE\t$WEB_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
|
echo -ne "$PACKAGE\t$WEB_TEMPLATE\t$BACKEND_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
|
||||||
echo -ne "$WEB_DOMAINS\t$WEB_ALIASES\t$DNS_DOMAINS\t$DNS_RECORDS\t"
|
echo -ne "$WEB_DOMAINS\t$WEB_ALIASES\t$DNS_DOMAINS\t$DNS_RECORDS\t"
|
||||||
echo -ne "$MAIL_DOMAINS\t$MAIL_ACCOUNTS\t$DATABASES\t$CRON_JOBS\t"
|
echo -ne "$MAIL_DOMAINS\t$MAIL_ACCOUNTS\t$DATABASES\t$CRON_JOBS\t"
|
||||||
echo -e "$DISK_QUOTA\t$BANDWIDTH\t$NS\t$SHELL\t$BACKUPS\t$TIME\t$DATE"
|
echo -e "$DISK_QUOTA\t$BANDWIDTH\t$NS\t$SHELL\t$BACKUPS\t$TIME\t$DATE"
|
||||||
|
@ -84,13 +85,13 @@ plain_list() {
|
||||||
|
|
||||||
# CSV list function
|
# CSV list function
|
||||||
csv_list() {
|
csv_list() {
|
||||||
echo -n "PACKAGE,WEB_TEMPLATE,PROXY_TEMPLATE,DNS_TEMPLATE,"
|
echo -n "PACKAGE,WEB_TEMPLATE,BACKEND_TEMPLATE,PROXY_TEMPLATE,DNS_TEMPLATE,"
|
||||||
echo -n "WEB_DOMAINS,WEB_ALIASES,DNS_DOMAINS,DNS_RECORDS,"
|
echo -n "WEB_DOMAINS,WEB_ALIASES,DNS_DOMAINS,DNS_RECORDS,"
|
||||||
echo -n "MAIL_DOMAINS,MAIL_ACCOUNTS,DATABASES,CRON_JOBS,"
|
echo -n "MAIL_DOMAINS,MAIL_ACCOUNTS,DATABASES,CRON_JOBS,"
|
||||||
echo "DISK_QUOTA,BANDWIDTH,NS,SHELL,BACKUPS,TIME,DATE"
|
echo "DISK_QUOTA,BANDWIDTH,NS,SHELL,BACKUPS,TIME,DATE"
|
||||||
for package in $packages; do
|
for package in $packages; do
|
||||||
PACKAGE=${package/.pkg/}
|
PACKAGE=${package/.pkg/}
|
||||||
echo -n "$PACKAGE,$WEB_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
|
echo -n "$PACKAGE,$WEB_TEMPLATE,$BACKEND_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
|
||||||
echo -n "$WEB_DOMAINS,$WEB_ALIASES,$DNS_DOMAINS,$DNS_RECORDS,"
|
echo -n "$WEB_DOMAINS,$WEB_ALIASES,$DNS_DOMAINS,$DNS_RECORDS,"
|
||||||
echo -n "$MAIL_DOMAINS,$MAIL_ACCOUNTS,$DATABASES,$CRON_JOBS,"
|
echo -n "$MAIL_DOMAINS,$MAIL_ACCOUNTS,$DATABASES,$CRON_JOBS,"
|
||||||
echo "$DISK_QUOTA,$BANDWIDTH,\"$NS\",$SHELL,$BACKUPS,$TIME,$DATE"
|
echo "$DISK_QUOTA,$BANDWIDTH,\"$NS\",$SHELL,$BACKUPS,$TIME,$DATE"
|
||||||
|
|
|
@ -115,6 +115,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '1' "$#" 'USER [FORMAT]'
|
check_args '1' "$#" 'USER [FORMAT]'
|
||||||
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,14 @@ format=${1-shell}
|
||||||
# JSON list function
|
# JSON list function
|
||||||
json_list() {
|
json_list() {
|
||||||
echo '{'
|
echo '{'
|
||||||
object_count=$(grep '@' /etc/passwd |wc -l)
|
|
||||||
i=1
|
i=1
|
||||||
while read USER; do
|
while read USER; do
|
||||||
|
if [ ! -f "$VESTA/data/users/$USER/user.conf" ]; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
|
if [ $i -gt 1 ]; then
|
||||||
|
echo ","
|
||||||
|
fi
|
||||||
source $VESTA/data/users/$USER/user.conf
|
source $VESTA/data/users/$USER/user.conf
|
||||||
echo -n ' "'$USER'": {
|
echo -n ' "'$USER'": {
|
||||||
"FNAME": "'$FNAME'",
|
"FNAME": "'$FNAME'",
|
||||||
|
@ -74,14 +79,8 @@ json_list() {
|
||||||
"TIME": "'$TIME'",
|
"TIME": "'$TIME'",
|
||||||
"DATE": "'$DATE'"
|
"DATE": "'$DATE'"
|
||||||
}'
|
}'
|
||||||
if [ "$i" -lt "$object_count" ]; then
|
|
||||||
echo ','
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
((i++))
|
((i++))
|
||||||
done < <(grep '@' /etc/passwd |cut -f1 -d:)
|
done < <(grep '@' /etc/passwd |cut -f1 -d:)
|
||||||
|
|
||||||
echo '}'
|
echo '}'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +89,9 @@ shell_list() {
|
||||||
echo "USER PKG WEB DNS MAIL DB DISK BW SPND DATE"
|
echo "USER PKG WEB DNS MAIL DB DISK BW SPND DATE"
|
||||||
echo "---- --- --- --- --- -- ---- -- ---- ----"
|
echo "---- --- --- --- --- -- ---- -- ---- ----"
|
||||||
while read USER; do
|
while read USER; do
|
||||||
|
if [ ! -f "$VESTA/data/users/$USER/user.conf" ]; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
source $VESTA/data/users/$USER/user.conf
|
source $VESTA/data/users/$USER/user.conf
|
||||||
echo -n "$USER $PACKAGE $U_WEB_DOMAINS $U_DNS_DOMAINS $U_MAIL_DOMAINS"
|
echo -n "$USER $PACKAGE $U_WEB_DOMAINS $U_DNS_DOMAINS $U_MAIL_DOMAINS"
|
||||||
echo " $U_DATABASES $U_DISK $U_BANDWIDTH $SUSPENDED $DATE"
|
echo " $U_DATABASES $U_DISK $U_BANDWIDTH $SUSPENDED $DATE"
|
||||||
|
@ -99,6 +101,9 @@ shell_list() {
|
||||||
# PLAIN list function
|
# PLAIN list function
|
||||||
plain_list() {
|
plain_list() {
|
||||||
while read USER; do
|
while read USER; do
|
||||||
|
if [ ! -f "$VESTA/data/users/$USER/user.conf" ]; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
source $VESTA/data/users/$USER/user.conf
|
source $VESTA/data/users/$USER/user.conf
|
||||||
echo -ne "$USER\t$FNAME\t$LNAME\t$PACKAGE\t$WEB_TEMPLATE\t"
|
echo -ne "$USER\t$FNAME\t$LNAME\t$PACKAGE\t$WEB_TEMPLATE\t"
|
||||||
echo -ne "$BACKEND_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
|
echo -ne "$BACKEND_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
|
||||||
|
@ -131,6 +136,9 @@ csv_list() {
|
||||||
echo -n "U_MAIL_DOMAINS,U_MAIL_DKIM,U_MAIL_ACCOUNTS,U_DATABASES"
|
echo -n "U_MAIL_DOMAINS,U_MAIL_DKIM,U_MAIL_ACCOUNTS,U_DATABASES"
|
||||||
echo "U_CRON_JOBS,U_BACKUPS,LANGUAGE,TIME,DATE"
|
echo "U_CRON_JOBS,U_BACKUPS,LANGUAGE,TIME,DATE"
|
||||||
while read USER; do
|
while read USER; do
|
||||||
|
if [ ! -f "$VESTA/data/users/$USER/user.conf" ]; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
source $VESTA/data/users/$USER/user.conf
|
source $VESTA/data/users/$USER/user.conf
|
||||||
echo -n "$USER,\"$FNAME\",\"$LNAME\",$PACKAGE,$WEB_TEMPLATE,"
|
echo -n "$USER,\"$FNAME\",\"$LNAME\",$PACKAGE,$WEB_TEMPLATE,"
|
||||||
echo -n "$BACKEND_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
|
echo -n "$BACKEND_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
|
||||||
|
@ -151,6 +159,9 @@ csv_list() {
|
||||||
# Raw list function
|
# Raw list function
|
||||||
raw_list() {
|
raw_list() {
|
||||||
while read USER; do
|
while read USER; do
|
||||||
|
if [ ! -f "$VESTA/data/users/$USER/user.conf" ]; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
echo $VESTA/data/users/$USER/user.conf
|
echo $VESTA/data/users/$USER/user.conf
|
||||||
cat $VESTA/data/users/$USER/user.conf
|
cat $VESTA/data/users/$USER/user.conf
|
||||||
done < <(grep '@' /etc/passwd |cut -f1 -d:)
|
done < <(grep '@' /etc/passwd |cut -f1 -d:)
|
||||||
|
|
|
@ -110,6 +110,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
||||||
|
is_format_valid 'user' 'domain'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_valid 'web' 'DOMAIN' "$domain"
|
is_object_valid 'web' 'DOMAIN' "$domain"
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ source $VESTA/func/main.sh
|
||||||
|
|
||||||
# JSON list function
|
# JSON list function
|
||||||
json_list() {
|
json_list() {
|
||||||
|
issuer=$(echo "$issuer" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
|
||||||
echo '{'
|
echo '{'
|
||||||
echo -e "\t\"$domain\": {"
|
echo -e "\t\"$domain\": {"
|
||||||
echo " \"CRT\": \"$crt\","
|
echo " \"CRT\": \"$crt\","
|
||||||
|
@ -97,6 +98,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
check_args '2' "$#" 'USER DOMAIN [FORMAT]'
|
||||||
|
is_format_valid 'user' 'domain'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_object_valid 'web' 'DOMAIN' "$domain"
|
is_object_valid 'web' 'DOMAIN' "$domain"
|
||||||
|
|
||||||
|
@ -110,7 +112,7 @@ if [ -e "$USER_DATA/ssl/$domain.crt" ]; then
|
||||||
crt=$(cat $USER_DATA/ssl/$domain.crt |sed ':a;N;$!ba;s/\n/\\n/g')
|
crt=$(cat $USER_DATA/ssl/$domain.crt |sed ':a;N;$!ba;s/\n/\\n/g')
|
||||||
|
|
||||||
info=$(openssl x509 -text -in $USER_DATA/ssl/$domain.crt)
|
info=$(openssl x509 -text -in $USER_DATA/ssl/$domain.crt)
|
||||||
subj=$(echo "$info" |grep Subject: |cut -f 2 -d =)
|
subj=$(echo "$info" |grep Subject: |cut -f 2 -d =|cut -f 2 -d \")
|
||||||
before=$(echo "$info" |grep Before: |sed -e "s/.*Before: //")
|
before=$(echo "$info" |grep Before: |sed -e "s/.*Before: //")
|
||||||
after=$(echo "$info" |grep "After :" |sed -e "s/.*After : //")
|
after=$(echo "$info" |grep "After :" |sed -e "s/.*After : //")
|
||||||
signature=$(echo "$info" |grep "Algorithm:" |head -n1 )
|
signature=$(echo "$info" |grep "Algorithm:" |head -n1 )
|
||||||
|
|
|
@ -100,6 +100,7 @@ csv_list() {
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '1' "$#" 'USER [FORMAT]'
|
check_args '1' "$#" 'USER [FORMAT]'
|
||||||
|
is_format_valid 'user'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,11 @@ if [ ! -z "$src_file" ]; then
|
||||||
echo "Error: invalid source path $src_file"
|
echo "Error: invalid source path $src_file"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
spath=$(echo "$rpath" |egrep "/etc|/var/lib")
|
||||||
|
if [ -z "$spath" ]; then
|
||||||
|
echo "Error: invalid source path $src_file"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Reading conf
|
# Reading conf
|
||||||
|
|
|
@ -37,7 +37,7 @@ is_object_unsuspended 'user' 'USER' "$user"
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Deleting old web configs
|
# Deleting old web configs
|
||||||
sed -i "/.*\/$user\//d" /etc/$WEB_SYSTEM/conf.d/vesta.conf
|
sed -i "/.*\/$user\/conf\/web\//d" /etc/$WEB_SYSTEM/conf.d/vesta.conf
|
||||||
if [ -e "$HOMEDIR/$user/conf/web/$WEB_SYSTEM.conf" ]; then
|
if [ -e "$HOMEDIR/$user/conf/web/$WEB_SYSTEM.conf" ]; then
|
||||||
rm $HOMEDIR/$user/conf/web/$WEB_SYSTEM.conf
|
rm $HOMEDIR/$user/conf/web/$WEB_SYSTEM.conf
|
||||||
fi
|
fi
|
||||||
|
@ -47,7 +47,7 @@ fi
|
||||||
|
|
||||||
# Deleting old proxy configs
|
# Deleting old proxy configs
|
||||||
if [ ! -z "$PROXY_SYSTEM" ]; then
|
if [ ! -z "$PROXY_SYSTEM" ]; then
|
||||||
sed -i "/.*\/$user\//d" /etc/$PROXY_SYSTEM/conf.d/vesta.conf
|
sed -i "/.*\/$user\/conf\/web\//d" /etc/$PROXY_SYSTEM/conf.d/vesta.conf
|
||||||
|
|
||||||
if [ -e "$HOMEDIR/$user/conf/web/$PROXY_SYSTEM.conf" ]; then
|
if [ -e "$HOMEDIR/$user/conf/web/$PROXY_SYSTEM.conf" ]; then
|
||||||
rm $HOMEDIR/$user/conf/web/$PROXY_SYSTEM.conf
|
rm $HOMEDIR/$user/conf/web/$PROXY_SYSTEM.conf
|
||||||
|
|
|
@ -50,7 +50,13 @@ if [ -z "$PROXY_SYSTEM" ] || [ "$PROXY_SYSTEM" = 'remote' ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Restart system
|
# Restart system
|
||||||
service $PROXY_SYSTEM restart >/dev/null 2>&1
|
if [ ! -f "/etc/debian_version" ]; then
|
||||||
|
service $PROXY_SYSTEM restart >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
systemctl reset-failed $PROXY_SYSTEM
|
||||||
|
systemctl restart $PROXY_SYSTEM > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
send_email_report
|
send_email_report
|
||||||
check_result $E_RESTART "$PROXY_SYSTEM restart failed"
|
check_result $E_RESTART "$PROXY_SYSTEM restart failed"
|
||||||
|
|
|
@ -50,7 +50,7 @@ if [ -z "$WEB_BACKEND" ] || [ "$WEB_BACKEND" = 'remote' ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Restart system
|
# Restart system
|
||||||
php_fpm=$(ls /etc/init.d/php*-fpm* 2>/dev/null |cut -f 4 -d /)
|
php_fpm=$(ls /etc/init.d/php*-fpm* 2>/dev/null |cut -f 4 -d / |head -n 1)
|
||||||
if [ -z "$php_fpm" ]; then
|
if [ -z "$php_fpm" ]; then
|
||||||
service $WEB_BACKEND restart >/dev/null 2>&1
|
service $WEB_BACKEND restart >/dev/null 2>&1
|
||||||
else
|
else
|
||||||
|
|
|
@ -56,6 +56,7 @@ ftpc() {
|
||||||
quote USER $USERNAME
|
quote USER $USERNAME
|
||||||
quote PASS $PASSWORD
|
quote PASS $PASSWORD
|
||||||
binary
|
binary
|
||||||
|
lcd $BACKUP
|
||||||
$1
|
$1
|
||||||
$2
|
$2
|
||||||
$3
|
$3
|
||||||
|
@ -229,8 +230,12 @@ while [ "$la" -ge "$BACKUP_LA_LIMIT" ]; do
|
||||||
(( ++i))
|
(( ++i))
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ -z "$BACKUP_TEMP" ]; then
|
||||||
|
BACKUP_TEMP=$BACKUP
|
||||||
|
fi
|
||||||
|
|
||||||
# Creating temporary directory
|
# Creating temporary directory
|
||||||
tmpdir=$(mktemp -p /tmp -d)
|
tmpdir=$(mktemp -p $BACKUP_TEMP -d)
|
||||||
if [ "$?" -ne 0 ]; then
|
if [ "$?" -ne 0 ]; then
|
||||||
echo "Can't create tmp dir $tmpdir" |$SENDMAIL -s "$subj" $email $notify
|
echo "Can't create tmp dir $tmpdir" |$SENDMAIL -s "$subj" $email $notify
|
||||||
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
||||||
|
@ -285,7 +290,7 @@ if [ "$web" != 'no' ] && [ ! -z "$WEB_SYSTEM" ]; then
|
||||||
if [ -z "$web" ] || [ "$web" = '*' ]; then
|
if [ -z "$web" ] || [ "$web" = '*' ]; then
|
||||||
domains="$backup_domains"
|
domains="$backup_domains"
|
||||||
else
|
else
|
||||||
echo "$web" |tr ',' '\n' > $tmpdir/selected.txt
|
echo "$web" | tr ',' '\n' | sed -e "s/^/^/" > $tmpdir/selected.txt
|
||||||
domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
|
domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -373,8 +378,10 @@ if [ "$web" != 'no' ] && [ ! -z "$WEB_SYSTEM" ]; then
|
||||||
|
|
||||||
# Copying ssl certificates
|
# Copying ssl certificates
|
||||||
if [ "$SSL" = 'yes' ]; then
|
if [ "$SSL" = 'yes' ]; then
|
||||||
for crt in $(ls $tmpdir/web/$domain/conf |grep ssl); do
|
certificates=$(ls $tmpdir/web/$domain/conf| grep ssl)
|
||||||
crt=$(echo "$crt" |sed "s/ssl.//")
|
certificates=$(echo "$certificates" |grep $domain)
|
||||||
|
for crt in $certificates; do
|
||||||
|
crt=$(echo $crt|sed -e "s/ssl.//")
|
||||||
cp -f $tmpdir/web/$domain/conf/ssl.$crt $USER_DATA/ssl/$crt
|
cp -f $tmpdir/web/$domain/conf/ssl.$crt $USER_DATA/ssl/$crt
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
@ -400,15 +407,21 @@ if [ "$web" != 'no' ] && [ ! -z "$WEB_SYSTEM" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Restoring web domain data
|
# Restoring web domain data
|
||||||
tar -xzpf $tmpdir/web/$domain/domain_data.tar.gz \
|
chown $user $tmpdir
|
||||||
-C $HOMEDIR/$user/web/$domain/
|
chmod u+w $HOMEDIR/$user/web/$domain
|
||||||
if [ "$?" -ne 0 ]; then
|
sudo -u $user tar -xzpf $tmpdir/web/$domain/domain_data.tar.gz \
|
||||||
rm -rf $tmpdir
|
-C $HOMEDIR/$user/web/$domain/ --exclude=./logs/* \
|
||||||
error="can't unpack $domain data tarball"
|
2> $HOMEDIR/$user/web/$domain/restore_errors.log
|
||||||
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
if [ -e "$HOMEDIR/$user/web/$domain/restore_errors.log" ]; then
|
||||||
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
chown $user:$user $HOMEDIR/$user/web/$domain/restore_errors.log
|
||||||
check_result "$E_PARSING" "$error"
|
|
||||||
fi
|
fi
|
||||||
|
#if [ "$?" -ne 0 ]; then
|
||||||
|
# rm -rf $tmpdir
|
||||||
|
# error="can't unpack $domain data tarball"
|
||||||
|
# echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
||||||
|
# sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
||||||
|
# check_result "$E_PARSING" "$error"
|
||||||
|
#fi
|
||||||
|
|
||||||
# Applying Fix for tar < 1.24
|
# Applying Fix for tar < 1.24
|
||||||
find $HOMEDIR/$user/web/$domain -type d \
|
find $HOMEDIR/$user/web/$domain -type d \
|
||||||
|
@ -446,7 +459,7 @@ if [ "$dns" != 'no' ] && [ ! -z "$DNS_SYSTEM" ]; then
|
||||||
if [ -z "$dns" ] || [ "$dns" = '*' ]; then
|
if [ -z "$dns" ] || [ "$dns" = '*' ]; then
|
||||||
domains="$backup_domains"
|
domains="$backup_domains"
|
||||||
else
|
else
|
||||||
echo "$dns" |tr ',' '\n' > $tmpdir/selected.txt
|
echo "$dns" | tr ',' '\n' | sed -e "s/^/^/" > $tmpdir/selected.txt
|
||||||
domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
|
domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -526,7 +539,7 @@ if [ "$mail" != 'no' ] && [ ! -z "$MAIL_SYSTEM" ]; then
|
||||||
if [ -z "$mail" ] || [ "$mail" = '*' ]; then
|
if [ -z "$mail" ] || [ "$mail" = '*' ]; then
|
||||||
domains="$backup_domains"
|
domains="$backup_domains"
|
||||||
else
|
else
|
||||||
echo "$mail" |tr ',' '\n' > $tmpdir/selected.txt
|
echo "$mail" | tr ',' '\n' | sed -e "s/^/^/" > $tmpdir/selected.txt
|
||||||
domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
|
domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -586,7 +599,9 @@ if [ "$mail" != 'no' ] && [ ! -z "$MAIL_SYSTEM" ]; then
|
||||||
|
|
||||||
# Restoring emails
|
# Restoring emails
|
||||||
if [ -e "$tmpdir/mail/$domain/accounts.tar.gz" ]; then
|
if [ -e "$tmpdir/mail/$domain/accounts.tar.gz" ]; then
|
||||||
tar -xzpf $tmpdir/mail/$domain/accounts.tar.gz \
|
chown $user $tmpdir
|
||||||
|
chmod u+w $HOMEDIR/$user/mail/$domain_idn
|
||||||
|
sudo -u $user tar -xzpf $tmpdir/mail/$domain/accounts.tar.gz \
|
||||||
-C $HOMEDIR/$user/mail/$domain_idn/
|
-C $HOMEDIR/$user/mail/$domain_idn/
|
||||||
if [ "$?" -ne 0 ]; then
|
if [ "$?" -ne 0 ]; then
|
||||||
rm -rf $tmpdir
|
rm -rf $tmpdir
|
||||||
|
@ -621,7 +636,7 @@ if [ "$db" != 'no' ] && [ ! -z "$DB_SYSTEM" ]; then
|
||||||
if [ -z "$db" ] || [ "$db" = '*' ]; then
|
if [ -z "$db" ] || [ "$db" = '*' ]; then
|
||||||
databases="$backup_databases"
|
databases="$backup_databases"
|
||||||
else
|
else
|
||||||
echo "$db" |tr ',' '\n' > $tmpdir/selected.txt
|
echo "$db" |tr ',' '\n' | sed -e "s/$/$/" > $tmpdir/selected.txt
|
||||||
databases=$(echo "$backup_databases" |egrep -f $tmpdir/selected.txt)
|
databases=$(echo "$backup_databases" |egrep -f $tmpdir/selected.txt)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,19 @@ udir=$8
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
source $VESTA/conf/vesta.conf
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
# Check backup ownership function
|
||||||
|
is_backup_available() {
|
||||||
|
passed=false
|
||||||
|
if [[ $2 =~ ^$1.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]-[0-9][0-9].tar$ ]]; then
|
||||||
|
passed=true
|
||||||
|
elif [[ $2 =~ ^$1.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].tar$ ]]; then
|
||||||
|
passed=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $passed = false ]; then
|
||||||
|
check_result $E_FORBIDEN "permission denied"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Verifications #
|
# Verifications #
|
||||||
|
@ -34,6 +47,7 @@ is_system_enabled "$BACKUP_SYSTEM" 'BACKUP_SYSTEM'
|
||||||
is_object_valid 'user' 'USER' "$user"
|
is_object_valid 'user' 'USER' "$user"
|
||||||
is_backup_enabled
|
is_backup_enabled
|
||||||
is_backup_scheduled 'restore'
|
is_backup_scheduled 'restore'
|
||||||
|
is_backup_available "$user" "$backup"
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
|
@ -84,6 +84,22 @@ OLD_IFS=$IFS
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
|
|
||||||
# User loop
|
# User loop
|
||||||
|
search_user=$(ls -1 $VESTA/data/users |grep $object)
|
||||||
|
for user in $search_user; do
|
||||||
|
if [ -e "$VESTA/data/users/$user/user.conf" ]; then
|
||||||
|
source $VESTA/data/users/$user/user.conf
|
||||||
|
((i ++))
|
||||||
|
type=$(echo $type|cut -f1 -d \.)
|
||||||
|
str="ID='$i' USER='$user' TYPE='user' KEY='$user'"
|
||||||
|
str="$str RESULT='$user' ALIAS=''"
|
||||||
|
str="$str LINK='$user' PARENT=''"
|
||||||
|
str="$str SUSPENDED='$SUSPENDED' TIME='$TIME'"
|
||||||
|
str="$str DATE='$DATE'"
|
||||||
|
echo $str >> $conf
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# User data loop
|
||||||
for user in $(ls $VESTA/data/users/); do
|
for user in $(ls $VESTA/data/users/); do
|
||||||
# Search query
|
# Search query
|
||||||
search=$(grep "$object" \
|
search=$(grep "$object" \
|
||||||
|
@ -154,12 +170,13 @@ for user in $(ls $VESTA/data/users/); do
|
||||||
|
|
||||||
# DNS Records
|
# DNS Records
|
||||||
if [ "$type" = 'dns' ]; then
|
if [ "$type" = 'dns' ]; then
|
||||||
if [ -n "$(echo $RECORD |grep $object)" ]; then
|
if [ -n "$(echo $RECORD $VALUE |grep $object)" ]; then
|
||||||
|
dom="$(echo $row|cut -f 1 -d :|cut -f 9 -d /|sed 's/.conf//')"
|
||||||
key="RECORD"
|
key="RECORD"
|
||||||
result="$RECORD.$DOMAIN"
|
result="$RECORD.$dom"
|
||||||
suspended=$SUSPENDED
|
suspended=$SUSPENDED
|
||||||
object_link=$ID
|
object_link=$ID
|
||||||
object_parent=$DOMAIN
|
object_parent=$dom
|
||||||
object_time=$TIME
|
object_time=$TIME
|
||||||
object_date=$DATE
|
object_date=$DATE
|
||||||
((i ++))
|
((i ++))
|
||||||
|
|
93
bin/v-search-ssl-certificates
Executable file
93
bin/v-search-ssl-certificates
Executable file
|
@ -0,0 +1,93 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# info: search ssl certificates
|
||||||
|
# options: [FORMAT]
|
||||||
|
#
|
||||||
|
# The function to obtain the list of available ssl certificates.
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Variable&Function #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Argument definition
|
||||||
|
format=${1-shell}
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
source $VESTA/func/main.sh
|
||||||
|
|
||||||
|
# JSON list function
|
||||||
|
json_list() {
|
||||||
|
IFS=$'\n'
|
||||||
|
objects=$(echo "$search_cmd" |wc -l)
|
||||||
|
i=1
|
||||||
|
echo '['
|
||||||
|
for str in $search_cmd; do
|
||||||
|
eval $str
|
||||||
|
if [ "$i" -lt "$objects" ]; then
|
||||||
|
echo -e "\t\"$USER:$DOMAIN\","
|
||||||
|
else
|
||||||
|
echo -e "\t\"$USER:$DOMAIN\""
|
||||||
|
fi
|
||||||
|
(( ++i))
|
||||||
|
done
|
||||||
|
echo "]"
|
||||||
|
}
|
||||||
|
|
||||||
|
# SHELL list function
|
||||||
|
shell_list() {
|
||||||
|
IFS=$'\n'
|
||||||
|
echo "USER DOMAIN"
|
||||||
|
echo "---- ------"
|
||||||
|
for str in $search_cmd; do
|
||||||
|
eval $str
|
||||||
|
echo "$USER $DOMAIN"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# PLAIN list function
|
||||||
|
plain_list() {
|
||||||
|
IFS=$'\n'
|
||||||
|
for str in $search_cmd; do
|
||||||
|
eval $str
|
||||||
|
echo -e "$USER\t$DOMAIN"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# CSV list function
|
||||||
|
csv_list() {
|
||||||
|
IFS=$'\n'
|
||||||
|
echo "USER,DOMAIN"
|
||||||
|
for str in $search_cmd; do
|
||||||
|
eval $str
|
||||||
|
echo "$USER,$DOMAIN"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Verifications #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Action #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
search_cmd=$(grep -H "SSL='yes'" $VESTA/data/users/*/web.conf |\
|
||||||
|
cut -f 1 -d ' ' |\
|
||||||
|
sed -e "s|$VESTA/data/users/|USER='|" -e "s|/web.conf:|' |")
|
||||||
|
|
||||||
|
# Listing data
|
||||||
|
case $format in
|
||||||
|
json) json_list ;;
|
||||||
|
plain) plain_list ;;
|
||||||
|
csv) csv_list ;;
|
||||||
|
shell) shell_list |column -t ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
# Vesta #
|
||||||
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
exit
|
|
@ -1,110 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# info: sing letsencrypt csr
|
|
||||||
# options: USER DOMAIN CSR_DIR [FORMAT]
|
|
||||||
#
|
|
||||||
# The function signs certificate request using LetsEncript API
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Variable&Function #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
# Argument definition
|
|
||||||
user=$1
|
|
||||||
domain=$2
|
|
||||||
csr="$3/$domain.csr"
|
|
||||||
format=$4
|
|
||||||
|
|
||||||
# Includes
|
|
||||||
source $VESTA/func/main.sh
|
|
||||||
source $VESTA/conf/vesta.conf
|
|
||||||
|
|
||||||
# encode base64
|
|
||||||
encode_base64() {
|
|
||||||
cat |base64 |tr '+/' '-_' |tr -d '\r\n='
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Verifications #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
check_args '3' "$#" 'USER DOMAIN CSR'
|
|
||||||
is_format_valid 'user' 'domain'
|
|
||||||
is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
|
|
||||||
is_object_valid 'user' 'USER' "$user"
|
|
||||||
is_object_unsuspended 'user' 'USER' "$user"
|
|
||||||
if [ ! -e "$USER_DATA/ssl/le.conf" ]; then
|
|
||||||
check_result $E_NOTEXIST "LetsEncrypt key doesn't exist"
|
|
||||||
fi
|
|
||||||
check_domain=$(grep -w "$domain'" $USER_DATA/web.conf)
|
|
||||||
if [ -z "$check_domain" ]; then
|
|
||||||
check_result $E_NOTEXIST "domain $domain doesn't exist"
|
|
||||||
fi
|
|
||||||
if [ ! -e "$csr" ]; then
|
|
||||||
check_result $E_NOTEXIST "$csr doesn't exist"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Action #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
source $USER_DATA/ssl/le.conf
|
|
||||||
api='https://acme-v01.api.letsencrypt.org'
|
|
||||||
key="$USER_DATA/ssl/user.key"
|
|
||||||
exponent="$EXPONENT"
|
|
||||||
modulus="$MODULUS"
|
|
||||||
thumb="$THUMB"
|
|
||||||
|
|
||||||
# Defining JWK header
|
|
||||||
header='{"e":"'$exponent'","kty":"RSA","n":"'"$modulus"'"}'
|
|
||||||
header='{"alg":"RS256","jwk":'"$header"'}'
|
|
||||||
|
|
||||||
# Requesting nonce
|
|
||||||
nonce=$(curl -s -I "$api/directory" |grep Nonce |cut -f2 -d \ |tr -d '\r\n')
|
|
||||||
protected=$(echo -n '{"nonce":"'"$nonce"'"}' |encode_base64)
|
|
||||||
|
|
||||||
# Defining ACME query (request challenge)
|
|
||||||
csr=$(openssl req -in $csr -outform DER |encode_base64)
|
|
||||||
query='{"resource":"new-cert","csr":"'$csr'"}'
|
|
||||||
payload=$(echo -n "$query" |encode_base64)
|
|
||||||
signature=$(printf "%s" "$protected.$payload" |\
|
|
||||||
openssl dgst -sha256 -binary -sign "$key" |encode_base64)
|
|
||||||
data='{"header":'"$header"',"protected":"'"$protected"'",'
|
|
||||||
data=$data'"payload":"'"$payload"'","signature":"'"$signature"'"}'
|
|
||||||
|
|
||||||
# Sending request to LetsEncrypt API
|
|
||||||
answer=$(mktemp)
|
|
||||||
curl -s -d "$data" "$api/acme/new-cert" -o $answer
|
|
||||||
if [ ! -z "$(grep Error $answer)" ]; then
|
|
||||||
detail="$(cat $answer |tr ',' '\n' |grep detail |cut -f 4 -d \")"
|
|
||||||
detail=$(echo "$detail" |awk -F "::" '{print $2}')
|
|
||||||
rm $answer
|
|
||||||
check_result $E_LIMIT "$detail"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Printing certificate
|
|
||||||
crt=$(cat "$answer" |openssl base64 -e)
|
|
||||||
rm $answer
|
|
||||||
if [ "$format" != 'json' ]; then
|
|
||||||
echo "-----BEGIN CERTIFICATE-----"
|
|
||||||
echo "$crt"
|
|
||||||
echo "-----END CERTIFICATE-----"
|
|
||||||
else
|
|
||||||
echo -e "{\n\t\"$domain\": {\n\t\t\"CRT\":\""
|
|
||||||
echo -n '-----BEGIN CERTIFICATE-----\n'
|
|
||||||
echo -n "$crt" |sed ':a;N;$!ba;s/\n/\\n/g'
|
|
||||||
echo -n '-----END CERTIFICATE-----'
|
|
||||||
echo -e "\"\n\t\t}\n\t}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
# Vesta #
|
|
||||||
#----------------------------------------------------------#
|
|
||||||
|
|
||||||
# Logging
|
|
||||||
log_event "$OK" "$ARGUMENTS"
|
|
||||||
|
|
||||||
exit
|
|
|
@ -56,7 +56,7 @@ bash $tmp 2>/dev/null
|
||||||
rm -f $tmp
|
rm -f $tmp
|
||||||
|
|
||||||
# Saving rules to the master iptables file
|
# Saving rules to the master iptables file
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
/sbin/iptables-save > /etc/sysconfig/iptables
|
/sbin/iptables-save > /etc/sysconfig/iptables
|
||||||
if [ -z "$(ls /etc/rc3.d/S*iptables 2>/dev/null)" ]; then
|
if [ -z "$(ls /etc/rc3.d/S*iptables 2>/dev/null)" ]; then
|
||||||
/sbin/chkconfig iptables off
|
/sbin/chkconfig iptables off
|
||||||
|
|
|
@ -41,6 +41,16 @@ is_object_unsuspended 'dns' 'DOMAIN' "$domain"
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Deleting system configs
|
||||||
|
if [[ "$DNS_SYSTEM" =~ named|bind ]]; then
|
||||||
|
if [ -e '/etc/named.conf' ]; then
|
||||||
|
dns_conf='/etc/named.conf'
|
||||||
|
else
|
||||||
|
dns_conf='/etc/bind/named.conf'
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -i "/\/$user\/conf\/dns\/$domain.db\"/d" $dns_conf
|
||||||
|
fi
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Vesta #
|
# Vesta #
|
||||||
|
|
|
@ -40,7 +40,21 @@ is_object_suspended 'dns' 'DOMAIN' "$domain"
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Creating system configs
|
||||||
|
if [[ "$DNS_SYSTEM" =~ named|bind ]]; then
|
||||||
|
if [ -e '/etc/named.conf' ]; then
|
||||||
|
dns_conf='/etc/named.conf'
|
||||||
|
dns_group='named'
|
||||||
|
else
|
||||||
|
dns_conf='/etc/bind/named.conf'
|
||||||
|
dns_group='bind'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Adding zone in named.conf
|
||||||
|
named="zone \"$domain_idn\" {type master; file"
|
||||||
|
named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
|
||||||
|
echo "$named" >> $dns_conf
|
||||||
|
fi
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Vesta #
|
# Vesta #
|
||||||
|
|
|
@ -48,6 +48,9 @@ is_object_suspended "mail/$domain" 'ACCOUNT' "$account"
|
||||||
if [[ "$MAIL_SYSTEM" =~ exim ]]; then
|
if [[ "$MAIL_SYSTEM" =~ exim ]]; then
|
||||||
md5=$(get_object_value "mail/$domain" 'ACCOUNT' "$account" '$MD5')
|
md5=$(get_object_value "mail/$domain" 'ACCOUNT' "$account" '$MD5')
|
||||||
quota=$(get_object_value "mail/$domain" 'ACCOUNT' "$account" '$QUOTA')
|
quota=$(get_object_value "mail/$domain" 'ACCOUNT' "$account" '$QUOTA')
|
||||||
|
if [ "$quota" = 'unlimited' ]; then
|
||||||
|
quota=0
|
||||||
|
fi
|
||||||
sed -i "/^$account:/d" $HOMEDIR/$user/conf/mail/$domain/passwd
|
sed -i "/^$account:/d" $HOMEDIR/$user/conf/mail/$domain/passwd
|
||||||
str="$account:$md5:$user:mail::$HOMEDIR/$user:$quota"
|
str="$account:$md5:$user:mail::$HOMEDIR/$user:$quota"
|
||||||
echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
|
echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
|
||||||
|
|
|
@ -51,11 +51,6 @@ if [ $? -ne 0 ]; then
|
||||||
conntrack_ftp='no'
|
conntrack_ftp='no'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Checking custom OpenSSH port
|
|
||||||
sshport=$(grep '^Port ' /etc/ssh/sshd_config | head -1 | cut -d ' ' -f 2)
|
|
||||||
if [[ "$sshport" =~ ^[0-9]+$ ]] && [ "$sshport" -ne "22" ]; then
|
|
||||||
sed -i "s/PORT='22'/PORT=\'$sshport\'/" $rules
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Creating temporary file
|
# Creating temporary file
|
||||||
tmp=$(mktemp)
|
tmp=$(mktemp)
|
||||||
|
@ -157,7 +152,7 @@ if [ ! -z "$FIREWALL_EXTENSION" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Saving rules to the master iptables file
|
# Saving rules to the master iptables file
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
/sbin/iptables-save > /etc/sysconfig/iptables
|
/sbin/iptables-save > /etc/sysconfig/iptables
|
||||||
if [ -z "$(ls /etc/rc3.d/S*iptables 2>/dev/null)" ]; then
|
if [ -z "$(ls /etc/rc3.d/S*iptables 2>/dev/null)" ]; then
|
||||||
/sbin/chkconfig iptables on
|
/sbin/chkconfig iptables on
|
||||||
|
|
|
@ -72,11 +72,16 @@ chown $exim_user:mail $VESTA/ssl/certificate.crt
|
||||||
chown $exim_user:mail $VESTA/ssl/certificate.key
|
chown $exim_user:mail $VESTA/ssl/certificate.key
|
||||||
|
|
||||||
# Restart exim, dovecot & vesta
|
# Restart exim, dovecot & vesta
|
||||||
v-restart-mail
|
$BIN/v-restart-mail
|
||||||
v-restart-service dovecot
|
if [ ! -z "$IMAP_SYSTEM" ]; then
|
||||||
v-restart-service vesta
|
$BIN/v-restart-service "$IMAP_SYSTEM"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$FTP_SYSTEM" ]; then
|
||||||
|
$BIN/v-restart-service "$FTP_SYSTEM"
|
||||||
|
fi
|
||||||
|
if [ -f "/var/run/vesta-nginx.pid" ]; then
|
||||||
|
kill -HUP $(cat /var/run/vesta-nginx.pid)
|
||||||
|
fi
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Vesta #
|
# Vesta #
|
||||||
|
|
|
@ -22,42 +22,63 @@ source $VESTA/conf/vesta.conf
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Defining user list
|
lecounter=0
|
||||||
users=$($BIN/v-list-users | tail -n+3 | awk '{ print $1 }')
|
hostname=$(hostname)
|
||||||
|
|
||||||
# Checking users
|
echo "[$(date)] : -----------------------------------------------------------------------------------" >> /usr/local/vesta/log/letsencrypt_cron.log
|
||||||
for user in $users; do
|
|
||||||
|
# Checking user certificates
|
||||||
|
for user in $($BIN/v-list-users plain |cut -f 1); do
|
||||||
USER_DATA=$VESTA/data/users/$user
|
USER_DATA=$VESTA/data/users/$user
|
||||||
# Checking user certificates
|
|
||||||
for domain in $(search_objects 'web' 'LETSENCRYPT' 'yes' 'DOMAIN'); do
|
for domain in $(search_objects 'web' 'LETSENCRYPT' 'yes' 'DOMAIN'); do
|
||||||
|
|
||||||
crt="$VESTA/data/users/$user/ssl/$domain.crt"
|
limit_check=1
|
||||||
crt_data=$(openssl x509 -text -in "$crt")
|
fail_counter=$(get_web_counter "$user" "$domain" 'LETSENCRYPT_FAIL_COUNT')
|
||||||
expire=$(echo "$crt_data" |grep "Not After")
|
|
||||||
expire=$(echo "$expire" |cut -f 2,3,4 -d :)
|
if [[ "$hostname" = "$domain" ]]; then
|
||||||
expire=$(date -d "$expire" +%s)
|
if [[ "$fail_counter" -eq 7 ]]; then
|
||||||
|
limit_check=0
|
||||||
|
fi
|
||||||
|
if [[ "$fail_counter" -eq 8 ]]; then
|
||||||
|
fail_counter=$(alter_web_counter "$user" "$domain" 'LETSENCRYPT_FAIL_COUNT')
|
||||||
|
send_email_to_admin "LetsEncrypt renewing hostname $hostname" "Warning: hostname $domain failed for LetsEncrypt renewing"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$fail_counter" -ge 7 ]] && [[ "$limit_check" -eq 1 ]]; then
|
||||||
|
# echo "$domain failed $fail_counter times for LetsEncrypt renewing, skipping"
|
||||||
|
echo "[$(date)] : $domain failed $fail_counter times for LetsEncrypt renewing, skipping" >> /usr/local/vesta/log/letsencrypt_cron.log
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
|
crt_data=$(openssl x509 -text -in $USER_DATA/ssl/$domain.crt)
|
||||||
|
not_after=$(echo "$crt_data" |grep "Not After" |cut -f 2,3,4 -d :)
|
||||||
|
expiration=$(date -d "$not_after" +%s)
|
||||||
now=$(date +%s)
|
now=$(date +%s)
|
||||||
expire=$((expire - now))
|
seconds_valid=$((expiration - now))
|
||||||
expire=$((expire / 86400))
|
days_valid=$((seconds_valid / 86400))
|
||||||
domain=$(basename $crt |sed -e "s/.crt$//")
|
if [[ "$days_valid" -lt 31 ]]; then
|
||||||
if [[ "$expire" -lt 31 ]]; then
|
if [ $lecounter -gt 0 ]; then
|
||||||
|
sleep 120
|
||||||
|
fi
|
||||||
|
((lecounter++))
|
||||||
aliases=$(echo "$crt_data" |grep DNS:)
|
aliases=$(echo "$crt_data" |grep DNS:)
|
||||||
aliases=$(echo "$aliases" |sed -e "s/DNS://g" -e "s/,//")
|
aliases=$(echo "$aliases" |sed -e "s/DNS://g" -e "s/,//g")
|
||||||
aliases=$(echo "$aliases" |tr ' ' '\n' |sed "/^$/d")
|
aliases=$(echo "$aliases" |tr ' ' '\n' |sed "/^$/d")
|
||||||
aliases=$(echo "$aliases" |grep -v "^$domain$")
|
aliases=$(echo "$aliases" |egrep -v "^$domain,?$")
|
||||||
if [ ! -z "$aliases" ]; then
|
aliases=$(echo "$aliases" |sed -e ':a;N;$!ba;s/\n/,/g')
|
||||||
aliases=$(echo "$aliases" |sed -e ':a;N;$!ba;s/\n/,/g')
|
msg=$($BIN/v-add-letsencrypt-domain $user $domain $aliases)
|
||||||
msg=$($BIN/v-add-letsencrypt-domain $user $domain $aliases)
|
if [ $? -ne 0 ]; then
|
||||||
if [ $? -ne 0 ]; then
|
if [[ $msg == *"is suspended" ]]; then
|
||||||
echo "$domain $msg"
|
echo "[$(date)] : SUSPENDED: $domain $msg" >> /usr/local/vesta/log/letsencrypt_cron.log
|
||||||
fi
|
else
|
||||||
else
|
echo "[$(date)] : $domain $msg" >> /usr/local/vesta/log/letsencrypt_cron.log
|
||||||
msg==$($BIN/v-add-letsencrypt-domain $user $domain)
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "$domain $msg"
|
echo "$domain $msg"
|
||||||
|
fail_counter=$(alter_web_counter "$user" "$domain" 'LETSENCRYPT_FAIL_COUNT')
|
||||||
|
echo "[$(date)] : fail_counter = $fail_counter" >> /usr/local/vesta/log/letsencrypt_cron.log
|
||||||
|
echo "fail_counter = $fail_counter"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
sleep 10
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# info: update system ip
|
# info: update system ip
|
||||||
# options: [USER] [IP_STATUS]
|
# options: [NONE]
|
||||||
#
|
#
|
||||||
# The function scans configured ip in the system and register them with vesta
|
# The function scans configured ip in the system and register them with vesta
|
||||||
# internal database. This call is intended for use on vps servers, where ip is
|
# internal database. This call is intended for use on vps servers, where ip is
|
||||||
|
@ -11,12 +11,10 @@
|
||||||
# Variable&Function #
|
# Variable&Function #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Argument definition
|
# Importing system variables
|
||||||
user=${1-admin}
|
source /etc/profile
|
||||||
ip_status=${2-shared}
|
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
source /etc/profile.d/vesta.sh
|
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
source $VESTA/func/ip.sh
|
source $VESTA/func/ip.sh
|
||||||
source $VESTA/conf/vesta.conf
|
source $VESTA/conf/vesta.conf
|
||||||
|
@ -26,87 +24,84 @@ source $VESTA/conf/vesta.conf
|
||||||
# Verifications #
|
# Verifications #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
check_args '0' "$#" '[USER] [IP_STATUS]'
|
|
||||||
is_format_valid 'user' 'ip_status'
|
|
||||||
is_object_valid 'user' 'USER' "$user" "$user"
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
# Get list of ip addresses
|
# Listing system ip addresses
|
||||||
ip_list=$(/sbin/ip addr|grep 'inet '|grep global|awk '{print $2}')
|
ips=$(/sbin/ip addr |grep 'inet ' |grep global |awk '{print $2}' |cut -f1 -d/)
|
||||||
ip_list=$(echo "$ip_list"|cut -f 1 -d /)
|
v_ips=$(ls $VESTA/data/ips/)
|
||||||
ip_num=$(echo "$ip_list" | wc -l)
|
ip_num=$(echo "$ips" |wc -l)
|
||||||
|
v_ip_num=$(echo "$v_ips" |wc -l)
|
||||||
|
|
||||||
# WorkAround for DHCP IP address
|
# Checking primary IP change
|
||||||
vst_ip_list=$(ls $VESTA/data/ips/)
|
if [[ "$ip_num" -eq '1' ]] && [[ "$v_ip_num" -eq 1 ]]; then
|
||||||
vst_ip_num=$(echo "$vst_ip_list" | wc -l)
|
if [ "$ips" != "$v_ips" ]; then
|
||||||
|
new=$ips
|
||||||
if [ ! -z "$vst_ip_list" ] && [ "$vst_ip_num" -eq '1' ]; then
|
old=$v_ips
|
||||||
if [ $ip_num -eq 1 ] && [ "$ip_list" != "$vst_ip_list" ]; then
|
|
||||||
new=$ip_list
|
|
||||||
old=$vst_ip_list
|
|
||||||
mv $VESTA/data/ips/$old $VESTA/data/ips/$new
|
|
||||||
if [ ! -z "$PROXY_SYSTEM" ]; then
|
|
||||||
mv /etc/$PROXY_SYSTEM/conf.d/$old.conf \
|
|
||||||
/etc/$PROXY_SYSTEM/conf.d/$new.conf
|
|
||||||
sed -i "s/$old/$new/g" /etc/$PROXY_SYSTEM/conf.d/$new.conf
|
|
||||||
fi
|
|
||||||
if [ ! -z "$WEB_SYSTEM" ]; then
|
|
||||||
mv /etc/$WEB_SYSTEM/conf.d/$old.conf \
|
|
||||||
/etc/$WEB_SYSTEM/conf.d/$new.conf
|
|
||||||
sed -i "s/$old/$new/g" /etc/$WEB_SYSTEM/conf.d/$new.conf
|
|
||||||
sed -i "s/$old/$new/g" $VESTA/data/users/*/web.conf
|
|
||||||
|
|
||||||
# Rebuild web domains
|
|
||||||
for user in $(ls $VESTA/data/users/); do
|
|
||||||
$BIN/v-rebuild-web-domains $user no
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if [ ! -z "$FTP_SYSTEM" ];then
|
|
||||||
ftpd_conf_file=$(find /etc/ -maxdepth 2 -name $FTP_SYSTEM.conf)
|
|
||||||
sed -i "s/$old/$new/g" $ftpd_conf_file
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restarting web server
|
|
||||||
$BIN/v-restart-web
|
|
||||||
|
|
||||||
# Restarting ftp server
|
|
||||||
$BIN/v-restart-ftp
|
|
||||||
|
|
||||||
# Restarting proxy server
|
|
||||||
if [ ! -z "$PROXY_SYSTEM" ]; then
|
|
||||||
$BIN/v-restart-proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restarting firewall
|
|
||||||
if [ ! -z "$FIREWALL_SYSTEM" ]; then
|
|
||||||
$BIN/v-update-firewall
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -z "$DNS_SYSTEM" ]; then
|
|
||||||
# Rebuild dns domains
|
|
||||||
for user in $(ls $VESTA/data/users/); do
|
|
||||||
sed -i "s/$old/$new/g" $VESTA/data/users/$user/dns.conf
|
|
||||||
sed -i "s/$old/$new/g" $VESTA/data/users/$user/dns/*.conf
|
|
||||||
$BIN/v-rebuild-dns-domains $user no
|
|
||||||
done
|
|
||||||
$BIN/v-restart-dns
|
|
||||||
check_result $? "dns restart failed" >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# No further comparation is needed
|
|
||||||
exit
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Compare ips
|
# Updating configs
|
||||||
for ip in $ip_list; do
|
if [ ! -z "$old" ]; then
|
||||||
|
mv $VESTA/data/ips/$old $VESTA/data/ips/$new
|
||||||
|
|
||||||
|
# Updating PROXY
|
||||||
|
if [ ! -z "$PROXY_SYSTEM" ]; then
|
||||||
|
cd /etc/$PROXY_SYSTEM/conf.d
|
||||||
|
if [ -e "$old.conf" ]; then
|
||||||
|
mv $old.conf $new.conf
|
||||||
|
sed -i "s/$old/$new/g" $new.conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating WEB
|
||||||
|
if [ ! -z "$WEB_SYSTEM" ]; then
|
||||||
|
cd /etc/$WEB_SYSTEM/conf.d
|
||||||
|
if [ -e "$old.conf" ]; then
|
||||||
|
mv $old.conf $new.conf
|
||||||
|
sed -i "s/$old/$new/g" $new.conf
|
||||||
|
fi
|
||||||
|
sed -i "s/$old/$new/g" $VESTA/data/users/*/web.conf
|
||||||
|
for user in $(ls $VESTA/data/users/); do
|
||||||
|
$BIN/v-rebuild-web-domains $user no
|
||||||
|
done
|
||||||
|
$BIN/v-restart-proxy
|
||||||
|
$BIN/v-restart-web
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating DNS
|
||||||
|
if [ ! -z "$DNS_SYSTEM" ]; then
|
||||||
|
sed -i "s/$old/$new/g" $VESTA/data/users/*/dns.conf
|
||||||
|
sed -i "s/$old/$new/g" $VESTA/data/users/*/dns/*.conf
|
||||||
|
for user in $(ls $VESTA/data/users/); do
|
||||||
|
$BIN/v-rebuild-dns-domains $user no
|
||||||
|
done
|
||||||
|
$BIN/v-restart-dns
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating FTP
|
||||||
|
if [ ! -z "$FTP_SYSTEM" ] && [ "$FTP_SYSTEM" = 'vsftpd' ]; then
|
||||||
|
conf=$(find /etc/ -maxdepth 2 -name $FTP_SYSTEM.conf)
|
||||||
|
if [ ! -z "$conf" ]; then
|
||||||
|
sed -i "s/$old/$new/g" $conf
|
||||||
|
$BIN/v-restart-ftp
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Updating firewall
|
||||||
|
if [ ! -z "$FIREWALL_SYSTEM" ]; then
|
||||||
|
sed -i "s/$old/$new/g" $VESTA/data/firewall/*.conf
|
||||||
|
$BIN/v-update-firewall
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Adding system IP
|
||||||
|
for ip in $ips; do
|
||||||
check_ifconfig=$(/sbin/ifconfig |grep "$ip")
|
check_ifconfig=$(/sbin/ifconfig |grep "$ip")
|
||||||
if [ ! -e "$VESTA/data/ips/$ip" ] && [ ! -z "$check_ifconfig" ]; then
|
if [ ! -e "$VESTA/data/ips/$ip" ] && [ ! -z "$check_ifconfig" ]; then
|
||||||
interface=$(/sbin/ip addr |grep $ip |awk '{print $NF}'|uniq)
|
interface=$(/sbin/ip addr |grep $ip |awk '{print $NF}' |uniq)
|
||||||
interface=$(echo "$interface" |cut -f 1 -d : |head -n 1)
|
interface=$(echo "$interface" |cut -f 1 -d : |head -n 1)
|
||||||
netmask=$(/sbin/ip addr |grep $ip |cut -f 2 -d / |cut -f 1 -d \ )
|
netmask=$(/sbin/ip addr |grep $ip |cut -f 2 -d / |cut -f 1 -d \ )
|
||||||
netmask=$(convert_cidr $netmask)
|
netmask=$(convert_cidr $netmask)
|
||||||
|
@ -114,6 +109,15 @@ for ip in $ip_list; do
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Updating NAT
|
||||||
|
pub_ip=$(curl -s vestacp.com/what-is-my-ip/)
|
||||||
|
if [ ! -e "$VESTA/data/ips/$pub_ip" ]; then
|
||||||
|
if [ -z "$(grep -R "$pub_ip" $VESTA/data/ips/)" ]; then
|
||||||
|
ip=$(ls -t $VESTA/data/ips/ |head -n1)
|
||||||
|
$BIN/v-change-sys-ip-nat $ip $pub_ip
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Vesta #
|
# Vesta #
|
||||||
|
|
|
@ -61,13 +61,13 @@ fi
|
||||||
# Parsing data
|
# Parsing data
|
||||||
if [ "$period" = 'daily' ]; then
|
if [ "$period" = 'daily' ]; then
|
||||||
mem=$(free -m)
|
mem=$(free -m)
|
||||||
used=$(echo "$mem" |grep Mem |awk '{print $3}')
|
used=$(echo "$mem" |awk '(NR == 2)' |awk '{print $3}')
|
||||||
if [ -z "$(echo "$mem" | grep available)" ]; then
|
if [ -z "$(echo "$mem" | grep available)" ]; then
|
||||||
free=$(echo "$mem" |grep buffers/cache |awk '{print $4}')
|
free=$(echo "$mem" |grep buff/cache |awk '{print $4}')
|
||||||
else
|
else
|
||||||
free=$(echo "$mem" |grep Mem |awk '{print $7}')
|
free=$(echo "$mem" |awk '(NR == 2)' |awk '{print $7}')
|
||||||
fi
|
fi
|
||||||
swap=$(echo "$mem" |grep Swap |awk '{print $3}')
|
swap=$(echo "$mem" |awk '(NR == 3)' |awk '{print $3}')
|
||||||
|
|
||||||
# Updating rrd
|
# Updating rrd
|
||||||
rrdtool update $RRD/mem/mem.rrd N:$used:$swap:$free
|
rrdtool update $RRD/mem/mem.rrd N:$used:$swap:$free
|
||||||
|
|
|
@ -14,6 +14,7 @@ period=${1-daily}
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
source $VESTA/func/main.sh
|
source $VESTA/func/main.sh
|
||||||
|
source $VESTA/func/db.sh
|
||||||
source $VESTA/conf/vesta.conf
|
source $VESTA/conf/vesta.conf
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,23 +67,10 @@ for host in $hosts; do
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$period" = 'daily' ]; then
|
if [ "$period" = 'daily' ]; then
|
||||||
# Defining host credentials
|
mysql_connect $host
|
||||||
host_str=$(grep "HOST='$host'" $conf)
|
query='SHOW GLOBAL STATUS'
|
||||||
for key in $host_str; do
|
status=$(mysql_query "$query" 2>/dev/null)
|
||||||
eval ${key%%=*}=${key#*=}
|
if [ $? -ne 0 ]; then
|
||||||
done
|
|
||||||
sql="mysql -h $HOST -u $USER -p$PASSWORD -e"
|
|
||||||
|
|
||||||
# Checking empty vars
|
|
||||||
if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
|
|
||||||
echo "Error: config is broken"
|
|
||||||
log_event "$E_PARSING" "$ARGUMENTS"
|
|
||||||
exit $E_PARSING
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Parsing data
|
|
||||||
status=$($sql "SHOW GLOBAL STATUS" 2>/dev/null); code="$?"
|
|
||||||
if [ '0' -ne "$code" ]; then
|
|
||||||
active=0
|
active=0
|
||||||
slow=0
|
slow=0
|
||||||
else
|
else
|
||||||
|
|
|
@ -85,7 +85,7 @@ for host in $hosts; do
|
||||||
# Parsing data
|
# Parsing data
|
||||||
q='SELECT SUM(xact_commit + xact_rollback), SUM(numbackends)
|
q='SELECT SUM(xact_commit + xact_rollback), SUM(numbackends)
|
||||||
FROM pg_stat_database;'
|
FROM pg_stat_database;'
|
||||||
status=$($sql plsql -d postgres -c "$q" 2>/dev/null); code="$?"
|
status=$($sql psql -d postgres -c "$q" 2>/dev/null); code="$?"
|
||||||
if [ '0' -ne "$code" ]; then
|
if [ '0' -ne "$code" ]; then
|
||||||
active=0
|
active=0
|
||||||
slow=0
|
slow=0
|
||||||
|
|
|
@ -28,12 +28,32 @@ source $VESTA/conf/vesta.conf
|
||||||
# Checking arg number
|
# Checking arg number
|
||||||
check_args '1' "$#" 'PACKAGE'
|
check_args '1' "$#" 'PACKAGE'
|
||||||
|
|
||||||
|
valid=0
|
||||||
|
if [ "$package" = "vesta" ]; then
|
||||||
|
valid=1
|
||||||
|
fi
|
||||||
|
if [ "$package" = "vesta-nginx" ]; then
|
||||||
|
valid=1
|
||||||
|
fi
|
||||||
|
if [ "$package" = "vesta-php" ]; then
|
||||||
|
valid=1
|
||||||
|
fi
|
||||||
|
if [ "$package" = "vesta-ioncube" ]; then
|
||||||
|
valid=1
|
||||||
|
fi
|
||||||
|
if [ "$package" = "vesta-softaculous" ]; then
|
||||||
|
valid=1
|
||||||
|
fi
|
||||||
|
if [ $valid -eq 0 ]; then
|
||||||
|
echo "Package $package is not valid"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
# Action #
|
# Action #
|
||||||
#----------------------------------------------------------#
|
#----------------------------------------------------------#
|
||||||
|
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -n "$(command -v yum)" ]; then
|
||||||
# Clean yum chache
|
# Clean yum chache
|
||||||
yum -q clean all
|
yum -q clean all
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ for user in $user_list; do
|
||||||
IP_OWNED=0
|
IP_OWNED=0
|
||||||
U_USERS=0
|
U_USERS=0
|
||||||
U_DISK=0
|
U_DISK=0
|
||||||
|
DISK=0
|
||||||
U_DISK_DIRS=$(get_user_value '$U_DISK_DIRS')
|
U_DISK_DIRS=$(get_user_value '$U_DISK_DIRS')
|
||||||
if [ -z "$U_DISK_DIRS" ]; then
|
if [ -z "$U_DISK_DIRS" ]; then
|
||||||
U_DISK_DIRS=0
|
U_DISK_DIRS=0
|
||||||
|
|
|
@ -33,7 +33,7 @@ is_object_valid 'user' 'USER' "$user"
|
||||||
# Updating disk quota
|
# Updating disk quota
|
||||||
# Had quota equals package value. Soft quota equals 90% of package value for warnings.
|
# Had quota equals package value. Soft quota equals 90% of package value for warnings.
|
||||||
quota=$(get_user_value '$DISK_QUOTA')
|
quota=$(get_user_value '$DISK_QUOTA')
|
||||||
soft=$(echo "$quota * 1024 * 0.90"|bc |cut -f 1 -d .)
|
soft=$(echo "$quota * 1024"|bc |cut -f 1 -d .)
|
||||||
hard=$(echo "$quota * 1024"|bc |cut -f 1 -d .)
|
hard=$(echo "$quota * 1024"|bc |cut -f 1 -d .)
|
||||||
|
|
||||||
# Searching home mount point
|
# Searching home mount point
|
||||||
|
|
|
@ -67,6 +67,9 @@ TOTAL_USERS=0
|
||||||
|
|
||||||
# Updating user stats
|
# Updating user stats
|
||||||
for user in $user_list; do
|
for user in $user_list; do
|
||||||
|
if [ ! -f "$VESTA/data/users/$user/user.conf" ]; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
USER_DATA=$VESTA/data/users/$user
|
USER_DATA=$VESTA/data/users/$user
|
||||||
source $USER_DATA/user.conf
|
source $USER_DATA/user.conf
|
||||||
next_month=$(date +'%m/01/%y' -d '+ 1 month')
|
next_month=$(date +'%m/01/%y' -d '+ 1 month')
|
||||||
|
|
|
@ -62,7 +62,7 @@ build_webalizer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
build_awstats() {
|
build_awstats() {
|
||||||
if [ -e "/etc/redhat-release" ]; then
|
if [ -d "/etc/sysconfig" ]; then
|
||||||
awstats="/usr/share/awstats/wwwroot/cgi-bin/awstats.pl"
|
awstats="/usr/share/awstats/wwwroot/cgi-bin/awstats.pl"
|
||||||
wwwroot="/usr/share/awstats/wwwroot"
|
wwwroot="/usr/share/awstats/wwwroot"
|
||||||
if [ ! -e "$awstats" ]; then
|
if [ ! -e "$awstats" ]; then
|
||||||
|
|
|
@ -33,7 +33,11 @@ esac
|
||||||
|
|
||||||
# Detecting release
|
# Detecting release
|
||||||
if [ "$version" = 'rhel' ]; then
|
if [ "$version" = 'rhel' ]; then
|
||||||
release=$(grep -o "[0-9]" /etc/redhat-release |head -n1)
|
if [ -e '/etc/redhat-release' ]; then
|
||||||
|
release=$(grep -o "[0-9]" /etc/redhat-release |head -n1)
|
||||||
|
else
|
||||||
|
release=6
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
if [ "$version" = 'ubuntu' ]; then
|
if [ "$version" = 'ubuntu' ]; then
|
||||||
release=$(lsb_release -r |awk '{print $2}')
|
release=$(lsb_release -r |awk '{print $2}')
|
||||||
|
|
21
func/db.sh
21
func/db.sh
|
@ -38,23 +38,31 @@ mysql_connect() {
|
||||||
exit $E_CONNECT
|
exit $E_CONNECT
|
||||||
fi
|
fi
|
||||||
mysql_ver=$(cat $mysql_out |tail -n1 |cut -f 1 -d -)
|
mysql_ver=$(cat $mysql_out |tail -n1 |cut -f 1 -d -)
|
||||||
|
mysql_fork="mysql"
|
||||||
|
check_mysql_fork=$(grep "MariaDB" $mysql_out)
|
||||||
|
if [ ! -z "$check_mysql_fork" ]; then
|
||||||
|
mysql_fork="mariadb"
|
||||||
|
fi
|
||||||
rm -f $mysql_out
|
rm -f $mysql_out
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_query() {
|
mysql_query() {
|
||||||
mysql --defaults-file=$mycnf -e "$1" 2>/dev/null
|
sql_tmp=$(mktemp)
|
||||||
|
echo "$1" > $sql_tmp
|
||||||
|
mysql --defaults-file=$mycnf < "$sql_tmp" 2>/dev/null
|
||||||
|
rm -f "$sql_tmp"
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_dump() {
|
mysql_dump() {
|
||||||
err="/tmp/e.mysql"
|
err="/tmp/e.mysql"
|
||||||
mysqldump --defaults-file=$mycnf --single-transaction -r $1 $2 2> $err
|
mysqldump --defaults-file=$mycnf --single-transaction --max_allowed_packet=100M -r $1 $2 2> $err
|
||||||
if [ '0' -ne "$?" ]; then
|
if [ '0' -ne "$?" ]; then
|
||||||
rm -rf $tmpdir
|
rm -rf $tmpdir
|
||||||
if [ "$notify" != 'no' ]; then
|
if [ "$notify" != 'no' ]; then
|
||||||
echo -e "Can't dump database $database\n$(cat $err)" |\
|
echo -e "Can't dump database $database\n$(cat $err)" |\
|
||||||
$SENDMAIL -s "$subj" $email
|
$SENDMAIL -s "$subj" $email
|
||||||
fi
|
fi
|
||||||
echo "Error: dump $database failed"
|
echo "Error: dump $database failed\n$(cat $err)"
|
||||||
log_event "$E_DB" "$ARGUMENTS"
|
log_event "$E_DB" "$ARGUMENTS"
|
||||||
exit $E_DB
|
exit $E_DB
|
||||||
fi
|
fi
|
||||||
|
@ -84,7 +92,10 @@ psql_connect() {
|
||||||
}
|
}
|
||||||
|
|
||||||
psql_query() {
|
psql_query() {
|
||||||
psql -h $HOST -U $USER -c "$1" 2>/dev/null
|
sql_tmp=$(mktemp)
|
||||||
|
echo "$1" > $sql_tmp
|
||||||
|
psql -h $HOST -U $USER -f "$sql_tmp" 2>/dev/null
|
||||||
|
rm -f $sql_tmp
|
||||||
}
|
}
|
||||||
|
|
||||||
psql_dump() {
|
psql_dump() {
|
||||||
|
@ -311,7 +322,7 @@ delete_pgsql_database() {
|
||||||
psql_connect $HOST
|
psql_connect $HOST
|
||||||
|
|
||||||
query="REVOKE ALL PRIVILEGES ON DATABASE $database FROM $DBUSER"
|
query="REVOKE ALL PRIVILEGES ON DATABASE $database FROM $DBUSER"
|
||||||
psql_qyery "$query" > /dev/null
|
psql_query "$query" > /dev/null
|
||||||
|
|
||||||
query="DROP DATABASE $database"
|
query="DROP DATABASE $database"
|
||||||
psql_query "$query" > /dev/null
|
psql_query "$query" > /dev/null
|
||||||
|
|
|
@ -215,7 +215,11 @@ add_web_config() {
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
trigger="${2/.*pl/.sh}"
|
trigger="${2/%.tpl/.sh}"
|
||||||
|
if [[ "$2" =~ stpl$ ]]; then
|
||||||
|
trigger="${2/%.stpl/.sh}"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -x "$WEBTPL/$1/$WEB_BACKEND/$trigger" ]; then
|
if [ -x "$WEBTPL/$1/$WEB_BACKEND/$trigger" ]; then
|
||||||
$WEBTPL/$1/$WEB_BACKEND/$trigger \
|
$WEBTPL/$1/$WEB_BACKEND/$trigger \
|
||||||
$user $domain $local_ip $HOMEDIR \
|
$user $domain $local_ip $HOMEDIR \
|
||||||
|
@ -269,7 +273,7 @@ replace_web_config() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Delete web configuartion
|
# Delete web configuration
|
||||||
del_web_config() {
|
del_web_config() {
|
||||||
conf="$HOMEDIR/$user/conf/web/$domain.$1.conf"
|
conf="$HOMEDIR/$user/conf/web/$domain.$1.conf"
|
||||||
if [[ "$2" =~ stpl$ ]]; then
|
if [[ "$2" =~ stpl$ ]]; then
|
||||||
|
@ -285,12 +289,16 @@ del_web_config() {
|
||||||
if [[ "$2" =~ stpl$ ]]; then
|
if [[ "$2" =~ stpl$ ]]; then
|
||||||
conf="$HOMEDIR/$user/conf/web/s$1.conf"
|
conf="$HOMEDIR/$user/conf/web/s$1.conf"
|
||||||
fi
|
fi
|
||||||
get_web_config_lines $WEBTPL/$1/$WEB_BACKEND/$2 $conf
|
if [ -e "$conf" ]; then
|
||||||
sed -i "$top_line,$bottom_line d" $conf
|
get_web_config_lines $WEBTPL/$1/$WEB_BACKEND/$2 $conf
|
||||||
|
sed -i "$top_line,$bottom_line d" $conf
|
||||||
web_domain=$(grep DOMAIN $USER_DATA/web.conf |wc -l)
|
fi
|
||||||
if [ "$web_domain" -eq '0' ]; then
|
fi
|
||||||
sed -i "/.*\/$user\/.*$1.conf/d" /etc/$1/conf.d/vesta.conf
|
# clean-up for both config styles if there is no more domains
|
||||||
|
web_domain=$(grep DOMAIN $USER_DATA/web.conf |wc -l)
|
||||||
|
if [ "$web_domain" -eq '0' ]; then
|
||||||
|
sed -i "/.*\/$user\/conf\/web\//d" /etc/$1/conf.d/vesta.conf
|
||||||
|
if [ -f "$conf" ]; then
|
||||||
rm -f $conf
|
rm -f $conf
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -335,7 +343,7 @@ is_web_domain_cert_valid() {
|
||||||
check_result $E_FORBIDEN "SSL Key is protected (remove pass_phrase)"
|
check_result $E_FORBIDEN "SSL Key is protected (remove pass_phrase)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
openssl s_server -quiet -cert $ssl_dir/$domain.crt \
|
openssl s_server -port 654321 -quiet -cert $ssl_dir/$domain.crt \
|
||||||
-key $ssl_dir/$domain.key >> /dev/null 2>&1 &
|
-key $ssl_dir/$domain.key >> /dev/null 2>&1 &
|
||||||
pid=$!
|
pid=$!
|
||||||
sleep 0.5
|
sleep 0.5
|
||||||
|
@ -404,6 +412,24 @@ update_domain_zone() {
|
||||||
VALUE=$(idn --quiet -a -t "$VALUE")
|
VALUE=$(idn --quiet -a -t "$VALUE")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Split long TXT entries into 255 chunks
|
||||||
|
if [ "$TYPE" = 'TXT' ]; then
|
||||||
|
txtlength=${#VALUE}
|
||||||
|
if [ $txtlength -gt 255 ]; then
|
||||||
|
already_chunked=0
|
||||||
|
if [[ $VALUE == *"\" \""* ]] || [[ $VALUE == *"\"\""* ]]; then
|
||||||
|
already_chunked=1
|
||||||
|
fi
|
||||||
|
if [ $already_chunked -eq 0 ]; then
|
||||||
|
if [[ ${VALUE:0:1} = '"' ]]; then
|
||||||
|
txtlength=$(( $txtlength - 2 ))
|
||||||
|
VALUE=${VALUE:1:txtlength}
|
||||||
|
fi
|
||||||
|
VALUE=$(echo $VALUE | fold -w 255 | xargs -I '$' echo -n '"$"')
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$SUSPENDED" != 'yes' ]; then
|
if [ "$SUSPENDED" != 'yes' ]; then
|
||||||
eval echo -e "\"$fields\""|sed "s/%quote%/'/g" >> $zn_conf
|
eval echo -e "\"$fields\""|sed "s/%quote%/'/g" >> $zn_conf
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -26,7 +26,7 @@ get_ip_iface() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Check ip address speciefic value
|
# Check ip address specific value
|
||||||
is_ip_key_empty() {
|
is_ip_key_empty() {
|
||||||
key="$1"
|
key="$1"
|
||||||
string=$(cat $VESTA/data/ips/$ip)
|
string=$(cat $VESTA/data/ips/$ip)
|
||||||
|
@ -141,7 +141,7 @@ get_real_ip() {
|
||||||
else
|
else
|
||||||
nat=$(grep -H "^NAT='$1'" $VESTA/data/ips/*)
|
nat=$(grep -H "^NAT='$1'" $VESTA/data/ips/*)
|
||||||
if [ ! -z "$nat" ]; then
|
if [ ! -z "$nat" ]; then
|
||||||
echo "$nat" |cut -f 1 -d : |cut -f 7 -d /
|
echo "$nat" |cut -f 1 -d : |cut -f 7 -d / |head -n 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
174
func/main.sh
174
func/main.sh
|
@ -35,6 +35,7 @@ E_DB=17
|
||||||
E_RRD=18
|
E_RRD=18
|
||||||
E_UPDATE=19
|
E_UPDATE=19
|
||||||
E_RESTART=20
|
E_RESTART=20
|
||||||
|
E_TEAPOT=418
|
||||||
|
|
||||||
# Event string for logger
|
# Event string for logger
|
||||||
for ((I=1; I <= $# ; I++)); do
|
for ((I=1; I <= $# ; I++)); do
|
||||||
|
@ -212,7 +213,8 @@ is_object_new() {
|
||||||
# Check if object is valid
|
# Check if object is valid
|
||||||
is_object_valid() {
|
is_object_valid() {
|
||||||
if [ $2 = 'USER' ]; then
|
if [ $2 = 'USER' ]; then
|
||||||
if [ ! -d "$VESTA/data/users/$3" ]; then
|
user_vst_dir=$(basename $3)
|
||||||
|
if [ ! -d "$VESTA/data/users/$user_vst_dir" ]; then
|
||||||
check_result $E_NOTEXIST "$1 $3 doesn't exist"
|
check_result $E_NOTEXIST "$1 $3 doesn't exist"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
@ -273,11 +275,41 @@ is_object_value_exist() {
|
||||||
is_password_valid() {
|
is_password_valid() {
|
||||||
if [[ "$password" =~ ^/tmp/ ]]; then
|
if [[ "$password" =~ ^/tmp/ ]]; then
|
||||||
if [ -f "$password" ]; then
|
if [ -f "$password" ]; then
|
||||||
password=$(head -n1 $password)
|
password="$(head -n1 $password)"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check if hash is transmitted via file
|
||||||
|
is_hash_valid() {
|
||||||
|
if [[ "$hash" =~ ^/tmp/ ]]; then
|
||||||
|
if [ -f "$hash" ]; then
|
||||||
|
hash="$(head -n1 $hash)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if directory is a symlink
|
||||||
|
is_dir_symlink() {
|
||||||
|
if [[ -L "$1" ]]; then
|
||||||
|
check_result $E_FORBIDEN "$1 directory is a symlink"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if file exists
|
||||||
|
if_file_exists() {
|
||||||
|
if [[ -f "$1" ]]; then
|
||||||
|
check_result $E_FORBIDEN "$1 file exists"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if directory exists
|
||||||
|
if_dir_exists() {
|
||||||
|
if [[ -d "$1" ]]; then
|
||||||
|
check_result $E_FORBIDEN "$1 directory exists"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Get object value
|
# Get object value
|
||||||
get_object_value() {
|
get_object_value() {
|
||||||
object=$(grep "$2='$3'" $USER_DATA/$1.conf)
|
object=$(grep "$2='$3'" $USER_DATA/$1.conf)
|
||||||
|
@ -516,7 +548,7 @@ is_user_format_valid() {
|
||||||
is_domain_format_valid() {
|
is_domain_format_valid() {
|
||||||
object_name=${2-domain}
|
object_name=${2-domain}
|
||||||
exclude="[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|_|/|\|\"|'|;|%|\`| ]"
|
exclude="[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|_|/|\|\"|'|;|%|\`| ]"
|
||||||
if [[ $1 =~ $exclude ]] || [[ $1 =~ ^[0-9]+$ ]] || [[ $1 =~ "\.\." ]]; then
|
if [[ $1 =~ $exclude ]] || [[ $1 =~ ^[0-9]+$ ]] || [[ $1 =~ "\.\." ]] || [[ $1 =~ "$(printf '\t')" ]]; then
|
||||||
check_result $E_INVALID "invalid $object_name format :: $1"
|
check_result $E_INVALID "invalid $object_name format :: $1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -634,8 +666,8 @@ is_date_format_valid() {
|
||||||
is_dbuser_format_valid() {
|
is_dbuser_format_valid() {
|
||||||
exclude="[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|/|\|\"|'|;|%|\`| ]"
|
exclude="[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|/|\|\"|'|;|%|\`| ]"
|
||||||
if [ 17 -le ${#1} ]; then
|
if [ 17 -le ${#1} ]; then
|
||||||
check_result $E_INVALID "mysql username can be up to 16 characters long"
|
check_result $E_INVALID "mysql username can be up to 16 characters long"
|
||||||
fi
|
fi
|
||||||
if [[ "$1" =~ $exclude ]]; then
|
if [[ "$1" =~ $exclude ]]; then
|
||||||
check_result $E_INVALID "invalid $2 format :: $1"
|
check_result $E_INVALID "invalid $2 format :: $1"
|
||||||
fi
|
fi
|
||||||
|
@ -643,7 +675,7 @@ is_dbuser_format_valid() {
|
||||||
|
|
||||||
# DNS record type validator
|
# DNS record type validator
|
||||||
is_dns_type_format_valid() {
|
is_dns_type_format_valid() {
|
||||||
known_dnstype='A,AAAA,NS,CNAME,MX,TXT,SRV,DNSKEY,KEY,IPSECKEY,PTR,SPF,TLSA'
|
known_dnstype='A,AAAA,NS,CNAME,MX,TXT,SRV,DNSKEY,KEY,IPSECKEY,PTR,SPF,TLSA,CAA'
|
||||||
if [ -z "$(echo $known_dnstype |grep -w $1)" ]; then
|
if [ -z "$(echo $known_dnstype |grep -w $1)" ]; then
|
||||||
check_result $E_INVALID "invalid dns record type format :: $1"
|
check_result $E_INVALID "invalid dns record type format :: $1"
|
||||||
fi
|
fi
|
||||||
|
@ -723,8 +755,12 @@ is_ip_status_format_valid() {
|
||||||
|
|
||||||
# Cron validator
|
# Cron validator
|
||||||
is_cron_format_valid() {
|
is_cron_format_valid() {
|
||||||
limit=60
|
limit=59
|
||||||
check_format=''
|
check_format=''
|
||||||
|
if [ "$2" = 'hour' ]; then
|
||||||
|
limit=23
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$2" = 'day' ]; then
|
if [ "$2" = 'day' ]; then
|
||||||
limit=31
|
limit=31
|
||||||
fi
|
fi
|
||||||
|
@ -753,9 +789,13 @@ is_cron_format_valid() {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
if [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -le $limit ]; then
|
crn_values=$(echo $1 |tr "," " " | tr "-" " ")
|
||||||
check_format='ok'
|
for crn_vl in $crn_values
|
||||||
fi
|
do
|
||||||
|
if [[ "$crn_vl" =~ ^[0-9]+$ ]] && [ "$crn_vl" -le $limit ]; then
|
||||||
|
check_format='ok'
|
||||||
|
fi
|
||||||
|
done
|
||||||
if [ "$check_format" != 'ok' ]; then
|
if [ "$check_format" != 'ok' ]; then
|
||||||
check_result $E_INVALID "invalid $2 format :: $1"
|
check_result $E_INVALID "invalid $2 format :: $1"
|
||||||
fi
|
fi
|
||||||
|
@ -770,7 +810,7 @@ is_name_format_valid() {
|
||||||
|
|
||||||
# Object validator
|
# Object validator
|
||||||
is_object_format_valid() {
|
is_object_format_valid() {
|
||||||
if ! [[ "$1" =~ ^[[:alnum:]][-|\.|_[:alnum:]]{0,28}[[:alnum:]]$ ]]; then
|
if ! [[ "$1" =~ ^[[:alnum:]][-|\.|_[:alnum:]]{0,64}[[:alnum:]]$ ]]; then
|
||||||
check_result $E_INVALID "invalid $2 format :: $1"
|
check_result $E_INVALID "invalid $2 format :: $1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -781,6 +821,32 @@ is_password_format_valid() {
|
||||||
check_result $E_INVALID "invalid password format :: $1"
|
check_result $E_INVALID "invalid password format :: $1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
# Missing function -
|
||||||
|
# Before: validate_format_shell
|
||||||
|
# After: is_format_valid_shell
|
||||||
|
is_format_valid_shell() {
|
||||||
|
if [ -z "$(grep -w $1 /etc/shells)" ]; then
|
||||||
|
echo "Error: shell $1 is not valid"
|
||||||
|
log_event "$E_INVALID" "$EVENT"
|
||||||
|
exit $E_INVALID
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
format_no_quotes() {
|
||||||
|
exclude="['|\"]"
|
||||||
|
if [[ "$1" =~ $exclude ]]; then
|
||||||
|
check_result "$E_INVALID" "Invalid $2 contains qoutes (\" or ') :: $1"
|
||||||
|
fi
|
||||||
|
is_no_new_line_format "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_no_new_line_format() {
|
||||||
|
test=$(echo "$1" | head -n1 );
|
||||||
|
if [[ "$test" != "$1" ]]; then
|
||||||
|
check_result "$E_INVALID" "invalid value :: $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Format validation controller
|
# Format validation controller
|
||||||
is_format_valid() {
|
is_format_valid() {
|
||||||
|
@ -790,11 +856,12 @@ is_format_valid() {
|
||||||
case $arg_name in
|
case $arg_name in
|
||||||
account) is_user_format_valid "$arg" "$arg_name";;
|
account) is_user_format_valid "$arg" "$arg_name";;
|
||||||
action) is_fw_action_format_valid "$arg";;
|
action) is_fw_action_format_valid "$arg";;
|
||||||
|
alias) is_alias_format_valid "$arg" ;;
|
||||||
aliases) is_alias_format_valid "$arg" ;;
|
aliases) is_alias_format_valid "$arg" ;;
|
||||||
antispam) is_boolean_format_valid "$arg" 'antispam' ;;
|
antispam) is_boolean_format_valid "$arg" 'antispam' ;;
|
||||||
antivirus) is_boolean_format_valid "$arg" 'antivirus' ;;
|
antivirus) is_boolean_format_valid "$arg" 'antivirus' ;;
|
||||||
autoreply) is_autoreply_format_valid "$arg" ;;
|
autoreply) is_autoreply_format_valid "$arg" ;;
|
||||||
backup) is_user_format_valid "$arg" 'backup' ;;
|
backup) is_object_format_valid "$arg" 'backup' ;;
|
||||||
charset) is_object_format_valid "$arg" "$arg_name" ;;
|
charset) is_object_format_valid "$arg" "$arg_name" ;;
|
||||||
charsets) is_common_format_valid "$arg" 'charsets' ;;
|
charsets) is_common_format_valid "$arg" 'charsets' ;;
|
||||||
comment) is_object_format_valid "$arg" 'comment' ;;
|
comment) is_object_format_valid "$arg" 'comment' ;;
|
||||||
|
@ -815,6 +882,7 @@ is_format_valid() {
|
||||||
host) is_object_format_valid "$arg" "$arg_name" ;;
|
host) is_object_format_valid "$arg" "$arg_name" ;;
|
||||||
hour) is_cron_format_valid "$arg" $arg_name ;;
|
hour) is_cron_format_valid "$arg" $arg_name ;;
|
||||||
id) is_int_format_valid "$arg" 'id' ;;
|
id) is_int_format_valid "$arg" 'id' ;;
|
||||||
|
interface) is_interface_format_valid "$arg" ;;
|
||||||
ip) is_ip_format_valid "$arg" ;;
|
ip) is_ip_format_valid "$arg" ;;
|
||||||
ip_name) is_domain_format_valid "$arg" 'IP name';;
|
ip_name) is_domain_format_valid "$arg" 'IP name';;
|
||||||
ip_status) is_ip_status_format_valid "$arg" ;;
|
ip_status) is_ip_status_format_valid "$arg" ;;
|
||||||
|
@ -849,6 +917,8 @@ is_format_valid() {
|
||||||
rtype) is_dns_type_format_valid "$arg" ;;
|
rtype) is_dns_type_format_valid "$arg" ;;
|
||||||
rule) is_int_format_valid "$arg" "rule id" ;;
|
rule) is_int_format_valid "$arg" "rule id" ;;
|
||||||
soa) is_domain_format_valid "$arg" 'SOA' ;;
|
soa) is_domain_format_valid "$arg" 'SOA' ;;
|
||||||
|
#missing command: is_format_valid_shell
|
||||||
|
shell) is_format_valid_shell "$arg" ;;
|
||||||
stats_pass) is_password_format_valid "$arg" ;;
|
stats_pass) is_password_format_valid "$arg" ;;
|
||||||
stats_user) is_user_format_valid "$arg" "$arg_name" ;;
|
stats_user) is_user_format_valid "$arg" "$arg_name" ;;
|
||||||
template) is_object_format_valid "$arg" "$arg_name" ;;
|
template) is_object_format_valid "$arg" "$arg_name" ;;
|
||||||
|
@ -898,7 +968,85 @@ format_aliases() {
|
||||||
aliases=$(echo "$aliases" |tr -s '.')
|
aliases=$(echo "$aliases" |tr -s '.')
|
||||||
aliases=$(echo "$aliases" |sed -e "s/[.]*$//g")
|
aliases=$(echo "$aliases" |sed -e "s/[.]*$//g")
|
||||||
aliases=$(echo "$aliases" |sed -e "s/^[.]*//")
|
aliases=$(echo "$aliases" |sed -e "s/^[.]*//")
|
||||||
aliases=$(echo "$aliases" |grep -v www.$domain |sed -e "/^$/d")
|
aliases=$(echo "$aliases" |sed -e "/^$/d")
|
||||||
aliases=$(echo "$aliases" |tr '\n' ',' |sed -e "s/,$//")
|
aliases=$(echo "$aliases" |tr '\n' ',' |sed -e "s/,$//")
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alter_web_counter() {
|
||||||
|
user=$1
|
||||||
|
domain=$2
|
||||||
|
USER_DATA=$VESTA/data/users/$user
|
||||||
|
|
||||||
|
varc=$3
|
||||||
|
vard="\$${varc}"
|
||||||
|
counter=$(get_object_value 'web' 'DOMAIN' "$domain" "$vard")
|
||||||
|
|
||||||
|
if [ -z "$counter" ]; then
|
||||||
|
add_object_key "web" 'DOMAIN' "$domain" "$varc" "TIME"
|
||||||
|
counter=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
((counter++))
|
||||||
|
backup_counter=$counter
|
||||||
|
|
||||||
|
update_object_value 'web' 'DOMAIN' "$domain" "$vard" "$counter"
|
||||||
|
counter=$backup_counter
|
||||||
|
|
||||||
|
echo $counter
|
||||||
|
}
|
||||||
|
|
||||||
|
reset_web_counter() {
|
||||||
|
user=$1
|
||||||
|
domain=$2
|
||||||
|
USER_DATA=$VESTA/data/users/$user
|
||||||
|
|
||||||
|
varc=$3
|
||||||
|
vard="\$${varc}"
|
||||||
|
|
||||||
|
update_object_value 'web' 'DOMAIN' "$domain" "$vard" "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_web_counter() {
|
||||||
|
user=$1
|
||||||
|
domain=$2
|
||||||
|
USER_DATA=$VESTA/data/users/$user
|
||||||
|
|
||||||
|
varc=$3
|
||||||
|
vard="\$${varc}"
|
||||||
|
counter=$(get_object_value 'web' 'DOMAIN' "$domain" "$vard")
|
||||||
|
|
||||||
|
if [ -z "$counter" ]; then
|
||||||
|
counter=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $counter
|
||||||
|
}
|
||||||
|
|
||||||
|
# Simple chmod wrapper that skips symlink files after glob expand
|
||||||
|
# Taken from HestiaCP
|
||||||
|
no_symlink_chmod() {
|
||||||
|
local filemode=$1; shift;
|
||||||
|
|
||||||
|
for i in "$@"; do
|
||||||
|
[[ -L ${i} ]] && continue
|
||||||
|
|
||||||
|
chmod "${filemode}" "${i}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# $1 = subject
|
||||||
|
# $2 = body
|
||||||
|
send_email_to_admin() {
|
||||||
|
email=$(grep CONTACT /usr/local/vesta/data/users/admin/user.conf)
|
||||||
|
email=$(echo "$email" | cut -f 2 -d "'")
|
||||||
|
if [ -z "$email" ]; then
|
||||||
|
if [ ! -z "$NOTIFY_ADMIN_FULL_BACKUP" ]; then
|
||||||
|
email=$NOTIFY_ADMIN_FULL_BACKUP
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ -z "$email" ]; then
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
echo "$2" | $SENDMAIL -s "$1" "$email" 'yes'
|
||||||
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ rebuild_user_conf() {
|
||||||
mkdir -p $HOMEDIR/$user/conf
|
mkdir -p $HOMEDIR/$user/conf
|
||||||
chmod a+x $HOMEDIR/$user
|
chmod a+x $HOMEDIR/$user
|
||||||
chmod a+x $HOMEDIR/$user/conf
|
chmod a+x $HOMEDIR/$user/conf
|
||||||
chown $user:$user $HOMEDIR/$user
|
chown --no-dereference $user:$user $HOMEDIR/$user
|
||||||
chown root:root $HOMEDIR/$user/conf
|
chown root:root $HOMEDIR/$user/conf
|
||||||
|
|
||||||
# Update disk pipe
|
# Update disk pipe
|
||||||
|
@ -71,13 +71,16 @@ rebuild_user_conf() {
|
||||||
echo "$BIN/v-update-web-domains-disk $user" \
|
echo "$BIN/v-update-web-domains-disk $user" \
|
||||||
>> $VESTA/data/queue/disk.pipe
|
>> $VESTA/data/queue/disk.pipe
|
||||||
|
|
||||||
|
if [[ -L "$HOMEDIR/$user/web" ]]; then
|
||||||
|
rm $HOMEDIR/$user/web
|
||||||
|
fi
|
||||||
mkdir -p $HOMEDIR/$user/conf/web
|
mkdir -p $HOMEDIR/$user/conf/web
|
||||||
mkdir -p $HOMEDIR/$user/web
|
mkdir -p $HOMEDIR/$user/web
|
||||||
mkdir -p $HOMEDIR/$user/tmp
|
mkdir -p $HOMEDIR/$user/tmp
|
||||||
chmod 751 $HOMEDIR/$user/conf/web
|
chmod 751 $HOMEDIR/$user/conf/web
|
||||||
chmod 751 $HOMEDIR/$user/web
|
chmod 751 $HOMEDIR/$user/web
|
||||||
chmod 771 $HOMEDIR/$user/tmp
|
chmod 771 $HOMEDIR/$user/tmp
|
||||||
chown $user:$user $HOMEDIR/$user/web
|
chown --no-dereference $user:$user $HOMEDIR/$user/web
|
||||||
if [ -z "$create_user" ]; then
|
if [ -z "$create_user" ]; then
|
||||||
$BIN/v-rebuild-web-domains $user $restart
|
$BIN/v-rebuild-web-domains $user $restart
|
||||||
fi
|
fi
|
||||||
|
@ -105,6 +108,9 @@ rebuild_user_conf() {
|
||||||
echo "$BIN/v-update-mail-domains-disk $user" \
|
echo "$BIN/v-update-mail-domains-disk $user" \
|
||||||
>> $VESTA/data/queue/disk.pipe
|
>> $VESTA/data/queue/disk.pipe
|
||||||
|
|
||||||
|
if [[ -L "$HOMEDIR/$user/mail" ]]; then
|
||||||
|
rm $HOMEDIR/$user/mail
|
||||||
|
fi
|
||||||
mkdir -p $HOMEDIR/$user/conf/mail
|
mkdir -p $HOMEDIR/$user/conf/mail
|
||||||
mkdir -p $HOMEDIR/$user/mail
|
mkdir -p $HOMEDIR/$user/mail
|
||||||
chmod 751 $HOMEDIR/$user/mail
|
chmod 751 $HOMEDIR/$user/mail
|
||||||
|
@ -146,7 +152,7 @@ rebuild_web_domain_conf() {
|
||||||
prepare_web_domain_values
|
prepare_web_domain_values
|
||||||
|
|
||||||
# Rebuilding domain directories
|
# Rebuilding domain directories
|
||||||
mkdir -p $HOMEDIR/$user/web/$domain \
|
sudo -u $user mkdir -p $HOMEDIR/$user/web/$domain \
|
||||||
$HOMEDIR/$user/web/$domain/public_html \
|
$HOMEDIR/$user/web/$domain/public_html \
|
||||||
$HOMEDIR/$user/web/$domain/public_shtml \
|
$HOMEDIR/$user/web/$domain/public_shtml \
|
||||||
$HOMEDIR/$user/web/$domain/document_errors \
|
$HOMEDIR/$user/web/$domain/document_errors \
|
||||||
|
@ -172,14 +178,15 @@ rebuild_web_domain_conf() {
|
||||||
|
|
||||||
# Propagating html skeleton
|
# Propagating html skeleton
|
||||||
if [ ! -e "$WEBTPL/skel/document_errors/" ]; then
|
if [ ! -e "$WEBTPL/skel/document_errors/" ]; then
|
||||||
cp -r $WEBTPL/skel/document_errors/ $HOMEDIR/$user/web/$domain/
|
sudo -u $user cp -r $WEBTPL/skel/document_errors/ \
|
||||||
|
$HOMEDIR/$user/web/$domain/
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Set folder permissions
|
# Set folder permissions
|
||||||
chmod 551 $HOMEDIR/$user/web/$domain \
|
no_symlink_chmod 551 $HOMEDIR/$user/web/$domain \
|
||||||
$HOMEDIR/$user/web/$domain/stats \
|
$HOMEDIR/$user/web/$domain/stats \
|
||||||
$HOMEDIR/$user/web/$domain/logs
|
$HOMEDIR/$user/web/$domain/logs
|
||||||
chmod 751 $HOMEDIR/$user/web/$domain/private \
|
no_symlink_chmod 751 $HOMEDIR/$user/web/$domain/private \
|
||||||
$HOMEDIR/$user/web/$domain/cgi-bin \
|
$HOMEDIR/$user/web/$domain/cgi-bin \
|
||||||
$HOMEDIR/$user/web/$domain/public_html \
|
$HOMEDIR/$user/web/$domain/public_html \
|
||||||
$HOMEDIR/$user/web/$domain/public_shtml \
|
$HOMEDIR/$user/web/$domain/public_shtml \
|
||||||
|
@ -187,7 +194,7 @@ rebuild_web_domain_conf() {
|
||||||
chmod 640 /var/log/$WEB_SYSTEM/domains/$domain.*
|
chmod 640 /var/log/$WEB_SYSTEM/domains/$domain.*
|
||||||
|
|
||||||
# Set ownership
|
# Set ownership
|
||||||
chown $user:$user $HOMEDIR/$user/web/$domain \
|
chown --no-dereference $user:$user $HOMEDIR/$user/web/$domain \
|
||||||
$HOMEDIR/$user/web/$domain/private \
|
$HOMEDIR/$user/web/$domain/private \
|
||||||
$HOMEDIR/$user/web/$domain/cgi-bin \
|
$HOMEDIR/$user/web/$domain/cgi-bin \
|
||||||
$HOMEDIR/$user/web/$domain/public_html \
|
$HOMEDIR/$user/web/$domain/public_html \
|
||||||
|
@ -535,12 +542,30 @@ rebuild_mail_domain_conf() {
|
||||||
rebuild_mysql_database() {
|
rebuild_mysql_database() {
|
||||||
mysql_connect $HOST
|
mysql_connect $HOST
|
||||||
mysql_query "CREATE DATABASE \`$DB\` CHARACTER SET $CHARSET" >/dev/null
|
mysql_query "CREATE DATABASE \`$DB\` CHARACTER SET $CHARSET" >/dev/null
|
||||||
if [ "$(echo $mysql_ver |cut -d '.' -f2)" -ge 7 ]; then
|
if [ "$mysql_fork" = "mysql" ]; then
|
||||||
mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`" >/dev/null
|
# mysql
|
||||||
mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`@localhost" >/dev/null
|
if [ "$(echo $mysql_ver |cut -d '.' -f2)" -ge 7 ]; then
|
||||||
query="UPDATE mysql.user SET authentication_string='$MD5'"
|
# mysql >= 5.7
|
||||||
query="$query WHERE User='$DBUSER'"
|
mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`" > /dev/null
|
||||||
|
mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`@localhost" > /dev/null
|
||||||
|
query="UPDATE mysql.user SET authentication_string='$MD5'"
|
||||||
|
query="$query WHERE User='$DBUSER'"
|
||||||
|
else
|
||||||
|
# mysql < 5.7
|
||||||
|
query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER'"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
|
# mariadb
|
||||||
|
if [ "$(echo $mysql_ver |cut -d '.' -f1)" -eq 5 ]; then
|
||||||
|
# mariadb = 5
|
||||||
|
mysql_query "CREATE USER \`$DBUSER\`" > /dev/null
|
||||||
|
mysql_query "CREATE USER \`$DBUSER\`@localhost" > /dev/null
|
||||||
|
else
|
||||||
|
# mariadb = 10
|
||||||
|
mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`" > /dev/null
|
||||||
|
mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`@localhost" > /dev/null
|
||||||
|
fi
|
||||||
|
# mariadb any version
|
||||||
query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER'"
|
query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER'"
|
||||||
fi
|
fi
|
||||||
mysql_query "GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@\`%\`" >/dev/null
|
mysql_query "GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@\`%\`" >/dev/null
|
||||||
|
@ -576,7 +601,7 @@ rebuild_pgsql_database() {
|
||||||
exit $E_CONNECT
|
exit $E_CONNECT
|
||||||
fi
|
fi
|
||||||
|
|
||||||
query="CREATE ROLE $DBUSER"
|
query="CREATE ROLE $DBUSER WITH LOGIN"
|
||||||
psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
|
psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
|
||||||
|
|
||||||
query="UPDATE pg_authid SET rolpassword='$MD5' WHERE rolname='$DBUSER'"
|
query="UPDATE pg_authid SET rolpassword='$MD5' WHERE rolname='$DBUSER'"
|
||||||
|
@ -593,7 +618,7 @@ rebuild_pgsql_database() {
|
||||||
query="GRANT ALL PRIVILEGES ON DATABASE $DB TO $DBUSER"
|
query="GRANT ALL PRIVILEGES ON DATABASE $DB TO $DBUSER"
|
||||||
psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
|
psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
|
||||||
|
|
||||||
query="GRANT CONNECT ON DATABASE template1 to $dbuser"
|
query="GRANT CONNECT ON DATABASE template1 to $DBUSER"
|
||||||
psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
|
psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ http {
|
||||||
|
|
||||||
# Compression
|
# Compression
|
||||||
gzip on;
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
gzip_comp_level 9;
|
gzip_comp_level 9;
|
||||||
gzip_min_length 512;
|
gzip_min_length 512;
|
||||||
gzip_buffers 8 64k;
|
gzip_buffers 8 64k;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
location /phpmyadmin {
|
location /phpmyadmin {
|
||||||
alias /usr/share/phpmyadmin/;
|
alias /usr/share/phpmyadmin;
|
||||||
|
|
||||||
location ~ /(libraries|setup) {
|
location ~ /(libraries|setup) {
|
||||||
return 404;
|
return 404;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue