Compare commits
1591 Commits
xo-web-v5.
...
xo-server-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40f4a66bda | ||
|
|
6125dae158 | ||
|
|
dfe4a934e9 | ||
|
|
ecc33f46ab | ||
|
|
00d1985cf9 | ||
|
|
138aed8ae1 | ||
|
|
def9f947b7 | ||
|
|
20dc4af4a4 | ||
|
|
4d2909567c | ||
|
|
92a93e4393 | ||
|
|
389967d40c | ||
|
|
d66e8f29b7 | ||
|
|
3e9425bf79 | ||
|
|
41506e785e | ||
|
|
32d7ccfea5 | ||
|
|
8a9f952ada | ||
|
|
d15efae43f | ||
|
|
627c06f4a8 | ||
|
|
3e6201e93a | ||
|
|
b941a649b5 | ||
|
|
7b2b9ca618 | ||
|
|
404cf2b7e6 | ||
|
|
42698293de | ||
|
|
563969f2e9 | ||
|
|
887e21daa5 | ||
|
|
b75a2a8dca | ||
|
|
31f32ba23c | ||
|
|
936a4068d5 | ||
|
|
266f287774 | ||
|
|
5808485812 | ||
|
|
b6dd83e32b | ||
|
|
2236bd71c4 | ||
|
|
ec869ffdd3 | ||
|
|
1aa4966a92 | ||
|
|
235da199f9 | ||
|
|
4cad820271 | ||
|
|
4a0b29e1f2 | ||
|
|
1db9ca9e31 | ||
|
|
942ddfa742 | ||
|
|
355cddc044 | ||
|
|
c23cccf2ce | ||
|
|
1407fb7bab | ||
|
|
4ba542b70f | ||
|
|
76f75401ee | ||
|
|
011cc7ad65 | ||
|
|
b966e6097f | ||
|
|
809e1a35cd | ||
|
|
8e7e1fccbe | ||
|
|
e86b30f205 | ||
|
|
7dc0c4cf15 | ||
|
|
561a9f140d | ||
|
|
ba56114e9f | ||
|
|
11bd75d2fe | ||
|
|
ececbaf201 | ||
|
|
1985134d94 | ||
|
|
2cc59078b1 | ||
|
|
3d4d7db5da | ||
|
|
dc40ceaafe | ||
|
|
0110e223ee | ||
|
|
e7467dca8a | ||
|
|
4a1e87b534 | ||
|
|
5a32f904bc | ||
|
|
14d023a9f5 | ||
|
|
2e5e81e93e | ||
|
|
c9cc106be6 | ||
|
|
29fc17f260 | ||
|
|
c7d16fd345 | ||
|
|
ffe29b8957 | ||
|
|
be1bd9254d | ||
|
|
6156649faa | ||
|
|
2edddaa835 | ||
|
|
d00fff3d4c | ||
|
|
c0b84ae848 | ||
|
|
f68d1539aa | ||
|
|
455e48596c | ||
|
|
ba6b968256 | ||
|
|
8fbf2786fd | ||
|
|
06d38808be | ||
|
|
49565a672b | ||
|
|
2d980f3d50 | ||
|
|
e29ba3e0cf | ||
|
|
dff342d2bd | ||
|
|
d38ad3a17f | ||
|
|
ce21da4146 | ||
|
|
09a381806b | ||
|
|
0ca7b8539f | ||
|
|
cc90d41be4 | ||
|
|
a7dd83772e | ||
|
|
eea52b5166 | ||
|
|
4c20e89a8b | ||
|
|
0d88a9f8f4 | ||
|
|
7ad4fc0e6c | ||
|
|
c7c205d52f | ||
|
|
cdc43a6cde | ||
|
|
a58a9a9e6a | ||
|
|
9d2f15cf33 | ||
|
|
2d596af9a5 | ||
|
|
f70a25e82f | ||
|
|
33859303bd | ||
|
|
1ed0c01add | ||
|
|
dfcd41992a | ||
|
|
26cb388c64 | ||
|
|
b2be6e5d5b | ||
|
|
2fec62968e | ||
|
|
b15a6963e4 | ||
|
|
f7b4f78c8d | ||
|
|
9bebfe71ac | ||
|
|
a7b3e8e59c | ||
|
|
b9f3313903 | ||
|
|
9c4bd0d0dd | ||
|
|
ac2e490569 | ||
|
|
114cf7ac7d | ||
|
|
255e0c61d5 | ||
|
|
288868fe91 | ||
|
|
aba7b730f5 | ||
|
|
b95fc86667 | ||
|
|
0ed1df3af6 | ||
|
|
eff38b9aee | ||
|
|
53477be12d | ||
|
|
d99555a4a8 | ||
|
|
f00be23e02 | ||
|
|
ee6025f3ad | ||
|
|
990c0e570d | ||
|
|
b07b4e3744 | ||
|
|
6d25e11f72 | ||
|
|
16c250e122 | ||
|
|
e6a10e1ac2 | ||
|
|
829beb84e2 | ||
|
|
c3066921ab | ||
|
|
ca424f166b | ||
|
|
4192abf3c2 | ||
|
|
d51527b2d8 | ||
|
|
a1c829e393 | ||
|
|
7dfb1635c2 | ||
|
|
e58d56a656 | ||
|
|
93037ee44f | ||
|
|
ecd8265098 | ||
|
|
4c73cfa423 | ||
|
|
19b3c207c7 | ||
|
|
58d4408909 | ||
|
|
4925e678ed | ||
|
|
7d14705dcf | ||
|
|
5d0040acd1 | ||
|
|
8aa6c6551b | ||
|
|
c9f08a2f8f | ||
|
|
70b17a6fa9 | ||
|
|
c1a118f2a1 | ||
|
|
fa3eb1cdf5 | ||
|
|
16a6902bd2 | ||
|
|
296e30a40f | ||
|
|
03f6e33fd2 | ||
|
|
dde4410a1b | ||
|
|
191af334e7 | ||
|
|
69d5abc840 | ||
|
|
0e4b0ce768 | ||
|
|
d065887ffd | ||
|
|
de33f33c0f | ||
|
|
aa45032364 | ||
|
|
4f6c515cef | ||
|
|
3ed081f04c | ||
|
|
3370014ddf | ||
|
|
3241c426a2 | ||
|
|
961babe6a3 | ||
|
|
b654cba4b4 | ||
|
|
4bf4de1979 | ||
|
|
c2c62b20f0 | ||
|
|
f6e48adc28 | ||
|
|
80c1c81514 | ||
|
|
16f8029e69 | ||
|
|
072dea71f0 | ||
|
|
ff1892057d | ||
|
|
cdc2ac2d9b | ||
|
|
de76387c8f | ||
|
|
939b416d2e | ||
|
|
f1b1c4ae13 | ||
|
|
d38a4ccf08 | ||
|
|
fb1bf6a1e7 | ||
|
|
46100729b0 | ||
|
|
4916643fdc | ||
|
|
124d743052 | ||
|
|
dfdc2a62ab | ||
|
|
76f3bc0758 | ||
|
|
e16971c31a | ||
|
|
c4b9e36346 | ||
|
|
c95fe164cf | ||
|
|
f1964f3380 | ||
|
|
84701cb7e2 | ||
|
|
f8a2f2d3cd | ||
|
|
4b092a5a7f | ||
|
|
33e8cb81bb | ||
|
|
e2b29be6a8 | ||
|
|
6f9dad8999 | ||
|
|
089cffcca1 | ||
|
|
88df5a8337 | ||
|
|
794c1cf89b | ||
|
|
9a5eea6e78 | ||
|
|
40568cd61f | ||
|
|
358e1441cc | ||
|
|
be930e127e | ||
|
|
3656e83df5 | ||
|
|
abbb0450f8 | ||
|
|
8e4beeb00f | ||
|
|
05d10ef985 | ||
|
|
989d27154d | ||
|
|
ec9957bd86 | ||
|
|
dc8a7c46e0 | ||
|
|
9ee2d8e0c2 | ||
|
|
6c62d6840a | ||
|
|
2a2135ac71 | ||
|
|
efaad2efb2 | ||
|
|
3b244c24d7 | ||
|
|
915052d5f6 | ||
|
|
05c6c7830d | ||
|
|
0217c51559 | ||
|
|
0c514198bb | ||
|
|
0e68834b4c | ||
|
|
ee99ef6264 | ||
|
|
bebb9bf0df | ||
|
|
4830ac9623 | ||
|
|
58b1d0fba8 | ||
|
|
cc4e69e631 | ||
|
|
e14fda6e8a | ||
|
|
ec48b77af3 | ||
|
|
c7d6a19864 | ||
|
|
7d714c8ce4 | ||
|
|
f70989c3a2 | ||
|
|
70490988b0 | ||
|
|
d0795fdded | ||
|
|
1c736e9910 | ||
|
|
62979d5c22 | ||
|
|
ec8a4da73c | ||
|
|
dea1bfee01 | ||
|
|
c18b82504a | ||
|
|
ed5460273f | ||
|
|
b91f8b21b9 | ||
|
|
5cea18e577 | ||
|
|
148eaa6a72 | ||
|
|
80794211af | ||
|
|
75dcbae417 | ||
|
|
b19682b3c5 | ||
|
|
dd3b97cae2 | ||
|
|
79891235f3 | ||
|
|
1e2f72ab6b | ||
|
|
66d02e3808 | ||
|
|
275e1f8f4c | ||
|
|
84dbbb0fbb | ||
|
|
a36ef5209c | ||
|
|
3497889302 | ||
|
|
0a2f6b4ce7 | ||
|
|
f8be44d746 | ||
|
|
379253c5ae | ||
|
|
aed1ba474c | ||
|
|
bc72e67442 | ||
|
|
26c965faa9 | ||
|
|
b3a3965ed2 | ||
|
|
d7fa68248c | ||
|
|
7f88b46f4c | ||
|
|
dd60d82d3d | ||
|
|
4eeb995340 | ||
|
|
1d29348e30 | ||
|
|
a24db3f896 | ||
|
|
cffac27d0a | ||
|
|
b207cbdd77 | ||
|
|
10baecefb9 | ||
|
|
42620323a9 | ||
|
|
4d91006994 | ||
|
|
a81f0b9a93 | ||
|
|
2cee413ae1 | ||
|
|
53099eacc8 | ||
|
|
b628c5c07e | ||
|
|
12889b6a09 | ||
|
|
0c23ca5b66 | ||
|
|
d732ee3ade | ||
|
|
65cb0bc4cf | ||
|
|
1ba68a94e3 | ||
|
|
084430451a | ||
|
|
458a4d4efe | ||
|
|
92a67bf5fb | ||
|
|
b20a46da76 | ||
|
|
62eeab2a74 | ||
|
|
790b43910d | ||
|
|
ba65461c4d | ||
|
|
5bd468791f | ||
|
|
37f71bb36c | ||
|
|
2ed4b7ad3f | ||
|
|
7eb970f22a | ||
|
|
13db4a8411 | ||
|
|
49a7a89bbf | ||
|
|
0af8a60c1c | ||
|
|
e1650b376c | ||
|
|
873b40cc70 | ||
|
|
d45265b180 | ||
|
|
ff50b2848e | ||
|
|
d67fae22ab | ||
|
|
d809002558 | ||
|
|
5c30559d15 | ||
|
|
cbb5b011e1 | ||
|
|
f5bff408a8 | ||
|
|
d7cfe4d3dc | ||
|
|
7be8f38c6b | ||
|
|
08a7e605ce | ||
|
|
4b57db5893 | ||
|
|
8b1ae3f3c9 | ||
|
|
77d35a5928 | ||
|
|
323d409e6c | ||
|
|
9f2f2b7b69 | ||
|
|
b44fa7beca | ||
|
|
26bba23890 | ||
|
|
6d4e310b8e | ||
|
|
6726530229 | ||
|
|
8351352541 | ||
|
|
3f9e8d79ea | ||
|
|
685f2328bd | ||
|
|
746567a8a7 | ||
|
|
c116c41c42 | ||
|
|
3768a7de37 | ||
|
|
0c0fed2484 | ||
|
|
11ef0ee54f | ||
|
|
33ae531e3a | ||
|
|
8cc9924751 | ||
|
|
c329ab863b | ||
|
|
41820ea316 | ||
|
|
bf00f80716 | ||
|
|
9baf0c74e4 | ||
|
|
b59ccdf26f | ||
|
|
8b06049bf8 | ||
|
|
9cae978923 | ||
|
|
311d914b96 | ||
|
|
592cb4ef9e | ||
|
|
ec2db7f2d0 | ||
|
|
71eab7ba9b | ||
|
|
5e07171d60 | ||
|
|
3f73e3d964 | ||
|
|
0045a1e608 | ||
|
|
0ebe78b4a2 | ||
|
|
61c3379298 | ||
|
|
44866f3316 | ||
|
|
4bb8ce8779 | ||
|
|
95252be5f0 | ||
|
|
58eb6a8b5f | ||
|
|
52f6a79e01 | ||
|
|
129f79d44b | ||
|
|
385c3eb563 | ||
|
|
e56be51b45 | ||
|
|
24ae65b254 | ||
|
|
d5dffbacbd | ||
|
|
c6ae969a82 | ||
|
|
005a9fdc01 | ||
|
|
2e74f87ae0 | ||
|
|
f505d4d911 | ||
|
|
65cd32125b | ||
|
|
8ada6b121e | ||
|
|
b9a87efb0d | ||
|
|
89485a82d2 | ||
|
|
451f87c6b4 | ||
|
|
c3cb5a3221 | ||
|
|
458609ed2e | ||
|
|
fcec8113f3 | ||
|
|
5f14d84ad2 | ||
|
|
ebbd882ee4 | ||
|
|
0506e19a66 | ||
|
|
ecc62e4f54 | ||
|
|
2b95eb4e4d | ||
|
|
bcde9e0f74 | ||
|
|
114501ebc7 | ||
|
|
ebab7c0867 | ||
|
|
0e2270fb6e | ||
|
|
593493ec0c | ||
|
|
d92898a806 | ||
|
|
7890e46551 | ||
|
|
ef942a6209 | ||
|
|
67d13bf634 | ||
|
|
fdde916388 | ||
|
|
31314d201b | ||
|
|
a29a949c51 | ||
|
|
cc1ce8c5f8 | ||
|
|
a21bf4ebe5 | ||
|
|
3d0420dbd9 | ||
|
|
37c4a9d6ef | ||
|
|
f652bda0a4 | ||
|
|
04c74dd30f | ||
|
|
2f256291ae | ||
|
|
272565243d | ||
|
|
bcb66a4145 | ||
|
|
2d9368062e | ||
|
|
4670c393a9 | ||
|
|
b110bacf61 | ||
|
|
6552f7b865 | ||
|
|
78afdc0af5 | ||
|
|
ad6cd7985a | ||
|
|
a61661776d | ||
|
|
1a9ebddcab | ||
|
|
7ab907a854 | ||
|
|
68a34f7cdb | ||
|
|
da4ff3082d | ||
|
|
9c05a59b5f | ||
|
|
6780146505 | ||
|
|
2758833fc6 | ||
|
|
2786d7ec46 | ||
|
|
945a2006c9 | ||
|
|
b9e574e32f | ||
|
|
34f1ef1680 | ||
|
|
4ac4310bc1 | ||
|
|
a10997ca66 | ||
|
|
0e52a4c7dc | ||
|
|
a4b3e22c2b | ||
|
|
441bd7c754 | ||
|
|
ddbd32d1cb | ||
|
|
a5b0cbeaea | ||
|
|
c6f3b2b1ce | ||
|
|
3d869d9fa1 | ||
|
|
7a5229741f | ||
|
|
78e0c2d8fa | ||
|
|
5928984069 | ||
|
|
61a472f108 | ||
|
|
e45f78ea20 | ||
|
|
b3ae9d88eb | ||
|
|
f7f26537be | ||
|
|
96848fc6d4 | ||
|
|
51e6f0c79f | ||
|
|
4f94ad40b7 | ||
|
|
43e1eb9939 | ||
|
|
1f6d7de861 | ||
|
|
bd623c2daf | ||
|
|
40c71c2102 | ||
|
|
72a1580eff | ||
|
|
9e2404a0d7 | ||
|
|
7dd84d1518 | ||
|
|
d800db5d09 | ||
|
|
2714ccff38 | ||
|
|
1d493e411b | ||
|
|
2a0c222f2d | ||
|
|
641d68de0e | ||
|
|
2dd0fd660b | ||
|
|
bb5441c7bc | ||
|
|
eeea9e662b | ||
|
|
8d4874e240 | ||
|
|
a8ba4a1a8e | ||
|
|
0c027247ec | ||
|
|
164cb39c1b | ||
|
|
52503de645 | ||
|
|
83b8b5de61 | ||
|
|
3e326c4e62 | ||
|
|
a6b0690416 | ||
|
|
dcd007c5c7 | ||
|
|
eb090e4874 | ||
|
|
4b716584f7 | ||
|
|
4bc348f39f | ||
|
|
9c75992fe4 | ||
|
|
4bb2702ac5 | ||
|
|
ea8133cb41 | ||
|
|
fc40c7b03d | ||
|
|
7fe5b66fdb | ||
|
|
0f1d052493 | ||
|
|
56a182f795 | ||
|
|
e8da1b943b | ||
|
|
42a3ee90e4 | ||
|
|
3913b0eba1 | ||
|
|
7990e45095 | ||
|
|
a7068ec166 | ||
|
|
55b35ac0cf | ||
|
|
a251f8ca75 | ||
|
|
172ce2c7a1 | ||
|
|
3cef668a75 | ||
|
|
e6deb29070 | ||
|
|
51609d45a2 | ||
|
|
5cb6dc6d92 | ||
|
|
c5174a61b7 | ||
|
|
93e987982c | ||
|
|
fc421428fd | ||
|
|
7400bd657a | ||
|
|
da62cba3f8 | ||
|
|
461cc7e547 | ||
|
|
b898ed4785 | ||
|
|
e4bd59b2ea | ||
|
|
9310e3c258 | ||
|
|
149530e73f | ||
|
|
7e627c953e | ||
|
|
bc86984f19 | ||
|
|
e40f3acdd4 | ||
|
|
63d93224e0 | ||
|
|
c87356c319 | ||
|
|
74f4a83aea | ||
|
|
e67038a04d | ||
|
|
1fa73b57a2 | ||
|
|
73c746fdd3 | ||
|
|
ab1413b741 | ||
|
|
c087eaf229 | ||
|
|
8b9f9ffa3e | ||
|
|
a83fa90d87 | ||
|
|
505f06c1d8 | ||
|
|
2ac1093543 | ||
|
|
b3d8ce2041 | ||
|
|
b47789bf82 | ||
|
|
0a5e1a9bce | ||
|
|
f333679319 | ||
|
|
20d3faa306 | ||
|
|
cf11ed0830 | ||
|
|
acd390ac42 | ||
|
|
8a2fbe3ab5 | ||
|
|
7a6e7ec153 | ||
|
|
7d90346c91 | ||
|
|
abb5193ced | ||
|
|
52e845834e | ||
|
|
c1c17fad44 | ||
|
|
d7b4025893 | ||
|
|
934356571c | ||
|
|
738d98eb42 | ||
|
|
7e689076d8 | ||
|
|
0b9d031965 | ||
|
|
53f470518b | ||
|
|
664d648435 | ||
|
|
0d718bd632 | ||
|
|
ed5e0c3509 | ||
|
|
20d5047b55 | ||
|
|
4cfe3ec06e | ||
|
|
87664ff16a | ||
|
|
adf278fc83 | ||
|
|
a4d0fa62d2 | ||
|
|
96f4896c84 | ||
|
|
ff59d091f1 | ||
|
|
f5d6407ec9 | ||
|
|
4cac99d79a | ||
|
|
d1a046279d | ||
|
|
cb9fa5c42b | ||
|
|
05f9e6895b | ||
|
|
63b5ee6f96 | ||
|
|
36d2de049f | ||
|
|
86b0d5e2b7 | ||
|
|
d34f641130 | ||
|
|
39d7b4c7bd | ||
|
|
ad0d4156fb | ||
|
|
80187e2789 | ||
|
|
89e25c9b81 | ||
|
|
ca51d59815 | ||
|
|
433f445e99 | ||
|
|
474a765e1b | ||
|
|
7d4b17380d | ||
|
|
b58b1d94cd | ||
|
|
16e7257e3b | ||
|
|
ca1a46f980 | ||
|
|
596bd12f59 | ||
|
|
301ab65c01 | ||
|
|
35f210e074 | ||
|
|
c239b518e0 | ||
|
|
f45935aa44 | ||
|
|
782505b292 | ||
|
|
1368e3b86d | ||
|
|
ab9c24401e | ||
|
|
831f4e48d1 | ||
|
|
f5511449af | ||
|
|
80c1e39b53 | ||
|
|
3ce4e86784 | ||
|
|
fb617418bb | ||
|
|
9fb0f793b2 | ||
|
|
3b21a097ab | ||
|
|
ef09a42a89 | ||
|
|
74d8f2a859 | ||
|
|
48910f9c0f | ||
|
|
788a1accbd | ||
|
|
b254e7e852 | ||
|
|
e288fa1b8a | ||
|
|
eb9ec68494 | ||
|
|
10ab4f2d79 | ||
|
|
b1986dc275 | ||
|
|
831e36ae5f | ||
|
|
77a2d37d98 | ||
|
|
37b90e25dc | ||
|
|
41f16846b6 | ||
|
|
3e89c62e72 | ||
|
|
b7d3762c06 | ||
|
|
481bc9430a | ||
|
|
13f2470887 | ||
|
|
0308fe4e6e | ||
|
|
197273193e | ||
|
|
e4b11a793b | ||
|
|
927d3135c4 | ||
|
|
aa533c20d6 | ||
|
|
7fd615525a | ||
|
|
6abf3fc0af | ||
|
|
6bb0929822 | ||
|
|
feebc04e55 | ||
|
|
2d406cd7c1 | ||
|
|
788bfe632f | ||
|
|
1149102f37 | ||
|
|
8bd949f618 | ||
|
|
489b142a66 | ||
|
|
cbbbb6da4f | ||
|
|
6701c7e3af | ||
|
|
dc6d688c96 | ||
|
|
65ebbf179f | ||
|
|
2246e818b9 | ||
|
|
f32f0ee215 | ||
|
|
533e85d058 | ||
|
|
4f2c750dbb | ||
|
|
aa64385bc6 | ||
|
|
e80d0689ad | ||
|
|
e7a077b820 | ||
|
|
0c58a8569e | ||
|
|
ca7d577d54 | ||
|
|
0c6315458f | ||
|
|
61f9aa6293 | ||
|
|
7d950e2b8d | ||
|
|
2d18ff6561 | ||
|
|
4c2307ee49 | ||
|
|
6e2e04bf7f | ||
|
|
94d84c2516 | ||
|
|
2fcb000466 | ||
|
|
3be965ed7f | ||
|
|
77d067613d | ||
|
|
5e3702856f | ||
|
|
1bb6c8232b | ||
|
|
bb6f133db9 | ||
|
|
72c3287b48 | ||
|
|
aa12e78421 | ||
|
|
319caf5275 | ||
|
|
d074a9e744 | ||
|
|
8f6eb12b3d | ||
|
|
1477b241be | ||
|
|
848330c188 | ||
|
|
33b728fdc3 | ||
|
|
aec4069eca | ||
|
|
2221f8afb0 | ||
|
|
08b845a51e | ||
|
|
39561ee4e7 | ||
|
|
9879eef3c6 | ||
|
|
7eda47a9b3 | ||
|
|
fe1d4c345d | ||
|
|
bc818b7873 | ||
|
|
f850fe5404 | ||
|
|
1fb3c73e51 | ||
|
|
f8a86d27dd | ||
|
|
59d222db72 | ||
|
|
f4ad9cd17a | ||
|
|
da93883b6c | ||
|
|
d86d81e63d | ||
|
|
0610d977f3 | ||
|
|
e11fb476b1 | ||
|
|
28baa2ab7f | ||
|
|
7b97202ef8 | ||
|
|
e6a71f44ca | ||
|
|
2646fa9eda | ||
|
|
95f71adcef | ||
|
|
9817158f2e | ||
|
|
0e0faf07c2 | ||
|
|
1009c8945e | ||
|
|
cb8cc6b274 | ||
|
|
e2ea78578b | ||
|
|
4d494b891c | ||
|
|
82ded7d160 | ||
|
|
7d211bdb8f | ||
|
|
f1abb402fb | ||
|
|
a16a96664f | ||
|
|
9edad84198 | ||
|
|
debf2f5416 | ||
|
|
5107725252 | ||
|
|
c6dfe43119 | ||
|
|
24e0d2c815 | ||
|
|
ebf895d1b9 | ||
|
|
bceda43ff2 | ||
|
|
d69597636c | ||
|
|
9ff66b9394 | ||
|
|
d28d3a92e5 | ||
|
|
21d14ab3c7 | ||
|
|
ed08417fc2 | ||
|
|
39f9911e67 | ||
|
|
da5899b5d3 | ||
|
|
0cc45d085a | ||
|
|
cce456242b | ||
|
|
0eee44fb0d | ||
|
|
597d568183 | ||
|
|
fee6a56af1 | ||
|
|
f7b094819e | ||
|
|
f7842b5adc | ||
|
|
58f2ec91fb | ||
|
|
61206a3610 | ||
|
|
c18392d036 | ||
|
|
7fe1aa443b | ||
|
|
044d9cb4dc | ||
|
|
f8795fa181 | ||
|
|
b456fa75e0 | ||
|
|
9832ec0b1d | ||
|
|
bd3acc634e | ||
|
|
f32ee571ac | ||
|
|
826d4de16c | ||
|
|
b7ac721593 | ||
|
|
1566762729 | ||
|
|
f0b758fd4b | ||
|
|
0df04c84d2 | ||
|
|
6f1b91b1e5 | ||
|
|
95af905b7d | ||
|
|
67efe31e63 | ||
|
|
46c7e89363 | ||
|
|
9d221df259 | ||
|
|
fd2a123e20 | ||
|
|
4696b6563c | ||
|
|
1a0e72c468 | ||
|
|
f6f749d583 | ||
|
|
72f0f8602d | ||
|
|
6933c42a1b | ||
|
|
349b117c8c | ||
|
|
80b13b2ad7 | ||
|
|
2825f8540b | ||
|
|
fed3d82898 | ||
|
|
1805f130bc | ||
|
|
86baf3c81e | ||
|
|
37e6778589 | ||
|
|
b368925dfc | ||
|
|
3e848ebfe3 | ||
|
|
253180b02f | ||
|
|
07ba868a26 | ||
|
|
31846074a2 | ||
|
|
dc51545583 | ||
|
|
2696b5ca9b | ||
|
|
8c8f62374d | ||
|
|
de7b94ea48 | ||
|
|
38df724e66 | ||
|
|
180de5b9c9 | ||
|
|
a7b13df315 | ||
|
|
6d878f5cc8 | ||
|
|
c216213081 | ||
|
|
be4dda141b | ||
|
|
e4b45eef88 | ||
|
|
97d83364f3 | ||
|
|
deaf6bfdb9 | ||
|
|
ef19892ae9 | ||
|
|
a6af324c8d | ||
|
|
9608f6f2d7 | ||
|
|
fdd45c94d6 | ||
|
|
374fe7d868 | ||
|
|
d93a89ca92 | ||
|
|
3c2a0f1fbf | ||
|
|
d3b06c30de | ||
|
|
7ef6b4fcda | ||
|
|
5352de1b01 | ||
|
|
5574747054 | ||
|
|
5b3f11d09b | ||
|
|
f9e88fc88f | ||
|
|
f2c94dc31d | ||
|
|
400c8938b7 | ||
|
|
0d45cc7479 | ||
|
|
4cfe825b61 | ||
|
|
b723e24ac8 | ||
|
|
f48f4b85d8 | ||
|
|
8822f0303d | ||
|
|
6175a8c8c1 | ||
|
|
0da8f44922 | ||
|
|
05f1fcfb55 | ||
|
|
cdf3c16cd9 | ||
|
|
a7bdd1798e | ||
|
|
ac47fc602b | ||
|
|
29cb8fbdfc | ||
|
|
ee329f0def | ||
|
|
e58e4d65e3 | ||
|
|
9286784ce5 | ||
|
|
9ded80448c | ||
|
|
d82dd63e11 | ||
|
|
9e8d366f38 | ||
|
|
3eb742d0d1 | ||
|
|
df6159fa62 | ||
|
|
8de5135f15 | ||
|
|
f3b4a53666 | ||
|
|
a0d37cf2b8 | ||
|
|
533899da09 | ||
|
|
93fbc8b1dd | ||
|
|
6157df4ebe | ||
|
|
069743038a | ||
|
|
07823e4109 | ||
|
|
0a8d7562ca | ||
|
|
2c8dea7a45 | ||
|
|
cf9bcb09d5 | ||
|
|
19a20f5b3e | ||
|
|
023251d090 | ||
|
|
23e9ee4ae2 | ||
|
|
2e8289d4dc | ||
|
|
b2a8b643e7 | ||
|
|
64a91abd12 | ||
|
|
4076fec42f | ||
|
|
1b80ae3871 | ||
|
|
eff8f7fa7a | ||
|
|
de4608c0c3 | ||
|
|
4ed6186de7 | ||
|
|
1734083219 | ||
|
|
4c512fc0d0 | ||
|
|
eb78d8229f | ||
|
|
f279b32eb0 | ||
|
|
336f47a9ca | ||
|
|
fd2bc8a719 | ||
|
|
f831dae65a | ||
|
|
c4fd6650c3 | ||
|
|
0ab6db4a97 | ||
|
|
593a78cd8d | ||
|
|
c50a2d87f1 | ||
|
|
b6056e9b0f | ||
|
|
660002dde8 | ||
|
|
3031bac5b6 | ||
|
|
3020f3cc15 | ||
|
|
2db8e2e1ea | ||
|
|
df3beb6be2 | ||
|
|
86f2cacc6a | ||
|
|
6a37b9649d | ||
|
|
6f794380ac | ||
|
|
cf5a092462 | ||
|
|
8828d2e59e | ||
|
|
fe78af36a9 | ||
|
|
1a330cbe89 | ||
|
|
09a8cd30d2 | ||
|
|
7ca04e2e19 | ||
|
|
6daf84faee | ||
|
|
b1c3ab0ee4 | ||
|
|
84234bd708 | ||
|
|
79de7ad301 | ||
|
|
b62a88aa0f | ||
|
|
936e0ddf22 | ||
|
|
470bbd9d25 | ||
|
|
843632b2e4 | ||
|
|
a9e54a069e | ||
|
|
1c2b052d15 | ||
|
|
a7911429ff | ||
|
|
eb865bccab | ||
|
|
c03b5b5014 | ||
|
|
cecd3d2cae | ||
|
|
8ff6807a3a | ||
|
|
563cb9a3c7 | ||
|
|
b1b2d0ed3a | ||
|
|
cda34f372a | ||
|
|
f82845548c | ||
|
|
972cf9bd76 | ||
|
|
8ea197c21d | ||
|
|
dcbc1af0e7 | ||
|
|
2df8ce3575 | ||
|
|
5a67b9ea89 | ||
|
|
0862732739 | ||
|
|
f3cc2a62da | ||
|
|
75288f16ea | ||
|
|
a185ab01df | ||
|
|
e184763b91 | ||
|
|
c890d1b8be | ||
|
|
ddb173ebb9 | ||
|
|
456a55907d | ||
|
|
dd91b037ea | ||
|
|
fe83402210 | ||
|
|
d3a3fd67b9 | ||
|
|
a4d173aa2c | ||
|
|
e706256fb1 | ||
|
|
2664af0db5 | ||
|
|
a710b6ffe3 | ||
|
|
066c477f9b | ||
|
|
38ab23b927 | ||
|
|
add5f1754c | ||
|
|
6468c01a79 | ||
|
|
0d1c4d367a | ||
|
|
7fba73f0df | ||
|
|
ff904f50cb | ||
|
|
e1b96a7a74 | ||
|
|
db87d6ef8a | ||
|
|
95390670c4 | ||
|
|
5e198b248f | ||
|
|
f4b92386bd | ||
|
|
39c60ba387 | ||
|
|
39387b828c | ||
|
|
e845a14f26 | ||
|
|
d0fe9671f0 | ||
|
|
f82caf2b09 | ||
|
|
30f77bfbff | ||
|
|
bf20ea976f | ||
|
|
e33bd22cb7 | ||
|
|
33fed71626 | ||
|
|
7e339b9a0a | ||
|
|
bc8c5acb66 | ||
|
|
0a0dff877f | ||
|
|
54e4c377d8 | ||
|
|
ff78acf4c5 | ||
|
|
2b726730e9 | ||
|
|
41f3f4d816 | ||
|
|
cb591f77e9 | ||
|
|
d508f7b4ed | ||
|
|
1c8388f3fd | ||
|
|
93af3900af | ||
|
|
13ae7ecf59 | ||
|
|
76a7c6dad8 | ||
|
|
93e830e09e | ||
|
|
0151fcc626 | ||
|
|
2966b9007c | ||
|
|
cec868d45f | ||
|
|
0488bbc8a1 | ||
|
|
4a766eb9e7 | ||
|
|
7c7661375c | ||
|
|
791fa36d73 | ||
|
|
6faf1ce65d | ||
|
|
f4bc71af7e | ||
|
|
7872430235 | ||
|
|
5621af6a4c | ||
|
|
bcf4945ea1 | ||
|
|
be4403d8ec | ||
|
|
4acf2aad38 | ||
|
|
5c32f6a1f2 | ||
|
|
40f81fbf2e | ||
|
|
f4d9f226f6 | ||
|
|
4d52c559c6 | ||
|
|
4cad5382df | ||
|
|
888110152f | ||
|
|
61e0e9ecd2 | ||
|
|
53c694630c | ||
|
|
dc3383a237 | ||
|
|
43d7a4b9f1 | ||
|
|
e2669cb5d3 | ||
|
|
7e89a0bf42 | ||
|
|
680880d857 | ||
|
|
b08d026eec | ||
|
|
e9c2aeeca0 | ||
|
|
5fd178783f | ||
|
|
ddcc8a149d | ||
|
|
0f30157be2 | ||
|
|
80d3698481 | ||
|
|
07fb894c0e | ||
|
|
5ca9654b2f | ||
|
|
88ba3f3ff3 | ||
|
|
03a3685f1d | ||
|
|
fe12941494 | ||
|
|
12eaa0a9b3 | ||
|
|
782f8e1349 | ||
|
|
cece40ed47 | ||
|
|
4e7250c4c2 | ||
|
|
80f56ed41d | ||
|
|
6fd67a8fd2 | ||
|
|
24d16438c1 | ||
|
|
2f5de232e1 | ||
|
|
f8189b4874 | ||
|
|
1f9cac4e08 | ||
|
|
34b67b9ed9 | ||
|
|
27af2f263c | ||
|
|
6c18c72620 | ||
|
|
2c41851564 | ||
|
|
8df79730d1 | ||
|
|
c237c5bdcd | ||
|
|
41175d8ff6 | ||
|
|
b1b28fa365 | ||
|
|
4bf3148596 | ||
|
|
0f29455dc5 | ||
|
|
826b702fb9 | ||
|
|
b10f19b139 | ||
|
|
6b1ac2002b | ||
|
|
5b91e5c685 | ||
|
|
07b9e5f16a | ||
|
|
c4487d4aec | ||
|
|
9815acf6f7 | ||
|
|
2a94921f58 | ||
|
|
112ee94d79 | ||
|
|
8ae51cfd36 | ||
|
|
e6feb15704 | ||
|
|
fabff5954b | ||
|
|
d6b6df042d | ||
|
|
5db7b5f6c4 | ||
|
|
1b679bd8ec | ||
|
|
1e4660583b | ||
|
|
c6b16525e7 | ||
|
|
6c144493e0 | ||
|
|
4dd31cb6db | ||
|
|
60bc923ca0 | ||
|
|
71f2e67321 | ||
|
|
60b2fdb319 | ||
|
|
13739ca558 | ||
|
|
1a3ffb05ab | ||
|
|
beb5587b52 | ||
|
|
d8eefb1293 | ||
|
|
e0c1fd1d3c | ||
|
|
788124e144 | ||
|
|
c8a337dd90 | ||
|
|
6332e73e38 | ||
|
|
7e443c8aef | ||
|
|
c0b2be170b | ||
|
|
6bc6328ad2 | ||
|
|
c469f5b01e | ||
|
|
f7f666c383 | ||
|
|
e11fd76b35 | ||
|
|
d9ede0fd4f | ||
|
|
061217791d | ||
|
|
418099f893 | ||
|
|
3925926693 | ||
|
|
eb52095081 | ||
|
|
635acfd9af | ||
|
|
a4a06d1331 | ||
|
|
3f58d0ae0c | ||
|
|
0f6ff55f80 | ||
|
|
1cf462a989 | ||
|
|
124afa9be7 | ||
|
|
d8334d1515 | ||
|
|
1a291b5ef4 | ||
|
|
45e8cfabb2 | ||
|
|
411ef0b3fb | ||
|
|
4b14b2a6a5 | ||
|
|
c3c6aec2f1 | ||
|
|
5e74e44ec1 | ||
|
|
74d257e413 | ||
|
|
38829421a9 | ||
|
|
59407a71e9 | ||
|
|
11c3668e5f | ||
|
|
7572dea71c | ||
|
|
5983b606fe | ||
|
|
6a595bffbb | ||
|
|
e9c667f1e9 | ||
|
|
9bbbc94dfc | ||
|
|
a61f6504ab | ||
|
|
7a2a409a11 | ||
|
|
5bfade48dc | ||
|
|
5c32b364f2 | ||
|
|
cbb00668d9 | ||
|
|
ef729a907a | ||
|
|
92754242b6 | ||
|
|
3149fa7315 | ||
|
|
75de33bf7a | ||
|
|
e4e3111ed2 | ||
|
|
d501217dc7 | ||
|
|
9dd803290f | ||
|
|
da23a92ca8 | ||
|
|
643d61bad0 | ||
|
|
1fce46471b | ||
|
|
ca98a8ecc2 | ||
|
|
0c7d93f88b | ||
|
|
136f69fe28 | ||
|
|
3c10cfd594 | ||
|
|
8d09e6d0e6 | ||
|
|
acb3448358 | ||
|
|
67a1cb9d1a | ||
|
|
8d81266e72 | ||
|
|
8864353f5a | ||
|
|
579dfbe5c9 | ||
|
|
6256227922 | ||
|
|
978d1c7a61 | ||
|
|
47f5b04ed8 | ||
|
|
27a22e10ab | ||
|
|
0ebffa1e63 | ||
|
|
d3eeb05cbc | ||
|
|
a263663312 | ||
|
|
330794b27b | ||
|
|
8ec6684000 | ||
|
|
0b40b77802 | ||
|
|
cea08dba5a | ||
|
|
64c0ff1e39 | ||
|
|
2070c663e0 | ||
|
|
73c84bfb2a | ||
|
|
b4d1dd7f49 | ||
|
|
029c854003 | ||
|
|
aad8999275 | ||
|
|
87a621288d | ||
|
|
2f9ae7e3b1 | ||
|
|
2d2eee4a4c | ||
|
|
7569bb4cca | ||
|
|
e4090ac84b | ||
|
|
b34554a2d4 | ||
|
|
0d16963705 | ||
|
|
c1c459e4fc | ||
|
|
739d13fb04 | ||
|
|
e74d613808 | ||
|
|
117d5e0796 | ||
|
|
4ccc89098e | ||
|
|
4455b128a9 | ||
|
|
c72063eee5 | ||
|
|
a96965c1b9 | ||
|
|
1b08d32314 | ||
|
|
9df6f3e28a | ||
|
|
296b4a8ce5 | ||
|
|
aad5fa8786 | ||
|
|
c159448710 | ||
|
|
d6d5d2420a | ||
|
|
187e7db6d2 | ||
|
|
66fd334d8b | ||
|
|
ca840a67e5 | ||
|
|
9efda9be12 | ||
|
|
be818f184e | ||
|
|
b3cf525630 | ||
|
|
b1b5b4d304 | ||
|
|
4686c78ab3 | ||
|
|
9b7631e3c4 | ||
|
|
f1a68fa299 | ||
|
|
e1a7352540 | ||
|
|
db58260f1a | ||
|
|
b89102da3e | ||
|
|
a56730468d | ||
|
|
f1b7c35f4c | ||
|
|
81215139d2 | ||
|
|
05b1d54fe0 | ||
|
|
5f69fdd67e | ||
|
|
dd1e8b59aa | ||
|
|
9703ba0bd9 | ||
|
|
9f66d28a3e | ||
|
|
e1df5b6ed6 | ||
|
|
4fc3e34eb6 | ||
|
|
f77a4ff0b2 | ||
|
|
23d859938a | ||
|
|
63548bea00 | ||
|
|
ea65148af5 | ||
|
|
251b2c7065 | ||
|
|
3d86d7f8b9 | ||
|
|
1b6a4bf31e | ||
|
|
05e1a1192a | ||
|
|
3a8e1c613d | ||
|
|
b67c3a62a4 | ||
|
|
3232743319 | ||
|
|
7ea80d5b8f | ||
|
|
46266cdb0e | ||
|
|
3ac5002791 | ||
|
|
b2b1d33a8c | ||
|
|
1265fea287 | ||
|
|
c372ecde65 | ||
|
|
eeaa441bef | ||
|
|
4e977562f1 | ||
|
|
7d7050da5d | ||
|
|
f7d6020389 | ||
|
|
c5be0f5234 | ||
|
|
e11ff2ddd4 | ||
|
|
ee950bba1e | ||
|
|
d2c69e8e11 | ||
|
|
375b1dcb68 | ||
|
|
3da04fa93a | ||
|
|
4560b1a302 | ||
|
|
dadec0b012 | ||
|
|
cf7f65dc6e | ||
|
|
4956ec2cda | ||
|
|
bba3f1e7b5 | ||
|
|
4795848566 | ||
|
|
672b10a953 | ||
|
|
28b0f7a183 | ||
|
|
a621240c1f | ||
|
|
5ee9de601e | ||
|
|
a15017de97 | ||
|
|
9085f861ee | ||
|
|
4791137a31 | ||
|
|
5a8cf21e69 | ||
|
|
f9ee192038 | ||
|
|
96f0f3af27 | ||
|
|
b66218302d | ||
|
|
a9cc6a3179 | ||
|
|
4619a044bb | ||
|
|
b3d7219b11 | ||
|
|
54cad25e87 | ||
|
|
25e5fee4e8 | ||
|
|
8b6696bf7b | ||
|
|
df3ed64dc4 | ||
|
|
08833c4a35 | ||
|
|
850e3260ba | ||
|
|
ed26decd58 | ||
|
|
db86bff8e6 | ||
|
|
466fe9b7bb | ||
|
|
d4de92ddc7 | ||
|
|
0847fa35c1 | ||
|
|
7c80281ce2 | ||
|
|
cf2d57809c | ||
|
|
4e99177686 | ||
|
|
8d8401251f | ||
|
|
7936381467 | ||
|
|
49f418c795 | ||
|
|
5bc100ea76 | ||
|
|
f7d35eb206 | ||
|
|
b50b2c9673 | ||
|
|
177fc6a406 | ||
|
|
1f64537225 | ||
|
|
67ae93831e | ||
|
|
1922d35ce9 | ||
|
|
7058ab2052 | ||
|
|
e4f42601ea | ||
|
|
dec031469a | ||
|
|
f292bd8ab0 | ||
|
|
12a269ed75 | ||
|
|
6fc1fb0a9e | ||
|
|
5fcc4928e8 | ||
|
|
d6fd53875e | ||
|
|
03e890359b | ||
|
|
bb877fcee4 | ||
|
|
ec26374ae9 | ||
|
|
1d03334180 | ||
|
|
0499b7d385 | ||
|
|
1fc52d83b4 | ||
|
|
8025af6a41 | ||
|
|
4d4f1f1476 | ||
|
|
b6bf6bce7c | ||
|
|
a292b28a23 | ||
|
|
078d784645 | ||
|
|
f4463410fc | ||
|
|
661f5d2d1b | ||
|
|
b8e07b8bcf | ||
|
|
5817b48da3 | ||
|
|
0a4ad93156 | ||
|
|
cb37849bec | ||
|
|
3a8707f6c1 | ||
|
|
3574e41133 | ||
|
|
43bcc52ff0 | ||
|
|
d63142d209 | ||
|
|
38d7735014 | ||
|
|
d5889c90f5 | ||
|
|
4b4e7a89d3 | ||
|
|
905d6bc9af | ||
|
|
000cc244e0 | ||
|
|
e8948dd4f5 | ||
|
|
05613baad6 | ||
|
|
2a5526fc31 | ||
|
|
95a61af91d | ||
|
|
cc2b7a4748 | ||
|
|
7f93ae3354 | ||
|
|
1d5ed7d1c8 | ||
|
|
ce29157fb8 | ||
|
|
339cb25d7c | ||
|
|
611cd2c638 | ||
|
|
751f4f7c40 | ||
|
|
dc85ea7408 | ||
|
|
bd08a6e73f | ||
|
|
205f8384dd | ||
|
|
07ff90d387 | ||
|
|
afc561013b | ||
|
|
d3f274fe27 | ||
|
|
59628f0f3b | ||
|
|
0c95559d82 | ||
|
|
ed80e9b6a4 | ||
|
|
2c56711551 | ||
|
|
d6f4f618f9 | ||
|
|
0b7adf8e28 | ||
|
|
794efb3af8 | ||
|
|
73aebe0bd2 | ||
|
|
33f32df33f | ||
|
|
278c79d6fa | ||
|
|
2982aa7770 | ||
|
|
42c0035e04 | ||
|
|
445f588913 | ||
|
|
91a58e5a2e | ||
|
|
92aa05154c | ||
|
|
301124f1c0 | ||
|
|
add2c92940 | ||
|
|
e463424ee4 | ||
|
|
7c5a530eb0 | ||
|
|
dd13ad657d | ||
|
|
64d379f1d6 | ||
|
|
16e920ee84 | ||
|
|
b9d3e1dab6 | ||
|
|
086519367d | ||
|
|
bf40c52e7e | ||
|
|
2e730b7623 | ||
|
|
290694314f | ||
|
|
3d52939547 | ||
|
|
3e8a692373 | ||
|
|
2f95e5426e | ||
|
|
7dd4ce4e7e | ||
|
|
88c58f44f5 | ||
|
|
52d5678c5d | ||
|
|
6f24cd1a73 | ||
|
|
64a1f19e19 | ||
|
|
41055b8cac | ||
|
|
6ad702ea2d | ||
|
|
0500943dd6 | ||
|
|
65619522a6 | ||
|
|
526ec2dfec | ||
|
|
e72f20e738 | ||
|
|
9b2b98e9ce | ||
|
|
382bfaa035 | ||
|
|
85d5df05f9 | ||
|
|
e2725ce23e | ||
|
|
784622142f | ||
|
|
54209c1613 | ||
|
|
db73e3f007 | ||
|
|
44a5d37f14 | ||
|
|
ee44cea02e | ||
|
|
950ae76120 | ||
|
|
0e686b5bb1 | ||
|
|
0b2b88b553 | ||
|
|
09f7a90491 | ||
|
|
07cedb8a22 | ||
|
|
cd8d899fb5 | ||
|
|
3c1f6075fe | ||
|
|
13847834e3 | ||
|
|
6deace2b7a | ||
|
|
5d056dcf2d | ||
|
|
4aa0fb6dfa | ||
|
|
bd0bbed7a1 | ||
|
|
62c6ebf8ce | ||
|
|
e5c549c93c | ||
|
|
8b8b5f14e6 | ||
|
|
8b8c1aa6b4 | ||
|
|
bd722e8702 | ||
|
|
ae09695687 | ||
|
|
87b743010c | ||
|
|
5424c35ec5 | ||
|
|
f03b671cbc | ||
|
|
d347f9acbb | ||
|
|
53d4d91521 | ||
|
|
9b12772843 | ||
|
|
846a33fe4a | ||
|
|
e2ae89c0a2 | ||
|
|
2a599da33e | ||
|
|
c04c93d499 | ||
|
|
5a615ab619 | ||
|
|
81638a1857 | ||
|
|
b7baf37cd8 | ||
|
|
fa39a9be3b | ||
|
|
68c2b8728c | ||
|
|
1bc0054344 | ||
|
|
7f16b6fa1a | ||
|
|
edd76774ed | ||
|
|
8873da1ba0 | ||
|
|
7481a410f8 | ||
|
|
5acf3b53fa | ||
|
|
2d93f3552a | ||
|
|
dd7f01ddd6 | ||
|
|
745f6a842f | ||
|
|
b089bedf9c | ||
|
|
994d3064f7 | ||
|
|
996308b0c3 | ||
|
|
4cb62a94e6 | ||
|
|
982fdcb596 | ||
|
|
5478e1b4ed | ||
|
|
53b46d22b1 | ||
|
|
a06bac9851 | ||
|
|
f1b0c1624a | ||
|
|
422deaa4ff | ||
|
|
cc02a1d22b | ||
|
|
a6f075d815 | ||
|
|
fa3e7e77fe | ||
|
|
28dffdb8cb | ||
|
|
03a1b2e150 | ||
|
|
0db4cd2bf0 | ||
|
|
49cf452fd7 | ||
|
|
4d1da86d47 | ||
|
|
78f81ac4d5 | ||
|
|
cc4920a0be | ||
|
|
f7d336248a | ||
|
|
132424cae7 | ||
|
|
b4a58c08d3 | ||
|
|
cb55e18a60 | ||
|
|
7eb95a982e | ||
|
|
57a0dd788c | ||
|
|
38720f5550 | ||
|
|
903eef70a7 | ||
|
|
698c4e92b2 | ||
|
|
24a39893e6 | ||
|
|
f2f356157c | ||
|
|
ef1b71d7d0 | ||
|
|
e4c08c7b9b | ||
|
|
b137db506f | ||
|
|
90165c24ba | ||
|
|
0a88403329 | ||
|
|
f69aec2c00 | ||
|
|
9d6e567937 | ||
|
|
a672e59a95 | ||
|
|
37efdf0122 | ||
|
|
7da4b53df7 | ||
|
|
7ec8185eef | ||
|
|
fabb4aa0d9 | ||
|
|
7ce2b30cb2 | ||
|
|
72792890e7 | ||
|
|
7788435903 | ||
|
|
1d65901641 | ||
|
|
ef32128612 | ||
|
|
192aa2077b | ||
|
|
2184f0cbb6 | ||
|
|
87aa733064 | ||
|
|
501cc9b1fd | ||
|
|
973f15835e | ||
|
|
715f28b1e5 | ||
|
|
9792527832 | ||
|
|
2cf0654d11 | ||
|
|
6e185d9ae5 | ||
|
|
a165013397 | ||
|
|
208477b493 | ||
|
|
b04cabc72e | ||
|
|
7860d677d3 | ||
|
|
0d714a753b | ||
|
|
709f7b0af6 | ||
|
|
882d6eafb6 | ||
|
|
ce1968a1b6 | ||
|
|
a4f36c7ed4 | ||
|
|
9bac47ce17 | ||
|
|
6fe0203930 | ||
|
|
a2009bba9b | ||
|
|
5ea3fe6dca | ||
|
|
5b915daefe | ||
|
|
82ea59d9e2 | ||
|
|
3708a7e3a1 | ||
|
|
ea3fa0a792 | ||
|
|
926f314d9f | ||
|
|
a4f72a6a83 | ||
|
|
f5dbcfd969 | ||
|
|
4671a174d4 | ||
|
|
6f149cb8cc | ||
|
|
bf4fb18dc3 | ||
|
|
2a03bbe226 | ||
|
|
1514072fd5 | ||
|
|
306a6635d6 | ||
|
|
980d977f16 | ||
|
|
98c877a107 | ||
|
|
e91ca7997b | ||
|
|
dfa1ea43c2 | ||
|
|
1b50bcab83 | ||
|
|
b0afd4cba0 | ||
|
|
33a2f88c39 | ||
|
|
e63307f3a6 | ||
|
|
069e4ef738 | ||
|
|
9c3852082a | ||
|
|
3da4d98340 | ||
|
|
c666fd308f | ||
|
|
9214f93ad1 | ||
|
|
9ef933d4f7 | ||
|
|
dc11c3524c | ||
|
|
7e18d69aa2 | ||
|
|
d29f4bc7e2 | ||
|
|
4b1ddd15b2 | ||
|
|
199ea74650 | ||
|
|
c2a8f6d05b | ||
|
|
1fece3047f | ||
|
|
64ada1d3fe | ||
|
|
917ec0fd76 | ||
|
|
4603d07e4f | ||
|
|
dc417be1d9 | ||
|
|
e888654085 | ||
|
|
b5775bfb0d | ||
|
|
db6b066b4b | ||
|
|
9e410b8749 | ||
|
|
e7efb0202b | ||
|
|
41abd8cbf2 | ||
|
|
aa6f67b731 | ||
|
|
6923892ae7 | ||
|
|
3f514760f9 | ||
|
|
db56405a9a | ||
|
|
4d889d4000 | ||
|
|
910c3c2398 | ||
|
|
327d1f8621 | ||
|
|
d6c8bcdb9f | ||
|
|
c4323eb9fc | ||
|
|
d191892815 | ||
|
|
abd401a327 | ||
|
|
a269af7029 | ||
|
|
01556dfadc | ||
|
|
e55377afd1 | ||
|
|
801546dc21 | ||
|
|
570f079cdc | ||
|
|
75d7c2cdfb | ||
|
|
ba5851969c | ||
|
|
939ed0ed87 | ||
|
|
39a8df64d0 | ||
|
|
47afcb7c20 | ||
|
|
b4f609e084 | ||
|
|
b1b26d4a6c | ||
|
|
e01c20a012 | ||
|
|
1cc006b89b | ||
|
|
72b4dccfbe | ||
|
|
3c79126acf | ||
|
|
4fb6e32107 | ||
|
|
d4aa4b6840 | ||
|
|
2bbf643579 | ||
|
|
cd340eb294 | ||
|
|
73af59317b | ||
|
|
f6d4c61e68 | ||
|
|
4fcead8540 | ||
|
|
3d4d961a6d | ||
|
|
625db08d3f | ||
|
|
9e29e3ef7c | ||
|
|
e2eb083cf8 | ||
|
|
8120a7ad66 | ||
|
|
46eeaa28da | ||
|
|
b1ee1e9376 | ||
|
|
968735b2a4 | ||
|
|
2e64660ff6 | ||
|
|
adbc9353f5 | ||
|
|
df89960182 | ||
|
|
8c903bc951 | ||
|
|
ff2fe3b8ca | ||
|
|
bbb2e6cd99 | ||
|
|
ddebae8eb3 | ||
|
|
ff9e1ebc9b | ||
|
|
0ef69135c7 | ||
|
|
58465a80ec | ||
|
|
436deb02be | ||
|
|
33773558d6 | ||
|
|
0ce72682bf | ||
|
|
75fcb78ec3 | ||
|
|
3d5117aa5e | ||
|
|
3febe34221 | ||
|
|
9b66e00e83 | ||
|
|
0e7b053798 | ||
|
|
5a2d063749 | ||
|
|
d96d50c5c5 | ||
|
|
bdbca9669f | ||
|
|
d04b28cf2d | ||
|
|
8929105c3d | ||
|
|
3ea19e5e01 | ||
|
|
7047b6985d | ||
|
|
ee94fb0509 | ||
|
|
748ef04e4a | ||
|
|
920c5ffbb3 | ||
|
|
b2d3e2ba97 | ||
|
|
424f78a593 | ||
|
|
3eda70aa65 | ||
|
|
c1751eb637 | ||
|
|
2907fef4f9 | ||
|
|
067950a344 | ||
|
|
18ab3822bf | ||
|
|
db65c7af47 | ||
|
|
1f5769ff5e | ||
|
|
c64e2a17c7 | ||
|
|
95e1e71b9e | ||
|
|
b4348a63a1 | ||
|
|
427513baaf | ||
|
|
e5dcbacc37 | ||
|
|
da9fa05a91 | ||
|
|
daebb849ce | ||
|
|
a302612c6b | ||
|
|
11a35b5856 | ||
|
|
3d146e4083 | ||
|
|
170c2dac21 | ||
|
|
cd55d863d3 | ||
|
|
62a052a9e4 | ||
|
|
fb2a1cc852 | ||
|
|
46432d62c3 | ||
|
|
cccd166037 | ||
|
|
9fcd828279 | ||
|
|
260f924840 | ||
|
|
6bcbd7e9c8 | ||
|
|
f2ba2bbbc5 | ||
|
|
1501f4da49 | ||
|
|
f72c04c044 | ||
|
|
4df9c2364a | ||
|
|
6ec540d89e | ||
|
|
bd4f0b2078 | ||
|
|
9e50c2a41e | ||
|
|
19a9e5f3c8 | ||
|
|
af4b38553d | ||
|
|
457630bfc1 | ||
|
|
49791bff45 | ||
|
|
8d791d2191 | ||
|
|
bf0609b2bb | ||
|
|
8eaed3bdca | ||
|
|
927b3c099f | ||
|
|
56907c6224 | ||
|
|
e214128b54 | ||
|
|
bfc182657b | ||
|
|
09d674c78d | ||
|
|
9bdade6314 | ||
|
|
ed1b564eeb | ||
|
|
75df238327 | ||
|
|
486455c6d7 | ||
|
|
43eb7fb452 | ||
|
|
289e90cc83 | ||
|
|
82f5394c3c | ||
|
|
431ca49021 | ||
|
|
9c9f9ace2e | ||
|
|
4865bc9b6a | ||
|
|
97eca2863b | ||
|
|
d2daa88d24 | ||
|
|
fc41f4fc22 | ||
|
|
2d95a94f55 | ||
|
|
77c4809964 | ||
|
|
cf50ce7fc7 | ||
|
|
9f3930005d | ||
|
|
7eb0c5da8e | ||
|
|
45f888c8f9 | ||
|
|
a05a531d6b | ||
|
|
782b3f920f | ||
|
|
462e454acf | ||
|
|
8a8f7310f6 | ||
|
|
d8c3b0c919 | ||
|
|
9d1d1e1c76 | ||
|
|
85ffdd8311 | ||
|
|
25ecdab2a0 | ||
|
|
83153e1905 | ||
|
|
6f68668801 | ||
|
|
5735ccb451 | ||
|
|
10eaaa26ba | ||
|
|
5795da46c7 | ||
|
|
e7e5711030 | ||
|
|
cbf020e7e6 | ||
|
|
3cbebd9c09 | ||
|
|
64f2e032e3 | ||
|
|
e00a8fd2e9 | ||
|
|
5a20006647 | ||
|
|
94743751bf | ||
|
|
f38632dd19 | ||
|
|
7760f47a27 | ||
|
|
69bf29b93b | ||
|
|
6c2b02112b | ||
|
|
486bb525e2 | ||
|
|
aedd309442 | ||
|
|
30f5eca6dd | ||
|
|
172475a9ef | ||
|
|
06ca258089 | ||
|
|
0573a3d533 | ||
|
|
3ec9dc0a45 | ||
|
|
e5f752b5fa | ||
|
|
cfb2e6b70a | ||
|
|
d3627af67f | ||
|
|
ed6ecbaa72 | ||
|
|
5a6ca0a717 | ||
|
|
53a6263930 | ||
|
|
fb050614e0 |
@@ -2,17 +2,21 @@ module.exports = {
|
||||
extends: ['standard', 'standard-jsx'],
|
||||
globals: {
|
||||
__DEV__: true,
|
||||
$Dict: true,
|
||||
$Diff: true,
|
||||
$Exact: true,
|
||||
$Keys: true,
|
||||
$PropertyType: true,
|
||||
$Shape: true,
|
||||
},
|
||||
parser: 'babel-eslint',
|
||||
rules: {
|
||||
'comma-dangle': ['error', 'always-multiline'],
|
||||
indent: 'off',
|
||||
'no-var': 'error',
|
||||
'node/no-extraneous-import': 'error',
|
||||
'node/no-extraneous-require': 'error',
|
||||
'prefer-const': 'error',
|
||||
'react/jsx-indent': 'off',
|
||||
},
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
[options]
|
||||
esproposal.decorators=ignore
|
||||
esproposal.optional_chaining=enable
|
||||
include_warnings=true
|
||||
module.use_strict=true
|
||||
|
||||
|
||||
4
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/_book/
|
||||
/coverage/
|
||||
/node_modules/
|
||||
/lerna-debug.log
|
||||
@@ -8,6 +9,9 @@
|
||||
/packages/*/dist/
|
||||
/packages/*/node_modules/
|
||||
|
||||
/packages/vhd-cli/src/commands/index.js
|
||||
|
||||
/packages/xen-api/examples/node_modules/
|
||||
/packages/xen-api/plot.dat
|
||||
|
||||
/packages/xo-server/.xo-server.*
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
module.exports = {
|
||||
semi: false,
|
||||
singleQuote: true,
|
||||
trailingComma: 'es5',
|
||||
}
|
||||
|
||||
12
.travis.yml
@@ -1,12 +1,18 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- stable
|
||||
#- stable # disable for now due to an issue of indirect dep upath with Node 9
|
||||
- 8
|
||||
- 6
|
||||
|
||||
# Use containers.
|
||||
# http://docs.travis-ci.com/user/workers/container-based-infrastructure/
|
||||
sudo: false
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- qemu-utils
|
||||
- blktap-utils
|
||||
- vmdk-stream-converter
|
||||
|
||||
before_install:
|
||||
- curl -o- -L https://yarnpkg.com/install.sh | bash
|
||||
@@ -14,3 +20,7 @@ before_install:
|
||||
|
||||
cache:
|
||||
yarn: true
|
||||
|
||||
script:
|
||||
- yarn run test
|
||||
- yarn run test-integration
|
||||
|
||||
@@ -1,40 +1,62 @@
|
||||
'use strict'
|
||||
|
||||
const PLUGINS_RE = /^(?:@babel\/plugin-.+|babel-plugin-lodash)$/
|
||||
const PLUGINS_RE = /^(?:@babel\/|babel-)plugin-.+$/
|
||||
const PRESETS_RE = /^@babel\/preset-.+$/
|
||||
|
||||
const NODE_ENV = process.env.NODE_ENV || 'development'
|
||||
const __PROD__ = NODE_ENV === 'production'
|
||||
const __TEST__ = NODE_ENV === 'test'
|
||||
|
||||
const configs = {
|
||||
'@babel/plugin-proposal-decorators': {
|
||||
legacy: true,
|
||||
},
|
||||
'@babel/plugin-proposal-pipeline-operator': {
|
||||
proposal: 'minimal',
|
||||
},
|
||||
'@babel/preset-env' (pkg) {
|
||||
return {
|
||||
debug: !__TEST__,
|
||||
|
||||
// disabled until https://github.com/babel/babel/issues/8323 is resolved
|
||||
// loose: true,
|
||||
|
||||
shippedProposals: true,
|
||||
targets: __PROD__
|
||||
? (() => {
|
||||
let node = (pkg.engines || {}).node
|
||||
if (node !== undefined) {
|
||||
const trimChars = '^=>~'
|
||||
while (trimChars.includes(node[0])) {
|
||||
node = node.slice(1)
|
||||
}
|
||||
return { node: node }
|
||||
}
|
||||
})()
|
||||
: { browsers: '', node: 'current' },
|
||||
useBuiltIns: '@babel/polyfill' in (pkg.dependencies || {}) && 'usage',
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
const getConfig = (key, ...args) => {
|
||||
const config = configs[key]
|
||||
return config === undefined
|
||||
? {}
|
||||
: typeof config === 'function'
|
||||
? config(...args)
|
||||
: config
|
||||
}
|
||||
|
||||
module.exports = function (pkg, plugins, presets) {
|
||||
plugins === undefined && (plugins = {})
|
||||
|
||||
presets === undefined && (presets = {})
|
||||
presets['@babel/preset-env'] = {
|
||||
debug: !__TEST__,
|
||||
loose: true,
|
||||
shippedProposals: true,
|
||||
targets: __PROD__
|
||||
? (() => {
|
||||
let node = (pkg.engines || {}).node
|
||||
if (node !== undefined) {
|
||||
const trimChars = '^=>~'
|
||||
while (trimChars.includes(node[0])) {
|
||||
node = node.slice(1)
|
||||
}
|
||||
return { node: node }
|
||||
}
|
||||
})()
|
||||
: { browsers: '', node: 'current' },
|
||||
useBuiltIns: '@babel/polyfill' in (pkg.dependencies || {}) && 'usage',
|
||||
}
|
||||
|
||||
Object.keys(pkg.devDependencies || {}).forEach(name => {
|
||||
if (!(name in presets) && PLUGINS_RE.test(name)) {
|
||||
plugins[name] = {}
|
||||
plugins[name] = getConfig(name, pkg)
|
||||
} else if (!(name in presets) && PRESETS_RE.test(name)) {
|
||||
presets[name] = {}
|
||||
presets[name] = getConfig(name, pkg)
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"private": true,
|
||||
"name": "@xen-orchestra/babel-config",
|
||||
"version": "0.0.0",
|
||||
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/babel-config",
|
||||
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@xen-orchestra/babel-config",
|
||||
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@xen-orchestra/cron",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"license": "ISC",
|
||||
"description": "Focused, well maintained, cron parser/scheduler",
|
||||
"keywords": [
|
||||
@@ -14,7 +14,7 @@
|
||||
"scheduling",
|
||||
"task"
|
||||
],
|
||||
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/cron",
|
||||
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@xen-orchestra/cron",
|
||||
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -41,10 +41,10 @@
|
||||
"moment-timezone": "^0.5.14"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "7.0.0-beta.40",
|
||||
"@babel/core": "7.0.0-beta.40",
|
||||
"@babel/preset-env": "7.0.0-beta.40",
|
||||
"@babel/preset-flow": "7.0.0-beta.40",
|
||||
"@babel/cli": "7.0.0-rc.1",
|
||||
"@babel/core": "7.0.0-rc.1",
|
||||
"@babel/preset-env": "7.0.0-rc.1",
|
||||
"@babel/preset-flow": "7.0.0-rc.1",
|
||||
"cross-env": "^5.1.3",
|
||||
"rimraf": "^2.6.2"
|
||||
},
|
||||
|
||||
@@ -44,7 +44,9 @@ class Schedule {
|
||||
this._createDate =
|
||||
zone.toLowerCase() === 'utc'
|
||||
? moment.utc
|
||||
: zone === 'local' ? moment : () => moment.tz(zone)
|
||||
: zone === 'local'
|
||||
? moment
|
||||
: () => moment.tz(zone)
|
||||
}
|
||||
|
||||
createJob (fn) {
|
||||
|
||||
@@ -41,4 +41,8 @@ describe('next()', () => {
|
||||
'no solutions found for this schedule'
|
||||
)
|
||||
})
|
||||
|
||||
it('select the first sunday of the month', () => {
|
||||
expect(N('* * * * 0', '2018-03-31T00:00')).toBe('2018-04-01T00:00')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -176,10 +176,10 @@ export default createParser({
|
||||
range: [0, 11],
|
||||
},
|
||||
{
|
||||
aliases: 'mon tue wen thu fri sat sun'.split(' '),
|
||||
aliases: 'sun mon tue wen thu fri sat'.split(' '),
|
||||
name: 'dayOfWeek',
|
||||
post: value => (value === 0 ? 7 : value),
|
||||
range: [1, 7],
|
||||
post: value => (value === 7 ? 0 : value),
|
||||
range: [0, 6],
|
||||
},
|
||||
],
|
||||
presets: {
|
||||
|
||||
@@ -23,7 +23,7 @@ describe('parse()', () => {
|
||||
|
||||
it('correctly parse days', () => {
|
||||
expect(parse('* * * * mon,sun')).toEqual({
|
||||
dayOfWeek: [1, 7],
|
||||
dayOfWeek: [0, 1],
|
||||
})
|
||||
})
|
||||
|
||||
@@ -40,10 +40,10 @@ describe('parse()', () => {
|
||||
|
||||
it('dayOfWeek: 0 and 7 bind to sunday', () => {
|
||||
expect(parse('* * * * 0')).toEqual({
|
||||
dayOfWeek: [7],
|
||||
dayOfWeek: [0],
|
||||
})
|
||||
expect(parse('* * * * 7')).toEqual({
|
||||
dayOfWeek: [7],
|
||||
dayOfWeek: [0],
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
3
@xen-orchestra/fs/.babelrc.js
Normal file
@@ -0,0 +1,3 @@
|
||||
module.exports = require('../../@xen-orchestra/babel-config')(
|
||||
require('./package.json')
|
||||
)
|
||||
54
@xen-orchestra/fs/package.json
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"name": "@xen-orchestra/fs",
|
||||
"version": "0.2.1",
|
||||
"license": "AGPL-3.0",
|
||||
"description": "The File System for Xen Orchestra backups.",
|
||||
"keywords": [],
|
||||
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@xen-orchestra/fs",
|
||||
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vatesfr/xen-orchestra.git"
|
||||
},
|
||||
"preferGlobal": true,
|
||||
"main": "dist/",
|
||||
"bin": {},
|
||||
"files": [
|
||||
"dist/"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "7.0.0-rc.1",
|
||||
"@marsaud/smb2": "^0.9.0",
|
||||
"execa": "^0.10.0",
|
||||
"fs-extra": "^7.0.0",
|
||||
"get-stream": "^4.0.0",
|
||||
"lodash": "^4.17.4",
|
||||
"promise-toolbox": "^0.9.5",
|
||||
"through2": "^2.0.3",
|
||||
"tmp": "^0.0.33",
|
||||
"xo-remote-parser": "^0.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "7.0.0-rc.1",
|
||||
"@babel/core": "7.0.0-rc.1",
|
||||
"@babel/plugin-proposal-function-bind": "7.0.0-rc.1",
|
||||
"@babel/plugin-transform-runtime": "7.0.0-rc.1",
|
||||
"@babel/preset-env": "7.0.0-rc.1",
|
||||
"@babel/preset-flow": "7.0.0-rc.1",
|
||||
"babel-plugin-lodash": "^3.3.2",
|
||||
"cross-env": "^5.1.3",
|
||||
"index-modules": "^0.3.0",
|
||||
"rimraf": "^2.6.2"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/",
|
||||
"clean": "rimraf dist/",
|
||||
"dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/",
|
||||
"prebuild": "yarn run clean",
|
||||
"predev": "yarn run clean",
|
||||
"prepare": "yarn run build"
|
||||
}
|
||||
}
|
||||
307
@xen-orchestra/fs/src/abstract.js
Normal file
@@ -0,0 +1,307 @@
|
||||
// @flow
|
||||
|
||||
import getStream from 'get-stream'
|
||||
import { randomBytes } from 'crypto'
|
||||
import { fromCallback, fromEvent, ignoreErrors } from 'promise-toolbox'
|
||||
import { type Readable, type Writable } from 'stream'
|
||||
import { parse } from 'xo-remote-parser'
|
||||
|
||||
import { createChecksumStream, validChecksumOfReadStream } from './checksum'
|
||||
|
||||
type Data = Buffer | Readable | string
|
||||
type FileDescriptor = {| fd: mixed, path: string |}
|
||||
type LaxReadable = Readable & Object
|
||||
type LaxWritable = Writable & Object
|
||||
|
||||
type File = FileDescriptor | string
|
||||
|
||||
const checksumFile = file => file + '.checksum'
|
||||
|
||||
export default class RemoteHandlerAbstract {
|
||||
_remote: Object
|
||||
constructor (remote: any) {
|
||||
this._remote = { ...remote, ...parse(remote.url) }
|
||||
if (this._remote.type !== this.type) {
|
||||
throw new Error('Incorrect remote type')
|
||||
}
|
||||
}
|
||||
|
||||
get type (): string {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
/**
|
||||
* Asks the handler to sync the state of the effective remote with its' metadata
|
||||
*/
|
||||
async sync (): Promise<mixed> {
|
||||
return this._sync()
|
||||
}
|
||||
|
||||
async _sync (): Promise<mixed> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
/**
|
||||
* Free the resources possibly dedicated to put the remote at work, when it is no more needed
|
||||
*/
|
||||
async forget (): Promise<void> {
|
||||
await this._forget()
|
||||
}
|
||||
|
||||
async _forget (): Promise<void> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async test (): Promise<Object> {
|
||||
const testFileName = `${Date.now()}.test`
|
||||
const data = await fromCallback(cb => randomBytes(1024 * 1024, cb))
|
||||
let step = 'write'
|
||||
try {
|
||||
await this.outputFile(testFileName, data)
|
||||
step = 'read'
|
||||
const read = await this.readFile(testFileName)
|
||||
if (data.compare(read) !== 0) {
|
||||
throw new Error('output and input did not match')
|
||||
}
|
||||
return {
|
||||
success: true,
|
||||
}
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
step,
|
||||
file: testFileName,
|
||||
error: error.message || String(error),
|
||||
}
|
||||
} finally {
|
||||
ignoreErrors.call(this.unlink(testFileName))
|
||||
}
|
||||
}
|
||||
|
||||
async outputFile (file: string, data: Data, options?: Object): Promise<void> {
|
||||
return this._outputFile(file, data, {
|
||||
flags: 'wx',
|
||||
...options,
|
||||
})
|
||||
}
|
||||
|
||||
async _outputFile (file: string, data: Data, options?: Object): Promise<void> {
|
||||
const stream = await this.createOutputStream(file, options)
|
||||
const promise = fromEvent(stream, 'finish')
|
||||
stream.end(data)
|
||||
await promise
|
||||
}
|
||||
|
||||
async read (
|
||||
file: File,
|
||||
buffer: Buffer,
|
||||
position?: number
|
||||
): Promise<{| bytesRead: number, buffer: Buffer |}> {
|
||||
return this._read(file, buffer, position)
|
||||
}
|
||||
|
||||
_read (
|
||||
file: File,
|
||||
buffer: Buffer,
|
||||
position?: number
|
||||
): Promise<{| bytesRead: number, buffer: Buffer |}> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async readFile (file: string, options?: Object): Promise<Buffer> {
|
||||
return this._readFile(file, options)
|
||||
}
|
||||
|
||||
_readFile (file: string, options?: Object): Promise<Buffer> {
|
||||
return this.createReadStream(file, options).then(getStream.buffer)
|
||||
}
|
||||
|
||||
async rename (
|
||||
oldPath: string,
|
||||
newPath: string,
|
||||
{ checksum = false }: Object = {}
|
||||
) {
|
||||
let p = this._rename(oldPath, newPath)
|
||||
if (checksum) {
|
||||
p = Promise.all([
|
||||
p,
|
||||
this._rename(checksumFile(oldPath), checksumFile(newPath)),
|
||||
])
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
async _rename (oldPath: string, newPath: string) {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async list (
|
||||
dir: string = '.',
|
||||
{
|
||||
filter,
|
||||
prependDir = false,
|
||||
}: { filter?: (name: string) => boolean, prependDir?: boolean } = {}
|
||||
): Promise<string[]> {
|
||||
let entries = await this._list(dir)
|
||||
if (filter !== undefined) {
|
||||
entries = entries.filter(filter)
|
||||
}
|
||||
|
||||
if (prependDir) {
|
||||
entries.forEach((entry, i) => {
|
||||
entries[i] = dir + '/' + entry
|
||||
})
|
||||
}
|
||||
|
||||
return entries
|
||||
}
|
||||
|
||||
async _list (dir: string): Promise<string[]> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
createReadStream (
|
||||
file: string,
|
||||
{ checksum = false, ignoreMissingChecksum = false, ...options }: Object = {}
|
||||
): Promise<LaxReadable> {
|
||||
const path = typeof file === 'string' ? file : file.path
|
||||
const streamP = this._createReadStream(file, options).then(stream => {
|
||||
// detect early errors
|
||||
let promise = fromEvent(stream, 'readable')
|
||||
|
||||
// try to add the length prop if missing and not a range stream
|
||||
if (
|
||||
stream.length === undefined &&
|
||||
options.end === undefined &&
|
||||
options.start === undefined
|
||||
) {
|
||||
promise = Promise.all([
|
||||
promise,
|
||||
ignoreErrors.call(
|
||||
this.getSize(file).then(size => {
|
||||
stream.length = size
|
||||
})
|
||||
),
|
||||
])
|
||||
}
|
||||
|
||||
return promise.then(() => stream)
|
||||
})
|
||||
|
||||
if (!checksum) {
|
||||
return streamP
|
||||
}
|
||||
|
||||
// avoid a unhandled rejection warning
|
||||
ignoreErrors.call(streamP)
|
||||
|
||||
return this.readFile(checksumFile(path)).then(
|
||||
checksum =>
|
||||
streamP.then(stream => {
|
||||
const { length } = stream
|
||||
stream = (validChecksumOfReadStream(
|
||||
stream,
|
||||
String(checksum).trim()
|
||||
): LaxReadable)
|
||||
stream.length = length
|
||||
|
||||
return stream
|
||||
}),
|
||||
error => {
|
||||
if (ignoreMissingChecksum && error && error.code === 'ENOENT') {
|
||||
return streamP
|
||||
}
|
||||
throw error
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
async _createReadStream (
|
||||
file: string,
|
||||
options?: Object
|
||||
): Promise<LaxReadable> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async openFile (path: string, flags?: string): Promise<FileDescriptor> {
|
||||
return { fd: await this._openFile(path, flags), path }
|
||||
}
|
||||
|
||||
async _openFile (path: string, flags?: string): Promise<mixed> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async closeFile (fd: FileDescriptor): Promise<void> {
|
||||
await this._closeFile(fd.fd)
|
||||
}
|
||||
|
||||
async _closeFile (fd: mixed): Promise<void> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async refreshChecksum (path: string): Promise<void> {
|
||||
const stream = (await this.createReadStream(path)).pipe(
|
||||
createChecksumStream()
|
||||
)
|
||||
stream.resume() // start reading the whole file
|
||||
await this.outputFile(checksumFile(path), await stream.checksum)
|
||||
}
|
||||
|
||||
async createOutputStream (
|
||||
file: File,
|
||||
{ checksum = false, ...options }: Object = {}
|
||||
): Promise<LaxWritable> {
|
||||
const path = typeof file === 'string' ? file : file.path
|
||||
const streamP = this._createOutputStream(file, {
|
||||
flags: 'wx',
|
||||
...options,
|
||||
})
|
||||
|
||||
if (!checksum) {
|
||||
return streamP
|
||||
}
|
||||
|
||||
const checksumStream = createChecksumStream()
|
||||
const forwardError = error => {
|
||||
checksumStream.emit('error', error)
|
||||
}
|
||||
|
||||
const stream = await streamP
|
||||
stream.on('error', forwardError)
|
||||
checksumStream.pipe(stream)
|
||||
|
||||
// $FlowFixMe
|
||||
checksumStream.checksumWritten = checksumStream.checksum
|
||||
.then(value => this.outputFile(checksumFile(path), value))
|
||||
.catch(forwardError)
|
||||
|
||||
return checksumStream
|
||||
}
|
||||
|
||||
async _createOutputStream (
|
||||
file: mixed,
|
||||
options?: Object
|
||||
): Promise<LaxWritable> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async unlink (file: string, { checksum = true }: Object = {}): Promise<void> {
|
||||
if (checksum) {
|
||||
ignoreErrors.call(this._unlink(checksumFile(file)))
|
||||
}
|
||||
|
||||
await this._unlink(file)
|
||||
}
|
||||
|
||||
async _unlink (file: mixed): Promise<void> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
async getSize (file: mixed): Promise<number> {
|
||||
return this._getSize(file)
|
||||
}
|
||||
|
||||
async _getSize (file: mixed): Promise<number> {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
}
|
||||
100
@xen-orchestra/fs/src/checksum.js
Normal file
@@ -0,0 +1,100 @@
|
||||
// @flow
|
||||
|
||||
// $FlowFixMe
|
||||
import through2 from 'through2'
|
||||
import { createHash } from 'crypto'
|
||||
import { defer, fromEvent } from 'promise-toolbox'
|
||||
import { invert } from 'lodash'
|
||||
import { type Readable, type Transform } from 'stream'
|
||||
|
||||
// Format: $<algorithm>$<salt>$<encrypted>
|
||||
//
|
||||
// http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES
|
||||
const ALGORITHM_TO_ID = {
|
||||
md5: '1',
|
||||
sha256: '5',
|
||||
sha512: '6',
|
||||
}
|
||||
|
||||
const ID_TO_ALGORITHM = invert(ALGORITHM_TO_ID)
|
||||
|
||||
// Create a through stream which computes the checksum of all data going
|
||||
// through.
|
||||
//
|
||||
// The `checksum` attribute is a promise which resolves at the end of the stream
|
||||
// with a string representation of the checksum.
|
||||
//
|
||||
// const source = ...
|
||||
// const checksumStream = source.pipe(createChecksumStream())
|
||||
// checksumStream.resume() // make the data flow without an output
|
||||
// console.log(await checksumStream.checksum)
|
||||
export const createChecksumStream = (
|
||||
algorithm: string = 'md5'
|
||||
): Transform & { checksum: Promise<string> } => {
|
||||
const algorithmId = ALGORITHM_TO_ID[algorithm]
|
||||
|
||||
if (!algorithmId) {
|
||||
throw new Error(`unknown algorithm: ${algorithm}`)
|
||||
}
|
||||
|
||||
const hash = createHash(algorithm)
|
||||
const { promise, resolve, reject } = defer()
|
||||
|
||||
const stream = through2(
|
||||
(chunk, enc, callback) => {
|
||||
hash.update(chunk)
|
||||
callback(null, chunk)
|
||||
},
|
||||
callback => {
|
||||
resolve(`$${algorithmId}$$${hash.digest('hex')}`)
|
||||
callback()
|
||||
}
|
||||
).once('error', reject)
|
||||
stream.checksum = promise
|
||||
return stream
|
||||
}
|
||||
|
||||
// Check if the checksum of a readable stream is equals to an expected checksum.
|
||||
// The given stream is wrapped in a stream which emits an error event
|
||||
// if the computed checksum is not equals to the expected checksum.
|
||||
export const validChecksumOfReadStream = (
|
||||
stream: Readable,
|
||||
expectedChecksum: string
|
||||
): Readable & { checksumVerified: Promise<void> } => {
|
||||
const algorithmId = expectedChecksum.slice(
|
||||
1,
|
||||
expectedChecksum.indexOf('$', 1)
|
||||
)
|
||||
|
||||
if (!algorithmId) {
|
||||
throw new Error(`unknown algorithm: ${algorithmId}`)
|
||||
}
|
||||
|
||||
const hash = createHash(ID_TO_ALGORITHM[algorithmId])
|
||||
|
||||
const wrapper: any = stream.pipe(
|
||||
through2(
|
||||
{ highWaterMark: 0 },
|
||||
(chunk, enc, callback) => {
|
||||
hash.update(chunk)
|
||||
callback(null, chunk)
|
||||
},
|
||||
callback => {
|
||||
const checksum = `$${algorithmId}$$${hash.digest('hex')}`
|
||||
|
||||
callback(
|
||||
checksum !== expectedChecksum
|
||||
? new Error(
|
||||
`Bad checksum (${checksum}), expected: ${expectedChecksum}`
|
||||
)
|
||||
: null
|
||||
)
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
stream.on('error', error => wrapper.emit('error', error))
|
||||
wrapper.checksumVerified = fromEvent(wrapper, 'end')
|
||||
|
||||
return wrapper
|
||||
}
|
||||
26
@xen-orchestra/fs/src/fs.integ.spec.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/* eslint-env jest */
|
||||
|
||||
import rimraf from 'rimraf'
|
||||
import tmp from 'tmp'
|
||||
|
||||
import { fromCallback as pFromCallback } from 'promise-toolbox'
|
||||
import { getHandler } from '.'
|
||||
|
||||
const initialDir = process.cwd()
|
||||
|
||||
beforeEach(async () => {
|
||||
const dir = await pFromCallback(cb => tmp.dir(cb))
|
||||
process.chdir(dir)
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
const tmpDir = process.cwd()
|
||||
process.chdir(initialDir)
|
||||
await pFromCallback(cb => rimraf(tmpDir, cb))
|
||||
})
|
||||
|
||||
test("fs test doesn't crash", async () => {
|
||||
const handler = getHandler({ url: 'file://' + process.cwd() })
|
||||
const result = await handler.test()
|
||||
expect(result.success).toBeTruthy()
|
||||
})
|
||||
26
@xen-orchestra/fs/src/index.js
Normal file
@@ -0,0 +1,26 @@
|
||||
// @flow
|
||||
|
||||
import type RemoteHandler from './abstract'
|
||||
import RemoteHandlerLocal from './local'
|
||||
import RemoteHandlerNfs from './nfs'
|
||||
import RemoteHandlerSmb from './smb'
|
||||
|
||||
export type { default as RemoteHandler } from './abstract'
|
||||
export type Remote = { url: string }
|
||||
|
||||
const HANDLERS = {
|
||||
file: RemoteHandlerLocal,
|
||||
smb: RemoteHandlerSmb,
|
||||
nfs: RemoteHandlerNfs,
|
||||
}
|
||||
|
||||
export const getHandler = (remote: Remote): RemoteHandler => {
|
||||
// FIXME: should be done in xo-remote-parser.
|
||||
const type = remote.url.split('://')[0]
|
||||
|
||||
const Handler = HANDLERS[type]
|
||||
if (!Handler) {
|
||||
throw new Error('Unhandled remote type')
|
||||
}
|
||||
return new Handler(remote)
|
||||
}
|
||||
@@ -28,14 +28,9 @@ export default class LocalHandler extends RemoteHandlerAbstract {
|
||||
|
||||
async _sync () {
|
||||
if (this._remote.enabled) {
|
||||
try {
|
||||
const path = this._getRealPath()
|
||||
await fs.ensureDir(path)
|
||||
await fs.access(path, fs.R_OK | fs.W_OK)
|
||||
} catch (exc) {
|
||||
this._remote.enabled = false
|
||||
this._remote.error = exc.message
|
||||
}
|
||||
const path = this._getRealPath()
|
||||
await fs.ensureDir(path)
|
||||
await fs.access(path, fs.R_OK | fs.W_OK)
|
||||
}
|
||||
return this._remote
|
||||
}
|
||||
@@ -50,6 +45,24 @@ export default class LocalHandler extends RemoteHandlerAbstract {
|
||||
await fs.writeFile(path, data, options)
|
||||
}
|
||||
|
||||
async _read (file, buffer, position) {
|
||||
const needsClose = typeof file === 'string'
|
||||
file = needsClose ? await fs.open(this._getFilePath(file), 'r') : file.fd
|
||||
try {
|
||||
return await fs.read(
|
||||
file,
|
||||
buffer,
|
||||
0,
|
||||
buffer.length,
|
||||
position === undefined ? null : position
|
||||
)
|
||||
} finally {
|
||||
if (needsClose) {
|
||||
await fs.close(file)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async _readFile (file, options) {
|
||||
return fs.readFile(this._getFilePath(file), options)
|
||||
}
|
||||
@@ -63,15 +76,13 @@ export default class LocalHandler extends RemoteHandlerAbstract {
|
||||
}
|
||||
|
||||
async _createReadStream (file, options) {
|
||||
if (typeof file === 'string') {
|
||||
return fs.createReadStream(this._getFilePath(file), options)
|
||||
} else {
|
||||
return fs.createReadStream('', {
|
||||
autoClose: false,
|
||||
...options,
|
||||
fd: file.fd,
|
||||
})
|
||||
}
|
||||
return typeof file === 'string'
|
||||
? fs.createReadStream(this._getFilePath(file), options)
|
||||
: fs.createReadStream('', {
|
||||
autoClose: false,
|
||||
...options,
|
||||
fd: file.fd,
|
||||
})
|
||||
}
|
||||
|
||||
async _createOutputStream (file, options) {
|
||||
@@ -79,13 +90,12 @@ export default class LocalHandler extends RemoteHandlerAbstract {
|
||||
const path = this._getFilePath(file)
|
||||
await fs.ensureDir(dirname(path))
|
||||
return fs.createWriteStream(path, options)
|
||||
} else {
|
||||
return fs.createWriteStream('', {
|
||||
autoClose: false,
|
||||
...options,
|
||||
fd: file.fd,
|
||||
})
|
||||
}
|
||||
return fs.createWriteStream('', {
|
||||
autoClose: false,
|
||||
...options,
|
||||
fd: file.fd,
|
||||
})
|
||||
}
|
||||
|
||||
async _unlink (file) {
|
||||
@@ -4,6 +4,8 @@ import { forEach } from 'lodash'
|
||||
|
||||
import LocalHandler from './local'
|
||||
|
||||
const DEFAULT_NFS_OPTIONS = 'vers=3'
|
||||
|
||||
export default class NfsHandler extends LocalHandler {
|
||||
get type () {
|
||||
return 'nfs'
|
||||
@@ -52,12 +54,13 @@ export default class NfsHandler extends LocalHandler {
|
||||
|
||||
async _mount () {
|
||||
await fs.ensureDir(this._getRealPath())
|
||||
const { host, path, port, options } = this._remote
|
||||
return execa('mount', [
|
||||
'-t',
|
||||
'nfs',
|
||||
'-o',
|
||||
'vers=3',
|
||||
`${this._remote.host}:${this._remote.path}`,
|
||||
DEFAULT_NFS_OPTIONS + (options !== undefined ? `,${options}` : ''),
|
||||
`${host}${port !== undefined ? ':' + port : ''}:${path}`,
|
||||
this._getRealPath(),
|
||||
])
|
||||
}
|
||||
@@ -65,19 +68,9 @@ export default class NfsHandler extends LocalHandler {
|
||||
async _sync () {
|
||||
await this._loadRealMounts()
|
||||
if (this._matchesRealMount() && !this._remote.enabled) {
|
||||
try {
|
||||
await this._umount(this._remote)
|
||||
} catch (exc) {
|
||||
this._remote.enabled = true
|
||||
this._remote.error = exc.message
|
||||
}
|
||||
await this._umount(this._remote)
|
||||
} else if (!this._matchesRealMount() && this._remote.enabled) {
|
||||
try {
|
||||
await this._mount()
|
||||
} catch (exc) {
|
||||
this._remote.enabled = false
|
||||
this._remote.error = exc.message
|
||||
}
|
||||
await this._mount()
|
||||
}
|
||||
return this._remote
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
import Smb2 from '@marsaud/smb2-promise'
|
||||
import Smb2 from '@marsaud/smb2'
|
||||
import { lastly as pFinally } from 'promise-toolbox'
|
||||
|
||||
import RemoteHandlerAbstract from './abstract'
|
||||
import { noop, pFinally } from '../utils'
|
||||
|
||||
const noop = () => {}
|
||||
|
||||
// Normalize the error code for file not found.
|
||||
const normalizeError = error => {
|
||||
@@ -10,13 +12,13 @@ const normalizeError = error => {
|
||||
return code === 'STATUS_OBJECT_NAME_NOT_FOUND' ||
|
||||
code === 'STATUS_OBJECT_PATH_NOT_FOUND'
|
||||
? Object.create(error, {
|
||||
code: {
|
||||
configurable: true,
|
||||
readable: true,
|
||||
value: 'ENOENT',
|
||||
writable: true,
|
||||
},
|
||||
})
|
||||
code: {
|
||||
configurable: true,
|
||||
readable: true,
|
||||
value: 'ENOENT',
|
||||
writable: true,
|
||||
},
|
||||
})
|
||||
: error
|
||||
}
|
||||
|
||||
@@ -30,7 +32,9 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
return 'smb'
|
||||
}
|
||||
|
||||
_getClient (remote) {
|
||||
_getClient () {
|
||||
const remote = this._remote
|
||||
|
||||
return new Smb2({
|
||||
share: `\\\\${remote.host}`,
|
||||
domain: remote.domain,
|
||||
@@ -67,19 +71,14 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
|
||||
async _sync () {
|
||||
if (this._remote.enabled) {
|
||||
try {
|
||||
// Check access (smb2 does not expose connect in public so far...)
|
||||
await this.list()
|
||||
} catch (error) {
|
||||
this._remote.enabled = false
|
||||
this._remote.error = error.message
|
||||
}
|
||||
// Check access (smb2 does not expose connect in public so far...)
|
||||
await this.list()
|
||||
}
|
||||
return this._remote
|
||||
}
|
||||
|
||||
async _outputFile (file, data, options = {}) {
|
||||
const client = this._getClient(this._remote)
|
||||
const client = this._getClient()
|
||||
const path = this._getFilePath(file)
|
||||
const dir = this._dirname(path)
|
||||
|
||||
@@ -88,19 +87,40 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
}
|
||||
|
||||
return client.writeFile(path, data, options)::pFinally(() => {
|
||||
client.close()
|
||||
client.disconnect()
|
||||
})
|
||||
}
|
||||
|
||||
async _read (file, buffer, position) {
|
||||
const needsClose = typeof file === 'string'
|
||||
|
||||
let client
|
||||
if (needsClose) {
|
||||
client = this._getClient()
|
||||
file = await client.open(this._getFilePath(file))
|
||||
} else {
|
||||
;({ client, file } = file.fd)
|
||||
}
|
||||
|
||||
try {
|
||||
return await client.read(file, buffer, 0, buffer.length, position)
|
||||
} finally {
|
||||
if (needsClose) {
|
||||
await client.close(file)
|
||||
client.disconnect()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async _readFile (file, options = {}) {
|
||||
const client = this._getClient(this._remote)
|
||||
const client = this._getClient()
|
||||
let content
|
||||
|
||||
try {
|
||||
content = await client
|
||||
.readFile(this._getFilePath(file), options)
|
||||
::pFinally(() => {
|
||||
client.close()
|
||||
client.disconnect()
|
||||
})
|
||||
} catch (error) {
|
||||
throw normalizeError(error)
|
||||
@@ -110,13 +130,15 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
}
|
||||
|
||||
async _rename (oldPath, newPath) {
|
||||
const client = this._getClient(this._remote)
|
||||
const client = this._getClient()
|
||||
|
||||
try {
|
||||
await client
|
||||
.rename(this._getFilePath(oldPath), this._getFilePath(newPath))
|
||||
.rename(this._getFilePath(oldPath), this._getFilePath(newPath), {
|
||||
replace: true,
|
||||
})
|
||||
::pFinally(() => {
|
||||
client.close()
|
||||
client.disconnect()
|
||||
})
|
||||
} catch (error) {
|
||||
throw normalizeError(error)
|
||||
@@ -124,12 +146,12 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
}
|
||||
|
||||
async _list (dir = '.') {
|
||||
const client = this._getClient(this._remote)
|
||||
const client = this._getClient()
|
||||
let list
|
||||
|
||||
try {
|
||||
list = await client.readdir(this._getFilePath(dir))::pFinally(() => {
|
||||
client.close()
|
||||
client.disconnect()
|
||||
})
|
||||
} catch (error) {
|
||||
throw normalizeError(error)
|
||||
@@ -142,13 +164,13 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
if (typeof file !== 'string') {
|
||||
file = file.path
|
||||
}
|
||||
const client = this._getClient(this._remote)
|
||||
const client = this._getClient()
|
||||
let stream
|
||||
|
||||
try {
|
||||
// FIXME ensure that options are properly handled by @marsaud/smb2
|
||||
stream = await client.createReadStream(this._getFilePath(file), options)
|
||||
stream.on('end', () => client.close())
|
||||
stream.on('end', () => client.disconnect())
|
||||
} catch (error) {
|
||||
throw normalizeError(error)
|
||||
}
|
||||
@@ -160,7 +182,7 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
if (typeof file !== 'string') {
|
||||
file = file.path
|
||||
}
|
||||
const client = this._getClient(this._remote)
|
||||
const client = this._getClient()
|
||||
const path = this._getFilePath(file)
|
||||
const dir = this._dirname(path)
|
||||
let stream
|
||||
@@ -170,19 +192,19 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
}
|
||||
stream = await client.createWriteStream(path, options) // FIXME ensure that options are properly handled by @marsaud/smb2
|
||||
} catch (err) {
|
||||
client.close()
|
||||
client.disconnect()
|
||||
throw err
|
||||
}
|
||||
stream.on('finish', () => client.close())
|
||||
stream.on('finish', () => client.disconnect())
|
||||
return stream
|
||||
}
|
||||
|
||||
async _unlink (file) {
|
||||
const client = this._getClient(this._remote)
|
||||
const client = this._getClient()
|
||||
|
||||
try {
|
||||
await client.unlink(this._getFilePath(file))::pFinally(() => {
|
||||
client.close()
|
||||
client.disconnect()
|
||||
})
|
||||
} catch (error) {
|
||||
throw normalizeError(error)
|
||||
@@ -190,14 +212,14 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
}
|
||||
|
||||
async _getSize (file) {
|
||||
const client = await this._getClient(this._remote)
|
||||
const client = await this._getClient()
|
||||
let size
|
||||
|
||||
try {
|
||||
size = await client
|
||||
.getSize(this._getFilePath(typeof file === 'string' ? file : file.path))
|
||||
::pFinally(() => {
|
||||
client.close()
|
||||
client.disconnect()
|
||||
})
|
||||
} catch (error) {
|
||||
throw normalizeError(error)
|
||||
@@ -206,10 +228,17 @@ export default class SmbHandler extends RemoteHandlerAbstract {
|
||||
return size
|
||||
}
|
||||
|
||||
// this is a fake
|
||||
// TODO: add flags
|
||||
async _openFile (path) {
|
||||
return this._getFilePath(path)
|
||||
const client = this._getClient()
|
||||
return {
|
||||
client,
|
||||
file: await client.open(this._getFilePath(path)),
|
||||
}
|
||||
}
|
||||
|
||||
async _closeFile (fd) {}
|
||||
async _closeFile ({ client, file }) {
|
||||
await client.close(file)
|
||||
client.disconnect()
|
||||
}
|
||||
}
|
||||
280
CHANGELOG.md
@@ -1,9 +1,282 @@
|
||||
# ChangeLog
|
||||
|
||||
## *next*
|
||||
|
||||
### Enhancements
|
||||
|
||||
### Bug fixes
|
||||
|
||||
### Released packages
|
||||
|
||||
- xo-server v5.26.0
|
||||
- xo-web v5.26.0
|
||||
|
||||
## **5.25.0** (2018-08-23)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- [Tables] Filter input now always shows up even if the table is empty [#3295](https://github.com/vatesfr/xen-orchestra/issues/3295) (PR [#3296](https://github.com/vatesfr/xen-orchestra/pull/3296))
|
||||
- [Tasks] The table is now still shown when there are no tasks (PR [#3305](https://github.com/vatesfr/xen-orchestra/pull/3305))
|
||||
- [Host / Logs] Homogenize action buttons in table and enable bulk deletion [#3179](https://github.com/vatesfr/xen-orchestra/issues/3179) (PR [#3313](https://github.com/vatesfr/xen-orchestra/pull/3313))
|
||||
- [VM/Advanced] Change "Convert" to "Convert to template" and always show the button [#3201](https://github.com/vatesfr/xen-orchestra/issues/3201) (PR [#3319](https://github.com/vatesfr/xen-orchestra/pull/3319))
|
||||
- [Backup NG form] Display a tip when doing a CR on a thick-provisioned SR [#3291](https://github.com/vatesfr/xen-orchestra/issues/3291) (PR [#3333](https://github.com/vatesfr/xen-orchestra/pull/3333))
|
||||
- [SR/new] Add local ext SR type [#3332](https://github.com/vatesfr/xen-orchestra/issues/3332) (PR [#3335](https://github.com/vatesfr/xen-orchestra/pull/3335))
|
||||
- [Backup reports] Send report for the interrupted backup jobs on the server startup [#2998](https://github.com/vatesfr/xen-orchestra/issues/#2998) (PR [3164](https://github.com/vatesfr/xen-orchestra/pull/3164) [3154](https://github.com/vatesfr/xen-orchestra/pull/3154))
|
||||
- [Backup NG form] Move VMs' selection to a dedicated card [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711) (PR [#3338](https://github.com/vatesfr/xen-orchestra/pull/3338))
|
||||
- [Backup NG smart mode] Exclude replicated VMs [#2338](https://github.com/vatesfr/xen-orchestra/issues/2338) (PR [#3312](https://github.com/vatesfr/xen-orchestra/pull/3312))
|
||||
- [Backup NG form] Show the compression checkbox when the full mode is active [#3236](https://github.com/vatesfr/xen-orchestra/issues/3236) (PR [#3345](https://github.com/vatesfr/xen-orchestra/pull/3345))
|
||||
- [New VM] Display an error when the getting of the coreOS default template fails [#3227](https://github.com/vatesfr/xen-orchestra/issues/3227) (PR [#3343](https://github.com/vatesfr/xen-orchestra/pull/3343))
|
||||
- [Backup NG form] Set default retention to 1 [#3134](https://github.com/vatesfr/xen-orchestra/issues/3134) (PR [#3290](https://github.com/vatesfr/xen-orchestra/pull/3290))
|
||||
- [Backup NG] New logs are searchable by job name [#3272](https://github.com/vatesfr/xen-orchestra/issues/3272) (PR [#3351](https://github.com/vatesfr/xen-orchestra/pull/3351))
|
||||
- [Remotes] Add a field for NFS remotes to set mount options [#1793](https://github.com/vatesfr/xen-orchestra/issues/1793) (PR [#3353](https://github.com/vatesfr/xen-orchestra/pull/3353))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- [Backup NG form] Fix schedule's name overridden with undefined if it's not been edited [#3286](https://github.com/vatesfr/xen-orchestra/issues/3286) (PR [#3288](https://github.com/vatesfr/xen-orchestra/pull/3288))
|
||||
- [Remotes] Don't change `enabled` state on errors (PR [#3318](https://github.com/vatesfr/xen-orchestra/pull/3318))
|
||||
- [Remotes] Auto-reconnect on use if necessary [#2852](https://github.com/vatesfr/xen-orchestra/issues/2852) (PR [#3320](https://github.com/vatesfr/xen-orchestra/pull/3320))
|
||||
- [XO items' select] Fix adding or removing a XO item from a select make the missing XO items disappear [#3322](https://github.com/vatesfr/xen-orchestra/issues/3322) (PR [#3315](https://github.com/vatesfr/xen-orchestra/pull/3315))
|
||||
|
||||
### Released packages
|
||||
|
||||
- xo-server-backup-reports v0.13.0
|
||||
- @xen-orchestra/fs 0.3.0
|
||||
- xo-server v5.25.0
|
||||
- xo-web v5.25.0
|
||||
|
||||
## **5.24.0** (2018-08-09)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- [Remotes] Make SMB subfolder field optional [#3249](https://github.com/vatesfr/xen-orchestra/issues/3249) (PR [#3250](https://github.com/vatesfr/xen-orchestra/pull/3250))
|
||||
- [Backup NG form] Make the smart mode's toggle more visible [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711) (PR [#3263](https://github.com/vatesfr/xen-orchestra/pull/3263))
|
||||
- Move the copy clipboard of the VM's UUID to the header [#3221](https://github.com/vatesfr/xen-orchestra/issues/3221) (PR [#3248](https://github.com/vatesfr/xen-orchestra/pull/3248))
|
||||
- [Health / Orphaned VMs] Homogenize action buttons in table and enable bulk deletion [#3179](https://github.com/vatesfr/xen-orchestra/issues/3179) (PR [#3274](https://github.com/vatesfr/xen-orchestra/pull/3274))
|
||||
- [Health / Orphaned snapshot VDIs] Homogenize action buttons in table and enable bulk deletion [#3179](https://github.com/vatesfr/xen-orchestra/issues/3179) (PR [#3270](https://github.com/vatesfr/xen-orchestra/pull/3270))
|
||||
- [Health / Alarms] Homogenize action buttons in table and enable bulk deletion [#3179](https://github.com/vatesfr/xen-orchestra/issues/3179) (PR [#3271](https://github.com/vatesfr/xen-orchestra/pull/3271))
|
||||
- [Backup NG Overview] List the Backup NG job's modes [#3169](https://github.com/vatesfr/xen-orchestra/issues/3169) (PR [#3277](https://github.com/vatesfr/xen-orchestra/pull/3277))
|
||||
- [Backup NG form] Move "Use compression" checkbox in the advanced settings [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711) (PR [#3281](https://github.com/vatesfr/xen-orchestra/pull/3281))
|
||||
- [Backup NG form] Ability to remove previous backups first before backup the VMs [#3212](https://github.com/vatesfr/xen-orchestra/issues/3212) (PR [#3260](https://github.com/vatesfr/xen-orchestra/pull/3260))
|
||||
- [Patching] Check date consistency before patching to avoid error on install [#3056](https://github.com/vatesfr/xen-orchestra/issues/3056)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- [Pools] Filter GPU groups by pool [#3176](https://github.com/vatesfr/xen-orchestra/issues/3176) (PR [#3253](https://github.com/vatesfr/xen-orchestra/pull/3253))
|
||||
- [Backup NG] Fix delta backups with SMB remotes [#3224](https://github.com/vatesfr/xen-orchestra/issues/3224) (PR [#3278](https://github.com/vatesfr/xen-orchestra/pull/3278))
|
||||
- Fix VM restoration getting stuck on local SRs [#3245](https://github.com/vatesfr/xen-orchestra/issues/3245) (PR [#3243](https://github.com/vatesfr/xen-orchestra/pull/3243))
|
||||
- [New VM / Self] Filter out SRs that are not in the template's pool [#3068](https://github.com/vatesfr/xen-orchestra/issues/3068) (PR [#3070](https://github.com/vatesfr/xen-orchestra/pull/3070))
|
||||
- [New VM / Self] Fix 'unknown item' displayed in SR selector [#3267](https://github.com/vatesfr/xen-orchestra/issues/3267) (PR [#3070](https://github.com/vatesfr/xen-orchestra/pull/3070))
|
||||
|
||||
### Released packages
|
||||
|
||||
- xen-api v0.17.0
|
||||
- @xen-orchestra/fs 0.2.1
|
||||
- xo-server v5.24.0
|
||||
- xo-web v5.24.0
|
||||
|
||||
## **5.23.0** (2018-07-26)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- Export VDI content [#2432](https://github.com/vatesfr/xen-orchestra/issues/2432) (PR [#3194](https://github.com/vatesfr/xen-orchestra/pull/3194))
|
||||
- Search syntax support wildcard (`*`) and regular expressions [#3190](https://github.com/vatesfr/xen-orchestra/issues/3190) (PRs [#3198](https://github.com/vatesfr/xen-orchestra/pull/3198) & [#3199](https://github.com/vatesfr/xen-orchestra/pull/3199))
|
||||
- Import VDI content [#2432](https://github.com/vatesfr/xen-orchestra/issues/2432) (PR [#3216](https://github.com/vatesfr/xen-orchestra/pull/3216))
|
||||
- [Backup NG form] Ability to edit a schedule's name [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711) [#3071](https://github.com/vatesfr/xen-orchestra/issues/3071) (PR [#3143](https://github.com/vatesfr/xen-orchestra/pull/3143))
|
||||
- [Remotes] Ability to change the type of a remote [#2423](https://github.com/vatesfr/xen-orchestra/issues/2423) (PR [#3207](https://github.com/vatesfr/xen-orchestra/pull/3207))
|
||||
- [Backup NG new] Ability to set a job's timeout [#2978](https://github.com/vatesfr/xen-orchestra/issues/2978) (PR [#3222](https://github.com/vatesfr/xen-orchestra/pull/3222))
|
||||
- [Remotes] Ability to edit/delete a remote with an invalid URL [#3182](https://github.com/vatesfr/xen-orchestra/issues/3182) (PR [#3226](https://github.com/vatesfr/xen-orchestra/pull/3226))
|
||||
- [Backup NG logs] Prevent user from deleting logs to help resolving issues [#3153](https://github.com/vatesfr/xen-orchestra/issues/3153) (PR [#3235](https://github.com/vatesfr/xen-orchestra/pull/3235))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- [Backup Reports] Report not sent if reportWhen failure and at least a VM is successfull [#3181](https://github.com/vatesfr/xen-orchestra/issues/3181) (PR [#3185](https://github.com/vatesfr/xen-orchestra/pull/3185))
|
||||
- [Backup NG] Correctly migrate report setting from legacy jobs [#3180](https://github.com/vatesfr/xen-orchestra/issues/3180) (PR [#3206](https://github.com/vatesfr/xen-orchestra/pull/3206))
|
||||
- [Backup NG] remove incomplete XVA files [#3159](https://github.com/vatesfr/xen-orchestra/issues/3159) (PR [#3215](https://github.com/vatesfr/xen-orchestra/pull/3215))
|
||||
- [Backup NG form] Ability to edit a schedule's state [#3223](https://github.com/vatesfr/xen-orchestra/issues/3223) (PR [#3228](https://github.com/vatesfr/xen-orchestra/pull/3228))
|
||||
|
||||
### Released packages
|
||||
|
||||
- xo-remote-parser v0.5.0
|
||||
- complex-matcher v0.4.0
|
||||
- xo-server-backup-reports v0.12.3
|
||||
- xo-server v5.23.0
|
||||
- xo-web v5.23.0
|
||||
|
||||
## **5.22.1** (2018-07-13)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- [Remote select] Gracefully ignore remotes with invalid URL (PR [#3178](https://github.com/vatesfr/xen-orchestra/pull/3178))
|
||||
|
||||
### Released packages
|
||||
|
||||
- xo-web v5.22.1
|
||||
|
||||
## **5.22.0** (2018-07-12)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- [Backup NG form] Add a link to the remotes' settings [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711) [#3106](https://github.com/vatesfr/xen-orchestra/issues/3106) [#2299](https://github.com/vatesfr/xen-orchestra/issues/2299) (PR [#3128](https://github.com/vatesfr/xen-orchestra/pull/3128))
|
||||
- [Backup NG logs] Make copy to clipboard and report buttons always available [#3130](https://github.com/vatesfr/xen-orchestra/issues/3130) (PR [#3133](https://github.com/vatesfr/xen-orchestra/pull/3133))
|
||||
- Warning message when creating a local remote [#3105](https://github.com/vatesfr/xen-orchestra/issues/3105) (PR [3142](https://github.com/vatesfr/xen-orchestra/pull/3142))
|
||||
- [Remotes] Allow optional port for NFS remote [2299](https://github.com/vatesfr/xen-orchestra/issues/2299) (PR [#3131](https://github.com/vatesfr/xen-orchestra/pull/3131))
|
||||
- [Backup NG form] Add offline snapshot info (PR [#3144](https://github.com/vatesfr/xen-orchestra/pull/3144))
|
||||
- [Backup NG overview] Display concurrency and offline snapshot value [3087](https://github.com/vatesfr/xen-orchestra/issues/3087) (PR [3145](https://github.com/vatesfr/xen-orchestra/pull/3145))
|
||||
- [VM revert] notify the result of reverting a VM [3095](https://github.com/vatesfr/xen-orchestra/issues/3095) (PR [3150](https://github.com/vatesfr/xen-orchestra/pull/3150))
|
||||
- [Backup NG logs] Link XO items in the details modal [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711) (PR [#3171](https://github.com/vatesfr/xen-orchestra/pull/3171))
|
||||
- [VM/Snapshots] Add fast clone option when creating a VM [#3120](https://github.com/vatesfr/xen-orchestra/issues/3120) (PR [#3136](https://github.com/vatesfr/xen-orchestra/pull/3136))
|
||||
- Add the Turkish translation (PR [#3174](https://github.com/vatesfr/xen-orchestra/pull/3174) [#2870](https://github.com/vatesfr/xen-orchestra/pull/2870) [#2871](https://github.com/vatesfr/xen-orchestra/pull/2871))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- Delete schedules with their job [#3108](https://github.com/vatesfr/xen-orchestra/issues/3108) (PR [3124](https://github.com/vatesfr/xen-orchestra/pull/3124))
|
||||
- Remote creation: correctly reset form [#3140](https://github.com/vatesfr/xen-orchestra/issues/3140) (PR [3141](https://github.com/vatesfr/xen-orchestra/pull/3141))
|
||||
- Make cloud config templates available for all users [3147](https://github.com/vatesfr/xen-orchestra/issues/3147) (PR [3148](https://github.com/vatesfr/xen-orchestra/pull/3148))
|
||||
- [New VM] Only create the cloud config drive when its option is enabled [3161](https://github.com/vatesfr/xen-orchestra/issues/3161) (PR [3162](https://github.com/vatesfr/xen-orchestra/pull/3162))
|
||||
- Fix error when installing patches from the host or without a default SR (PR [3166](https://github.com/vatesfr/xen-orchestra/pull/3166))
|
||||
- [Backup NG] Fix SMB *Not implemented* issue [#3149](](https://github.com/vatesfr/xen-orchestra/issues/3149) (PR [3175](https://github.com/vatesfr/xen-orchestra/pull/3175))
|
||||
|
||||
### Released packages
|
||||
|
||||
- xo-remote-parser 0.4.0
|
||||
- @xen-orchestra/fs 0.2.0
|
||||
- vhd-lib 0.3.0
|
||||
- vhd-cli 0.1.0
|
||||
- xo-server v5.22.0
|
||||
- xo-web v5.22.0
|
||||
|
||||
## **5.21.0** (2018-06-28)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- Hide legacy backup creation view [#2956](https://github.com/vatesfr/xen-orchestra/issues/2956)
|
||||
- [Delta Backup NG logs] Display wether the export is a full or a delta [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711)
|
||||
- Copy VDIs' UUID from SR/disks view [#3051](https://github.com/vatesfr/xen-orchestra/issues/3051)
|
||||
- [Backup NG] New option to shutdown VMs before snapshotting them [#3058](https://github.com/vatesfr/xen-orchestra/issues/3058#event-1673756438)
|
||||
- [Backup NG form] Improve feedback [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711)
|
||||
- [Backup NG] Different retentions for backup and replication [#2895](https://github.com/vatesfr/xen-orchestra/issues/2895)
|
||||
- Possibility to use a fast clone when creating a VM from a snapshot [#2937](https://github.com/vatesfr/xen-orchestra/issues/2937)
|
||||
- Ability to customize cloud config templates [#2984](https://github.com/vatesfr/xen-orchestra/issues/2984)
|
||||
- Add Backup deprecation message and link to Backup NG migration blog post [#3089](https://github.com/vatesfr/xen-orchestra/issues/3089)
|
||||
- [Backup NG] Ability to cancel a running backup job [#3047](https://github.com/vatesfr/xen-orchestra/issues/3047)
|
||||
- [Backup NG form] Ability to enable/disable a schedule [#3062](https://github.com/vatesfr/xen-orchestra/issues/3062)
|
||||
- New backup/health view with non-existent backup snapshots table [#3090](https://github.com/vatesfr/xen-orchestra/issues/3090)
|
||||
- Disable cancel/destroy tasks when not allowed [#3076](https://github.com/vatesfr/xen-orchestra/issues/3076)
|
||||
- Default remote type is NFS [#3103](https://github.com/vatesfr/xen-orchestra/issues/3103) (PR [#3114](https://github.com/vatesfr/xen-orchestra/pull/3114))
|
||||
- Add legacy backups snapshots to backup/health [#3082](https://github.com/vatesfr/xen-orchestra/issues/3082) (PR [#3111](https://github.com/vatesfr/xen-orchestra/pull/3111))
|
||||
- [Backup NG logs] Add the job's name to the modal's title [#2711](https://github.com/vatesfr/xen-orchestra/issues/2711) (PR [#3115](https://github.com/vatesfr/xen-orchestra/pull/3115))
|
||||
- Adding a XCP-ng host to a XS pool now fails fast [#3061](https://github.com/vatesfr/xen-orchestra/issues/3061) (PR [#3118](https://github.com/vatesfr/xen-orchestra/pull/3118))
|
||||
- [Backup NG logs] Ability to report a failed job and copy its log to the clipboard [#3100](https://github.com/vatesfr/xen-orchestra/issues/3100) (PR [#3110](https://github.com/vatesfr/xen-orchestra/pull/3110))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- update the xentools search item to return the version number of installed xentools [#3015](https://github.com/vatesfr/xen-orchestra/issues/3015)
|
||||
- Fix Nagios backup reports [#2991](https://github.com/vatesfr/xen-orchestra/issues/2991)
|
||||
- Fix the retry of a single failed/interrupted VM backup [#2912](https://github.com/vatesfr/xen-orchestra/issues/2912#issuecomment-395480321)
|
||||
- New VM with Self: filter out networks that are not in the template's pool [#3011](https://github.com/vatesfr/xen-orchestra/issues/3011)
|
||||
- [Backup NG] Auto-detect when a full export is necessary.
|
||||
- Fix Load Balancer [#3075](https://github.com/vatesfr/xen-orchestra/issues/3075#event-1685469551) [#3026](https://github.com/vatesfr/xen-orchestra/issues/3026)
|
||||
- [SR stats] Don't scale XAPI iowait values [#2969](https://github.com/vatesfr/xen-orchestra/issues/2969)
|
||||
- [Backup NG] Don't list unusable SRs for CR/DR [#3050](https://github.com/vatesfr/xen-orchestra/issues/3050)
|
||||
- Fix creating VM from snapshot (PR [3117](https://github.com/vatesfr/xen-orchestra/pull/3117))
|
||||
|
||||
## **5.20.0** (2018-05-31)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- Add VDI UUID in SR coalesce view [#2903](https://github.com/vatesfr/xen-orchestra/issues/2903)
|
||||
- Create new VDI from SR view not attached to any VM [#2229](https://github.com/vatesfr/xen-orchestra/issues/2229)
|
||||
- [Patches] ignore XS upgrade in missing patches counter [#2866](https://github.com/vatesfr/xen-orchestra/issues/2866)
|
||||
- [Health] List VM snapshots related to non-existing backup jobs/schedules [#2828](https://github.com/vatesfr/xen-orchestra/issues/2828)
|
||||
|
||||
## **5.19.0** (2018-05-01)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- Expose vendor device in VM advanced tab [#2883](https://github.com/vatesfr/xen-orchestra/issues/2883)
|
||||
- Networks created in XO are missing the "automatic" parameter [#2818](https://github.com/vatesfr/xen-orchestra/issues/2818)
|
||||
- Performance alert disk space monitoring XS [#2737](https://github.com/vatesfr/xen-orchestra/issues/2737)
|
||||
- Add ability to create NFSv4 storage repository [#2706](https://github.com/vatesfr/xen-orchestra/issues/2706)
|
||||
- [SortedTable] Support link actions [#2691](https://github.com/vatesfr/xen-orchestra/issues/2691)
|
||||
- Additional sort option: by host name [#2680](https://github.com/vatesfr/xen-orchestra/issues/2680)
|
||||
- Expose XenTools version numbers in data model and UI [#2650](https://github.com/vatesfr/xen-orchestra/issues/2650)
|
||||
- RRDs stats for SR object [#2644](https://github.com/vatesfr/xen-orchestra/issues/2644)
|
||||
- composite jobs [#2367](https://github.com/vatesfr/xen-orchestra/issues/2367)
|
||||
- Better error message [#2344](https://github.com/vatesfr/xen-orchestra/issues/2344)
|
||||
- Avoid using backup tag with special characters [#2336](https://github.com/vatesfr/xen-orchestra/issues/2336)
|
||||
- Prefix/suffix for temporary files [#2333](https://github.com/vatesfr/xen-orchestra/issues/2333)
|
||||
- Continuous Replication - better interface matching on destination [#2093](https://github.com/vatesfr/xen-orchestra/issues/2093)
|
||||
- Creation of LVMoHBA SRs [#1992](https://github.com/vatesfr/xen-orchestra/issues/1992)
|
||||
- [Delta backup] Improve restoration by creating a virtual full VHD [#1943](https://github.com/vatesfr/xen-orchestra/issues/1943)
|
||||
- VM Backups should be done in a dedicated remote directory [#1752](https://github.com/vatesfr/xen-orchestra/issues/1752)
|
||||
- Add Pool / SR filter in backup view [#1762](https://github.com/vatesfr/xen-orchestra/issues/1762)
|
||||
- Hide/Disable upgrade button when no upgrade exists [#1594](https://github.com/vatesfr/xen-orchestra/issues/1594)
|
||||
- "Upgrade" button should display "Downgrade" when trial is over [#1483](https://github.com/vatesfr/xen-orchestra/issues/1483)
|
||||
|
||||
### Bugs
|
||||
|
||||
- Allowed-ips don't works displaying index.js:1 Uncaught TypeError: (0 , z.isIp) is not a function [#2891](https://github.com/vatesfr/xen-orchestra/issues/2891)
|
||||
- Error on "usage-report" [#2876](https://github.com/vatesfr/xen-orchestra/issues/2876)
|
||||
- SR selection combo only listing local storage [#2875](https://github.com/vatesfr/xen-orchestra/issues/2875)
|
||||
- [Backup NG - Delta] Issue while importing delta [#2857](https://github.com/vatesfr/xen-orchestra/issues/2857)
|
||||
- Create New SR page broken with past commit [#2853](https://github.com/vatesfr/xen-orchestra/issues/2853)
|
||||
- [Backup NG] a target should only be preset once [#2848](https://github.com/vatesfr/xen-orchestra/issues/2848)
|
||||
- Auth Method iSCSI [#2835](https://github.com/vatesfr/xen-orchestra/issues/2835)
|
||||
- [Backup NG] ENOENT with Delta Backup [#2833](https://github.com/vatesfr/xen-orchestra/issues/2833)
|
||||
- Different backup logs [#2732](https://github.com/vatesfr/xen-orchestra/issues/2732)
|
||||
- Creating network fails silently when omitting Description [#2719](https://github.com/vatesfr/xen-orchestra/issues/2719)
|
||||
- Can't create ISO NFS SR via XOA [#1845](https://github.com/vatesfr/xen-orchestra/issues/1845)
|
||||
|
||||
## **5.18.0** (2018-03-31)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- Support huge VHDs [#2785](https://github.com/vatesfr/xen-orchestra/issues/2785)
|
||||
- Usage report extended usage [#2770](https://github.com/vatesfr/xen-orchestra/issues/2770)
|
||||
- Improve host available RAM display [#2750](https://github.com/vatesfr/xen-orchestra/issues/2750)
|
||||
- Hide IP field during VM creation if not configured [#2739](https://github.com/vatesfr/xen-orchestra/issues/2739)
|
||||
- [Home] Delete VMs modal should autofocus the input field [#2736](https://github.com/vatesfr/xen-orchestra/issues/2736)
|
||||
- Backup restore view load icon [#2692](https://github.com/vatesfr/xen-orchestra/issues/2692)
|
||||
- Deleting default templates doesn't work [#2666](https://github.com/vatesfr/xen-orchestra/issues/2666)
|
||||
- DR clean previous "failed" snapshots [#2656](https://github.com/vatesfr/xen-orchestra/issues/2656)
|
||||
- [Home] Put sort criteria in URL like the filter [#2585](https://github.com/vatesfr/xen-orchestra/issues/2585)
|
||||
- Allow disconnect VDI in SR disk view [#2505](https://github.com/vatesfr/xen-orchestra/issues/2505)
|
||||
- Add confirmation modal for manual backup run [#2355](https://github.com/vatesfr/xen-orchestra/issues/2355)
|
||||
- Multiple schedule for backup jobs [#2286](https://github.com/vatesfr/xen-orchestra/issues/2286)
|
||||
- Checks before web update [#2250](https://github.com/vatesfr/xen-orchestra/issues/2250)
|
||||
- Backup logs should truly reflect if the job is running [#2206](https://github.com/vatesfr/xen-orchestra/issues/2206)
|
||||
- Hook/action if an export stream is cut [#1929](https://github.com/vatesfr/xen-orchestra/issues/1929)
|
||||
- Backup paths should not contain tags but job ids [#1854](https://github.com/vatesfr/xen-orchestra/issues/1854)
|
||||
- Add a button to delete a backup [#1751](https://github.com/vatesfr/xen-orchestra/issues/1751)
|
||||
- Dashboard available for Pool and Host level [#1631](https://github.com/vatesfr/xen-orchestra/issues/1631)
|
||||
- UI Enhancement - VM list - Allways show the Toolbar [#1581](https://github.com/vatesfr/xen-orchestra/issues/1581)
|
||||
- xoa-updater --register: unable to define proxy using the CLI [#873](https://github.com/vatesfr/xen-orchestra/issues/873)
|
||||
|
||||
|
||||
### Bugs
|
||||
|
||||
- [Backup NG] CR/DR fail with multiple VMs [#2807](https://github.com/vatesfr/xen-orchestra/issues/2807)
|
||||
- HTTPS Crash [#2803](https://github.com/vatesfr/xen-orchestra/issues/2803)
|
||||
- Backup NG "cannot fork the stream after it has been created" [#2790](https://github.com/vatesfr/xen-orchestra/issues/2790)
|
||||
- [XOSAN] Make temporary `boundObjectId` unique [#2758](https://github.com/vatesfr/xen-orchestra/issues/2758)
|
||||
- First VIF ignored at VM creation [#2794](https://github.com/vatesfr/xen-orchestra/issues/2794)
|
||||
- VM creation from snapshot does not work [#2748](https://github.com/vatesfr/xen-orchestra/issues/2748)
|
||||
- Error: no such object with CentOS 7 template [#2747](https://github.com/vatesfr/xen-orchestra/issues/2747)
|
||||
- [Tasks] Filter does not work [#2740](https://github.com/vatesfr/xen-orchestra/issues/2740)
|
||||
- Pagination broken when listing pool VMs [#2730](https://github.com/vatesfr/xen-orchestra/issues/2730)
|
||||
- All jobs show error icon with message "This backup's creator no longer exists" [#2728](https://github.com/vatesfr/xen-orchestra/issues/2728)
|
||||
- [Basic backup] Continous Replication VM names [#2727](https://github.com/vatesfr/xen-orchestra/issues/2727)
|
||||
- Continuous replication clone removed [#2724](https://github.com/vatesfr/xen-orchestra/issues/2724)
|
||||
- [Backup] "See matching VMs" issue [#2704](https://github.com/vatesfr/xen-orchestra/issues/2704)
|
||||
- How to exclude CR targets from a smart backup using tags? [#2613](https://github.com/vatesfr/xen-orchestra/issues/2613)
|
||||
- Successful VM import reported as failed [#2056](https://github.com/vatesfr/xen-orchestra/issues/2056)
|
||||
- Delta backup: issue if a disk is once again backed up [#1824](https://github.com/vatesfr/xen-orchestra/issues/1824)
|
||||
|
||||
## **5.17.0** (2018-03-02)
|
||||
|
||||
### Enhancements
|
||||
|
||||
- Username field labeled inconsistently [#2651](https://github.com/vatesfr/xen-orchestra/issues/2651)
|
||||
- Add modal confirmation for host emergency mode [#2230](https://github.com/vatesfr/xen-orchestra/issues/2230)
|
||||
- Authorize stats fetching in RO mode [#2678](https://github.com/vatesfr/xen-orchestra/issues/2678)
|
||||
- Limit VM.export concurrency [#2669](https://github.com/vatesfr/xen-orchestra/issues/2669)
|
||||
@@ -22,6 +295,9 @@
|
||||
- Cant attach XenTools on User side. [#2503](https://github.com/vatesfr/xen-orchestra/issues/2503)
|
||||
- Pool filter for health view [#2302](https://github.com/vatesfr/xen-orchestra/issues/2302)
|
||||
- [Smart Backup] Improve feedback [#2253](https://github.com/vatesfr/xen-orchestra/issues/2253)
|
||||
- Backup jobs stuck if no space left on NFS remote [#2116](https://github.com/vatesfr/xen-orchestra/issues/2116)
|
||||
- Link between backup and XS tasks [#1193](https://github.com/vatesfr/xen-orchestra/issues/1193)
|
||||
- Move delta backup grouping to server side [#1008](https://github.com/vatesfr/xen-orchestra/issues/1008)
|
||||
|
||||
### Bugs
|
||||
|
||||
@@ -41,6 +317,7 @@
|
||||
- Self-service: allow VIF create [#2593](https://github.com/vatesfr/xen-orchestra/issues/2593)
|
||||
- Ghost tasks [#2579](https://github.com/vatesfr/xen-orchestra/issues/2579)
|
||||
- Autopatching: ignore 7.3 update patch for 7.2 [#2564](https://github.com/vatesfr/xen-orchestra/issues/2564)
|
||||
- Better Handling of suspending VMs from the Home screen [#2547](https://github.com/vatesfr/xen-orchestra/issues/2547)
|
||||
- Allow deleting VMs for which `destroy` is blocked [#2525](https://github.com/vatesfr/xen-orchestra/issues/2525)
|
||||
- Better confirmation on mass destructive actions [#2522](https://github.com/vatesfr/xen-orchestra/issues/2522)
|
||||
- Move VM In to/Out of Self Service Group [#1913](https://github.com/vatesfr/xen-orchestra/issues/1913)
|
||||
@@ -50,6 +327,8 @@
|
||||
- Remove CoffeeScript in xo-server [#189](https://github.com/vatesfr/xen-orchestra/issues/189)
|
||||
- Better Handling of suspending VMs from the Home screen [#2547](https://github.com/vatesfr/xen-orchestra/issues/2547)
|
||||
- [xen-api] Stronger reconnection policy [#2410](https://github.com/vatesfr/xen-orchestra/issues/2410)
|
||||
- home view - allow selecting more than 25 items [#1210](https://github.com/vatesfr/xen-orchestra/issues/1210)
|
||||
- Performances alerts [#511](https://github.com/vatesfr/xen-orchestra/issues/511)
|
||||
|
||||
### Bugs
|
||||
|
||||
@@ -79,6 +358,7 @@
|
||||
- Graphs in VM list view [#2469](https://github.com/vatesfr/xen-orchestra/issues/2469)
|
||||
- [Delta Backups] Do not include merge duration in transfer speed stat [#2426](https://github.com/vatesfr/xen-orchestra/issues/2426)
|
||||
- Warning for disperse mode [#2537](https://github.com/vatesfr/xen-orchestra/issues/2537)
|
||||
- Select components: auto select value if only 1 choice possible [#1479](https://github.com/vatesfr/xen-orchestra/issues/1479)
|
||||
|
||||
### Bugs
|
||||
|
||||
|
||||
46
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at julien.fontanet@vates.fr. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
17
PULL_REQUEST_TEMPLATE.md
Normal file
@@ -0,0 +1,17 @@
|
||||
### Check list
|
||||
|
||||
> Check items when done or if not relevant
|
||||
|
||||
- [ ] PR reference the relevant issue (e.g. `Fixes #007`)
|
||||
- [ ] if UI changes, a screenshot has been added to the PR
|
||||
- [ ] CHANGELOG:
|
||||
- enhancement/bug fix entry added
|
||||
- list of packages to release updated (`${name} v${new version}`)
|
||||
- [ ] documentation updated
|
||||
|
||||
### Process
|
||||
|
||||
1. create a PR as soon as possible
|
||||
1. mark it as `WiP:` (Work in Progress) if not ready to be merged
|
||||
1. when you want a review, add a reviewer
|
||||
1. if necessary, update your PR, and re- add a reviewer
|
||||
5
babel.config.js
Normal file
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
// Necessary for jest to be able to find the `.babelrc.js` closest to the file
|
||||
// instead of only the one in this directory.
|
||||
babelrcRoots: true,
|
||||
}
|
||||
9
book.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"gitbook": ">=3.0.0",
|
||||
"root": "./docs",
|
||||
"plugins": [
|
||||
"anchors",
|
||||
"-edit-link"
|
||||
],
|
||||
"pluginsConfig": {}
|
||||
}
|
||||
31
docs/README.md
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
# Xen Orchestra
|
||||
|
||||
## Introduction
|
||||
|
||||
Welcome to the official Xen Orchestra (XO) documentation.
|
||||
|
||||
XO is a web interface to visualize and administer your XenServer (or XAPI enabled) hosts. **No agent** is required for it to work.
|
||||
|
||||
It aims to be easy to use on any device supporting modern web technologies (HTML 5, CSS 3, JavaScript), such as your desktop computer or your smartphone.
|
||||
|
||||

|
||||
|
||||
## XOA quick deploy
|
||||
|
||||
SSH to your XenServer, and execute the following:
|
||||
|
||||
```
|
||||
bash -c "$(curl -s http://xoa.io/deploy)"
|
||||
```
|
||||
|
||||
### XOA credentials
|
||||
|
||||
* Web UI: `admin@admin.net` / `admin`
|
||||
* Console/SSH: `xoa` / `xoa` (first login)
|
||||
|
||||
## Must read
|
||||
|
||||
* [XOA installation](xoa.md)
|
||||
* [Main features](features.md)
|
||||
* [Pro Support](support.md)
|
||||
77
docs/SUMMARY.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# Summary
|
||||
|
||||
* [Introduction](README.md)
|
||||
* [Architecture](architecture.md)
|
||||
* [xo-server](xo-server.md)
|
||||
* [xo-web](xo-web.md)
|
||||
* [xo-cli](xo-cli.md)
|
||||
* [others](others.md)
|
||||
* [Installation](installation.md)
|
||||
* [XOA](xoa.md)
|
||||
* [Updater](updater.md)
|
||||
* [Trial activation](trial_activation.md)
|
||||
* [Plugins](plugins.md)
|
||||
* [Logs](logs.md)
|
||||
* [Compatibility](supported-version.md)
|
||||
* [Troubleshooting](troubleshooting.md)
|
||||
* [From the sources](from_the_sources.md)
|
||||
* [Configuration](configuration.md)
|
||||
* [Features](features.md)
|
||||
* [Administration](administration.md)
|
||||
* [Home view](user_interface.md)
|
||||
* [Search and filters](search.md)
|
||||
* [VM management](vm_management.md)
|
||||
* [VM creation](vm_creation.md)
|
||||
* [VM import and export](vm_import_export.md)
|
||||
* [XenServer Patching](patching.md)
|
||||
* [Docker support](docker_support.md)
|
||||
* [Backup and DR](backups.md)
|
||||
* [Full backups](full_backups.md)
|
||||
* [Rolling snapshots](rolling_snapshots.md)
|
||||
* [Continuous Delta backups](delta_backups.md)
|
||||
* [Continuous Replication](continuous_replication.md)
|
||||
* [Disaster recovery](disaster_recovery.md)
|
||||
* [Smart Backup](smart_backup.md)
|
||||
* [File level Restore](file_level_restore.md)
|
||||
* [Backup Concurrency](concurrency.md)
|
||||
* [Configure backup reports](backup_reports.md)
|
||||
* [Backup troubleshooting](backup_troubleshooting.md)
|
||||
* [User authentication](authentication.md)
|
||||
* [Built-in](built-in.md)
|
||||
* [LDAP](ldap.md)
|
||||
* [SAML](saml.md)
|
||||
* [GitHub](github.md)
|
||||
* [Google](google.md)
|
||||
* [Resources delegation](resources_delegation.md)
|
||||
* [ACLs](acls.md)
|
||||
* [CloudInit](cloudinit.md)
|
||||
* [Self Service](self_service.md)
|
||||
* [Visualizations](visualizations.md)
|
||||
* [Health](health.md)
|
||||
* [Job manager](scheduler.md)
|
||||
* [Alerts](alerts.md)
|
||||
* [Load balancing](load_balancing.md)
|
||||
* [Auto scalability](auto_scalability.md)
|
||||
* [Forecaster](forecaster.md)
|
||||
* [Recipes](recipes.md)
|
||||
* [Reverse proxy](reverse_proxy.md)
|
||||
* [How to contribute?](contributing.md)
|
||||
* [Support](support.md)
|
||||
* [Roadmap](roadmap.md)
|
||||
* [Purchase](purchase.md)
|
||||
* [Direct purchase](directpurchase.md)
|
||||
* [Through purchase department](through_purchase_department.md)
|
||||
* [Reseller](reseller.md)
|
||||
* [Editions](editions.md)
|
||||
* [Trial](trial.md)
|
||||
* [Invoices](invoices.md)
|
||||
* [Upgrade](upgrade.md)
|
||||
* [XOSAN](xosan.md)
|
||||
* [Requirements](xosan_requirements.md)
|
||||
* [Types](xosan_types.md)
|
||||
* [Replicated](xosan_replicated.md)
|
||||
* [Disperse](xosan_disperse.md)
|
||||
* [Creation](xosan_create.md)
|
||||
* [Trial](xosan_trial.md)
|
||||
* [General Troubleshooting](general-troubleshooting.md)
|
||||
* [Glossary](glossary.md)
|
||||
72
docs/acls.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# ACLs
|
||||
|
||||
> ACLs are permissions that apply to pre-existing objects. Only a super admin (XO administrator) can create objects.
|
||||
|
||||
ACLs are the permissions for your users or groups. The ACLs view can be accessed in the "Settings" panel.
|
||||
|
||||
1. Select the user or group you want to apply permissions on
|
||||
2. Select the object on which the permission will apply
|
||||
3. Choose the role for this ACL
|
||||
4. Click on "Create"
|
||||
|
||||

|
||||
|
||||
> Pro tip: you can click to add multiple objects at the same time!
|
||||
|
||||
Your ACL is now available in the right list:
|
||||
|
||||

|
||||
|
||||
You can edit/remove existing ACLs here.
|
||||
|
||||
## Roles
|
||||
|
||||
There are 3 different roles for your users:
|
||||
|
||||
* Admin
|
||||
* Operator
|
||||
* Viewer
|
||||
|
||||
### Admin
|
||||
|
||||
An object admin can do everything on it, even destroy it. E.g with its admin VM:
|
||||
|
||||
* remove it
|
||||
* migrate it (to a host with admin permission on it)
|
||||
* modify the VM resources, name and description
|
||||
* clone it
|
||||
* copy it
|
||||
* convert it into a template
|
||||
* snapshot it (even revert from a snapshot)
|
||||
* export it
|
||||
* attach/add visible disks
|
||||
* same for network cards
|
||||
|
||||
### Operator
|
||||
|
||||
An operator can make everyday operations on assigned objects. E.g on a VM:
|
||||
|
||||
* eject a CD
|
||||
* insert a CD (if he can view the ISO storage repository)
|
||||
* start, restart, shutdown, suspend/resume it
|
||||
|
||||
All other operations are forbidden.
|
||||
|
||||
### Viewer
|
||||
|
||||
A viewer can only see the VM state and its metrics. That's all!
|
||||
|
||||
## Inheritance
|
||||
|
||||
Objects have a hierarchy: a Pool contains all its hosts, containing itself all its VMs.
|
||||
|
||||
If you give a *view* permission to a user (or a group) on a pool, he will automatically see all the objects inside this pool (SRs, hosts, VMs).
|
||||
|
||||
## Examples
|
||||
|
||||
### Allow a user to install an OS
|
||||
|
||||
If the OS install needs an ISO, you need to give this user 2 permissions:
|
||||
|
||||
* *Operate* on the VM (e.g to start it)
|
||||
* *View* on the ISO Storage containing the needed ISO.
|
||||
12
docs/administration.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Administration
|
||||
|
||||
This section contains everyday XenServer administration tasks.
|
||||
|
||||
* [Home view](user_interface.md)
|
||||
* [Search and filters](search.md)
|
||||
* [VM management](vm_management.md)
|
||||
* [VM creation](vm_creation.md)
|
||||
* [VM import and export](vm_import_export.md)
|
||||
* [XenServer Patching](patching.md)
|
||||
|
||||

|
||||
35
docs/alerts.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Alerts
|
||||
|
||||
Alerts are a way to warn the administrator about various events. The first kind of alerts will be emails and also in a dedicated area of `xo-web` to display them.
|
||||
|
||||
## Performances alerts
|
||||
|
||||
The administrator will configure alerts based on performance thresholds.
|
||||
|
||||
The configurable metrics are:
|
||||
|
||||
* CPU usage (VM, host)
|
||||
* RAM usage (VM, host)
|
||||
* network bandwidth (VM, host)
|
||||
* load average (host)
|
||||
* disk IO (VM)
|
||||
* total IO (SR, only for XenServer Dundee and higher)
|
||||
|
||||
If any configured values exceed the threshold during a selected period of time, an alert will be sent.
|
||||
|
||||
Those alerts will be also stored and accessible in the web interface, and also later for the load balancing feature (helping it to solve those performance problems).
|
||||
|
||||
## Updates alerts
|
||||
|
||||
When your XOA detects new packages, you'll be notified by email.
|
||||
|
||||
## Backup alerts
|
||||
|
||||
Same story for backups: if a backup fails, you'll receive an email.
|
||||
|
||||
You can choose to be notified only if it fails or even after each backup job.
|
||||
|
||||
Current supported alerts system:
|
||||
|
||||
* Email
|
||||
* XMPP
|
||||
28
docs/architecture.md
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
# Architecture
|
||||
|
||||
Xen Orchestra (XO) is software built with a server and clients, such as the web client `xo-web`, but also a CLI capable client, called `xo-cli`.
|
||||
|
||||
> XO is totally agent-less: you don't have to install any program on your hosts to get it working!
|
||||
|
||||
## XOA
|
||||
|
||||
*Xen Orchestra Virtual Appliance* (XOA) is a virtual machine with Xen Orchestra already installed, thus working out-of-the-box.
|
||||
|
||||
This is the easiest way to try Xen Orchestra quickly.
|
||||
|
||||
Your XOA is connected to all your hosts, or the pool master only if you are using Pools in XenServer:
|
||||
|
||||

|
||||
|
||||
## Xen Orchestra (XO)
|
||||
|
||||

|
||||
|
||||
Xen Orchestra itself is built as a modular solution. Each part has its role:
|
||||
- The core is "[xo-server](https://github.com/vatesfr/xen-orchestra/tree/master/packages/xo-server/)" - a daemon dealing directly with XenServer or XAPI capable hosts. This is where users are stored, and it's the center point for talking to your whole Xen infrastructure.
|
||||
- The web interface is "[xo-web](https://github.com/vatesfr/xen-orchestra/tree/master/packages/xo-web)" - it runs directly from your browser. The connection with ```xo-server``` is done via *WebSockets*.
|
||||
- "[xo-cli](https://github.com/vatesfr/xen-orchestra/tree/master/packages/xo-cli)" is a module allowing you to send commands directly from the command line.
|
||||
|
||||
|
||||
We have other modules as well (like the LDAP plugin for example). It allows us to use this modular architecture to add further parts as we need them. It's completely flexible, allowing us to adapt Xen Orchestra to every existing workflow.
|
||||
BIN
docs/assets/DocImg1.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
docs/assets/DocImg2.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/assets/DocImg3.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/assets/DocImg4.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/assets/DocImg5.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
docs/assets/DocImg6.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
docs/assets/DocImg7.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/assets/DocImg8.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/assets/DocImg9.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
docs/assets/acllist.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/assets/backup-report-config.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
docs/assets/backup-reports-plugin.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
docs/assets/backupexample.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/assets/bind-process.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
docs/assets/cover.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
docs/assets/cpu_weight.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
docs/assets/createacl.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
docs/assets/directpurchase.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
docs/assets/disperse3.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/assets/disperse3_grow.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/assets/disperse5.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
docs/assets/disperse6.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
docs/assets/disperse6_2nodesoff.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
docs/assets/export_task.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
docs/assets/fullevent.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/assets/githubconfig.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
docs/assets/googleconfig.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
docs/assets/groups.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/assets/heatmap.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
docs/assets/invoices.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/assets/job_create.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/assets/job_execute.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
docs/assets/jobmanager.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
docs/assets/ldapconfig.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/assets/loadbalancer.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
docs/assets/member_purchase.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
docs/assets/member_purchase2.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
docs/assets/member_purchase3.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
docs/assets/member_purchase_2.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
docs/assets/noevent.jpg
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/assets/parralelcoordinates.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
docs/assets/partner2.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
docs/assets/partner_request.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/assets/plugins.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
docs/assets/purchase-for-another.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
docs/assets/purchase-menu.jpg
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
docs/assets/purchaser_button.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
docs/assets/purchasing-process.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
docs/assets/quiesced1.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
docs/assets/quiesced2.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
docs/assets/quotation.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
docs/assets/react_js.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
docs/assets/refreshupdater.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/assets/regproxy.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
docs/assets/regupdate.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/assets/replicate2.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
docs/assets/replicate2x2.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
docs/assets/replicate2x3_full.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
docs/assets/replicate3.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
docs/assets/replicate3x2.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/assets/replicate3x2_full.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/assets/samlconfig.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
docs/assets/schedule_job.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
docs/assets/schedule_recap.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
docs/assets/selfservice_create_vm.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
docs/assets/selfservice_creation.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/assets/selfservice_menu.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
docs/assets/selfservice_new_vm.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |