Compare commits
720 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7dfb68ba3c | ||
|
|
ba108f6ca4 | ||
|
|
0714fb8780 | ||
|
|
e761f0d769 | ||
|
|
aa6f185742 | ||
|
|
938a991099 | ||
|
|
455e9b90f0 | ||
|
|
b0cd1ebf1b | ||
|
|
53b97cdc31 | ||
|
|
0f4e8e29c3 | ||
|
|
2b884d0872 | ||
|
|
2c783d1614 | ||
|
|
ea48162696 | ||
|
|
bb4dc2ab3c | ||
|
|
4f45dc3d05 | ||
|
|
aeeec51f74 | ||
|
|
c55dbff3a3 | ||
|
|
944bd1d4ad | ||
|
|
4c54fb65e5 | ||
|
|
d1026079d0 | ||
|
|
407bf8cf17 | ||
|
|
786ce4475a | ||
|
|
880569e0c9 | ||
|
|
91fdd1b81a | ||
|
|
318c7134b2 | ||
|
|
0c86955013 | ||
|
|
c29674b0ad | ||
|
|
ab593975a4 | ||
|
|
7bdf71e13a | ||
|
|
ce21c03172 | ||
|
|
7998d2842f | ||
|
|
3cfcbdf0b5 | ||
|
|
86c5ab0680 | ||
|
|
461ed02bb8 | ||
|
|
90da1b151c | ||
|
|
168711b052 | ||
|
|
5519632476 | ||
|
|
2498d6b5ba | ||
|
|
09511c5922 | ||
|
|
2ecfe68f40 | ||
|
|
dd1bd16042 | ||
|
|
9d38e7020c | ||
|
|
def10f3661 | ||
|
|
f4d7a546d4 | ||
|
|
67f7a270b3 | ||
|
|
56e5547b68 | ||
|
|
125e2a2ef2 | ||
|
|
759fa2c156 | ||
|
|
993888a813 | ||
|
|
3e94a6578e | ||
|
|
8327846c1f | ||
|
|
f1f925d10c | ||
|
|
ba72fec8ad | ||
|
|
5b1b9cc44e | ||
|
|
db828e38c3 | ||
|
|
285bb81c49 | ||
|
|
3e346a419a | ||
|
|
d563ffa846 | ||
|
|
8fe5bc54af | ||
|
|
0f5b43bc77 | ||
|
|
558a624dc7 | ||
|
|
fb05755822 | ||
|
|
fbcfcdddf0 | ||
|
|
0d389d0890 | ||
|
|
2291c99f47 | ||
|
|
1a08b50465 | ||
|
|
ddd06f5f0c | ||
|
|
d1e72accc6 | ||
|
|
bab21723b0 | ||
|
|
cf1c4f5009 | ||
|
|
3bcfaedc2b | ||
|
|
d9beffe0b6 | ||
|
|
14e9078105 | ||
|
|
73dd13e158 | ||
|
|
6cc6437f9d | ||
|
|
8182b5bef0 | ||
|
|
354d09858b | ||
|
|
5634562722 | ||
|
|
77e17d2ed5 | ||
|
|
b9ecefbc81 | ||
|
|
0744d2ef2b | ||
|
|
0803bccd9d | ||
|
|
5c8e68b287 | ||
|
|
a48688f8a3 | ||
|
|
caee9ebe51 | ||
|
|
d7a9886fa2 | ||
|
|
fed53e5559 | ||
|
|
c11d159ba7 | ||
|
|
b6e9dbe49e | ||
|
|
02e462900f | ||
|
|
ce71650a4d | ||
|
|
6544de7860 | ||
|
|
f68fcb907a | ||
|
|
a8a3f59c74 | ||
|
|
f91f590403 | ||
|
|
cd18fefa4a | ||
|
|
7a1448c3c9 | ||
|
|
2349764deb | ||
|
|
772777582a | ||
|
|
f48d0ab958 | ||
|
|
9f2ca7c19d | ||
|
|
84eacd27cf | ||
|
|
3b7c616418 | ||
|
|
d51461b1ef | ||
|
|
fb643bfbdf | ||
|
|
7c9fcfd196 | ||
|
|
fa4e8c6ae6 | ||
|
|
91f5199c29 | ||
|
|
b315c7d9c0 | ||
|
|
b648f54e0e | ||
|
|
dbb9e29d1c | ||
|
|
9afb922d3e | ||
|
|
dbc67cb6a9 | ||
|
|
a7fb9cd742 | ||
|
|
65f1ee7b52 | ||
|
|
6684494379 | ||
|
|
255af1d6d8 | ||
|
|
889ad4247a | ||
|
|
2947a454fb | ||
|
|
fdc5eac10e | ||
|
|
0f6781a492 | ||
|
|
77bdb66aac | ||
|
|
a2cd087623 | ||
|
|
00d250e424 | ||
|
|
83436b63f8 | ||
|
|
73246eff10 | ||
|
|
da8aac101d | ||
|
|
0e356340c8 | ||
|
|
bf7aa9c599 | ||
|
|
649d709292 | ||
|
|
1d5b7e4f6f | ||
|
|
9a1af038ea | ||
|
|
5a56b92114 | ||
|
|
4b64172c34 | ||
|
|
3d8e1846f6 | ||
|
|
c67306364f | ||
|
|
a4ab1192e8 | ||
|
|
3001e7e5a7 | ||
|
|
be6249d9b8 | ||
|
|
ebdec8b21f | ||
|
|
90b1c95300 | ||
|
|
938cd8fad3 | ||
|
|
80c3f4549f | ||
|
|
72d2da1f2e | ||
|
|
4729ac43ab | ||
|
|
2424bd15b9 | ||
|
|
f642df792f | ||
|
|
5fa7391822 | ||
|
|
bb21505ff6 | ||
|
|
aafa7993f3 | ||
|
|
6e1189cead | ||
|
|
acd3cecea5 | ||
|
|
7dca30a0e5 | ||
|
|
d7e2cf7ada | ||
|
|
e36253f5df | ||
|
|
f5caf0756c | ||
|
|
0531f331ab | ||
|
|
efe94c9d25 | ||
|
|
676f7581f6 | ||
|
|
c1a6290eda | ||
|
|
0faeb8a103 | ||
|
|
fef982e0b6 | ||
|
|
e88b0231b5 | ||
|
|
df94cf8318 | ||
|
|
dbe04281d1 | ||
|
|
03ad30b779 | ||
|
|
1550173241 | ||
|
|
34edc95cd6 | ||
|
|
9c3f44712c | ||
|
|
7bd9ca3fdd | ||
|
|
bcfef1ae07 | ||
|
|
c4ce1ab0a9 | ||
|
|
de6a1c021b | ||
|
|
c55ef639a1 | ||
|
|
45a602b144 | ||
|
|
c8dfc89b07 | ||
|
|
6a11ba4a05 | ||
|
|
451cd050f8 | ||
|
|
a232e315d9 | ||
|
|
b87b1aae8c | ||
|
|
3e6da8ed4e | ||
|
|
304b82d451 | ||
|
|
4618187298 | ||
|
|
891add3ab5 | ||
|
|
67eeeeb81b | ||
|
|
272457a2aa | ||
|
|
6785b02ec5 | ||
|
|
e4bd82f6e2 | ||
|
|
5dbf1035cf | ||
|
|
a57c4789d8 | ||
|
|
f9fb492e5d | ||
|
|
f9af6fe1ef | ||
|
|
96208c0797 | ||
|
|
4a0d3e6e79 | ||
|
|
316586442b | ||
|
|
f45708f8b7 | ||
|
|
145c5a32c0 | ||
|
|
7d3fa73deb | ||
|
|
a18e7d46e7 | ||
|
|
0ff42b6f99 | ||
|
|
51a76e1b04 | ||
|
|
7274c1d33d | ||
|
|
f05f59fb7d | ||
|
|
a6727d7244 | ||
|
|
c29ffc9b2a | ||
|
|
23da71b572 | ||
|
|
86bf13a93f | ||
|
|
8cdb9abd1c | ||
|
|
26c30c3152 | ||
|
|
0f2fab4980 | ||
|
|
448707e85d | ||
|
|
e1ef371da2 | ||
|
|
a3836c5eb6 | ||
|
|
f2c1a7e848 | ||
|
|
6a5778f9d9 | ||
|
|
935fbb7cf2 | ||
|
|
34bebbba1b | ||
|
|
d08186e4dd | ||
|
|
fb1f37cd6e | ||
|
|
a1d0da61af | ||
|
|
ba74e9d3c8 | ||
|
|
c4bf126e05 | ||
|
|
fc723c2d17 | ||
|
|
0e3ca47042 | ||
|
|
2288805024 | ||
|
|
890c151dc3 | ||
|
|
dee6c2445e | ||
|
|
1bb0c7db78 | ||
|
|
1a6ac6ccbc | ||
|
|
506833a7e0 | ||
|
|
0ca2478e7c | ||
|
|
bdc2b90430 | ||
|
|
f2f21fb5b2 | ||
|
|
79c4bab333 | ||
|
|
906c3a1d3c | ||
|
|
c8b6c00192 | ||
|
|
ed87190451 | ||
|
|
cf93ee198e | ||
|
|
4432eaed35 | ||
|
|
1a168ab7ec | ||
|
|
c2173ecb72 | ||
|
|
c678872b60 | ||
|
|
2437c388d7 | ||
|
|
6d8d9adb33 | ||
|
|
303654c839 | ||
|
|
c3e6faf52e | ||
|
|
6a0e00ed53 | ||
|
|
292e3507db | ||
|
|
a750f4ce49 | ||
|
|
5a0e5e823d | ||
|
|
768dd2b4a3 | ||
|
|
9ca78c3edc | ||
|
|
a243467ef4 | ||
|
|
65d7fbca67 | ||
|
|
eaa884fd47 | ||
|
|
89b931bb53 | ||
|
|
3aaf5ba8d2 | ||
|
|
876a2fee89 | ||
|
|
d22ed403a7 | ||
|
|
19e7da4db7 | ||
|
|
336aaebfdc | ||
|
|
fd9c06210f | ||
|
|
372b28c900 | ||
|
|
6f9d84ad48 | ||
|
|
e9d0c96fc6 | ||
|
|
ccfd748890 | ||
|
|
6e041986fc | ||
|
|
70d60dc3e2 | ||
|
|
cfdb5368c8 | ||
|
|
7244279d41 | ||
|
|
5aa9687b3d | ||
|
|
1ba53d2138 | ||
|
|
a615211913 | ||
|
|
8c9d9bc378 | ||
|
|
add2dc1a16 | ||
|
|
05ce4ca3f4 | ||
|
|
7e25ff758c | ||
|
|
4e1457c56c | ||
|
|
b83d523120 | ||
|
|
59571dc22f | ||
|
|
1a464da6b6 | ||
|
|
585eff8bfe | ||
|
|
3d524a8b8e | ||
|
|
d7feb03fe0 | ||
|
|
6205398554 | ||
|
|
4fdd85cdfc | ||
|
|
a85db8992b | ||
|
|
8f8b7472e7 | ||
|
|
ad52c66ee3 | ||
|
|
a0709fb934 | ||
|
|
5dd97d77da | ||
|
|
8e87861afc | ||
|
|
602cac062a | ||
|
|
4264b155ab | ||
|
|
718f7d88f1 | ||
|
|
f21c146e6d | ||
|
|
abf8b85a2e | ||
|
|
ace2da2281 | ||
|
|
42452c0844 | ||
|
|
f1b83b30c3 | ||
|
|
55349e957b | ||
|
|
a009d13255 | ||
|
|
302b2c71de | ||
|
|
1d3d420817 | ||
|
|
48764c4b73 | ||
|
|
f75628c11d | ||
|
|
ef6609af5e | ||
|
|
aba7498135 | ||
|
|
6a54b31d32 | ||
|
|
1205c1e780 | ||
|
|
fbff883dc5 | ||
|
|
89e0aa2058 | ||
|
|
a9346a61a4 | ||
|
|
74289b4d80 | ||
|
|
323c37e033 | ||
|
|
0623b5d157 | ||
|
|
8d83c64d9b | ||
|
|
ea0906225e | ||
|
|
c60ffbd897 | ||
|
|
dbe3a19230 | ||
|
|
aa98e84613 | ||
|
|
3907a38ad7 | ||
|
|
34313b7551 | ||
|
|
67e9be9a3c | ||
|
|
79977d0da0 | ||
|
|
ae87346cd1 | ||
|
|
5562bf87ac | ||
|
|
fe15b1b31b | ||
|
|
db58a8d8f3 | ||
|
|
6b6f117cfa | ||
|
|
1f8f96d60e | ||
|
|
f905c4c805 | ||
|
|
da5025f63e | ||
|
|
d8e617c147 | ||
|
|
8e63a667a3 | ||
|
|
14fb8590f0 | ||
|
|
313645bf9a | ||
|
|
29252cafe4 | ||
|
|
6af55147b8 | ||
|
|
f57720a41b | ||
|
|
f421f9d3f7 | ||
|
|
4f408986a3 | ||
|
|
192b302982 | ||
|
|
6772e5f8e3 | ||
|
|
5b3d67739a | ||
|
|
61e67344a8 | ||
|
|
3740d7d0f7 | ||
|
|
656abb1240 | ||
|
|
880a7fe854 | ||
|
|
655334a87a | ||
|
|
f5d85cec11 | ||
|
|
1bf8255ff6 | ||
|
|
cb047b081d | ||
|
|
8f5af7b23a | ||
|
|
8c0dab4583 | ||
|
|
4c5cff1690 | ||
|
|
0d5c2bd438 | ||
|
|
3d64bea944 | ||
|
|
6a88ab9bb1 | ||
|
|
7c58e0fec3 | ||
|
|
e8a4152361 | ||
|
|
30bcbedb80 | ||
|
|
95662f863b | ||
|
|
265fe883ee | ||
|
|
9d5b460af8 | ||
|
|
eb0d28c1e2 | ||
|
|
13928426cb | ||
|
|
432ff9a00c | ||
|
|
51af0bf7dd | ||
|
|
df160e3120 | ||
|
|
d057e98551 | ||
|
|
6bbd9dfca4 | ||
|
|
c0e1931e83 | ||
|
|
59d887b362 | ||
|
|
7fb847939f | ||
|
|
8847496eb2 | ||
|
|
a2fefe3e0d | ||
|
|
5978d17ff0 | ||
|
|
d5334c3c06 | ||
|
|
7ad9be13de | ||
|
|
00df76af8f | ||
|
|
dd7390a38b | ||
|
|
fa7b4561b4 | ||
|
|
d552d69fca | ||
|
|
c9d1eec588 | ||
|
|
6c20c06b4f | ||
|
|
7bc57c82fb | ||
|
|
5c9651a598 | ||
|
|
5a865a76ab | ||
|
|
2df1c7d8b4 | ||
|
|
94a506ca40 | ||
|
|
58beb33d4f | ||
|
|
235ca6cdbb | ||
|
|
fbdf9fef0f | ||
|
|
0c0edd618f | ||
|
|
de21cd787f | ||
|
|
db42af861e | ||
|
|
4ddcd64367 | ||
|
|
80dac2f234 | ||
|
|
6ffa0359b0 | ||
|
|
f42b7b8199 | ||
|
|
4b562eed7e | ||
|
|
5cc61efe19 | ||
|
|
74520dd882 | ||
|
|
857a8ace8a | ||
|
|
8f93da0293 | ||
|
|
9818d4c0e9 | ||
|
|
207a7b7255 | ||
|
|
f3e59ac1cd | ||
|
|
221be1eb06 | ||
|
|
2488460230 | ||
|
|
8a332790cd | ||
|
|
45a06ef13f | ||
|
|
127e02a004 | ||
|
|
7fff297724 | ||
|
|
b3be34ed13 | ||
|
|
c7a8f655cd | ||
|
|
a1f0c76ca7 | ||
|
|
b5c6d94696 | ||
|
|
db246ebed1 | ||
|
|
4eaf1f81c1 | ||
|
|
c1c59ab096 | ||
|
|
0d41fdf527 | ||
|
|
6052f0d737 | ||
|
|
5ba64c1f71 | ||
|
|
889cddf1b3 | ||
|
|
06326bcc84 | ||
|
|
5d13bc96ee | ||
|
|
a3418ea8d8 | ||
|
|
64bd57c571 | ||
|
|
5604928d1b | ||
|
|
488672f765 | ||
|
|
1d23239ec3 | ||
|
|
bc29ac19a0 | ||
|
|
e4c4c960f1 | ||
|
|
a8bd9977ba | ||
|
|
d0cd152fb8 | ||
|
|
8cfc9b264c | ||
|
|
e96caad9e3 | ||
|
|
b6bbff680f | ||
|
|
3dd6d3c8d9 | ||
|
|
8ccf2db4fa | ||
|
|
24f72e9ca4 | ||
|
|
8fba15fc1b | ||
|
|
10cd25169e | ||
|
|
5d677168bc | ||
|
|
809fe36227 | ||
|
|
8ad770055b | ||
|
|
fd328befc6 | ||
|
|
fbe5780c4e | ||
|
|
8aedccf83c | ||
|
|
aca89485df | ||
|
|
3b556cb154 | ||
|
|
6ed06afb70 | ||
|
|
bbf442c94c | ||
|
|
87a777bf5d | ||
|
|
1ef5e5e70a | ||
|
|
0995b5984b | ||
|
|
768ad7a2e7 | ||
|
|
983efba3dd | ||
|
|
b8a9bf8a13 | ||
|
|
aadb42cc9c | ||
|
|
89decd0d67 | ||
|
|
e81786f258 | ||
|
|
b1f0cfc91b | ||
|
|
1ed197bb77 | ||
|
|
c3918dd1ce | ||
|
|
bc1f0bb53b | ||
|
|
54ec97d003 | ||
|
|
48ac071fe0 | ||
|
|
d2fa5ad7ea | ||
|
|
08dc6a027f | ||
|
|
4c9f3adc5f | ||
|
|
f6f6962ad4 | ||
|
|
afe238a8b9 | ||
|
|
99ee394158 | ||
|
|
be74b12e5b | ||
|
|
9dc8e13145 | ||
|
|
81673d5778 | ||
|
|
ee151ff3d6 | ||
|
|
02b8acffc4 | ||
|
|
080c987e58 | ||
|
|
5302041474 | ||
|
|
35f30a2452 | ||
|
|
a1d94425d0 | ||
|
|
c406312ec3 | ||
|
|
638e43825c | ||
|
|
7946438b90 | ||
|
|
0d09debdd0 | ||
|
|
00e98088c3 | ||
|
|
480254848f | ||
|
|
9fdab652fa | ||
|
|
8c9df535dd | ||
|
|
85653331c7 | ||
|
|
7e9a2cb952 | ||
|
|
6feda9458b | ||
|
|
3d10330fa3 | ||
|
|
52c6ff124a | ||
|
|
499c17b2f4 | ||
|
|
028043df55 | ||
|
|
cafd01a8f0 | ||
|
|
c8e6c51cb5 | ||
|
|
315cd47a4c | ||
|
|
bf50e539e7 | ||
|
|
97c36bf46e | ||
|
|
8c3a5f67bd | ||
|
|
d99bd4e9eb | ||
|
|
912982d6f0 | ||
|
|
3eab2b01b8 | ||
|
|
0386e8f8f6 | ||
|
|
63451d725a | ||
|
|
d354b188f7 | ||
|
|
c949341dcf | ||
|
|
ed884660e0 | ||
|
|
4d95c2ad1e | ||
|
|
d7b7cbff34 | ||
|
|
7626934484 | ||
|
|
98317d1e74 | ||
|
|
8f70d69605 | ||
|
|
e8af1225cd | ||
|
|
508dd6abfe | ||
|
|
d643395999 | ||
|
|
8734c24604 | ||
|
|
8ad1637066 | ||
|
|
2997c33006 | ||
|
|
945ad0f422 | ||
|
|
24f85e110c | ||
|
|
b1105d89ea | ||
|
|
34bf4bde8e | ||
|
|
19dedc2d1d | ||
|
|
26f92e815d | ||
|
|
32f6e4e750 | ||
|
|
65f8287e5a | ||
|
|
37d523f4fb | ||
|
|
78fa8bf11e | ||
|
|
a0a76a1e5e | ||
|
|
e74f47016d | ||
|
|
d654cb418b | ||
|
|
8020b0fc6d | ||
|
|
5c06d56aef | ||
|
|
4e6a2940e4 | ||
|
|
87ac4f57a2 | ||
|
|
a362d1b248 | ||
|
|
03a46f6024 | ||
|
|
a0ddc0459e | ||
|
|
312550e2f1 | ||
|
|
7479329761 | ||
|
|
493ab71d08 | ||
|
|
83b323341e | ||
|
|
937facd3be | ||
|
|
e6663754d6 | ||
|
|
fad0a5630e | ||
|
|
c553470b40 | ||
|
|
d740e32c29 | ||
|
|
33e125f977 | ||
|
|
2ab3de72f2 | ||
|
|
1d18fa1704 | ||
|
|
16202377fc | ||
|
|
7d78864f83 | ||
|
|
d12c1d2100 | ||
|
|
4887b8e1db | ||
|
|
720e7b38ec | ||
|
|
e86dc3a0a0 | ||
|
|
ade7b62c19 | ||
|
|
019f1a7320 | ||
|
|
d687f9e562 | ||
|
|
7e782af3c2 | ||
|
|
848c538299 | ||
|
|
b913678b8a | ||
|
|
6020f60383 | ||
|
|
073fada067 | ||
|
|
ff5e87fc27 | ||
|
|
78f67b5feb | ||
|
|
d0c2bfb2f5 | ||
|
|
63b280caeb | ||
|
|
aac07e66fd | ||
|
|
b4e43503bf | ||
|
|
54afd51b3a | ||
|
|
174f5ecd05 | ||
|
|
b536ae8b77 | ||
|
|
eb4b1a7afb | ||
|
|
02cdce62d9 | ||
|
|
3966ecab49 | ||
|
|
7dadc47c1b | ||
|
|
4f892a94ef | ||
|
|
5208bfc382 | ||
|
|
018e9ecc9c | ||
|
|
f57d92ec80 | ||
|
|
3e6fc1eca6 | ||
|
|
172da7e976 | ||
|
|
f9ef4cc92c | ||
|
|
b44f442f48 | ||
|
|
9a4153767f | ||
|
|
24bc08147b | ||
|
|
8f00ed3d74 | ||
|
|
a129b72394 | ||
|
|
84e6de3bf7 | ||
|
|
830fe68596 | ||
|
|
319c9261ea | ||
|
|
5e03e46680 | ||
|
|
e2294a6724 | ||
|
|
bd12a788e3 | ||
|
|
f8e33c583d | ||
|
|
9e818f7af3 | ||
|
|
dcbf725b9c | ||
|
|
b5d56655d7 | ||
|
|
b54e46ea05 | ||
|
|
949a0a703a | ||
|
|
e74aca7d00 | ||
|
|
2346cd064d | ||
|
|
9c8ba13643 | ||
|
|
85c219b710 | ||
|
|
9b0a9c1f74 | ||
|
|
7b1df8e079 | ||
|
|
e18178c1f9 | ||
|
|
7a4a3911f5 | ||
|
|
1b15e4578a | ||
|
|
f4ed696a46 | ||
|
|
1a59c34c1b | ||
|
|
1565a63bbc | ||
|
|
383ae98f1b | ||
|
|
3daf2bde40 | ||
|
|
88f9c73fd6 | ||
|
|
6dfe39f1b5 | ||
|
|
4642dacf8a | ||
|
|
268d8b5598 | ||
|
|
bb6c75974b | ||
|
|
afa4e74ddc | ||
|
|
706cfa6f90 | ||
|
|
b960dd7c4c | ||
|
|
67555c4fc0 | ||
|
|
fd22f8d537 | ||
|
|
50294038fe | ||
|
|
49eb1d1fbf | ||
|
|
e293157f49 | ||
|
|
0214fa56b1 | ||
|
|
69a3ca264d | ||
|
|
8f798aec36 | ||
|
|
dc2bd94fca | ||
|
|
808cac50a5 | ||
|
|
090f04b9ee | ||
|
|
2b54b3f575 | ||
|
|
a87b81dbdb | ||
|
|
e1c8742e99 | ||
|
|
99ba80f8da | ||
|
|
20345453a1 | ||
|
|
baedb6b79a | ||
|
|
811ab2c7a6 | ||
|
|
62a786dc94 | ||
|
|
53376e0f7f | ||
|
|
7b17d75488 | ||
|
|
ab9d07e517 | ||
|
|
9055354a5e | ||
|
|
47d0798248 | ||
|
|
b246afed00 | ||
|
|
e76616e44d | ||
|
|
4e4b365e0a | ||
|
|
6643c43bd6 | ||
|
|
ccf5338fb9 | ||
|
|
de18e13d33 | ||
|
|
0907419f5c | ||
|
|
249dbba996 | ||
|
|
cb653588ab | ||
|
|
b28d0d72b3 | ||
|
|
7e160bf3b7 | ||
|
|
2df7dd62bb | ||
|
|
8f9d6e8ab6 | ||
|
|
0b93eabfbb | ||
|
|
358da3d8ee | ||
|
|
2744851088 | ||
|
|
c3b9667eea | ||
|
|
bd028cc7ad | ||
|
|
c03f0c98d1 | ||
|
|
3b426d01bb | ||
|
|
ba6e505d18 | ||
|
|
ada75b1ce9 | ||
|
|
7fd70a9f6b | ||
|
|
85a1523143 | ||
|
|
cb51e5ac54 | ||
|
|
ca605c6942 | ||
|
|
400e1774a7 | ||
|
|
16fb2a71f9 | ||
|
|
bab8bd3f5a | ||
|
|
d93bdc3da7 | ||
|
|
1f478d0587 | ||
|
|
b2b159adc4 | ||
|
|
7529e811ee | ||
|
|
1211f9a85e | ||
|
|
d8b2da2c2e | ||
|
|
60e8db53ed | ||
|
|
cd68ff6c6d | ||
|
|
a8e81d22be | ||
|
|
88d51f8136 | ||
|
|
fedcc80947 | ||
|
|
fb7d6976dd | ||
|
|
740fd0e911 | ||
|
|
f0f40dffed | ||
|
|
5eb37c1bba | ||
|
|
ae168253d6 | ||
|
|
49d28e4206 | ||
|
|
9b6f4d6e14 | ||
|
|
8a5286b648 | ||
|
|
6113b65401 | ||
|
|
7d6e61dd70 | ||
|
|
ce6aba8c6f | ||
|
|
80b9aba49a | ||
|
|
28f4b2b6d6 | ||
|
|
133aa83b2e | ||
|
|
e009486509 | ||
|
|
5660706d6c | ||
|
|
4a1d98fb71 | ||
|
|
68bc5990bf | ||
|
|
20a46206f2 | ||
|
|
d1847b4c81 | ||
|
|
933ee30973 | ||
|
|
d8b1fa0a09 | ||
|
|
87bb6d5e6e | ||
|
|
0895c91987 | ||
|
|
adddcd6841 | ||
|
|
33a3a39871 |
9
.github/styles/Google/AMPM.yml
vendored
@ -1,9 +0,0 @@
|
||||
extends: existence
|
||||
message: "Use 'AM' or 'PM' (preceded by a space)."
|
||||
link: 'https://developers.google.com/style/word-list'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\d{1,2}[AP]M'
|
||||
- '\d{1,2} ?[ap]m'
|
||||
- '\d{1,2} ?[aApP]\.[mM]\.'
|
||||
64
.github/styles/Google/Acronyms.yml
vendored
@ -1,64 +0,0 @@
|
||||
extends: conditional
|
||||
message: "Spell out '%s', if it's unfamiliar to the audience."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
level: suggestion
|
||||
ignorecase: false
|
||||
# Ensures that the existence of 'first' implies the existence of 'second'.
|
||||
first: '\b([A-Z]{3,5})\b'
|
||||
second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
|
||||
# ... with the exception of these:
|
||||
exceptions:
|
||||
- API
|
||||
- ASP
|
||||
- CLI
|
||||
- CPU
|
||||
- CSS
|
||||
- CSV
|
||||
- DEBUG
|
||||
- DOM
|
||||
- DPI
|
||||
- FAQ
|
||||
- GCC
|
||||
- GDB
|
||||
- GET
|
||||
- GPU
|
||||
- GTK
|
||||
- GUI
|
||||
- HTML
|
||||
- HTTP
|
||||
- HTTPS
|
||||
- IDE
|
||||
- JAR
|
||||
- JSON
|
||||
- JSX
|
||||
- LESS
|
||||
- LLDB
|
||||
- NET
|
||||
- NOTE
|
||||
- NVDA
|
||||
- OSS
|
||||
- PATH
|
||||
- PDF
|
||||
- PHP
|
||||
- POST
|
||||
- RAM
|
||||
- REPL
|
||||
- RSA
|
||||
- SCM
|
||||
- SCSS
|
||||
- SDK
|
||||
- SQL
|
||||
- SSH
|
||||
- SSL
|
||||
- SVG
|
||||
- TBD
|
||||
- TCP
|
||||
- TODO
|
||||
- URI
|
||||
- URL
|
||||
- USB
|
||||
- UTF
|
||||
- XML
|
||||
- XSS
|
||||
- YAML
|
||||
- ZIP
|
||||
7
.github/styles/Google/Colons.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "'%s' should be in lowercase."
|
||||
link: 'https://developers.google.com/style/colons'
|
||||
nonword: true
|
||||
level: warning
|
||||
tokens:
|
||||
- ':\s[A-Z]'
|
||||
28
.github/styles/Google/Contractions.yml
vendored
@ -1,28 +0,0 @@
|
||||
extends: substitution
|
||||
message: "Feel free to use '%s' instead of '%s'."
|
||||
link: 'https://developers.google.com/style/contractions'
|
||||
level: suggestion
|
||||
ignorecase: true
|
||||
swap:
|
||||
are not: aren't
|
||||
cannot: can't
|
||||
could not: couldn't
|
||||
did not: didn't
|
||||
do not: don't
|
||||
does not: doesn't
|
||||
has not: hasn't
|
||||
have not: haven't
|
||||
how is: how's
|
||||
is not: isn't
|
||||
it is: it's
|
||||
should not: shouldn't
|
||||
that is: that's
|
||||
they are: they're
|
||||
was not: wasn't
|
||||
we are: we're
|
||||
we have: we've
|
||||
were not: weren't
|
||||
what is: what's
|
||||
when is: when's
|
||||
where is: where's
|
||||
will not: won't
|
||||
9
.github/styles/Google/DateFormat.yml
vendored
@ -1,9 +0,0 @@
|
||||
extends: existence
|
||||
message: "Use 'July 31, 2016' format, not '%s'."
|
||||
link: 'https://developers.google.com/style/dates-times'
|
||||
ignorecase: true
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\d{1,2}(?:\.|/)\d{1,2}(?:\.|/)\d{4}'
|
||||
- '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}'
|
||||
7
.github/styles/Google/Ellipses.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "In general, don't use an ellipsis."
|
||||
link: 'https://developers.google.com/style/ellipses'
|
||||
nonword: true
|
||||
level: warning
|
||||
tokens:
|
||||
- '\.\.\.'
|
||||
8
.github/styles/Google/EmDash.yml
vendored
@ -1,8 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't put a space before or after an em dash."
|
||||
link: 'https://developers.google.com/style/dashes'
|
||||
nonword: true
|
||||
level: error
|
||||
tokens:
|
||||
- '\s—'
|
||||
- '—\s'
|
||||
7
.github/styles/Google/EnDash.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Use an em dash ('—') instead of '–'."
|
||||
link: 'https://developers.google.com/style/dashes'
|
||||
nonword: true
|
||||
level: error
|
||||
tokens:
|
||||
- '–'
|
||||
7
.github/styles/Google/Exclamation.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't use exclamation points in text."
|
||||
link: 'https://developers.google.com/style/exclamation-points'
|
||||
nonword: true
|
||||
level: error
|
||||
tokens:
|
||||
- '!'
|
||||
11
.github/styles/Google/FirstPerson.yml
vendored
@ -1,11 +0,0 @@
|
||||
extends: existence
|
||||
message: "Avoid first-person pronouns such as '%s'."
|
||||
link: 'https://developers.google.com/style/pronouns#personal-pronouns'
|
||||
ignorecase: true
|
||||
level: warning
|
||||
nonword: true
|
||||
tokens:
|
||||
- (?:^|\s)I\s
|
||||
- \bme\b
|
||||
- \bus\b
|
||||
- \bours\b
|
||||
9
.github/styles/Google/Gender.yml
vendored
@ -1,9 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't use '%s' as a gender-neutral pronoun."
|
||||
link: 'https://developers.google.com/style/pronouns#gender-neutral-pronouns'
|
||||
level: error
|
||||
ignorecase: true
|
||||
tokens:
|
||||
- he/she
|
||||
- s/he
|
||||
- \(s\)he
|
||||
45
.github/styles/Google/GenderBias.yml
vendored
@ -1,45 +0,0 @@
|
||||
extends: substitution
|
||||
message: "Consider using '%s' instead of '%s'."
|
||||
link: 'https://developers.google.com/style/inclusive-documentation'
|
||||
ignorecase: true
|
||||
level: error
|
||||
swap:
|
||||
(?:alumna|alumnus): graduate
|
||||
(?:alumnae|alumni): graduates
|
||||
air(?:m[ae]n|wom[ae]n): pilot(s)
|
||||
anchor(?:m[ae]n|wom[ae]n): anchor(s)
|
||||
authoress: author
|
||||
camera(?:m[ae]n|wom[ae]n): camera operator(s)
|
||||
chair(?:m[ae]n|wom[ae]n): chair(s)
|
||||
congress(?:m[ae]n|wom[ae]n): member(s) of congress
|
||||
door(?:m[ae]|wom[ae]n): concierge(s)
|
||||
draft(?:m[ae]n|wom[ae]n): drafter(s)
|
||||
fire(?:m[ae]n|wom[ae]n): firefighter(s)
|
||||
fisher(?:m[ae]n|wom[ae]n): fisher(s)
|
||||
fresh(?:m[ae]n|wom[ae]n): first-year student(s)
|
||||
garbage(?:m[ae]n|wom[ae]n): waste collector(s)
|
||||
lady lawyer: lawyer
|
||||
ladylike: courteous
|
||||
landlord: building manager
|
||||
mail(?:m[ae]n|wom[ae]n): mail carriers
|
||||
man and wife: husband and wife
|
||||
man enough: strong enough
|
||||
mankind: human kind
|
||||
manmade: manufactured
|
||||
manpower: personnel
|
||||
men and girls: men and women
|
||||
middle(?:m[ae]n|wom[ae]n): intermediary
|
||||
news(?:m[ae]n|wom[ae]n): journalist(s)
|
||||
ombuds(?:man|woman): ombuds
|
||||
oneupmanship: upstaging
|
||||
poetess: poet
|
||||
police(?:m[ae]n|wom[ae]n): police officer(s)
|
||||
repair(?:m[ae]n|wom[ae]n): technician(s)
|
||||
sales(?:m[ae]n|wom[ae]n): salesperson or sales people
|
||||
service(?:m[ae]n|wom[ae]n): soldier(s)
|
||||
steward(?:ess)?: flight attendant
|
||||
tribes(?:m[ae]n|wom[ae]n): tribe member(s)
|
||||
waitress: waiter
|
||||
woman doctor: doctor
|
||||
woman scientist[s]?: scientist(s)
|
||||
work(?:m[ae]n|wom[ae]n): worker(s)
|
||||
8
.github/styles/Google/HeadingPunctuation.yml
vendored
@ -1,8 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't put a period at the end of a heading."
|
||||
link: 'https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings'
|
||||
nonword: true
|
||||
level: warning
|
||||
scope: heading
|
||||
tokens:
|
||||
- '[a-z0-9][.](?:\s|$)'
|
||||
26
.github/styles/Google/Headings.yml
vendored
@ -1,26 +0,0 @@
|
||||
extends: capitalization
|
||||
message: "'%s' should use sentence-style capitalization."
|
||||
link: 'https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings'
|
||||
level: warning
|
||||
scope: heading
|
||||
match: $sentence
|
||||
exceptions:
|
||||
- Azure
|
||||
- CLI
|
||||
- Code
|
||||
- Cosmos
|
||||
- Docker
|
||||
- Emmet
|
||||
- I
|
||||
- Kubernetes
|
||||
- Linux
|
||||
- macOS
|
||||
- Marketplace
|
||||
- MongoDB
|
||||
- REPL
|
||||
- Studio
|
||||
- TypeScript
|
||||
- URLs
|
||||
- Visual
|
||||
- VS
|
||||
- Windows
|
||||
8
.github/styles/Google/Hyphens.yml
vendored
@ -1,8 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't place a space on either side of a hyphen (unless it's suspended)."
|
||||
link: 'https://developers.google.com/style/hyphens'
|
||||
level: warning
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\s-'
|
||||
- '-\s'
|
||||
9
.github/styles/Google/Latin.yml
vendored
@ -1,9 +0,0 @@
|
||||
extends: substitution
|
||||
message: "Use '%s' instead of '%s'."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
ignorecase: true
|
||||
level: error
|
||||
nonword: true
|
||||
swap:
|
||||
'\b(?:eg|e\.g\.)[\s,]': for example
|
||||
'\b(?:ie|i\.e\.)[\s,]': that is
|
||||
8
.github/styles/Google/LyHyphens.yml
vendored
@ -1,8 +0,0 @@
|
||||
extends: existence
|
||||
message: "'%s' doesn't need a hyphen."
|
||||
link: 'https://developers.google.com/style/hyphens'
|
||||
level: error
|
||||
ignorecase: false
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\s[^\s-]+ly-'
|
||||
7
.github/styles/Google/OptionalPlurals.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't use plurals in parentheses such as in '%s'."
|
||||
link: 'https://developers.google.com/style/plurals-parentheses'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\b\w+\(s\)'
|
||||
7
.github/styles/Google/Ordinal.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Spell out all ordinal numbers ('%s') in text."
|
||||
link: 'https://developers.google.com/style/numbers'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- \d+(?:st|th|rd)
|
||||
7
.github/styles/Google/OxfordComma.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Use the Oxford comma in '%s'."
|
||||
link: 'https://developers.google.com/style/commas'
|
||||
scope: sentence
|
||||
level: warning
|
||||
tokens:
|
||||
- '(?:[^,]+,){1,}\s\w+\sand'
|
||||
7
.github/styles/Google/Parens.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Use parentheses judiciously."
|
||||
link: 'https://developers.google.com/style/parentheses'
|
||||
nonword: true
|
||||
level: suggestion
|
||||
tokens:
|
||||
- '\(.+\)'
|
||||
184
.github/styles/Google/Passive.yml
vendored
@ -1,184 +0,0 @@
|
||||
extends: existence
|
||||
link: 'https://developers.google.com/style/voice'
|
||||
message: "In general, use active voice instead of passive voice ('%s')."
|
||||
ignorecase: true
|
||||
level: suggestion
|
||||
raw:
|
||||
- \b(am|are|were|being|is|been|was|be)\b\s*
|
||||
tokens:
|
||||
- '[\w]+ed'
|
||||
- awoken
|
||||
- beat
|
||||
- become
|
||||
- been
|
||||
- begun
|
||||
- bent
|
||||
- beset
|
||||
- bet
|
||||
- bid
|
||||
- bidden
|
||||
- bitten
|
||||
- bled
|
||||
- blown
|
||||
- born
|
||||
- bought
|
||||
- bound
|
||||
- bred
|
||||
- broadcast
|
||||
- broken
|
||||
- brought
|
||||
- built
|
||||
- burnt
|
||||
- burst
|
||||
- cast
|
||||
- caught
|
||||
- chosen
|
||||
- clung
|
||||
- come
|
||||
- cost
|
||||
- crept
|
||||
- cut
|
||||
- dealt
|
||||
- dived
|
||||
- done
|
||||
- drawn
|
||||
- dreamt
|
||||
- driven
|
||||
- drunk
|
||||
- dug
|
||||
- eaten
|
||||
- fallen
|
||||
- fed
|
||||
- felt
|
||||
- fit
|
||||
- fled
|
||||
- flown
|
||||
- flung
|
||||
- forbidden
|
||||
- foregone
|
||||
- forgiven
|
||||
- forgotten
|
||||
- forsaken
|
||||
- fought
|
||||
- found
|
||||
- frozen
|
||||
- given
|
||||
- gone
|
||||
- gotten
|
||||
- ground
|
||||
- grown
|
||||
- heard
|
||||
- held
|
||||
- hidden
|
||||
- hit
|
||||
- hung
|
||||
- hurt
|
||||
- kept
|
||||
- knelt
|
||||
- knit
|
||||
- known
|
||||
- laid
|
||||
- lain
|
||||
- leapt
|
||||
- learnt
|
||||
- led
|
||||
- left
|
||||
- lent
|
||||
- let
|
||||
- lighted
|
||||
- lost
|
||||
- made
|
||||
- meant
|
||||
- met
|
||||
- misspelt
|
||||
- mistaken
|
||||
- mown
|
||||
- overcome
|
||||
- overdone
|
||||
- overtaken
|
||||
- overthrown
|
||||
- paid
|
||||
- pled
|
||||
- proven
|
||||
- put
|
||||
- quit
|
||||
- read
|
||||
- rid
|
||||
- ridden
|
||||
- risen
|
||||
- run
|
||||
- rung
|
||||
- said
|
||||
- sat
|
||||
- sawn
|
||||
- seen
|
||||
- sent
|
||||
- set
|
||||
- sewn
|
||||
- shaken
|
||||
- shaven
|
||||
- shed
|
||||
- shod
|
||||
- shone
|
||||
- shorn
|
||||
- shot
|
||||
- shown
|
||||
- shrunk
|
||||
- shut
|
||||
- slain
|
||||
- slept
|
||||
- slid
|
||||
- slit
|
||||
- slung
|
||||
- smitten
|
||||
- sold
|
||||
- sought
|
||||
- sown
|
||||
- sped
|
||||
- spent
|
||||
- spilt
|
||||
- spit
|
||||
- split
|
||||
- spoken
|
||||
- spread
|
||||
- sprung
|
||||
- spun
|
||||
- stolen
|
||||
- stood
|
||||
- stridden
|
||||
- striven
|
||||
- struck
|
||||
- strung
|
||||
- stuck
|
||||
- stung
|
||||
- stunk
|
||||
- sung
|
||||
- sunk
|
||||
- swept
|
||||
- swollen
|
||||
- sworn
|
||||
- swum
|
||||
- swung
|
||||
- taken
|
||||
- taught
|
||||
- thought
|
||||
- thrived
|
||||
- thrown
|
||||
- thrust
|
||||
- told
|
||||
- torn
|
||||
- trodden
|
||||
- understood
|
||||
- upheld
|
||||
- upset
|
||||
- wed
|
||||
- wept
|
||||
- withheld
|
||||
- withstood
|
||||
- woken
|
||||
- won
|
||||
- worn
|
||||
- wound
|
||||
- woven
|
||||
- written
|
||||
- wrung
|
||||
7
.github/styles/Google/Periods.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't use periods with acronyms or initialisms such as '%s'."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\b(?:[A-Z]\.){3,}'
|
||||
7
.github/styles/Google/Quotes.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Commas and periods go inside quotation marks."
|
||||
link: 'https://developers.google.com/style/quotation-marks'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '"[^"]+"[.,?]'
|
||||
7
.github/styles/Google/Ranges.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't add words such as 'from' or 'between' to describe a range of numbers."
|
||||
link: 'https://developers.google.com/style/hyphens'
|
||||
nonword: true
|
||||
level: warning
|
||||
tokens:
|
||||
- '(?:from|between)\s\d+\s?-\s?\d+'
|
||||
8
.github/styles/Google/Semicolons.yml
vendored
@ -1,8 +0,0 @@
|
||||
extends: existence
|
||||
message: "Use semicolons judiciously."
|
||||
link: 'https://developers.google.com/style/semicolons'
|
||||
nonword: true
|
||||
scope: sentence
|
||||
level: suggestion
|
||||
tokens:
|
||||
- ';'
|
||||
11
.github/styles/Google/Slang.yml
vendored
@ -1,11 +0,0 @@
|
||||
extends: existence
|
||||
message: "Don't use internet slang abbreviations such as '%s'."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
ignorecase: true
|
||||
level: error
|
||||
tokens:
|
||||
- 'tl;dr'
|
||||
- ymmv
|
||||
- rtfm
|
||||
- imo
|
||||
- fwiw
|
||||
8
.github/styles/Google/Spacing.yml
vendored
@ -1,8 +0,0 @@
|
||||
extends: existence
|
||||
message: "'%s' should have one space."
|
||||
link: 'https://developers.google.com/style/sentence-spacing'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '[.?!] {2,}[A-Z]'
|
||||
- '[.?!][A-Z]'
|
||||
8
.github/styles/Google/Spelling.yml
vendored
@ -1,8 +0,0 @@
|
||||
extends: existence
|
||||
message: "In general, use American spelling instead of '%s'."
|
||||
link: 'https://developers.google.com/style/spelling'
|
||||
ignorecase: true
|
||||
level: warning
|
||||
tokens:
|
||||
- '(?:\w+)nised?'
|
||||
- '(?:\w+)logue'
|
||||
7
.github/styles/Google/Units.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Put a nonbreaking space between the number and the unit in '%s'."
|
||||
link: 'https://developers.google.com/style/units-of-measure'
|
||||
nonword: true
|
||||
level: error
|
||||
tokens:
|
||||
- \d+(?:GB|TB|MB)
|
||||
7
.github/styles/Google/Will.yml
vendored
@ -1,7 +0,0 @@
|
||||
extends: existence
|
||||
message: "Avoid using '%s'."
|
||||
link: 'https://developers.google.com/style/tense'
|
||||
ignorecase: true
|
||||
level: warning
|
||||
tokens:
|
||||
- will
|
||||
79
.github/styles/Google/WordList.yml
vendored
@ -1,79 +0,0 @@
|
||||
extends: substitution
|
||||
message: "Use %s instead of '%s'."
|
||||
link: 'https://developers.google.com/style/word-list'
|
||||
level: warning
|
||||
ignorecase: false
|
||||
swap:
|
||||
'(?:API Console|dev|developer) key': "'API key'"
|
||||
'(?:cell ?phone|smart ?phone)': "'phone' or 'mobile phone'"
|
||||
'(?:dev|developer|APIs) console': "'API console'"
|
||||
'(?:e-mail|Email|E-mail)': "'email'"
|
||||
'(?:file ?path|path ?name)': "'path'"
|
||||
'(?:kill|terminate)': "'stop', 'exit', 'cancel', or 'end'"
|
||||
'(?:OAuth ?2|Oauth)': "'OAuth 2.0'"
|
||||
'(?:ok|Okay)': "'OK' or 'okay'"
|
||||
'(?:WiFi|wifi)': "'Wi-Fi'"
|
||||
'[\.]+apk': "'APK'"
|
||||
'3\-D': "'3D'"
|
||||
'Google (?:I\-O|IO)': "'Google I/O'"
|
||||
'tap (?:&|and) hold': "'touch & hold'"
|
||||
'un(?:check|select)': "'clear'"
|
||||
abort: "'stop', 'exit', 'cancel' or 'end'"
|
||||
above: "'preceding'"
|
||||
account name: "'username'"
|
||||
action bar: "'app bar'"
|
||||
admin: "'administrator'"
|
||||
Ajax: "'AJAX'"
|
||||
Android device: "'Android-powered device'"
|
||||
android: "'Android'"
|
||||
API explorer: "'APIs Explorer'"
|
||||
application: "'app'"
|
||||
approx\.: "'approximately'"
|
||||
authN: "'authentication'"
|
||||
authZ: "'authorization'"
|
||||
autoupdate: "'automatically update'"
|
||||
cellular data: "'mobile data'"
|
||||
cellular network: "'mobile network'"
|
||||
chapter: "'documents', 'pages', 'sections'"
|
||||
check box: "'checkbox'"
|
||||
check: "'select'"
|
||||
CLI: "'command-line tool'"
|
||||
click on: "'click' or 'click in'"
|
||||
Cloud: "'Google Cloud Platform' or 'GCP'"
|
||||
Container Engine: "'Kubernetes Engine'"
|
||||
content type: "'media type'"
|
||||
curated roles: "'predefined roles'"
|
||||
data are: "'data is'"
|
||||
Developers Console: "'Google API Console' or 'API Console'"
|
||||
disabled?: "'turn off' or 'off'"
|
||||
ephemeral IP address: "'ephemeral external IP address'"
|
||||
fewer data: "'less data'"
|
||||
file name: "'filename'"
|
||||
firewalls: "'firewall rules'"
|
||||
functionality: "'capability' or 'feature'"
|
||||
Google account: "'Google Account'"
|
||||
Google accounts: "'Google Accounts'"
|
||||
Googling: "'search with Google'"
|
||||
grayed-out: "'unavailable'"
|
||||
HTTPs: "'HTTPS'"
|
||||
in order to: "'to'"
|
||||
ingest: "'import' or 'load'"
|
||||
k8s: "'Kubernetes'"
|
||||
long press: "'touch & hold'"
|
||||
network IP address: "'internal IP address'"
|
||||
omnibox: "'address bar'"
|
||||
open-source: "'open source'"
|
||||
overview screen: "'recents screen'"
|
||||
regex: "'regular expression'"
|
||||
SHA1: "'SHA-1' or 'HAS-SHA1'"
|
||||
sign into: "'sign in to'"
|
||||
sign-?on: "'single sign-on'"
|
||||
static IP address: "'static external IP address'"
|
||||
stylesheet: "'style sheet'"
|
||||
synch: "'sync'"
|
||||
tablename: "'table name'"
|
||||
tablet: "'device'"
|
||||
touch: "'tap'"
|
||||
url: "'URL'"
|
||||
vs\.: "'versus'"
|
||||
World Wide Web: "'web'"
|
||||
16
.github/styles/Google/meta.json
vendored
@ -1,16 +0,0 @@
|
||||
{
|
||||
"author": "Joseph Kato",
|
||||
"description": "A Vale-compatible implementation of the Microsoft Writing Style Guide.",
|
||||
"email": "support@errata.ai",
|
||||
"lang": "en",
|
||||
"url": "https://github.com/errata-ai/Google/releases/latest/download/Google.zip",
|
||||
"feed": "https://github.com/errata-ai/Google/releases.atom",
|
||||
"issues": "https://github.com/errata-ai/Google/issues/new",
|
||||
"license": "MIT",
|
||||
"name": "Google",
|
||||
"sources": [
|
||||
"https://developers.google.com/style/"
|
||||
],
|
||||
"vale_version": ">=1.0.0",
|
||||
"coverage": 0.0
|
||||
}
|
||||
0
.github/styles/Google/vocab.txt
vendored
9
.github/styles/VyOS/Terminology.yml
vendored
@ -1,9 +0,0 @@
|
||||
extends: substitution
|
||||
message: Prefer '%s' over '%s'
|
||||
ignorecase: false
|
||||
level: error
|
||||
swap:
|
||||
vyos: VyOS
|
||||
Vyos: VyOS
|
||||
VYOS: VyOS
|
||||
Gre: GRE
|
||||
177
.github/vyos-linter.py
vendored
@ -1,177 +0,0 @@
|
||||
import os
|
||||
import re
|
||||
import ipaddress
|
||||
import sys
|
||||
import ast
|
||||
|
||||
IPV4SEG = r'(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])'
|
||||
IPV4ADDR = r'\b(?:(?:' + IPV4SEG + r'\.){3,3}' + IPV4SEG + r')\b'
|
||||
IPV6SEG = r'(?:(?:[0-9a-fA-F]){1,4})'
|
||||
IPV6GROUPS = (
|
||||
r'(?:' + IPV6SEG + r':){7,7}' + IPV6SEG, # 1:2:3:4:5:6:7:8
|
||||
r'(?:\s' + IPV6SEG + r':){1,7}:', # 1:: 1:2:3:4:5:6:7::
|
||||
r'(?:' + IPV6SEG + r':){1,6}:' + IPV6SEG, # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8
|
||||
r'(?:' + IPV6SEG + r':){1,5}(?::' + IPV6SEG + r'){1,2}', # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8
|
||||
r'(?:' + IPV6SEG + r':){1,4}(?::' + IPV6SEG + r'){1,3}', # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8
|
||||
r'(?:' + IPV6SEG + r':){1,3}(?::' + IPV6SEG + r'){1,4}', # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8
|
||||
r'(?:' + IPV6SEG + r':){1,2}(?::' + IPV6SEG + r'){1,5}', # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8
|
||||
IPV6SEG + r':(?:(?::' + IPV6SEG + r'){1,6})', # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8
|
||||
r':(?:(?::' + IPV6SEG + r'){1,7}|:)', # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::
|
||||
r'fe80:(?::' + IPV6SEG + r'){0,4}%[0-9a-zA-Z]{1,}', # fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index)
|
||||
r'::(?:ffff(?::0{1,4}){0,1}:){0,1}[^\s:]' + IPV4ADDR, # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
|
||||
r'(?:' + IPV6SEG + r':){1,4}:[^\s:]' + IPV4ADDR, # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
|
||||
)
|
||||
IPV6ADDR = '|'.join(['(?:{})'.format(g) for g in IPV6GROUPS[::-1]]) # Reverse rows for greedy match
|
||||
|
||||
MAC = r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})'
|
||||
|
||||
NUMBER = r"([\s']\d+[\s'])"
|
||||
|
||||
|
||||
def lint_mac(cnt, line):
|
||||
mac = re.search(MAC, line, re.I)
|
||||
if mac is not None:
|
||||
mac = mac.group()
|
||||
u_mac = re.search(r'((00)[:-](53)([:-][0-9A-F]{2}){4})', mac, re.I)
|
||||
m_mac = re.search(r'((90)[:-](10)([:-][0-9A-F]{2}){4})', mac, re.I)
|
||||
if u_mac is None and m_mac is None:
|
||||
return (f"Use MAC reserved for Documentation (RFC7042): {mac}", cnt, 'error')
|
||||
|
||||
|
||||
def lint_ipv4(cnt, line):
|
||||
ip = re.search(IPV4ADDR, line, re.I)
|
||||
if ip is not None:
|
||||
ip = ipaddress.ip_address(ip.group().strip(' '))
|
||||
# https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv4Address.is_private
|
||||
if ip.is_private:
|
||||
return None
|
||||
if ip.is_multicast:
|
||||
return None
|
||||
if ip.is_global is False:
|
||||
return None
|
||||
return (f"Use IPv4 reserved for Documentation (RFC 5737) or private Space: {ip}", cnt, 'error')
|
||||
|
||||
|
||||
def lint_ipv6(cnt, line):
|
||||
ip = re.search(IPV6ADDR, line, re.I)
|
||||
if ip is not None:
|
||||
ip = ipaddress.ip_address(ip.group().strip(' '))
|
||||
if ip.is_private:
|
||||
return None
|
||||
if ip.is_multicast:
|
||||
return None
|
||||
if ip.is_global is False:
|
||||
return None
|
||||
return (f"Use IPv6 reserved for Documentation (RFC 3849) or private Space: {ip}", cnt, 'error')
|
||||
|
||||
|
||||
def lint_AS(cnt, line):
|
||||
number = re.search(NUMBER, line, re.I)
|
||||
if number:
|
||||
pass
|
||||
# find a way to detect AS numbers
|
||||
|
||||
|
||||
def lint_linelen(cnt, line):
|
||||
line = line.rstrip()
|
||||
if len(line) > 80:
|
||||
return (f"Line too long: len={len(line)}", cnt, 'warning')
|
||||
|
||||
def handle_file_action(filepath):
|
||||
errors = []
|
||||
try:
|
||||
with open(filepath) as fp:
|
||||
line = fp.readline()
|
||||
cnt = 1
|
||||
test_line_lenght = True
|
||||
start_vyoslinter = True
|
||||
indentation = 0
|
||||
while line:
|
||||
# search for ignore linter comments in lines
|
||||
if ".. stop_vyoslinter" in line:
|
||||
start_vyoslinter = False
|
||||
if ".. start_vyoslinter" in line:
|
||||
start_vyoslinter = True
|
||||
if start_vyoslinter:
|
||||
# ignore every '.. code-block::' for line lenght
|
||||
# rst code-block have its own style in html the format in rst
|
||||
# and the build page must be the same
|
||||
if test_line_lenght is False:
|
||||
if len(line) > indentation:
|
||||
#print(f"'{line}'")
|
||||
#print(indentation)
|
||||
if line[indentation].isspace() is False:
|
||||
test_line_lenght = True
|
||||
|
||||
if ".. code-block::" in line:
|
||||
test_line_lenght = False
|
||||
indentation = 0
|
||||
for i in line:
|
||||
if i.isspace():
|
||||
indentation = indentation + 1
|
||||
else:
|
||||
break
|
||||
|
||||
err_mac = lint_mac(cnt, line.strip())
|
||||
# disable mac detection for the moment, too many false positives
|
||||
err_mac = None
|
||||
err_ip4 = lint_ipv4(cnt, line.strip())
|
||||
err_ip6 = lint_ipv6(cnt, line.strip())
|
||||
if test_line_lenght:
|
||||
err_len = lint_linelen(cnt, line)
|
||||
else:
|
||||
err_len = None
|
||||
if err_mac:
|
||||
errors.append(err_mac)
|
||||
if err_ip4:
|
||||
errors.append(err_ip4)
|
||||
if err_ip6:
|
||||
errors.append(err_ip6)
|
||||
if err_len:
|
||||
errors.append(err_len)
|
||||
|
||||
line = fp.readline()
|
||||
cnt += 1
|
||||
|
||||
# ensure linter was not stop on top and forgot to tun on again
|
||||
if start_vyoslinter == False:
|
||||
errors.append((f"Don't forgett to turn linter back on", cnt, 'error'))
|
||||
finally:
|
||||
fp.close()
|
||||
|
||||
if len(errors) > 0:
|
||||
'''
|
||||
"::{$type} file={$filename},line={$line},col=$column::{$log}"
|
||||
'''
|
||||
print(f"File: {filepath}")
|
||||
for error in errors:
|
||||
print(f"::{error[2]} file={filepath},line={error[1]}::{error[0]}")
|
||||
print('')
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
bool_error = True
|
||||
print('start')
|
||||
try:
|
||||
files = ast.literal_eval(sys.argv[1])
|
||||
for file in files:
|
||||
if file[-4:] in [".rst", ".txt"] and "_build" not in file:
|
||||
if handle_file_action(file) is False:
|
||||
bool_error = False
|
||||
except Exception as e:
|
||||
for root, dirs, files in os.walk("docs"):
|
||||
path = root.split(os.sep)
|
||||
for file in files:
|
||||
if file[-4:] in [".rst", ".txt"] and "_build" not in path:
|
||||
fpath = '/'.join(path)
|
||||
filepath = f"{fpath}/{file}"
|
||||
if handle_file_action(filepath) is False:
|
||||
bool_error = False
|
||||
|
||||
return bool_error
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if main() == False:
|
||||
exit(1)
|
||||
14
.github/workflows/auto-author-assign.yml
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
name: "PR Triage"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, reopened, ready_for_review, locked]
|
||||
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
assign-author:
|
||||
uses: vyos/.github/.github/workflows/assign-author.yml@feature/T6349-reusable-workflows
|
||||
secrets: inherit
|
||||
14
.github/workflows/check-pr-conflicts.yml
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
name: "PR Conflicts checker"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [synchronize]
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check-pr-conflict-call:
|
||||
uses: vyos/.github/.github/workflows/check-pr-merge-conflict.yml@feature/T6349-reusable-workflows
|
||||
secrets: inherit
|
||||
10
.github/workflows/lint-doc.yml
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
name: Lint Doc
|
||||
on:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
lint-doc:
|
||||
uses: vyos/.github/.github/workflows/lint-doc.yml@feature/T6349-reusable-workflows
|
||||
secrets: inherit
|
||||
|
||||
|
||||
32
.github/workflows/main.yml
vendored
@ -1,32 +0,0 @@
|
||||
name: Linting
|
||||
on:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: File Changes
|
||||
id: file_changes
|
||||
uses: trilom/file-changes-action@v1.2.3
|
||||
|
||||
#- name: Vale
|
||||
# uses: errata-ai/vale-action@v1.3.0
|
||||
# with:
|
||||
# files: '${{ steps.file_changes.outputs.files_modified }}'
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- name: run python based linter
|
||||
run: python .github/vyos-linter.py '${{ steps.file_changes.outputs.files_modified }}'
|
||||
|
||||
env:
|
||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
|
||||
|
||||
8
.gitignore
vendored
@ -1,10 +1,13 @@
|
||||
# Sphinx
|
||||
_build/
|
||||
localazy_private.json
|
||||
|
||||
# python virtualenv
|
||||
venv/
|
||||
ENV/
|
||||
.venv
|
||||
Pipfile.lock
|
||||
Pipfile
|
||||
|
||||
# put various editor ignores here
|
||||
.vscode/
|
||||
@ -12,6 +15,9 @@ ENV/
|
||||
*.vpw
|
||||
*.vpwhist
|
||||
*.vtg
|
||||
.idea/
|
||||
.idea
|
||||
.idea/*
|
||||
|
||||
# python cache files
|
||||
*.pyc
|
||||
@ -22,4 +28,4 @@ __pycache__
|
||||
.envrc
|
||||
|
||||
# os specific
|
||||
.DS_Store
|
||||
.DS_Store
|
||||
@ -4,6 +4,10 @@
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.10"
|
||||
|
||||
# Build documentation in the docs/ directory with Sphinx
|
||||
sphinx:
|
||||
@ -19,9 +23,8 @@ formats:
|
||||
|
||||
# Optionally set the version of Python and requirements required to build your docs
|
||||
python:
|
||||
version: 3.7
|
||||
install:
|
||||
- requirements: requirements.txt
|
||||
|
||||
submodules:
|
||||
include: all
|
||||
include: all
|
||||
|
||||
866
.tx/config
Normal file
@ -0,0 +1,866 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[documentation-1-3.docs__build_gettext_coverage]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/coverage.po
|
||||
source_file = docs/_build/gettext/coverage.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_cli]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/cli.po
|
||||
source_file = docs/_build/gettext/cli.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_copyright]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/copyright.po
|
||||
source_file = docs/_build/gettext/copyright.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_quick-start]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/quick-start.po
|
||||
source_file = docs/_build/gettext/quick-start.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_debugging]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/debugging.po
|
||||
source_file = docs/_build/gettext/debugging.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/index.po
|
||||
source_file = docs/_build/gettext/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_documentation]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/documentation.po
|
||||
source_file = docs/_build/gettext/documentation.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_testing]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/testing.po
|
||||
source_file = docs/_build/gettext/testing.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_404]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/404.po
|
||||
source_file = docs/_build/gettext/404.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_operation_information]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/operation/information.po
|
||||
source_file = docs/_build/gettext/operation/information.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_operation_password-recovery]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/operation/password-recovery.po
|
||||
source_file = docs/_build/gettext/operation/password-recovery.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_operation_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/operation/index.po
|
||||
source_file = docs/_build/gettext/operation/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_operation_raid]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/operation/raid.po
|
||||
source_file = docs/_build/gettext/operation/raid.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_operation_boot-options]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/operation/boot-options.po
|
||||
source_file = docs/_build/gettext/operation/boot-options.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/index.po
|
||||
source_file = docs/_build/gettext/configuration/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_zonepolicy_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/zonepolicy/index.po
|
||||
source_file = docs/_build/gettext/configuration/zonepolicy/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_dmvpn]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/dmvpn.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/dmvpn.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_openconnect]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/openconnect.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/openconnect.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_site2site_ipsec]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/site2site_ipsec.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/site2site_ipsec.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_rsa-keys]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/rsa-keys.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/rsa-keys.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_sstp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/sstp.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/sstp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_ipsec]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/ipsec.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/ipsec.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_pptp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/pptp.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/pptp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/index.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vpn_l2tp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vpn/l2tp.po
|
||||
source_file = docs/_build/gettext/configuration/vpn/l2tp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_nat_nptv6]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/nat/nptv6.po
|
||||
source_file = docs/_build/gettext/configuration/nat/nptv6.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_nat_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/nat/index.po
|
||||
source_file = docs/_build/gettext/configuration/nat/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_loadbalancing_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/loadbalancing/index.po
|
||||
source_file = docs/_build/gettext/configuration/loadbalancing/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_firewall_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/firewall/index.po
|
||||
source_file = docs/_build/gettext/configuration/firewall/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_flow-accounting]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/flow-accounting.po
|
||||
source_file = docs/_build/gettext/configuration/system/flow-accounting.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_lcd]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/lcd.po
|
||||
source_file = docs/_build/gettext/configuration/system/lcd.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_host-name]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/host-name.po
|
||||
source_file = docs/_build/gettext/configuration/system/host-name.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_syslog]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/syslog.po
|
||||
source_file = docs/_build/gettext/configuration/system/syslog.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_proxy]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/proxy.po
|
||||
source_file = docs/_build/gettext/configuration/system/proxy.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_time-zone]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/time-zone.po
|
||||
source_file = docs/_build/gettext/configuration/system/time-zone.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_name-server]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/name-server.po
|
||||
source_file = docs/_build/gettext/configuration/system/name-server.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_task-scheduler]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/task-scheduler.po
|
||||
source_file = docs/_build/gettext/configuration/system/task-scheduler.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_ip]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/ip.po
|
||||
source_file = docs/_build/gettext/configuration/system/ip.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_console]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/console.po
|
||||
source_file = docs/_build/gettext/configuration/system/console.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_option]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/option.po
|
||||
source_file = docs/_build/gettext/configuration/system/option.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_conntrack]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/conntrack.po
|
||||
source_file = docs/_build/gettext/configuration/system/conntrack.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/index.po
|
||||
source_file = docs/_build/gettext/configuration/system/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_ipv6]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/ipv6.po
|
||||
source_file = docs/_build/gettext/configuration/system/ipv6.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_eventhandler]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/eventhandler.po
|
||||
source_file = docs/_build/gettext/configuration/system/eventhandler.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_acceleration]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/acceleration.po
|
||||
source_file = docs/_build/gettext/configuration/system/acceleration.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_ntp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/ntp.po
|
||||
source_file = docs/_build/gettext/configuration/system/ntp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_default-route]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/default-route.po
|
||||
source_file = docs/_build/gettext/configuration/system/default-route.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_system_login]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/system/login.po
|
||||
source_file = docs/_build/gettext/configuration/system/login.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_highavailability_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/highavailability/index.po
|
||||
source_file = docs/_build/gettext/configuration/highavailability/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_vrf_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/vrf/index.po
|
||||
source_file = docs/_build/gettext/configuration/vrf/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_trafficpolicy_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/trafficpolicy/index.po
|
||||
source_file = docs/_build/gettext/configuration/trafficpolicy/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_lldp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/lldp.po
|
||||
source_file = docs/_build/gettext/configuration/service/lldp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_salt-minion]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/salt-minion.po
|
||||
source_file = docs/_build/gettext/configuration/service/salt-minion.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_mdns]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/mdns.po
|
||||
source_file = docs/_build/gettext/configuration/service/mdns.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_ipoe-server]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/ipoe-server.po
|
||||
source_file = docs/_build/gettext/configuration/service/ipoe-server.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_conntrack-sync]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/conntrack-sync.po
|
||||
source_file = docs/_build/gettext/configuration/service/conntrack-sync.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_broadcast-relay]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/broadcast-relay.po
|
||||
source_file = docs/_build/gettext/configuration/service/broadcast-relay.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_dhcp-relay]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/dhcp-relay.po
|
||||
source_file = docs/_build/gettext/configuration/service/dhcp-relay.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_tftp-server]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/tftp-server.po
|
||||
source_file = docs/_build/gettext/configuration/service/tftp-server.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_ssh]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/ssh.po
|
||||
source_file = docs/_build/gettext/configuration/service/ssh.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_router-advert]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/router-advert.po
|
||||
source_file = docs/_build/gettext/configuration/service/router-advert.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_pppoe-server]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/pppoe-server.po
|
||||
source_file = docs/_build/gettext/configuration/service/pppoe-server.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_snmp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/snmp.po
|
||||
source_file = docs/_build/gettext/configuration/service/snmp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_webproxy]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/webproxy.po
|
||||
source_file = docs/_build/gettext/configuration/service/webproxy.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_https]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/https.po
|
||||
source_file = docs/_build/gettext/configuration/service/https.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_dhcp-server]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/dhcp-server.po
|
||||
source_file = docs/_build/gettext/configuration/service/dhcp-server.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/index.po
|
||||
source_file = docs/_build/gettext/configuration/service/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_console-server]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/console-server.po
|
||||
source_file = docs/_build/gettext/configuration/service/console-server.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_service_dns]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/service/dns.po
|
||||
source_file = docs/_build/gettext/configuration/service/dns.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_rip]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/rip.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/rip.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_rpki]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/rpki.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/rpki.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_bgp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/bgp.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/bgp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_bfd]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/bfd.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/bfd.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_mpls]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/mpls.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/mpls.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_ospf]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/ospf.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/ospf.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/index.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_igmp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/igmp.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/igmp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_static]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/static.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/static.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_protocols_isis]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/protocols/isis.po
|
||||
source_file = docs/_build/gettext/configuration/protocols/isis.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_policy_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/policy/index.po
|
||||
source_file = docs/_build/gettext/configuration/policy/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_wireguard]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/wireguard.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/wireguard.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_geneve]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/geneve.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/geneve.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_loopback]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/loopback.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/loopback.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_l2tpv3]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/l2tpv3.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/l2tpv3.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_ethernet]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/ethernet.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/ethernet.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_vti]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/vti.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/vti.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_pppoe]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/pppoe.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/pppoe.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_bonding]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/bonding.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/bonding.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_pseudo-ethernet]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/pseudo-ethernet.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/pseudo-ethernet.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_macsec]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/macsec.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/macsec.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_bridge]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/bridge.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/bridge.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_dummy]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/dummy.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/dummy.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_tunnel]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/tunnel.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/tunnel.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_wwan]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/wwan.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/wwan.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/index.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_wireless]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/wireless.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/wireless.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_vxlan]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/vxlan.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/vxlan.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configuration_interfaces_openvpn]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configuration/interfaces/openvpn.po
|
||||
source_file = docs/_build/gettext/configuration/interfaces/openvpn.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_changelog_1]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/changelog/1.po
|
||||
source_file = docs/_build/gettext/changelog/1.3.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_changelog_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/changelog/index.po
|
||||
source_file = docs/_build/gettext/changelog/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_contributing_issues-features]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/contributing/issues-features.po
|
||||
source_file = docs/_build/gettext/contributing/issues-features.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_contributing_build-vyos]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/contributing/build-vyos.po
|
||||
source_file = docs/_build/gettext/contributing/build-vyos.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_contributing_development]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/contributing/development.po
|
||||
source_file = docs/_build/gettext/contributing/development.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_contributing_upstream-packages]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/contributing/upstream-packages.po
|
||||
source_file = docs/_build/gettext/contributing/upstream-packages.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_contributing_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/contributing/index.po
|
||||
source_file = docs/_build/gettext/contributing/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_introducing_about]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/introducing/about.po
|
||||
source_file = docs/_build/gettext/introducing/about.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_introducing_history]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/introducing/history.po
|
||||
source_file = docs/_build/gettext/introducing/history.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_image]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/image.po
|
||||
source_file = docs/_build/gettext/installation/image.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_vyos-on-baremetal]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/vyos-on-baremetal.po
|
||||
source_file = docs/_build/gettext/installation/vyos-on-baremetal.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_migrate-from-vyatta]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/migrate-from-vyatta.po
|
||||
source_file = docs/_build/gettext/installation/migrate-from-vyatta.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/index.po
|
||||
source_file = docs/_build/gettext/installation/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_install]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/install.po
|
||||
source_file = docs/_build/gettext/installation/install.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_update]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/update.po
|
||||
source_file = docs/_build/gettext/installation/update.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_virtual_gns3]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/virtual/gns3.po
|
||||
source_file = docs/_build/gettext/installation/virtual/gns3.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_virtual_eve-ng]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/virtual/eve-ng.po
|
||||
source_file = docs/_build/gettext/installation/virtual/eve-ng.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_virtual_proxmox]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/virtual/proxmox.po
|
||||
source_file = docs/_build/gettext/installation/virtual/proxmox.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_virtual_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/virtual/index.po
|
||||
source_file = docs/_build/gettext/installation/virtual/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_virtual_libvirt]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/virtual/libvirt.po
|
||||
source_file = docs/_build/gettext/installation/virtual/libvirt.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_virtual_vmware]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/virtual/vmware.po
|
||||
source_file = docs/_build/gettext/installation/virtual/vmware.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_cloud_azure]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/cloud/azure.po
|
||||
source_file = docs/_build/gettext/installation/cloud/azure.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_cloud_gcp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/cloud/gcp.po
|
||||
source_file = docs/_build/gettext/installation/cloud/gcp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_cloud_aws]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/cloud/aws.po
|
||||
source_file = docs/_build/gettext/installation/cloud/aws.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_cloud_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/cloud/index.po
|
||||
source_file = docs/_build/gettext/installation/cloud/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_installation_cloud_oracel]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/installation/cloud/oracel.po
|
||||
source_file = docs/_build/gettext/installation/cloud/oracel.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_troubleshooting_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/troubleshooting/index.po
|
||||
source_file = docs/_build/gettext/troubleshooting/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_automation_vyos-napalm]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/automation/vyos-napalm.po
|
||||
source_file = docs/_build/gettext/automation/vyos-napalm.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_automation_command-scripting]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/automation/command-scripting.po
|
||||
source_file = docs/_build/gettext/automation/command-scripting.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_automation_vyos-api]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/automation/vyos-api.po
|
||||
source_file = docs/_build/gettext/automation/vyos-api.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_automation_vyos-netmiko]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/automation/vyos-netmiko.po
|
||||
source_file = docs/_build/gettext/automation/vyos-netmiko.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_automation_cloud-init]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/automation/cloud-init.po
|
||||
source_file = docs/_build/gettext/automation/cloud-init.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_automation_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/automation/index.po
|
||||
source_file = docs/_build/gettext/automation/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_automation_vyos-ansible]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/automation/vyos-ansible.po
|
||||
source_file = docs/_build/gettext/automation/vyos-ansible.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_azure-vpn-dual-bgp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/azure-vpn-dual-bgp.po
|
||||
source_file = docs/_build/gettext/configexamples/azure-vpn-dual-bgp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_azure-vpn-bgp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/azure-vpn-bgp.po
|
||||
source_file = docs/_build/gettext/configexamples/azure-vpn-bgp.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_dual-hub-dmvpn]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/dual-hub-dmvpn.po
|
||||
source_file = docs/_build/gettext/configexamples/dual-hub-dmvpn.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_zone-policy]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/zone-policy.po
|
||||
source_file = docs/_build/gettext/configexamples/zone-policy.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_bgp-ipv6-unnumbered]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/bgp-ipv6-unnumbered.po
|
||||
source_file = docs/_build/gettext/configexamples/bgp-ipv6-unnumbered.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_ha]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/ha.po
|
||||
source_file = docs/_build/gettext/configexamples/ha.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_wan-load-balancing]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/wan-load-balancing.po
|
||||
source_file = docs/_build/gettext/configexamples/wan-load-balancing.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/index.po
|
||||
source_file = docs/_build/gettext/configexamples/index.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_ospf-unnumbered]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/ospf-unnumbered.po
|
||||
source_file = docs/_build/gettext/configexamples/ospf-unnumbered.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_autotest_DHCPRelay_through_GRE_DHCPRelay_through_GRE]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/autotest/DHCPRelay_through_GRE/DHCPRelay_through_GRE.po
|
||||
source_file = docs/_build/gettext/configexamples/autotest/DHCPRelay_through_GRE/DHCPRelay_through_GRE.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_autotest_tunnelbroker_tunnelbroker]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/autotest/tunnelbroker/tunnelbroker.po
|
||||
source_file = docs/_build/gettext/configexamples/autotest/tunnelbroker/tunnelbroker.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[documentation-1-3.docs__build_gettext_configexamples_autotest_Wireguard_Wireguard]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/configexamples/autotest/Wireguard/Wireguard.po
|
||||
source_file = docs/_build/gettext/configexamples/autotest/Wireguard/Wireguard.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
2
CODEOWNERS
Normal file
@ -0,0 +1,2 @@
|
||||
* @vyos/reviewers
|
||||
* @rebortg
|
||||
2
Pipfile
@ -9,6 +9,8 @@ docutils = "*"
|
||||
lxml = "*"
|
||||
sphinx-notfound-page = "*"
|
||||
Sphinx = ">=1.4.3"
|
||||
sphinx-panels = "*"
|
||||
transifex-client = "*"
|
||||
|
||||
[dev-packages]
|
||||
|
||||
|
||||
38
README.md
@ -1,25 +1,32 @@
|
||||
Starting with VyOS 1.2 (`crux`) documentation is being migrated from the old wiki
|
||||
to ReadTheDocs. Documentation can be accessed via the following URL:
|
||||
Starting with VyOS 1.2 (`crux`) our documentation is being migrated from the old wiki
|
||||
to ReadTheDocs. Documentation can be accessed via the following URL: https://docs.vyos.io
|
||||
|
||||
* https://docs.vyos.io
|
||||
Our old WiKi can still be accessed from the
|
||||
[Wayback Machine](https://web.archive.org/web/20200225171529/https://wiki.vyos.net/wiki/Main_Page)
|
||||
|
||||
# Build
|
||||
|
||||
[](https://docs.vyos.io/en/latest/?badge=latest)
|
||||
[](https://docs.vyos.io/en/latest/?badge=equuleus)
|
||||
|
||||
## Native
|
||||
# Versions
|
||||
|
||||
To build the manual, run the following commands inside the `docs` folder:
|
||||
Our version follows the very same branching scheme as the VyOS source modules
|
||||
itself. We maintain one documentation branch per VyOS release. The default
|
||||
branch that contains the most recent VyOS documentation is called `master`
|
||||
and matches the latest VyOS release which is 1.4 at the time.
|
||||
|
||||
* `make html` for an HTML manual
|
||||
* `make latexpdf` for a LaTeX rendered PDF
|
||||
All new documentation enhancements go to the `master` branch. If those changes
|
||||
are beneficial for previous VyOS documentation versions they will be
|
||||
cherry-picked to the appropriate branch(es).
|
||||
|
||||
Required Debian Packages:
|
||||
* `latexmk`
|
||||
* `texlive-latex-recommended`
|
||||
* `texlive-fonts-recommended`
|
||||
* `texlive-latex-extra`
|
||||
* `sphinx`
|
||||
Post-1.2.0 branches are named after constellations sorted by area from smallest to
|
||||
largest. There are 88 of them, here's the
|
||||
[complete list](https://en.wikipedia.org/wiki/IAU_designated_constellations_by_area).
|
||||
|
||||
* 1.2.x: `crux` (Southern Cross)
|
||||
* 1.3.x: `equuleus` (Little Horse)
|
||||
* 1.4.x: `sagitta` (Arrow)
|
||||
* ...
|
||||
|
||||
### sphinx
|
||||
Debian requires some extra steps for
|
||||
@ -55,7 +62,6 @@ Then run:
|
||||
sudo pip install sphinx-rtd-theme
|
||||
```
|
||||
|
||||
|
||||
Do the following to build the HTML and start a webserver:
|
||||
* Run `make livehtml` inside the `docs` folder
|
||||
|
||||
@ -94,7 +100,7 @@ $ docker run --rm -it -p 8000:8000 -v "$(pwd)":/vyos -w /vyos/docs -e \
|
||||
|
||||
### Test the docs
|
||||
|
||||
Discuss in this Phabricator task: [T1731](https://phabricator.vyos.net/T1731)
|
||||
Discuss in this Phabricator task: [T1731](https://vyos.dev/T1731)
|
||||
|
||||
To test all files run:
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
# Must be run with --privileged flag
|
||||
# Recommended to run the container with a volume mapped
|
||||
# in order to easy exprort images built to "external" world
|
||||
FROM debian:buster
|
||||
FROM debian:11
|
||||
LABEL authors="VyOS Maintainers <maintainers@vyos.io>"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
@ -34,6 +34,8 @@ RUN pip3 install sphinx-rtd-theme
|
||||
RUN pip3 install sphinx-autobuild
|
||||
RUN pip3 install sphinx-notfound-page
|
||||
RUN pip3 install lxml
|
||||
RUN pip3 install myst-parser
|
||||
RUN pip3 install sphinx_design
|
||||
|
||||
|
||||
# Cleanup
|
||||
@ -45,8 +47,6 @@ EXPOSE 8000
|
||||
RUN sed "s/^%sudo.*/%sudo\tALL=(ALL) NOPASSWD:ALL/g" -i /etc/sudoers && \
|
||||
chmod a+s /usr/sbin/useradd /usr/sbin/groupadd /usr/sbin/gosu /usr/sbin/usermod
|
||||
|
||||
# vale
|
||||
RUN curl -sfL https://install.goreleaser.com/github.com/ValeLint/vale.sh | sh -s v1.7.1
|
||||
|
||||
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
|
||||
|
||||
|
||||
@ -7,4 +7,6 @@ Sorry, We could not find a page.
|
||||
Try using the search box or go to the release homepage:
|
||||
|
||||
* `1.2.x (crux) <https://docs.vyos.io/en/crux/>`_
|
||||
* `rolling release (equuleus) <https://docs.vyos.io/en/latest/>`_
|
||||
* `1.3.x (equuleus) <https://docs.vyos.io/en/equuleus/>`_
|
||||
* `1.4.x (sagitta) <https://docs.vyos.io/en/sagitta/>`_
|
||||
* `rolling release (circinus) <https://docs.vyos.io/en/latest/>`_
|
||||
|
||||
@ -27,3 +27,7 @@ livehtml:
|
||||
sphinx-autobuild --host $(AUTOHOST) --port $(AUTOPORT) $(AUTOOPTS) \
|
||||
"$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
|
||||
|
||||
defaultvalue: export VYOS_DEFAULT=True
|
||||
defaultvalue:
|
||||
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
108
docs/_ext/releasenotes.py
Normal file
@ -0,0 +1,108 @@
|
||||
from datetime import datetime
|
||||
from phabricator import Phabricator
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-t", "--token", type=str, help="API token", required=True)
|
||||
parser.add_argument("-b", "--branch", nargs="+", help="List of github branches", required=True)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
phab = Phabricator(host='https://vyos.dev/api/', token=args.token)
|
||||
|
||||
'''
|
||||
# code to find new PHIDs
|
||||
# show project ids
|
||||
projects = phab.project.query(limit=200)
|
||||
for project in projects.response['data']:
|
||||
print(projects.response['data'][project]['phid'], projects.response['data'][project]['name'])
|
||||
'''
|
||||
|
||||
projects = {
|
||||
'equuleus': {
|
||||
'phid': 'PHID-PROJ-zu26ui4vbmvykpjtepij',
|
||||
'name': '1.3 Equuleus',
|
||||
'filename': 'docs/changelog/1.3.rst',
|
||||
'tasks': [],
|
||||
'releasenotes': []
|
||||
},
|
||||
'current': {
|
||||
'phid': 'PHID-PROJ-m4utvy456e2shcprpq3b',
|
||||
'name': '1.4 Sagitta',
|
||||
'filename': 'docs/changelog/1.4.rst',
|
||||
'tasks': [],
|
||||
'releasenotes': []
|
||||
}
|
||||
}
|
||||
|
||||
for b in args.branch:
|
||||
if b not in projects.keys():
|
||||
raise Exception('given branch not defined')
|
||||
|
||||
# get project tasks
|
||||
|
||||
for project in projects:
|
||||
if project not in args.branch:
|
||||
continue
|
||||
|
||||
_after = None
|
||||
|
||||
# get tasks from API
|
||||
while True:
|
||||
#print(f'get {_after}')
|
||||
_tasks = phab.maniphest.search(
|
||||
constraints={
|
||||
'projects': [projects[project]['phid']],
|
||||
#'statuses': ['closed'],
|
||||
},
|
||||
after=_after)
|
||||
|
||||
projects[project]['tasks'].extend(_tasks.response['data'])
|
||||
_after = _tasks.response['cursor']['after']
|
||||
if _after is None:
|
||||
break
|
||||
|
||||
# prepare tasks for release notes
|
||||
for task in projects[project]['tasks']:
|
||||
if task['fields']['status']['value'] in ['resolved']:
|
||||
#_info = phab.maniphest.info(task_id=task['id'])
|
||||
#_info = _info.response
|
||||
releasenote = {}
|
||||
releasenote['type'] = task['fields']['subtype']
|
||||
date = datetime.fromtimestamp(task['fields']['dateClosed'])
|
||||
releasenote['closedate'] = date.strftime('%Y-%m-%d')
|
||||
releasenote['name'] = task['fields']['name']
|
||||
releasenote['id'] = task['id']
|
||||
#print(f"{project}: {task['fields']['status']} {task['id']}")
|
||||
projects[project]['releasenotes'].append(releasenote)
|
||||
|
||||
projects[project]['releasenotes'] = sorted(
|
||||
projects[project]['releasenotes'], key = lambda x: x['closedate'],
|
||||
reverse=True
|
||||
)
|
||||
|
||||
rst_text = "#" * len(projects[project]['name'])
|
||||
rst_text += f"\n{projects[project]['name']}\n"
|
||||
rst_text += "#" * len(projects[project]['name'])
|
||||
rst_text += "\n"
|
||||
|
||||
rst_text += "\n"
|
||||
rst_text += "..\n"
|
||||
rst_text += " Please don't add anything by hand.\n"
|
||||
rst_text += " This file is managed by the script:\n"
|
||||
rst_text += " _ext/releasenotes.py\n"
|
||||
|
||||
date = None
|
||||
for rn in projects[project]['releasenotes']:
|
||||
if date != rn['closedate']:
|
||||
rst_text += "\n\n"
|
||||
rst_text += f"{rn['closedate']}\n"
|
||||
underline = '=' * len(rn['closedate'])
|
||||
rst_text += f"{underline}\n\n"
|
||||
date = rn['closedate']
|
||||
rst_text += f"* :vytask:`T{rn['id']}` ({rn['type']}): {rn['name']}\n"
|
||||
|
||||
f = open(projects[project]['filename'], "w")
|
||||
f.write(rst_text)
|
||||
f.close()
|
||||
@ -1,14 +1,13 @@
|
||||
'''
|
||||
generate json with all commands from xml for vyos documentation coverage
|
||||
|
||||
'''
|
||||
|
||||
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from io import BytesIO
|
||||
from lxml import etree as ET
|
||||
@ -33,11 +32,32 @@ input_data = [
|
||||
}
|
||||
]
|
||||
|
||||
vyos_commands_dir = "_include/coverage"
|
||||
|
||||
node_data = {
|
||||
'cfgcmd': {},
|
||||
'opcmd': {},
|
||||
}
|
||||
|
||||
|
||||
def get_vyos_commands():
|
||||
return_data = None
|
||||
for (dirpath, dirnames, filenames) in os.walk(vyos_commands_dir):
|
||||
for file in filenames:
|
||||
with open(f"{vyos_commands_dir}/{file}") as f:
|
||||
data = json.load(f)
|
||||
|
||||
if not return_data:
|
||||
return_data = data
|
||||
|
||||
# find latestes export
|
||||
if datetime.datetime.fromisoformat(return_data['date']) < datetime.datetime.fromisoformat(data['date']):
|
||||
return_data = data
|
||||
|
||||
return return_data
|
||||
|
||||
|
||||
|
||||
def get_properties(p):
|
||||
props = {}
|
||||
props['valueless'] = False
|
||||
@ -155,12 +175,18 @@ def get_properties(p):
|
||||
|
||||
def process_node(n, f):
|
||||
|
||||
|
||||
props_elem = n.find("properties")
|
||||
children = n.find("children")
|
||||
command = n.find("command")
|
||||
children_nodes = []
|
||||
owner = n.get("owner")
|
||||
node_type = n.tag
|
||||
defaultvalue = n.find("defaultValue")
|
||||
|
||||
if defaultvalue is not None:
|
||||
defaultvalue = defaultvalue.text
|
||||
|
||||
|
||||
name = n.get("name")
|
||||
props = get_properties(props_elem)
|
||||
@ -198,7 +224,9 @@ def process_node(n, f):
|
||||
'children': children_nodes,
|
||||
'props': props,
|
||||
'command': test_command,
|
||||
'filename': f
|
||||
'filename': f,
|
||||
'defaultvalue': defaultvalue
|
||||
|
||||
}
|
||||
return node
|
||||
|
||||
@ -212,9 +240,11 @@ def create_commands(data, parent_list=[], level=0):
|
||||
'tag_help': [],
|
||||
'level': level,
|
||||
'no_childs': False,
|
||||
'filename': None
|
||||
'filename': None,
|
||||
'defaultvalue': None,
|
||||
}
|
||||
command['filename'] = data['filename']
|
||||
command['defaultvalue'] = data['defaultvalue']
|
||||
command['name'].extend(parent_list)
|
||||
command['name'].append(data['name'])
|
||||
|
||||
@ -298,7 +328,7 @@ def get_working_commands():
|
||||
if not validator.validate(xml):
|
||||
print(validator.error_log)
|
||||
print("Interface definition file {0} does not match the schema!".format(f))
|
||||
sys.exit(1)
|
||||
#sys.exit(1)
|
||||
except Exception as e:
|
||||
print("Failed to load the XML schema {0}".format(entry['schema_file']))
|
||||
print(e)
|
||||
@ -328,6 +358,7 @@ def get_working_commands():
|
||||
'children': [],
|
||||
'command': node_data[kind][entry]['command'],
|
||||
'filename': node_data[kind][entry]['filename'],
|
||||
'defaultvalue': node_data[kind][entry]['defaultvalue']
|
||||
}
|
||||
config_tree_new[kind][node_0]['children'].extend(node_data[kind][entry]['children'])
|
||||
|
||||
@ -337,7 +368,8 @@ def get_working_commands():
|
||||
}
|
||||
for kind in config_tree_new:
|
||||
for e in config_tree_new[kind]:
|
||||
result[kind].extend(create_commands(config_tree_new[kind][e]))
|
||||
if config_tree_new[kind][e]['name']:
|
||||
result[kind].extend(create_commands(config_tree_new[kind][e]))
|
||||
|
||||
for cmd in result['cfgcmd']:
|
||||
cmd['cmd'] = " ".join(cmd['name'])
|
||||
@ -377,6 +409,4 @@ def override_element(l: list):
|
||||
el.getparent().remove(el)
|
||||
|
||||
if __name__ == "__main__":
|
||||
res = get_working_commands()
|
||||
print(json.dumps(res))
|
||||
#print(res['cfgcmd'][0])
|
||||
get_vyos_commands()
|
||||
|
||||
@ -1,20 +1,25 @@
|
||||
import re
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime
|
||||
from unittest import defaultTestLoader
|
||||
from docutils import io, nodes, utils, statemachine
|
||||
from docutils.parsers.rst.roles import set_classes
|
||||
from docutils.parsers.rst import Directive, directives, states
|
||||
|
||||
from sphinx.util.docutils import SphinxDirective
|
||||
|
||||
from testcoverage import get_working_commands
|
||||
from testcoverage import get_working_commands, get_vyos_commands
|
||||
|
||||
from sphinx.util import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def setup(app):
|
||||
|
||||
app.add_config_value(
|
||||
'vyos_phabricator_url',
|
||||
'https://phabricator.vyos.net/',
|
||||
'https://vyos.dev/',
|
||||
'html'
|
||||
)
|
||||
|
||||
@ -24,6 +29,11 @@ def setup(app):
|
||||
#{"cfgcmd": [], "opcmd": []},
|
||||
'html'
|
||||
)
|
||||
app.add_config_value(
|
||||
'vyos_commands',
|
||||
get_vyos_commands(),
|
||||
'html'
|
||||
)
|
||||
app.add_config_value(
|
||||
'vyos_coverage',
|
||||
{
|
||||
@ -74,6 +84,7 @@ def setup(app):
|
||||
app.add_directive('opcmd', OpCmdDirective)
|
||||
app.add_directive('cmdinclude', CfgInclude)
|
||||
app.connect('doctree-resolved', process_cmd_nodes)
|
||||
app.connect('doctree-read', handle_document_meta_data)
|
||||
|
||||
class CfgcmdList(nodes.General, nodes.Element):
|
||||
pass
|
||||
@ -346,6 +357,21 @@ class OpcmdlistDirective(Directive):
|
||||
return [oplist]
|
||||
|
||||
|
||||
def get_default_value(title_text, config, cfgmode):
|
||||
title_text = strip_cmd(title_text)
|
||||
for cmd in config.vyos_working_commands[cfgmode]:
|
||||
cmd_joined = ' '.join(cmd['name'])
|
||||
cmd_striped = strip_cmd(cmd_joined)
|
||||
if "table-size" in cmd['name']:
|
||||
pass
|
||||
#print(cmd)
|
||||
#print(cmd_striped)
|
||||
#print(title_text)
|
||||
#print()
|
||||
if cmd_striped == title_text:
|
||||
if cmd['defaultvalue']:
|
||||
return cmd['defaultvalue']
|
||||
return None
|
||||
|
||||
class CmdDirective(SphinxDirective):
|
||||
|
||||
@ -358,19 +384,31 @@ class CmdDirective(SphinxDirective):
|
||||
content_list = []
|
||||
title_text = ''
|
||||
content_text = ''
|
||||
defaultvalue = None
|
||||
has_body = False
|
||||
|
||||
cfgmode = self.custom_class + "cmd"
|
||||
try:
|
||||
if '' in self.content:
|
||||
index = self.content.index('')
|
||||
title_list = self.content[0:index]
|
||||
content_list = self.content[index + 1:]
|
||||
|
||||
if '' in self.content:
|
||||
index = self.content.index('')
|
||||
title_list = self.content[0:index]
|
||||
content_list = self.content[index + 1:]
|
||||
title_text = ' '.join(title_list)
|
||||
content_text = '\n'.join(content_list)
|
||||
has_body = True
|
||||
else:
|
||||
title_text = ' '.join(self.content)
|
||||
title_text = ' '.join(title_list)
|
||||
content_text = content_text + '\n'.join(content_list)
|
||||
has_body = True
|
||||
else:
|
||||
title_list = self.content
|
||||
title_text = ' '.join(title_list)
|
||||
except Exception as e:
|
||||
print("error", e)
|
||||
|
||||
# render defaultvalue
|
||||
if os.getenv('VYOS_DEFAULT') or ':defaultvalue:' in title_text:
|
||||
value = get_default_value(title_list, self.config, cfgmode)
|
||||
title_text = title_text.replace(":defaultvalue:", '')
|
||||
if value:
|
||||
defaultvalue = f"default: {value}\n"
|
||||
|
||||
anchor_id = nodes.make_id(self.custom_class + "cmd-" + title_text)
|
||||
target = nodes.target(ids=[anchor_id])
|
||||
@ -392,6 +430,11 @@ class CmdDirective(SphinxDirective):
|
||||
heading_element['classes'] += [self.custom_class + 'cmd-heading']
|
||||
|
||||
panel_element.append(heading_element)
|
||||
if defaultvalue:
|
||||
defaultvalue_element = nodes.paragraph(text=defaultvalue)
|
||||
defaultvalue_element['classes'] = ["defaultvalue"]
|
||||
panel_element.append(defaultvalue_element)
|
||||
|
||||
|
||||
append_list = {
|
||||
'docname': self.env.docname,
|
||||
@ -432,26 +475,53 @@ class CfgCmdDirective(CmdDirective):
|
||||
|
||||
|
||||
def strip_cmd(cmd, debug=False):
|
||||
|
||||
# find all [...] and also nested [...]
|
||||
# regex and str.find() had problems with nested [...]
|
||||
appearance = 0
|
||||
cmd_new = ""
|
||||
for c in cmd:
|
||||
if c == "[":
|
||||
appearance = appearance + 1
|
||||
if appearance == 0:
|
||||
cmd_new = f"{cmd_new}{c}"
|
||||
if c == "]":
|
||||
appearance = appearance - 1
|
||||
|
||||
# only if all [..] will be delete if appearance > 0 there is a syntax errror
|
||||
if appearance == 0:
|
||||
cmd = cmd_new
|
||||
|
||||
# same for <...>
|
||||
appearance = 0
|
||||
cmd_new = ""
|
||||
for c in cmd:
|
||||
if c == "<":
|
||||
appearance = appearance + 1
|
||||
if appearance == 0:
|
||||
cmd_new = f"{cmd_new}{c}"
|
||||
if c == ">":
|
||||
appearance = appearance - 1
|
||||
|
||||
# only if all <..> will be delete if appearance > 0 there is a syntax errror
|
||||
if appearance == 0:
|
||||
cmd = cmd_new
|
||||
|
||||
if debug:
|
||||
print("")
|
||||
print(cmd)
|
||||
cmd = re.sub('set','',cmd)
|
||||
cmd = re.sub('^set','',cmd)
|
||||
if debug:
|
||||
print(cmd)
|
||||
#while " | " in cmd:
|
||||
cmd = re.sub('\s+\|\s+','',cmd)
|
||||
if debug:
|
||||
print(cmd)
|
||||
cmd = re.sub('<\S*>','',cmd)
|
||||
if debug:
|
||||
print(cmd)
|
||||
cmd = re.sub('\[\S\]','',cmd)
|
||||
cmd = cmd.replace('|','')
|
||||
if debug:
|
||||
print(cmd)
|
||||
cmd = re.sub('\s+','',cmd)
|
||||
cmd = cmd.replace(':defaultvalue:','')
|
||||
if debug:
|
||||
print(cmd)
|
||||
print("")
|
||||
|
||||
return cmd
|
||||
|
||||
def build_row(app, fromdocname, rowdata):
|
||||
@ -467,10 +537,10 @@ def build_row(app, fromdocname, rowdata):
|
||||
entry += nodes.paragraph(text=item)
|
||||
elif isinstance(cell, bool):
|
||||
if cell:
|
||||
entry += nodes.paragraph(text="")
|
||||
entry += nodes.paragraph(text="✔")
|
||||
entry['classes'] = ['coverage-ok']
|
||||
else:
|
||||
entry += nodes.paragraph(text="")
|
||||
entry += nodes.paragraph(text="✕")
|
||||
entry['classes'] = ['coverage-fail']
|
||||
else:
|
||||
entry += nodes.paragraph(text=cell)
|
||||
@ -478,30 +548,28 @@ def build_row(app, fromdocname, rowdata):
|
||||
|
||||
|
||||
|
||||
def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type):
|
||||
def process_coverage(app, fromdocname, doccmd, xmlcmd, vyoscmd, cli_type):
|
||||
coverage_list = {}
|
||||
int_docs = 0
|
||||
int_xml = 0
|
||||
strip_true_list = []
|
||||
for cmd in doccmd:
|
||||
coverage_item = {
|
||||
'doccmd': None,
|
||||
'xmlcmd': None,
|
||||
'vyoscmd': None,
|
||||
'doccmd_item': None,
|
||||
'xmlcmd_item': None,
|
||||
'vyoscmd_item': None,
|
||||
'indocs': False,
|
||||
'inxml': False,
|
||||
'invyos': False,
|
||||
'xmlfilename': None
|
||||
}
|
||||
coverage_item['doccmd'] = cmd['cmd']
|
||||
coverage_item['doccmd_item'] = cmd
|
||||
coverage_item['indocs'] = True
|
||||
int_docs += 1
|
||||
|
||||
coverage_list[strip_cmd(cmd['cmd'])] = dict(coverage_item)
|
||||
|
||||
|
||||
#print(coverage_list.keys())
|
||||
|
||||
for cmd in xmlcmd:
|
||||
|
||||
strip = strip_cmd(cmd['cmd'])
|
||||
@ -509,34 +577,64 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type):
|
||||
coverage_item = {
|
||||
'doccmd': None,
|
||||
'xmlcmd': None,
|
||||
'vyoscmd': None,
|
||||
'doccmd_item': None,
|
||||
'xmlcmd_item': None,
|
||||
'vyoscmd_item': None,
|
||||
'indocs': False,
|
||||
'inxml': False,
|
||||
'invyos': False,
|
||||
'xmlfilename': None
|
||||
}
|
||||
coverage_item['xmlcmd'] = cmd['cmd']
|
||||
coverage_item['xmlcmd_item'] = cmd
|
||||
coverage_item['inxml'] = True
|
||||
coverage_item['xmlfilename'] = cmd['filename']
|
||||
int_xml += 1
|
||||
coverage_list[strip] = dict(coverage_item)
|
||||
else:
|
||||
coverage_list[strip]['xmlcmd'] = cmd['cmd']
|
||||
coverage_list[strip]['xmlcmd_item'] = cmd
|
||||
coverage_list[strip]['inxml'] = True
|
||||
coverage_list[strip]['xmlfilename'] = cmd['filename']
|
||||
int_xml += 1
|
||||
|
||||
|
||||
for item in vyoscmd[cli_type]:
|
||||
cmd = ' '.join(item['cmd'])
|
||||
strip = strip_cmd(cmd)
|
||||
if strip not in coverage_list.keys():
|
||||
coverage_item = {
|
||||
'doccmd': None,
|
||||
'xmlcmd': None,
|
||||
'vyoscmd': None,
|
||||
'doccmd_item': None,
|
||||
'xmlcmd_item': None,
|
||||
'vyoscmd_item': None,
|
||||
'indocs': False,
|
||||
'inxml': False,
|
||||
'invyos': False,
|
||||
'xmlfilename': None
|
||||
}
|
||||
coverage_item['vyoscmd'] = cmd
|
||||
coverage_item['invyos'] = True
|
||||
coverage_list[strip] = dict(coverage_item)
|
||||
else:
|
||||
coverage_list[strip]['vyoscmd'] = cmd
|
||||
coverage_list[strip]['invyos'] = True
|
||||
if coverage_list[strip]['indocs'] and coverage_list[strip]['invyos']:
|
||||
strip_true_list.append(strip)
|
||||
|
||||
|
||||
|
||||
strip_true_list = list(set(strip_true_list))
|
||||
|
||||
|
||||
|
||||
table = nodes.table()
|
||||
tgroup = nodes.tgroup(cols=3)
|
||||
tgroup = nodes.tgroup(cols=4)
|
||||
table += tgroup
|
||||
|
||||
header = (f'{int_docs}/{len(coverage_list)} in Docs', f'{int_xml}/{len(coverage_list)} in XML', 'Command')
|
||||
colwidths = (1, 1, 8)
|
||||
header = (f'Status {len(strip_true_list)}/{len(coverage_list)}', 'Documentation', 'XML', f'in VyOS {vyoscmd["os"]}')
|
||||
colwidths = (5, 33 , 33, 33)
|
||||
table = nodes.table()
|
||||
tgroup = nodes.tgroup(cols=len(header))
|
||||
table += tgroup
|
||||
@ -548,28 +646,42 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type):
|
||||
tbody = nodes.tbody()
|
||||
tgroup += tbody
|
||||
for entry in sorted(coverage_list):
|
||||
body_text_list = []
|
||||
doc_cmd_text = []
|
||||
doc_xml_text = []
|
||||
doc_vyos_text = []
|
||||
if coverage_list[entry]['indocs']:
|
||||
body_text_list.append(coverage_list[entry]['doccmd_item'])
|
||||
doc_cmd_text.append(coverage_list[entry]['doccmd_item'])
|
||||
else:
|
||||
body_text_list.append('Not documented yet')
|
||||
doc_cmd_text.append('not yet documented')
|
||||
|
||||
if coverage_list[entry]['inxml']:
|
||||
body_text_list.append("------------------")
|
||||
body_text_list.append(str(coverage_list[entry]['xmlfilename']) + ":")
|
||||
body_text_list.append(coverage_list[entry]['xmlcmd'])
|
||||
doc_xml_text.append(str(coverage_list[entry]['xmlfilename']) + ":")
|
||||
doc_xml_text.append(coverage_list[entry]['xmlcmd'])
|
||||
else:
|
||||
body_text_list.append('Nothing found in XML Definitions')
|
||||
doc_xml_text.append('Nothing found in XML Definitions')
|
||||
|
||||
if coverage_list[entry]['invyos']:
|
||||
doc_vyos_text.append(coverage_list[entry]['vyoscmd'])
|
||||
else:
|
||||
doc_vyos_text.append('Nothing found in VyOS')
|
||||
|
||||
|
||||
|
||||
if not coverage_list[entry]['indocs'] or not coverage_list[entry]['invyos']:
|
||||
status = False
|
||||
else:
|
||||
status = True
|
||||
|
||||
tbody += build_row(app, fromdocname,
|
||||
(
|
||||
coverage_list[entry]['indocs'],
|
||||
coverage_list[entry]['inxml'],
|
||||
body_text_list
|
||||
status,
|
||||
doc_cmd_text,
|
||||
doc_xml_text,
|
||||
doc_vyos_text
|
||||
|
||||
)
|
||||
)
|
||||
|
||||
table['ids'] = [f'table-{cli_type}']
|
||||
return table
|
||||
|
||||
def process_cmd_node(app, cmd, fromdocname, cli_type):
|
||||
@ -599,6 +711,7 @@ def process_cmd_nodes(app, doctree, fromdocname):
|
||||
fromdocname,
|
||||
env.vyos_cfgcmd,
|
||||
app.config.vyos_working_commands['cfgcmd'],
|
||||
app.config.vyos_commands,
|
||||
'cfgcmd'
|
||||
)
|
||||
)
|
||||
@ -616,6 +729,7 @@ def process_cmd_nodes(app, doctree, fromdocname):
|
||||
fromdocname,
|
||||
env.vyos_opcmd,
|
||||
app.config.vyos_working_commands['opcmd'],
|
||||
app.config.vyos_commands,
|
||||
'opcmd'
|
||||
)
|
||||
)
|
||||
@ -640,4 +754,21 @@ def vytask_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
|
||||
|
||||
def cmd_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
|
||||
node = nodes.literal(text, text)
|
||||
return [node], []
|
||||
return [node], []
|
||||
|
||||
|
||||
def handle_document_meta_data(app, document):
|
||||
docname = app.env.docname
|
||||
lastproofread = app.env.metadata[docname].get('lastproofread', False)
|
||||
if lastproofread:
|
||||
try:
|
||||
lastproofread_time = datetime.strptime(lastproofread, '%Y-%m-%d')
|
||||
delta = datetime.now() - lastproofread_time
|
||||
if delta.days > 365:
|
||||
logger.warning(f'{delta.days} days since last proofread {app.env.doc2path(docname)}')
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f'lastproofread meta data error in {app.env.doc2path(docname)}: {e}')
|
||||
else:
|
||||
pass
|
||||
#logger.warning(f'lastproofread meta data missing in {app.env.doc2path(docname)}')
|
||||
|
||||
@ -2,8 +2,10 @@
|
||||
|
||||
.. _`accel-ppp`: https://accel-ppp.org/
|
||||
.. _`Secure Socket Tunneling Protocol`: https://en.wikipedia.org/wiki/Secure_Socket_Tunneling_Protocol
|
||||
.. _Phabricator: https://phabricator.vyos.net/
|
||||
.. _Phabricator: https://vyos.dev/
|
||||
.. _802.1ad: https://en.wikipedia.org/wiki/IEEE_802.1ad
|
||||
.. _802.1q: https://en.wikipedia.org/wiki/IEEE_802.1Q
|
||||
.. _`VyOS CI`: https://ci.vyos.net
|
||||
.. _vyos-build: https://github.com/vyos/vyos-build
|
||||
|
||||
.. start_vyoslinter
|
||||
.. start_vyoslinter
|
||||
|
||||
88283
docs/_include/coverage/20220531-1.3.1-S1.json
Normal file
88777
docs/_include/coverage/20220907-1.3.2.json
Normal file
90051
docs/_include/coverage/20230724-1.3.3.json
Normal file
@ -17,5 +17,5 @@
|
||||
|
||||
set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} address 192.0.2.1/24
|
||||
set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} address 2001:db8::1/64
|
||||
set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} dhcp
|
||||
set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} dhcpv6
|
||||
set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} address dhcp
|
||||
set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} address dhcpv6
|
||||
|
||||
7
docs/_include/interface-common-without-dhcp1.txt
Normal file
@ -0,0 +1,7 @@
|
||||
.. cmdinclude:: /_include/interface-address.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-common-without-mac.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
31
docs/_include/interface-common-without-mac.txt
Normal file
@ -0,0 +1,31 @@
|
||||
.. cmdinclude:: /_include/interface-description.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-disable.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-disable-flow-control.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-disable-link-detect.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-mtu.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-ip.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-ipv6.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
|
||||
.. cmdinclude:: /_include/interface-vrf.txt
|
||||
:var0: {{ var0 }}
|
||||
:var1: {{ var1 }}
|
||||
@ -1,7 +1,10 @@
|
||||
SPAN port mirroring can copy the inbound/outbound traffic of the interface to
|
||||
the specified interface, usually the interface can be connected to some special
|
||||
equipment, such as behavior control system, intrusion detection system and
|
||||
traffic collector, and can copy all related traffic from this port
|
||||
traffic collector, and can copy all related traffic from this port.
|
||||
The benefit of mirroring the traffic is that the application is isolated from
|
||||
the source traffic and so application processing does not affect the traffic
|
||||
or the system performance.
|
||||
|
||||
VyOS uses the `mirror` option to configure port mirroring. The configuration
|
||||
is divided into 2 different directions. Destination ports should be configured
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
.. cfgcmd:: set interfaces {{ var0 }} <interface> xdp
|
||||
|
||||
Enable support for Linux :abbr:`XDP (eXpress Data Path)` on recent 1.3 rolling
|
||||
releases. You must enable it for every interface which should participate in
|
||||
the XDP forwarding.
|
||||
|
||||
XDP is an eBPF based high performance data path merged in the Linux kernel
|
||||
since version 4.8. The idea behind XDP is to add an early hook in the RX path
|
||||
of the kernel, and let a user supplied eBPF program decide the fate of the
|
||||
packet. The hook is placed in the NIC driver just after the interrupt
|
||||
processing, and before any memory allocation needed by the network stack
|
||||
itself, because memory allocation can be an expensive operation.
|
||||
|
||||
.. warning:: This is highly experimental!
|
||||
|
||||
.. note:: Enabling this feature will break any form of NAT or Firewalling on
|
||||
this interface, as XDP is handled way earlier in the driver then iptables/
|
||||
nftables.
|
||||
|
||||
Enabling this feature will only load the XDP router code as described here:
|
||||
https://blog.apnic.net/2020/04/30/how-to-build-an-xdp-based-bgp-peering-router/
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
set interfaces {{ var0 }} {{ var1 }} xdp
|
||||
@ -1 +1 @@
|
||||
Subproject commit 86209c679c6b7ca9d5bac1f67ffd391b9b16c008
|
||||
Subproject commit bc5e7ba65b85a8e25273aad67de3da52af9ea5d2
|
||||
BIN
docs/_static/css/DataTables-1.11.5/images/sort_asc.png
vendored
Normal file
|
After Width: | Height: | Size: 160 B |
BIN
docs/_static/css/DataTables-1.11.5/images/sort_asc_disabled.png
vendored
Normal file
|
After Width: | Height: | Size: 146 B |
BIN
docs/_static/css/DataTables-1.11.5/images/sort_both.png
vendored
Normal file
|
After Width: | Height: | Size: 201 B |
BIN
docs/_static/css/DataTables-1.11.5/images/sort_desc.png
vendored
Normal file
|
After Width: | Height: | Size: 158 B |
BIN
docs/_static/css/DataTables-1.11.5/images/sort_desc_disabled.png
vendored
Normal file
|
After Width: | Height: | Size: 148 B |
37
docs/_static/css/custom.css
vendored
@ -1,3 +1,8 @@
|
||||
div.card-header {
|
||||
font-weight: bold;
|
||||
background: #fdab10;
|
||||
}
|
||||
|
||||
span.opcmd,
|
||||
span.cfgcmd {
|
||||
font-weight: bold;
|
||||
@ -15,13 +20,13 @@ span.cfgcmd:before {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
td p a.cmdlink span.cfgcmd:before,
|
||||
td p a.cmdlink span.opcmd:before {
|
||||
td a.cmdlink span.cfgcmd:before,
|
||||
td a.cmdlink span.opcmd:before {
|
||||
content: "";
|
||||
}
|
||||
|
||||
td p a.cmdlink,
|
||||
td p a.cmdlink {
|
||||
td a.cmdlink,
|
||||
td a.cmdlink {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
@ -82,6 +87,12 @@ span.opcmd:before {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.defaultvalue{
|
||||
font-size: 90%;
|
||||
color: gray;
|
||||
margin-bottom: 5px;
|
||||
|
||||
}
|
||||
|
||||
a.cmdlink {
|
||||
font-size: 80%;
|
||||
@ -156,7 +167,7 @@ a.cmdlink span:hover{
|
||||
}
|
||||
|
||||
.wy-nav-top {
|
||||
background-color : #ffffff !important;
|
||||
background-color : #ffffff;
|
||||
}
|
||||
|
||||
.wy-nav-top img {
|
||||
@ -165,13 +176,19 @@ a.cmdlink span:hover{
|
||||
|
||||
.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td.coverage-ok,
|
||||
.rst-content table.docutils td.coverage-ok {
|
||||
background-color: green;
|
||||
color: black;
|
||||
color: green;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td.coverage-fail,
|
||||
.rst-content table.docutils td.coverage-fail {
|
||||
background-color: red;
|
||||
color: black;
|
||||
color: red;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.wy-nav-top{
|
||||
background-color: #fdab10;
|
||||
}
|
||||
}
|
||||
497
docs/_static/css/datatables.css
vendored
Normal file
@ -0,0 +1,497 @@
|
||||
/*
|
||||
* This combined file was created by the DataTables downloader builder:
|
||||
* https://datatables.net/download
|
||||
*
|
||||
* To rebuild or modify this file with the latest versions of the included
|
||||
* software please visit:
|
||||
* https://datatables.net/download/#dt/dt-1.11.5
|
||||
*
|
||||
* Included libraries:
|
||||
* DataTables 1.11.5
|
||||
*/
|
||||
|
||||
table.dataTable th.dt-left,
|
||||
table.dataTable td.dt-left {
|
||||
text-align: left;
|
||||
}
|
||||
table.dataTable th.dt-center,
|
||||
table.dataTable td.dt-center,
|
||||
table.dataTable td.dataTables_empty {
|
||||
text-align: center;
|
||||
}
|
||||
table.dataTable th.dt-right,
|
||||
table.dataTable td.dt-right {
|
||||
text-align: right;
|
||||
}
|
||||
table.dataTable th.dt-justify,
|
||||
table.dataTable td.dt-justify {
|
||||
text-align: justify;
|
||||
}
|
||||
table.dataTable th.dt-nowrap,
|
||||
table.dataTable td.dt-nowrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.dataTable thead th.dt-head-left,
|
||||
table.dataTable thead td.dt-head-left,
|
||||
table.dataTable tfoot th.dt-head-left,
|
||||
table.dataTable tfoot td.dt-head-left {
|
||||
text-align: left;
|
||||
}
|
||||
table.dataTable thead th.dt-head-center,
|
||||
table.dataTable thead td.dt-head-center,
|
||||
table.dataTable tfoot th.dt-head-center,
|
||||
table.dataTable tfoot td.dt-head-center {
|
||||
text-align: center;
|
||||
}
|
||||
table.dataTable thead th.dt-head-right,
|
||||
table.dataTable thead td.dt-head-right,
|
||||
table.dataTable tfoot th.dt-head-right,
|
||||
table.dataTable tfoot td.dt-head-right {
|
||||
text-align: right;
|
||||
}
|
||||
table.dataTable thead th.dt-head-justify,
|
||||
table.dataTable thead td.dt-head-justify,
|
||||
table.dataTable tfoot th.dt-head-justify,
|
||||
table.dataTable tfoot td.dt-head-justify {
|
||||
text-align: justify;
|
||||
}
|
||||
table.dataTable thead th.dt-head-nowrap,
|
||||
table.dataTable thead td.dt-head-nowrap,
|
||||
table.dataTable tfoot th.dt-head-nowrap,
|
||||
table.dataTable tfoot td.dt-head-nowrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-left,
|
||||
table.dataTable tbody td.dt-body-left {
|
||||
text-align: left;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-center,
|
||||
table.dataTable tbody td.dt-body-center {
|
||||
text-align: center;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-right,
|
||||
table.dataTable tbody td.dt-body-right {
|
||||
text-align: right;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-justify,
|
||||
table.dataTable tbody td.dt-body-justify {
|
||||
text-align: justify;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-nowrap,
|
||||
table.dataTable tbody td.dt-body-nowrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.dataTable td.dt-control {
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
table.dataTable td.dt-control:before {
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
margin-top: -9px;
|
||||
display: inline-block;
|
||||
color: white;
|
||||
border: 0.15em solid white;
|
||||
border-radius: 1em;
|
||||
box-shadow: 0 0 0.2em #444;
|
||||
box-sizing: content-box;
|
||||
text-align: center;
|
||||
text-indent: 0 !important;
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
line-height: 1em;
|
||||
content: "+";
|
||||
background-color: #31b131;
|
||||
}
|
||||
table.dataTable tr.dt-hasChild td.dt-control:before {
|
||||
content: "-";
|
||||
background-color: #d33333;
|
||||
}
|
||||
|
||||
/*
|
||||
* Table styles
|
||||
*/
|
||||
table.dataTable {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
clear: both;
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
/*
|
||||
* Header and footer styles
|
||||
*/
|
||||
/*
|
||||
* Body styles
|
||||
*/
|
||||
}
|
||||
table.dataTable thead th,
|
||||
table.dataTable tfoot th {
|
||||
font-weight: bold;
|
||||
}
|
||||
table.dataTable thead th,
|
||||
table.dataTable thead td {
|
||||
padding: 10px 18px;
|
||||
border-bottom: 1px solid #111;
|
||||
}
|
||||
table.dataTable thead th:active,
|
||||
table.dataTable thead td:active {
|
||||
outline: none;
|
||||
}
|
||||
table.dataTable tfoot th,
|
||||
table.dataTable tfoot td {
|
||||
padding: 10px 18px 6px 18px;
|
||||
border-top: 1px solid #111;
|
||||
}
|
||||
table.dataTable thead .sorting,
|
||||
table.dataTable thead .sorting_asc,
|
||||
table.dataTable thead .sorting_desc,
|
||||
table.dataTable thead .sorting_asc_disabled,
|
||||
table.dataTable thead .sorting_desc_disabled {
|
||||
cursor: pointer;
|
||||
*cursor: hand;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center right;
|
||||
}
|
||||
table.dataTable thead .sorting {
|
||||
background-image: url("DataTables-1.11.5/images/sort_both.png");
|
||||
}
|
||||
table.dataTable thead .sorting_asc {
|
||||
background-image: url("DataTables-1.11.5/images/sort_asc.png") !important;
|
||||
}
|
||||
table.dataTable thead .sorting_desc {
|
||||
background-image: url("DataTables-1.11.5/images/sort_desc.png") !important;
|
||||
}
|
||||
table.dataTable thead .sorting_asc_disabled {
|
||||
background-image: url("DataTables-1.11.5/images/sort_asc_disabled.png");
|
||||
}
|
||||
table.dataTable thead .sorting_desc_disabled {
|
||||
background-image: url("DataTables-1.11.5/images/sort_desc_disabled.png");
|
||||
}
|
||||
table.dataTable tbody tr {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
table.dataTable tbody tr.selected {
|
||||
background-color: #B0BED9;
|
||||
}
|
||||
table.dataTable tbody th,
|
||||
table.dataTable tbody td {
|
||||
padding: 8px 10px;
|
||||
}
|
||||
table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
table.dataTable.row-border tbody tr:first-child th,
|
||||
table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
|
||||
table.dataTable.display tbody tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
|
||||
border-top: 1px solid #ddd;
|
||||
border-right: 1px solid #ddd;
|
||||
}
|
||||
table.dataTable.cell-border tbody tr th:first-child,
|
||||
table.dataTable.cell-border tbody tr td:first-child {
|
||||
border-left: 1px solid #ddd;
|
||||
}
|
||||
table.dataTable.cell-border tbody tr:first-child th,
|
||||
table.dataTable.cell-border tbody tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
|
||||
background-color: #acbad4;
|
||||
}
|
||||
table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
|
||||
background-color: #aab7d1;
|
||||
}
|
||||
table.dataTable.order-column tbody tr > .sorting_1,
|
||||
table.dataTable.order-column tbody tr > .sorting_2,
|
||||
table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
|
||||
table.dataTable.display tbody tr > .sorting_2,
|
||||
table.dataTable.display tbody tr > .sorting_3 {
|
||||
background-color: #fafafa;
|
||||
}
|
||||
table.dataTable.order-column tbody tr.selected > .sorting_1,
|
||||
table.dataTable.order-column tbody tr.selected > .sorting_2,
|
||||
table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
|
||||
table.dataTable.display tbody tr.selected > .sorting_2,
|
||||
table.dataTable.display tbody tr.selected > .sorting_3 {
|
||||
background-color: #acbad5;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
|
||||
background-color: #f3f3f3;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
|
||||
background-color: #a6b4cd;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
|
||||
background-color: #a8b5cf;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
|
||||
background-color: #a9b7d1;
|
||||
}
|
||||
table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
|
||||
background-color: #fafafa;
|
||||
}
|
||||
table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
|
||||
background-color: #fcfcfc;
|
||||
}
|
||||
table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
|
||||
background-color: #fefefe;
|
||||
}
|
||||
table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
|
||||
background-color: #acbad5;
|
||||
}
|
||||
table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
|
||||
background-color: #aebcd6;
|
||||
}
|
||||
table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
|
||||
background-color: #afbdd8;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
|
||||
background-color: #eaeaea;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
|
||||
background-color: #ececec;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
|
||||
background-color: #efefef;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
|
||||
background-color: #a2aec7;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
|
||||
background-color: #a3b0c9;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
|
||||
background-color: #a5b2cb;
|
||||
}
|
||||
table.dataTable.no-footer {
|
||||
border-bottom: 1px solid #111;
|
||||
}
|
||||
table.dataTable.nowrap th, table.dataTable.nowrap td {
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.dataTable.compact thead th,
|
||||
table.dataTable.compact thead td {
|
||||
padding: 4px 17px;
|
||||
}
|
||||
table.dataTable.compact tfoot th,
|
||||
table.dataTable.compact tfoot td {
|
||||
padding: 4px;
|
||||
}
|
||||
table.dataTable.compact tbody th,
|
||||
table.dataTable.compact tbody td {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
table.dataTable th,
|
||||
table.dataTable td {
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
/*
|
||||
* Control feature layout
|
||||
*/
|
||||
.dataTables_wrapper {
|
||||
position: relative;
|
||||
clear: both;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_length {
|
||||
float: left;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_length select {
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 3px;
|
||||
padding: 5px;
|
||||
background-color: transparent;
|
||||
padding: 4px;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_filter {
|
||||
float: right;
|
||||
text-align: right;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_filter input {
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 3px;
|
||||
padding: 5px;
|
||||
background-color: transparent;
|
||||
margin-left: 3px;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_info {
|
||||
clear: both;
|
||||
float: left;
|
||||
padding-top: 0.755em;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
float: right;
|
||||
text-align: right;
|
||||
padding-top: 0.25em;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
min-width: 1.5em;
|
||||
padding: 0.5em 1em;
|
||||
margin-left: 2px;
|
||||
text-align: center;
|
||||
text-decoration: none !important;
|
||||
cursor: pointer;
|
||||
*cursor: hand;
|
||||
color: #333 !important;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
|
||||
color: #333 !important;
|
||||
border: 1px solid #979797;
|
||||
background-color: white;
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
|
||||
/* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
|
||||
/* Chrome10+,Safari5.1+ */
|
||||
background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
|
||||
/* FF3.6+ */
|
||||
background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
|
||||
/* IE10+ */
|
||||
background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
|
||||
/* Opera 11.10+ */
|
||||
background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
|
||||
/* W3C */
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
|
||||
cursor: default;
|
||||
color: #666 !important;
|
||||
border: 1px solid transparent;
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
|
||||
color: white !important;
|
||||
border: 1px solid #111;
|
||||
background-color: #585858;
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
|
||||
/* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
|
||||
/* Chrome10+,Safari5.1+ */
|
||||
background: -moz-linear-gradient(top, #585858 0%, #111 100%);
|
||||
/* FF3.6+ */
|
||||
background: -ms-linear-gradient(top, #585858 0%, #111 100%);
|
||||
/* IE10+ */
|
||||
background: -o-linear-gradient(top, #585858 0%, #111 100%);
|
||||
/* Opera 11.10+ */
|
||||
background: linear-gradient(to bottom, #585858 0%, #111 100%);
|
||||
/* W3C */
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button:active {
|
||||
outline: none;
|
||||
background-color: #2b2b2b;
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
|
||||
/* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* Chrome10+,Safari5.1+ */
|
||||
background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* FF3.6+ */
|
||||
background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* IE10+ */
|
||||
background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* Opera 11.10+ */
|
||||
background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* W3C */
|
||||
box-shadow: inset 0 0 3px #111;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .ellipsis {
|
||||
padding: 0 1em;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_processing {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
margin-left: -50%;
|
||||
margin-top: -25px;
|
||||
padding-top: 20px;
|
||||
text-align: center;
|
||||
font-size: 1.2em;
|
||||
background-color: white;
|
||||
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
|
||||
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
}
|
||||
.dataTables_wrapper .dataTables_length,
|
||||
.dataTables_wrapper .dataTables_filter,
|
||||
.dataTables_wrapper .dataTables_info,
|
||||
.dataTables_wrapper .dataTables_processing,
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
color: #333;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_scroll {
|
||||
clear: both;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
|
||||
*margin-top: -1px;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
.dataTables_wrapper.no-footer .dataTables_scrollBody {
|
||||
border-bottom: 1px solid #111;
|
||||
}
|
||||
.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
|
||||
.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
|
||||
border-bottom: none;
|
||||
}
|
||||
.dataTables_wrapper:after {
|
||||
visibility: hidden;
|
||||
display: block;
|
||||
content: "";
|
||||
clear: both;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
.dataTables_wrapper .dataTables_info,
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
float: none;
|
||||
text-align: center;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 640px) {
|
||||
.dataTables_wrapper .dataTables_length,
|
||||
.dataTables_wrapper .dataTables_filter {
|
||||
float: none;
|
||||
text-align: center;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_filter {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BIN
docs/_static/images/IPSec_close_action_settings.jpg
vendored
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
docs/_static/images/VyOS_Dual-Hub_DMVPN.png
vendored
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
docs/_static/images/openvpn_site2site_diagram.jpg
vendored
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/_static/images/password-recovery-01.png
vendored
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
docs/_static/images/vrf-example-topology-01.png
vendored
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/_static/images/wireguard_qrcode.jpg
vendored
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
docs/_static/images/wireguard_site2site_diagram.jpg
vendored
Normal file
|
After Width: | Height: | Size: 20 KiB |
15389
docs/_static/js/datatables.js
vendored
Normal file
4
docs/_static/js/tables.js
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
$(document).ready(function() {
|
||||
$('#table-cfgcmd').DataTable();
|
||||
$('#table-opcmd').DataTable();
|
||||
} );
|
||||
6
docs/_templates/layout.html
vendored
@ -1,4 +1,8 @@
|
||||
{% extends "!layout.html" %}
|
||||
{%- set current_version = "1.3.x equuleus" %}
|
||||
{% block extrahead %}
|
||||
<link href="{{ pathto("_static/css/custom.css", True) }}" rel="stylesheet" type="text/css">
|
||||
{% endblock %}
|
||||
<link href="{{ pathto("_static/css/datatables.css", True) }}" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript" charset="utf8" src="{{ pathto("_static/js/datatables.js", True) }}"></script>
|
||||
<script type="text/javascript" charset="utf8" src="{{ pathto("_static/js/tables.js", True) }}"></script>
|
||||
{% endblock %}
|
||||
|
||||
146
docs/automation/cloud-init.rst
Normal file
@ -0,0 +1,146 @@
|
||||
:lastproofread: 2022-08-24
|
||||
|
||||
.. _cloud-init:
|
||||
|
||||
###############
|
||||
VyOS cloud-init
|
||||
###############
|
||||
|
||||
Cloud and virtualized instances of VyOS are initialized using the
|
||||
industry-standard cloud-init. Via cloud-init, the system performs tasks such as
|
||||
injecting SSH keys and configuring the network. In addition, the user can supply
|
||||
a custom configuration at the time of instance launch.
|
||||
|
||||
**************
|
||||
Config Sources
|
||||
**************
|
||||
|
||||
VyOS support three types of config sources.
|
||||
|
||||
* Metadata - Metadata is sourced by the cloud platform or hypervisor.
|
||||
In some clouds, there is implemented as an HTTP endpoint at
|
||||
http://169.254.169.254.
|
||||
* Network configuration - This config source informs the system about the
|
||||
network settings like IP addresses, routes, DNS. Available only in several
|
||||
cloud and virtualization platforms.
|
||||
* User-data - User-data is specified by the user. This config source offers the
|
||||
ability to insert any CLI configuration commands into the configuration before
|
||||
the first boot.
|
||||
|
||||
*********
|
||||
User-data
|
||||
*********
|
||||
|
||||
Major cloud providers offer a means of providing user-data at the time of
|
||||
instance launch. It can be provided as plain text or as base64-encoded text,
|
||||
depending on cloud provider. Also, it can be compressed using gzip, which makes
|
||||
sense with a long configuration commands list, because of the hard limit to
|
||||
~16384 bytes for the whole user-data.
|
||||
|
||||
The easiest way to configure the system via user-data is the Cloud-config syntax
|
||||
described below.
|
||||
|
||||
********************
|
||||
Cloud-config modules
|
||||
********************
|
||||
|
||||
In VyOS, by default, enabled three modules:
|
||||
|
||||
* ``write_files`` - this module allows to insert any files into the filesystem
|
||||
before the first boot, for example, pre-generated encryption keys,
|
||||
certificates, or even a whole ``config.boot`` file.
|
||||
* ``vyos_userdata`` - the module accepts a list of CLI configuration commands in
|
||||
a ``vyos_config_commands`` section, which gives an easy way to configure the
|
||||
system during deployment.
|
||||
* ``vyos_install`` - this module allows to install VyOS without human intervention.
|
||||
|
||||
************************
|
||||
cloud-config file format
|
||||
************************
|
||||
|
||||
A cloud-config document is written in YAML. The file must begin
|
||||
with ``#cloud-config`` line.
|
||||
|
||||
************************
|
||||
Module vyos_userdata
|
||||
************************
|
||||
The key used to designate a VyOS configuration
|
||||
is ``vyos_config_commands``. What follows is VyOS configuration using
|
||||
the "set-style" syntax. Both "set" and "delete" commands are supported.
|
||||
|
||||
Commands requirements:
|
||||
|
||||
* one command per line
|
||||
* if command ends in a value, it must be inside single quotes
|
||||
* a single-quote symbol is not allowed inside command or value
|
||||
|
||||
The commands list produced by the ``show configuration commands`` command on a
|
||||
VyOS router should comply with all the requirements, so it is easy to get a
|
||||
proper commands list by copying it from another router.
|
||||
|
||||
The configuration specified in the cloud-config document overwrites default
|
||||
configuration values and values configured via Metadata.
|
||||
|
||||
Here is an example cloud-config.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
#cloud-config
|
||||
vyos_config_commands:
|
||||
- set system host-name 'vyos-prod-ashburn'
|
||||
- set system ntp server 1.pool.ntp.org
|
||||
- set system ntp server 2.pool.ntp.org
|
||||
- delete interfaces ethernet eth1 address 'dhcp'
|
||||
- set interfaces ethernet eth1 address '192.0.2.247/24'
|
||||
- set protocols static route 198.51.100.0/24 next-hop '192.0.2.1'
|
||||
|
||||
************************
|
||||
Module vyos_install
|
||||
************************
|
||||
This module allows to install VyOS without human intervention.
|
||||
It will be useful for the installation via a network like PXE or USB flash install.
|
||||
After network boot or USB drive boot, this module runs automatic system installation with
|
||||
predefined grub parameters.
|
||||
The next possible option can be used.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
#cloud-config
|
||||
vyos_install:
|
||||
activated: true # true - enable installer, false - disable. Default: false
|
||||
post_reboot: true # true - reboot after installation, false - do not reboot. Default: false
|
||||
ci_disable: true # true - disable cloud-init after installation, false - do not disable. Default: false
|
||||
boot_params:
|
||||
console_type: serial # type of console: kvm, serial. Default: kvm
|
||||
serial_console_num: 1 # serial console number. Default: 0
|
||||
serial_console_speed: 115200 # serial console speed. Default: 9600
|
||||
cmdline_extra: nosmt mitigations=off # add extra parameters for kernel cmdline
|
||||
|
||||
*************************
|
||||
System Defaults/Fallbacks
|
||||
*************************
|
||||
|
||||
These are the VyOS defaults and fallbacks.
|
||||
|
||||
* SSH is configured on port 22
|
||||
* ``vyos``/``vyos`` credentials if no others specified by data source
|
||||
* DHCP on first Ethernet interface if no network configuration is provided
|
||||
|
||||
All of these can be overridden using the configuration in user-data.
|
||||
|
||||
***************
|
||||
Troubleshooting
|
||||
***************
|
||||
|
||||
If you encounter problems, verify that the cloud-config document contains
|
||||
valid YAML. Online resources such as https://www.yamllint.com/ provide a
|
||||
simple tool for validating YAML.
|
||||
|
||||
cloud-init logs to /var/log/cloud-init.log. This file can be helpful in
|
||||
determining why the configuration varies from what you expect. You can fetch the
|
||||
most important data filtering output for ``vyos`` keyword:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
sudo grep vyos /var/log/cloud-init.log
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
:lastproofread: 2023-01-16
|
||||
|
||||
.. _command-scripting:
|
||||
|
||||
Command Scripting
|
||||
@ -33,7 +35,7 @@ example, if you want to disable a BGP peer on VRRP transition to backup:
|
||||
Run operational commands
|
||||
------------------------
|
||||
|
||||
Unlike a normal configuration sessions, all operational commands must be
|
||||
Unlike a normal configuration session, all operational commands must be
|
||||
prepended with ``run``, even if you haven't created a session with configure.
|
||||
|
||||
.. code-block:: none
|
||||
@ -43,9 +45,36 @@ prepended with ``run``, even if you haven't created a session with configure.
|
||||
run show interfaces
|
||||
exit
|
||||
|
||||
Other script language
|
||||
Run commands remotely
|
||||
---------------------
|
||||
|
||||
Sometimes you simply wan't to execute a bunch of op-mode commands via SSH on
|
||||
a remote VyOS system.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
ssh 192.0.2.1 'vbash -s' <<EOF
|
||||
source /opt/vyatta/etc/functions/script-template
|
||||
run show interfaces
|
||||
exit
|
||||
EOF
|
||||
|
||||
Will return:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
Welcome to VyOS
|
||||
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
|
||||
Interface IP Address S/L Description
|
||||
--------- ---------- --- -----------
|
||||
eth0 192.0.2.1/24 u/u
|
||||
lo 127.0.0.1/8 u/u
|
||||
::1/128
|
||||
|
||||
|
||||
Other script languages
|
||||
----------------------
|
||||
|
||||
If you want to script the configs in a language other than bash you can have
|
||||
your script output commands and then source them in a bash script.
|
||||
|
||||
@ -104,14 +133,71 @@ group, the script can be safeguarded like this:
|
||||
exec sg vyattacfg -c "/bin/vbash $(readlink -f $0) $@"
|
||||
fi
|
||||
|
||||
Executing pre-hooks/post-hooks Scripts
|
||||
--------------------------------------
|
||||
|
||||
VyOS has the ability to run custom scripts before and after each commit
|
||||
|
||||
The default directories where your custom Scripts should be located are:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
/config/scripts/commit/pre-hooks.d - Directory with scripts that run before
|
||||
each commit.
|
||||
|
||||
/config/scripts/commit/post-hooks.d - Directory with scripts that run after
|
||||
each commit.
|
||||
|
||||
Scripts are run in alphabetical order. Their names must consist entirely of
|
||||
ASCII upper- and lower-case letters,ASCII digits, ASCII underscores, and
|
||||
ASCII minus-hyphens.No other characters are allowed.
|
||||
|
||||
.. note:: Custom scripts are not executed with root privileges
|
||||
(Use sudo inside if this is necessary).
|
||||
|
||||
A simple example is shown below, where the ops command executed in
|
||||
the post-hook script is "show interfaces".
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
vyos@vyos# set interfaces ethernet eth1 address 192.0.2.3/24
|
||||
vyos@vyos# commit
|
||||
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
|
||||
Interface IP Address S/L Description
|
||||
--------- ---------- --- -----------
|
||||
eth0 198.51.100.10/24 u/u
|
||||
eth1 192.0.2.3/24 u/u
|
||||
eth2 - u/u
|
||||
eth3 - u/u
|
||||
lo 203.0.113.5/24 u/u
|
||||
|
||||
Preconfig on boot
|
||||
-----------------
|
||||
|
||||
The ``/config/scripts/vyos-preconfig-bootup.script`` script is called on boot
|
||||
before the VyOS configuration during boot process.
|
||||
|
||||
Any modifications were done to work around unfixed bugs and implement
|
||||
enhancements that are not complete in the VyOS system can be placed here.
|
||||
|
||||
The default file looks like this:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
#!/bin/sh
|
||||
# This script is executed at boot time before VyOS configuration is applied.
|
||||
# Any modifications required to work around unfixed bugs or use
|
||||
# services not available through the VyOS CLI system can be placed here.
|
||||
|
||||
|
||||
Postconfig on boot
|
||||
------------------
|
||||
|
||||
The ``/config/scripts/vyos-postconfig-bootup.script`` script is called on boot
|
||||
after the VyOS configuration is fully applied.
|
||||
|
||||
Any modifications done to work around unfixed bugs and implement enhancements
|
||||
which are not complete in the VyOS system can be placed here.
|
||||
Any modifications were done to work around unfixed bugs and implement
|
||||
enhancements that are not complete in the VyOS system can be placed here.
|
||||
|
||||
The default file looks like this:
|
||||
|
||||
@ -124,4 +210,4 @@ The default file looks like this:
|
||||
|
||||
.. hint:: For configuration/upgrade management issues, modification of this
|
||||
script should be the last option. Always try to find solutions based on CLI
|
||||
commands first.
|
||||
commands first.
|
||||
@ -3,13 +3,16 @@ VyOS Automation
|
||||
###############
|
||||
|
||||
|
||||
* Ansible
|
||||
* Saltstack
|
||||
* HTTP-API
|
||||
* startup scripts
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
command-scripting
|
||||
|
||||
vyos-api
|
||||
vyos-ansible
|
||||
vyos-napalm
|
||||
vyos-netmiko
|
||||
command-scripting
|
||||
cloud-init
|
||||
93
docs/automation/vyos-ansible.rst
Normal file
@ -0,0 +1,93 @@
|
||||
:lastproofread: 2023-01-16
|
||||
|
||||
.. _vyos-ansible:
|
||||
|
||||
Ansible
|
||||
=======
|
||||
|
||||
VyOS supports configuration via ansible.
|
||||
Need to install ``ansible`` and ``python3-paramiko`` module
|
||||
|
||||
Structure of files
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
.
|
||||
├── ansible.cfg
|
||||
├── files
|
||||
│ └── id_rsa_docker.pub
|
||||
├── hosts
|
||||
└── main.yml
|
||||
|
||||
|
||||
File contents
|
||||
-------------
|
||||
|
||||
ansible.cfg
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
[defaults]
|
||||
host_key_checking = no
|
||||
retry_files_enabled = False
|
||||
ANSIBLE_INVENTORY_UNPARSED_FAILED = true
|
||||
|
||||
id_rsa_docker.pub. Needs to declare only public key exactly.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
AAAAB3NzaC1yc2EAAAADAQABAAABAQCoDgfhQJuJRFWJijHn7ZinZ3NWp4hWVrt7HFcvn0kgtP/5PeCtMt
|
||||
|
||||
|
||||
hosts
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
[vyos_hosts]
|
||||
r11 ansible_ssh_host=192.0.2.11
|
||||
|
||||
[vyos_hosts:vars]
|
||||
ansible_python_interpreter=/usr/bin/python3
|
||||
ansible_user=vyos
|
||||
ansible_ssh_pass=vyos
|
||||
ansible_network_os=vyos
|
||||
ansible_connection=network_cli
|
||||
|
||||
main.yml
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
---
|
||||
|
||||
- hosts: r11
|
||||
|
||||
connection: network_cli
|
||||
gather_facts: 'no'
|
||||
|
||||
tasks:
|
||||
- name: Configure remote r11
|
||||
vyos_config:
|
||||
lines:
|
||||
- set system host-name r11
|
||||
- set system name-server 203.0.113.254
|
||||
- set service ssh disable-host-validation
|
||||
- set system login user vyos authentication public-keys docker@work type ssh-rsa
|
||||
- set system login user vyos authentication public-keys docker@work key "{{ lookup('file', 'id_rsa_docker.pub') }}"
|
||||
- set system time-zone America/Los_Angeles
|
||||
- set interfaces ethernet eth0 description WAN
|
||||
|
||||
Run ansible
|
||||
-----------
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
$ ansible-playbook -i hosts main.yml
|
||||
|
||||
PLAY [r11] ******************************************************************************************************************************************************************************************************
|
||||
|
||||
TASK [Configure remote r11] *************************************************************************************************************************************************************************************
|
||||
changed: [r11]
|
||||
|
||||
PLAY RECAP *****************************************************************************************************************************************************************************************************
|
||||
r11 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||||
|
||||
336
docs/automation/vyos-api.rst
Normal file
@ -0,0 +1,336 @@
|
||||
:lastproofread: 2023-01-16
|
||||
|
||||
.. _vyosapi:
|
||||
|
||||
########
|
||||
VyOS API
|
||||
########
|
||||
|
||||
For configuration and enabling the API see :ref:`http-api`
|
||||
|
||||
**************
|
||||
Authentication
|
||||
**************
|
||||
|
||||
All endpoints only listen on HTTP POST requests and the API KEY must set as
|
||||
``key`` in the formdata.
|
||||
|
||||
Below see one example for curl and one for python.
|
||||
The rest of the documentation is reduced to curl.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl --location --request POST 'https://vyos/retrieve' \
|
||||
--form data='{"op": "showConfig", "path": []}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import requests
|
||||
url = "https://vyos/retrieve"
|
||||
payload={'data': '{"op": "showConfig", "path": []}',
|
||||
'key': 'MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
}
|
||||
headers = {}
|
||||
response = requests.request("POST", url, headers=headers, data=payload)
|
||||
print(response.text)
|
||||
|
||||
|
||||
*************
|
||||
API Endpoints
|
||||
*************
|
||||
|
||||
/retrieve
|
||||
=========
|
||||
|
||||
With the ``retrieve`` endpoint you get parts or the whole configuration.
|
||||
|
||||
To get the whole configuration, pass an empty list to the ``path`` field
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl --location --request POST 'https://vyos/retrieve' \
|
||||
--form data='{"op": "showConfig", "path": []}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
|
||||
response (shorted)
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"interfaces": {
|
||||
"ethernet": {
|
||||
"eth0": {
|
||||
"address": "dhcp",
|
||||
"duplex": "auto",
|
||||
"hw-id": "50:00:00:01:00:00",
|
||||
"speed": "auto"
|
||||
},
|
||||
"eth1": {
|
||||
"duplex": "auto",
|
||||
"hw-id": "50:00:00:01:00:01",
|
||||
"speed": "auto"
|
||||
...
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
To only get a part of the configuration, for example ``system syslog``.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/retrieve' \
|
||||
--form data='{"op": "showConfig", "path": ["system", "syslog"]}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"global": {
|
||||
"facility": {
|
||||
"all": {
|
||||
"level": "info"
|
||||
},
|
||||
"protocols": {
|
||||
"level": "debug"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
|
||||
if you just want the Value of a multi-valued node, use the ``returnValues``
|
||||
operation.
|
||||
|
||||
For example, get the addresses of a ``dum0`` interface.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/retrieve' \
|
||||
--form data='{"op": "returnValues", "path": ["interfaces","dummy","dum0","address"]}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
respone:
|
||||
{
|
||||
"success": true,
|
||||
"data": [
|
||||
"10.10.10.10/24",
|
||||
"10.10.10.11/24",
|
||||
"10.10.10.12/24"
|
||||
],
|
||||
"error": null
|
||||
}
|
||||
|
||||
/reset
|
||||
======
|
||||
|
||||
The ``reset`` endpoint run a ``reset`` command.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl --location --request POST 'https://vyos/reset' \
|
||||
--form data='{"op": "reset", "path": ["ip", "bgp", "192.0.2.11"]}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
respone:
|
||||
{
|
||||
"success": true,
|
||||
"data": "",
|
||||
"error": null
|
||||
}
|
||||
|
||||
/image
|
||||
======
|
||||
|
||||
To add or delete an image, use the ``/image`` endpoint.
|
||||
|
||||
add an image
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/image' \
|
||||
--form data='{"op": "add", "url": "https://downloads.vyos.io/rolling/current/amd64/vyos-rolling-latest.iso"}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
respone (shorted):
|
||||
{
|
||||
"success": true,
|
||||
"data": "Trying to fetch ISO file from https://downloads.vyos.io/rolling-latest.iso\n
|
||||
...
|
||||
Setting up grub configuration...\nDone.\n",
|
||||
"error": null
|
||||
}
|
||||
|
||||
delete an image, for example ``1.3-rolling-202006070117``
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/image' \
|
||||
--form data='{"op": "delete", "name": "1.3-rolling-202006070117"}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": "Deleting the \"1.3-rolling-202006070117\" image...\nDone\n",
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
/show
|
||||
=====
|
||||
|
||||
The ``/show`` endpoint is to show everything in the operational mode.
|
||||
|
||||
For example, show which images are installed.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/show' \
|
||||
--form data='{"op": "show", "path": ["system", "image"]}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": "The system currently has the following image(s) installed:\n\n
|
||||
1: 1.4-rolling-202102280559 (default boot)\n
|
||||
2: 1.4-rolling-202102230218\n
|
||||
3: 1.3-beta-202102210443\n\n",
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
/generate
|
||||
=========
|
||||
|
||||
The ``generate`` endpoint run a ``generate`` command.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/generate' \
|
||||
--form data='{"op": "generate", "path": ["wireguard", "default-keypair"]}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": "",
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
/configure
|
||||
==========
|
||||
|
||||
You can pass a ``set``, ``delete`` or ``comment`` command to the
|
||||
``/configure`` endpoint.
|
||||
|
||||
``set`` a single command
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/configure' \
|
||||
--form data='{"op": "set", "path": ["interfaces", "dummy", "dum1", "address", "10.11.0.1/32"]}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": null,
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
``delete`` a single command
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/configure' \
|
||||
--form data='{"op": "delete", "path": ["interfaces", "dummy", "dum1", "address", "10.11.0.1/32"]}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": null,
|
||||
"error": null
|
||||
}
|
||||
|
||||
The API pushes every request to a session and commit it.
|
||||
But some of VyOS components like DHCP and PPPoE Servers, IPSec, VXLAN, and
|
||||
other tunnels require full configuration for commit.
|
||||
The endpoint will process multiple commands when you pass them as a list to
|
||||
the ``data`` field.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/configure' \
|
||||
--form data='[{"op": "set","path":["interfaces","vxlan","vxlan1","remote","203.0.113.99"]}, {"op": "set","path":["interfaces","vxlan","vxlan1","vni","1"]}]' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": null,
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
/config-file
|
||||
============
|
||||
|
||||
The endpoint ``/config-file`` is to save or load a configuration.
|
||||
|
||||
Save a running configuration to the startup configuration.
|
||||
When you don't specify the file when saving, it saves to
|
||||
``/config/config.boot``.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/config-file' \
|
||||
--form data='{"op": "save"}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": "Saving configuration to '/config/config.boot'...\nDone\n",
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
Save a running configuration to a file.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/config-file' \
|
||||
--form data='{"op": "save", "file": "/config/test.config"}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": "Saving configuration to '/config/test.config'...\nDone\n",
|
||||
"error": null
|
||||
}
|
||||
|
||||
|
||||
To Load a configuration file.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
curl -k --location --request POST 'https://vyos/config-file' \
|
||||
--form data='{"op": "load", "file": "/config/test.config"}' \
|
||||
--form key='MY-HTTPS-API-PLAINTEXT-KEY'
|
||||
|
||||
response:
|
||||
{
|
||||
"success": true,
|
||||
"data": null,
|
||||
"error": null
|
||||
}
|
||||
144
docs/automation/vyos-napalm.rst
Normal file
@ -0,0 +1,144 @@
|
||||
:lastproofread: 2023-01-16
|
||||
|
||||
.. _vyos-napalm:
|
||||
|
||||
Napalm
|
||||
======
|
||||
|
||||
VyOS supports some napalm_ functions for configuration and op-mode.
|
||||
It requires more tests.
|
||||
|
||||
Install ``napalm-vyos`` module
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
apt install python3-pip
|
||||
pip3 install napalm
|
||||
pip3 install napalm-vyos
|
||||
|
||||
|
||||
Op-mode
|
||||
-------
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import json
|
||||
from napalm import get_network_driver
|
||||
|
||||
driver = get_network_driver('vyos')
|
||||
|
||||
vyos_router = driver(
|
||||
hostname="192.0.2.1",
|
||||
username="vyos",
|
||||
password="vyospass",
|
||||
optional_args={"port": 22},
|
||||
)
|
||||
|
||||
vyos_router.open()
|
||||
output = vyos_router.get_facts()
|
||||
print(json.dumps(output, indent=4))
|
||||
|
||||
output = vyos_router.get_arp_table()
|
||||
print(json.dumps(output, indent=4))
|
||||
|
||||
vyos_router.close()
|
||||
|
||||
Output op-mode
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
$ ./vyos-napalm.py
|
||||
{
|
||||
"uptime": 7185,
|
||||
"vendor": "VyOS",
|
||||
"os_version": "1.3.0-rc5",
|
||||
"serial_number": "",
|
||||
"model": "Standard PC (Q35 + ICH9, 2009)",
|
||||
"hostname": "r4-1.3",
|
||||
"fqdn": "vyos.local",
|
||||
"interface_list": [
|
||||
"eth0",
|
||||
"eth1",
|
||||
"eth2",
|
||||
"lo",
|
||||
"vtun10"
|
||||
]
|
||||
}
|
||||
[
|
||||
{
|
||||
"interface": "eth1",
|
||||
"mac": "52:54:00:b2:38:2c",
|
||||
"ip": "192.0.2.2",
|
||||
"age": 0.0
|
||||
},
|
||||
{
|
||||
"interface": "eth0",
|
||||
"mac": "52:54:00:a2:b9:5b",
|
||||
"ip": "203.0.113.11",
|
||||
"age": 0.0
|
||||
}
|
||||
]
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
We need 2 files, commands.conf and script itself.
|
||||
|
||||
Content of commands.conf
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
set service ssh disable-host-validation
|
||||
set service ssh port '2222'
|
||||
set system name-server '192.0.2.8'
|
||||
set system name-server '203.0.113.8'
|
||||
set interfaces ethernet eth1 description 'FOO'
|
||||
|
||||
Script vyos-napalm.py
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from napalm import get_network_driver
|
||||
|
||||
driver = get_network_driver('vyos')
|
||||
|
||||
vyos_router = driver(
|
||||
hostname="192.0.2.1",
|
||||
username="vyos",
|
||||
password="vyospass",
|
||||
optional_args={"port": 22},
|
||||
)
|
||||
|
||||
vyos_router.open()
|
||||
vyos_router.load_merge_candidate(filename='commands.conf')
|
||||
diffs = vyos_router.compare_config()
|
||||
|
||||
if bool(diffs) == True:
|
||||
print(diffs)
|
||||
vyos_router.commit_config()
|
||||
else:
|
||||
print('No configuration changes to commit')
|
||||
vyos_router.discard_config()
|
||||
|
||||
vyos_router.close()
|
||||
|
||||
Output
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
$./vyos-napalm.py
|
||||
[edit interfaces ethernet eth1]
|
||||
+description FOO
|
||||
[edit service ssh]
|
||||
+disable-host-validation
|
||||
+port 2222
|
||||
[edit system]
|
||||
+name-server 192.0.2.8
|
||||
+name-server 203.0.113.8
|
||||
[edit]
|
||||
|
||||
.. _napalm: https://napalm.readthedocs.io/en/latest/base.html
|
||||
72
docs/automation/vyos-netmiko.rst
Normal file
@ -0,0 +1,72 @@
|
||||
:lastproofread: 2023-01-16
|
||||
|
||||
.. _vyos-netmiko:
|
||||
|
||||
Netmiko
|
||||
=======
|
||||
|
||||
VyOS supports configuration via netmiko_.
|
||||
It requires to install ``python3-netmiko`` module.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from netmiko import ConnectHandler
|
||||
|
||||
vyos_router = {
|
||||
"device_type": "vyos",
|
||||
"host": "192.0.2.1",
|
||||
"username": "vyos",
|
||||
"password": "vyospass",
|
||||
"port": 22,
|
||||
}
|
||||
|
||||
net_connect = ConnectHandler(**vyos_router)
|
||||
|
||||
config_commands = [
|
||||
'set interfaces ethernet eth0 description WAN',
|
||||
'set interfaces ethernet eth1 description LAN',
|
||||
]
|
||||
|
||||
# set congiguration
|
||||
output = net_connect.send_config_set(config_commands, exit_config_mode=False)
|
||||
print(output)
|
||||
|
||||
# commit configuration
|
||||
output = net_connect.commit()
|
||||
print(output)
|
||||
|
||||
# op-mode commands
|
||||
output = net_connect.send_command("run show interfaces")
|
||||
print(output)
|
||||
|
||||
Output
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
$ ./vyos-netmiko.py
|
||||
configure
|
||||
set interfaces ethernet eth0 description WAN
|
||||
[edit]
|
||||
vyos@r4-1.3# set interfaces ethernet eth1 description LAN
|
||||
[edit]
|
||||
vyos@r4-1.3#
|
||||
commit
|
||||
[edit]
|
||||
vyos@r4-1.3#
|
||||
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
|
||||
Interface IP Address S/L Description
|
||||
--------- ---------- --- -----------
|
||||
eth0 203.0.113.1/24 u/u WAN
|
||||
eth1 192.0.2.1/30 u/u LAN
|
||||
eth2 - u/u
|
||||
lo 127.0.0.1/8 u/u
|
||||
::1/128
|
||||
vtun10 10.10.0.1/24 u/u
|
||||
[edit]
|
||||
|
||||
.. _netmiko: https://github.com/ktbyers/netmiko
|
||||
5978
docs/changelog/1.3.rst
Normal file
@ -10,6 +10,7 @@ Changelog
|
||||
:maxdepth: 1
|
||||
:includehidden:
|
||||
|
||||
1.3
|
||||
1.2.6
|
||||
1.2.5
|
||||
1.2.4
|
||||
|
||||
110
docs/cli.rst
@ -110,7 +110,6 @@ files.
|
||||
Terminology
|
||||
###########
|
||||
|
||||
live
|
||||
A VyOS system has three major types of configurations:
|
||||
|
||||
* **Active** or **running configuration** is the system configuration
|
||||
@ -229,6 +228,111 @@ special way on how to :ref:`run_opmode_from_config_mode`.
|
||||
|
||||
.. _`forum`: https://forum.vyos.io
|
||||
|
||||
.. opcmd:: show configuration json
|
||||
|
||||
View the current active configuration in JSON format.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
{"interfaces": {"ethernet": {"eth0": {"address": ["192.0.2.11/24", "192.0.2.35/24"], "hw-id": "52:54:00:48:a0:c6"}, "eth1": {"address": ["203.0.113.1/24"], "hw-id": "52:54:00:fc:50:0b"}}, "loopback": {"lo": {}}}, "protocols": {"static": {"route": {"0.0.0.0/0": {"next-hop": {"192.0.2.254": {}}}}}}, "service": {"ssh": {"disable-host-validation": {}}}, "system": {"config-management": {"commit-revisions": "100"}, "console": {"device": {"ttyS0": {"speed": "115200"}}}, "host-name": "r11-vyos", "login": {"user": {"vyos": {"authentication": {"encrypted-password": "$6$Vt68...F0", "plaintext-password": "", "public-keys": {"vyos@vyos": {"key": "AAAAxxx=", "type": "ssh-rsa"}}}}}}, "name-server": ["203.0.113.254"], "ntp": {"server": {"time1.vyos.net": {}, "time2.vyos.net": {}, "time3.vyos.net": {}}}, "syslog": {"global": {"facility": {"all": {"level": "info"}, "protocols": {"level": "debug"}}}}, "time-zone": "America/New_York"}}
|
||||
|
||||
.. opcmd:: show configuration json pretty
|
||||
|
||||
View the current active configuration in readable JSON format.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
{
|
||||
"interfaces": {
|
||||
"ethernet": {
|
||||
"eth0": {
|
||||
"address": [
|
||||
"192.0.2.11/24",
|
||||
"192.0.2.35/24"
|
||||
],
|
||||
"hw-id": "52:54:00:48:a0:c6"
|
||||
},
|
||||
"eth1": {
|
||||
"address": [
|
||||
"203.0.113.1/24"
|
||||
],
|
||||
"hw-id": "52:54:00:fc:50:0b"
|
||||
}
|
||||
},
|
||||
"loopback": {
|
||||
"lo": {}
|
||||
}
|
||||
},
|
||||
"protocols": {
|
||||
"static": {
|
||||
"route": {
|
||||
"0.0.0.0/0": {
|
||||
"next-hop": {
|
||||
"192.0.2.254": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"service": {
|
||||
"ssh": {
|
||||
"disable-host-validation": {}
|
||||
}
|
||||
},
|
||||
"system": {
|
||||
"config-management": {
|
||||
"commit-revisions": "100"
|
||||
},
|
||||
"console": {
|
||||
"device": {
|
||||
"ttyS0": {
|
||||
"speed": "115200"
|
||||
}
|
||||
}
|
||||
},
|
||||
"host-name": "r11-vyos",
|
||||
"login": {
|
||||
"user": {
|
||||
"vyos": {
|
||||
"authentication": {
|
||||
"encrypted-password": "$6$Vt68...F0",
|
||||
"plaintext-password": "",
|
||||
"public-keys": {
|
||||
"vyos@vyos": {
|
||||
"key": "AAAAxxx=",
|
||||
"type": "ssh-rsa"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"name-server": [
|
||||
"203.0.113.254"
|
||||
],
|
||||
"ntp": {
|
||||
"server": {
|
||||
"time1.vyos.net": {},
|
||||
"time2.vyos.net": {},
|
||||
"time3.vyos.net": {}
|
||||
}
|
||||
},
|
||||
"syslog": {
|
||||
"global": {
|
||||
"facility": {
|
||||
"all": {
|
||||
"level": "info"
|
||||
},
|
||||
"protocols": {
|
||||
"level": "debug"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"time-zone": "America/New_York"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
The config mode
|
||||
---------------
|
||||
@ -404,7 +508,7 @@ different levels in the hierarchy.
|
||||
Use this command to preserve configuration changes upon reboot. By
|
||||
default it is stored at */config/config.boot*. In the case you want
|
||||
to store the configuration file somewhere else, you can add a local
|
||||
path, an SCP address, an FTP address or a TFTP address.
|
||||
path, a SCP address, a FTP address or a TFTP address.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@ -455,7 +559,7 @@ different levels in the hierarchy.
|
||||
a firewall, and you are not sure there are no mistakes that will lock
|
||||
you out of your system. You can use confirmed commit. If you issue
|
||||
the ``commit-confirm`` command, your changes will be commited, and if
|
||||
you don't issue issue the ``confirm`` command in 10 minutes, your
|
||||
you don't issue the ``confirm`` command in 10 minutes, your
|
||||
system will reboot into previous config revision.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
10
docs/conf.py
@ -22,7 +22,7 @@ from docutils.parsers.rst.roles import set_classes
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = u'VyOS'
|
||||
copyright = u'2021, VyOS maintainers and contributors'
|
||||
copyright = u'2023, VyOS maintainers and contributors'
|
||||
author = u'VyOS maintainers and contributors'
|
||||
|
||||
# The short X.Y version
|
||||
@ -45,6 +45,8 @@ extensions = ['sphinx.ext.intersphinx',
|
||||
'sphinx.ext.ifconfig',
|
||||
'sphinx.ext.graphviz',
|
||||
'notfound.extension',
|
||||
'myst_parser',
|
||||
'sphinx_design',
|
||||
'vyos'
|
||||
]
|
||||
|
||||
@ -67,6 +69,12 @@ master_doc = 'index'
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# https://docs.readthedocs.io/en/stable/guides/manage-translations-sphinx.html#create-translatable-files
|
||||
locale_dirs = ['_locale/']
|
||||
gettext_compact = False
|
||||
gettext_uuid = True
|
||||
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path .
|
||||
|
||||
@ -0,0 +1,99 @@
|
||||
############################
|
||||
DHCP Relay trough GRE-Bridge
|
||||
############################
|
||||
|
||||
|
||||
| Testdate: 2023-12-28
|
||||
| Version: 1.3.5
|
||||
| Upgrade Version: 1.5-rolling-202312261220
|
||||
|
||||
|
||||
This simple structure shows how to configure a DHCP Relay over a GRE Bridge
|
||||
interface.
|
||||
|
||||
********
|
||||
Topology
|
||||
********
|
||||
|
||||
The topology has 3 VyOS routers and one client. Between the DHCP Server and
|
||||
the DHCP Relay is a GRE tunnel. The `transport` VyOS represent a large
|
||||
Network.
|
||||
|
||||
.. image:: _include/topology.png
|
||||
:alt: Ansible Example topology image
|
||||
|
||||
*************
|
||||
Configuration
|
||||
*************
|
||||
|
||||
First, we configure the transport network and the Tunnel interface.
|
||||
|
||||
|
||||
Transport:
|
||||
|
||||
.. literalinclude:: _include/transport.conf
|
||||
:language: none
|
||||
|
||||
|
||||
DHCP-Server
|
||||
|
||||
.. literalinclude:: _include/dhcp-server.conf
|
||||
:language: none
|
||||
:lines: 1-8
|
||||
|
||||
|
||||
DHCP-Relay
|
||||
|
||||
.. literalinclude:: _include/dhcp-relay.conf
|
||||
:language: none
|
||||
:lines: 1-8
|
||||
|
||||
|
||||
After this, we need the DHCP-Server and Relay configuration.
|
||||
To get a testable result, we just have one IP in the DHCP range.
|
||||
Expand it as you need it.
|
||||
|
||||
DHCP-Server
|
||||
|
||||
.. literalinclude:: _include/dhcp-server.conf
|
||||
:language: none
|
||||
:lines: 9-13
|
||||
|
||||
|
||||
DHCP-Relay
|
||||
|
||||
.. literalinclude:: _include/dhcp-relay.conf
|
||||
:language: none
|
||||
:lines: 9-10
|
||||
|
||||
|
||||
***************
|
||||
Test the result
|
||||
***************
|
||||
|
||||
Ping the Client from the DHCP Server.
|
||||
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
vyos@dhcp-server:~$ ping 192.168.0.30 count 4
|
||||
PING 192.168.0.30 (192.168.0.30) 56(84) bytes of data.
|
||||
64 bytes from 192.168.0.30: icmp_seq=1 ttl=63 time=0.960 ms
|
||||
64 bytes from 192.168.0.30: icmp_seq=2 ttl=63 time=1.03 ms
|
||||
64 bytes from 192.168.0.30: icmp_seq=3 ttl=63 time=1.18 ms
|
||||
64 bytes from 192.168.0.30: icmp_seq=4 ttl=63 time=1.20 ms
|
||||
|
||||
--- 192.168.0.30 ping statistics ---
|
||||
4 packets transmitted, 4 received, 0% packet loss, time 7ms
|
||||
rtt min/avg/max/mdev = 0.960/1.093/1.200/0.100 ms
|
||||
|
||||
|
||||
And show all DHCP Leases
|
||||
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
vyos@dhcp-server:~$ show dhcp server leases
|
||||
IP address Hardware address State Lease start Lease expiration Remaining Pool Hostname
|
||||
------------ ------------------ ------- ------------------- ------------------- ----------- ---------- ----------
|
||||
192.168.0.30 00:50:79:66:68:05 active 2023/12/28 12:34:56 2023/12/29 12:34:56 23:59:16 DHCPTun100 VPCS
|
||||
@ -0,0 +1,11 @@
|
||||
set interfaces ethernet eth1 address '10.0.10.10/24'
|
||||
set interfaces ethernet eth2 address '192.168.0.254/24'
|
||||
set interfaces tunnel tun100 address '172.16.0.2/30'
|
||||
set interfaces tunnel tun100 encapsulation 'gretap'
|
||||
set interfaces tunnel tun100 remote '10.0.20.10'
|
||||
set interfaces tunnel tun100 source-address '10.0.10.10'
|
||||
set protocols static route 0.0.0.0/0 next-hop 172.16.0.1
|
||||
set protocols static route 10.0.20.0/24 next-hop 10.0.10.254
|
||||
set service dhcp-relay interface 'eth2'
|
||||
set service dhcp-relay interface 'tun100'
|
||||
set service dhcp-relay server '172.16.0.1'
|
||||
@ -0,0 +1,13 @@
|
||||
set interfaces ethernet eth1 address '10.0.20.10/24'
|
||||
set interfaces tunnel tun100 address '172.16.0.1/30'
|
||||
set interfaces tunnel tun100 encapsulation 'gretap'
|
||||
set interfaces tunnel tun100 remote '10.0.10.10'
|
||||
set interfaces tunnel tun100 source-address '10.0.20.10'
|
||||
set protocols static route 0.0.0.0/0 next-hop 172.16.0.2
|
||||
set protocols static route 10.0.10.0/24 next-hop 10.0.20.254
|
||||
set protocols static route 192.168.0.0/24 next-hop 127.16.0.2
|
||||
set service dhcp-server listen-address '172.16.0.1'
|
||||
set service dhcp-server shared-network-name DHCPTun100 authoritative
|
||||
set service dhcp-server shared-network-name DHCPTun100 subnet 192.168.0.0/24 default-router '192.168.0.254'
|
||||
set service dhcp-server shared-network-name DHCPTun100 subnet 192.168.0.0/24 range 0 start '192.168.0.30'
|
||||
set service dhcp-server shared-network-name DHCPTun100 subnet 192.168.0.0/24 range 0 stop '192.168.0.30'
|
||||
|
After Width: | Height: | Size: 56 KiB |
@ -0,0 +1,2 @@
|
||||
set interfaces ethernet eth1 address '10.0.10.254/24'
|
||||
set interfaces ethernet eth2 address '10.0.20.254/24'
|
||||
6509
docs/configexamples/autotest/Wireguard/Wireguard.log
Normal file
113
docs/configexamples/autotest/Wireguard/Wireguard.rst
Normal file
@ -0,0 +1,113 @@
|
||||
#########
|
||||
Wireguard
|
||||
#########
|
||||
|
||||
|
||||
| Testdate: 2023-12-28
|
||||
| Version: 1.3.5
|
||||
| Upgrade Version: 1.5-rolling-202312261220
|
||||
|
||||
|
||||
This simple structure show how to connect two offices. One remote branch and the
|
||||
central office.
|
||||
|
||||
********
|
||||
Topology
|
||||
********
|
||||
|
||||
The topology have a central and a branch VyOS router and one client, to
|
||||
test, in each site.
|
||||
|
||||
.. image:: _include/topology.png
|
||||
:alt: Ansible Example topology image
|
||||
|
||||
*************
|
||||
Configuration
|
||||
*************
|
||||
|
||||
Set the local subnet on eth2 and the public ip address eth1 on each site.
|
||||
|
||||
Central
|
||||
|
||||
.. literalinclude:: _include/central.conf
|
||||
:language: none
|
||||
:lines: 1-2
|
||||
|
||||
Branch
|
||||
|
||||
.. literalinclude:: _include/branch.conf
|
||||
:language: none
|
||||
:lines: 1-2
|
||||
|
||||
|
||||
Next thing to do, is to create a wireguard keypair on each side.
|
||||
After this, the public key can be displayed, to save for later.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
vyos@central:~$ generate wireguard default-keypair
|
||||
vyos@central:~$ show wireguard keypairs pubkey default
|
||||
3VjawuSrQ6quMS4HDWjJw8UnPXMB+7x2B31YihThXio=
|
||||
|
||||
|
||||
After you have each public key. The wireguard interfaces can be setup.
|
||||
|
||||
|
||||
Central
|
||||
|
||||
.. literalinclude:: _include/central.conf
|
||||
:language: none
|
||||
:lines: 4-11
|
||||
|
||||
Branch
|
||||
|
||||
.. literalinclude:: _include/branch.conf
|
||||
:language: none
|
||||
:lines: 4-11
|
||||
|
||||
|
||||
To reach the network, a route must be set on each VyOS host.
|
||||
In this structure, a static interface route will fit the requirements.
|
||||
|
||||
Central
|
||||
|
||||
.. literalinclude:: _include/central.conf
|
||||
:language: none
|
||||
:lines: 13
|
||||
|
||||
Branch
|
||||
|
||||
.. literalinclude:: _include/branch.conf
|
||||
:language: none
|
||||
:lines: 13
|
||||
|
||||
*********************
|
||||
Testing and debugging
|
||||
*********************
|
||||
|
||||
After all is done and commit, let's take a look if the Wireguard interface is
|
||||
up and running.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
vyos@central:~$ show interfaces wireguard
|
||||
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
|
||||
Interface IP Address S/L Description
|
||||
--------- ---------- --- -----------
|
||||
wg01 192.168.0.1/24 u/u VPN-to-Branch
|
||||
|
||||
|
||||
And ping the Branch PC from your central router to check the response.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
vyos@central:~$ ping 10.0.2.100 count 4
|
||||
PING 10.0.2.100 (10.0.2.100) 56(84) bytes of data.
|
||||
64 bytes from 10.0.2.100: icmp_seq=1 ttl=63 time=0.605 ms
|
||||
64 bytes from 10.0.2.100: icmp_seq=2 ttl=63 time=0.816 ms
|
||||
64 bytes from 10.0.2.100: icmp_seq=3 ttl=63 time=0.840 ms
|
||||
64 bytes from 10.0.2.100: icmp_seq=4 ttl=63 time=0.932 ms
|
||||
|
||||
--- 10.0.2.100 ping statistics ---
|
||||
4 packets transmitted, 4 received, 0% packet loss, time 48ms
|
||||
rtt min/avg/max/mdev = 0.605/0.798/0.932/0.121 ms
|
||||
13
docs/configexamples/autotest/Wireguard/_include/branch.conf
Normal file
@ -0,0 +1,13 @@
|
||||
set interface ethernet eth2 address 10.0.2.254/24
|
||||
set interface ethernet eth1 address 198.51.100.2/24
|
||||
|
||||
set interfaces wireguard wg01 address 192.168.0.2/24
|
||||
set interfaces wireguard wg01 description 'VPN-to-central'
|
||||
set interfaces wireguard wg01 peer central allowed-ips 10.0.1.0/24
|
||||
set interfaces wireguard wg01 peer central allowed-ips 192.168.0.0/24
|
||||
set interfaces wireguard wg01 peer central address 198.51.100.1
|
||||
set interfaces wireguard wg01 peer central port 51820
|
||||
set interfaces wireguard wg01 peer central pubkey "3VjawuSrQ6quMS4HDWjJw8UnPXMB+7x2B31YihThXio="
|
||||
set interfaces wireguard wg01 port 51820
|
||||
|
||||
set protocols static interface-route 10.0.1.0/24 next-hop-interface wg01
|
||||
13
docs/configexamples/autotest/Wireguard/_include/central.conf
Normal file
@ -0,0 +1,13 @@
|
||||
set interface ethernet eth2 address 10.0.1.254/24
|
||||
set interface ethernet eth1 address 198.51.100.1/24
|
||||
|
||||
set interfaces wireguard wg01 address 192.168.0.1/24
|
||||
set interfaces wireguard wg01 description 'VPN-to-Branch'
|
||||
set interfaces wireguard wg01 peer branch allowed-ips 10.0.2.0/24
|
||||
set interfaces wireguard wg01 peer branch allowed-ips 192.168.0.0/24
|
||||
set interfaces wireguard wg01 peer branch address 198.51.100.2
|
||||
set interfaces wireguard wg01 peer branch port 51820
|
||||
set interfaces wireguard wg01 peer branch pubkey "mV384TUZYv3V3vWaqGcAXZE++1WHGjpAA1+nkFtH9xE="
|
||||
set interfaces wireguard wg01 port 51820
|
||||
|
||||
set protocols static interface-route 10.0.2.0/24 next-hop-interface wg01
|
||||