Compare commits
2850 Commits
Author | SHA1 | Date | |
---|---|---|---|
a67874b6ae | |||
9402e9f357 | |||
b75bb5434e | |||
ec44c3113b | |||
cb21bf7454 | |||
a1cffef503 | |||
9b00099ead | |||
d2351f1a81 | |||
869e4601b4 | |||
238e5b573e | |||
996680a336 | |||
94f6127711 | |||
3841301ee9 | |||
f406202825 | |||
ba50f57e93 | |||
61a758f67d | |||
847c27fbee | |||
7d79f3d5f7 | |||
fa3fdea590 | |||
aa2cd76c58 | |||
e2d82c7d4d | |||
e9c2a34def | |||
0fad95f032 | |||
683595940b | |||
40060c1fed | |||
2abee30fdd | |||
7cdc53bbf7 | |||
dac877252b | |||
dd749b0e47 | |||
f98c02cbc6 | |||
218d7e3ec6 | |||
acefa2bb6e | |||
36551172f3 | |||
c26f4ef385 | |||
60816a8a82 | |||
d7d09712ef | |||
825f019226 | |||
ca5e5bb67f | |||
8191ff150e | |||
f2aeb13c68 | |||
ce76b4b3c2 | |||
44b9d6f162 | |||
53e80e8aa2 | |||
f94aa5ceb1 | |||
3e4b9868a0 | |||
4d86df04a0 | |||
2165f0d450 | |||
1e7639bfc4 | |||
4121628d99 | |||
da78b90f9c | |||
1ef6e8b6a7 | |||
10351f7075 | |||
70a152deb7 | |||
5446bfbba8 | |||
400885e620 | |||
f960fc3b6f | |||
ddfa4d679a | |||
10e8026786 | |||
2527c039df | |||
93d8a2044e | |||
d2354a16cd | |||
34ee1f1c76 | |||
2de4dc3a81 | |||
b90036dadd | |||
4708f4fc21 | |||
062cf75cdf | |||
e5950360ca | |||
5b358ff0b1 | |||
4c00391d78 | |||
9594362e35 | |||
3420029b5e | |||
f432a1c927 | |||
e8b32f2d87 | |||
3e3b505cc8 | |||
0bca966ec5 | |||
84737fb33f | |||
e21a15ab17 | |||
90066d22a0 | |||
dbf5dad1c4 | |||
c793da1edc | |||
f8735e5988 | |||
e9805b2486 | |||
eb90405a78 | |||
ecf5f468c3 | |||
51aee8cac8 | |||
7d5049c350 | |||
01a99f5651 | |||
2914e99ff3 | |||
f9b824ac30 | |||
9a535ec77b | |||
ffba023c91 | |||
e01689978e | |||
68ac8976eb | |||
afb790db73 | |||
0732de361a | |||
d455270fa1 | |||
1336be16c9 | |||
03380db560 | |||
927ebc702c | |||
c24cb13382 | |||
3a804a8a20 | |||
1fde4167ea | |||
75f9f40922 | |||
e9c2638f90 | |||
338c545f85 | |||
e379b4a31c | |||
3d7ca2bdb9 | |||
d34019e246 | |||
7cb2ebba79 | |||
4e8581950e | |||
2a9a3d632e | |||
b6d07fa038 | |||
4599e7959c | |||
82ed13c7d7 | |||
5aaa81ab89 | |||
8a06d1935e | |||
f44254b4bd | |||
07875ce13e | |||
98dc770efa | |||
8848f1d487 | |||
5128ae48a0 | |||
104ae6093a | |||
e830d63f6a | |||
ce32cd487a | |||
f36c659365 | |||
47e5cbdb03 | |||
4923a76f22 | |||
e01ca6a2dd | |||
5e989333cd | |||
af39c399bc | |||
64591e731e | |||
5658504b90 | |||
64e0786aa9 | |||
90761f0f62 | |||
74f74d1e64 | |||
4db4b9706c | |||
00a5072ad3 | |||
3d3d698bb3 | |||
1b9521bb87 | |||
1d781c5b20 | |||
8e8836d1ea | |||
a904e3755d | |||
7ba99fef86 | |||
7d2be91bc9 | |||
578895336a | |||
8c090937f5 | |||
4229633d98 | |||
3ed7e87538 | |||
5b43cc4487 | |||
3241392117 | |||
c474a66b41 | |||
b32cf6a1e0 | |||
f32791b4b2 | |||
8f33fe8e59 | |||
d19010481d | |||
6b11524a8b | |||
e953029e8f | |||
10f788b7eb | |||
9348544e46 | |||
126ccbcfa6 | |||
440472cb32 | |||
4ce7da516d | |||
a7f8efcf35 | |||
9fe4c79005 | |||
f09f4d5fd5 | |||
38b4f9b534 | |||
fca1cef29f | |||
45b8a0327f | |||
a723c08715 | |||
c381a162fb | |||
b4931192c3 | |||
cc269b9ff9 | |||
a5e3be4992 | |||
137309cc4e | |||
85f4e834d8 | |||
065013ccec | |||
56d98ba966 | |||
dda1b4fa44 | |||
68b102269f | |||
0ecdaa0dc0 | |||
13f435caab | |||
ff99780303 | |||
fa9507020a | |||
1bff50afea | |||
37ff72720b | |||
2d5d264f99 | |||
c9c07445b7 | |||
a4388ffc36 | |||
ea1458923e | |||
e857f1fae8 | |||
3ec42e81b1 | |||
be1163acfe | |||
d308dc8af7 | |||
60643023ad | |||
875d53ef6c | |||
b41f9e9fec | |||
a1b71c3c7d | |||
013fa2d886 | |||
72e311c6b2 | |||
2732c47466 | |||
0466089316 | |||
5e42d38598 | |||
82a4bb5e80 | |||
94bc7957c1 | |||
c9e6b07145 | |||
3c06eba17a | |||
8081e4aa7b | |||
d8769d659e | |||
572cd0381b | |||
5e91b40087 | |||
936eceda61 | |||
61c4087041 | |||
7d39e47182 | |||
c4e1af3069 | |||
3e234af16e | |||
bbbf662d20 | |||
25d78b1068 | |||
78bf292343 | |||
e5ef69ecf7 | |||
b7b9a57425 | |||
c4a04b7c62 | |||
2e41dbe828 | |||
56d36ca439 | |||
e0ba5553be | |||
8d6fb677c1 | |||
a2daecc25d | |||
ee0c5c8e01 | |||
ae5b1e188f | |||
49f9aca627 | |||
4cba875379 | |||
7ab4382476 | |||
eaef6c8d00 | |||
95f3692545 | |||
686173dc2a | |||
39c5db7f0f | |||
603aa09d54 | |||
88aa3076f0 | |||
5400fe171c | |||
87bf9f569f | |||
8fb24a2c0a | |||
4b5d9b6e64 | |||
72bd8293e3 | |||
09989d9963 | |||
4088d5bc62 | |||
d4b84c1dec | |||
426847e1ce | |||
79b902d512 | |||
73c607497e | |||
f2f526b61d | |||
cb67ecaddb | |||
5bf9b0b0bb | |||
7a61f89e5a | |||
671c6a96e7 | |||
f0d23e5370 | |||
d1bee4344d | |||
d724116c0c | |||
888d89e2dd | |||
a6471bc346 | |||
6b1da1c166 | |||
18210d8958 | |||
bc5c1a9aa6 | |||
3df77ef5da | |||
e8d9d9adfa | |||
01d152720f | |||
5e58381ea9 | |||
0b6d9442bd | |||
134ed9e14f | |||
0796b642de | |||
f912ba6a3e | |||
a576e6685b | |||
b1c793cfa5 | |||
c0147e49c4 | |||
d52b120905 | |||
84c8a580b5 | |||
467bd01cdf | |||
7a7fcb4715 | |||
cf8e44bc30 | |||
279e7eb497 | |||
606828cc65 | |||
aac424674c | |||
8fd1e10830 | |||
12509a6d9e | |||
5e169f387c | |||
8369ade880 | |||
73cef112eb | |||
4a0132382a | |||
6ee69fccd3 | |||
a862835be2 | |||
ddbd63ed5f | |||
6a59fa0e18 | |||
1ed9069ad3 | |||
a588b67906 | |||
37a634f550 | |||
951fe0cb7d | |||
4ca3f0c6ae | |||
69e5ba29c4 | |||
e045d154e9 | |||
6526709d48 | |||
603f80d813 | |||
398636b61c | |||
eb70464839 | |||
75054859ff | |||
8e898895cc | |||
4be6beab6f | |||
a3b4b5b50e | |||
33b8d7e5e8 | |||
f2f43e1904 | |||
c002d48b0c | |||
15998ed12a | |||
9d8ab62769 | |||
3526a76ef3 | |||
b9e0fcbdcd | |||
a7188b3a75 | |||
b6c06dce9d | |||
4adf47b606 | |||
4d0dc29951 | |||
1011fb552b | |||
2fd2d29281 | |||
9104152a83 | |||
02a58862dd | |||
26153589ba | |||
17b3e4451f | |||
a2072cc346 | |||
fea23d0323 | |||
71e83e1b1f | |||
28570d19a6 | |||
1369bcdbba | |||
5e4d81e957 | |||
0f4721f305 | |||
5547f90ba7 | |||
2e1b63fb25 | |||
7b2d3a5fe9 | |||
0216f56241 | |||
80acdd71fa | |||
26af61debc | |||
e7f94010d3 | |||
a4e871f52c | |||
bc3072ef7a | |||
f4bb2510b9 | |||
2ab12cd0cb | |||
c894909e17 | |||
7f394c807b | |||
7afb98a912 | |||
3847008e1b | |||
f6ed2eff47 | |||
23eed6755a | |||
384a2b4d4f | |||
910177a388 | |||
54311a38c6 | |||
983edbc54a | |||
10439718e2 | |||
ebddccef5f | |||
9cfe0ff350 | |||
295bae14b7 | |||
53939bb438 | |||
329c2cbe66 | |||
55334cf45a | |||
a2e30cd51d | |||
4bf2ab1109 | |||
1dd1c9eb5c | |||
6dde015f8c | |||
5f3b2330c8 | |||
4ba5d3b3dd | |||
e7e3d7360a | |||
fd8b00aed7 | |||
2631e57d20 | |||
90461b76fb | |||
629103d60c | |||
dc232b8946 | |||
6fed819dc2 | |||
646fc7f086 | |||
ecc5602c88 | |||
6a15cce540 | |||
f281b8d3a9 | |||
4465b76812 | |||
61df02cda1 | |||
3b0321365b | |||
0dfce17a43 | |||
a38dccf0e8 | |||
f05085ab22 | |||
bc42bb3c6e | |||
94b7f56e65 | |||
0417e9af1b | |||
ce5327badc | |||
368f4c5416 | |||
318b310638 | |||
164ad7b706 | |||
a5322f3c50 | |||
fa29d7eb49 | |||
a21f9852fd | |||
79e2473c63 | |||
375b1f6150 | |||
109ccd300f | |||
c287b28725 | |||
c560cfddca | |||
44f6bb019c | |||
d6d42702d1 | |||
3fafd0e2a1 | |||
59648eac3d | |||
5b6b5bba68 | |||
b13089cdf5 | |||
1f03196c0b | |||
edf0940649 | |||
801ec1dbf9 | |||
34ac5cd889 | |||
58421ec112 | |||
a5bdc987dc | |||
d32a8652bd | |||
a26ebad5f9 | |||
dd9cef56fc | |||
26858dba84 | |||
9fe3358ce6 | |||
76425d84b3 | |||
42355b11a4 | |||
511e4f6987 | |||
3f0e344bc1 | |||
a316178768 | |||
dff8ea92aa | |||
88e1f7997c | |||
4c3eabeaf3 | |||
4c7be5f59d | |||
6d4fbbc3ea | |||
1a23132262 | |||
48c4193f7c | |||
8204d9b095 | |||
fad95a334a | |||
973e985d73 | |||
e5a13382b2 | |||
81c0b90447 | |||
ee9fa953de | |||
09acf0a70d | |||
15d1435789 | |||
80ea23e1b9 | |||
5d6379f8db | |||
566b946f9b | |||
7f7459677d | |||
0892a512bc | |||
b717871d2a | |||
7b11a8098d | |||
8b2c6f5dbc | |||
d26985a600 | |||
e29f456efc | |||
a79082a0dd | |||
1336ae8249 | |||
0db5712493 | |||
c47609fedb | |||
b84e8aaee9 | |||
d84e4073af | |||
e8656da70d | |||
59477ad252 | |||
2f29f1c765 | |||
4d84e869bf | |||
79d841014e | |||
ea62611d8e | |||
f3c867a034 | |||
aae5db916e | |||
a417c8a93e | |||
79e58a903e | |||
9f40e09d0a | |||
553e57f914 | |||
2200a38671 | |||
ba39ab20fb | |||
ff8945fd2f | |||
4876393562 | |||
971bc6f94b | |||
cab92acb3c | |||
a1d90719e4 | |||
eeff085d9d | |||
d43c407a00 | |||
6bc87d3952 | |||
04c1c68f31 | |||
94b17c804a | |||
94352256b7 | |||
b3bed7e41f | |||
a4672dd0b1 | |||
17bbcb57d7 | |||
843146479a | |||
cf1e117fc7 | |||
03eac20b87 | |||
11f5d59396 | |||
6f63c29306 | |||
c0e365fd49 | |||
93fb2e0d21 | |||
c553407e98 | |||
4830de408b | |||
7f78528308 | |||
2843ba9017 | |||
e244b9d03d | |||
657c47db35 | |||
a32bb86df9 | |||
654c56e05d | |||
589c4dad9e | |||
0320deb0a9 | |||
4c4e5c2b1e | |||
924373d2df | |||
3b60b5098f | |||
4abb3edd9f | |||
932e69a837 | |||
ef6d49670b | |||
52ea00e9df | |||
870681013a | |||
c046739461 | |||
8b1289f3e4 | |||
f1d76ecf6c | |||
074503f288 | |||
c6f55139f8 | |||
20cc25d749 | |||
30316192b3 | |||
e93263be1e | |||
2ab2ca9c24 | |||
54fcb7f5d8 | |||
4abd4dbe38 | |||
eac1beef3c | |||
166a48f903 | |||
82775c4764 | |||
88bc9635aa | |||
1037f2bc2d | |||
f24cbee77d | |||
25b4d52dce | |||
2729d134bd | |||
32b75d36a8 | |||
c4430a937d | |||
237314ad0d | |||
caf76ec592 | |||
0af8c26b74 | |||
825dfe7e0d | |||
30a0809553 | |||
6ee3035523 | |||
b627ebbf40 | |||
ef4bdf6b8b | |||
54722acada | |||
0e2bf3aa1d | |||
365126efa9 | |||
03d4c9217d | |||
8498290848 | |||
654db565cb | |||
51f83548ed | |||
5847a6bdb5 | |||
313e5e2047 | |||
7914e62b10 | |||
84d3284609 | |||
70fab5b46e | |||
e36135031d | |||
5a5ee0326e | |||
776dabfb2e | |||
5c4755ad08 | |||
7c1666289d | |||
cded320e92 | |||
b31cdec225 | |||
591b120d35 | |||
e8913fea12 | |||
355a41a763 | |||
5bd4825432 | |||
8f7e5b028a | |||
2a29d9a1ee | |||
e056966bc7 | |||
ef0ea4ba05 | |||
2892624783 | |||
2c10410b0d | |||
d1d74c4367 | |||
8b7f3b8f1d | |||
3f6c2efb8d | |||
227f36497a | |||
5ef4c7bcd3 | |||
70d00e0149 | |||
dcf155dac9 | |||
3c5b523631 | |||
6396bace3d | |||
713a128adf | |||
affc224aca | |||
6f82d32977 | |||
2a06e08618 | |||
1057b1f5a5 | |||
af76234112 | |||
1825c1a9b7 | |||
9a8bf2cac9 | |||
cc5ef79bec | |||
3725d95c65 | |||
4fb068019e | |||
6446a078a0 | |||
1d7fcbece8 | |||
8703a68a31 | |||
9bcdade85f | |||
b0156179b9 | |||
d0a0bad9d6 | |||
a4003d9078 | |||
3f4a62de2f | |||
bf23f63aa5 | |||
fd641b99c3 | |||
225affc9ca | |||
9ce2481a69 | |||
d95c74c6e7 | |||
218ee3269f | |||
5ca5f8daf3 | |||
98cdee781a | |||
9cf4504909 | |||
5f846a3fc1 | |||
c9793d47f9 | |||
be8adca115 | |||
9152a0077f | |||
0b90c67fb4 | |||
b4975d3102 | |||
ee33795b72 | |||
90e16be3ae | |||
cf90a369e2 | |||
6b303323be | |||
1576c7a0d9 | |||
cd5d6103ea | |||
207f763d1a | |||
1bed3aedc8 | |||
ab77d660cc | |||
b74a1daae9 | |||
bec357e2cb | |||
78593b5b5c | |||
7d6f03a7fe | |||
f46573f8c3 | |||
b83e136fb6 | |||
5c4203b20c | |||
7f9eef1d47 | |||
a8a0132766 | |||
831c43c91b | |||
b452e2df74 | |||
7f37cacfac | |||
3bb7e62e88 | |||
3b060167f6 | |||
8a76e71129 | |||
396fd747a6 | |||
16bd08b297 | |||
ccdf327ac8 | |||
8cd63df0dc | |||
b90cb34fd6 | |||
d6c1e12c06 | |||
d33d1c880b | |||
985e84e369 | |||
cc2c5c7762 | |||
40bf636b47 | |||
347cde827b | |||
ac4a1fb35c | |||
6f3714b9aa | |||
d810014eeb | |||
e0f6892625 | |||
9d5b426a6d | |||
8bf5769382 | |||
2970cd3d6d | |||
d41114c5a8 | |||
6c92449702 | |||
db04d10d14 | |||
5a4233f07b | |||
3c715edd07 | |||
bbe05d7fe9 | |||
2af8b8ef91 | |||
d4bfdfe749 | |||
1d14c31658 | |||
9bd81bb384 | |||
d64226efee | |||
2440eaa2df | |||
e8bf4f31f2 | |||
6682461d88 | |||
41f1132e0e | |||
d938c9337a | |||
9896a75caf | |||
7eefd0c3d7 | |||
2e268e311c | |||
3e182fd828 | |||
7b60850334 | |||
1552d9699c | |||
7507b19cd2 | |||
16f9ea6708 | |||
d984a9acf0 | |||
955f4aefcd | |||
858bbfbbd1 | |||
c1570b373f | |||
d336363771 | |||
e57aa36d3e | |||
b488f850aa | |||
ec07a280ba | |||
5006632550 | |||
7eb9f48485 | |||
31cba7098d | |||
f4571b0b50 | |||
3832911d50 | |||
28c86760da | |||
c4604ca468 | |||
464c409aa3 | |||
08ec39be0c | |||
25350f3370 | |||
0023cfa385 | |||
ed24142767 | |||
917230e4f8 | |||
05228f17f5 | |||
e8653b96be | |||
1cf191c597 | |||
3d3e31b7f8 | |||
8730cfcc3e | |||
5830e5620d | |||
46d53e3e90 | |||
3554fe6480 | |||
0dadf66dc7 | |||
a941bbd0c9 | |||
21e3ed3449 | |||
81678129fb | |||
52d8db7925 | |||
875d375d7a | |||
cba167b874 | |||
e68c0e68bd | |||
ff2bc2d21f | |||
4961404c7c | |||
3fbf2311e4 | |||
41685061f7 | |||
35a7ab5778 | |||
e1beaae4a2 | |||
965bd58693 | |||
00fdaaf12b | |||
60473d234a | |||
4f688e09a4 | |||
24e84128e4 | |||
e63457b6b2 | |||
a83cedc2ac | |||
076afa6197 | |||
423e3cbd18 | |||
0263396187 | |||
043018cfbe | |||
2037d9af03 | |||
7f07991035 | |||
18ce01caff | |||
5bc8e80a99 | |||
6252df4c18 | |||
451856d21d | |||
aa30663ca5 | |||
8616a4afe5 | |||
bc2358319b | |||
0bf4b81370 | |||
c9dd5a2452 | |||
cf95f616c5 | |||
1adbc7c13c | |||
9d28974c27 | |||
3dbc35b5c1 | |||
fee0fe5422 | |||
86d9f4e733 | |||
3f16f1b006 | |||
cbd9899389 | |||
cd44fb8d84 | |||
aca4c2b5a9 | |||
85eedfb78b | |||
f26276bc4e | |||
6d62e69f9a | |||
4188fd59a0 | |||
5b9f575648 | |||
0d890ec414 | |||
926d05ef0b | |||
8be48ddfc7 | |||
41e66bfaf6 | |||
47a7241410 | |||
54c77b3d62 | |||
a1c5575308 | |||
a44c934b5d | |||
546d2653ee | |||
33c06b3388 | |||
1917ea3ce1 | |||
70842b9ef2 | |||
e6122a657e | |||
9e860ac01a | |||
7690a8e7bd | |||
1860208560 | |||
1689296d46 | |||
7aa4851b77 | |||
6ef8e2902f | |||
aa16b7b284 | |||
9bbd83b1f2 | |||
65535670f9 | |||
9d42fe4d3b | |||
918a367258 | |||
970a70b41e | |||
4094fe5a31 | |||
dea8e2cb54 | |||
0514a4308f | |||
d0647e5a02 | |||
bbe06f97be | |||
f1a83e9759 | |||
38a81c6b46 | |||
6afb60abf5 | |||
a42212fc1e | |||
2e21948156 | |||
5279ee745f | |||
227501c063 | |||
89d25b1931 | |||
b57c0dbe30 | |||
8b910bb6bc | |||
dfde34e612 | |||
2530811e22 | |||
85205bc253 | |||
3cdd1a3424 | |||
002865405c | |||
8a73ef897a | |||
be61c56c21 | |||
dbaef7d04d | |||
2048073355 | |||
a585e1f696 | |||
415737b2b8 | |||
54f7007cc5 | |||
b0338178d7 | |||
159100b944 | |||
41a8db3576 | |||
fe291ab794 | |||
adb65b9889 | |||
8513626b9f | |||
7ca0ba4515 | |||
42200c405a | |||
be327dbccd | |||
c724dc3892 | |||
70dc2ff3ab | |||
81f5d03e8d | |||
e50c6b94c1 | |||
28eaff20bd | |||
8d1a1b2976 | |||
92eaec53db | |||
b3c2c57897 | |||
f458e97fda | |||
80bf9ae99b | |||
bebd4a7ca4 | |||
9468e94412 | |||
6b66c8507f | |||
167e5406c3 | |||
c111c9a931 | |||
bb71e3a023 | |||
7b1bf4c098 | |||
32b88d928a | |||
f8e1932337 | |||
7c9fb570cc | |||
56d22c66c0 | |||
85cdc4f371 | |||
96bcfb9b1f | |||
4a874665eb | |||
6f6b69946e | |||
5b7f44555e | |||
2ca396c015 | |||
d8dae16035 | |||
8f02db04f9 | |||
9f35e44681 | |||
6279b8f5a5 | |||
3084232cb5 | |||
67cc79ec52 | |||
b9a09a9501 | |||
4a0d3a3e3f | |||
2322a980d0 | |||
c19f5b85a3 | |||
7f9d8438ab | |||
51c80c5a52 | |||
6477ebcf6f | |||
bc02c2789c | |||
c0b3d09236 | |||
3ddbab6193 | |||
befd95a90a | |||
ab6cd4229b | |||
9213744ecb | |||
41c0333814 | |||
afcf8b3ed6 | |||
69ebbec40b | |||
b22a9c14a4 | |||
54067d8225 | |||
d64c4eeab0 | |||
15d2c7786e | |||
73a1da5ed6 | |||
fbf8779388 | |||
3231c35fb8 | |||
ced7838de4 | |||
2f26b8668a | |||
9432838914 | |||
1a89a7794e | |||
c0a87c12fb | |||
c6a7ea0a2f | |||
5bb057e5a2 | |||
2924b37d6d | |||
42c0f784e2 | |||
05f17d1ec4 | |||
777690a121 | |||
a98e228766 | |||
4c9174ce26 | |||
1d70e3812c | |||
e2225aa882 | |||
99dd709f3e | |||
f197c286d5 | |||
b121711baa | |||
085655b21b | |||
4c209d6b10 | |||
8dc45e291a | |||
ec1ae7e631 | |||
25aa55b5f5 | |||
b5c6088130 | |||
a65eb0ec29 | |||
42eef1451c | |||
11ecf058e4 | |||
5f1f7ef564 | |||
2e4e698633 | |||
02dce8cad0 | |||
8aa4842fa8 | |||
efc09f63cc | |||
3253d8a2e4 | |||
1531185dd0 | |||
baf9c3704e | |||
cdf39e62b3 | |||
b81e37f6ab | |||
ddebbb52fd | |||
983e929e25 | |||
f47e035721 | |||
a80d72f999 | |||
8de9a9917f | |||
fa016c1697 | |||
7d2c156eb1 | |||
04cec92e8d | |||
64394b0de8 | |||
2f617a4548 | |||
2ba64bed18 | |||
cafccb5991 | |||
b22e8c3632 | |||
7929292618 | |||
0d4e4cae7f | |||
f4ba2e3155 | |||
7101ed6e27 | |||
85ac35aa9a | |||
40590561fe | |||
631e550920 | |||
f806c0effa | |||
50a4797fb1 | |||
cc2a0b12f8 | |||
988e8de122 | |||
2f8809c6bc | |||
92b7775fa1 | |||
f4d231e70a | |||
b419050aa7 | |||
8937c65951 | |||
6c6ad82d90 | |||
d0f11b66f7 | |||
f9fcac51a5 | |||
ca953d831f | |||
01c023d50f | |||
c2113a405e | |||
5dae81d199 | |||
bd768c3320 | |||
572fc035a2 | |||
99b2f045af | |||
6248e51797 | |||
19e4a36c70 | |||
90769e5694 | |||
b8cbe5d65b | |||
35c95ca653 | |||
2dbc1a9a55 | |||
dceecb0bbf | |||
d690d14568 | |||
85ef624440 | |||
e995996290 | |||
8e6ad4301d | |||
86740dfc89 | |||
1399c592d1 | |||
9883b54cba | |||
83b8949a98 | |||
28f60e5291 | |||
1f31d06f48 | |||
2f2e83c890 | |||
b22c618734 | |||
1e041082bb | |||
a57ce270ac | |||
b5b99a52cd | |||
9586ce2f46 | |||
b8d526f18d | |||
d2edc68ead | |||
4d651378e2 | |||
58791864d7 | |||
1a41e9af4f | |||
c297835b01 | |||
e68269fcaf | |||
5243df4712 | |||
4470eba551 | |||
1f2c4713ef | |||
a6c16894ff | |||
271764deb9 | |||
52f7a73009 | |||
bdb6e6b83f | |||
41dacd5d3d | |||
eb1dfb02b5 | |||
1a0eb86344 | |||
bdb62b20a3 | |||
f2ca03d7d0 | |||
00ac86c31b | |||
627d000098 | |||
4be4736603 | |||
2da7aca8e8 | |||
8306b8b1a5 | |||
605cfd4ab1 | |||
dec3147501 | |||
c642aec128 | |||
fd9aa8dfa2 | |||
07d6c0967d | |||
80a3749088 | |||
c72fdb53ae | |||
b03ec281bf | |||
cef4654ff4 | |||
f45dceeb73 | |||
18262a88c9 | |||
87f4be7998 | |||
d737adc6be | |||
5fdaecf6f4 | |||
d8792b88ef | |||
8b1174f50a | |||
8c8f7b5a09 | |||
44915932d5 | |||
e90fdf5bed | |||
a11c8ab485 | |||
74a50158ca | |||
6ee85d57be | |||
b2fc6f9228 | |||
f91481eded | |||
651a61f559 | |||
b06edeca02 | |||
89ccb125d1 | |||
c972704477 | |||
887f1cb90c | |||
16b4d78400 | |||
ec8d9c6b80 | |||
49c2d1dcad | |||
d0f51651f9 | |||
481ccf16a5 | |||
a223458753 | |||
e1740f3f01 | |||
740dc9d1d4 | |||
bbf01b644c | |||
66d066964c | |||
c81c46c336 | |||
c3747b93c8 | |||
d43265b7f1 | |||
6864fd0149 | |||
340c0bf9e3 | |||
4d104cd4d8 | |||
367c0ff7c6 | |||
9c26a3d61a | |||
93e3581ce7 | |||
f4e52bb27d | |||
72064fd0df | |||
77486a608e | |||
e97025ab02 | |||
e43b9175c0 | |||
9cc1415ef5 | |||
bd215dc0e4 | |||
12e874cef0 | |||
6d233161b0 | |||
905a570489 | |||
432fe44187 | |||
51b938496d | |||
b7f9b25e4d | |||
fe61280b6b | |||
68c087d578 | |||
d6bf87cab7 | |||
2b96a43879 | |||
697c41c584 | |||
a2379996e6 | |||
29077d95db | |||
dbd00a57b0 | |||
d08cff51a4 | |||
3e461dec1c | |||
4d08e25913 | |||
43313c2ee7 | |||
81b2a87232 | |||
3d8cd0ced7 | |||
7c78d54231 | |||
f9d71e8b17 | |||
0107fd323c | |||
8ba47929a0 | |||
794b0fe9ce | |||
979dccc7ec | |||
44a5f38bc4 | |||
bf78f70885 | |||
545706cbee | |||
0d916ac531 | |||
d4ab407045 | |||
45212a8c78 | |||
64b83c3d70 | |||
639a6782bd | |||
5f34d69bcc | |||
337ff5a3cc | |||
8e6459a818 | |||
aff3e16194 | |||
9372c0787d | |||
83fb2da53e | |||
645a044bf6 | |||
37796ff73f | |||
e1fdcb1678 | |||
aab9a26409 | |||
958055a789 | |||
edda5039d4 | |||
1c86893d95 | |||
d543587d34 | |||
780bc4cad2 | |||
18bd6ba13d | |||
4dafc513cc | |||
7acd5c5659 | |||
8428063d9e | |||
f490dda05a | |||
2b191385ea | |||
bc228e5eaf | |||
8be65e34de | |||
d967d8f1a7 | |||
50deb0d3f8 | |||
1d928b25fe | |||
f2f81791d1 | |||
382f10a0cc | |||
0d2133db98 | |||
09faa9ee95 | |||
ccec086e25 | |||
05725ac9a4 | |||
96b7483138 | |||
81281d04a4 | |||
e062ebbc29 | |||
b92cad0938 | |||
ea368a06cd | |||
3f48cdb380 | |||
17c7b46a69 | |||
a375df6f4c | |||
a3775bb4e8 | |||
1e0c6194b5 | |||
a6bd669854 | |||
6334bdc1c5 | |||
3b82f3eea5 | |||
38556bf60d | |||
d8d8af9826 | |||
3984a5fd77 | |||
397356096a | |||
365915da9a | |||
87152fbac6 | |||
22a9189ee0 | |||
4428818412 | |||
47ea98e0e3 | |||
6dd0513546 | |||
8abe51b71d | |||
69b8bc3bfa | |||
301b8aa0a5 | |||
e5b6c93323 | |||
9a045790ed | |||
82a103c8f9 | |||
0123039271 | |||
9a0e115a37 | |||
867bfc4378 | |||
feb1645f37 | |||
8ca37d6a65 | |||
ac163a7c18 | |||
9b6bddb24c | |||
f57ae48286 | |||
4cbd7eb7f9 | |||
310686726a | |||
ad5cee1d22 | |||
bad6e32075 | |||
8ae6d28cd4 | |||
ca1060862e | |||
8a0046f519 | |||
84cbdb35c4 | |||
1e93fbb5c1 | |||
619554af2b | |||
d5a48b5ce4 | |||
4e9cc3e97c | |||
492bc2ba63 | |||
995492100a | |||
854319d88c | |||
3189d05134 | |||
b2a43b987c | |||
6676409f7f | |||
44de5bcc00 | |||
e2956c605d | |||
b22b6c2299 | |||
90950c9c20 | |||
0c5b9e7820 | |||
a9ffa010c8 | |||
a6a903293b | |||
3fffcb5d77 | |||
a670b99db1 | |||
aefd74197a | |||
9ff747ef50 | |||
a08a198577 | |||
4cfb123448 | |||
198ebc6c86 | |||
a8abcd9b30 | |||
b7469f5a9a | |||
6bbe49aa14 | |||
5aa1019010 | |||
29a59b380c | |||
0bfcea6a11 | |||
19f5aa252f | |||
89e9134a3f | |||
b5a202acb6 | |||
0f860f712f | |||
7c66701366 | |||
585e90c0de | |||
5c852d5b82 | |||
484172b5f8 | |||
d148958b67 | |||
0a8d773ad0 | |||
427d90e6c1 | |||
9b2e4079d0 | |||
1a0b410554 | |||
2d50a6192f | |||
781da7f6f0 | |||
646221cc29 | |||
b168a27f73 | |||
a442bd9792 | |||
884fec7735 | |||
1cb89f302f | |||
da36bbe756 | |||
25e464c5ce | |||
8446fbca85 | |||
9738dd545f | |||
0bce2118e7 | |||
6543214dde | |||
d91c6fd4e1 | |||
711d1f6fc3 | |||
e422beec74 | |||
a484c9cf96 | |||
5654d8ceba | |||
31cf625af5 | |||
93be18ffd2 | |||
e96464c795 | |||
ad0ed40a59 | |||
63fd8e58b2 | |||
758a827c2d | |||
7ad33e8052 | |||
abfe0c0e70 | |||
f22dfb5ece | |||
4bda51688b | |||
eab25e2f33 | |||
94bd11bae2 | |||
759af9f00c | |||
f58e5132aa | |||
d831846706 | |||
1fc9ac0433 | |||
5c48d0af1f | |||
30fb19be35 | |||
fbeac4ea28 | |||
7f066a9b21 | |||
c5a767cd1d | |||
027ef213aa | |||
dc1fdd6267 | |||
96918252e5 | |||
014dc5f9d7 | |||
59e94227af | |||
e84b801c2e | |||
6638c034d2 | |||
04df41cec1 | |||
483da89d03 | |||
c92e3832bf | |||
edb90f6afa | |||
0057f0e580 | |||
e6217b8b36 | |||
6fe16039b9 | |||
42967bf185 | |||
5843268c47 | |||
7273ba3de2 | |||
0bf1c314da | |||
c7926d8e8c | |||
44ce25e7ac | |||
3a2cc5c66e | |||
3838ce3330 | |||
59217472aa | |||
df69a4fc59 | |||
25d3965769 | |||
08d8b2a4fd | |||
879569d73f | |||
b63f833d36 | |||
482c6e33dd | |||
46a1863f88 | |||
632756b6fb | |||
04eba29c55 | |||
0912878ecf | |||
d5035c5600 | |||
38ae42b11a | |||
a174854a0d | |||
c4b2b9ab41 | |||
ef942e04c2 | |||
f54cd66924 | |||
b40ab10d38 | |||
f8ccbfdedd | |||
470f1c798a | |||
5c012b392a | |||
165b641c1d | |||
66e42bec05 | |||
c503ea7045 | |||
745ec187ce | |||
f046313c0e | |||
74595b8821 | |||
c9fdd142a4 | |||
abaa6d0ac9 | |||
cfae8f0656 | |||
54f4ecd46a | |||
1835d86e9d | |||
b9b4b31284 | |||
b4772d1c43 | |||
9933dc3133 | |||
08ac90f920 | |||
13f5863561 | |||
81764111fe | |||
cb022525ff | |||
75656a78c6 | |||
284eb5daff | |||
ff58c51919 | |||
2fb1bdda20 | |||
12299b333b | |||
b017bbc441 | |||
9e8c0d2e33 | |||
250c29edd2 | |||
c431659d05 | |||
a33389c391 | |||
3460565414 | |||
26b62138ee | |||
afb0220642 | |||
0993923ed5 | |||
e0362b0d0f | |||
df3a74d7e0 | |||
d5d457e667 | |||
b27c32821c | |||
76b15a035f | |||
eb8feb1281 | |||
fc6ce9835b | |||
8ae9f4efc2 | |||
c9d13b0fc4 | |||
bfacc1d8c3 | |||
02d484370f | |||
5ae86dfaa1 | |||
dbe7e556b0 | |||
4799280ccd | |||
cb4865466e | |||
cb80d900b3 | |||
ee01737e87 | |||
2012825913 | |||
eb5e3420ae | |||
b2362a1207 | |||
54d968664a | |||
1e20f819d5 | |||
8001c82e81 | |||
baefbc444e | |||
4a227b54bf | |||
8a192bedde | |||
d5efa18ae4 | |||
5f79dc2805 | |||
9aa58f0143 | |||
8835664653 | |||
d37da6b7fc | |||
b9ee86efe1 | |||
d108b610fd | |||
0ec79339f7 | |||
2afdc7f27d | |||
26aa9aca40 | |||
3e2984bcb9 | |||
a7a5406c32 | |||
4f727a783e | |||
23dc68fdea | |||
b532dd00c4 | |||
c01742855a | |||
9c953dd260 | |||
3fbf2d2fcd | |||
e0af222ec3 | |||
73b5011786 | |||
2ea5abcd65 | |||
7137630d43 | |||
8acfd15d6e | |||
48fbbfeb7e | |||
9990af3042 | |||
fe6c19383b | |||
42150d263b | |||
9839d3f778 | |||
dd59e3c2a1 | |||
0b7432ae09 | |||
c1c2c8f635 | |||
7680525eec | |||
42298d5896 | |||
39478aa52c | |||
6a99b930c4 | |||
f6ce45b373 | |||
205e187613 | |||
a78348acbb | |||
410611b4f2 | |||
af07ec8f29 | |||
3f803af00b | |||
ac461bd651 | |||
ce955e1635 | |||
e20d008c6a | |||
fb657d8ee5 | |||
fba0b77469 | |||
b5c1296eaa | |||
065df12872 | |||
7e1d4712b8 | |||
49c965a497 | |||
6fe9aedd0b | |||
42cb9bd6a5 | |||
66dbe5639e | |||
2d87f2fb73 | |||
4c81273274 | |||
73b8f6793e | |||
663ef85992 | |||
e92c75815b | |||
6dbad5b4b5 | |||
bff7e3f3e4 | |||
83abc7497d | |||
8bc5eebeb8 | |||
1433b96ba0 | |||
be1a8c94ae | |||
4606f34353 | |||
7bb720cb4d | |||
c4d8542ec1 | |||
9700d5374a | |||
05e90d6463 | |||
55118ca18e | |||
f70d8091d3 | |||
a3c709ef21 | |||
4917f1e2d4 | |||
93829fc680 | |||
5605ca5619 | |||
e49f0c03d9 | |||
0098b712a5 | |||
5fb694e8c0 | |||
583a68a446 | |||
e6604cf391 | |||
43cfb3c35a | |||
8a16c571d2 | |||
314652a499 | |||
6b68e5d597 | |||
cafd51bf42 | |||
eaff09f483 | |||
9b93c62044 | |||
5d90860688 | |||
5ba83ed099 | |||
50bf10ad56 | |||
16d444c979 | |||
fa9c9be737 | |||
2e7014e31d | |||
a84050c1f0 | |||
7c9835465e | |||
ec00200411 | |||
956e5fec1f | |||
b107fdb99a | |||
7320e9ff4b | |||
c4d2d54a6d | |||
1142350e8d | |||
d735b31345 | |||
e211fee562 | |||
8c15560b68 | |||
327e93711f | |||
a076571470 | |||
ff50c07ebf | |||
179145dc24 | |||
6bd0a00c46 | |||
f6e28f4e62 | |||
37f1b7dd8d | |||
60e6ee46de | |||
2260f065d4 | |||
6eff8dec4f | |||
7e25b9aaaa | |||
f867ef9c4a | |||
fc8920e35d | |||
7f3b0f67e7 | |||
844660036b | |||
efcac39d34 | |||
cb4b721cb0 | |||
7956877f14 | |||
2241c6795f | |||
43e60ceb41 | |||
b760d8a23f | |||
2c1592263d | |||
616533823c | |||
913dddea85 | |||
3530430365 | |||
a4ba60be8f | |||
99e98f605c | |||
935ee97b17 | |||
6b9bfd7fe9 | |||
dd519bbad1 | |||
35fe981c7d | |||
b6570abe79 | |||
54813c650e | |||
781106f8c5 | |||
96f35520a0 | |||
490560e0c6 | |||
52f53d8280 | |||
27b8a3f671 | |||
abf9b6da42 | |||
0c9209b04c | |||
edebd52374 | |||
61205f00fb | |||
a303e00289 | |||
af9f72e9d8 | |||
5176346b30 | |||
731eeef25b | |||
a65e3e4bc0 | |||
027eb2bbe6 | |||
6982a54701 | |||
035c40e638 | |||
79c535955d | |||
8b7f8d3f3d | |||
866c859a1e | |||
23e4e90540 | |||
a4fa3fc241 | |||
81d10c3b37 | |||
f1e2904150 | |||
23f9503a31 | |||
a0ef68b93c | |||
6b127e6ea0 | |||
5e17dbf2bb | |||
dfb04575ad | |||
6f2626ae19 | |||
37e60ddcde | |||
05cdc05347 | |||
6364115b4b | |||
2133cd9103 | |||
01f84fcce1 | |||
08b3823025 | |||
968a0ab261 | |||
21b552848a | |||
fd19256470 | |||
1ed022576c | |||
f6aa7b38bf | |||
fdfcb74d67 | |||
98afc7b152 | |||
0d08fceeb9 | |||
3c945d73c2 | |||
58fcbf5ab7 | |||
3a3f31c947 | |||
8fc63287df | |||
172473e4de | |||
76f549debb | |||
c9097ff801 | |||
fb01fd3af6 | |||
fa4bcbcad0 | |||
189cdb7427 | |||
874bd5454d | |||
b649887e9a | |||
8c62c15f56 | |||
51ac17b56e | |||
fc5a012068 | |||
5e293f1315 | |||
87367decf2 | |||
f792220dd4 | |||
97030c9407 | |||
5d1d0f5d6c | |||
294466ee61 | |||
c100fe9108 | |||
e754da3ac2 | |||
bc1e52bc38 | |||
6f0073bbb5 | |||
2decf85d6e | |||
1d8f849457 | |||
beb07279b6 | |||
8c6854c8fd | |||
57f472d9bb | |||
94ffca10a2 | |||
0a274ab0a0 | |||
c0026563b0 | |||
e411924c7c | |||
709c15abaa | |||
b404e4d930 | |||
f507580c3f | |||
291b786076 | |||
06c9059dac | |||
d7c6ad60dd | |||
0a0ba0785b | |||
6ed79592f2 | |||
4c75ee3471 | |||
6f997da8cd | |||
03e40aa4ee | |||
be1d6cbcc6 | |||
ffaca016ad | |||
71f82a98d7 | |||
deef6fbc0c | |||
4ac529141f | |||
a108a2e967 | |||
ff7a29104c | |||
240b2ffb9b | |||
a86e703661 | |||
1ecf4e6d20 | |||
9f9a661b1a | |||
1b1cab8321 | |||
f4f9a503de | |||
a4971d5f90 | |||
477ebe6b78 | |||
38efbfc148 | |||
10052ea644 | |||
b57619ea29 | |||
445b0043b2 | |||
8b62cbe752 | |||
81f99362d9 | |||
414c23facb | |||
c5608cf86c | |||
5d08c750ef | |||
f3fde36beb | |||
0c83e8891e | |||
133de2dd1f | |||
c8219747f0 | |||
0247f794e9 | |||
710f787c41 | |||
d8916a326c | |||
924d6d4072 | |||
984ac33d5c | |||
0a4dfd63c9 | |||
a6e746f652 | |||
30f73fa2e0 | |||
9f0ee346e9 | |||
48d6dede4a | |||
8432e4a655 | |||
b35eb0a175 | |||
c3a1b34ed3 | |||
bb26843cd6 | |||
ee0ab12dd0 | |||
d5f7755467 | |||
5c64e83b1e | |||
0f6f99b4ec | |||
f668862ae0 | |||
c960d2b501 | |||
f5d9f2534b | |||
9a3ddcea33 | |||
030464d3a9 | |||
3f30b32c2e | |||
5eafe6aabc | |||
2c9f274efa | |||
31112c79ac | |||
d89f91b538 | |||
a6310ec294 | |||
98d9323534 | |||
09f1f28800 | |||
e1da9ca4bb | |||
625c7bfc0b | |||
d9503950e3 | |||
376e927980 | |||
5204cbcf0f | |||
e373dcc564 | |||
137a6ebcad | |||
ed1329ecf7 | |||
2371c1e371 | |||
63c07d950c | |||
a3cdb19e33 | |||
4623cd6497 | |||
ab81bb13ad | |||
616650a198 | |||
78763d21b1 | |||
f2d6324958 | |||
6e880f19cc | |||
64623f329e | |||
407f3fb994 | |||
0eb0c4bd63 | |||
82422c115a | |||
ed2beb334d | |||
f3b4820d06 | |||
8f7cd96df4 | |||
4accbc5853 | |||
2791318ff1 | |||
47208b4147 | |||
b783591fb5 | |||
9dd6175808 | |||
5e8b97178e | |||
38260cddf5 | |||
80b0423d54 | |||
b690bb69eb | |||
8a40e22691 | |||
f5c6a2c956 | |||
6d5803399b | |||
3896f80cb3 | |||
60d2a6157a | |||
b83b12cf80 | |||
86847f487b | |||
1b03910dea | |||
435a6c5e0a | |||
1f4befe136 | |||
7f0f366675 | |||
362e69610c | |||
bad26df102 | |||
790627b4bf | |||
6de14a55ed | |||
8b24c6880a | |||
5174956548 | |||
d669a739b2 | |||
c7fa61619e | |||
009a04f8d0 | |||
0953044cfb | |||
d923671a7b | |||
db8a606707 | |||
b614b29bea | |||
65595e169f | |||
10db4717f1 | |||
1d9d2f0f7c | |||
ad53c1d6dd | |||
beeadb8a4b | |||
b997524912 | |||
cc4a9d250a | |||
6227b9bab0 | |||
f608e74c8b | |||
08379a21d1 | |||
8f1d972149 | |||
b59c308219 | |||
0224c3c273 | |||
f0609851fc | |||
dbd45a72c3 | |||
4c979d5450 | |||
35c80d696f | |||
6823fdc7f9 | |||
3323798b54 | |||
67fd09791f | |||
1b37ebf6f6 | |||
043406d662 | |||
61db0851d6 | |||
ad54df3178 | |||
71103afd69 | |||
6465d809cd | |||
ae8635c307 | |||
e0100d618e | |||
455e5f7110 | |||
c26c9390ff | |||
9e45e03aef | |||
e144810d73 | |||
3c2dd8ad05 | |||
91e3b38da4 | |||
9d79cec4d5 | |||
4935681cf4 | |||
669fa672d9 | |||
a797583535 | |||
54ed1b2a71 | |||
8e12e86f0b | |||
fe7bdc9d29 | |||
546b6a23df | |||
4fdf13f95f | |||
385681c9ab | |||
be99df2767 | |||
30200b5c4a | |||
f47c1d3a2f | |||
6e545d0058 | |||
84006f98b2 | |||
42ca9e918a | |||
ea93bea7bf | |||
0081903f7c | |||
c53797f627 | |||
e1d367df47 | |||
71f413cd27 | |||
48aa2b93b7 | |||
641862ddad | |||
2f08ee1fe3 | |||
93f077c5cf | |||
941342f70e | |||
9a556c8a30 | |||
46dce62be6 | |||
b0ef9631e6 | |||
fb0d9833af | |||
bfe4b7d782 | |||
185dab7678 | |||
c1fa057cce | |||
f66565203a | |||
a2a7dd1535 | |||
e7dd169fdf | |||
fa31f4c54c | |||
038ee59960 | |||
e1c1533790 | |||
9de7c71a81 | |||
aa64e06540 | |||
18077ac633 | |||
a71a009313 | |||
b6ba5acd29 | |||
4fdf5ddf5b | |||
c724f65805 | |||
79c9bf55b9 | |||
788d82d9b7 | |||
2f0b92352d | |||
b7f2be5137 | |||
72aa1834dc | |||
fe4cc5b1a1 | |||
04b053d87e | |||
b469011fd1 | |||
a68768cf31 | |||
f3df613cb7 | |||
056ee78567 | |||
3cd529ea51 | |||
3aade17125 | |||
1dc2fe20dd | |||
645a47ff6e | |||
b1456a8ea7 | |||
a9fcbec9dc | |||
346a488e35 | |||
3066f56481 | |||
07ca4e3609 | |||
dcd75edb72 | |||
59af9ca98e | |||
f1694b062d | |||
fa7aceeb15 | |||
0e16f57e37 | |||
bc00289bce | |||
86d602457a | |||
33508b1237 | |||
b282557563 | |||
e6513bd5de | |||
5911f74096 | |||
0bb74e54b1 | |||
f254a27071 | |||
d0abba3397 | |||
54adea366c | |||
ba2e4b15da | |||
0ccdd1b6a4 | |||
fb66c85363 | |||
aae4c30ceb | |||
0656344ae4 | |||
1143f6ca93 | |||
90e94aa280 | |||
c0af05e143 | |||
4aef06f1b6 | |||
034cf70b72 | |||
8b600f9965 | |||
e4e280183e | |||
2fc45a97a9 | |||
b7ce2e575f | |||
09f6a24078 | |||
b728a69e7d | |||
1401f4be5f | |||
fdb4416bae | |||
abe1edfc95 | |||
e4a864bd21 | |||
7a7368ee08 | |||
e707fd2b3b | |||
625a56b75e | |||
6d8a1ac9e4 | |||
362739054e | |||
2762481cc8 | |||
652506e6b8 | |||
926d253126 | |||
1cd951c93e | |||
3b707fbb8f | |||
b15751bf55 | |||
82c05b41fa | |||
b8d9079835 | |||
f8a682a873 | |||
b03a19b6e8 | |||
603a6bd183 | |||
83b039af35 | |||
c9299e76fc | |||
2f1a46f748 | |||
2b38dfb456 | |||
f487a622ce | |||
906ef6c5bd | |||
ea1853a17b | |||
221177ba41 | |||
184a37635b | |||
b2da7fbd1c | |||
7fe76d3491 | |||
e6b5bf69a3 | |||
4615325f9e | |||
2156dec5a9 | |||
16245d540c | |||
bff8557298 | |||
34aa8e13b6 | |||
babab85b56 | |||
6746bbb1a2 | |||
942078c40b | |||
c30816c1f8 | |||
e6dc35acb8 | |||
e10c5c74f6 | |||
f8adf8f83f | |||
e0538349e2 | |||
0903403ce7 | |||
b6563f48ad | |||
932390bd46 | |||
6b7688aa98 | |||
ab0cf7e6a1 | |||
264779e704 | |||
7f3d91003c | |||
14e0862509 | |||
9e733dae48 | |||
bfea476be2 | |||
385cf2bd9d | |||
d6373f3525 | |||
01f37e01c3 | |||
b4fb262335 | |||
5499bd3dee | |||
d771a608f5 | |||
227a39b34b | |||
f9beae9cc9 | |||
4430f199c4 | |||
eef18365e8 | |||
319fe45261 | |||
f26080fab1 | |||
0cbdeed96b | |||
8b4f4d9ee4 | |||
b9cc905761 | |||
c9725bb829 | |||
40492a562f | |||
db67e4fe06 | |||
b4b14dc16e | |||
c4a45ec744 | |||
5428f5ca29 | |||
328df3b507 | |||
a4915dfc2b | |||
d642802d8c | |||
a20fcab060 | |||
b9e7bcc272 | |||
acc3d9df5a | |||
1298618a83 | |||
a12388d177 | |||
1f092c7802 | |||
cd82870015 | |||
8d6b6a045f | |||
1dceaed1e9 | |||
2565fdd075 | |||
7ece65a01e | |||
028d0a1352 | |||
68931742cb | |||
3ea148598a | |||
cd92fd7336 | |||
d58e6313e1 | |||
16f9f244cf | |||
b683fd589c | |||
a2285525be | |||
f23497b088 | |||
b57b3c9bfc | |||
d3444c0891 | |||
d28e688666 | |||
72c0e102ff | |||
7b22fb257f | |||
2e201e7da6 | |||
ee89416319 | |||
2357744bd0 | |||
52fe9e8ece | |||
eed1bae554 | |||
6eb41487ce | |||
9e61c01ce4 | |||
91c9b42da3 | |||
52d2ae48f0 | |||
1872050564 | |||
efeb92efee | |||
4ebda996e5 | |||
5eb9dd0c8a | |||
12bcbf0734 | |||
dc2876f6bb | |||
bdc208af48 | |||
2ef1b6290f | |||
df0bdf6be7 | |||
8b47a23002 | |||
29615fe838 | |||
133042b5d8 | |||
73df9c515b | |||
8d1beca7e8 | |||
9b2bad7af0 | |||
78efafc2d0 | |||
2d3d91b1db | |||
030c5c6d8a | |||
53a561a222 | |||
e832860a3c | |||
804f61432d | |||
943479f5f6 | |||
fdce52aa99 | |||
4e32d1c590 | |||
afef7f3bba | |||
b428af9781 | |||
c8774067ee | |||
23440482d4 | |||
6f757b8458 | |||
95ade8fdb5 | |||
9e870b5f39 | |||
7827e3b93e | |||
e6ca9c3235 | |||
0698f78df5 | |||
bcc2880461 | |||
115d927c15 | |||
df729017b4 | |||
455f2ad228 | |||
e4f5f59eea | |||
16cdb9563b | |||
02479720c0 | |||
97168f920e | |||
9809772b23 | |||
4940012d0d | |||
0c2f9621d5 | |||
e7372972b5 | |||
e5adbc3419 | |||
41255b4d95 | |||
0c4c6a7b1c | |||
c7e18ba08a | |||
bb14d46796 | |||
e6475b09e0 | |||
d39d095fa4 | |||
86f3c2363c | |||
8e7e2223d8 | |||
081c37cccf | |||
c0df91f8bd | |||
400c568f8e | |||
4703ba81ce | |||
29633e2fe9 | |||
b64e9a97f3 | |||
254b1f2213 | |||
1a374fcfd6 | |||
e07620028d | |||
b947b1e7ee | |||
1e80fb8e92 | |||
8d841f81ee | |||
d9f365d79f | |||
32a4695c46 | |||
2081327428 | |||
4c0ae82e23 | |||
883aa6d5a4 | |||
bfa54f2e85 | |||
238a872d1f | |||
7d6c4c39e9 | |||
f153930066 | |||
836c4a278d | |||
6cd8496008 | |||
61c6eafc08 | |||
8db1468952 | |||
39cd81de92 | |||
62c74d7749 | |||
254ec19412 | |||
97bbd1bf9e | |||
54aec2fa8b | |||
e1dfcddc79 | |||
344add3885 | |||
752dfc4bda | |||
72be0eb189 | |||
fdc00811ce | |||
6c5bdef567 | |||
ea545b395b | |||
f6b1d1cc66 | |||
d1993187b6 | |||
adfcfb6788 | |||
07995a3ca3 | |||
dd76eba73e | |||
b13da548b9 | |||
fe0efb25e8 | |||
b0b00c4a47 | |||
19ca962b15 | |||
d479f0c810 | |||
1d5dac1b1d | |||
96c3d98256 | |||
0b3dc8ed8c | |||
9a75eb11cb | |||
92dd02aaf6 | |||
41bfd24919 | |||
fddc8aa410 | |||
735ee5206a | |||
a86bf52390 | |||
2deee0e01f | |||
2d7d6e61be | |||
4ec17f7eb5 | |||
fcad02e1de | |||
708fab3082 | |||
3bbb70b3d3 | |||
0c80f4fa87 | |||
21486225c8 | |||
a2920c3757 | |||
6e0f58e7a9 | |||
dee74aa440 | |||
4acd7229d3 | |||
9608ac3486 | |||
ad9d1625a6 | |||
1a558edd0b | |||
5976c392ad | |||
a92b2d6a00 | |||
7d4bf881f7 | |||
05be0984b4 | |||
cdbc18fc4e | |||
2995aedf1d | |||
45f9b32e0f | |||
1d0b662b42 | |||
38f5cb5b71 | |||
476328b302 | |||
4c3efb532d | |||
dafe3197ab | |||
90d7425afe | |||
2d81f7b0c0 | |||
04e24b14f0 | |||
a2bf852818 | |||
0ac612476a | |||
0c6b83d656 | |||
4e6dc58727 | |||
66bbd4200c | |||
326c835e60 | |||
1a48cbf164 | |||
3480777d89 | |||
a71bc08ff4 | |||
df766e668f | |||
0a8f3ae0b3 | |||
da6e67b321 | |||
dec00364b3 | |||
5637087cc9 | |||
5ad4bdc482 | |||
823867f5b7 | |||
c6772c92b8 | |||
79f6a79cfc | |||
4c7f100d22 | |||
9070d11f4c | |||
124b93f31c | |||
0f22f53b36 | |||
3784dbf029 | |||
4c95d58c41 | |||
38d4675921 | |||
7b8aa893fa | |||
fb2678f96e | |||
486ed27299 | |||
df4827f2c0 | |||
ef1b436350 | |||
b19b4bfcb0 | |||
e64b9f9204 | |||
9c33683c25 | |||
ba20987ae7 | |||
729d41fe6a | |||
905147a5ee | |||
0c41e0d06b | |||
b37b59b726 | |||
60b9b48e71 | |||
abf8b5d475 | |||
7eebe1483e | |||
9a76091785 | |||
c386b06fc6 | |||
6bcfc5c1a4 | |||
768e10d0b3 | |||
e7244387c7 | |||
5ade6c25f3 | |||
784fa1c2e3 | |||
66f4e6a809 | |||
8074d2b0c3 | |||
b02d49ab26 | |||
82a0cd2ad4 | |||
ee1a9c3230 | |||
db24c01106 | |||
ae3cfa8f0d | |||
b56c111e93 | |||
bbeb0256f1 | |||
005a5b9677 | |||
55bee04856 | |||
42fd40a124 | |||
f21508b9e1 | |||
ee7a308de4 | |||
636e674ee7 | |||
b02b374b46 | |||
1c13afa8f9 | |||
69b92fab7e | |||
6ab77df3f5 | |||
264c19582b | |||
8acd4d9afc | |||
65b0cea6bd | |||
cfe01b2e6a | |||
b19b032be3 | |||
5441708634 | |||
3c9b370255 | |||
510544770b | |||
e8293841c2 | |||
46114bf28e | |||
0d7e61f06f | |||
fd6a54dfbc | |||
1ea5722b8f | |||
bc8fadf494 | |||
a76934ad33 | |||
d7a122a026 | |||
6c25588e63 | |||
17a1f579d0 | |||
998db63933 | |||
c0fa14d94a | |||
6fd129844d | |||
baae780c99 | |||
09a1da25ed | |||
298c6aaef6 | |||
a329324139 | |||
a83e2ffeab | |||
5d7449a121 | |||
ebbe4958c6 | |||
73b2cc4977 | |||
7ecfde8150 | |||
796480a38b | |||
4ae6aede60 | |||
e0085e6612 | |||
194da6f867 | |||
3fade35260 | |||
5e39918fe1 | |||
f4dc47a805 | |||
12c65bacf1 | |||
ba37f3562d | |||
fce4659388 | |||
0a15870a82 | |||
9866de5e3d | |||
9d3f183ba9 | |||
fe233f3b3d | |||
be3bd0f90b | |||
3c053adbb5 | |||
c040ec22f7 | |||
43f627ba92 | |||
2b67de2e3f | |||
477859662a | |||
ccd7241e2f | |||
f37ef25bdd | |||
b93bbab454 | |||
9cebc837d5 | |||
1bc1d81a00 | |||
dda72456d7 | |||
8f2f3dd710 | |||
85959a99ea | |||
36700a0a87 | |||
dd4b42bac1 | |||
9626c28619 | |||
463c03462a | |||
a086427a7d | |||
4d431383d3 | |||
d10332a15d | |||
43772efc6e | |||
0af2da0437 | |||
d09db6c2e9 | |||
bc871bd19d | |||
b11a6a029d | |||
6a7be83efe | |||
58169da46a | |||
158f49e246 | |||
3e4a67f350 | |||
e0e5b4426a | |||
7158b304f5 | |||
833eca6d2f | |||
151acf5d96 | |||
4a363fb4a7 | |||
229adeb746 | |||
1eff9a1e89 | |||
ed4f0a0edc | |||
13bed6226e | |||
d937daedb3 | |||
8cce51135c | |||
0cfe1b3f13 | |||
05c16a6e59 | |||
3294b516d3 | |||
139bcedc53 | |||
cf9ea3c4c7 | |||
e84fde3e14 | |||
1de47507ff | |||
1a9948a488 | |||
04c2731349 | |||
5656888cc9 | |||
5fdc5a6f3d | |||
61d7b5013c | |||
871181d984 | |||
02939e178d | |||
3be308b949 | |||
83088644da | |||
14db8b52dc | |||
597427afaf | |||
3cddfb29be | |||
e15b76369a | |||
d7c1251435 | |||
ea3ce82a74 | |||
092378ba92 | |||
068e526862 | |||
a9767cf7de | |||
aadcc2815c | |||
0f3b7efa84 | |||
7c77e2f94a | |||
abd4c4cb8c | |||
09f12d1cf3 | |||
1db4cfb308 | |||
a4c1143664 | |||
0623674f44 | |||
2dd58db792 | |||
e11cfb93c0 | |||
bc0608955e | |||
36be19218e | |||
9fa39a46ba | |||
ff30b912a0 | |||
b0c10a88a3 | |||
ccbe6547a7 | |||
32afd60336 | |||
02e47b8d6e | |||
44055cac4d | |||
1dfc09cb6b | |||
48c56024aa | |||
cf103266b3 | |||
d5cf8f606c | |||
ce7ab28cfa | |||
07ca6f6e66 | |||
15ec790a40 | |||
cb73b2d69c | |||
c931c87173 | |||
28a0a9343c | |||
56b666458c | |||
cd6ddb5a69 | |||
ecd55041a2 | |||
e7e8e6d5f7 | |||
49df8ac115 | |||
7397f4a390 | |||
8317873c06 | |||
deef63699e | |||
c6e07769e9 | |||
423df9b1f4 | |||
c879e5af11 | |||
63d9aca96f | |||
c3b1da9e41 | |||
46388e6aef | |||
484d439a7c | |||
ab6615134c | |||
b1149ebb36 | |||
1bfdae7933 | |||
4f09d31085 | |||
58d73ddb1d | |||
6b809ff59b | |||
afe08d2755 | |||
a7bc5d4eaf | |||
97cd0a2a6d | |||
49a92084a9 | |||
9bdeecaee4 | |||
843880f008 | |||
a6ed5e1273 | |||
74f94d0678 | |||
946c3e8a81 | |||
7b212c1f79 | |||
3b2046d263 | |||
1ffe030123 | |||
5255e641fa | |||
c86b6f40d7 | |||
5a718dce17 | |||
1b32750644 | |||
5aa103c3c3 | |||
fd3f690104 | |||
24b638bd9f | |||
9624c5eecb | |||
503dd339a8 | |||
36ea5df444 | |||
dce9dd6f70 | |||
88e28e15e4 | |||
399e48a1ed | |||
7ae571e7cb | |||
4264c5023b | |||
82b7adf90b | |||
71c4a3138f | |||
52991f239f | |||
3435f5491b | |||
aafe8609e5 | |||
a8d69fcf05 | |||
1e68497c03 | |||
74fc844787 | |||
4cda7603c4 | |||
11e1e27a42 | |||
4ea831bfa1 | |||
c1d7d708d4 | |||
3fa2b983c1 | |||
a1e9c05738 | |||
934deeff2d | |||
c162df60c8 | |||
98161fddb5 | |||
be614c625f | |||
87c4cb7419 | |||
93bb51fe7e | |||
713b66b6ed | |||
77bd2a469c | |||
97af919530 | |||
c91602316b | |||
a13573c24a | |||
02543a5c7f | |||
42b68f72e6 | |||
664d8a2765 | |||
e6263c2662 | |||
ae197dda23 | |||
4c116bafb8 | |||
df30017ff8 | |||
3f3ae19d63 | |||
72dc68323c | |||
593f917742 | |||
639419b049 | |||
c5ac2b9ddd | |||
81f293513e | |||
8b5f72b176 | |||
f23f75433f | |||
6d6b4e72d3 | |||
e434258592 | |||
3dc1a2d5b6 | |||
5d95558bae | |||
882c082369 | |||
9a38fa29c2 | |||
14f6c9cb8b | |||
2d55beeca0 | |||
9238cdf50d | |||
5d30f03826 | |||
14263ef989 | |||
e7cb4dc50d | |||
27d864210a | |||
f667f49dab | |||
866c556faf | |||
90d515c97d | |||
4dbe129284 | |||
747c3bc087 | |||
c23e257c5a | |||
16a18dadba | |||
5f76ac37b5 | |||
d74edc3d89 | |||
2f57a433b1 | |||
df7f04364b | |||
98c259b4c1 | |||
799b3d88bc | |||
db22e6b270 | |||
16f0afbfb5 | |||
d3d566f7bd | |||
c96b0de48f | |||
2ce159343b | |||
9e496ff6f1 | |||
8819d1f2f5 | |||
0f9218079a | |||
1cafbdc70d | |||
a3eb7b2cea | |||
d9b8e2c795 | |||
4bd2a9e42d | |||
cef03f4149 | |||
eeb19aeb2d | |||
6c96ec418d | |||
5e4b32706c | |||
30c3c5d66c | |||
e51be33807 | |||
70030b43d0 | |||
724de093dd | |||
ff86ef00a7 | |||
912b3f5bc9 | |||
a4acb6ef84 | |||
d7ee07d838 | |||
53705acece | |||
c8fff67d88 | |||
9fa55e09a7 | |||
e443902583 | |||
32dc4c4604 | |||
f39a900722 | |||
1fc82c41f2 | |||
d2b0c78e23 | |||
adfdc36936 | |||
d8594d87f1 | |||
f66f537da9 | |||
d44185c4a1 | |||
d53fbe2474 | |||
95bda2f25d | |||
c9756b40d1 | |||
8cd29fb24a | |||
505c5f0f76 | |||
2aaae9705e | |||
8aa67ee758 | |||
3865e27e96 | |||
f6c6e09a8a | |||
71282dd988 | |||
80db161e05 | |||
be10cdb122 | |||
7fde1a71ca | |||
a83674ad48 | |||
02f82148cf | |||
39f18b30b6 | |||
69d970a658 | |||
6d55603dcc | |||
3e395378bc | |||
bccdc5fa04 | |||
0bf7ba6c92 | |||
e6b599aa6c | |||
d757021f4c | |||
ee15af6bb8 | |||
3da9b7e0dd | |||
beaa683a52 | |||
33a88dafb9 | |||
224c65f8de | |||
f2b4b4b9fe | |||
ea9e559fc4 | |||
0cf14984cc | |||
7d07b73def | |||
3d3670d786 | |||
14291179ce | |||
e744de0eb0 | |||
98b1733760 | |||
fdac28fcec | |||
653e2031d2 | |||
01ca99da2d | |||
1c2f842a98 | |||
a4d1675513 | |||
2ab5acac5a | |||
27fde64794 | |||
fa3f0584bb | |||
d12720c796 | |||
a4e86972a4 | |||
3a3af6e2b6 | |||
482409641f | |||
9688f6de0f | |||
5b32820e93 | |||
f40b4fb05a | |||
6e1deb158a | |||
50ec1a8712 | |||
a74b026baa | |||
7e42ccdaf2 | |||
e713ee5c56 | |||
ec5f9d3525 | |||
d0463b67ca | |||
2ff4c2cd5f | |||
c3b090ac8a | |||
c47e294ea7 | |||
25455bd06d | |||
c1c4a18f48 | |||
91f5594c08 | |||
86f6f74114 | |||
13d9fe3a6c | |||
41e4388005 | |||
06a94edcf6 | |||
ef496e2c20 | |||
113c9b5981 | |||
956295cefe | |||
a26c27c8e6 | |||
0c1c492d48 | |||
255ed62166 | |||
b96b11cdb7 | |||
faa8e6948a | |||
8314ca9c10 | |||
538c2b6dcf | |||
e9b44bec01 | |||
65418a0763 | |||
aef4976801 | |||
295d4f4116 | |||
c47a900ceb | |||
1b1110581a | |||
eb13d9151a | |||
449e4a66fe | |||
217c22c754 | |||
ba5b8a3e76 | |||
ac5e9e770b | |||
b25deec0be | |||
cdf1da2872 | |||
3cfc56f5c2 | |||
37e53b4c07 | |||
77d634710e | |||
5c5181a252 | |||
67042466e8 | |||
757d0ccc76 | |||
4a55fa87d5 | |||
032cd1b862 | |||
ec2434fe3c | |||
34389132d9 | |||
78ee20d72d | |||
601e42ac35 | |||
e1897b363b | |||
cf063c1973 | |||
f58233a73a | |||
d257c2ecbd | |||
e4ee7b7ac8 | |||
1f0d23f792 | |||
bfcef26a99 | |||
ec01eeadc6 | |||
660a34892d | |||
d86034afec | |||
62593aba1e | |||
0eaef8eb84 | |||
e39974afbf | |||
dde18bbb85 | |||
a40e1b0e8b | |||
a0eb0cd372 | |||
41067870c6 | |||
33a87bc39a | |||
bed3e15f16 | |||
c687da9e8e | |||
be30e7d269 | |||
106603c58f | |||
7ba2c1c386 | |||
4327a8462a | |||
e193544b8e | |||
323b2f3dd6 | |||
7884e7ef4f | |||
fae11693f0 | |||
22231524e2 | |||
9634ca07db | |||
62f6a7e3d9 | |||
86443141b5 | |||
f6e964b96e | |||
c8bed1b4d7 | |||
a3970d6c1e | |||
cc83c13660 | |||
bf7e2a4648 | |||
e284073e4a | |||
3ec99affc8 | |||
a9649ddc44 | |||
4f9096a211 | |||
c3a4b5e2e1 | |||
7957fabff2 | |||
20a4e4e252 | |||
2774566b03 | |||
4459ffe30e | |||
d16ed66c88 | |||
3ec6e249b3 | |||
dfa517ad6c | |||
8b2ad84a25 | |||
3dacedce71 | |||
512d50a455 | |||
b53f637914 | |||
152a926149 | |||
7f388acea8 | |||
b2bfb46835 | |||
24406ebc0c | |||
1f24d9114c | |||
859fe9c1fb | |||
2107a5aebc | |||
3638341aa4 | |||
067fe514e6 | |||
8c6e5ce23c | |||
0351f23ba4 | |||
c1ff544eff | |||
69e5d71961 | |||
48e22a8900 | |||
a7a5f56daa | |||
05389a0109 | |||
b65390ebc9 | |||
3bad3e6e52 | |||
24be37e3f6 | |||
1008a69a13 | |||
521a0acb2e | |||
3b66040de6 | |||
af3a0ae7b1 | |||
4e36f78438 | |||
f28d9088ed | |||
56b814e378 | |||
0c136efe30 | |||
cdead6cd12 | |||
c950826e46 | |||
f91d58e157 | |||
1ff840ffad | |||
7443a6e092 | |||
3a9988638b | |||
96ee857752 | |||
887018bb79 | |||
9696f5193b | |||
e13c4f66bb | |||
8a25809573 | |||
d87b193b0b | |||
ea5289e869 | |||
1f6a4f587a | |||
705b2293ec | |||
d2c7ef09ba | |||
27f86f997e | |||
fc93d38076 | |||
a5a85d41ff | |||
08cb2038bd | |||
6f711c1737 | |||
42ec9f577f | |||
9de69cdb1a | |||
bd260569d3 | |||
36cb4b30ef | |||
4e717240bf | |||
e9764238df | |||
26f499b17b | |||
cc7995ac40 | |||
43abba4b4f | |||
58f950c546 | |||
c426e65893 | |||
caea8d611f | |||
7d0754a6d2 | |||
5afa0755ea | |||
40b63186a6 | |||
8f6088c130 | |||
2162e2c15d | |||
0d5ab04a90 | |||
4059285649 | |||
2e079b8bf2 | |||
4ff2c9b832 | |||
a8e2940ff3 | |||
d5d5f2174e | |||
2311238450 | |||
2ea501ffdf | |||
4eb4e94918 | |||
817bcda848 | |||
f6de2c7359 | |||
3f0b9c10ec | |||
2b66abbfab | |||
402c8861d8 | |||
3f683799a8 | |||
573bcd9a92 | |||
90779237ae | |||
1f82f9b7b5 | |||
19b5c3c43e | |||
fe3e65c3ea | |||
fdaab0df4e | |||
b957aa81bd | |||
8ea00f6e49 | |||
4bd789b0fa | |||
2f050cf2ed | |||
e22f4882e7 | |||
c65bc99a41 | |||
355c055e81 | |||
c2009e5309 | |||
23f74c190e | |||
a6f8728339 | |||
c1769a749c | |||
facd9801cf | |||
21302088de | |||
8268c9d161 | |||
b91b7d9ffd | |||
6e1f0c138f | |||
8567c0d29c | |||
d33d8f4e6a | |||
5b1cfa01f1 | |||
05d18b907a | |||
e44fe0c9f5 | |||
4cf0ced950 | |||
98425309b0 | |||
7b1e26699d | |||
676b0fde49 | |||
60f9a6ea8f | |||
1090fd4424 | |||
92c3fd2e22 | |||
e3efaa1972 | |||
0cf2b6441e | |||
d6d3b353be | |||
a67f7d0a07 | |||
c8137518fe | |||
cbef49bf4f | |||
0b99e5aebc | |||
29c55e5fc4 | |||
f386f512d0 | |||
3ddb14889a | |||
00c2327564 | |||
d79926795a | |||
c08fac4d69 | |||
c40440092d | |||
dc2ef2b54f | |||
b28253d650 | |||
f28cfb322a | |||
3bbe291c51 | |||
42d19fdf69 | |||
215968e033 | |||
eddd1a1b9c | |||
d2ce211899 | |||
1cb46c6f65 | |||
5d88c3a1c8 | |||
07fb504943 | |||
f675c5e978 | |||
4e37d9ce67 | |||
e303077132 | |||
6ef9bb59eb | |||
eeaa2c212b | |||
4a3adc3de8 | |||
abdb976340 | |||
3b62116ce6 | |||
e005f953d9 | |||
1c090810f5 | |||
e181d2f6da | |||
16021f6ab7 | |||
ba694720fc | |||
bde8e243cf | |||
3352ee5656 | |||
b29cbc414d | |||
026dc1d11f | |||
9438aca6c9 | |||
547f0c97e4 | |||
177a2de992 | |||
0686b1f4db | |||
0727e56a06 | |||
2fd3d57490 | |||
3f851d1321 | |||
1aef491e24 | |||
d0eccae37d | |||
a34154d900 | |||
c2cc32b4dd | |||
46405fa35d | |||
66af7f51bc | |||
c72ccd4e33 | |||
902b2cc278 | |||
8ecd7c9c21 | |||
7f17f7444a | |||
fb5a066500 | |||
d19c96d507 | |||
929a13b357 | |||
36c65ee0b0 | |||
3378fd9fe5 | |||
58c51cf3d9 | |||
5509b199fb | |||
bb59df9134 | |||
2564b0834f | |||
9321bbd1f5 | |||
4264e52220 | |||
6988b29bdc | |||
98c54240e6 | |||
d30c192589 | |||
67908b47fa | |||
ac7513e368 | |||
fbbcd85839 | |||
7a6b549270 | |||
0196b9bf5b | |||
739a51459a | |||
195d7c90ce | |||
6f3146c08c | |||
4b12879289 | |||
20b3094bcb | |||
df528ee6fa | |||
57e50fb906 | |||
3136792c95 | |||
3d571d5509 | |||
8e6e18b77c | |||
4d16badf6f | |||
a609cf210e | |||
1498659b4e | |||
4482f3fe11 | |||
5d85847f91 | |||
476b4acadc | |||
cf1bd08131 | |||
ec8f042459 | |||
431cc7b185 | |||
e693818afc | |||
3d68536fc2 | |||
26e78a2efb | |||
5444fa940b | |||
d4f2397d4c | |||
fab2413741 | |||
669c137fec | |||
fc6047fcb1 | |||
3014088684 | |||
144006fade | |||
b9cf6ee797 | |||
cdde66d277 | |||
239e49f927 | |||
ae66873ce9 | |||
bda48e04da | |||
ba97479848 | |||
6cad8ce4ce | |||
34020b929e | |||
33070956af | |||
da84cc52f4 | |||
9825748e5e | |||
2179359f40 | |||
9bb161c881 | |||
297e600730 | |||
ed7b3a7de2 | |||
0f358204bd | |||
ca6124d5fa | |||
7eacdc765b | |||
c443f58b09 | |||
ab1092392f | |||
1e3d9b103d | |||
386990ba09 | |||
bc853b028f | |||
d406de299b | |||
dfb31de8f0 | |||
7c3aa258f8 | |||
044055062c | |||
2b388026f8 | |||
707974fdb3 | |||
9069debcd8 | |||
fa2bdc1309 | |||
8e40aa63c1 | |||
d2522b2db6 | |||
ce8e3de401 | |||
7fa2779559 | |||
042afd6e52 | |||
ff30caeaf8 | |||
553cd12ba6 | |||
de1e1a9d95 | |||
91960d6162 | |||
4c24a48eb3 | |||
484e761dab | |||
059b7a252e | |||
1278aeec36 | |||
e53a4c4577 | |||
98ad58fbd2 | |||
98bb3b9016 | |||
eb80aac288 | |||
c26aad405f | |||
f03a0e509e | |||
4c1e8855cc | |||
85a9a5b68c | |||
f856e0774e |
11
.gitignore
vendored
@ -1,5 +1,16 @@
|
|||||||
local.mak
|
local.mak
|
||||||
/target
|
/target
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
|
*~
|
||||||
|
*.backup
|
||||||
|
*.backup[0-9]
|
||||||
|
*.backup[0-9][0-9]
|
||||||
|
*.old
|
||||||
|
*.old[0-9]
|
||||||
|
*.old[0-9][0-9]
|
||||||
|
*.5
|
||||||
|
*.7
|
||||||
|
__pycache__/
|
||||||
/etc/proxmox-backup.service
|
/etc/proxmox-backup.service
|
||||||
/etc/proxmox-backup-proxy.service
|
/etc/proxmox-backup-proxy.service
|
||||||
|
build/
|
||||||
|
61
Cargo.toml
@ -1,11 +1,21 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "proxmox-backup"
|
name = "proxmox-backup"
|
||||||
version = "0.2.3"
|
version = "1.1.14"
|
||||||
authors = ["Dietmar Maurer <dietmar@proxmox.com>"]
|
authors = [
|
||||||
|
"Dietmar Maurer <dietmar@proxmox.com>",
|
||||||
|
"Dominik Csapak <d.csapak@proxmox.com>",
|
||||||
|
"Christian Ebner <c.ebner@proxmox.com>",
|
||||||
|
"Fabian Grünbichler <f.gruenbichler@proxmox.com>",
|
||||||
|
"Stefan Reiter <s.reiter@proxmox.com>",
|
||||||
|
"Thomas Lamprecht <t.lamprecht@proxmox.com>",
|
||||||
|
"Wolfgang Bumiller <w.bumiller@proxmox.com>",
|
||||||
|
"Proxmox Support Team <support@proxmox.com>",
|
||||||
|
]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
license = "AGPL-3"
|
license = "AGPL-3"
|
||||||
description = "Proxmox Backup"
|
description = "Proxmox Backup"
|
||||||
homepage = "https://www.proxmox.com"
|
homepage = "https://www.proxmox.com"
|
||||||
|
build = "build.rs"
|
||||||
|
|
||||||
exclude = [ "build", "debian", "tests/catar_data/test_symlink/symlink1"]
|
exclude = [ "build", "debian", "tests/catar_data/test_symlink/symlink1"]
|
||||||
|
|
||||||
@ -14,48 +24,69 @@ name = "proxmox_backup"
|
|||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
apt-pkg-native = "0.3.2"
|
||||||
base64 = "0.12"
|
base64 = "0.12"
|
||||||
bitflags = "1.2.1"
|
bitflags = "1.2.1"
|
||||||
bytes = "0.5"
|
bytes = "1.0"
|
||||||
chrono = "0.4" # Date and time library for Rust
|
|
||||||
crc32fast = "1"
|
crc32fast = "1"
|
||||||
endian_trait = { version = "0.6", features = ["arrays"] }
|
endian_trait = { version = "0.6", features = ["arrays"] }
|
||||||
|
env_logger = "0.7"
|
||||||
|
flate2 = "1.0"
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
|
foreign-types = "0.3"
|
||||||
|
thiserror = "1.0"
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
h2 = { version = "0.2", features = ["stream"] }
|
h2 = { version = "0.3", features = [ "stream" ] }
|
||||||
handlebars = "3.0"
|
handlebars = "3.0"
|
||||||
http = "0.2"
|
http = "0.2"
|
||||||
hyper = "0.13"
|
hyper = { version = "0.14", features = [ "full" ] }
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
nix = "0.16"
|
nix = "0.19.1"
|
||||||
|
num-traits = "0.2"
|
||||||
once_cell = "1.3.1"
|
once_cell = "1.3.1"
|
||||||
openssl = "0.10"
|
openssl = "0.10"
|
||||||
pam = "0.7"
|
pam = "0.7"
|
||||||
pam-sys = "0.5"
|
pam-sys = "0.5"
|
||||||
percent-encoding = "2.1"
|
percent-encoding = "2.1"
|
||||||
pin-utils = "0.1.0"
|
pin-utils = "0.1.0"
|
||||||
proxmox = { version = "0.1.38", features = [ "sortable-macro", "api-macro" ] }
|
pin-project = "1.0"
|
||||||
#proxmox = { git = "ssh://gitolite3@proxdev.maurer-it.com/rust/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] }
|
|
||||||
#proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro" ] }
|
|
||||||
regex = "1.2"
|
regex = "1.2"
|
||||||
rustyline = "6"
|
rustyline = "7"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
siphasher = "0.3"
|
siphasher = "0.3"
|
||||||
syslog = "4.0"
|
syslog = "4.0"
|
||||||
tokio = { version = "0.2.9", features = [ "blocking", "fs", "io-util", "macros", "rt-threaded", "signal", "stream", "tcp", "time", "uds" ] }
|
tokio = { version = "1.6", features = [ "fs", "io-util", "io-std", "macros", "net", "parking_lot", "process", "rt", "rt-multi-thread", "signal", "time" ] }
|
||||||
tokio-openssl = "0.4.0"
|
tokio-openssl = "0.6.1"
|
||||||
tokio-util = { version = "0.3", features = [ "codec" ] }
|
tokio-stream = "0.1.0"
|
||||||
|
tokio-util = { version = "0.6", features = [ "codec", "io" ] }
|
||||||
tower-service = "0.3.0"
|
tower-service = "0.3.0"
|
||||||
udev = "0.3"
|
udev = ">= 0.3, <0.5"
|
||||||
url = "2.1"
|
url = "2.1"
|
||||||
#valgrind_request = { git = "https://github.com/edef1c/libvalgrind_request", version = "1.1.0", optional = true }
|
#valgrind_request = { git = "https://github.com/edef1c/libvalgrind_request", version = "1.1.0", optional = true }
|
||||||
walkdir = "2"
|
walkdir = "2"
|
||||||
|
webauthn-rs = "0.2.5"
|
||||||
xdg = "2.2"
|
xdg = "2.2"
|
||||||
zstd = { version = "0.4", features = [ "bindgen" ] }
|
zstd = { version = "0.4", features = [ "bindgen" ] }
|
||||||
nom = "5.1"
|
nom = "5.1"
|
||||||
|
crossbeam-channel = "0.5"
|
||||||
|
|
||||||
|
pathpatterns = "0.1.2"
|
||||||
|
pxar = { version = "0.10.1", features = [ "tokio-io" ] }
|
||||||
|
|
||||||
|
proxmox = { version = "0.11.6", features = [ "sortable-macro", "api-macro", "cli", "router", "tfa" ] }
|
||||||
|
proxmox-acme-rs = "0.3"
|
||||||
|
proxmox-fuse = "0.1.1"
|
||||||
|
proxmox-http = { version = "0.2.1", features = [ "client", "http-helpers", "websocket" ] }
|
||||||
|
|
||||||
|
# Local path overrides
|
||||||
|
# NOTE: You must run `cargo update` after changing this for it to take effect!
|
||||||
|
[patch.crates-io]
|
||||||
|
#proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro", "cli", "router", "tfa" ] }
|
||||||
|
#proxmox-http = { path = "../proxmox/proxmox-http", features = [ "client", "http-helpers", "websocket" ] }
|
||||||
|
#pxar = { path = "../pxar", features = [ "tokio-io" ] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
64
Makefile
@ -9,7 +9,11 @@ SUBDIRS := etc www docs
|
|||||||
# Binaries usable by users
|
# Binaries usable by users
|
||||||
USR_BIN := \
|
USR_BIN := \
|
||||||
proxmox-backup-client \
|
proxmox-backup-client \
|
||||||
pxar
|
proxmox-file-restore \
|
||||||
|
pxar \
|
||||||
|
proxmox-tape \
|
||||||
|
pmtx \
|
||||||
|
pmt
|
||||||
|
|
||||||
# Binaries usable by admins
|
# Binaries usable by admins
|
||||||
USR_SBIN := \
|
USR_SBIN := \
|
||||||
@ -19,7 +23,12 @@ USR_SBIN := \
|
|||||||
SERVICE_BIN := \
|
SERVICE_BIN := \
|
||||||
proxmox-backup-api \
|
proxmox-backup-api \
|
||||||
proxmox-backup-banner \
|
proxmox-backup-banner \
|
||||||
proxmox-backup-proxy
|
proxmox-backup-proxy \
|
||||||
|
proxmox-daily-update
|
||||||
|
|
||||||
|
# Single file restore daemon
|
||||||
|
RESTORE_BIN := \
|
||||||
|
proxmox-restore-daemon
|
||||||
|
|
||||||
ifeq ($(BUILD_MODE), release)
|
ifeq ($(BUILD_MODE), release)
|
||||||
CARGO_BUILD_ARGS += --release
|
CARGO_BUILD_ARGS += --release
|
||||||
@ -35,13 +44,20 @@ endif
|
|||||||
CARGO ?= cargo
|
CARGO ?= cargo
|
||||||
|
|
||||||
COMPILED_BINS := \
|
COMPILED_BINS := \
|
||||||
$(addprefix $(COMPILEDIR)/,$(USR_BIN) $(USR_SBIN) $(SERVICE_BIN))
|
$(addprefix $(COMPILEDIR)/,$(USR_BIN) $(USR_SBIN) $(SERVICE_BIN) $(RESTORE_BIN))
|
||||||
|
|
||||||
|
export DEB_VERSION DEB_VERSION_UPSTREAM
|
||||||
|
|
||||||
SERVER_DEB=${PACKAGE}-server_${DEB_VERSION}_${ARCH}.deb
|
SERVER_DEB=${PACKAGE}-server_${DEB_VERSION}_${ARCH}.deb
|
||||||
|
SERVER_DBG_DEB=${PACKAGE}-server-dbgsym_${DEB_VERSION}_${ARCH}.deb
|
||||||
CLIENT_DEB=${PACKAGE}-client_${DEB_VERSION}_${ARCH}.deb
|
CLIENT_DEB=${PACKAGE}-client_${DEB_VERSION}_${ARCH}.deb
|
||||||
|
CLIENT_DBG_DEB=${PACKAGE}-client-dbgsym_${DEB_VERSION}_${ARCH}.deb
|
||||||
|
RESTORE_DEB=proxmox-backup-file-restore_${DEB_VERSION}_${ARCH}.deb
|
||||||
|
RESTORE_DBG_DEB=proxmox-backup-file-restore-dbgsym_${DEB_VERSION}_${ARCH}.deb
|
||||||
DOC_DEB=${PACKAGE}-docs_${DEB_VERSION}_all.deb
|
DOC_DEB=${PACKAGE}-docs_${DEB_VERSION}_all.deb
|
||||||
|
|
||||||
DEBS=${SERVER_DEB} ${CLIENT_DEB}
|
DEBS=${SERVER_DEB} ${SERVER_DBG_DEB} ${CLIENT_DEB} ${CLIENT_DBG_DEB} \
|
||||||
|
${RESTORE_DEB} ${RESTORE_DBG_DEB}
|
||||||
|
|
||||||
DSC = rust-${PACKAGE}_${DEB_VERSION}.dsc
|
DSC = rust-${PACKAGE}_${DEB_VERSION}.dsc
|
||||||
|
|
||||||
@ -65,10 +81,18 @@ doc:
|
|||||||
.PHONY: build
|
.PHONY: build
|
||||||
build:
|
build:
|
||||||
rm -rf build
|
rm -rf build
|
||||||
debcargo package --config debian/debcargo.toml --changelog-ready --no-overlay-write-back --directory build proxmox-backup $(shell dpkg-parsechangelog -l debian/changelog -SVersion | sed -e 's/-.*//')
|
rm -f debian/control
|
||||||
|
debcargo package \
|
||||||
|
--config debian/debcargo.toml \
|
||||||
|
--changelog-ready \
|
||||||
|
--no-overlay-write-back \
|
||||||
|
--directory build \
|
||||||
|
proxmox-backup \
|
||||||
|
$(shell dpkg-parsechangelog -l debian/changelog -SVersion | sed -e 's/-.*//')
|
||||||
sed -e '1,/^$$/ ! d' build/debian/control > build/debian/control.src
|
sed -e '1,/^$$/ ! d' build/debian/control > build/debian/control.src
|
||||||
cat build/debian/control.src build/debian/control.in > build/debian/control
|
cat build/debian/control.src build/debian/control.in > build/debian/control
|
||||||
rm build/debian/control.in build/debian/control.src
|
rm build/debian/control.in build/debian/control.src
|
||||||
|
cp build/debian/control debian/control
|
||||||
rm build/Cargo.lock
|
rm build/Cargo.lock
|
||||||
find build/debian -name "*.hint" -delete
|
find build/debian -name "*.hint" -delete
|
||||||
$(foreach i,$(SUBDIRS), \
|
$(foreach i,$(SUBDIRS), \
|
||||||
@ -76,18 +100,23 @@ build:
|
|||||||
|
|
||||||
|
|
||||||
.PHONY: proxmox-backup-docs
|
.PHONY: proxmox-backup-docs
|
||||||
proxmox-backup-docs: $(DOC_DEB)
|
$(DOC_DEB) $(DEBS): proxmox-backup-docs
|
||||||
$(DOC_DEB): build
|
proxmox-backup-docs: build
|
||||||
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean
|
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean
|
||||||
lintian $(DOC_DEB)
|
lintian $(DOC_DEB)
|
||||||
|
|
||||||
# copy the local target/ dir as a build-cache
|
# copy the local target/ dir as a build-cache
|
||||||
.PHONY: deb
|
.PHONY: deb
|
||||||
deb: $(DEBS)
|
$(DEBS): deb
|
||||||
$(DEBS): build
|
deb: build
|
||||||
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean --build-profiles=nodoc
|
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean --build-profiles=nodoc
|
||||||
lintian $(DEBS)
|
lintian $(DEBS)
|
||||||
|
|
||||||
|
.PHONY: deb-all
|
||||||
|
deb-all: build
|
||||||
|
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean
|
||||||
|
lintian $(DEBS) $(DOC_DEB)
|
||||||
|
|
||||||
.PHONY: dsc
|
.PHONY: dsc
|
||||||
dsc: $(DSC)
|
dsc: $(DSC)
|
||||||
$(DSC): build
|
$(DSC): build
|
||||||
@ -104,8 +133,8 @@ clean:
|
|||||||
find . -name '*~' -exec rm {} ';'
|
find . -name '*~' -exec rm {} ';'
|
||||||
|
|
||||||
.PHONY: dinstall
|
.PHONY: dinstall
|
||||||
dinstall: ${DEBS}
|
dinstall: ${SERVER_DEB} ${SERVER_DBG_DEB} ${CLIENT_DEB} ${CLIENT_DBG_DEB}
|
||||||
dpkg -i ${DEBS}
|
dpkg -i $^
|
||||||
|
|
||||||
# make sure we build binaries before docs
|
# make sure we build binaries before docs
|
||||||
docs: cargo-build
|
docs: cargo-build
|
||||||
@ -131,14 +160,21 @@ install: $(COMPILED_BINS)
|
|||||||
install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(SBINDIR)/ ; \
|
install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(SBINDIR)/ ; \
|
||||||
install -m644 zsh-completions/_$(i) $(DESTDIR)$(ZSH_COMPL_DEST)/ ;)
|
install -m644 zsh-completions/_$(i) $(DESTDIR)$(ZSH_COMPL_DEST)/ ;)
|
||||||
install -dm755 $(DESTDIR)$(LIBEXECDIR)/proxmox-backup
|
install -dm755 $(DESTDIR)$(LIBEXECDIR)/proxmox-backup
|
||||||
|
install -dm755 $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/file-restore
|
||||||
|
$(foreach i,$(RESTORE_BIN), \
|
||||||
|
install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/file-restore/ ;)
|
||||||
|
# install sg-tape-cmd as setuid binary
|
||||||
|
install -m4755 -o root -g root $(COMPILEDIR)/sg-tape-cmd $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/sg-tape-cmd
|
||||||
$(foreach i,$(SERVICE_BIN), \
|
$(foreach i,$(SERVICE_BIN), \
|
||||||
install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/ ;)
|
install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/ ;)
|
||||||
$(MAKE) -C www install
|
$(MAKE) -C www install
|
||||||
$(MAKE) -C docs install
|
$(MAKE) -C docs install
|
||||||
|
|
||||||
.PHONY: upload
|
.PHONY: upload
|
||||||
upload: ${SERVER_DEB} ${CLIENT_DEB} ${DOC_DEB}
|
upload: ${SERVER_DEB} ${CLIENT_DEB} ${RESTORE_DEB} ${DOC_DEB}
|
||||||
# check if working directory is clean
|
# check if working directory is clean
|
||||||
git diff --exit-code --stat && git diff --exit-code --stat --staged
|
git diff --exit-code --stat && git diff --exit-code --stat --staged
|
||||||
tar cf - ${SERVER_DEB} ${DOC_DEB} | ssh -X repoman@repo.proxmox.com upload --product pbs --dist buster
|
tar cf - ${SERVER_DEB} ${SERVER_DBG_DEB} ${DOC_DEB} ${CLIENT_DEB} ${CLIENT_DBG_DEB} | \
|
||||||
tar cf - ${CLIENT_DEB} | ssh -X repoman@repo.proxmox.com upload --product "pbs,pve" --dist buster
|
ssh -X repoman@repo.proxmox.com upload --product pbs --dist buster
|
||||||
|
tar cf - ${CLIENT_DEB} ${CLIENT_DBG_DEB} | ssh -X repoman@repo.proxmox.com upload --product "pve,pmg,pbs-client" --dist buster
|
||||||
|
tar cf - ${RESTORE_DEB} ${RESTORE_DBG_DEB} | ssh -X repoman@repo.proxmox.com upload --product "pve" --dist buster
|
||||||
|
100
README.rst
@ -13,7 +13,7 @@ Versioning of proxmox helper crates
|
|||||||
|
|
||||||
To use current git master code of the proxmox* helper crates, add::
|
To use current git master code of the proxmox* helper crates, add::
|
||||||
|
|
||||||
git = "ssh://gitolite3@proxdev.maurer-it.com/rust/proxmox"
|
git = "git://git.proxmox.com/git/proxmox"
|
||||||
|
|
||||||
or::
|
or::
|
||||||
|
|
||||||
@ -22,6 +22,7 @@ or::
|
|||||||
to the proxmox dependency, and update the version to reflect the current,
|
to the proxmox dependency, and update the version to reflect the current,
|
||||||
pre-release version number (e.g., "0.1.1-dev.1" instead of "0.1.0").
|
pre-release version number (e.g., "0.1.1-dev.1" instead of "0.1.0").
|
||||||
|
|
||||||
|
|
||||||
Local cargo config
|
Local cargo config
|
||||||
==================
|
==================
|
||||||
|
|
||||||
@ -35,3 +36,100 @@ checksums are not compatible.
|
|||||||
To reference new dependencies (or updated versions) that are not yet packaged,
|
To reference new dependencies (or updated versions) that are not yet packaged,
|
||||||
the dependency needs to point directly to a path or git source (e.g., see
|
the dependency needs to point directly to a path or git source (e.g., see
|
||||||
example for proxmox crate above).
|
example for proxmox crate above).
|
||||||
|
|
||||||
|
|
||||||
|
Build
|
||||||
|
=====
|
||||||
|
on Debian Buster
|
||||||
|
|
||||||
|
Setup:
|
||||||
|
1. # echo 'deb http://download.proxmox.com/debian/devel/ buster main' >> /etc/apt/sources.list.d/proxmox-devel.list
|
||||||
|
2. # sudo wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
|
||||||
|
3. # sudo apt update
|
||||||
|
4. # sudo apt install devscripts debcargo clang
|
||||||
|
5. # git clone git://git.proxmox.com/git/proxmox-backup.git
|
||||||
|
6. # sudo mk-build-deps -ir
|
||||||
|
|
||||||
|
Note: 2. may be skipped if you already added the PVE or PBS package repository
|
||||||
|
|
||||||
|
You are now able to build using the Makefile or cargo itself.
|
||||||
|
|
||||||
|
|
||||||
|
Design Notes
|
||||||
|
============
|
||||||
|
|
||||||
|
Here are some random thought about the software design (unless I find a better place).
|
||||||
|
|
||||||
|
|
||||||
|
Large chunk sizes
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
It is important to notice that large chunk sizes are crucial for
|
||||||
|
performance. We have a multi-user system, where different people can do
|
||||||
|
different operations on a datastore at the same time, and most operation
|
||||||
|
involves reading a series of chunks.
|
||||||
|
|
||||||
|
So what is the maximal theoretical speed we can get when reading a
|
||||||
|
series of chunks? Reading a chunk sequence need the following steps:
|
||||||
|
|
||||||
|
- seek to the first chunk start location
|
||||||
|
- read the chunk data
|
||||||
|
- seek to the first chunk start location
|
||||||
|
- read the chunk data
|
||||||
|
- ...
|
||||||
|
|
||||||
|
Lets use the following disk performance metrics:
|
||||||
|
|
||||||
|
:AST: Average Seek Time (second)
|
||||||
|
:MRS: Maximum sequential Read Speed (bytes/second)
|
||||||
|
:ACS: Average Chunk Size (bytes)
|
||||||
|
|
||||||
|
The maximum performance you can get is::
|
||||||
|
|
||||||
|
MAX(ACS) = ACS /(AST + ACS/MRS)
|
||||||
|
|
||||||
|
Please note that chunk data is likely to be sequential arranged on disk, but
|
||||||
|
this it is sort of a best case assumption.
|
||||||
|
|
||||||
|
For a typical rotational disk, we assume the following values::
|
||||||
|
|
||||||
|
AST: 10ms
|
||||||
|
MRS: 170MB/s
|
||||||
|
|
||||||
|
MAX(4MB) = 115.37 MB/s
|
||||||
|
MAX(1MB) = 61.85 MB/s;
|
||||||
|
MAX(64KB) = 6.02 MB/s;
|
||||||
|
MAX(4KB) = 0.39 MB/s;
|
||||||
|
MAX(1KB) = 0.10 MB/s;
|
||||||
|
|
||||||
|
Modern SSD are much faster, lets assume the following::
|
||||||
|
|
||||||
|
max IOPS: 20000 => AST = 0.00005
|
||||||
|
MRS: 500Mb/s
|
||||||
|
|
||||||
|
MAX(4MB) = 474 MB/s
|
||||||
|
MAX(1MB) = 465 MB/s;
|
||||||
|
MAX(64KB) = 354 MB/s;
|
||||||
|
MAX(4KB) = 67 MB/s;
|
||||||
|
MAX(1KB) = 18 MB/s;
|
||||||
|
|
||||||
|
|
||||||
|
Also, the average chunk directly relates to the number of chunks produced by
|
||||||
|
a backup::
|
||||||
|
|
||||||
|
CHUNK_COUNT = BACKUP_SIZE / ACS
|
||||||
|
|
||||||
|
Here are some staticics from my developer worstation::
|
||||||
|
|
||||||
|
Disk Usage: 65 GB
|
||||||
|
Directories: 58971
|
||||||
|
Files: 726314
|
||||||
|
Files < 64KB: 617541
|
||||||
|
|
||||||
|
As you see, there are really many small files. If we would do file
|
||||||
|
level deduplication, i.e. generate one chunk per file, we end up with
|
||||||
|
more than 700000 chunks.
|
||||||
|
|
||||||
|
Instead, our current algorithm only produce large chunks with an
|
||||||
|
average chunks size of 4MB. With above data, this produce about 15000
|
||||||
|
chunks (factor 50 less chunks).
|
||||||
|
3
TODO.rst
@ -30,10 +30,9 @@ Chores:
|
|||||||
|
|
||||||
* move tools/xattr.rs and tools/acl.rs to proxmox/sys/linux/
|
* move tools/xattr.rs and tools/acl.rs to proxmox/sys/linux/
|
||||||
|
|
||||||
* recompute PXAR_ header types from strings: avoid using numbers from casync
|
|
||||||
|
|
||||||
* remove pbs-* systemd timers and services on package purge
|
* remove pbs-* systemd timers and services on package purge
|
||||||
|
|
||||||
|
|
||||||
Suggestions
|
Suggestions
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|
23
build.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// build.rs
|
||||||
|
use std::env;
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
fn git_command(args: &[&str]) -> String {
|
||||||
|
match Command::new("git").args(args).output() {
|
||||||
|
Ok(output) => String::from_utf8(output.stdout).unwrap().trim_end().to_string(),
|
||||||
|
Err(err) => {
|
||||||
|
panic!("git {:?} failed: {}", args, err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let repo_path = git_command(&["rev-parse", "--show-toplevel"]);
|
||||||
|
let repoid = match env::var("REPOID") {
|
||||||
|
Ok(repoid) => repoid,
|
||||||
|
Err(_) => git_command(&["rev-parse", "HEAD"]),
|
||||||
|
};
|
||||||
|
|
||||||
|
println!("cargo:rustc-env=REPOID={}", repoid);
|
||||||
|
println!("cargo:rerun-if-changed={}/.git/HEAD", repo_path);
|
||||||
|
}
|
1398
debian/changelog
vendored
171
debian/control
vendored
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
Source: rust-proxmox-backup
|
||||||
|
Section: admin
|
||||||
|
Priority: optional
|
||||||
|
Build-Depends: debhelper (>= 11),
|
||||||
|
dh-cargo (>= 18),
|
||||||
|
cargo:native,
|
||||||
|
rustc:native,
|
||||||
|
libstd-rust-dev,
|
||||||
|
librust-anyhow-1+default-dev,
|
||||||
|
librust-apt-pkg-native-0.3+default-dev (>= 0.3.2-~~),
|
||||||
|
librust-base64-0.12+default-dev,
|
||||||
|
librust-bitflags-1+default-dev (>= 1.2.1-~~),
|
||||||
|
librust-bytes-1+default-dev,
|
||||||
|
librust-crc32fast-1+default-dev,
|
||||||
|
librust-crossbeam-channel-0.5+default-dev,
|
||||||
|
librust-endian-trait-0.6+arrays-dev,
|
||||||
|
librust-endian-trait-0.6+default-dev,
|
||||||
|
librust-env-logger-0.7+default-dev,
|
||||||
|
librust-flate2-1+default-dev,
|
||||||
|
librust-foreign-types-0.3+default-dev,
|
||||||
|
librust-futures-0.3+default-dev,
|
||||||
|
librust-h2-0.3+default-dev,
|
||||||
|
librust-h2-0.3+stream-dev,
|
||||||
|
librust-handlebars-3+default-dev,
|
||||||
|
librust-http-0.2+default-dev,
|
||||||
|
librust-hyper-0.14+default-dev,
|
||||||
|
librust-hyper-0.14+full-dev,
|
||||||
|
librust-lazy-static-1+default-dev (>= 1.4-~~),
|
||||||
|
librust-libc-0.2+default-dev,
|
||||||
|
librust-log-0.4+default-dev,
|
||||||
|
librust-nix-0.19+default-dev (>= 0.19.1-~~),
|
||||||
|
librust-nom-5+default-dev (>= 5.1-~~),
|
||||||
|
librust-num-traits-0.2+default-dev,
|
||||||
|
librust-once-cell-1+default-dev (>= 1.3.1-~~),
|
||||||
|
librust-openssl-0.10+default-dev,
|
||||||
|
librust-pam-0.7+default-dev,
|
||||||
|
librust-pam-sys-0.5+default-dev,
|
||||||
|
librust-pathpatterns-0.1+default-dev (>= 0.1.2-~~),
|
||||||
|
librust-percent-encoding-2+default-dev (>= 2.1-~~),
|
||||||
|
librust-pin-project-1+default-dev,
|
||||||
|
librust-pin-utils-0.1+default-dev,
|
||||||
|
librust-proxmox-0.11+api-macro-dev (>= 0.11.6-~~),
|
||||||
|
librust-proxmox-0.11+cli-dev (>= 0.11.6-~~),
|
||||||
|
librust-proxmox-0.11+default-dev (>= 0.11.6-~~),
|
||||||
|
librust-proxmox-0.11+router-dev (>= 0.11.6-~~),
|
||||||
|
librust-proxmox-0.11+sortable-macro-dev (>= 0.11.6-~~),
|
||||||
|
librust-proxmox-0.11+tfa-dev (>= 0.11.6-~~),
|
||||||
|
librust-proxmox-acme-rs-0.3+default-dev,
|
||||||
|
librust-proxmox-fuse-0.1+default-dev (>= 0.1.1-~~),
|
||||||
|
librust-proxmox-http-0.2+client-dev (>= 0.2.1-~~),
|
||||||
|
librust-proxmox-http-0.2+default-dev (>= 0.2.1-~~),
|
||||||
|
librust-proxmox-http-0.2+http-helpers-dev (>= 0.2.1-~~),
|
||||||
|
librust-proxmox-http-0.2+websocket-dev (>= 0.2.1-~~),
|
||||||
|
librust-pxar-0.10+default-dev (>= 0.10.1-~~),
|
||||||
|
librust-pxar-0.10+tokio-io-dev (>= 0.10.1-~~),
|
||||||
|
librust-regex-1+default-dev (>= 1.2-~~),
|
||||||
|
librust-rustyline-7+default-dev,
|
||||||
|
librust-serde-1+default-dev,
|
||||||
|
librust-serde-1+derive-dev,
|
||||||
|
librust-serde-json-1+default-dev,
|
||||||
|
librust-siphasher-0.3+default-dev,
|
||||||
|
librust-syslog-4+default-dev,
|
||||||
|
librust-thiserror-1+default-dev,
|
||||||
|
librust-tokio-1+default-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+fs-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+io-std-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+io-util-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+macros-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+net-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+parking-lot-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+process-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+rt-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+rt-multi-thread-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+signal-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-1+time-dev (>= 1.6-~~),
|
||||||
|
librust-tokio-openssl-0.6+default-dev (>= 0.6.1-~~),
|
||||||
|
librust-tokio-stream-0.1+default-dev,
|
||||||
|
librust-tokio-util-0.6+codec-dev,
|
||||||
|
librust-tokio-util-0.6+default-dev,
|
||||||
|
librust-tokio-util-0.6+io-dev,
|
||||||
|
librust-tower-service-0.3+default-dev,
|
||||||
|
librust-udev-0.4+default-dev | librust-udev-0.3+default-dev,
|
||||||
|
librust-url-2+default-dev (>= 2.1-~~),
|
||||||
|
librust-walkdir-2+default-dev,
|
||||||
|
librust-webauthn-rs-0.2+default-dev (>= 0.2.5-~~),
|
||||||
|
librust-xdg-2+default-dev (>= 2.2-~~),
|
||||||
|
librust-zstd-0.4+bindgen-dev,
|
||||||
|
librust-zstd-0.4+default-dev,
|
||||||
|
libacl1-dev,
|
||||||
|
libfuse3-dev,
|
||||||
|
libsystemd-dev,
|
||||||
|
uuid-dev,
|
||||||
|
libsgutils2-dev,
|
||||||
|
bash-completion,
|
||||||
|
debhelper (>= 12~),
|
||||||
|
fonts-dejavu-core <!nodoc>,
|
||||||
|
fonts-lato <!nodoc>,
|
||||||
|
fonts-open-sans <!nodoc>,
|
||||||
|
graphviz <!nodoc>,
|
||||||
|
latexmk <!nodoc>,
|
||||||
|
patchelf,
|
||||||
|
pve-eslint (>= 7.18.0-1),
|
||||||
|
python3-docutils,
|
||||||
|
python3-pygments,
|
||||||
|
python3-sphinx <!nodoc>,
|
||||||
|
rsync,
|
||||||
|
texlive-fonts-extra <!nodoc>,
|
||||||
|
texlive-fonts-recommended <!nodoc>,
|
||||||
|
texlive-xetex <!nodoc>,
|
||||||
|
xindy <!nodoc>
|
||||||
|
Maintainer: Proxmox Support Team <support@proxmox.com>
|
||||||
|
Standards-Version: 4.4.1
|
||||||
|
Vcs-Git: git://git.proxmox.com/git/proxmox-backup.git
|
||||||
|
Vcs-Browser: https://git.proxmox.com/?p=proxmox-backup.git;a=summary
|
||||||
|
Homepage: https://www.proxmox.com
|
||||||
|
|
||||||
|
Package: proxmox-backup-server
|
||||||
|
Architecture: any
|
||||||
|
Depends: fonts-font-awesome,
|
||||||
|
libjs-extjs (>= 6.0.1),
|
||||||
|
libjs-qrcodejs (>= 1.20201119),
|
||||||
|
libproxmox-acme-plugins,
|
||||||
|
libsgutils2-2,
|
||||||
|
libzstd1 (>= 1.3.8),
|
||||||
|
lvm2,
|
||||||
|
openssh-server,
|
||||||
|
pbs-i18n,
|
||||||
|
postfix | mail-transport-agent,
|
||||||
|
proxmox-backup-docs,
|
||||||
|
proxmox-mini-journalreader,
|
||||||
|
proxmox-widget-toolkit (>= 2.6-2),
|
||||||
|
pve-xtermjs (>= 4.7.0-1),
|
||||||
|
sg3-utils,
|
||||||
|
smartmontools,
|
||||||
|
${misc:Depends},
|
||||||
|
${shlibs:Depends},
|
||||||
|
Recommends: zfsutils-linux,
|
||||||
|
ifupdown2,
|
||||||
|
Description: Proxmox Backup Server daemon with tools and GUI
|
||||||
|
This package contains the Proxmox Backup Server daemons and related
|
||||||
|
tools. This includes a web-based graphical user interface.
|
||||||
|
|
||||||
|
Package: proxmox-backup-client
|
||||||
|
Architecture: any
|
||||||
|
Depends: qrencode,
|
||||||
|
${misc:Depends},
|
||||||
|
${shlibs:Depends},
|
||||||
|
Description: Proxmox Backup Client tools
|
||||||
|
This package contains the Proxmox Backup client, which provides a
|
||||||
|
simple command line tool to create and restore backups.
|
||||||
|
|
||||||
|
Package: proxmox-backup-docs
|
||||||
|
Build-Profiles: <!nodoc>
|
||||||
|
Section: doc
|
||||||
|
Depends: libjs-extjs,
|
||||||
|
libjs-mathjax,
|
||||||
|
${misc:Depends},
|
||||||
|
Architecture: all
|
||||||
|
Description: Proxmox Backup Documentation
|
||||||
|
This package contains the Proxmox Backup Documentation files.
|
||||||
|
|
||||||
|
Package: proxmox-backup-file-restore
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${misc:Depends},
|
||||||
|
${shlibs:Depends},
|
||||||
|
Recommends: pve-qemu-kvm (>= 5.0.0-9),
|
||||||
|
proxmox-backup-restore-image,
|
||||||
|
Description: Proxmox Backup single file restore tools for pxar and block device backups
|
||||||
|
This package contains the Proxmox Backup single file restore client for
|
||||||
|
restoring individual files and folders from both host/container and VM/block
|
||||||
|
device backups. It includes a block device restore driver using QEMU.
|
30
debian/control.in
vendored
@ -2,19 +2,33 @@ Package: proxmox-backup-server
|
|||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: fonts-font-awesome,
|
Depends: fonts-font-awesome,
|
||||||
libjs-extjs (>= 6.0.1),
|
libjs-extjs (>= 6.0.1),
|
||||||
|
libjs-qrcodejs (>= 1.20201119),
|
||||||
|
libproxmox-acme-plugins,
|
||||||
|
libsgutils2-2,
|
||||||
libzstd1 (>= 1.3.8),
|
libzstd1 (>= 1.3.8),
|
||||||
|
lvm2,
|
||||||
|
openssh-server,
|
||||||
|
pbs-i18n,
|
||||||
|
postfix | mail-transport-agent,
|
||||||
proxmox-backup-docs,
|
proxmox-backup-docs,
|
||||||
proxmox-mini-journalreader,
|
proxmox-mini-journalreader,
|
||||||
proxmox-widget-toolkit (>= 2.2-4),
|
proxmox-widget-toolkit (>= 2.6-2),
|
||||||
|
pve-xtermjs (>= 4.7.0-1),
|
||||||
|
sg3-utils,
|
||||||
|
smartmontools,
|
||||||
${misc:Depends},
|
${misc:Depends},
|
||||||
${shlibs:Depends},
|
${shlibs:Depends},
|
||||||
|
Recommends: zfsutils-linux,
|
||||||
|
ifupdown2,
|
||||||
Description: Proxmox Backup Server daemon with tools and GUI
|
Description: Proxmox Backup Server daemon with tools and GUI
|
||||||
This package contains the Proxmox Backup Server daemons and related
|
This package contains the Proxmox Backup Server daemons and related
|
||||||
tools. This includes a web-based graphical user interface.
|
tools. This includes a web-based graphical user interface.
|
||||||
|
|
||||||
Package: proxmox-backup-client
|
Package: proxmox-backup-client
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
Depends: qrencode,
|
||||||
|
${misc:Depends},
|
||||||
|
${shlibs:Depends},
|
||||||
Description: Proxmox Backup Client tools
|
Description: Proxmox Backup Client tools
|
||||||
This package contains the Proxmox Backup client, which provides a
|
This package contains the Proxmox Backup client, which provides a
|
||||||
simple command line tool to create and restore backups.
|
simple command line tool to create and restore backups.
|
||||||
@ -23,7 +37,19 @@ Package: proxmox-backup-docs
|
|||||||
Build-Profiles: <!nodoc>
|
Build-Profiles: <!nodoc>
|
||||||
Section: doc
|
Section: doc
|
||||||
Depends: libjs-extjs,
|
Depends: libjs-extjs,
|
||||||
|
libjs-mathjax,
|
||||||
${misc:Depends},
|
${misc:Depends},
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Description: Proxmox Backup Documentation
|
Description: Proxmox Backup Documentation
|
||||||
This package contains the Proxmox Backup Documentation files.
|
This package contains the Proxmox Backup Documentation files.
|
||||||
|
|
||||||
|
Package: proxmox-backup-file-restore
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${misc:Depends},
|
||||||
|
${shlibs:Depends},
|
||||||
|
Recommends: pve-qemu-kvm (>= 5.0.0-9),
|
||||||
|
proxmox-backup-restore-image,
|
||||||
|
Description: Proxmox Backup single file restore tools for pxar and block device backups
|
||||||
|
This package contains the Proxmox Backup single file restore client for
|
||||||
|
restoring individual files and folders from both host/container and VM/block
|
||||||
|
device backups. It includes a block device restore driver using QEMU.
|
||||||
|
2
debian/copyright
vendored
@ -1,4 +1,4 @@
|
|||||||
Copyright (C) 2019 Proxmox Server Solutions GmbH
|
Copyright (C) 2019 - 2021 Proxmox Server Solutions GmbH
|
||||||
|
|
||||||
This software is written by Proxmox Server Solutions GmbH <support@proxmox.com>
|
This software is written by Proxmox Server Solutions GmbH <support@proxmox.com>
|
||||||
|
|
||||||
|
21
debian/debcargo.toml
vendored
@ -2,32 +2,32 @@ overlay = "."
|
|||||||
crate_src_path = ".."
|
crate_src_path = ".."
|
||||||
whitelist = ["tests/*.c"]
|
whitelist = ["tests/*.c"]
|
||||||
|
|
||||||
# needed for pinutils alpha
|
maintainer = "Proxmox Support Team <support@proxmox.com>"
|
||||||
allow_prerelease_deps = true
|
|
||||||
|
|
||||||
[source]
|
[source]
|
||||||
# TODO: update once public
|
vcs_git = "git://git.proxmox.com/git/proxmox-backup.git"
|
||||||
vcs_git = ""
|
vcs_browser = "https://git.proxmox.com/?p=proxmox-backup.git;a=summary"
|
||||||
vcs_browser = ""
|
|
||||||
maintainer = "Proxmox Support Team <support@proxmox.com>"
|
|
||||||
section = "admin"
|
section = "admin"
|
||||||
build_depends = [
|
build_depends = [
|
||||||
"debhelper (>= 12~)",
|
|
||||||
"bash-completion",
|
"bash-completion",
|
||||||
"python3-docutils",
|
"debhelper (>= 12~)",
|
||||||
"python3-pygments",
|
|
||||||
"rsync",
|
|
||||||
"fonts-dejavu-core <!nodoc>",
|
"fonts-dejavu-core <!nodoc>",
|
||||||
"fonts-lato <!nodoc>",
|
"fonts-lato <!nodoc>",
|
||||||
"fonts-open-sans <!nodoc>",
|
"fonts-open-sans <!nodoc>",
|
||||||
"graphviz <!nodoc>",
|
"graphviz <!nodoc>",
|
||||||
"latexmk <!nodoc>",
|
"latexmk <!nodoc>",
|
||||||
|
"patchelf",
|
||||||
|
"pve-eslint (>= 7.18.0-1)",
|
||||||
|
"python3-docutils",
|
||||||
|
"python3-pygments",
|
||||||
"python3-sphinx <!nodoc>",
|
"python3-sphinx <!nodoc>",
|
||||||
|
"rsync",
|
||||||
"texlive-fonts-extra <!nodoc>",
|
"texlive-fonts-extra <!nodoc>",
|
||||||
"texlive-fonts-recommended <!nodoc>",
|
"texlive-fonts-recommended <!nodoc>",
|
||||||
"texlive-xetex <!nodoc>",
|
"texlive-xetex <!nodoc>",
|
||||||
"xindy <!nodoc>",
|
"xindy <!nodoc>",
|
||||||
]
|
]
|
||||||
|
|
||||||
build_depends_excludes = [
|
build_depends_excludes = [
|
||||||
"debhelper (>=11)",
|
"debhelper (>=11)",
|
||||||
]
|
]
|
||||||
@ -38,4 +38,5 @@ depends = [
|
|||||||
"libfuse3-dev",
|
"libfuse3-dev",
|
||||||
"libsystemd-dev",
|
"libsystemd-dev",
|
||||||
"uuid-dev",
|
"uuid-dev",
|
||||||
|
"libsgutils2-dev",
|
||||||
]
|
]
|
||||||
|
2
debian/lintian-overrides
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
proxmox-backup-server: package-installs-apt-sources etc/apt/sources.list.d/pbs-enterprise.list
|
||||||
|
proxmox-backup-server: systemd-service-file-refers-to-unusual-wantedby-target lib/systemd/system/proxmox-backup-banner.service getty.target
|
3
debian/pmt.bc
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# pmt bash completion
|
||||||
|
|
||||||
|
complete -C 'pmt bashcomplete' pmt
|
3
debian/pmtx.bc
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# pmtx bash completion
|
||||||
|
|
||||||
|
complete -C 'pmtx bashcomplete' pmtx
|
83
debian/postinst
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
configure)
|
||||||
|
# need to have user backup in the tape group
|
||||||
|
usermod -a -G tape backup
|
||||||
|
|
||||||
|
# modeled after dh_systemd_start output
|
||||||
|
systemctl --system daemon-reload >/dev/null || true
|
||||||
|
if [ -n "$2" ]; then
|
||||||
|
if dpkg --compare-versions "$2" 'lt' '1.0.7-1'; then
|
||||||
|
# there was an issue with reloading and systemd being confused in older daemon versions
|
||||||
|
# so restart instead of reload if upgrading from there, see commit 0ec79339f7aebf9
|
||||||
|
# FIXME: remove with PBS 2.1
|
||||||
|
echo "Upgrading from older proxmox-backup-server: restart (not reload) daemons"
|
||||||
|
_dh_action=try-restart
|
||||||
|
else
|
||||||
|
_dh_action=try-reload-or-restart
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
_dh_action=start
|
||||||
|
fi
|
||||||
|
deb-systemd-invoke $_dh_action proxmox-backup.service proxmox-backup-proxy.service >/dev/null || true
|
||||||
|
|
||||||
|
# FIXME: Remove with 1.1
|
||||||
|
if test -n "$2"; then
|
||||||
|
if dpkg --compare-versions "$2" 'lt' '0.9.4-1'; then
|
||||||
|
if grep -s -q -P -e '^\s+verify-schedule ' /etc/proxmox-backup/datastore.cfg; then
|
||||||
|
echo "NOTE: drop all verify schedules from datastore config."
|
||||||
|
echo "You can now add more flexible verify jobs"
|
||||||
|
flock -w 30 /etc/proxmox-backup/.datastore.lck \
|
||||||
|
sed -i '/^\s\+verify-schedule /d' /etc/proxmox-backup/datastore.cfg || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if dpkg --compare-versions "$2" 'le' '0.9.5-1'; then
|
||||||
|
chown --quiet backup:backup /var/log/proxmox-backup/api/auth.log || true
|
||||||
|
fi
|
||||||
|
if dpkg --compare-versions "$2" 'le' '0.9.7-1'; then
|
||||||
|
if [ -e /etc/proxmox-backup/remote.cfg ]; then
|
||||||
|
echo "NOTE: Switching over remote.cfg to new field names.."
|
||||||
|
flock -w 30 /etc/proxmox-backup/.remote.lck \
|
||||||
|
sed -i \
|
||||||
|
-e 's/^\s\+userid /\tauth-id /g' \
|
||||||
|
/etc/proxmox-backup/remote.cfg || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if dpkg --compare-versions "$2" 'le' '1.0.14-1'; then
|
||||||
|
# FIXME: Remove with 2.0
|
||||||
|
if grep -s -q -P -e '^linux:' /etc/proxmox-backup/tape.cfg; then
|
||||||
|
echo "========="
|
||||||
|
echo "= NOTE: You have now unsupported 'linux' tape drives configured."
|
||||||
|
echo "= * Execute 'udevadm control --reload-rules && udevadm trigger' to update /dev"
|
||||||
|
echo "= * Edit '/etc/proxmox-backup/tape.cfg', remove 'linux' entries and re-add over CLI/GUI"
|
||||||
|
echo "========="
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
# FIXME: remove with 2.0
|
||||||
|
if [ -d "/var/lib/proxmox-backup/tape" ] &&
|
||||||
|
[ "$(stat --printf '%a' '/var/lib/proxmox-backup/tape')" != "750" ]; then
|
||||||
|
chmod 0750 /var/lib/proxmox-backup/tape || true
|
||||||
|
fi
|
||||||
|
# FIXME: Remove in future version once we're sure no broken entries remain in anyone's files
|
||||||
|
if grep -q -e ':termproxy::[^@]\+: ' /var/log/proxmox-backup/tasks/active; then
|
||||||
|
echo "Fixing up termproxy user id in task log..."
|
||||||
|
flock -w 30 /var/log/proxmox-backup/tasks/active.lock sed -i 's/:termproxy::\([^@]\+\): /:termproxy::\1@pam: /' /var/log/proxmox-backup/tasks/active || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
abort-upgrade|abort-remove|abort-deconfigure)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "postinst called with unknown argument \`$1'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
11
debian/prerm
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
# modeled after dh_systemd_start output
|
||||||
|
if [ -d /run/systemd/system ] && [ "$1" = remove ]; then
|
||||||
|
deb-systemd-invoke stop 'proxmox-backup-banner.service' 'proxmox-backup-proxy.service' \
|
||||||
|
'proxmox-backup.service' 'proxmox-backup-daily-update.timer' >/dev/null || true
|
||||||
|
fi
|
5
debian/proxmox-backup-docs.links
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
/usr/share/doc/proxmox-backup/proxmox-backup.pdf /usr/share/doc/proxmox-backup/html/proxmox-backup.pdf
|
||||||
|
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/prune-simulator/extjs
|
||||||
|
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/lto-barcode/extjs
|
||||||
|
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/api-viewer/extjs
|
||||||
|
/usr/share/javascript/mathjax /usr/share/doc/proxmox-backup/html/_static/mathjax
|
1
debian/proxmox-backup-file-restore.bash-completion
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
debian/proxmox-file-restore.bc proxmox-file-restore
|
8
debian/proxmox-backup-file-restore.bc
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# proxmox-file-restore bash completion
|
||||||
|
|
||||||
|
# see http://tiswww.case.edu/php/chet/bash/FAQ
|
||||||
|
# and __ltrim_colon_completions() in /usr/share/bash-completion/bash_completion
|
||||||
|
# this modifies global var, but I found no better way
|
||||||
|
COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
|
||||||
|
|
||||||
|
complete -C 'proxmox-file-restore bashcomplete' proxmox-file-restore
|
4
debian/proxmox-backup-file-restore.install
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
usr/bin/proxmox-file-restore
|
||||||
|
usr/share/man/man1/proxmox-file-restore.1
|
||||||
|
usr/share/zsh/vendor-completions/_proxmox-file-restore
|
||||||
|
usr/lib/x86_64-linux-gnu/proxmox-backup/file-restore/proxmox-restore-daemon
|
74
debian/proxmox-backup-file-restore.postinst
vendored
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
update_initramfs() {
|
||||||
|
# regenerate initramfs for single file restore VM
|
||||||
|
INST_PATH="/usr/lib/x86_64-linux-gnu/proxmox-backup/file-restore"
|
||||||
|
CACHE_PATH="/var/cache/proxmox-backup/file-restore-initramfs.img"
|
||||||
|
CACHE_PATH_DBG="/var/cache/proxmox-backup/file-restore-initramfs-debug.img"
|
||||||
|
|
||||||
|
# cleanup first, in case proxmox-file-restore was uninstalled since we do
|
||||||
|
# not want an unuseable image lying around
|
||||||
|
rm -f "$CACHE_PATH"
|
||||||
|
|
||||||
|
if [ ! -f "$INST_PATH/initramfs.img" ]; then
|
||||||
|
echo "proxmox-backup-restore-image is not installed correctly, skipping update" >&2
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Updating file-restore initramfs..."
|
||||||
|
|
||||||
|
# avoid leftover temp file
|
||||||
|
cleanup() {
|
||||||
|
rm -f "$CACHE_PATH.tmp" "$CACHE_PATH_DBG.tmp"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
mkdir -p "/var/cache/proxmox-backup"
|
||||||
|
cp "$INST_PATH/initramfs.img" "$CACHE_PATH.tmp"
|
||||||
|
|
||||||
|
# cpio uses passed in path as offset inside the archive as well, so we need
|
||||||
|
# to be in the same dir as the daemon binary to ensure it's placed in /
|
||||||
|
( cd "$INST_PATH"; \
|
||||||
|
printf "./proxmox-restore-daemon" \
|
||||||
|
| cpio -o --format=newc -A -F "$CACHE_PATH.tmp" )
|
||||||
|
mv -f "$CACHE_PATH.tmp" "$CACHE_PATH"
|
||||||
|
|
||||||
|
if [ -f "$INST_PATH/initramfs-debug.img" ]; then
|
||||||
|
echo "Updating file-restore debug initramfs..."
|
||||||
|
cp "$INST_PATH/initramfs-debug.img" "$CACHE_PATH_DBG.tmp"
|
||||||
|
( cd "$INST_PATH"; \
|
||||||
|
printf "./proxmox-restore-daemon" \
|
||||||
|
| cpio -o --format=newc -A -F "$CACHE_PATH_DBG.tmp" )
|
||||||
|
mv -f "$CACHE_PATH_DBG.tmp" "$CACHE_PATH_DBG"
|
||||||
|
fi
|
||||||
|
|
||||||
|
trap - EXIT
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
configure)
|
||||||
|
# in case restore daemon was updated
|
||||||
|
update_initramfs
|
||||||
|
;;
|
||||||
|
|
||||||
|
triggered)
|
||||||
|
if [ "$2" = "proxmox-backup-restore-image-update" ]; then
|
||||||
|
# in case base-image was updated
|
||||||
|
update_initramfs
|
||||||
|
else
|
||||||
|
echo "postinst called with unknown trigger name: \`$2'" >&2
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
abort-upgrade|abort-remove|abort-deconfigure)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "postinst called with unknown argument \`$1'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
1
debian/proxmox-backup-file-restore.triggers
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
interest-noawait proxmox-backup-restore-image-update
|
3
debian/proxmox-backup-server.bash-completion
vendored
@ -1 +1,4 @@
|
|||||||
debian/proxmox-backup-manager.bc proxmox-backup-manager
|
debian/proxmox-backup-manager.bc proxmox-backup-manager
|
||||||
|
debian/proxmox-tape.bc proxmox-tape
|
||||||
|
debian/pmtx.bc pmtx
|
||||||
|
debian/pmt.bc pmt
|
||||||
|
26
debian/proxmox-backup-server.install
vendored
@ -1,15 +1,37 @@
|
|||||||
etc/proxmox-backup-proxy.service /lib/systemd/system/
|
etc/proxmox-backup-proxy.service /lib/systemd/system/
|
||||||
etc/proxmox-backup.service /lib/systemd/system/
|
etc/proxmox-backup.service /lib/systemd/system/
|
||||||
etc/proxmox-backup-banner.service /lib/systemd/system/
|
etc/proxmox-backup-banner.service /lib/systemd/system/
|
||||||
|
etc/proxmox-backup-daily-update.service /lib/systemd/system/
|
||||||
|
etc/proxmox-backup-daily-update.timer /lib/systemd/system/
|
||||||
|
etc/pbs-enterprise.list /etc/apt/sources.list.d/
|
||||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-api
|
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-api
|
||||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-proxy
|
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-proxy
|
||||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-banner
|
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-banner
|
||||||
|
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-daily-update
|
||||||
|
usr/lib/x86_64-linux-gnu/proxmox-backup/sg-tape-cmd
|
||||||
usr/sbin/proxmox-backup-manager
|
usr/sbin/proxmox-backup-manager
|
||||||
|
usr/bin/pmtx
|
||||||
|
usr/bin/pmt
|
||||||
|
usr/bin/proxmox-tape
|
||||||
usr/share/javascript/proxmox-backup/index.hbs
|
usr/share/javascript/proxmox-backup/index.hbs
|
||||||
usr/share/javascript/proxmox-backup/css/ext6-pbs.css
|
usr/share/javascript/proxmox-backup/css/ext6-pbs.css
|
||||||
usr/share/javascript/proxmox-backup/images/logo-128.png
|
usr/share/javascript/proxmox-backup/images
|
||||||
usr/share/javascript/proxmox-backup/images/proxmox_logo.png
|
|
||||||
usr/share/javascript/proxmox-backup/js/proxmox-backup-gui.js
|
usr/share/javascript/proxmox-backup/js/proxmox-backup-gui.js
|
||||||
usr/share/man/man1/proxmox-backup-manager.1
|
usr/share/man/man1/proxmox-backup-manager.1
|
||||||
usr/share/man/man1/proxmox-backup-proxy.1
|
usr/share/man/man1/proxmox-backup-proxy.1
|
||||||
|
usr/share/man/man1/proxmox-tape.1
|
||||||
|
usr/share/man/man1/pmtx.1
|
||||||
|
usr/share/man/man1/pmt.1
|
||||||
|
usr/share/man/man5/acl.cfg.5
|
||||||
|
usr/share/man/man5/datastore.cfg.5
|
||||||
|
usr/share/man/man5/user.cfg.5
|
||||||
|
usr/share/man/man5/remote.cfg.5
|
||||||
|
usr/share/man/man5/sync.cfg.5
|
||||||
|
usr/share/man/man5/verification.cfg.5
|
||||||
|
usr/share/man/man5/media-pool.cfg.5
|
||||||
|
usr/share/man/man5/tape.cfg.5
|
||||||
|
usr/share/man/man5/tape-job.cfg.5
|
||||||
usr/share/zsh/vendor-completions/_proxmox-backup-manager
|
usr/share/zsh/vendor-completions/_proxmox-backup-manager
|
||||||
|
usr/share/zsh/vendor-completions/_proxmox-tape
|
||||||
|
usr/share/zsh/vendor-completions/_pmtx
|
||||||
|
usr/share/zsh/vendor-completions/_pmt
|
||||||
|
1
debian/proxmox-backup-server.maintscript
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
rm_conffile /etc/apt/sources.list.d/pbstest-beta.list 1.0.0~ proxmox-backup-server
|
18
debian/proxmox-backup-server.udev
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# do not edit this file, it will be overwritten on update
|
||||||
|
|
||||||
|
# persistent storage links: /dev/tape/{by-id,by-path}
|
||||||
|
|
||||||
|
ACTION=="remove", GOTO="persistent_storage_tape_end"
|
||||||
|
ENV{UDEV_DISABLE_PERSISTENT_STORAGE_RULES_FLAG}=="1", GOTO="persistent_storage_tape_end"
|
||||||
|
|
||||||
|
# also see: /lib/udev/rules.d/60-persistent-storage-tape.rules
|
||||||
|
|
||||||
|
SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="1", IMPORT{program}="scsi_id --sg-version=3 --export --whitelisted -d $devnode", \
|
||||||
|
SYMLINK+="tape/by-id/scsi-$env{ID_SERIAL}-sg"
|
||||||
|
|
||||||
|
# iSCSI devices from the same host have all the same ID_SERIAL,
|
||||||
|
# but additionally a property named ID_SCSI_SERIAL.
|
||||||
|
SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="1", ENV{ID_SCSI_SERIAL}=="?*", \
|
||||||
|
SYMLINK+="tape/by-id/scsi-$env{ID_SCSI_SERIAL}-sg"
|
||||||
|
|
||||||
|
LABEL="persistent_storage_tape_end"
|
3
debian/proxmox-tape.bc
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# proxmox-tape bash completion
|
||||||
|
|
||||||
|
complete -C 'proxmox-tape bashcomplete' proxmox-tape
|
23
debian/rules
vendored
@ -37,11 +37,28 @@ override_dh_auto_install:
|
|||||||
PROXY_USER=backup \
|
PROXY_USER=backup \
|
||||||
LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH)
|
LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH)
|
||||||
|
|
||||||
override_dh_installinit:
|
override_dh_installsystemd:
|
||||||
dh_installinit
|
dh_installsystemd -pproxmox-backup-server proxmox-backup-daily-update.timer
|
||||||
dh_installinit --name proxmox-backup-proxy
|
# note: we start/try-reload-restart services manually in postinst
|
||||||
|
dh_installsystemd --no-start --no-restart-after-upgrade
|
||||||
|
|
||||||
|
override_dh_fixperms:
|
||||||
|
dh_fixperms --exclude sg-tape-cmd
|
||||||
|
|
||||||
# workaround https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=933541
|
# workaround https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=933541
|
||||||
# TODO: remove once available (Debian 11 ?)
|
# TODO: remove once available (Debian 11 ?)
|
||||||
override_dh_dwz:
|
override_dh_dwz:
|
||||||
dh_dwz --no-dwz-multifile
|
dh_dwz --no-dwz-multifile
|
||||||
|
|
||||||
|
override_dh_strip:
|
||||||
|
dh_strip
|
||||||
|
for exe in $$(find \
|
||||||
|
debian/proxmox-backup-client/usr \
|
||||||
|
debian/proxmox-backup-server/usr \
|
||||||
|
debian/proxmox-backup-file-restore \
|
||||||
|
-executable -type f); do \
|
||||||
|
debian/scripts/elf-strip-unused-dependencies.sh "$$exe" || true; \
|
||||||
|
done
|
||||||
|
|
||||||
|
override_dh_compress:
|
||||||
|
dh_compress -X.pdf
|
||||||
|
20
debian/scripts/elf-strip-unused-dependencies.sh
vendored
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
binary=$1
|
||||||
|
|
||||||
|
exec 3< <(ldd -u "$binary" | grep -oP '[^/:]+$')
|
||||||
|
|
||||||
|
patchargs=""
|
||||||
|
dropped=""
|
||||||
|
while read -r dep; do
|
||||||
|
dropped="$dep $dropped"
|
||||||
|
patchargs="--remove-needed $dep $patchargs"
|
||||||
|
done <&3
|
||||||
|
exec 3<&-
|
||||||
|
|
||||||
|
if [[ $dropped == "" ]]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "patchelf '$binary' - removing unused dependencies:\n $dropped"
|
||||||
|
patchelf $patchargs $binary
|
@ -5,6 +5,7 @@ LIBDIR = $(PREFIX)/lib
|
|||||||
LIBEXECDIR = $(LIBDIR)
|
LIBEXECDIR = $(LIBDIR)
|
||||||
DATAROOTDIR = $(PREFIX)/share
|
DATAROOTDIR = $(PREFIX)/share
|
||||||
MAN1DIR = $(PREFIX)/share/man/man1
|
MAN1DIR = $(PREFIX)/share/man/man1
|
||||||
|
MAN5DIR = $(PREFIX)/share/man/man5
|
||||||
DOCDIR = $(PREFIX)/share/doc/proxmox-backup
|
DOCDIR = $(PREFIX)/share/doc/proxmox-backup
|
||||||
JSDIR = $(DATAROOTDIR)/javascript/proxmox-backup
|
JSDIR = $(DATAROOTDIR)/javascript/proxmox-backup
|
||||||
SYSCONFDIR = /etc
|
SYSCONFDIR = /etc
|
||||||
|
190
docs/Makefile
@ -1,43 +1,85 @@
|
|||||||
include ../defines.mk
|
include ../defines.mk
|
||||||
|
|
||||||
ifeq ($(BUILD_MODE), release)
|
|
||||||
COMPILEDIR := ../target/release
|
|
||||||
else
|
|
||||||
COMPILEDIR := ../target/debug
|
|
||||||
endif
|
|
||||||
|
|
||||||
GENERATED_SYNOPSIS := \
|
GENERATED_SYNOPSIS := \
|
||||||
|
proxmox-tape/synopsis.rst \
|
||||||
proxmox-backup-client/synopsis.rst \
|
proxmox-backup-client/synopsis.rst \
|
||||||
proxmox-backup-client/catalog-shell-synopsis.rst \
|
proxmox-backup-client/catalog-shell-synopsis.rst \
|
||||||
proxmox-backup-manager/synopsis.rst \
|
proxmox-backup-manager/synopsis.rst \
|
||||||
|
proxmox-file-restore/synopsis.rst \
|
||||||
pxar/synopsis.rst \
|
pxar/synopsis.rst \
|
||||||
backup-protocol-api.rst \
|
pmtx/synopsis.rst \
|
||||||
reader-protocol-api.rst
|
pmt/synopsis.rst \
|
||||||
|
config/media-pool/config.rst \
|
||||||
|
config/tape/config.rst \
|
||||||
|
config/tape-job/config.rst \
|
||||||
|
config/user/config.rst \
|
||||||
|
config/remote/config.rst \
|
||||||
|
config/sync/config.rst \
|
||||||
|
config/verification/config.rst \
|
||||||
|
config/acl/roles.rst \
|
||||||
|
config/datastore/config.rst
|
||||||
|
|
||||||
MANUAL_PAGES := \
|
MAN1_PAGES := \
|
||||||
pxar.1 \
|
pxar.1 \
|
||||||
|
pmtx.1 \
|
||||||
|
pmt.1 \
|
||||||
|
proxmox-tape.1 \
|
||||||
proxmox-backup-proxy.1 \
|
proxmox-backup-proxy.1 \
|
||||||
proxmox-backup-client.1 \
|
proxmox-backup-client.1 \
|
||||||
proxmox-backup-manager.1
|
proxmox-backup-manager.1 \
|
||||||
|
proxmox-file-restore.1
|
||||||
|
|
||||||
|
MAN5_PAGES := \
|
||||||
|
media-pool.cfg.5 \
|
||||||
|
tape.cfg.5 \
|
||||||
|
tape-job.cfg.5 \
|
||||||
|
acl.cfg.5 \
|
||||||
|
user.cfg.5 \
|
||||||
|
remote.cfg.5 \
|
||||||
|
sync.cfg.5 \
|
||||||
|
verification.cfg.5 \
|
||||||
|
datastore.cfg.5
|
||||||
|
|
||||||
|
PRUNE_SIMULATOR_FILES := \
|
||||||
|
prune-simulator/index.html \
|
||||||
|
prune-simulator/documentation.html \
|
||||||
|
prune-simulator/clear-trigger.png \
|
||||||
|
prune-simulator/prune-simulator.js
|
||||||
|
|
||||||
|
LTO_BARCODE_FILES := \
|
||||||
|
lto-barcode/index.html \
|
||||||
|
lto-barcode/code39.js \
|
||||||
|
lto-barcode/prefix-field.js \
|
||||||
|
lto-barcode/label-style.js \
|
||||||
|
lto-barcode/tape-type.js \
|
||||||
|
lto-barcode/paper-size.js \
|
||||||
|
lto-barcode/page-layout.js \
|
||||||
|
lto-barcode/page-calibration.js \
|
||||||
|
lto-barcode/label-list.js \
|
||||||
|
lto-barcode/label-setup.js \
|
||||||
|
lto-barcode/lto-barcode.js
|
||||||
|
|
||||||
|
API_VIEWER_SOURCES= \
|
||||||
|
api-viewer/index.html \
|
||||||
|
api-viewer/apidoc.js
|
||||||
|
|
||||||
# Sphinx documentation setup
|
# Sphinx documentation setup
|
||||||
SPHINXOPTS =
|
SPHINXOPTS =
|
||||||
SPHINXBUILD = sphinx-build
|
SPHINXBUILD = sphinx-build
|
||||||
BUILDDIR = output
|
BUILDDIR = output
|
||||||
|
|
||||||
|
ifeq ($(BUILD_MODE), release)
|
||||||
|
COMPILEDIR := ../target/release
|
||||||
|
SPHINXOPTS += -t release
|
||||||
|
else
|
||||||
|
COMPILEDIR := ../target/debug
|
||||||
|
SPHINXOPTS += -t devbuild
|
||||||
|
endif
|
||||||
|
|
||||||
# Sphinx internal variables.
|
# Sphinx internal variables.
|
||||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(SPHINXOPTS) .
|
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(SPHINXOPTS) .
|
||||||
|
|
||||||
all: ${MANUAL_PAGES}
|
all: ${MAN1_PAGES} ${MAN5_PAGES}
|
||||||
|
|
||||||
# Extract backup protocol docs
|
|
||||||
backup-protocol-api.rst: ${COMPILEDIR}/dump-backup-api
|
|
||||||
${COMPILEDIR}/dump-backup-api >$@
|
|
||||||
|
|
||||||
# Extract reader protocol docs
|
|
||||||
reader-protocol-api.rst: ${COMPILEDIR}/dump-reader-api
|
|
||||||
${COMPILEDIR}/dump-backup-api >$@
|
|
||||||
|
|
||||||
# Build manual pages using rst2man
|
# Build manual pages using rst2man
|
||||||
|
|
||||||
@ -47,6 +89,80 @@ pxar/synopsis.rst: ${COMPILEDIR}/pxar
|
|||||||
pxar.1: pxar/man1.rst pxar/description.rst pxar/synopsis.rst
|
pxar.1: pxar/man1.rst pxar/description.rst pxar/synopsis.rst
|
||||||
rst2man $< >$@
|
rst2man $< >$@
|
||||||
|
|
||||||
|
|
||||||
|
pmtx/synopsis.rst: ${COMPILEDIR}/pmtx
|
||||||
|
${COMPILEDIR}/pmtx printdoc > pmtx/synopsis.rst
|
||||||
|
|
||||||
|
pmtx.1: pmtx/man1.rst pmtx/description.rst pmtx/synopsis.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
|
||||||
|
pmt/synopsis.rst: ${COMPILEDIR}/pmt
|
||||||
|
${COMPILEDIR}/pmt printdoc > pmt/synopsis.rst
|
||||||
|
|
||||||
|
pmt.1: pmt/man1.rst pmt/description.rst pmt/options.rst pmt/synopsis.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/datastore/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen datastore.cfg >$@
|
||||||
|
|
||||||
|
datastore.cfg.5: config/datastore/man5.rst config/datastore/config.rst config/datastore/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/user/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen user.cfg >$@
|
||||||
|
|
||||||
|
user.cfg.5: config/user/man5.rst config/user/config.rst config/user/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/remote/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen remote.cfg >$@
|
||||||
|
|
||||||
|
remote.cfg.5: config/remote/man5.rst config/remote/config.rst config/remote/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/sync/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen sync.cfg >$@
|
||||||
|
|
||||||
|
sync.cfg.5: config/sync/man5.rst config/sync/config.rst config/sync/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/verification/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen verification.cfg >$@
|
||||||
|
|
||||||
|
verification.cfg.5: config/verification/man5.rst config/verification/config.rst config/verification/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/acl/roles.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen "config::acl::Role" >$@
|
||||||
|
|
||||||
|
acl.cfg.5: config/acl/man5.rst config/acl/roles.rst config/acl/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/media-pool/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen media-pool.cfg >$@
|
||||||
|
|
||||||
|
media-pool.cfg.5: config/media-pool/man5.rst config/media-pool/config.rst config/media-pool/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/tape/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen tape.cfg >$@
|
||||||
|
|
||||||
|
tape.cfg.5: config/tape/man5.rst config/tape/config.rst config/tape/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
config/tape-job/config.rst: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen tape-job.cfg >$@
|
||||||
|
|
||||||
|
tape-job.cfg.5: config/tape-job/man5.rst config/tape-job/config.rst config/tape-job/format.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
proxmox-tape/synopsis.rst: ${COMPILEDIR}/proxmox-tape
|
||||||
|
${COMPILEDIR}/proxmox-tape printdoc > proxmox-tape/synopsis.rst
|
||||||
|
|
||||||
|
proxmox-tape.1: proxmox-tape/man1.rst proxmox-tape/description.rst proxmox-tape/synopsis.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
proxmox-backup-client/synopsis.rst: ${COMPILEDIR}/proxmox-backup-client
|
proxmox-backup-client/synopsis.rst: ${COMPILEDIR}/proxmox-backup-client
|
||||||
${COMPILEDIR}/proxmox-backup-client printdoc > proxmox-backup-client/synopsis.rst
|
${COMPILEDIR}/proxmox-backup-client printdoc > proxmox-backup-client/synopsis.rst
|
||||||
|
|
||||||
@ -65,9 +181,34 @@ proxmox-backup-manager.1: proxmox-backup-manager/man1.rst proxmox-backup-manage
|
|||||||
proxmox-backup-proxy.1: proxmox-backup-proxy/man1.rst proxmox-backup-proxy/description.rst
|
proxmox-backup-proxy.1: proxmox-backup-proxy/man1.rst proxmox-backup-proxy/description.rst
|
||||||
rst2man $< >$@
|
rst2man $< >$@
|
||||||
|
|
||||||
|
proxmox-file-restore/synopsis.rst: ${COMPILEDIR}/proxmox-file-restore
|
||||||
|
${COMPILEDIR}/proxmox-file-restore printdoc > proxmox-file-restore/synopsis.rst
|
||||||
|
|
||||||
|
proxmox-file-restore.1: proxmox-file-restore/man1.rst proxmox-file-restore/description.rst proxmox-file-restore/synopsis.rst
|
||||||
|
rst2man $< >$@
|
||||||
|
|
||||||
|
.PHONY: onlinehelpinfo
|
||||||
|
onlinehelpinfo:
|
||||||
|
@echo "Generating OnlineHelpInfo.js..."
|
||||||
|
$(SPHINXBUILD) -b proxmox-scanrefs -Q $(ALLSPHINXOPTS) $(BUILDDIR)/scanrefs
|
||||||
|
@echo "Build finished. OnlineHelpInfo.js is in $(BUILDDIR)/scanrefs."
|
||||||
|
|
||||||
|
api-viewer/apidata.js: ${COMPILEDIR}/docgen
|
||||||
|
${COMPILEDIR}/docgen apidata.js >$@
|
||||||
|
|
||||||
|
api-viewer/apidoc.js: api-viewer/apidata.js api-viewer/PBSAPI.js
|
||||||
|
cat api-viewer/apidata.js api-viewer/PBSAPI.js >$@
|
||||||
|
|
||||||
.PHONY: html
|
.PHONY: html
|
||||||
html: ${GENERATED_SYNOPSIS}
|
html: ${GENERATED_SYNOPSIS} images/proxmox-logo.svg custom.css conf.py ${PRUNE_SIMULATOR_FILES} ${LTO_BARCODE_FILES} ${API_VIEWER_SOURCES}
|
||||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||||
|
install -m 0644 custom.js custom.css images/proxmox-logo.svg $(BUILDDIR)/html/_static/
|
||||||
|
install -dm 0755 $(BUILDDIR)/html/prune-simulator
|
||||||
|
install -m 0644 ${PRUNE_SIMULATOR_FILES} $(BUILDDIR)/html/prune-simulator
|
||||||
|
install -dm 0755 $(BUILDDIR)/html/lto-barcode
|
||||||
|
install -m 0644 ${LTO_BARCODE_FILES} $(BUILDDIR)/html/lto-barcode
|
||||||
|
install -dm 0755 $(BUILDDIR)/html/api-viewer
|
||||||
|
install -m 0644 ${API_VIEWER_SOURCES} $(BUILDDIR)/html/api-viewer
|
||||||
@echo
|
@echo
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||||
|
|
||||||
@ -86,12 +227,15 @@ epub3: ${GENERATED_SYNOPSIS}
|
|||||||
@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
|
@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -r -f *~ *.1 ${BUILDDIR} ${GENERATED_SYNOPSIS}
|
rm -r -f *~ *.1 ${BUILDDIR} ${GENERATED_SYNOPSIS} api-viewer/apidata.js
|
||||||
|
rm -f api-viewer/apidoc.js lto-barcode/lto-barcode-generator.js
|
||||||
|
|
||||||
|
|
||||||
install_manual_pages: ${MANUAL_PAGES}
|
install_manual_pages: ${MAN1_PAGES} ${MAN5_PAGES}
|
||||||
install -dm755 $(DESTDIR)$(MAN1DIR)
|
install -dm755 $(DESTDIR)$(MAN1DIR)
|
||||||
for i in ${MANUAL_PAGES}; do install -m755 $$i $(DESTDIR)$(MAN1DIR)/ ; done
|
for i in ${MAN1_PAGES}; do install -m755 $$i $(DESTDIR)$(MAN1DIR)/ ; done
|
||||||
|
install -dm755 $(DESTDIR)$(MAN5DIR)
|
||||||
|
for i in ${MAN5_PAGES}; do install -m755 $$i $(DESTDIR)$(MAN5DIR)/ ; done
|
||||||
|
|
||||||
install_html: html
|
install_html: html
|
||||||
install -dm755 $(DESTDIR)$(DOCDIR)
|
install -dm755 $(DESTDIR)$(DOCDIR)
|
||||||
|
153
docs/_ext/proxmox-scanrefs.py
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# debugging stuff
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
|
||||||
|
import os
|
||||||
|
import io
|
||||||
|
from docutils import nodes
|
||||||
|
|
||||||
|
from sphinx.builders import Builder
|
||||||
|
from sphinx.util import logging
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# refs are added in the following manner before the title of a section (note underscore and newline before title):
|
||||||
|
# .. _my-label:
|
||||||
|
#
|
||||||
|
# Section to ref
|
||||||
|
# --------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# then referred to like (note missing underscore):
|
||||||
|
# "see :ref:`my-label`"
|
||||||
|
#
|
||||||
|
# the benefit of using this is if a label is explicitly set for a section,
|
||||||
|
# we can refer to it with this anchor #my-label in the html,
|
||||||
|
# even if the section name changes.
|
||||||
|
#
|
||||||
|
# see https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref
|
||||||
|
|
||||||
|
def scan_extjs_files(wwwdir="../www"): # a bit rough i know, but we can optimize later
|
||||||
|
js_files = []
|
||||||
|
used_anchors = []
|
||||||
|
logger.info("scanning extjs files for onlineHelp definitions")
|
||||||
|
for root, dirs, files in os.walk("{}".format(wwwdir)):
|
||||||
|
#print(root, dirs, files)
|
||||||
|
for filename in files:
|
||||||
|
if filename.endswith('.js'):
|
||||||
|
js_files.append(os.path.join(root, filename))
|
||||||
|
for js_file in js_files:
|
||||||
|
fd = open(js_file).read()
|
||||||
|
allmatch = re.findall("(?:onlineHelp:|get_help_tool\s*\()\s*[\'\"](.*?)[\'\"]", fd, re.M)
|
||||||
|
for match in allmatch:
|
||||||
|
anchor = match
|
||||||
|
anchor = re.sub('_', '-', anchor) # normalize labels
|
||||||
|
logger.info("found onlineHelp: {} in {}".format(anchor, js_file))
|
||||||
|
used_anchors.append(anchor)
|
||||||
|
|
||||||
|
return used_anchors
|
||||||
|
|
||||||
|
|
||||||
|
def setup(app):
|
||||||
|
logger.info('Mapping reference labels...')
|
||||||
|
app.add_builder(ReflabelMapper)
|
||||||
|
return {
|
||||||
|
'version': '0.1',
|
||||||
|
'parallel_read_safe': True,
|
||||||
|
'parallel_write_safe': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReflabelMapper(Builder):
|
||||||
|
name = 'proxmox-scanrefs'
|
||||||
|
|
||||||
|
def init(self):
|
||||||
|
self.docnames = []
|
||||||
|
self.env.online_help = {}
|
||||||
|
self.env.online_help['pbs_documentation_index'] = {
|
||||||
|
'link': '/docs/index.html',
|
||||||
|
'title': 'Proxmox Backup Server Documentation Index',
|
||||||
|
}
|
||||||
|
# Disabled until we find a sensible way to scan proxmox-widget-toolkit
|
||||||
|
# as well
|
||||||
|
#self.env.used_anchors = scan_extjs_files()
|
||||||
|
|
||||||
|
if not os.path.isdir(self.outdir):
|
||||||
|
os.mkdir(self.outdir)
|
||||||
|
|
||||||
|
self.output_filename = os.path.join(self.outdir, 'OnlineHelpInfo.js')
|
||||||
|
self.output = io.open(self.output_filename, 'w', encoding='UTF-8')
|
||||||
|
|
||||||
|
def write_doc(self, docname, doctree):
|
||||||
|
for node in doctree.traverse(nodes.section):
|
||||||
|
#pprint(vars(node))
|
||||||
|
|
||||||
|
if hasattr(node, 'expect_referenced_by_id') and len(node['ids']) > 1: # explicit labels
|
||||||
|
filename = self.env.doc2path(docname)
|
||||||
|
filename_html = re.sub('.rst', '.html', filename)
|
||||||
|
|
||||||
|
# node['ids'][0] contains a normalized version of the
|
||||||
|
# headline. If the ref and headline are the same
|
||||||
|
# (normalized) sphinx will set the node['ids'][1] to a
|
||||||
|
# generic id in the format `idX` where X is numeric. If the
|
||||||
|
# ref and headline are not the same, the ref name will be
|
||||||
|
# stored in node['ids'][1]
|
||||||
|
if re.match('^id[0-9]*$', node['ids'][1]):
|
||||||
|
labelid = node['ids'][0]
|
||||||
|
else:
|
||||||
|
labelid = node['ids'][1]
|
||||||
|
|
||||||
|
title = cast(nodes.title, node[0])
|
||||||
|
logger.info('traversing section {}'.format(title.astext()))
|
||||||
|
ref_name = getattr(title, 'rawsource', title.astext())
|
||||||
|
|
||||||
|
if (ref_name[:7] == ':term:`'):
|
||||||
|
ref_name = ref_name[7:-1]
|
||||||
|
|
||||||
|
self.env.online_help[labelid] = {'link': '', 'title': ''}
|
||||||
|
self.env.online_help[labelid]['link'] = "/docs/" + os.path.basename(filename_html) + "#{}".format(labelid)
|
||||||
|
self.env.online_help[labelid]['title'] = ref_name
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def get_outdated_docs(self):
|
||||||
|
return 'all documents'
|
||||||
|
|
||||||
|
def prepare_writing(self, docnames):
|
||||||
|
return
|
||||||
|
|
||||||
|
def get_target_uri(self, docname, typ=None):
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def validate_anchors(self):
|
||||||
|
#pprint(self.env.online_help)
|
||||||
|
to_remove = []
|
||||||
|
|
||||||
|
# Disabled until we find a sensible way to scan proxmox-widget-toolkit
|
||||||
|
# as well
|
||||||
|
#for anchor in self.env.used_anchors:
|
||||||
|
# if anchor not in self.env.online_help:
|
||||||
|
# logger.info("[-] anchor {} is missing from onlinehelp!".format(anchor))
|
||||||
|
#for anchor in self.env.online_help:
|
||||||
|
# if anchor not in self.env.used_anchors and anchor != 'pbs_documentation_index':
|
||||||
|
# logger.info("[*] anchor {} not used! deleting...".format(anchor))
|
||||||
|
# to_remove.append(anchor)
|
||||||
|
#for anchor in to_remove:
|
||||||
|
# self.env.online_help.pop(anchor, None)
|
||||||
|
return
|
||||||
|
|
||||||
|
def finish(self):
|
||||||
|
# generate OnlineHelpInfo.js output
|
||||||
|
self.validate_anchors()
|
||||||
|
|
||||||
|
self.output.write("const proxmoxOnlineHelpInfo = ")
|
||||||
|
self.output.write(json.dumps(self.env.online_help, indent=2))
|
||||||
|
self.output.write(";\n")
|
||||||
|
self.output.close()
|
||||||
|
return
|
11
docs/_templates/index-sidebar.html
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<h3>Navigation</h3>
|
||||||
|
{{ toctree(includehidden=theme_sidebar_includehidden, collapse=True, titles_only=True) }}
|
||||||
|
{% if theme_extra_nav_links %}
|
||||||
|
<hr />
|
||||||
|
<h3>Links</h3>
|
||||||
|
<ul>
|
||||||
|
{% for text, uri in theme_extra_nav_links.items() %}
|
||||||
|
<li class="toctree-l1"><a href="{{ uri }}">{{ text }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
7
docs/_templates/sidebar-header.html
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<p class="logo">
|
||||||
|
<a href="index.html">
|
||||||
|
<img class="logo" src="_static/proxmox-logo.svg" alt="Logo">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<h1 class="logo logo-name"><a href="index.html">Proxmox Backup</a></h1>
|
||||||
|
<hr style="width:100%;">
|
526
docs/api-viewer/PBSAPI.js
Normal file
@ -0,0 +1,526 @@
|
|||||||
|
// avoid errors when running without development tools
|
||||||
|
if (!Ext.isDefined(Ext.global.console)) {
|
||||||
|
var console = {
|
||||||
|
dir: function() {},
|
||||||
|
log: function() {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Ext.onReady(function() {
|
||||||
|
|
||||||
|
Ext.define('pve-param-schema', {
|
||||||
|
extend: 'Ext.data.Model',
|
||||||
|
fields: [
|
||||||
|
'name', 'type', 'typetext', 'description', 'verbose_description',
|
||||||
|
'enum', 'minimum', 'maximum', 'minLength', 'maxLength',
|
||||||
|
'pattern', 'title', 'requires', 'format', 'default',
|
||||||
|
'disallow', 'extends', 'links',
|
||||||
|
{
|
||||||
|
name: 'optional',
|
||||||
|
type: 'boolean'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
var store = Ext.define('pve-updated-treestore', {
|
||||||
|
extend: 'Ext.data.TreeStore',
|
||||||
|
model: Ext.define('pve-api-doc', {
|
||||||
|
extend: 'Ext.data.Model',
|
||||||
|
fields: [
|
||||||
|
'path', 'info', 'text',
|
||||||
|
]
|
||||||
|
}),
|
||||||
|
proxy: {
|
||||||
|
type: 'memory',
|
||||||
|
data: pbsapi
|
||||||
|
},
|
||||||
|
sorters: [{
|
||||||
|
property: 'leaf',
|
||||||
|
direction: 'ASC'
|
||||||
|
}, {
|
||||||
|
property: 'text',
|
||||||
|
direction: 'ASC'
|
||||||
|
}],
|
||||||
|
filterer: 'bottomup',
|
||||||
|
doFilter: function(node) {
|
||||||
|
this.filterNodes(node, this.getFilters().getFilterFn(), true);
|
||||||
|
},
|
||||||
|
|
||||||
|
filterNodes: function(node, filterFn, parentVisible) {
|
||||||
|
var me = this,
|
||||||
|
bottomUpFiltering = me.filterer === 'bottomup',
|
||||||
|
match = filterFn(node) && parentVisible || (node.isRoot() && !me.getRootVisible()),
|
||||||
|
childNodes = node.childNodes,
|
||||||
|
len = childNodes && childNodes.length, i, matchingChildren;
|
||||||
|
|
||||||
|
if (len) {
|
||||||
|
for (i = 0; i < len; ++i) {
|
||||||
|
matchingChildren = me.filterNodes(childNodes[i], filterFn, match || bottomUpFiltering) || matchingChildren;
|
||||||
|
}
|
||||||
|
if (bottomUpFiltering) {
|
||||||
|
match = matchingChildren || match;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node.set("visible", match, me._silentOptions);
|
||||||
|
return match;
|
||||||
|
},
|
||||||
|
|
||||||
|
}).create();
|
||||||
|
|
||||||
|
var render_description = function(value, metaData, record) {
|
||||||
|
var pdef = record.data;
|
||||||
|
|
||||||
|
value = pdef.verbose_description || value;
|
||||||
|
|
||||||
|
// TODO: try to render asciidoc correctly
|
||||||
|
|
||||||
|
metaData.style = 'white-space:pre-wrap;'
|
||||||
|
|
||||||
|
return Ext.htmlEncode(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
var render_type = function(value, metaData, record) {
|
||||||
|
var pdef = record.data;
|
||||||
|
|
||||||
|
return pdef['enum'] ? 'enum' : (pdef.type || 'string');
|
||||||
|
};
|
||||||
|
|
||||||
|
let render_simple_format = function(pdef, type_fallback) {
|
||||||
|
if (pdef.typetext)
|
||||||
|
return pdef.typetext;
|
||||||
|
|
||||||
|
if (pdef['enum'])
|
||||||
|
return pdef['enum'].join(' | ');
|
||||||
|
|
||||||
|
if (pdef.format)
|
||||||
|
return pdef.format;
|
||||||
|
|
||||||
|
if (pdef.pattern)
|
||||||
|
return pdef.pattern;
|
||||||
|
|
||||||
|
if (pdef.type === 'boolean')
|
||||||
|
return `<true|false>`;
|
||||||
|
|
||||||
|
if (type_fallback && pdef.type)
|
||||||
|
return `<${pdef.type}>`;
|
||||||
|
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let render_format = function(value, metaData, record) {
|
||||||
|
let pdef = record.data;
|
||||||
|
|
||||||
|
metaData.style = 'white-space:normal;'
|
||||||
|
|
||||||
|
if (pdef.type === 'array' && pdef.items) {
|
||||||
|
let format = render_simple_format(pdef.items, true);
|
||||||
|
return `[${Ext.htmlEncode(format)}, ...]`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ext.htmlEncode(render_simple_format(pdef) || '');
|
||||||
|
};
|
||||||
|
|
||||||
|
var real_path = function(path) {
|
||||||
|
return path.replace(/^.*\/_upgrade_(\/)?/, "/");
|
||||||
|
};
|
||||||
|
|
||||||
|
var permission_text = function(permission) {
|
||||||
|
let permhtml = "";
|
||||||
|
|
||||||
|
if (permission.user) {
|
||||||
|
if (!permission.description) {
|
||||||
|
if (permission.user === 'world') {
|
||||||
|
permhtml += "Accessible without any authentication.";
|
||||||
|
} else if (permission.user === 'all') {
|
||||||
|
permhtml += "Accessible by all authenticated users.";
|
||||||
|
} else {
|
||||||
|
permhtml += 'Onyl accessible by user "' +
|
||||||
|
permission.user + '"';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (permission.check) {
|
||||||
|
permhtml += "<pre>Check: " +
|
||||||
|
Ext.htmlEncode(Ext.JSON.encode(permission.check)) + "</pre>";
|
||||||
|
} else if (permission.userParam) {
|
||||||
|
permhtml += `<div>Check if user matches parameter '${permission.userParam}'`;
|
||||||
|
} else if (permission.or) {
|
||||||
|
permhtml += "<div>Or<div style='padding-left: 10px;'>";
|
||||||
|
Ext.Array.each(permission.or, function(sub_permission) {
|
||||||
|
permhtml += permission_text(sub_permission);
|
||||||
|
})
|
||||||
|
permhtml += "</div></div>";
|
||||||
|
} else if (permission.and) {
|
||||||
|
permhtml += "<div>And<div style='padding-left: 10px;'>";
|
||||||
|
Ext.Array.each(permission.and, function(sub_permission) {
|
||||||
|
permhtml += permission_text(sub_permission);
|
||||||
|
})
|
||||||
|
permhtml += "</div></div>";
|
||||||
|
} else {
|
||||||
|
//console.log(permission);
|
||||||
|
permhtml += "Unknown syntax!";
|
||||||
|
}
|
||||||
|
|
||||||
|
return permhtml;
|
||||||
|
};
|
||||||
|
|
||||||
|
var render_docu = function(data) {
|
||||||
|
var md = data.info;
|
||||||
|
|
||||||
|
// console.dir(data);
|
||||||
|
|
||||||
|
var items = [];
|
||||||
|
|
||||||
|
var clicmdhash = {
|
||||||
|
GET: 'get',
|
||||||
|
POST: 'create',
|
||||||
|
PUT: 'set',
|
||||||
|
DELETE: 'delete'
|
||||||
|
};
|
||||||
|
|
||||||
|
Ext.Array.each(['GET', 'POST', 'PUT', 'DELETE'], function(method) {
|
||||||
|
var info = md[method];
|
||||||
|
if (info) {
|
||||||
|
|
||||||
|
var usage = "";
|
||||||
|
|
||||||
|
usage += "<table><tr><td>HTTP: </td><td>"
|
||||||
|
+ method + " " + real_path("/api2/json" + data.path) + "</td></tr>";
|
||||||
|
|
||||||
|
var sections = [
|
||||||
|
{
|
||||||
|
title: 'Description',
|
||||||
|
html: Ext.htmlEncode(info.description),
|
||||||
|
bodyPadding: 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Usage',
|
||||||
|
html: usage,
|
||||||
|
bodyPadding: 10
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
if (info.parameters && info.parameters.properties) {
|
||||||
|
|
||||||
|
var pstore = Ext.create('Ext.data.Store', {
|
||||||
|
model: 'pve-param-schema',
|
||||||
|
proxy: {
|
||||||
|
type: 'memory'
|
||||||
|
},
|
||||||
|
groupField: 'optional',
|
||||||
|
sorters: [
|
||||||
|
{
|
||||||
|
property: 'name',
|
||||||
|
direction: 'ASC'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
Ext.Object.each(info.parameters.properties, function(name, pdef) {
|
||||||
|
pdef.name = name;
|
||||||
|
pstore.add(pdef);
|
||||||
|
});
|
||||||
|
|
||||||
|
pstore.sort();
|
||||||
|
|
||||||
|
var groupingFeature = Ext.create('Ext.grid.feature.Grouping',{
|
||||||
|
enableGroupingMenu: false,
|
||||||
|
groupHeaderTpl: '<tpl if="groupValue">Optional</tpl><tpl if="!groupValue">Required</tpl>'
|
||||||
|
});
|
||||||
|
|
||||||
|
sections.push({
|
||||||
|
xtype: 'gridpanel',
|
||||||
|
title: 'Parameters',
|
||||||
|
features: [groupingFeature],
|
||||||
|
store: pstore,
|
||||||
|
viewConfig: {
|
||||||
|
trackOver: false,
|
||||||
|
stripeRows: true
|
||||||
|
},
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: 'Name',
|
||||||
|
dataIndex: 'name',
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Type',
|
||||||
|
dataIndex: 'type',
|
||||||
|
renderer: render_type,
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Default',
|
||||||
|
dataIndex: 'default',
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Format',
|
||||||
|
dataIndex: 'type',
|
||||||
|
renderer: render_format,
|
||||||
|
flex: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Description',
|
||||||
|
dataIndex: 'description',
|
||||||
|
renderer: render_description,
|
||||||
|
flex: 6
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.returns) {
|
||||||
|
|
||||||
|
var retinf = info.returns;
|
||||||
|
var rtype = retinf.type;
|
||||||
|
if (!rtype && retinf.items)
|
||||||
|
rtype = 'array';
|
||||||
|
if (!rtype)
|
||||||
|
rtype = 'object';
|
||||||
|
|
||||||
|
var rpstore = Ext.create('Ext.data.Store', {
|
||||||
|
model: 'pve-param-schema',
|
||||||
|
proxy: {
|
||||||
|
type: 'memory'
|
||||||
|
},
|
||||||
|
groupField: 'optional',
|
||||||
|
sorters: [
|
||||||
|
{
|
||||||
|
property: 'name',
|
||||||
|
direction: 'ASC'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
var properties;
|
||||||
|
if (rtype === 'array' && retinf.items.properties) {
|
||||||
|
properties = retinf.items.properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rtype === 'object' && retinf.properties) {
|
||||||
|
properties = retinf.properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ext.Object.each(properties, function(name, pdef) {
|
||||||
|
pdef.name = name;
|
||||||
|
rpstore.add(pdef);
|
||||||
|
});
|
||||||
|
|
||||||
|
rpstore.sort();
|
||||||
|
|
||||||
|
var groupingFeature = Ext.create('Ext.grid.feature.Grouping',{
|
||||||
|
enableGroupingMenu: false,
|
||||||
|
groupHeaderTpl: '<tpl if="groupValue">Optional</tpl><tpl if="!groupValue">Obligatory</tpl>'
|
||||||
|
});
|
||||||
|
var returnhtml;
|
||||||
|
if (retinf.items) {
|
||||||
|
returnhtml = '<pre>items: ' + Ext.htmlEncode(JSON.stringify(retinf.items, null, 4)) + '</pre>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retinf.properties) {
|
||||||
|
returnhtml = returnhtml || '';
|
||||||
|
returnhtml += '<pre>properties:' + Ext.htmlEncode(JSON.stringify(retinf.properties, null, 4)) + '</pre>';
|
||||||
|
}
|
||||||
|
|
||||||
|
var rawSection = Ext.create('Ext.panel.Panel', {
|
||||||
|
bodyPadding: '0px 10px 10px 10px',
|
||||||
|
html: returnhtml,
|
||||||
|
hidden: true
|
||||||
|
});
|
||||||
|
|
||||||
|
sections.push({
|
||||||
|
xtype: 'gridpanel',
|
||||||
|
title: 'Returns: ' + rtype,
|
||||||
|
features: [groupingFeature],
|
||||||
|
store: rpstore,
|
||||||
|
viewConfig: {
|
||||||
|
trackOver: false,
|
||||||
|
stripeRows: true
|
||||||
|
},
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: 'Name',
|
||||||
|
dataIndex: 'name',
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Type',
|
||||||
|
dataIndex: 'type',
|
||||||
|
renderer: render_type,
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Default',
|
||||||
|
dataIndex: 'default',
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Format',
|
||||||
|
dataIndex: 'type',
|
||||||
|
renderer: render_format,
|
||||||
|
flex: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Description',
|
||||||
|
dataIndex: 'description',
|
||||||
|
renderer: render_description,
|
||||||
|
flex: 6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
bbar: [
|
||||||
|
{
|
||||||
|
xtype: 'button',
|
||||||
|
text: 'Show RAW',
|
||||||
|
handler: function(btn) {
|
||||||
|
rawSection.setVisible(!rawSection.isVisible());
|
||||||
|
btn.setText(rawSection.isVisible() ? 'Hide RAW' : 'Show RAW');
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
sections.push(rawSection);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data.path.match(/\/_upgrade_/)) {
|
||||||
|
var permhtml = '';
|
||||||
|
|
||||||
|
if (!info.permissions) {
|
||||||
|
permhtml = "Root only.";
|
||||||
|
} else {
|
||||||
|
if (info.permissions.description) {
|
||||||
|
permhtml += "<div style='white-space:pre-wrap;padding-bottom:10px;'>" +
|
||||||
|
Ext.htmlEncode(info.permissions.description) + "</div>";
|
||||||
|
}
|
||||||
|
permhtml += permission_text(info.permissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
// we do not have this information for PBS api
|
||||||
|
//if (!info.allowtoken) {
|
||||||
|
// permhtml += "<br />This API endpoint is not available for API tokens."
|
||||||
|
//}
|
||||||
|
|
||||||
|
sections.push({
|
||||||
|
title: 'Required permissions',
|
||||||
|
bodyPadding: 10,
|
||||||
|
html: permhtml
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
items.push({
|
||||||
|
title: method,
|
||||||
|
autoScroll: true,
|
||||||
|
defaults: {
|
||||||
|
border: false
|
||||||
|
},
|
||||||
|
items: sections
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var ct = Ext.getCmp('docview');
|
||||||
|
ct.setTitle("Path: " + real_path(data.path));
|
||||||
|
ct.removeAll(true);
|
||||||
|
ct.add(items);
|
||||||
|
ct.setActiveTab(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
Ext.define('Ext.form.SearchField', {
|
||||||
|
extend: 'Ext.form.field.Text',
|
||||||
|
alias: 'widget.searchfield',
|
||||||
|
|
||||||
|
emptyText: 'Search...',
|
||||||
|
|
||||||
|
flex: 1,
|
||||||
|
|
||||||
|
inputType: 'search',
|
||||||
|
listeners: {
|
||||||
|
'change': function(){
|
||||||
|
|
||||||
|
var value = this.getValue();
|
||||||
|
if (!Ext.isEmpty(value)) {
|
||||||
|
store.filter({
|
||||||
|
property: 'path',
|
||||||
|
value: value,
|
||||||
|
anyMatch: true
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
store.clearFilter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var tree = Ext.create('Ext.tree.Panel', {
|
||||||
|
title: 'Resource Tree',
|
||||||
|
tbar: [
|
||||||
|
{
|
||||||
|
xtype: 'searchfield',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
tools: [
|
||||||
|
{
|
||||||
|
type: 'expand',
|
||||||
|
tooltip: 'Expand all',
|
||||||
|
tooltipType: 'title',
|
||||||
|
callback: (tree) => tree.expandAll(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'collapse',
|
||||||
|
tooltip: 'Collapse all',
|
||||||
|
tooltipType: 'title',
|
||||||
|
callback: (tree) => tree.collapseAll(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
store: store,
|
||||||
|
width: 200,
|
||||||
|
region: 'west',
|
||||||
|
split: true,
|
||||||
|
margins: '5 0 5 5',
|
||||||
|
rootVisible: false,
|
||||||
|
listeners: {
|
||||||
|
selectionchange: function(v, selections) {
|
||||||
|
if (!selections[0])
|
||||||
|
return;
|
||||||
|
var rec = selections[0];
|
||||||
|
render_docu(rec.data);
|
||||||
|
location.hash = '#' + rec.data.path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Ext.create('Ext.container.Viewport', {
|
||||||
|
layout: 'border',
|
||||||
|
renderTo: Ext.getBody(),
|
||||||
|
items: [
|
||||||
|
tree,
|
||||||
|
{
|
||||||
|
xtype: 'tabpanel',
|
||||||
|
title: 'Documentation',
|
||||||
|
id: 'docview',
|
||||||
|
region: 'center',
|
||||||
|
margins: '5 5 5 0',
|
||||||
|
layout: 'fit',
|
||||||
|
items: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
var deepLink = function() {
|
||||||
|
var path = window.location.hash.substring(1).replace(/\/\s*$/, '')
|
||||||
|
var endpoint = store.findNode('path', path);
|
||||||
|
|
||||||
|
if (endpoint) {
|
||||||
|
tree.getSelectionModel().select(endpoint);
|
||||||
|
tree.expandPath(endpoint.getPath());
|
||||||
|
render_docu(endpoint.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.onhashchange = deepLink;
|
||||||
|
|
||||||
|
deepLink();
|
||||||
|
|
||||||
|
});
|
13
docs/api-viewer/index.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
|
<title>Proxmox Backup Server API Documentation</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" type="text/css" href="extjs/theme-crisp/resources/theme-crisp-all.css">
|
||||||
|
<script type="text/javascript" src="extjs/ext-all.js"></script>
|
||||||
|
<script type="text/javascript" src="apidoc.js"></script>
|
||||||
|
</head>
|
||||||
|
<body></body>
|
||||||
|
</html>
|
@ -1,387 +1,79 @@
|
|||||||
Administration Guide
|
Backup Client Usage
|
||||||
====================
|
===================
|
||||||
|
|
||||||
The administration guide.
|
|
||||||
|
|
||||||
.. todo:: either add a bit more explanation or remove the previous sentence
|
|
||||||
|
|
||||||
Terminology
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Backup Content
|
|
||||||
~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
When doing deduplication, there are different strategies to get
|
|
||||||
optimal results in terms of performance and/or deduplication rates.
|
|
||||||
Depending on the type of data, one can split data into *fixed* or *variable*
|
|
||||||
sized chunks.
|
|
||||||
|
|
||||||
Fixed sized chunking needs almost no CPU performance, and is used to
|
|
||||||
backup virtual machine images.
|
|
||||||
|
|
||||||
Variable sized chunking needs more CPU power, but is essential to get
|
|
||||||
good deduplication rates for file archives.
|
|
||||||
|
|
||||||
The backup server supports both strategies.
|
|
||||||
|
|
||||||
|
|
||||||
File Archives: ``<name>.pxar``
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. see https://moinakg.wordpress.com/2013/06/22/high-performance-content-defined-chunking/
|
|
||||||
|
|
||||||
A file archive stores a full directory tree. Content is stored using
|
|
||||||
the :ref:`pxar-format`, split into variable sized chunks. The format
|
|
||||||
is optimized to achieve good deduplication rates.
|
|
||||||
|
|
||||||
|
|
||||||
Image Archives: ``<name>.img``
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
This is used for virtual machine images and other large binary
|
|
||||||
data. Content is split into fixed sized chunks.
|
|
||||||
|
|
||||||
|
|
||||||
Binary Data (BLOBs)
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
This type is used to store smaller (< 16MB) binary data such as
|
|
||||||
configuration files. Larger files should be stored as image archive.
|
|
||||||
|
|
||||||
.. caution:: Please do not store all files as BLOBs. Instead, use the
|
|
||||||
file archive to store whole directory trees.
|
|
||||||
|
|
||||||
|
|
||||||
Catalog File: ``catalog.pcat1``
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
The catalog file is an index for file archives. It contains
|
|
||||||
the list of files and is used to speed-up search operations.
|
|
||||||
|
|
||||||
|
|
||||||
The Manifest: ``index.json``
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
The manifest contains the list of all backup files, their
|
|
||||||
sizes and checksums. It is used to verify the consistency of a
|
|
||||||
backup.
|
|
||||||
|
|
||||||
|
|
||||||
Backup Type
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
The backup server groups backups by *type*, where *type* is one of:
|
|
||||||
|
|
||||||
``vm``
|
|
||||||
This type is used for :term:`virtual machine`\ s. Typically
|
|
||||||
contains the virtual machine's configuration and an image archive
|
|
||||||
for each disk.
|
|
||||||
|
|
||||||
``ct``
|
|
||||||
This type is used for :term:`container`\ s. Contains the container's
|
|
||||||
configuration and a single file archive for the container content.
|
|
||||||
|
|
||||||
``host``
|
|
||||||
This type is used for backups created from within the backed up machine.
|
|
||||||
Typically this would be a physical host but could also be a virtual machine
|
|
||||||
or container. Such backups may contain file and image archives, there are no restrictions in this regard.
|
|
||||||
|
|
||||||
|
|
||||||
Backup ID
|
|
||||||
~~~~~~~~~
|
|
||||||
|
|
||||||
An unique ID. Usually the virtual machine or container ID. ``host``
|
|
||||||
type backups normally use the hostname.
|
|
||||||
|
|
||||||
|
|
||||||
Backup Time
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
The time when the backup was made.
|
|
||||||
|
|
||||||
|
|
||||||
Backup Group
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The tuple ``<type>/<ID>`` is called a backup group. Such a group
|
|
||||||
may contain one or more backup snapshots.
|
|
||||||
|
|
||||||
|
|
||||||
Backup Snapshot
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The triplet ``<type>/<ID>/<time>`` is called a backup snapshot. It
|
|
||||||
uniquely identifies a specific backup within a datastore.
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
:caption: Backup Snapshot Examples
|
|
||||||
|
|
||||||
vm/104/2019-10-09T08:01:06Z
|
|
||||||
host/elsa/2019-11-08T09:48:14Z
|
|
||||||
|
|
||||||
As you can see, the time format is RFC3399_ with Coordinated
|
|
||||||
Universal Time (UTC_, identified by the trailing *Z*).
|
|
||||||
|
|
||||||
|
|
||||||
:term:`DataStore`
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
A datastore is a place where backups are stored. The current implementation
|
|
||||||
uses a directory inside a standard unix file system (``ext4``, ``xfs``
|
|
||||||
or ``zfs``) to store the backup data.
|
|
||||||
|
|
||||||
Datastores are identified by a simple *ID*. You can configure it
|
|
||||||
when setting up the backup server.
|
|
||||||
|
|
||||||
|
|
||||||
Backup Server Management
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
The command line tool to configure and manage the backup server is called
|
|
||||||
:command:`proxmox-backup-manager`.
|
|
||||||
|
|
||||||
|
|
||||||
Datastore Configuration
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
A :term:`datastore` is a place to store backups. You can configure
|
|
||||||
multiple datastores. At least one datastore needs to be
|
|
||||||
configured. The datastore is identified by a simple `name` and points
|
|
||||||
to a directory.
|
|
||||||
|
|
||||||
The following command creates a new datastore called ``store1`` on :file:`/backup/disk1/store1`
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager datastore create store1 /backup/disk1/store1
|
|
||||||
|
|
||||||
To list existing datastores run:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager datastore list
|
|
||||||
┌────────┬──────────────────────┬─────────────────────────────┐
|
|
||||||
│ name │ path │ comment │
|
|
||||||
╞════════╪══════════════════════╪═════════════════════════════╡
|
|
||||||
│ store1 │ /backup/disk1/store1 │ This is my default storage. │
|
|
||||||
└────────┴──────────────────────┴─────────────────────────────┘
|
|
||||||
|
|
||||||
Finally, it is possible to remove the datastore configuration:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager datastore remove store1
|
|
||||||
|
|
||||||
.. note:: The above command removes only the datastore configuration. It does
|
|
||||||
not delete any data from the underlying directory.
|
|
||||||
|
|
||||||
|
|
||||||
File Layout
|
|
||||||
^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. todo:: Add datastore file layout example
|
|
||||||
|
|
||||||
|
|
||||||
User Management
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Proxmox Backup support several authentication realms, and you need to
|
|
||||||
choose the realm when you add a new user. Possible realms are:
|
|
||||||
|
|
||||||
:pam: Linux PAM standard authentication. Use this if you want to
|
|
||||||
authenticate as Linux system user (Users needs to exist on the
|
|
||||||
system).
|
|
||||||
|
|
||||||
:pbs: Proxmox Backup Server realm. This type stores hashed passwords in
|
|
||||||
``/etc/proxmox-backup/shadow.json``.
|
|
||||||
|
|
||||||
After installation, there is a single user ``root@pam``, which
|
|
||||||
corresponds to the Unix superuser. You can use the
|
|
||||||
``proxmox-backup-manager`` command line tool to list or manipulate
|
|
||||||
users:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager user list
|
|
||||||
┌─────────────┬────────┬────────┬───────────┬──────────┬────────────────┬────────────────────┐
|
|
||||||
│ userid │ enable │ expire │ firstname │ lastname │ email │ comment │
|
|
||||||
╞═════════════╪════════╪════════╪═══════════╪══════════╪════════════════╪════════════════════╡
|
|
||||||
│ root@pam │ 1 │ │ │ │ │ Superuser │
|
|
||||||
└─────────────┴────────┴────────┴───────────┴──────────┴────────────────┴────────────────────┘
|
|
||||||
|
|
||||||
The superuser has full administration rights on everything, so you
|
|
||||||
normally want to add other users with less privileges:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager user create john@pbs --email john@example.com
|
|
||||||
|
|
||||||
The create command lets you specify many option like ``--email`` or
|
|
||||||
``--password``, but you can update or change any of them using the
|
|
||||||
update command later:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager user update john@pbs --firstname John --lastname Smith
|
|
||||||
# proxmox-backup-manager user update john@pbs --comment "An example user."
|
|
||||||
|
|
||||||
|
|
||||||
.. todo:: Mention how to set password without passing plaintext password as cli argument.
|
|
||||||
|
|
||||||
|
|
||||||
The resulting use list looks like this:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager user list
|
|
||||||
┌──────────┬────────┬────────┬───────────┬──────────┬──────────────────┬──────────────────┐
|
|
||||||
│ userid │ enable │ expire │ firstname │ lastname │ email │ comment │
|
|
||||||
╞══════════╪════════╪════════╪═══════════╪══════════╪══════════════════╪══════════════════╡
|
|
||||||
│ john@pbs │ 1 │ │ John │ Smith │ john@example.com │ An example user. │
|
|
||||||
├──────────┼────────┼────────┼───────────┼──────────┼──────────────────┼──────────────────┤
|
|
||||||
│ root@pam │ 1 │ │ │ │ │ Superuser │
|
|
||||||
└──────────┴────────┴────────┴───────────┴──────────┴──────────────────┴──────────────────┘
|
|
||||||
|
|
||||||
Newly created users do not have an permissions. Please read the next
|
|
||||||
section to learn how to set access permissions.
|
|
||||||
|
|
||||||
If you want to disable an user account, you can do that by setting ``--enable`` to ``0``
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager user update john@pbs --enable 0
|
|
||||||
|
|
||||||
Or completely remove the users with:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# proxmox-backup-manager user remove john@pbs
|
|
||||||
|
|
||||||
|
|
||||||
Access Control
|
|
||||||
~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Users do not have any permission by default. Instead you need to
|
|
||||||
specify what is allowed and what not. You can do this by assigning
|
|
||||||
roles to users on specific objects like datastores or remotes. The
|
|
||||||
following roles exist:
|
|
||||||
|
|
||||||
**Admin**
|
|
||||||
The Administrator can do anything.
|
|
||||||
|
|
||||||
**Audit**
|
|
||||||
An Auditor can view things, but is not allowed to change settings.
|
|
||||||
|
|
||||||
**NoAccess**
|
|
||||||
Disable Access - nothing is allowed.
|
|
||||||
|
|
||||||
**DatastoreAdmin**
|
|
||||||
Can do anything on datastores.
|
|
||||||
|
|
||||||
**DatastoreAudit**
|
|
||||||
Can view datastore settings and list content. But
|
|
||||||
is not allowed to read the actual data.
|
|
||||||
|
|
||||||
**DataStoreReader**
|
|
||||||
Can Inspect datastore content and can do restores.
|
|
||||||
|
|
||||||
**DataStoreBackup**
|
|
||||||
Can backup and restore owned backups.
|
|
||||||
|
|
||||||
**DatastorePowerUser**
|
|
||||||
Can backup, restore, and prune owned backups.
|
|
||||||
|
|
||||||
**RemoteAdmin**
|
|
||||||
Can do anything on remotes.
|
|
||||||
|
|
||||||
**RemoteAudit**
|
|
||||||
Can view remote settings.
|
|
||||||
|
|
||||||
**RemoteSyncOperator**
|
|
||||||
Is allowed to read data from a remote.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Backup Client usage
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
The command line client is called :command:`proxmox-backup-client`.
|
The command line client is called :command:`proxmox-backup-client`.
|
||||||
|
|
||||||
|
.. _client_repository:
|
||||||
|
|
||||||
Respository Locations
|
Backup Repository Locations
|
||||||
~~~~~~~~~~~~~~~~~~~~~
|
---------------------------
|
||||||
|
|
||||||
The client uses the following notation to specify a datastore repository
|
The client uses the following notation to specify a datastore repository
|
||||||
on the backup server.
|
on the backup server.
|
||||||
|
|
||||||
[[username@]server:]datastore
|
[[username@]server[:port]:]datastore
|
||||||
|
|
||||||
The default value for ``username`` ist ``root``. If no server is specified, the
|
The default value for ``username`` is ``root@pam``. If no server is specified,
|
||||||
default is the local host (``localhost``).
|
the default is the local host (``localhost``).
|
||||||
|
|
||||||
You can pass the repository with the ``--repository`` command
|
You can specify a port if your backup server is only reachable on a different
|
||||||
line option, or by setting the ``PBS_REPOSITORY`` environment
|
port (e.g. with NAT and port forwarding).
|
||||||
variable.
|
|
||||||
|
|
||||||
|
Note that if the server is an IPv6 address, you have to write it with square
|
||||||
|
brackets (for example, `[fe80::01]`).
|
||||||
|
|
||||||
|
You can pass the repository with the ``--repository`` command line option, or
|
||||||
|
by setting the ``PBS_REPOSITORY`` environment variable.
|
||||||
|
|
||||||
|
Here some examples of valid repositories and the real values
|
||||||
|
|
||||||
|
================================ ================== ================== ===========
|
||||||
|
Example User Host:Port Datastore
|
||||||
|
================================ ================== ================== ===========
|
||||||
|
mydatastore ``root@pam`` localhost:8007 mydatastore
|
||||||
|
myhostname:mydatastore ``root@pam`` myhostname:8007 mydatastore
|
||||||
|
user@pbs@myhostname:mydatastore ``user@pbs`` myhostname:8007 mydatastore
|
||||||
|
user\@pbs!token@host:store ``user@pbs!token`` myhostname:8007 mydatastore
|
||||||
|
192.168.55.55:1234:mydatastore ``root@pam`` 192.168.55.55:1234 mydatastore
|
||||||
|
[ff80::51]:mydatastore ``root@pam`` [ff80::51]:8007 mydatastore
|
||||||
|
[ff80::51]:1234:mydatastore ``root@pam`` [ff80::51]:1234 mydatastore
|
||||||
|
================================ ================== ================== ===========
|
||||||
|
|
||||||
Environment Variables
|
Environment Variables
|
||||||
~~~~~~~~~~~~~~~~~~~~~
|
---------------------
|
||||||
|
|
||||||
``PBS_REPOSITORY``
|
``PBS_REPOSITORY``
|
||||||
The default backup repository.
|
The default backup repository.
|
||||||
|
|
||||||
``PBS_PASSWORD``
|
``PBS_PASSWORD``
|
||||||
When set, this value is used for the password required for the
|
When set, this value is used for the password required for the backup server.
|
||||||
backup server.
|
You can also set this to a API token secret.
|
||||||
|
|
||||||
``PBS_ENCRYPTION_PASSWORD``
|
``PBS_ENCRYPTION_PASSWORD``
|
||||||
When set, this value is used to access the secret encryption key (if
|
When set, this value is used to access the secret encryption key (if
|
||||||
protected by password).
|
protected by password).
|
||||||
|
|
||||||
``PBS_FINGERPRINT`` When set, this value is used to verify the server
|
``PBS_FINGERPRINT`` When set, this value is used to verify the server
|
||||||
certificate (only used if the system CA certificates cannot
|
certificate (only used if the system CA certificates cannot validate the
|
||||||
validate the certificate).
|
certificate).
|
||||||
|
|
||||||
|
|
||||||
Output Format
|
Output Format
|
||||||
~~~~~~~~~~~~~
|
-------------
|
||||||
|
|
||||||
Most commands support the ``--output-format`` parameter. It accepts
|
.. include:: output-format.rst
|
||||||
the following values:
|
|
||||||
|
|
||||||
:``text``: Text format (default). Structured data is rendered as a table.
|
|
||||||
|
|
||||||
:``json``: JSON (single line).
|
|
||||||
|
|
||||||
:``json-pretty``: JSON (multiple lines, nicely formatted).
|
|
||||||
|
|
||||||
|
|
||||||
Please use the following environment variables to modify output behavior:
|
.. _client_creating_backups:
|
||||||
|
|
||||||
``PROXMOX_OUTPUT_FORMAT``
|
|
||||||
Defines the default output format.
|
|
||||||
|
|
||||||
``PROXMOX_OUTPUT_NO_BORDER``
|
|
||||||
If set (to any value), do not render table borders.
|
|
||||||
|
|
||||||
``PROXMOX_OUTPUT_NO_HEADER``
|
|
||||||
If set (to any value), do not render table headers.
|
|
||||||
|
|
||||||
.. note:: The ``text`` format is designed to be human readable, and
|
|
||||||
not meant to be parsed by automation tools. Please use the ``json``
|
|
||||||
format if you need to process the output.
|
|
||||||
|
|
||||||
|
|
||||||
.. _creating-backups:
|
|
||||||
|
|
||||||
Creating Backups
|
Creating Backups
|
||||||
~~~~~~~~~~~~~~~~
|
----------------
|
||||||
|
|
||||||
This section explains how to create a backup from within the machine. This can
|
This section explains how to create a backup from within the machine. This can
|
||||||
be a physical host, a virtual machine, or a container. Such backups may contain file
|
be a physical host, a virtual machine, or a container. Such backups may contain file
|
||||||
and image archives. There are no restrictions in this case.
|
and image archives. There are no restrictions in this case.
|
||||||
|
|
||||||
.. note:: If you want to backup virtual machines or containers on Proxmov VE, see :ref:`pve-integration`.
|
.. note:: If you want to backup virtual machines or containers on Proxmox VE, see :ref:`pve-integration`.
|
||||||
|
|
||||||
For the following example you need to have a backup server set up, working
|
For the following example you need to have a backup server set up, working
|
||||||
credentials and need to know the repository name.
|
credentials and need to know the repository name.
|
||||||
@ -412,17 +104,19 @@ This will prompt you for a password and then uploads a file archive named
|
|||||||
|
|
||||||
The ``--repository`` option can get quite long and is used by all
|
The ``--repository`` option can get quite long and is used by all
|
||||||
commands. You can avoid having to enter this value by setting the
|
commands. You can avoid having to enter this value by setting the
|
||||||
environment variable ``PBS_REPOSITORY``.
|
environment variable ``PBS_REPOSITORY``. Note that if you would like this to remain set
|
||||||
|
over multiple sessions, you should instead add the below line to your
|
||||||
|
``.bashrc`` file.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# export PBS_REPOSTORY=backup-server:store1
|
# export PBS_REPOSITORY=backup-server:store1
|
||||||
|
|
||||||
After this you can execute all commands without specifying the ``--repository``
|
After this you can execute all commands without specifying the ``--repository``
|
||||||
option.
|
option.
|
||||||
|
|
||||||
One single backup is allowed to contain more than one archive. For example, if
|
One single backup is allowed to contain more than one archive. For example, if
|
||||||
you want to backup two disks mounted at ``/mmt/disk1`` and ``/mnt/disk2``:
|
you want to backup two disks mounted at ``/mnt/disk1`` and ``/mnt/disk2``:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -443,11 +137,12 @@ device images. To create a backup of a block device run the following command:
|
|||||||
|
|
||||||
# proxmox-backup-client backup mydata.img:/dev/mylvm/mydata
|
# proxmox-backup-client backup mydata.img:/dev/mylvm/mydata
|
||||||
|
|
||||||
|
|
||||||
Excluding files/folders from a backup
|
Excluding files/folders from a backup
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Sometimes it is desired to exclude certain files or folders from a backup archive.
|
Sometimes it is desired to exclude certain files or folders from a backup archive.
|
||||||
To tell the Proxmox backup client when and how to ignore files and directories,
|
To tell the Proxmox Backup client when and how to ignore files and directories,
|
||||||
place a text file called ``.pxarexclude`` in the filesystem hierarchy.
|
place a text file called ``.pxarexclude`` in the filesystem hierarchy.
|
||||||
Whenever the backup client encounters such a file in a directory, it interprets
|
Whenever the backup client encounters such a file in a directory, it interprets
|
||||||
each line as glob match patterns for files and directories that are to be excluded
|
each line as glob match patterns for files and directories that are to be excluded
|
||||||
@ -469,17 +164,17 @@ the given patterns. It is only possible to match files in this directory and its
|
|||||||
all files ending in ``.tmp`` within the directory or subdirectories with the
|
all files ending in ``.tmp`` within the directory or subdirectories with the
|
||||||
following pattern ``**/*.tmp``.
|
following pattern ``**/*.tmp``.
|
||||||
``[...]`` matches a single character from any of the provided characters within
|
``[...]`` matches a single character from any of the provided characters within
|
||||||
the brackets. ``[!...]`` does the complementary and matches any singe character
|
the brackets. ``[!...]`` does the complementary and matches any single character
|
||||||
not contained within the brackets. It is also possible to specify ranges with two
|
not contained within the brackets. It is also possible to specify ranges with two
|
||||||
characters separated by ``-``. For example, ``[a-z]`` matches any lowercase
|
characters separated by ``-``. For example, ``[a-z]`` matches any lowercase
|
||||||
alphabetic character and ``[0-9]`` matches any one single digit.
|
alphabetic character and ``[0-9]`` matches any one single digit.
|
||||||
|
|
||||||
The order of the glob match patterns defines if a file is included or
|
The order of the glob match patterns defines whether a file is included or
|
||||||
excluded, later entries win over previous ones.
|
excluded, that is to say later entries override previous ones.
|
||||||
This is also true for match patterns encountered deeper down the directory tree,
|
This is also true for match patterns encountered deeper down the directory tree,
|
||||||
which can override a previous exclusion.
|
which can override a previous exclusion.
|
||||||
Be aware that excluded directories will **not** be read by the backup client.
|
Be aware that excluded directories will **not** be read by the backup client.
|
||||||
A ``.pxarexclude`` file in a subdirectory will have no effect.
|
Thus, a ``.pxarexclude`` file in an excluded subdirectory will have no effect.
|
||||||
``.pxarexclude`` files are treated as regular files and will be included in the
|
``.pxarexclude`` files are treated as regular files and will be included in the
|
||||||
backup archive.
|
backup archive.
|
||||||
|
|
||||||
@ -528,11 +223,14 @@ Restoring this backup will result in:
|
|||||||
restored/subfolder1:
|
restored/subfolder1:
|
||||||
. .. file2
|
. .. file2
|
||||||
|
|
||||||
Encryption
|
|
||||||
^^^^^^^^^^
|
|
||||||
|
|
||||||
Proxmox backup supports client side encryption with AES-256 in GCM_
|
.. _client_encryption:
|
||||||
mode. First you need to create an encryption key:
|
|
||||||
|
Encryption
|
||||||
|
----------
|
||||||
|
|
||||||
|
Proxmox Backup supports client-side encryption with AES-256 in GCM_
|
||||||
|
mode. To set this up, you first need to create an encryption key:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -546,6 +244,8 @@ extra protection, you can also create it without a password:
|
|||||||
|
|
||||||
# proxmox-backup-client key create /path/to/my-backup.key --kdf none
|
# proxmox-backup-client key create /path/to/my-backup.key --kdf none
|
||||||
|
|
||||||
|
Having created this key, it is now possible to create an encrypted backup, by
|
||||||
|
passing the ``--keyfile`` parameter, with the path to the key file.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -554,27 +254,129 @@ extra protection, you can also create it without a password:
|
|||||||
Encryption Key Password: **************
|
Encryption Key Password: **************
|
||||||
...
|
...
|
||||||
|
|
||||||
|
.. Note:: If you do not specify the name of the backup key, the key will be
|
||||||
|
created in the default location
|
||||||
|
``~/.config/proxmox-backup/encryption-key.json``. ``proxmox-backup-client``
|
||||||
|
will also search this location by default, in case the ``--keyfile``
|
||||||
|
parameter is not specified.
|
||||||
|
|
||||||
You can avoid entering the passwords by setting the environment
|
You can avoid entering the passwords by setting the environment
|
||||||
variables ``PBS_PASSWORD`` and ``PBS_ENCRYPTION_PASSWORD``.
|
variables ``PBS_PASSWORD`` and ``PBS_ENCRYPTION_PASSWORD``.
|
||||||
|
|
||||||
.. todo:: Explain master-key
|
|
||||||
|
Using a master key to store and recover encryption keys
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
You can also use ``proxmox-backup-client key`` to create an RSA public/private
|
||||||
|
key pair, which can be used to store an encrypted version of the symmetric
|
||||||
|
backup encryption key alongside each backup and recover it later.
|
||||||
|
|
||||||
|
To set up a master key:
|
||||||
|
|
||||||
|
1. Create an encryption key for the backup:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# proxmox-backup-client key create
|
||||||
|
creating default key at: "~/.config/proxmox-backup/encryption-key.json"
|
||||||
|
Encryption Key Password: **********
|
||||||
|
...
|
||||||
|
|
||||||
|
The resulting file will be saved to ``~/.config/proxmox-backup/encryption-key.json``.
|
||||||
|
|
||||||
|
2. Create an RSA public/private key pair:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# proxmox-backup-client key create-master-key
|
||||||
|
Master Key Password: *********
|
||||||
|
...
|
||||||
|
|
||||||
|
This will create two files in your current directory, ``master-public.pem``
|
||||||
|
and ``master-private.pem``.
|
||||||
|
|
||||||
|
3. Import the newly created ``master-public.pem`` public certificate, so that
|
||||||
|
``proxmox-backup-client`` can find and use it upon backup.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# proxmox-backup-client key import-master-pubkey /path/to/master-public.pem
|
||||||
|
Imported public master key to "~/.config/proxmox-backup/master-public.pem"
|
||||||
|
|
||||||
|
4. With all these files in place, run a backup job:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# proxmox-backup-client backup etc.pxar:/etc
|
||||||
|
|
||||||
|
The key will be stored in your backup, under the name ``rsa-encrypted.key``.
|
||||||
|
|
||||||
|
.. Note:: The ``--keyfile`` parameter can be excluded, if the encryption key
|
||||||
|
is in the default path. If you specified another path upon creation, you
|
||||||
|
must pass the ``--keyfile`` parameter.
|
||||||
|
|
||||||
|
5. To test that everything worked, you can restore the key from the backup:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# proxmox-backup-client restore /path/to/backup/ rsa-encrypted.key /path/to/target
|
||||||
|
|
||||||
|
.. Note:: You should not need an encryption key to extract this file. However, if
|
||||||
|
a key exists at the default location
|
||||||
|
(``~/.config/proxmox-backup/encryption-key.json``) the program will prompt
|
||||||
|
you for an encryption key password. Simply moving ``encryption-key.json``
|
||||||
|
out of this directory will fix this issue.
|
||||||
|
|
||||||
|
6. Then, use the previously generated master key to decrypt the file:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# proxmox-backup-client key import-with-master-key /path/to/target --master-keyfile /path/to/master-private.pem --encrypted-keyfile /path/to/rsa-encrypted.key
|
||||||
|
Master Key Password: ******
|
||||||
|
New Password: ******
|
||||||
|
Verify Password: ******
|
||||||
|
|
||||||
|
7. The target file will now contain the encryption key information in plain
|
||||||
|
text. The success of this can be confirmed by passing the resulting ``json``
|
||||||
|
file, with the ``--keyfile`` parameter, when decrypting files from the backup.
|
||||||
|
|
||||||
|
.. warning:: Without their key, backed up files will be inaccessible. Thus, you should
|
||||||
|
keep keys ordered and in a place that is separate from the contents being
|
||||||
|
backed up. It can happen, for example, that you back up an entire system, using
|
||||||
|
a key on that system. If the system then becomes inaccessible for any reason
|
||||||
|
and needs to be restored, this will not be possible as the encryption key will be
|
||||||
|
lost along with the broken system.
|
||||||
|
|
||||||
|
It is recommended that you keep your master key safe, but easily accessible, in
|
||||||
|
order for quick disaster recovery. For this reason, the best place to store it
|
||||||
|
is in your password manager, where it is immediately recoverable. As a backup to
|
||||||
|
this, you should also save the key to a USB drive and store that in a secure
|
||||||
|
place. This way, it is detached from any system, but is still easy to recover
|
||||||
|
from, in case of emergency. Finally, in preparation for the worst case scenario,
|
||||||
|
you should also consider keeping a paper copy of your master key locked away in
|
||||||
|
a safe place. The ``paperkey`` subcommand can be used to create a QR encoded
|
||||||
|
version of your master key. The following command sends the output of the
|
||||||
|
``paperkey`` command to a text file, for easy printing.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
proxmox-backup-client key paperkey --output-format text > qrkey.txt
|
||||||
|
|
||||||
|
|
||||||
Restoring Data
|
Restoring Data
|
||||||
~~~~~~~~~~~~~~
|
--------------
|
||||||
|
|
||||||
The regular creation of backups is a necessary step to avoid data
|
The regular creation of backups is a necessary step to avoiding data
|
||||||
loss. More important, however, is the restoration. It is good practice to perform
|
loss. More importantly, however, is the restoration. It is good practice to perform
|
||||||
periodic recovery tests to ensure that you can access the data in
|
periodic recovery tests to ensure that you can access the data in
|
||||||
case of problems.
|
case of problems.
|
||||||
|
|
||||||
First, you need to find the snapshot which you want to restore. The snapshot
|
First, you need to find the snapshot which you want to restore. The snapshot
|
||||||
command gives a list of all snapshots on the server:
|
list command provides a list of all the snapshots on the server:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# proxmox-backup-client snapshots
|
# proxmox-backup-client snapshot list
|
||||||
┌────────────────────────────────┬─────────────┬────────────────────────────────────┐
|
┌────────────────────────────────┬─────────────┬────────────────────────────────────┐
|
||||||
│ snapshot │ size │ files │
|
│ snapshot │ size │ files │
|
||||||
╞════════════════════════════════╪═════════════╪════════════════════════════════════╡
|
╞════════════════════════════════╪═════════════╪════════════════════════════════════╡
|
||||||
@ -602,8 +404,8 @@ backup.
|
|||||||
|
|
||||||
# proxmox-backup-client restore host/elsa/2019-12-03T09:35:01Z root.pxar /target/path/
|
# proxmox-backup-client restore host/elsa/2019-12-03T09:35:01Z root.pxar /target/path/
|
||||||
|
|
||||||
To get the contents of any archive you can restore the ``ìndex.json`` file in the
|
To get the contents of any archive, you can restore the ``index.json`` file in the
|
||||||
repository and restore it to '-'. This will dump the content to the standard output.
|
repository to the target path '-'. This will dump the contents to the standard output.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -611,7 +413,7 @@ repository and restore it to '-'. This will dump the content to the standard out
|
|||||||
|
|
||||||
|
|
||||||
Interactive Restores
|
Interactive Restores
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
If you only want to restore a few individual files, it is often easier
|
If you only want to restore a few individual files, it is often easier
|
||||||
to use the interactive recovery shell.
|
to use the interactive recovery shell.
|
||||||
@ -624,7 +426,7 @@ to use the interactive recovery shell.
|
|||||||
bin boot dev etc home lib lib32
|
bin boot dev etc home lib lib32
|
||||||
...
|
...
|
||||||
|
|
||||||
The interactive recovery shell is a minimalistic command line interface that
|
The interactive recovery shell is a minimal command line interface that
|
||||||
utilizes the metadata stored in the catalog to quickly list, navigate and
|
utilizes the metadata stored in the catalog to quickly list, navigate and
|
||||||
search files in a file archive.
|
search files in a file archive.
|
||||||
To restore files, you can select them individually or match them with a glob
|
To restore files, you can select them individually or match them with a glob
|
||||||
@ -640,7 +442,7 @@ working directory and list directory contents in the archive.
|
|||||||
``pwd`` shows the full path of the current working directory with respect to the
|
``pwd`` shows the full path of the current working directory with respect to the
|
||||||
archive root.
|
archive root.
|
||||||
|
|
||||||
Being able to quickly search the contents of the archive is a often needed feature.
|
Being able to quickly search the contents of the archive is a commonly needed feature.
|
||||||
That's where the catalog is most valuable.
|
That's where the catalog is most valuable.
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
@ -659,40 +461,39 @@ subdirectory and add the corresponding pattern to the list for subsequent restor
|
|||||||
all files in the archive matching the patterns to ``/target/path`` on the local
|
all files in the archive matching the patterns to ``/target/path`` on the local
|
||||||
host. This will scan the whole archive.
|
host. This will scan the whole archive.
|
||||||
|
|
||||||
With ``restore /target/path`` you can restore the sub-archive given by the current
|
The ``restore`` command can be used to restore all the files contained within
|
||||||
working directory to the local target path ``/target/path`` on your host.
|
the backup archive. This is most helpful when paired with the ``--pattern
|
||||||
By additionally passing a glob pattern with ``--pattern <glob>``, the restore is
|
<glob>`` option, as it allows you to restore all files matching a specific
|
||||||
further limited to files matching the pattern.
|
pattern. For example, if you wanted to restore configuration files
|
||||||
For example:
|
located in ``/etc``, you could do the following:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
pxar:/ > cd /etc/
|
pxar:/ > restore target/ --pattern etc/**/*.conf
|
||||||
pxar:/etc/ > restore /target/ --pattern **/*.conf
|
|
||||||
...
|
...
|
||||||
|
|
||||||
The above will scan trough all the directories below ``/etc`` and restore all
|
The above will scan through all the directories below ``/etc`` and restore all
|
||||||
files ending in ``.conf``.
|
files ending in ``.conf``.
|
||||||
|
|
||||||
.. todo:: Explain interactive restore in more detail
|
.. todo:: Explain interactive restore in more detail
|
||||||
|
|
||||||
Mounting of Archives via FUSE
|
Mounting of Archives via FUSE
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
The :term:`FUSE` implementation for the pxar archive allows you to mount a
|
The :term:`FUSE` implementation for the pxar archive allows you to mount a
|
||||||
file archive as a read-only filesystem to a mountpoint on your host.
|
file archive as a read-only filesystem to a mountpoint on your host.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# proxmox-backup-client mount host/backup-client/2020-01-29T11:29:22Z root.pxar /mnt
|
# proxmox-backup-client mount host/backup-client/2020-01-29T11:29:22Z root.pxar /mnt/mountpoint
|
||||||
# ls /mnt
|
# ls /mnt/mountpoint
|
||||||
bin dev home lib32 libx32 media opt root sbin sys usr
|
bin dev home lib32 libx32 media opt root sbin sys usr
|
||||||
boot etc lib lib64 lost+found mnt proc run srv tmp var
|
boot etc lib lib64 lost+found mnt proc run srv tmp var
|
||||||
|
|
||||||
This allows you to access the full content of the archive in a seamless manner.
|
This allows you to access the full contents of the archive in a seamless manner.
|
||||||
|
|
||||||
.. note:: As the FUSE connection needs to fetch and decrypt chunks from the
|
.. note:: As the FUSE connection needs to fetch and decrypt chunks from the
|
||||||
backup servers datastore, this can cause some additional network and CPU
|
backup server's datastore, this can cause some additional network and CPU
|
||||||
load on your host, depending on the operations you perform on the mounted
|
load on your host, depending on the operations you perform on the mounted
|
||||||
filesystem.
|
filesystem.
|
||||||
|
|
||||||
@ -700,10 +501,10 @@ To unmount the filesystem use the ``umount`` command on the mountpoint:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# umount /mnt
|
# umount /mnt/mountpoint
|
||||||
|
|
||||||
Login and Logout
|
Login and Logout
|
||||||
~~~~~~~~~~~~~~~~
|
----------------
|
||||||
|
|
||||||
The client tool prompts you to enter the logon password as soon as you
|
The client tool prompts you to enter the logon password as soon as you
|
||||||
want to access the backup server. The server checks your credentials
|
want to access the backup server. The server checks your credentials
|
||||||
@ -726,23 +527,48 @@ To remove the ticket, issue a logout:
|
|||||||
# proxmox-backup-client logout
|
# proxmox-backup-client logout
|
||||||
|
|
||||||
|
|
||||||
|
.. _changing-backup-owner:
|
||||||
|
|
||||||
|
Changing the Owner of a Backup Group
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
By default, the owner of a backup group is the user which was used to originally
|
||||||
|
create that backup group (or in the case of sync jobs, ``root@pam``). This
|
||||||
|
means that if a user ``mike@pbs`` created a backup, another user ``john@pbs``
|
||||||
|
can not be used to create backups in that same backup group. In case you want
|
||||||
|
to change the owner of a backup, you can do so with the below command, using a
|
||||||
|
user that has ``Datastore.Modify`` privileges on the datastore.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# proxmox-backup-client change-owner vm/103 john@pbs
|
||||||
|
|
||||||
|
This can also be done from within the web interface, by navigating to the
|
||||||
|
`Content` section of the datastore that contains the backup group and
|
||||||
|
selecting the user icon under the `Actions` column. Common cases for this could
|
||||||
|
be to change the owner of a sync job from ``root@pam``, or to repurpose a
|
||||||
|
backup group.
|
||||||
|
|
||||||
|
|
||||||
|
.. _backup-pruning:
|
||||||
|
|
||||||
Pruning and Removing Backups
|
Pruning and Removing Backups
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
----------------------------
|
||||||
|
|
||||||
You can manually delete a backup snapshot using the ``forget``
|
You can manually delete a backup snapshot using the ``forget``
|
||||||
command:
|
command:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# proxmox-backup-client forget <snapshot>
|
# proxmox-backup-client snapshot forget <snapshot>
|
||||||
|
|
||||||
|
|
||||||
.. caution:: This command removes all archives in this backup
|
.. caution:: This command removes all archives in this backup
|
||||||
snapshot. They will be inaccessible and unrecoverable.
|
snapshot. They will be inaccessible and unrecoverable.
|
||||||
|
|
||||||
|
|
||||||
The manual removal is sometimes required, but normally the prune
|
Although manual removal is sometimes required, the ``prune``
|
||||||
command is used to systematically delete older backups. Prune lets
|
command is normally used to systematically delete older backups. Prune lets
|
||||||
you specify which backup snapshots you want to keep. The
|
you specify which backup snapshots you want to keep. The
|
||||||
following retention options are available:
|
following retention options are available:
|
||||||
|
|
||||||
@ -787,7 +613,7 @@ backup is retained.
|
|||||||
|
|
||||||
|
|
||||||
You can use the ``--dry-run`` option to test your settings. This only
|
You can use the ``--dry-run`` option to test your settings. This only
|
||||||
shows the list of existing snapshots and which action prune would take.
|
shows the list of existing snapshots and what actions prune would take.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -808,13 +634,13 @@ shows the list of existing snapshots and which action prune would take.
|
|||||||
|
|
||||||
.. note:: Neither the ``prune`` command nor the ``forget`` command free space
|
.. note:: Neither the ``prune`` command nor the ``forget`` command free space
|
||||||
in the chunk-store. The chunk-store still contains the data blocks. To free
|
in the chunk-store. The chunk-store still contains the data blocks. To free
|
||||||
space you need to perform :ref:`garbage-collection`.
|
space you need to perform :ref:`client_garbage-collection`.
|
||||||
|
|
||||||
|
|
||||||
.. _garbage-collection:
|
.. _client_garbage-collection:
|
||||||
|
|
||||||
Garbage Collection
|
Garbage Collection
|
||||||
~~~~~~~~~~~~~~~~~~
|
------------------
|
||||||
|
|
||||||
The ``prune`` command removes only the backup index files, not the data
|
The ``prune`` command removes only the backup index files, not the data
|
||||||
from the datastore. This task is left to the garbage collection
|
from the datastore. This task is left to the garbage collection
|
||||||
@ -829,6 +655,17 @@ unused data blocks are removed.
|
|||||||
depending on the number of chunks and the speed of the underlying
|
depending on the number of chunks and the speed of the underlying
|
||||||
disks.
|
disks.
|
||||||
|
|
||||||
|
.. note:: The garbage collection will only remove chunks that haven't been used
|
||||||
|
for at least one day (exactly 24h 5m). This grace period is necessary because
|
||||||
|
chunks in use are marked by touching the chunk which updates the ``atime``
|
||||||
|
(access time) property. Filesystems are mounted with the ``relatime`` option
|
||||||
|
by default. This results in a better performance by only updating the
|
||||||
|
``atime`` property if the last access has been at least 24 hours ago. The
|
||||||
|
downside is, that touching a chunk within these 24 hours will not always
|
||||||
|
update its ``atime`` property.
|
||||||
|
|
||||||
|
Chunks in the grace period will be logged at the end of the garbage
|
||||||
|
collection task as *Pending removals*.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -849,54 +686,52 @@ unused data blocks are removed.
|
|||||||
TASK OK
|
TASK OK
|
||||||
|
|
||||||
|
|
||||||
.. todo:: howto run garbage-collection at regular intervalls (cron)
|
.. todo:: howto run garbage-collection at regular intervals (cron)
|
||||||
|
|
||||||
|
Benchmarking
|
||||||
|
------------
|
||||||
|
|
||||||
.. _pve-integration:
|
The backup client also comes with a benchmarking tool. This tool measures
|
||||||
|
various metrics relating to compression and encryption speeds. If a Proxmox
|
||||||
|
Backup repository (remote or local) is specified, the TLS upload speed will get
|
||||||
|
measured too.
|
||||||
|
|
||||||
`Proxmox VE`_ integration
|
You can run a benchmark using the ``benchmark`` subcommand of
|
||||||
-------------------------
|
``proxmox-backup-client``:
|
||||||
|
|
||||||
You need to define a new storage with type 'pbs' on your `Proxmox VE`_
|
.. note:: The TLS speed test is only included if a :ref:`backup server
|
||||||
node. The following example uses ``store2`` as storage name, and
|
repository is specified <client_repository>`.
|
||||||
assumes the server address is ``localhost``, and you want to connect
|
|
||||||
as ``user1@pbs``.
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# pvesm add pbs store2 --server localhost --datastore store2
|
# proxmox-backup-client benchmark
|
||||||
# pvesm set store2 --username user1@pbs --password <secret>
|
Uploaded 1517 chunks in 5 seconds.
|
||||||
|
Time per request: 3309 microseconds.
|
||||||
If your backup server uses a self signed certificate, you need to add
|
TLS speed: 1267.41 MB/s
|
||||||
the certificate fingerprint to the configuration. You can get the
|
SHA256 speed: 2066.73 MB/s
|
||||||
fingerprint by running the following command on the backup server:
|
Compression speed: 775.11 MB/s
|
||||||
|
Decompress speed: 1233.35 MB/s
|
||||||
.. code-block:: console
|
AES256/GCM speed: 3688.27 MB/s
|
||||||
|
Verify speed: 783.43 MB/s
|
||||||
# proxmox-backup-manager cert info |grep Fingerprint
|
┌───────────────────────────────────┬─────────────────────┐
|
||||||
Fingerprint (sha256): 64:d3:ff:3a:50:38:53:5a:9b:f7:50:...:ab:fe
|
│ Name │ Value │
|
||||||
|
╞═══════════════════════════════════╪═════════════════════╡
|
||||||
Please add that fingerprint to your configuration to establish a trust
|
│ TLS (maximal backup upload speed) │ 1267.41 MB/s (103%) │
|
||||||
relationship:
|
├───────────────────────────────────┼─────────────────────┤
|
||||||
|
│ SHA256 checksum computation speed │ 2066.73 MB/s (102%) │
|
||||||
.. code-block:: console
|
├───────────────────────────────────┼─────────────────────┤
|
||||||
|
│ ZStd level 1 compression speed │ 775.11 MB/s (103%) │
|
||||||
# pvesm set store2 --fingerprint 64:d3:ff:3a:50:38:53:5a:9b:f7:50:...:ab:fe
|
├───────────────────────────────────┼─────────────────────┤
|
||||||
|
│ ZStd level 1 decompression speed │ 1233.35 MB/s (103%) │
|
||||||
After that you should be able to see storage status with:
|
├───────────────────────────────────┼─────────────────────┤
|
||||||
|
│ Chunk verification speed │ 783.43 MB/s (103%) │
|
||||||
.. code-block:: console
|
├───────────────────────────────────┼─────────────────────┤
|
||||||
|
│ AES256 GCM encryption speed │ 3688.27 MB/s (101%) │
|
||||||
# pvesm status --storage store2
|
└───────────────────────────────────┴─────────────────────┘
|
||||||
Name Type Status Total Used Available %
|
|
||||||
store2 pbs active 3905109820 1336687816 2568422004 34.23%
|
|
||||||
|
|
||||||
|
|
||||||
|
.. note:: The percentages given in the output table correspond to a
|
||||||
|
comparison against a Ryzen 7 2700X.
|
||||||
|
|
||||||
.. include:: command-line-tools.rst
|
You can also pass the ``--output-format`` parameter to output stats in ``json``,
|
||||||
|
rather than the default table format.
|
||||||
.. include:: services.rst
|
|
||||||
|
|
||||||
.. include host system admin at the end
|
|
||||||
|
|
||||||
.. include:: sysadmin.rst
|
|
@ -1,19 +1,140 @@
|
|||||||
Backup Protocol
|
Backup Protocol
|
||||||
===============
|
===============
|
||||||
|
|
||||||
.. todo:: add introduction to HTTP2 based backup protocols
|
Proxmox Backup Server uses a REST based API. While the management
|
||||||
|
interface use normal HTTP, the actual backup and restore interface use
|
||||||
|
HTTP/2 for improved performance. Both HTTP and HTTP/2 are well known
|
||||||
|
standards, so the following section assumes that you are familiar on
|
||||||
|
how to use them.
|
||||||
|
|
||||||
|
|
||||||
Backup Protocol API
|
Backup Protocol API
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
.. todo:: describe backup writer protocol
|
To start a new backup, the API call ``GET /api2/json/backup`` needs to
|
||||||
|
be upgraded to a HTTP/2 connection using
|
||||||
|
``proxmox-backup-protocol-v1`` as protocol name::
|
||||||
|
|
||||||
.. include:: backup-protocol-api.rst
|
GET /api2/json/backup HTTP/1.1
|
||||||
|
UPGRADE: proxmox-backup-protocol-v1
|
||||||
|
|
||||||
|
The server replies with HTTP 101 Switching Protocol status code,
|
||||||
|
and you can then issue REST commands on that updated HTTP/2 connection.
|
||||||
|
|
||||||
|
The backup protocol allows you to upload three different kind of files:
|
||||||
|
|
||||||
|
- Chunks and blobs (binary data)
|
||||||
|
|
||||||
|
- Fixed Indexes (List of chunks with fixed size)
|
||||||
|
|
||||||
|
- Dynamic Indexes (List of chunk with variable size)
|
||||||
|
|
||||||
|
The following section gives a short introduction how to upload such
|
||||||
|
files. Please use the `API Viewer <api-viewer/index.html>`_ for
|
||||||
|
details about available REST commands.
|
||||||
|
|
||||||
|
|
||||||
Reader Protocol API
|
Upload Blobs
|
||||||
-------------------
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
.. todo:: describe backup reader protocol
|
Uploading blobs is done using ``POST /blob``. The HTTP body contains the
|
||||||
|
data encoded as :ref:`Data Blob <data-blob-format>`).
|
||||||
|
|
||||||
.. include:: reader-protocol-api.rst
|
The file name needs to end with ``.blob``, and is automatically added
|
||||||
|
to the backup manifest.
|
||||||
|
|
||||||
|
|
||||||
|
Upload Chunks
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Chunks belong to an index, so you first need to open an index (see
|
||||||
|
below). After that, you can upload chunks using ``POST /fixed_chunk``
|
||||||
|
and ``POST /dynamic_chunk``. The HTTP body contains the chunk data
|
||||||
|
encoded as :ref:`Data Blob <data-blob-format>`).
|
||||||
|
|
||||||
|
|
||||||
|
Upload Fixed Indexes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Fixed indexes are use to store VM image data. The VM image is split
|
||||||
|
into equally sized chunks, which are uploaded individually. The index
|
||||||
|
file simply contains a list to chunk digests.
|
||||||
|
|
||||||
|
You create a fixed index with ``POST /fixed_index``. Then upload
|
||||||
|
chunks with ``POST /fixed_chunk``, and append them to the index with
|
||||||
|
``PUT /fixed_index``. When finished, you need to close the index using
|
||||||
|
``POST /fixed_close``.
|
||||||
|
|
||||||
|
The file name needs to end with ``.fidx``, and is automatically added
|
||||||
|
to the backup manifest.
|
||||||
|
|
||||||
|
|
||||||
|
Upload Dynamic Indexes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Dynamic indexes are use to store file archive data. The archive data
|
||||||
|
is split into dynamically sized chunks, which are uploaded
|
||||||
|
individually. The index file simply contains a list to chunk digests
|
||||||
|
and offsets.
|
||||||
|
|
||||||
|
You create a dynamic sized index with ``POST /dynamic_index``. Then
|
||||||
|
upload chunks with ``POST /dynamic_chunk``, and append them to the index with
|
||||||
|
``PUT /dynamic_index``. When finished, you need to close the index using
|
||||||
|
``POST /dynamic_close``.
|
||||||
|
|
||||||
|
The file name needs to end with ``.didx``, and is automatically added
|
||||||
|
to the backup manifest.
|
||||||
|
|
||||||
|
Finish Backup
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Once you have uploaded all data, you need to call ``POST
|
||||||
|
/finish``. This commits all data and ends the backup protocol.
|
||||||
|
|
||||||
|
|
||||||
|
Restore/Reader Protocol API
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
To start a new reader, the API call ``GET /api2/json/reader`` needs to
|
||||||
|
be upgraded to a HTTP/2 connection using
|
||||||
|
``proxmox-backup-reader-protocol-v1`` as protocol name::
|
||||||
|
|
||||||
|
GET /api2/json/reader HTTP/1.1
|
||||||
|
UPGRADE: proxmox-backup-reader-protocol-v1
|
||||||
|
|
||||||
|
The server replies with HTTP 101 Switching Protocol status code,
|
||||||
|
and you can then issue REST commands on that updated HTTP/2 connection.
|
||||||
|
|
||||||
|
The reader protocol allows you to download three different kind of files:
|
||||||
|
|
||||||
|
- Chunks and blobs (binary data)
|
||||||
|
|
||||||
|
- Fixed Indexes (List of chunks with fixed size)
|
||||||
|
|
||||||
|
- Dynamic Indexes (List of chunk with variable size)
|
||||||
|
|
||||||
|
The following section gives a short introduction how to download such
|
||||||
|
files. Please use the `API Viewer <api-viewer/index.html>`_ for details about
|
||||||
|
available REST commands.
|
||||||
|
|
||||||
|
|
||||||
|
Download Blobs
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Downloading blobs is done using ``GET /download``. The HTTP body contains the
|
||||||
|
data encoded as :ref:`Data Blob <data-blob-format>`.
|
||||||
|
|
||||||
|
|
||||||
|
Download Chunks
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Downloading chunks is done using ``GET /chunk``. The HTTP body contains the
|
||||||
|
data encoded as :ref:`Data Blob <data-blob-format>`).
|
||||||
|
|
||||||
|
|
||||||
|
Download Index Files
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Downloading index files is done using ``GET /download``. The HTTP body
|
||||||
|
contains the data encoded as :ref:`Fixed Index <fixed-index-format>`
|
||||||
|
or :ref:`Dynamic Index <dynamic-index-format>`.
|
||||||
|
99
docs/calendarevents.rst
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
.. _calendar-event-scheduling:
|
||||||
|
|
||||||
|
Calendar Events
|
||||||
|
===============
|
||||||
|
|
||||||
|
Introduction and Format
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Certain tasks, for example pruning and garbage collection, need to be
|
||||||
|
performed on a regular basis. Proxmox Backup Server uses a format inspired
|
||||||
|
by the systemd Time and Date Specification (see `systemd.time manpage`_)
|
||||||
|
called `calendar events` for its schedules.
|
||||||
|
|
||||||
|
`Calendar events` are expressions to specify one or more points in time.
|
||||||
|
They are mostly compatible with systemd's calendar events.
|
||||||
|
|
||||||
|
The general format is as follows:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
:caption: Calendar event
|
||||||
|
|
||||||
|
[WEEKDAY] [[YEARS-]MONTHS-DAYS] [HOURS:MINUTES[:SECONDS]]
|
||||||
|
|
||||||
|
Note that there either has to be at least a weekday, date or time part.
|
||||||
|
If the weekday or date part is omitted, all (week)days are included.
|
||||||
|
If the time part is omitted, the time 00:00:00 is implied.
|
||||||
|
(e.g. '2020-01-01' refers to '2020-01-01 00:00:00')
|
||||||
|
|
||||||
|
Weekdays are specified with the abbreviated English version:
|
||||||
|
`mon, tue, wed, thu, fri, sat, sun`.
|
||||||
|
|
||||||
|
Each field can contain multiple values in the following formats:
|
||||||
|
|
||||||
|
* comma-separated: e.g., 01,02,03
|
||||||
|
* as a range: e.g., 01..10
|
||||||
|
* as a repetition: e.g, 05/10 (means starting at 5 every 10)
|
||||||
|
* and a combination of the above: e.g., 01,05..10,12/02
|
||||||
|
* or a `*` for every possible value: e.g., \*:00
|
||||||
|
|
||||||
|
There are some special values that have specific meaning:
|
||||||
|
|
||||||
|
================================= ==============================
|
||||||
|
Value Syntax
|
||||||
|
================================= ==============================
|
||||||
|
`minutely` `*-*-* *:*:00`
|
||||||
|
`hourly` `*-*-* *:00:00`
|
||||||
|
`daily` `*-*-* 00:00:00`
|
||||||
|
`weekly` `mon *-*-* 00:00:00`
|
||||||
|
`monthly` `*-*-01 00:00:00`
|
||||||
|
`yearly` or `annually` `*-01-01 00:00:00`
|
||||||
|
`quarterly` `*-01,04,07,10-01 00:00:00`
|
||||||
|
`semiannually` or `semi-annually` `*-01,07-01 00:00:00`
|
||||||
|
================================= ==============================
|
||||||
|
|
||||||
|
|
||||||
|
Here is a table with some useful examples:
|
||||||
|
|
||||||
|
======================== ============================= ===================================
|
||||||
|
Example Alternative Explanation
|
||||||
|
======================== ============================= ===================================
|
||||||
|
`mon,tue,wed,thu,fri` `mon..fri` Every working day at 00:00
|
||||||
|
`sat,sun` `sat..sun` Only on weekends at 00:00
|
||||||
|
`mon,wed,fri` -- Monday, Wednesday, Friday at 00:00
|
||||||
|
`12:05` -- Every day at 12:05 PM
|
||||||
|
`*:00/5` `0/1:0/5` Every five minutes
|
||||||
|
`mon..wed *:30/10` `mon,tue,wed *:30/10` Monday, Tuesday, Wednesday 30, 40 and 50 minutes after every full hour
|
||||||
|
`mon..fri 8..17,22:0/15` -- Every working day every 15 minutes between 8 AM and 6 PM and between 10 PM and 11 PM
|
||||||
|
`fri 12..13:5/20` `fri 12,13:5/20` Friday at 12:05, 12:25, 12:45, 13:05, 13:25 and 13:45
|
||||||
|
`12,14,16,18,20,22:5` `12/2:5` Every day starting at 12:05 until 22:05, every 2 hours
|
||||||
|
`*:*` `0/1:0/1` Every minute (minimum interval)
|
||||||
|
`*-05` -- On the 5th day of every Month
|
||||||
|
`Sat *-1..7 15:00` -- First Saturday each Month at 15:00
|
||||||
|
`2015-10-21` -- 21st October 2015 at 00:00
|
||||||
|
======================== ============================= ===================================
|
||||||
|
|
||||||
|
|
||||||
|
Differences to systemd
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Not all features of systemd calendar events are implemented:
|
||||||
|
|
||||||
|
* no Unix timestamps (e.g. `@12345`): instead use date and time to specify
|
||||||
|
a specific point in time
|
||||||
|
* no timezone: all schedules use the set timezone on the server
|
||||||
|
* no sub-second resolution
|
||||||
|
* no reverse day syntax (e.g. 2020-03~01)
|
||||||
|
* no repetition of ranges (e.g. 1..10/2)
|
||||||
|
|
||||||
|
Notes on scheduling
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
In `Proxmox Backup`_ scheduling for most tasks is done in the
|
||||||
|
`proxmox-backup-proxy`. This daemon checks all job schedules
|
||||||
|
if they are due every minute. This means that even if
|
||||||
|
`calendar events` can contain seconds, it will only be checked
|
||||||
|
once a minute.
|
||||||
|
|
||||||
|
Also, all schedules will be checked against the timezone set
|
||||||
|
in the `Proxmox Backup`_ server.
|
@ -6,13 +6,18 @@ Command Line Tools
|
|||||||
|
|
||||||
.. include:: proxmox-backup-client/description.rst
|
.. include:: proxmox-backup-client/description.rst
|
||||||
|
|
||||||
|
``proxmox-file-restore``
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. include:: proxmox-file-restore/description.rst
|
||||||
|
|
||||||
``proxmox-backup-manager``
|
``proxmox-backup-manager``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. include:: proxmox-backup-manager/description.rst
|
.. include:: proxmox-backup-manager/description.rst
|
||||||
|
|
||||||
``pxar``
|
``pxar``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
.. include:: pxar/description.rst
|
.. include:: pxar/description.rst
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ Command Syntax
|
|||||||
Catalog Shell Commands
|
Catalog Shell Commands
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Those command are available when you start an intercative restore shell:
|
Those command are available when you start an interactive restore shell:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -26,6 +26,27 @@ Those command are available when you start an intercative restore shell:
|
|||||||
.. include:: proxmox-backup-manager/synopsis.rst
|
.. include:: proxmox-backup-manager/synopsis.rst
|
||||||
|
|
||||||
|
|
||||||
|
``proxmox-tape``
|
||||||
|
----------------
|
||||||
|
|
||||||
|
.. include:: proxmox-tape/synopsis.rst
|
||||||
|
|
||||||
|
``pmt``
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. include:: pmt/options.rst
|
||||||
|
|
||||||
|
....
|
||||||
|
|
||||||
|
.. include:: pmt/synopsis.rst
|
||||||
|
|
||||||
|
|
||||||
|
``pmtx``
|
||||||
|
--------
|
||||||
|
|
||||||
|
.. include:: pmtx/synopsis.rst
|
||||||
|
|
||||||
|
|
||||||
``pxar``
|
``pxar``
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
100
docs/conf.py
@ -17,10 +17,13 @@
|
|||||||
# add these directories to sys.path here. If the directory is relative to the
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
#
|
#
|
||||||
# import os
|
import os
|
||||||
# import sys
|
import sys
|
||||||
# sys.path.insert(0, os.path.abspath('.'))
|
# sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
# custom extensions
|
||||||
|
sys.path.append(os.path.abspath("./_ext"))
|
||||||
|
|
||||||
# -- Implement custom formatter for code-blocks ---------------------------
|
# -- Implement custom formatter for code-blocks ---------------------------
|
||||||
#
|
#
|
||||||
# * use smaller font
|
# * use smaller font
|
||||||
@ -45,7 +48,10 @@ PygmentsBridge.latex_formatter = CustomLatexFormatter
|
|||||||
# Add any Sphinx extension module names here, as strings. They can be
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
# ones.
|
# ones.
|
||||||
extensions = ["sphinx.ext.graphviz", "sphinx.ext.todo"]
|
|
||||||
|
extensions = ["sphinx.ext.graphviz", 'sphinx.ext.mathjax', "sphinx.ext.todo", "proxmox-scanrefs"]
|
||||||
|
|
||||||
|
todo_link_only = True
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
templates_path = ['_templates']
|
templates_path = ['_templates']
|
||||||
@ -68,7 +74,7 @@ rst_epilog = epilog_file.read()
|
|||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = 'Proxmox Backup'
|
project = 'Proxmox Backup'
|
||||||
copyright = '2019-2020, Proxmox Support Team'
|
copyright = '2019-2021, Proxmox Server Solutions GmbH'
|
||||||
author = 'Proxmox Support Team'
|
author = 'Proxmox Support Team'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
@ -76,9 +82,11 @@ author = 'Proxmox Support Team'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '0.2'
|
vstr = lambda s: '<devbuild>' if s is None else str(s)
|
||||||
|
|
||||||
|
version = vstr(os.getenv('DEB_VERSION_UPSTREAM'))
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = '0.2-1'
|
release = vstr(os.getenv('DEB_VERSION'))
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@ -89,25 +97,21 @@ language = None
|
|||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
# non-false value, then it is used:
|
# non-false value, then it is used:
|
||||||
#
|
|
||||||
# today = ''
|
# today = ''
|
||||||
#
|
#
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
#
|
today_fmt = '%A, %d %B %Y'
|
||||||
# today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
# List of patterns, relative to source directory, that match files and
|
||||||
# directories to ignore when looking for source files.
|
# directories to ignore when looking for source files.
|
||||||
# This patterns also effect to html_static_path and html_extra_path
|
# This patterns also effect to html_static_path and html_extra_path
|
||||||
exclude_patterns = [
|
exclude_patterns = [
|
||||||
'_build', 'Thumbs.db', '.DS_Store',
|
'_build', 'Thumbs.db', '.DS_Store',
|
||||||
'proxmox-backup-client/man1.rst',
|
'*/man1.rst',
|
||||||
'proxmox-backup-manager/man1.rst',
|
'config/*/man5.rst',
|
||||||
'proxmox-backup-proxy/man1.rst',
|
|
||||||
'pxar/man1.rst',
|
|
||||||
'epilog.rst',
|
'epilog.rst',
|
||||||
'pbs-copyright.rst',
|
'pbs-copyright.rst',
|
||||||
'sysadmin.rst',
|
'local-zfs.rst'
|
||||||
'package-repositories.rst',
|
'package-repositories.rst',
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -140,7 +144,7 @@ pygments_style = 'sphinx'
|
|||||||
# keep_warnings = False
|
# keep_warnings = False
|
||||||
|
|
||||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||||
todo_include_todos = True
|
todo_include_todos = not tags.has('release')
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ----------------------------------------------
|
# -- Options for HTML output ----------------------------------------------
|
||||||
@ -148,13 +152,54 @@ todo_include_todos = True
|
|||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
# a list of builtin themes.
|
# a list of builtin themes.
|
||||||
#
|
#
|
||||||
html_theme = 'sphinxdoc'
|
html_theme = 'alabaster'
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
# further. For a list of options available for each theme, see the
|
# further. For a list of options available for each theme, see the
|
||||||
# documentation.
|
# documentation.
|
||||||
#
|
#
|
||||||
# html_theme_options = {}
|
html_theme_options = {
|
||||||
|
'fixed_sidebar': True,
|
||||||
|
'sidebar_includehidden': False,
|
||||||
|
'sidebar_collapse': False,
|
||||||
|
'globaltoc_collapse': False,
|
||||||
|
'show_relbar_bottom': True,
|
||||||
|
'show_powered_by': False,
|
||||||
|
|
||||||
|
'extra_nav_links': {
|
||||||
|
'Proxmox Homepage': 'https://proxmox.com',
|
||||||
|
'PDF': 'proxmox-backup.pdf',
|
||||||
|
'API Viewer' : 'api-viewer/index.html',
|
||||||
|
'Prune Simulator' : 'prune-simulator/index.html',
|
||||||
|
'LTO Barcode Generator' : 'lto-barcode/index.html',
|
||||||
|
},
|
||||||
|
|
||||||
|
'sidebar_width': '320px',
|
||||||
|
'page_width': '1320px',
|
||||||
|
# font styles
|
||||||
|
'head_font_family': 'Lato, sans-serif',
|
||||||
|
'caption_font_family': 'Lato, sans-serif',
|
||||||
|
'caption_font_size': '20px',
|
||||||
|
'font_family': 'Open Sans, sans-serif',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Alabaster theme recommends setting this fixed.
|
||||||
|
# If you switch theme this needs to removed, probably.
|
||||||
|
html_sidebars = {
|
||||||
|
'**': [
|
||||||
|
'sidebar-header.html',
|
||||||
|
'searchbox.html',
|
||||||
|
'navigation.html',
|
||||||
|
'relations.html',
|
||||||
|
],
|
||||||
|
|
||||||
|
'index': [
|
||||||
|
'sidebar-header.html',
|
||||||
|
'searchbox.html',
|
||||||
|
'index-sidebar.html',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
# html_theme_path = []
|
# html_theme_path = []
|
||||||
@ -171,7 +216,7 @@ html_theme = 'sphinxdoc'
|
|||||||
# The name of an image file (relative to this directory) to place at the top
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
# of the sidebar.
|
# of the sidebar.
|
||||||
#
|
#
|
||||||
html_logo = 'images/proxmox-logo.svg'
|
#html_logo = 'images/proxmox-logo.svg' # replaced by html_theme_options.logo
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to use as a favicon of
|
# The name of an image file (relative to this directory) to use as a favicon of
|
||||||
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
@ -184,6 +229,10 @@ html_favicon = 'images/favicon.ico'
|
|||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
html_static_path = ['_static']
|
html_static_path = ['_static']
|
||||||
|
|
||||||
|
html_js_files = [
|
||||||
|
'custom.js',
|
||||||
|
]
|
||||||
|
|
||||||
# Add any extra paths that contain custom files (such as robots.txt or
|
# Add any extra paths that contain custom files (such as robots.txt or
|
||||||
# .htaccess) here, relative to this directory. These files are copied
|
# .htaccess) here, relative to this directory. These files are copied
|
||||||
# directly to the root of the documentation.
|
# directly to the root of the documentation.
|
||||||
@ -196,14 +245,8 @@ html_static_path = ['_static']
|
|||||||
#
|
#
|
||||||
# html_last_updated_fmt = None
|
# html_last_updated_fmt = None
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
# We need to disable smatquotes, else Option Lists do not display long options
|
||||||
# typographically correct entities.
|
smartquotes = False
|
||||||
#
|
|
||||||
# html_use_smartypants = True
|
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
|
||||||
#
|
|
||||||
# html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
# template names.
|
# template names.
|
||||||
@ -224,7 +267,7 @@ html_static_path = ['_static']
|
|||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
# If true, links to the reST sources are added to the pages.
|
||||||
#
|
#
|
||||||
# html_show_sourcelink = True
|
html_show_sourcelink = False
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
#
|
#
|
||||||
@ -264,6 +307,9 @@ html_static_path = ['_static']
|
|||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = 'ProxmoxBackupdoc'
|
htmlhelp_basename = 'ProxmoxBackupdoc'
|
||||||
|
|
||||||
|
# use local mathjax package, symlink comes from debian/proxmox-backup-docs.links
|
||||||
|
mathjax_path = "mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
# -- Options for LaTeX output ---------------------------------------------
|
||||||
|
|
||||||
latex_engine = 'xelatex'
|
latex_engine = 'xelatex'
|
||||||
|
22
docs/config/acl/format.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
This file contains the access control list for the Proxmox Backup
|
||||||
|
Server API.
|
||||||
|
|
||||||
|
Each line starts with ``acl:``, followed by 4 additional values
|
||||||
|
separated by collon.
|
||||||
|
|
||||||
|
:propagate: Propagate permissions down the hierachrchy
|
||||||
|
|
||||||
|
:path: The object path
|
||||||
|
|
||||||
|
:User/Token: List of users and token
|
||||||
|
|
||||||
|
:Role: List of assigned roles
|
||||||
|
|
||||||
|
Here is an example list::
|
||||||
|
|
||||||
|
acl:1:/:root@pam!test:Admin
|
||||||
|
acl:1:/datastore/store1:user1@pbs:DatastoreAdmin
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-backup-manager acl`` command to manipulate
|
||||||
|
this file.
|
35
docs/config/acl/man5.rst
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
==========================
|
||||||
|
acl.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Access Control Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/user.cfg is a configuration file for Proxmox
|
||||||
|
Backup Server. It contains the access control configuration for the API.
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Roles
|
||||||
|
=====
|
||||||
|
|
||||||
|
The following roles exist:
|
||||||
|
|
||||||
|
.. include:: roles.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
18
docs/config/datastore/format.rst
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
The file contains a list of datastore configuration sections. Each
|
||||||
|
section starts with a header ``datastore: <name>``, followed by the
|
||||||
|
datastore configuration options.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
datastore: <name1>
|
||||||
|
path <path1>
|
||||||
|
<option1> <value1>
|
||||||
|
...
|
||||||
|
|
||||||
|
datastore: <name2>
|
||||||
|
path <path2>
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-backup-manager datastore`` command to manipulate
|
||||||
|
this file.
|
33
docs/config/datastore/man5.rst
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
==========================
|
||||||
|
datastore.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Datastore Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/datastore.cfg is a configuration file for Proxmox
|
||||||
|
Backup Server. It contains the Datastore configuration.
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
13
docs/config/media-pool/format.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
Each entry starts with a header ``pool: <name>``, followed by the
|
||||||
|
media pool configuration options.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
pool: company1
|
||||||
|
allocation always
|
||||||
|
retention overwrite
|
||||||
|
|
||||||
|
pool: ...
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-tape pool`` command to manipulate this file.
|
35
docs/config/media-pool/man5.rst
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
==========================
|
||||||
|
media-pool.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Media Pool Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/media-pool.cfg is a configuration file
|
||||||
|
for Proxmox Backup Server. It contains the medila pool configuration
|
||||||
|
for tape backups.
|
||||||
|
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
17
docs/config/remote/format.rst
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
This file contains information used to access remote servers.
|
||||||
|
|
||||||
|
Each entry starts with a header ``remote: <name>``, followed by the
|
||||||
|
remote configuration options.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
remote: server1
|
||||||
|
host server1.local
|
||||||
|
auth-id sync@pbs
|
||||||
|
...
|
||||||
|
|
||||||
|
remote: ...
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-backup-manager remote`` command to manipulate
|
||||||
|
this file.
|
35
docs/config/remote/man5.rst
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
==========================
|
||||||
|
remote.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Remote Server Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/remote.cfg is a configuration file for
|
||||||
|
Proxmox Backup Server. It contains information about remote servers,
|
||||||
|
usable for synchronization jobs.
|
||||||
|
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
15
docs/config/sync/format.rst
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
Each entry starts with a header ``sync: <name>``, followed by the
|
||||||
|
job configuration options.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
sync: job1
|
||||||
|
store store1
|
||||||
|
remote-store store1
|
||||||
|
remote lina
|
||||||
|
|
||||||
|
sync: ...
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-backup-manager sync-job`` command to manipulate
|
||||||
|
this file.
|
35
docs/config/sync/man5.rst
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
==========================
|
||||||
|
sync.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Synchronization Job Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/sync.cfg is a configuration file for
|
||||||
|
Proxmox Backup Server. It contains the synchronization job
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
16
docs/config/tape-job/format.rst
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Each entry starts with a header ``backup: <name>``, followed by the
|
||||||
|
job configuration options.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
backup: job1
|
||||||
|
drive hh8
|
||||||
|
pool p4
|
||||||
|
store store3
|
||||||
|
schedule daily
|
||||||
|
|
||||||
|
backup: ...
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-tape backup-job`` command to manipulate
|
||||||
|
this file.
|
34
docs/config/tape-job/man5.rst
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
==========================
|
||||||
|
tape-job.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Tape Job Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file ``/etc/proxmox-backup/tape-job.cfg`` is a configuration file for
|
||||||
|
Proxmox Backup Server. It contains the tape job configuration.
|
||||||
|
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
22
docs/config/tape/format.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
Each LTO drive configuration section starts with a header ``lto: <name>``,
|
||||||
|
followed by the drive configuration options.
|
||||||
|
|
||||||
|
Tape changer configurations starts with ``changer: <name>``,
|
||||||
|
followed by the changer configuration options.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
lto: hh8
|
||||||
|
changer sl3
|
||||||
|
path /dev/tape/by-id/scsi-10WT065325-nst
|
||||||
|
|
||||||
|
changer: sl3
|
||||||
|
export-slots 14,15,16
|
||||||
|
path /dev/tape/by-id/scsi-CJ0JBE0059
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-tape drive`` and ``proxmox-tape changer``
|
||||||
|
commands to manipulate this file.
|
||||||
|
|
||||||
|
.. NOTE:: The ``virtual:`` drive type is experimental and onyl used
|
||||||
|
for debugging.
|
33
docs/config/tape/man5.rst
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
==========================
|
||||||
|
tape.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Tape Drive and Changer Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/tape.cfg is a configuration file for Proxmox
|
||||||
|
Backup Server. It contains the tape drive and changer configuration.
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
28
docs/config/user/format.rst
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
This file contains the list of API users and API tokens.
|
||||||
|
|
||||||
|
Each user configuration section starts with a header ``user: <name>``,
|
||||||
|
followed by the user configuration options.
|
||||||
|
|
||||||
|
API token configuration starts with a header ``token:
|
||||||
|
<userid!token_name>``, followed by the token configuration. The data
|
||||||
|
used to authenticate tokens is stored in a separate file
|
||||||
|
(``token.shadow``).
|
||||||
|
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
user: root@pam
|
||||||
|
comment Superuser
|
||||||
|
email test@example.local
|
||||||
|
...
|
||||||
|
|
||||||
|
token: root@pam!token1
|
||||||
|
comment API test token
|
||||||
|
enable true
|
||||||
|
expire 0
|
||||||
|
|
||||||
|
user: ...
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-backup-manager user`` command to manipulate
|
||||||
|
this file.
|
33
docs/config/user/man5.rst
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
==========================
|
||||||
|
user.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
User Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/user.cfg is a configuration file for Proxmox
|
||||||
|
Backup Server. It contains the user configuration.
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
16
docs/config/verification/format.rst
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Each entry starts with a header ``verification: <name>``, followed by the
|
||||||
|
job configuration options.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
verification: verify-store2
|
||||||
|
ignore-verified true
|
||||||
|
outdated-after 7
|
||||||
|
schedule daily
|
||||||
|
store store2
|
||||||
|
|
||||||
|
verification: ...
|
||||||
|
|
||||||
|
|
||||||
|
You can use the ``proxmox-backup-manager verify-job`` command to manipulate
|
||||||
|
this file.
|
35
docs/config/verification/man5.rst
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
==========================
|
||||||
|
verification.cfg
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. include:: ../../epilog.rst
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
Verification Job Configuration
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
:Author: |AUTHOR|
|
||||||
|
:Version: Version |VERSION|
|
||||||
|
:Manual section: 5
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
The file /etc/proxmox-backup/sync.cfg is a configuration file for
|
||||||
|
Proxmox Backup Server. It contains the verification job
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
|
||||||
|
File Format
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. include:: format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: config.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. include:: ../../pbs-copyright.rst
|
142
docs/configuration-files.rst
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
Configuration Files
|
||||||
|
===================
|
||||||
|
|
||||||
|
All Proxmox Backup Server configuration files resides inside directory
|
||||||
|
``/etc/proxmox-backup/``.
|
||||||
|
|
||||||
|
|
||||||
|
``acl.cfg``
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/acl/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Roles
|
||||||
|
^^^^^
|
||||||
|
|
||||||
|
The following roles exist:
|
||||||
|
|
||||||
|
.. include:: config/acl/roles.rst
|
||||||
|
|
||||||
|
|
||||||
|
``datastore.cfg``
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/datastore/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/datastore/config.rst
|
||||||
|
|
||||||
|
|
||||||
|
``media-pool.cfg``
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/media-pool/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/media-pool/config.rst
|
||||||
|
|
||||||
|
|
||||||
|
``tape.cfg``
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/tape/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/tape/config.rst
|
||||||
|
|
||||||
|
|
||||||
|
``tape-job.cfg``
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/tape-job/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/tape-job/config.rst
|
||||||
|
|
||||||
|
|
||||||
|
``user.cfg``
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/user/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/user/config.rst
|
||||||
|
|
||||||
|
|
||||||
|
``remote.cfg``
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/remote/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/remote/config.rst
|
||||||
|
|
||||||
|
|
||||||
|
``sync.cfg``
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/sync/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/sync/config.rst
|
||||||
|
|
||||||
|
|
||||||
|
``verification.cfg``
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
File Format
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/verification/format.rst
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. include:: config/verification/config.rst
|
88
docs/custom.css
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
div.sphinxsidebar {
|
||||||
|
height: calc(100% - 20px);
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1.logo-name {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body img {
|
||||||
|
width: 250px;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
background-color: #FAFAFA;
|
||||||
|
}
|
||||||
|
|
||||||
|
li a.current {
|
||||||
|
font-weight: bold;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
ul li.toctree-l1 {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
}
|
||||||
|
ul li.toctree-l1 > a {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul {
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
div.sphinxsidebar ul ul {
|
||||||
|
list-style: circle;
|
||||||
|
}
|
||||||
|
div.sphinxsidebar ul ul ul {
|
||||||
|
list-style: square;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul a code {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
div.sphinxsidebar ul ul a {
|
||||||
|
border-bottom: 1px dotted #CCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar form.search {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3 {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h1.logo-name {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.document, div.footer {
|
||||||
|
width: min(100%, 1320px);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 875px) {
|
||||||
|
div.sphinxsidebar p.logo {
|
||||||
|
display: initial;
|
||||||
|
}
|
||||||
|
div.sphinxsidebar h1.logo-name {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
div.sphinxsidebar span {
|
||||||
|
color: #EEE;
|
||||||
|
}
|
||||||
|
.sphinxsidebar ul li.toctree-l1 > a, div.sphinxsidebar a {
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
div.sphinxsidebar {
|
||||||
|
background-color: #555;
|
||||||
|
}
|
||||||
|
div.body {
|
||||||
|
min-width: 300px;
|
||||||
|
}
|
||||||
|
div.footer {
|
||||||
|
display: block;
|
||||||
|
margin: 15px auto 0px auto;
|
||||||
|
}
|
||||||
|
}
|
7
docs/custom.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
window.addEventListener('DOMContentLoaded', (event) => {
|
||||||
|
let activeSection = document.querySelector("a.current");
|
||||||
|
if (activeSection) {
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
|
||||||
|
activeSection.scrollIntoView({ block: 'center' });
|
||||||
|
}
|
||||||
|
});
|
@ -1,6 +1,6 @@
|
|||||||
.. Epilog (included at top of each file)
|
.. Epilog (included at top of each file)
|
||||||
|
|
||||||
We use this file to define external links and commone replacement
|
We use this file to define external links and common replacement
|
||||||
patterns.
|
patterns.
|
||||||
|
|
||||||
.. |VERSION| replace:: 1.0
|
.. |VERSION| replace:: 1.0
|
||||||
@ -11,8 +11,11 @@
|
|||||||
.. _Container: https://en.wikipedia.org/wiki/Container_(virtualization)
|
.. _Container: https://en.wikipedia.org/wiki/Container_(virtualization)
|
||||||
.. _Zstandard: https://en.wikipedia.org/wiki/Zstandard
|
.. _Zstandard: https://en.wikipedia.org/wiki/Zstandard
|
||||||
.. _Proxmox: https://www.proxmox.com
|
.. _Proxmox: https://www.proxmox.com
|
||||||
|
.. _Proxmox Community Forum: https://forum.proxmox.com
|
||||||
.. _Proxmox Virtual Environment: https://www.proxmox.com/proxmox-ve
|
.. _Proxmox Virtual Environment: https://www.proxmox.com/proxmox-ve
|
||||||
.. _Proxmox Backup: https://www.proxmox.com/proxmox-backup
|
.. FIXME
|
||||||
|
.. _Proxmox Backup: https://pbs.proxmox.com/wiki/index.php/Main_Page
|
||||||
|
.. _PBS Development List: https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
|
||||||
.. _reStructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html
|
.. _reStructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html
|
||||||
.. _Rust: https://www.rust-lang.org/
|
.. _Rust: https://www.rust-lang.org/
|
||||||
.. _SHA-256: https://en.wikipedia.org/wiki/SHA-2
|
.. _SHA-256: https://en.wikipedia.org/wiki/SHA-2
|
||||||
@ -35,3 +38,6 @@
|
|||||||
.. _RFC3399: https://tools.ietf.org/html/rfc3339
|
.. _RFC3399: https://tools.ietf.org/html/rfc3339
|
||||||
.. _UTC: https://en.wikipedia.org/wiki/Coordinated_Universal_Time
|
.. _UTC: https://en.wikipedia.org/wiki/Coordinated_Universal_Time
|
||||||
.. _ISO Week date: https://en.wikipedia.org/wiki/ISO_week_date
|
.. _ISO Week date: https://en.wikipedia.org/wiki/ISO_week_date
|
||||||
|
|
||||||
|
.. _systemd.time manpage: https://manpages.debian.org/buster/systemd/systemd.time.7.en.html
|
||||||
|
|
||||||
|
72
docs/faq.rst
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
FAQ
|
||||||
|
===
|
||||||
|
|
||||||
|
What distribution is Proxmox Backup Server (PBS) based on?
|
||||||
|
----------------------------------------------------------
|
||||||
|
|
||||||
|
Proxmox Backup Server is based on `Debian GNU/Linux <https://www.debian.org/>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Which platforms are supported as a backup source (client)?
|
||||||
|
----------------------------------------------------------
|
||||||
|
|
||||||
|
The client tool works on most modern Linux systems, meaning you are not limited
|
||||||
|
to Debian-based backups.
|
||||||
|
|
||||||
|
|
||||||
|
Will Proxmox Backup Server run on a 32-bit processor?
|
||||||
|
-----------------------------------------------------
|
||||||
|
|
||||||
|
Proxmox Backup Server only supports 64-bit CPUs (AMD or Intel). There are no
|
||||||
|
future plans to support 32-bit processors.
|
||||||
|
|
||||||
|
|
||||||
|
How long will my Proxmox Backup Server version be supported?
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
+-----------------------+--------------------+---------------+------------+--------------------+
|
||||||
|
|Proxmox Backup Version | Debian Version | First Release | Debian EOL | Proxmox Backup EOL |
|
||||||
|
+=======================+====================+===============+============+====================+
|
||||||
|
|Proxmox Backup 1.x | Debian 10 (Buster) | 2020-11 | tba | tba |
|
||||||
|
+-----------------------+--------------------+---------------+------------+--------------------+
|
||||||
|
|
||||||
|
|
||||||
|
Can I copy or synchronize my datastore to another location?
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
Proxmox Backup Server allows you to copy or synchronize datastores to other
|
||||||
|
locations, through the use of *Remotes* and *Sync Jobs*. *Remote* is the term
|
||||||
|
given to a separate server, which has a datastore that can be synced to a local store.
|
||||||
|
A *Sync Job* is the process which is used to pull the contents of a datastore from
|
||||||
|
a *Remote* to a local datastore.
|
||||||
|
|
||||||
|
|
||||||
|
Can Proxmox Backup Server verify data integrity of a backup archive?
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
|
Proxmox Backup Server uses a built-in SHA-256 checksum algorithm, to ensure
|
||||||
|
data integrity. Within each backup, a manifest file (index.json) is created,
|
||||||
|
which contains a list of all the backup files, along with their sizes and
|
||||||
|
checksums. This manifest file is used to verify the integrity of each backup.
|
||||||
|
|
||||||
|
|
||||||
|
When backing up to remote servers, do I have to trust the remote server?
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Proxmox Backup Server transfers data via `Transport Layer Security (TLS)
|
||||||
|
<https://en.wikipedia.org/wiki/Transport_Layer_Security>`_ and additionally
|
||||||
|
supports client-side encryption. This means that data is transferred securely
|
||||||
|
and can be encrypted before it reaches the server. Thus, in the event that an
|
||||||
|
attacker gains access to the server or any point of the network, they will not
|
||||||
|
be able to read the data.
|
||||||
|
|
||||||
|
.. note:: Encryption is not enabled by default. To set up encryption, see the
|
||||||
|
:ref:`backup client encryption section <client_encryption>`.
|
||||||
|
|
||||||
|
|
||||||
|
Is the backup incremental/deduplicated?
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
With Proxmox Backup Server, backups are sent incremental and data is
|
||||||
|
deduplicated on the server.
|
||||||
|
This minimizes both the storage consumed and the network impact.
|
@ -6,7 +6,113 @@ File Formats
|
|||||||
Proxmox File Archive Format (``.pxar``)
|
Proxmox File Archive Format (``.pxar``)
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
|
|
||||||
.. graphviz:: pxar-format-overview.dot
|
.. graphviz:: pxar-format-overview.dot
|
||||||
|
|
||||||
|
|
||||||
|
.. _data-blob-format:
|
||||||
|
|
||||||
|
Data Blob Format (``.blob``)
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
The data blob format is used to store small binary data. The magic number decides the exact format:
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:widths: auto
|
||||||
|
|
||||||
|
* - ``[66, 171, 56, 7, 190, 131, 112, 161]``
|
||||||
|
- unencrypted
|
||||||
|
- uncompressed
|
||||||
|
* - ``[49, 185, 88, 66, 111, 182, 163, 127]``
|
||||||
|
- unencrypted
|
||||||
|
- compressed
|
||||||
|
* - ``[123, 103, 133, 190, 34, 45, 76, 240]``
|
||||||
|
- encrypted
|
||||||
|
- uncompressed
|
||||||
|
* - ``[230, 89, 27, 191, 11, 191, 216, 11]``
|
||||||
|
- encrypted
|
||||||
|
- compressed
|
||||||
|
|
||||||
|
Compression algorithm is ``zstd``. Encryption cipher is ``AES_256_GCM``.
|
||||||
|
|
||||||
|
Unencrypted blobs use the following format:
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:widths: auto
|
||||||
|
|
||||||
|
* - ``MAGIC: [u8; 8]``
|
||||||
|
* - ``CRC32: [u8; 4]``
|
||||||
|
* - ``Data: (max 16MiB)``
|
||||||
|
|
||||||
|
Encrypted blobs additionally contains a 16 byte IV, followed by a 16
|
||||||
|
byte Authenticated Encyryption (AE) tag, followed by the encrypted
|
||||||
|
data:
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
|
||||||
|
* - ``MAGIC: [u8; 8]``
|
||||||
|
* - ``CRC32: [u8; 4]``
|
||||||
|
* - ``ÌV: [u8; 16]``
|
||||||
|
* - ``TAG: [u8; 16]``
|
||||||
|
* - ``Data: (max 16MiB)``
|
||||||
|
|
||||||
|
|
||||||
|
.. _fixed-index-format:
|
||||||
|
|
||||||
|
Fixed Index Format (``.fidx``)
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
All numbers are stored as little-endian.
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
|
||||||
|
* - ``MAGIC: [u8; 8]``
|
||||||
|
- ``[47, 127, 65, 237, 145, 253, 15, 205]``
|
||||||
|
* - ``uuid: [u8; 16]``,
|
||||||
|
- Unique ID
|
||||||
|
* - ``ctime: i64``,
|
||||||
|
- Creation Time (epoch)
|
||||||
|
* - ``index_csum: [u8; 32]``,
|
||||||
|
- Sha256 over the index (without header) ``SHA256(digest1||digest2||...)``
|
||||||
|
* - ``size: u64``,
|
||||||
|
- Image size
|
||||||
|
* - ``chunk_size: u64``,
|
||||||
|
- Chunk size
|
||||||
|
* - ``reserved: [u8; 4016]``,
|
||||||
|
- overall header size is one page (4096 bytes)
|
||||||
|
* - ``digest1: [u8; 32]``
|
||||||
|
- first chunk digest
|
||||||
|
* - ``digest2: [u8; 32]``
|
||||||
|
- next chunk
|
||||||
|
* - ...
|
||||||
|
- next chunk ...
|
||||||
|
|
||||||
|
|
||||||
|
.. _dynamic-index-format:
|
||||||
|
|
||||||
|
Dynamic Index Format (``.didx``)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
All numbers are stored as little-endian.
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
|
||||||
|
* - ``MAGIC: [u8; 8]``
|
||||||
|
- ``[28, 145, 78, 165, 25, 186, 179, 205]``
|
||||||
|
* - ``uuid: [u8; 16]``,
|
||||||
|
- Unique ID
|
||||||
|
* - ``ctime: i64``,
|
||||||
|
- Creation Time (epoch)
|
||||||
|
* - ``index_csum: [u8; 32]``,
|
||||||
|
- Sha256 over the index (without header) ``SHA256(offset1||digest1||offset2||digest2||...)``
|
||||||
|
* - ``reserved: [u8; 4032]``,
|
||||||
|
- Overall header size is one page (4096 bytes)
|
||||||
|
* - ``offset1: u64``
|
||||||
|
- End of first chunk
|
||||||
|
* - ``digest1: [u8; 32]``
|
||||||
|
- first chunk digest
|
||||||
|
* - ``offset2: u64``
|
||||||
|
- End of second chunk
|
||||||
|
* - ``digest2: [u8; 32]``
|
||||||
|
- second chunk digest
|
||||||
|
* - ...
|
||||||
|
- next chunk offset/digest
|
||||||
|
@ -16,7 +16,7 @@ Glossary
|
|||||||
Datastore
|
Datastore
|
||||||
|
|
||||||
A place to store backups. A directory which contains the backup data.
|
A place to store backups. A directory which contains the backup data.
|
||||||
The current implemenation is file-system based.
|
The current implementation is file-system based.
|
||||||
|
|
||||||
`Rust`_
|
`Rust`_
|
||||||
|
|
||||||
@ -46,3 +46,8 @@ Glossary
|
|||||||
kernel driver handles filesystem requests and sends them to a
|
kernel driver handles filesystem requests and sends them to a
|
||||||
userspace application.
|
userspace application.
|
||||||
|
|
||||||
|
Remote
|
||||||
|
|
||||||
|
A remote Proxmox Backup Server installation and credentials for a user on it.
|
||||||
|
You can pull datastores from a remote to a local datastore in order to
|
||||||
|
have redundant backups.
|
||||||
|
148
docs/gui.rst
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
Graphical User Interface
|
||||||
|
========================
|
||||||
|
|
||||||
|
Proxmox Backup Server offers an integrated, web-based interface to manage the
|
||||||
|
server. This means that you can carry out all administration tasks through your
|
||||||
|
web browser, and that you don't have to worry about installing extra management
|
||||||
|
tools. The web interface also provides a built-in console, so if you prefer the
|
||||||
|
command line or need some extra control, you have this option.
|
||||||
|
|
||||||
|
The web interface can be accessed via https://youripaddress:8007. The default
|
||||||
|
login is `root`, and the password is the one specified during the installation
|
||||||
|
process.
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
* Simple management interface for Proxmox Backup Server
|
||||||
|
* Monitoring of tasks, logs and resource usage
|
||||||
|
* Management of users, permissions, datastores, etc.
|
||||||
|
* Secure HTML5 console
|
||||||
|
* Support for multiple authentication sources
|
||||||
|
* Support for multiple languages
|
||||||
|
* Based on ExtJS 6.x JavaScript framework
|
||||||
|
|
||||||
|
|
||||||
|
Login
|
||||||
|
-----
|
||||||
|
|
||||||
|
.. image:: images/screenshots/pbs-gui-login-window.png
|
||||||
|
:align: right
|
||||||
|
:alt: PBS login window
|
||||||
|
|
||||||
|
When you connect to the web interface, you will first see the login window.
|
||||||
|
Proxmox Backup Server supports various languages and authentication back ends
|
||||||
|
(*Realms*), both of which can be selected here.
|
||||||
|
|
||||||
|
.. note:: For convenience, you can save the username on the client side, by
|
||||||
|
selecting the "Save User name" checkbox at the bottom of the window.
|
||||||
|
|
||||||
|
|
||||||
|
GUI Overview
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. image:: images/screenshots/pbs-gui-dashboard.png
|
||||||
|
:align: right
|
||||||
|
:alt: PBS GUI Dashboard
|
||||||
|
|
||||||
|
The Proxmox Backup Server web interface consists of 3 main sections:
|
||||||
|
|
||||||
|
* **Header**: At the top. This shows version information, and contains buttons to view
|
||||||
|
documentation, monitor running tasks, set the language and logout.
|
||||||
|
* **Sidebar**: On the left. This contains the configuration options for
|
||||||
|
the server.
|
||||||
|
* **Configuration Panel**: In the center. This contains the control interface for the
|
||||||
|
configuration options in the *Sidebar*.
|
||||||
|
|
||||||
|
|
||||||
|
Sidebar
|
||||||
|
-------
|
||||||
|
|
||||||
|
In the sidebar, on the left side of the page, you can see various items relating
|
||||||
|
to specific management activities.
|
||||||
|
|
||||||
|
|
||||||
|
Dashboard
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
The Dashboard shows a summary of activity and resource usage on the server.
|
||||||
|
Specifically, this displays hardware usage, a summary of
|
||||||
|
previous and currently running tasks, and subscription information.
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The Configuration section contains some system configuration options, such as
|
||||||
|
time and network configuration. It also contains the following subsections:
|
||||||
|
|
||||||
|
* **Access Control**: Add and manage users, API tokens, and the permissions
|
||||||
|
associated with these items
|
||||||
|
* **Remotes**: Add, edit and remove remotes (see :term:`Remote`)
|
||||||
|
* **Subscription**: Upload a subscription key, view subscription status and
|
||||||
|
access a text-based system report.
|
||||||
|
|
||||||
|
|
||||||
|
Administration
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/screenshots/pbs-gui-administration-serverstatus.png
|
||||||
|
:align: right
|
||||||
|
:alt: Administration: Server Status overview
|
||||||
|
|
||||||
|
The Administration section contains a top panel, with further administration
|
||||||
|
tasks and information. These are:
|
||||||
|
|
||||||
|
* **ServerStatus**: Provides access to the console, power options, and various
|
||||||
|
resource usage statistics
|
||||||
|
* **Services**: Manage and monitor system services
|
||||||
|
* **Updates**: An interface for upgrading packages
|
||||||
|
* **Syslog**: View log messages from the server
|
||||||
|
* **Tasks**: Task history with multiple filter options
|
||||||
|
|
||||||
|
.. image:: images/screenshots/pbs-gui-disks.png
|
||||||
|
:align: right
|
||||||
|
:alt: Administration: Disks
|
||||||
|
|
||||||
|
The administration menu item also contains a disk management subsection:
|
||||||
|
|
||||||
|
* **Disks**: View information on available disks
|
||||||
|
|
||||||
|
* **Directory**: Create and view information on *ext4* and *xfs* disks
|
||||||
|
* **ZFS**: Create and view information on *ZFS* disks
|
||||||
|
|
||||||
|
Tape Backup
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/screenshots/pbs-gui-tape-changer-overview.png
|
||||||
|
:align: right
|
||||||
|
:alt: Tape Backup: Tape changer overview
|
||||||
|
|
||||||
|
The `Tape Backup`_ section contains a top panel, managing tape media sets,
|
||||||
|
inventories, drives, changers and the tape backup jobs itself.
|
||||||
|
|
||||||
|
It also contains a subsection per standalone drive and per changer, with a
|
||||||
|
status and management view for those devices.
|
||||||
|
|
||||||
|
Datastore
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/screenshots/pbs-gui-datastore-summary.png
|
||||||
|
:align: right
|
||||||
|
:alt: Datastore Configuration
|
||||||
|
|
||||||
|
The Datastore section contains interfaces for creating and managing
|
||||||
|
datastores. It contains a button to create a new datastore on the server, as
|
||||||
|
well as a subsection for each datastore on the system, in which you can use the
|
||||||
|
top panel to view:
|
||||||
|
|
||||||
|
* **Summary**: Access a range of datastore usage statistics
|
||||||
|
* **Content**: Information on the datastore's backup groups and their respective
|
||||||
|
contents
|
||||||
|
* **Prune & GC**: Schedule :ref:`pruning <backup-pruning>` and :ref:`garbage
|
||||||
|
collection <client_garbage-collection>` operations, and run garbage collection
|
||||||
|
manually
|
||||||
|
* **Sync Jobs**: Create, manage and run :ref:`syncjobs` from remote servers
|
||||||
|
* **Verify Jobs**: Create, manage and run :ref:`maintenance_verification` jobs on the
|
||||||
|
datastore
|
BIN
docs/images/screenshots/pbs-gui-administration-serverstatus.png
Normal file
After Width: | Height: | Size: 140 KiB |
BIN
docs/images/screenshots/pbs-gui-apitoken-overview.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
docs/images/screenshots/pbs-gui-apitoken-secret-value.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/images/screenshots/pbs-gui-dashboard.png
Normal file
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 33 KiB |
BIN
docs/images/screenshots/pbs-gui-datastore-content.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
docs/images/screenshots/pbs-gui-datastore-create-general.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/images/screenshots/pbs-gui-datastore-prunegc.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
docs/images/screenshots/pbs-gui-datastore-summary.png
Normal file
After Width: | Height: | Size: 130 KiB |
BIN
docs/images/screenshots/pbs-gui-datastore-verifyjob-add.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
docs/images/screenshots/pbs-gui-datastore.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
docs/images/screenshots/pbs-gui-disks-dir-create.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs/images/screenshots/pbs-gui-disks-zfs-create.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
docs/images/screenshots/pbs-gui-disks.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
docs/images/screenshots/pbs-gui-login-window.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/images/screenshots/pbs-gui-network-create-bond.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
docs/images/screenshots/pbs-gui-permissions-add.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/images/screenshots/pbs-gui-remote-add.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
docs/images/screenshots/pbs-gui-syncjob-add.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-backup-jobs-add.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-backup-jobs.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-changer-overview.png
Normal file
After Width: | Height: | Size: 117 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-changers-add.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-changers.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-crypt-keys.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-drives-add.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-drives.png
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-pools-add.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/images/screenshots/pbs-gui-tape-pools.png
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
docs/images/screenshots/pbs-gui-tfa-add-recovery-keys.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
docs/images/screenshots/pbs-gui-tfa-add-totp.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
docs/images/screenshots/pbs-gui-tfa-login.png
Normal file
After Width: | Height: | Size: 16 KiB |