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}} |  | ||||||
|      |  | ||||||
|      |  | ||||||
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,10 +1,13 @@ | |||||||
| # Sphinx | # Sphinx | ||||||
| _build/ | _build/ | ||||||
|  | localazy_private.json | ||||||
| 
 | 
 | ||||||
| # python virtualenv | # python virtualenv | ||||||
| venv/ | venv/ | ||||||
| ENV/ | ENV/ | ||||||
| .venv | .venv | ||||||
|  | Pipfile.lock | ||||||
|  | Pipfile | ||||||
| 
 | 
 | ||||||
| # put various editor ignores here | # put various editor ignores here | ||||||
| .vscode/ | .vscode/ | ||||||
| @ -12,6 +15,9 @@ ENV/ | |||||||
| *.vpw | *.vpw | ||||||
| *.vpwhist | *.vpwhist | ||||||
| *.vtg | *.vtg | ||||||
|  | .idea/ | ||||||
|  | .idea | ||||||
|  | .idea/* | ||||||
| 
 | 
 | ||||||
| # python cache files | # python cache files | ||||||
| *.pyc | *.pyc | ||||||
|  | |||||||
| @ -4,6 +4,10 @@ | |||||||
| 
 | 
 | ||||||
| # Required | # Required | ||||||
| version: 2 | version: 2 | ||||||
|  | build: | ||||||
|  |   os: ubuntu-22.04 | ||||||
|  |   tools: | ||||||
|  |     python: "3.10" | ||||||
| 
 | 
 | ||||||
| # Build documentation in the docs/ directory with Sphinx | # Build documentation in the docs/ directory with Sphinx | ||||||
| sphinx: | sphinx: | ||||||
| @ -19,7 +23,6 @@ formats: | |||||||
| 
 | 
 | ||||||
| # Optionally set the version of Python and requirements required to build your docs | # Optionally set the version of Python and requirements required to build your docs | ||||||
| python: | python: | ||||||
|   version: 3.7 |  | ||||||
|   install: |   install: | ||||||
|     - requirements: requirements.txt |     - requirements: requirements.txt | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										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 = "*" | lxml = "*" | ||||||
| sphinx-notfound-page = "*" | sphinx-notfound-page = "*" | ||||||
| Sphinx = ">=1.4.3" | Sphinx = ">=1.4.3" | ||||||
|  | sphinx-panels = "*" | ||||||
|  | transifex-client = "*" | ||||||
| 
 | 
 | ||||||
| [dev-packages] | [dev-packages] | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										38
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @ -1,25 +1,32 @@ | |||||||
| Starting with VyOS 1.2 (`crux`) documentation is being migrated from the old wiki | 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: | 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 | # 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 | All new documentation enhancements go to the `master` branch. If those changes | ||||||
| * `make latexpdf` for a LaTeX rendered PDF | are beneficial for previous VyOS documentation versions they will be | ||||||
|  | cherry-picked to the appropriate branch(es). | ||||||
| 
 | 
 | ||||||
| Required Debian Packages: | Post-1.2.0 branches are named after constellations sorted by area from smallest to | ||||||
| * `latexmk` | largest. There are 88 of them, here's the | ||||||
| * `texlive-latex-recommended` | [complete list](https://en.wikipedia.org/wiki/IAU_designated_constellations_by_area). | ||||||
| * `texlive-fonts-recommended` | 
 | ||||||
| * `texlive-latex-extra` | * 1.2.x: `crux` (Southern Cross) | ||||||
| * `sphinx` | * 1.3.x: `equuleus` (Little Horse) | ||||||
|  | * 1.4.x: `sagitta` (Arrow) | ||||||
|  | * ... | ||||||
| 
 | 
 | ||||||
| ### sphinx | ### sphinx | ||||||
| Debian requires some extra steps for | Debian requires some extra steps for | ||||||
| @ -55,7 +62,6 @@ Then run: | |||||||
| sudo pip install sphinx-rtd-theme | sudo pip install sphinx-rtd-theme | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| Do the following to build the HTML and start a webserver: | Do the following to build the HTML and start a webserver: | ||||||
| * Run `make livehtml` inside the `docs` folder | * 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 | ### 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: | To test all files run: | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| # Must be run with --privileged flag | # Must be run with --privileged flag | ||||||
| # Recommended to run the container with a volume mapped | # Recommended to run the container with a volume mapped | ||||||
| # in order to easy exprort images built to "external" world | # in order to easy exprort images built to "external" world | ||||||
| FROM debian:buster | FROM debian:11 | ||||||
| LABEL authors="VyOS Maintainers <maintainers@vyos.io>" | LABEL authors="VyOS Maintainers <maintainers@vyos.io>" | ||||||
| 
 | 
 | ||||||
| ENV DEBIAN_FRONTEND noninteractive | ENV DEBIAN_FRONTEND noninteractive | ||||||
| @ -34,6 +34,8 @@ RUN pip3 install sphinx-rtd-theme | |||||||
| RUN pip3 install sphinx-autobuild | RUN pip3 install sphinx-autobuild | ||||||
| RUN pip3 install sphinx-notfound-page | RUN pip3 install sphinx-notfound-page | ||||||
| RUN pip3 install lxml | RUN pip3 install lxml | ||||||
|  | RUN pip3 install myst-parser | ||||||
|  | RUN pip3 install sphinx_design | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Cleanup | # Cleanup | ||||||
| @ -45,8 +47,6 @@ EXPOSE 8000 | |||||||
| RUN sed "s/^%sudo.*/%sudo\tALL=(ALL) NOPASSWD:ALL/g" -i /etc/sudoers && \ | 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 |     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 | 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: | Try using the search box or go to the release homepage: | ||||||
| 
 | 
 | ||||||
|   * `1.2.x (crux) <https://docs.vyos.io/en/crux/>`_ |   * `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) \
 | 	sphinx-autobuild --host $(AUTOHOST) --port $(AUTOPORT) $(AUTOOPTS) \
 | ||||||
| 		"$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) | 		"$(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 | generate json with all commands from xml for vyos documentation coverage | ||||||
| 
 |  | ||||||
| ''' | ''' | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| import sys | import sys | ||||||
| import os | import os | ||||||
| import json | import json | ||||||
| import re | import re | ||||||
| import logging | import logging | ||||||
|  | import datetime | ||||||
| 
 | 
 | ||||||
| from io import BytesIO | from io import BytesIO | ||||||
| from lxml import etree as ET | from lxml import etree as ET | ||||||
| @ -33,11 +32,32 @@ input_data = [ | |||||||
|     } |     } | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  | vyos_commands_dir = "_include/coverage" | ||||||
|  | 
 | ||||||
| node_data = { | node_data = { | ||||||
|     'cfgcmd': {}, |     'cfgcmd': {}, | ||||||
|     'opcmd': {}, |     '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): | def get_properties(p): | ||||||
|     props = {} |     props = {} | ||||||
|     props['valueless'] = False |     props['valueless'] = False | ||||||
| @ -155,12 +175,18 @@ def get_properties(p): | |||||||
| 
 | 
 | ||||||
| def process_node(n, f): | def process_node(n, f): | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     props_elem = n.find("properties") |     props_elem = n.find("properties") | ||||||
|     children = n.find("children") |     children = n.find("children") | ||||||
|     command = n.find("command") |     command = n.find("command") | ||||||
|     children_nodes = [] |     children_nodes = [] | ||||||
|     owner = n.get("owner") |     owner = n.get("owner") | ||||||
|     node_type = n.tag |     node_type = n.tag | ||||||
|  |     defaultvalue = n.find("defaultValue") | ||||||
|  | 
 | ||||||
|  |     if defaultvalue is not None: | ||||||
|  |         defaultvalue = defaultvalue.text | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|     name = n.get("name") |     name = n.get("name") | ||||||
|     props = get_properties(props_elem) |     props = get_properties(props_elem) | ||||||
| @ -198,7 +224,9 @@ def process_node(n, f): | |||||||
|         'children': children_nodes, |         'children': children_nodes, | ||||||
|         'props': props, |         'props': props, | ||||||
|         'command': test_command, |         'command': test_command, | ||||||
|         'filename': f |         'filename': f, | ||||||
|  |         'defaultvalue': defaultvalue | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
|     return node |     return node | ||||||
| 
 | 
 | ||||||
| @ -212,9 +240,11 @@ def create_commands(data, parent_list=[], level=0): | |||||||
|         'tag_help': [], |         'tag_help': [], | ||||||
|         'level': level, |         'level': level, | ||||||
|         'no_childs': False, |         'no_childs': False, | ||||||
|         'filename': None |         'filename': None, | ||||||
|  |         'defaultvalue': None, | ||||||
|     } |     } | ||||||
|     command['filename'] = data['filename'] |     command['filename'] = data['filename'] | ||||||
|  |     command['defaultvalue'] = data['defaultvalue'] | ||||||
|     command['name'].extend(parent_list) |     command['name'].extend(parent_list) | ||||||
|     command['name'].append(data['name']) |     command['name'].append(data['name']) | ||||||
| 
 | 
 | ||||||
| @ -298,7 +328,7 @@ def get_working_commands(): | |||||||
|                 if not validator.validate(xml): |                 if not validator.validate(xml): | ||||||
|                     print(validator.error_log) |                     print(validator.error_log) | ||||||
|                     print("Interface definition file {0} does not match the schema!".format(f)) |                     print("Interface definition file {0} does not match the schema!".format(f)) | ||||||
|                     sys.exit(1) |                     #sys.exit(1) | ||||||
|             except Exception as e: |             except Exception as e: | ||||||
|                 print("Failed to load the XML schema {0}".format(entry['schema_file'])) |                 print("Failed to load the XML schema {0}".format(entry['schema_file'])) | ||||||
|                 print(e) |                 print(e) | ||||||
| @ -328,6 +358,7 @@ def get_working_commands(): | |||||||
|                     'children': [], |                     'children': [], | ||||||
|                     'command': node_data[kind][entry]['command'], |                     'command': node_data[kind][entry]['command'], | ||||||
|                     'filename': node_data[kind][entry]['filename'], |                     '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']) |             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 kind in  config_tree_new: | ||||||
|         for e in config_tree_new[kind]: |         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']: |     for cmd in result['cfgcmd']: | ||||||
|         cmd['cmd'] = " ".join(cmd['name']) |         cmd['cmd'] = " ".join(cmd['name']) | ||||||
| @ -377,6 +409,4 @@ def override_element(l: list): | |||||||
|         el.getparent().remove(el) |         el.getparent().remove(el) | ||||||
| 
 | 
 | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     res = get_working_commands() |     get_vyos_commands() | ||||||
|     print(json.dumps(res)) |  | ||||||
|     #print(res['cfgcmd'][0]) |  | ||||||
|  | |||||||
| @ -1,20 +1,25 @@ | |||||||
| import re | import re | ||||||
| import json | import json | ||||||
| import os | import os | ||||||
|  | from datetime import datetime | ||||||
|  | from unittest import defaultTestLoader | ||||||
| from docutils import io, nodes, utils, statemachine | from docutils import io, nodes, utils, statemachine | ||||||
| from docutils.parsers.rst.roles import set_classes | from docutils.parsers.rst.roles import set_classes | ||||||
| from docutils.parsers.rst import Directive, directives, states | from docutils.parsers.rst import Directive, directives, states | ||||||
| 
 | 
 | ||||||
| from sphinx.util.docutils import SphinxDirective | 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): | def setup(app): | ||||||
| 
 | 
 | ||||||
|     app.add_config_value( |     app.add_config_value( | ||||||
|         'vyos_phabricator_url', |         'vyos_phabricator_url', | ||||||
|         'https://phabricator.vyos.net/', |         'https://vyos.dev/', | ||||||
|         'html' |         'html' | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| @ -24,6 +29,11 @@ def setup(app): | |||||||
|         #{"cfgcmd": [], "opcmd": []}, |         #{"cfgcmd": [], "opcmd": []}, | ||||||
|         'html' |         'html' | ||||||
|     ) |     ) | ||||||
|  |     app.add_config_value( | ||||||
|  |         'vyos_commands', | ||||||
|  |         get_vyos_commands(), | ||||||
|  |         'html' | ||||||
|  |     ) | ||||||
|     app.add_config_value( |     app.add_config_value( | ||||||
|         'vyos_coverage', |         'vyos_coverage', | ||||||
|         { |         { | ||||||
| @ -74,6 +84,7 @@ def setup(app): | |||||||
|     app.add_directive('opcmd', OpCmdDirective) |     app.add_directive('opcmd', OpCmdDirective) | ||||||
|     app.add_directive('cmdinclude', CfgInclude) |     app.add_directive('cmdinclude', CfgInclude) | ||||||
|     app.connect('doctree-resolved', process_cmd_nodes) |     app.connect('doctree-resolved', process_cmd_nodes) | ||||||
|  |     app.connect('doctree-read', handle_document_meta_data) | ||||||
| 
 | 
 | ||||||
| class CfgcmdList(nodes.General, nodes.Element): | class CfgcmdList(nodes.General, nodes.Element): | ||||||
|     pass |     pass | ||||||
| @ -346,6 +357,21 @@ class OpcmdlistDirective(Directive): | |||||||
|         return [oplist] |         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): | class CmdDirective(SphinxDirective): | ||||||
| 
 | 
 | ||||||
| @ -358,19 +384,31 @@ class CmdDirective(SphinxDirective): | |||||||
|         content_list = [] |         content_list = [] | ||||||
|         title_text = '' |         title_text = '' | ||||||
|         content_text = '' |         content_text = '' | ||||||
|  |         defaultvalue = None | ||||||
|         has_body = False |         has_body = False | ||||||
| 
 | 
 | ||||||
|         cfgmode = self.custom_class + "cmd" |         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: |                 title_text = ' '.join(title_list) | ||||||
|             index = self.content.index('') |                 content_text = content_text + '\n'.join(content_list) | ||||||
|             title_list = self.content[0:index] |                 has_body = True | ||||||
|             content_list = self.content[index + 1:] |             else: | ||||||
|             title_text = ' '.join(title_list) |                 title_list = self.content | ||||||
|             content_text = '\n'.join(content_list) |                 title_text = ' '.join(title_list) | ||||||
|             has_body = True |         except Exception as e: | ||||||
|         else: |             print("error", e) | ||||||
|             title_text = ' '.join(self.content) | 
 | ||||||
|  |         # 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) |         anchor_id = nodes.make_id(self.custom_class + "cmd-" + title_text) | ||||||
|         target = nodes.target(ids=[anchor_id]) |         target = nodes.target(ids=[anchor_id]) | ||||||
| @ -392,6 +430,11 @@ class CmdDirective(SphinxDirective): | |||||||
|         heading_element['classes'] += [self.custom_class + 'cmd-heading'] |         heading_element['classes'] += [self.custom_class + 'cmd-heading'] | ||||||
| 
 | 
 | ||||||
|         panel_element.append(heading_element) |         panel_element.append(heading_element) | ||||||
|  |         if defaultvalue: | ||||||
|  |             defaultvalue_element = nodes.paragraph(text=defaultvalue) | ||||||
|  |             defaultvalue_element['classes'] = ["defaultvalue"] | ||||||
|  |             panel_element.append(defaultvalue_element) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         append_list = { |         append_list = { | ||||||
|             'docname': self.env.docname, |             'docname': self.env.docname, | ||||||
| @ -432,26 +475,53 @@ class CfgCmdDirective(CmdDirective): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def strip_cmd(cmd, debug=False): | 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: |     if debug: | ||||||
|         print("") |         print("") | ||||||
|         print(cmd) |         print(cmd) | ||||||
|     cmd = re.sub('set','',cmd) |     cmd = re.sub('^set','',cmd) | ||||||
|     if debug: |     if debug: | ||||||
|         print(cmd) |         print(cmd) | ||||||
|     #while " | " in cmd: |     cmd = cmd.replace('|','') | ||||||
|     cmd = re.sub('\s+\|\s+','',cmd) |  | ||||||
|     if debug: |  | ||||||
|         print(cmd) |  | ||||||
|     cmd = re.sub('<\S*>','',cmd) |  | ||||||
|     if debug: |  | ||||||
|         print(cmd) |  | ||||||
|     cmd = re.sub('\[\S\]','',cmd) |  | ||||||
|     if debug: |     if debug: | ||||||
|         print(cmd) |         print(cmd) | ||||||
|     cmd = re.sub('\s+','',cmd) |     cmd = re.sub('\s+','',cmd) | ||||||
|  |     cmd = cmd.replace(':defaultvalue:','') | ||||||
|     if debug: |     if debug: | ||||||
|         print(cmd) |         print(cmd) | ||||||
|         print("") |         print("") | ||||||
|  |      | ||||||
|     return cmd |     return cmd | ||||||
| 
 | 
 | ||||||
| def build_row(app, fromdocname, rowdata):    | def build_row(app, fromdocname, rowdata):    | ||||||
| @ -467,10 +537,10 @@ def build_row(app, fromdocname, rowdata): | |||||||
|                     entry += nodes.paragraph(text=item) |                     entry += nodes.paragraph(text=item) | ||||||
|         elif isinstance(cell, bool): |         elif isinstance(cell, bool): | ||||||
|             if cell: |             if cell: | ||||||
|                 entry += nodes.paragraph(text="") |                 entry += nodes.paragraph(text="✔") | ||||||
|                 entry['classes'] = ['coverage-ok'] |                 entry['classes'] = ['coverage-ok'] | ||||||
|             else: |             else: | ||||||
|                 entry += nodes.paragraph(text="") |                 entry += nodes.paragraph(text="✕") | ||||||
|                 entry['classes'] = ['coverage-fail'] |                 entry['classes'] = ['coverage-fail'] | ||||||
|         else: |         else: | ||||||
|             entry += nodes.paragraph(text=cell) |             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 = {} |     coverage_list = {} | ||||||
|     int_docs = 0 |     strip_true_list = [] | ||||||
|     int_xml = 0 |  | ||||||
|     for cmd in doccmd: |     for cmd in doccmd: | ||||||
|         coverage_item = { |         coverage_item = { | ||||||
|             'doccmd': None, |             'doccmd': None, | ||||||
|             'xmlcmd': None, |             'xmlcmd': None, | ||||||
|  |             'vyoscmd': None, | ||||||
|             'doccmd_item': None, |             'doccmd_item': None, | ||||||
|             'xmlcmd_item': None, |             'xmlcmd_item': None, | ||||||
|  |             'vyoscmd_item': None, | ||||||
|             'indocs': False, |             'indocs': False, | ||||||
|             'inxml': False, |             'inxml': False, | ||||||
|  |             'invyos': False, | ||||||
|             'xmlfilename': None |             'xmlfilename': None | ||||||
|         } |         } | ||||||
|         coverage_item['doccmd'] = cmd['cmd'] |         coverage_item['doccmd'] = cmd['cmd'] | ||||||
|         coverage_item['doccmd_item'] = cmd |         coverage_item['doccmd_item'] = cmd | ||||||
|         coverage_item['indocs'] = True |         coverage_item['indocs'] = True | ||||||
|         int_docs += 1 |  | ||||||
| 
 | 
 | ||||||
|         coverage_list[strip_cmd(cmd['cmd'])] = dict(coverage_item) |         coverage_list[strip_cmd(cmd['cmd'])] = dict(coverage_item) | ||||||
| 
 | 
 | ||||||
|      |  | ||||||
|     #print(coverage_list.keys()) |  | ||||||
|      |  | ||||||
|     for cmd in xmlcmd: |     for cmd in xmlcmd: | ||||||
|          |          | ||||||
|         strip = strip_cmd(cmd['cmd']) |         strip = strip_cmd(cmd['cmd']) | ||||||
| @ -509,34 +577,64 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): | |||||||
|             coverage_item = { |             coverage_item = { | ||||||
|                 'doccmd': None, |                 'doccmd': None, | ||||||
|                 'xmlcmd': None, |                 'xmlcmd': None, | ||||||
|  |                 'vyoscmd': None, | ||||||
|                 'doccmd_item': None, |                 'doccmd_item': None, | ||||||
|                 'xmlcmd_item': None, |                 'xmlcmd_item': None, | ||||||
|  |                 'vyoscmd_item': None, | ||||||
|                 'indocs': False, |                 'indocs': False, | ||||||
|                 'inxml': False, |                 'inxml': False, | ||||||
|  |                 'invyos': False, | ||||||
|                 'xmlfilename': None |                 'xmlfilename': None | ||||||
|             } |             } | ||||||
|             coverage_item['xmlcmd'] = cmd['cmd'] |             coverage_item['xmlcmd'] = cmd['cmd'] | ||||||
|             coverage_item['xmlcmd_item'] = cmd |             coverage_item['xmlcmd_item'] = cmd | ||||||
|             coverage_item['inxml'] = True |             coverage_item['inxml'] = True | ||||||
|             coverage_item['xmlfilename'] = cmd['filename'] |             coverage_item['xmlfilename'] = cmd['filename'] | ||||||
|             int_xml += 1 |  | ||||||
|             coverage_list[strip] = dict(coverage_item) |             coverage_list[strip] = dict(coverage_item) | ||||||
|         else: |         else: | ||||||
|             coverage_list[strip]['xmlcmd'] = cmd['cmd'] |             coverage_list[strip]['xmlcmd'] = cmd['cmd'] | ||||||
|             coverage_list[strip]['xmlcmd_item'] = cmd |             coverage_list[strip]['xmlcmd_item'] = cmd | ||||||
|             coverage_list[strip]['inxml'] = True |             coverage_list[strip]['inxml'] = True | ||||||
|             coverage_list[strip]['xmlfilename'] = cmd['filename'] |             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() |     table = nodes.table() | ||||||
|     tgroup = nodes.tgroup(cols=3) |     tgroup = nodes.tgroup(cols=4) | ||||||
|     table += tgroup |     table += tgroup | ||||||
| 
 | 
 | ||||||
|     header = (f'{int_docs}/{len(coverage_list)} in Docs', f'{int_xml}/{len(coverage_list)} in XML', 'Command') |     header = (f'Status {len(strip_true_list)}/{len(coverage_list)}', 'Documentation', 'XML', f'in VyOS {vyoscmd["os"]}') | ||||||
|     colwidths = (1, 1, 8) |     colwidths = (5, 33 , 33, 33) | ||||||
|     table = nodes.table() |     table = nodes.table() | ||||||
|     tgroup = nodes.tgroup(cols=len(header)) |     tgroup = nodes.tgroup(cols=len(header)) | ||||||
|     table += tgroup |     table += tgroup | ||||||
| @ -548,28 +646,42 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): | |||||||
|     tbody = nodes.tbody() |     tbody = nodes.tbody() | ||||||
|     tgroup += tbody |     tgroup += tbody | ||||||
|     for entry in sorted(coverage_list): |     for entry in sorted(coverage_list): | ||||||
|         body_text_list = [] |         doc_cmd_text = [] | ||||||
|  |         doc_xml_text = [] | ||||||
|  |         doc_vyos_text = [] | ||||||
|         if coverage_list[entry]['indocs']: |         if coverage_list[entry]['indocs']: | ||||||
|             body_text_list.append(coverage_list[entry]['doccmd_item']) |             doc_cmd_text.append(coverage_list[entry]['doccmd_item']) | ||||||
|         else: |         else: | ||||||
|             body_text_list.append('Not documented yet') |             doc_cmd_text.append('not yet documented') | ||||||
| 
 | 
 | ||||||
|         if coverage_list[entry]['inxml']: |         if coverage_list[entry]['inxml']: | ||||||
|             body_text_list.append("------------------") |             doc_xml_text.append(str(coverage_list[entry]['xmlfilename']) + ":") | ||||||
|             body_text_list.append(str(coverage_list[entry]['xmlfilename']) + ":") |             doc_xml_text.append(coverage_list[entry]['xmlcmd']) | ||||||
|             body_text_list.append(coverage_list[entry]['xmlcmd']) |  | ||||||
|         else: |         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,  |         tbody += build_row(app, fromdocname,  | ||||||
|             ( |             ( | ||||||
|                 coverage_list[entry]['indocs'], |                 status, | ||||||
|                 coverage_list[entry]['inxml'], |                 doc_cmd_text, | ||||||
|                 body_text_list |                 doc_xml_text, | ||||||
|  |                 doc_vyos_text | ||||||
|  | 
 | ||||||
|             ) |             ) | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|  |     table['ids'] = [f'table-{cli_type}'] | ||||||
|     return table |     return table | ||||||
| 
 | 
 | ||||||
| def process_cmd_node(app, cmd, fromdocname, cli_type): | def process_cmd_node(app, cmd, fromdocname, cli_type): | ||||||
| @ -599,6 +711,7 @@ def process_cmd_nodes(app, doctree, fromdocname): | |||||||
|                         fromdocname, |                         fromdocname, | ||||||
|                         env.vyos_cfgcmd, |                         env.vyos_cfgcmd, | ||||||
|                         app.config.vyos_working_commands['cfgcmd'], |                         app.config.vyos_working_commands['cfgcmd'], | ||||||
|  |                         app.config.vyos_commands, | ||||||
|                         'cfgcmd' |                         'cfgcmd' | ||||||
|                         ) |                         ) | ||||||
|                     ) |                     ) | ||||||
| @ -616,6 +729,7 @@ def process_cmd_nodes(app, doctree, fromdocname): | |||||||
|                         fromdocname, |                         fromdocname, | ||||||
|                         env.vyos_opcmd, |                         env.vyos_opcmd, | ||||||
|                         app.config.vyos_working_commands['opcmd'], |                         app.config.vyos_working_commands['opcmd'], | ||||||
|  |                         app.config.vyos_commands, | ||||||
|                         'opcmd' |                         'opcmd' | ||||||
|                         ) |                         ) | ||||||
|                     ) |                     ) | ||||||
| @ -641,3 +755,20 @@ def vytask_role(name, rawtext, text, lineno, inliner, options={}, content=[]): | |||||||
| def cmd_role(name, rawtext, text, lineno, inliner, options={}, content=[]): | def cmd_role(name, rawtext, text, lineno, inliner, options={}, content=[]): | ||||||
|     node = nodes.literal(text, text) |     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/ | .. _`accel-ppp`: https://accel-ppp.org/ | ||||||
| .. _`Secure Socket Tunneling Protocol`: https://en.wikipedia.org/wiki/Secure_Socket_Tunneling_Protocol | .. _`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.1ad: https://en.wikipedia.org/wiki/IEEE_802.1ad | ||||||
| .. _802.1q: https://en.wikipedia.org/wiki/IEEE_802.1Q | .. _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 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 }} address 2001:db8::1/64 | ||||||
|     set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} dhcp |     set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} address dhcp | ||||||
|     set interfaces {{ var0 }} {{ var1 }} {{ var2 }} {{ var4 }} {{ var5 }} {{ var7 }} dhcpv6 |     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 | 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 | the specified interface, usually the interface can be connected to some special | ||||||
| equipment, such as behavior control system, intrusion detection system and | 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 | VyOS uses the `mirror` option to configure port mirroring. The configuration | ||||||
| is divided into 2 different directions. Destination ports should be configured | 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.opcmd, | ||||||
| span.cfgcmd { | span.cfgcmd { | ||||||
|     font-weight: bold; |     font-weight: bold; | ||||||
| @ -15,13 +20,13 @@ span.cfgcmd:before { | |||||||
|   margin-right: 0px; |   margin-right: 0px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| td p a.cmdlink span.cfgcmd:before, | td a.cmdlink span.cfgcmd:before, | ||||||
| td p a.cmdlink span.opcmd:before  { | td a.cmdlink span.opcmd:before  { | ||||||
|   content: ""; |   content: ""; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| td p a.cmdlink, | td a.cmdlink, | ||||||
| td p a.cmdlink { | td a.cmdlink { | ||||||
|   margin-left: 0px; |   margin-left: 0px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -82,6 +87,12 @@ span.opcmd:before { | |||||||
|     display: none; |     display: none; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .defaultvalue{ | ||||||
|  |   font-size: 90%; | ||||||
|  |   color: gray; | ||||||
|  |   margin-bottom: 5px; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| a.cmdlink { | a.cmdlink { | ||||||
|     font-size: 80%; |     font-size: 80%; | ||||||
| @ -156,7 +167,7 @@ a.cmdlink span:hover{ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .wy-nav-top { | .wy-nav-top { | ||||||
|   background-color : #ffffff !important; |   background-color : #ffffff; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .wy-nav-top img { | .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:not(.field-list) tr:nth-child(2n-1) td.coverage-ok, | ||||||
| .rst-content table.docutils td.coverage-ok { | .rst-content table.docutils td.coverage-ok { | ||||||
|   background-color: green; |   color: green; | ||||||
|   color: black; |   text-align: center; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td.coverage-fail, | .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td.coverage-fail, | ||||||
| .rst-content table.docutils td.coverage-fail { | .rst-content table.docutils td.coverage-fail { | ||||||
|   background-color: red; |   color: red; | ||||||
|   color: black; |   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(); | ||||||
|  | } ); | ||||||
							
								
								
									
										4
									
								
								docs/_templates/layout.html
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,4 +1,8 @@ | |||||||
| {% extends "!layout.html" %} | {% extends "!layout.html" %} | ||||||
|  | {%- set current_version = "1.3.x equuleus" %} | ||||||
| {% block extrahead %} | {% block extrahead %} | ||||||
|     <link href="{{ pathto("_static/css/custom.css", True) }}" rel="stylesheet" type="text/css"> |     <link href="{{ pathto("_static/css/custom.css", True) }}" rel="stylesheet" type="text/css"> | ||||||
|  |     <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 %} | {% 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: | ||||||
| 
 | 
 | ||||||
| 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 | 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. | prepended with ``run``, even if you haven't created a session with configure. | ||||||
| 
 | 
 | ||||||
| .. code-block:: none | .. code-block:: none | ||||||
| @ -43,9 +45,36 @@ prepended with ``run``, even if you haven't created a session with configure. | |||||||
|   run show interfaces |   run show interfaces | ||||||
|   exit |   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 | 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. | 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) $@" |       exec sg vyattacfg -c "/bin/vbash $(readlink -f $0) $@" | ||||||
|   fi |   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 | Postconfig on boot | ||||||
| ------------------ | ------------------ | ||||||
| 
 | 
 | ||||||
| The ``/config/scripts/vyos-postconfig-bootup.script`` script is called on boot | The ``/config/scripts/vyos-postconfig-bootup.script`` script is called on boot | ||||||
| after the VyOS configuration is fully applied. | after the VyOS configuration is fully applied. | ||||||
| 
 | 
 | ||||||
| Any modifications done to work around unfixed bugs and implement enhancements | Any modifications were done to work around unfixed bugs and implement | ||||||
| which are not complete in the VyOS system can be placed here. | enhancements that are not complete in the VyOS system can be placed here. | ||||||
| 
 | 
 | ||||||
| The default file looks like this: | The default file looks like this: | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,13 +3,16 @@ VyOS Automation | |||||||
| ############### | ############### | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   * Ansible |  | ||||||
|   * Saltstack |   * Saltstack | ||||||
|   * HTTP-API |  | ||||||
|   * startup scripts |   * startup scripts | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| .. toctree:: | .. toctree:: | ||||||
|    :maxdepth: 1 |    :maxdepth: 1 | ||||||
|     |     | ||||||
|  |    vyos-api | ||||||
|  |    vyos-ansible | ||||||
|  |    vyos-napalm | ||||||
|  |    vyos-netmiko | ||||||
|    command-scripting |    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 |    :maxdepth: 1 | ||||||
|    :includehidden: |    :includehidden: | ||||||
| 
 | 
 | ||||||
|  |    1.3 | ||||||
|    1.2.6 |    1.2.6 | ||||||
|    1.2.5 |    1.2.5 | ||||||
|    1.2.4 |    1.2.4 | ||||||
|  | |||||||
							
								
								
									
										110
									
								
								docs/cli.rst
									
									
									
									
									
								
							
							
						
						| @ -110,7 +110,6 @@ files. | |||||||
| Terminology | Terminology | ||||||
| ########### | ########### | ||||||
| 
 | 
 | ||||||
| live |  | ||||||
| A VyOS system has three major types of configurations: | A VyOS system has three major types of configurations: | ||||||
| 
 | 
 | ||||||
| * **Active** or **running configuration** is the system configuration | * **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 | .. _`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 | The config mode | ||||||
| --------------- | --------------- | ||||||
| @ -404,7 +508,7 @@ different levels in the hierarchy. | |||||||
|    Use this command to preserve configuration changes upon reboot. By |    Use this command to preserve configuration changes upon reboot. By | ||||||
|    default it is stored at */config/config.boot*. In the case you want |    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 |    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 |    .. 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 |    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 |    you out of your system. You can use confirmed commit. If you issue | ||||||
|    the ``commit-confirm`` command, your changes will be commited, and if |    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. |    system will reboot into previous config revision. | ||||||
| 
 | 
 | ||||||
|    .. code-block:: none |    .. code-block:: none | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								docs/conf.py
									
									
									
									
									
								
							
							
						
						| @ -22,7 +22,7 @@ from docutils.parsers.rst.roles import set_classes | |||||||
| # -- Project information ----------------------------------------------------- | # -- Project information ----------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| project = u'VyOS' | project = u'VyOS' | ||||||
| copyright = u'2021, VyOS maintainers and contributors' | copyright = u'2023, VyOS maintainers and contributors' | ||||||
| author = u'VyOS maintainers and contributors' | author = u'VyOS maintainers and contributors' | ||||||
| 
 | 
 | ||||||
| # The short X.Y version | # The short X.Y version | ||||||
| @ -45,6 +45,8 @@ extensions = ['sphinx.ext.intersphinx', | |||||||
|               'sphinx.ext.ifconfig', |               'sphinx.ext.ifconfig', | ||||||
|               'sphinx.ext.graphviz', |               'sphinx.ext.graphviz', | ||||||
|               'notfound.extension', |               'notfound.extension', | ||||||
|  |               'myst_parser', | ||||||
|  |               'sphinx_design', | ||||||
|               'vyos' |               'vyos' | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| @ -67,6 +69,12 @@ master_doc = 'index' | |||||||
| # Usually you set "language" from the command line for these cases. | # Usually you set "language" from the command line for these cases. | ||||||
| language = None | 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 | # List of patterns, relative to source directory, that match files and | ||||||
| # directories to ignore when looking for source files. | # directories to ignore when looking for source files. | ||||||
| # This pattern also affects html_static_path and html_extra_path . | # 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 | ||||||