Compare commits
1401 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
593874b45f | ||
|
|
b207f28402 | ||
|
|
7bdde47473 | ||
|
|
a2eb0d80d2 | ||
|
|
6f94198934 | ||
|
|
707e51d855 | ||
|
|
528df76747 | ||
|
|
662c896480 | ||
|
|
29eb2383d6 | ||
|
|
9772c5705f | ||
|
|
d2fe59ae8f | ||
|
|
f63dcb1f08 | ||
|
|
6f66b27507 | ||
|
|
909d127c27 | ||
|
|
20ef18f98f | ||
|
|
a33e47780b | ||
|
|
691c66d2f5 | ||
|
|
14d87a3584 | ||
|
|
d743dc160a | ||
|
|
2b263b054c | ||
|
|
b95e8350d2 | ||
|
|
5235866d05 | ||
|
|
093a86bc38 | ||
|
|
5b87232f59 | ||
|
|
679bbd3e76 | ||
|
|
515b6bf71a | ||
|
|
9c389d9dcb | ||
|
|
f1e4273a23 | ||
|
|
4618cc2b22 | ||
|
|
1909f0c733 | ||
|
|
840ea36f70 | ||
|
|
a8cdb3895b | ||
|
|
349733c6dd | ||
|
|
1c09ffdd1f | ||
|
|
c4c6fa6042 | ||
|
|
86da6c6c14 | ||
|
|
7b7b01a26b | ||
|
|
415313ac2f | ||
|
|
7db2b9d091 | ||
|
|
8036d1e5a5 | ||
|
|
65c9339687 | ||
|
|
3090981335 | ||
|
|
4f36885c5e | ||
|
|
db2993035d | ||
|
|
bf05bc2986 | ||
|
|
88b230f0e4 | ||
|
|
deb53d771d | ||
|
|
fd16c47d2e | ||
|
|
b78451742f | ||
|
|
6f23ab5603 | ||
|
|
5e67627e6b | ||
|
|
19e77ed456 | ||
|
|
ed0f792f04 | ||
|
|
deda1691e9 | ||
|
|
94d2ad120c | ||
|
|
ab1a5f32ef | ||
|
|
2a1de5e28c | ||
|
|
f78fdd6900 | ||
|
|
6b43eafcb4 | ||
|
|
844cd154b9 | ||
|
|
e05fa5c302 | ||
|
|
f5f74944dd | ||
|
|
556efcc1d7 | ||
|
|
25d1fe2c8d | ||
|
|
1a478150d6 | ||
|
|
e5643fb1e2 | ||
|
|
13e633778a | ||
|
|
bb57600f0f | ||
|
|
9813f3b696 | ||
|
|
3203db07b7 | ||
|
|
94b8d36065 | ||
|
|
0d61dcb1bc | ||
|
|
58203dbcfa | ||
|
|
66619cdc2f | ||
|
|
99cba25108 | ||
|
|
2fb1d388e3 | ||
|
|
6a4ed099fc | ||
|
|
d184ed4712 | ||
|
|
125a562189 | ||
|
|
a02ba5f7bb | ||
|
|
2e90f22529 | ||
|
|
bd681f5908 | ||
|
|
85b61c0b7e | ||
|
|
d11ea67bdd | ||
|
|
52603c087b | ||
|
|
545474a1a3 | ||
|
|
b63c838c74 | ||
|
|
1c6fdea27f | ||
|
|
9d0e6f0c30 | ||
|
|
1d0c72f5fa | ||
|
|
c221b9b4d4 | ||
|
|
a0ba8380c9 | ||
|
|
82a209bc5b | ||
|
|
2a338110f2 | ||
|
|
e890944160 | ||
|
|
542e01775e | ||
|
|
9cc4992fad | ||
|
|
6518d87200 | ||
|
|
499005f84d | ||
|
|
8497965cf7 | ||
|
|
0b0ab9277c | ||
|
|
75c62ff729 | ||
|
|
aef8c5fbb5 | ||
|
|
cfa4f5677b | ||
|
|
8131feae8a | ||
|
|
a3d5e04946 | ||
|
|
1fc3c6d9d2 | ||
|
|
53a5bc2221 | ||
|
|
12f3c2596f | ||
|
|
87dad41c37 | ||
|
|
4dbb18d408 | ||
|
|
a7cb75d73d | ||
|
|
517c0e2fe6 | ||
|
|
84db2e90ab | ||
|
|
9d469874c0 | ||
|
|
d850aa0773 | ||
|
|
9baebfa241 | ||
|
|
9e1d2da449 | ||
|
|
a71604e79f | ||
|
|
9a8d33e6bf | ||
|
|
09d745d987 | ||
|
|
8199bb6b62 | ||
|
|
643939ea1e | ||
|
|
9b3498d87a | ||
|
|
e4a162b054 | ||
|
|
bd47d0850e | ||
|
|
be3b4f0d3e | ||
|
|
664b02d735 | ||
|
|
6d1b981ecb | ||
|
|
ac6b1bf422 | ||
|
|
10847e2956 | ||
|
|
9b0258fef4 | ||
|
|
5b89cdc868 | ||
|
|
5a8cedd63f | ||
|
|
3feba2997f | ||
|
|
fce419526d | ||
|
|
e8fb86a283 | ||
|
|
90a820e0cf | ||
|
|
9f59f99663 | ||
|
|
a6150f2578 | ||
|
|
b784705cd3 | ||
|
|
0609bcaaf0 | ||
|
|
7727ec91f4 | ||
|
|
5365c866ff | ||
|
|
e1fbe89b41 | ||
|
|
a72e23eddf | ||
|
|
dcd49fd97b | ||
|
|
1b074d2d53 | ||
|
|
aed07a8ec5 | ||
|
|
1b12185a39 | ||
|
|
2e895c734e | ||
|
|
11a9dc57fc | ||
|
|
badd92a50e | ||
|
|
b2faf8044d | ||
|
|
3105e9545a | ||
|
|
42c71984f9 | ||
|
|
736da4bcad | ||
|
|
db359719a9 | ||
|
|
7bceeb714b | ||
|
|
35b8fc6e83 | ||
|
|
6d27e11043 | ||
|
|
b8e387ce98 | ||
|
|
c7ebad0fbb | ||
|
|
1bb596fc7e | ||
|
|
7bcebd5b0f | ||
|
|
a8b6902829 | ||
|
|
71e6dc8275 | ||
|
|
564640213e | ||
|
|
b04f262642 | ||
|
|
b802127801 | ||
|
|
6845fb0f00 | ||
|
|
a312311be9 | ||
|
|
fe54acef51 | ||
|
|
ef057b3e45 | ||
|
|
84ab233571 | ||
|
|
cf381d732d | ||
|
|
8653b0f3d0 | ||
|
|
65659fb676 | ||
|
|
939bcfec4b | ||
|
|
6ce8dd5ac3 | ||
|
|
63f4d81bc0 | ||
|
|
d0fbbbfb37 | ||
|
|
f23dc2d405 | ||
|
|
34aa231436 | ||
|
|
51d1b6e0d6 | ||
|
|
7c8612aadd | ||
|
|
d347b97f20 | ||
|
|
42b961229f | ||
|
|
79f726e6cd | ||
|
|
31cd6898d4 | ||
|
|
7608ee8450 | ||
|
|
da67a35328 | ||
|
|
46d0af6cef | ||
|
|
0ea9c65007 | ||
|
|
57dc4c207f | ||
|
|
582b69de74 | ||
|
|
0cf9be2a8d | ||
|
|
0bf39590e3 | ||
|
|
2debeb7475 | ||
|
|
ee8fd701ae | ||
|
|
9379324b07 | ||
|
|
55cdbd57cc | ||
|
|
11836cdfb1 | ||
|
|
c411d2a9f1 | ||
|
|
1b612816cc | ||
|
|
051abc00c4 | ||
|
|
f7ee5e8d78 | ||
|
|
cc26bc4858 | ||
|
|
88d2441ab3 | ||
|
|
6842879985 | ||
|
|
1518a460d5 | ||
|
|
ea86321da8 | ||
|
|
c416fce400 | ||
|
|
ae28df8abd | ||
|
|
e8ba4b0564 | ||
|
|
53e21ceed4 | ||
|
|
735286d3b0 | ||
|
|
8ad958708f | ||
|
|
58862e115c | ||
|
|
0df67dbc12 | ||
|
|
8bdfa34c7d | ||
|
|
06c730f4dc | ||
|
|
afc8d5bbbf | ||
|
|
1de46f592c | ||
|
|
863048cda2 | ||
|
|
0b09365d0d | ||
|
|
8e3ab8d5c5 | ||
|
|
9cf560ceec | ||
|
|
c3a75d98d4 | ||
|
|
261372289a | ||
|
|
b86edd4a20 | ||
|
|
374cf146e2 | ||
|
|
08ed545065 | ||
|
|
80836c725c | ||
|
|
9fa2acfe85 | ||
|
|
3ba122afd4 | ||
|
|
76df55dfc0 | ||
|
|
49a949aa97 | ||
|
|
5413263eff | ||
|
|
772c76e0a4 | ||
|
|
5463fa7390 | ||
|
|
d18c83beb0 | ||
|
|
7aa89c2e73 | ||
|
|
007d660ce1 | ||
|
|
3752cb3e56 | ||
|
|
cdf8d91e1b | ||
|
|
d082442851 | ||
|
|
689f67b1a8 | ||
|
|
744f47cb98 | ||
|
|
81e1b7490e | ||
|
|
22d160b1da | ||
|
|
c323105696 | ||
|
|
f6746c7530 | ||
|
|
52c4d54481 | ||
|
|
4c3f584fa6 | ||
|
|
2e7d912bdd | ||
|
|
288bf477ce | ||
|
|
27f3816fc6 | ||
|
|
33d40d4253 | ||
|
|
c7e0abc3fb | ||
|
|
18a4232783 | ||
|
|
15ed575207 | ||
|
|
eae4502708 | ||
|
|
78ebf04be0 | ||
|
|
49a596073e | ||
|
|
95783cc128 | ||
|
|
8d9d3a9e7d | ||
|
|
ea0de4b01d | ||
|
|
72aaf76cf4 | ||
|
|
78e282d406 | ||
|
|
0c214932ba | ||
|
|
a1eb4dc807 | ||
|
|
e92f13977c | ||
|
|
5db283700f | ||
|
|
6e79e5608e | ||
|
|
8355270a1a | ||
|
|
5a8835f41a | ||
|
|
2d32aeb972 | ||
|
|
1c38d63c50 | ||
|
|
4f6944424b | ||
|
|
fc01bedd45 | ||
|
|
7ab916b527 | ||
|
|
51c1f4b214 | ||
|
|
0b80d85c6c | ||
|
|
4489e130f2 | ||
|
|
e1cc00ad17 | ||
|
|
49191261a1 | ||
|
|
0479d5a02a | ||
|
|
189e733f81 | ||
|
|
bf2d535356 | ||
|
|
05cfdd0b69 | ||
|
|
a60e8d3e12 | ||
|
|
7b3d285884 | ||
|
|
5ba053a1c0 | ||
|
|
7d5f647cd3 | ||
|
|
0572d03003 | ||
|
|
f25649955e | ||
|
|
04d6a4a371 | ||
|
|
a8140d1f70 | ||
|
|
d1af15037c | ||
|
|
cca76550d6 | ||
|
|
2ff3d0d5a2 | ||
|
|
cb804eb3e1 | ||
|
|
878288fbec | ||
|
|
407f05629a | ||
|
|
ffae2c5f18 | ||
|
|
e300fad340 | ||
|
|
8898d3b558 | ||
|
|
53c29b65bd | ||
|
|
8e7bcd95a4 | ||
|
|
84479925bf | ||
|
|
7bfc66e218 | ||
|
|
309247d487 | ||
|
|
081054e08c | ||
|
|
adda8c4642 | ||
|
|
a0b17e145b | ||
|
|
3f0b355717 | ||
|
|
6b09c139e7 | ||
|
|
03b20b00b4 | ||
|
|
108305a3e3 | ||
|
|
ae4f4b052e | ||
|
|
a038e8bba4 | ||
|
|
33e825e91e | ||
|
|
c5e74635dd | ||
|
|
7be684835b | ||
|
|
a9930bd442 | ||
|
|
19eafef41e | ||
|
|
d42138384f | ||
|
|
ebe7779f40 | ||
|
|
347ea4ca98 | ||
|
|
f2f9c926bb | ||
|
|
5e1156abe2 | ||
|
|
803f9b6913 | ||
|
|
61fe0e81cd | ||
|
|
4c31b611b1 | ||
|
|
b3909e62f0 | ||
|
|
74e0d0396a | ||
|
|
dd58ef1de5 | ||
|
|
7eef726ee1 | ||
|
|
c0bf1576c2 | ||
|
|
e4c668c252 | ||
|
|
3f4e3f5f84 | ||
|
|
30f4eb8da0 | ||
|
|
328092f0ef | ||
|
|
a5dda0705e | ||
|
|
ba3552b697 | ||
|
|
b59c1c693d | ||
|
|
856956afce | ||
|
|
d938b6621d | ||
|
|
cc5ea61f5a | ||
|
|
fa617c78af | ||
|
|
f671b7e5e2 | ||
|
|
09066a4c6c | ||
|
|
07f34c2675 | ||
|
|
2b9326d75e | ||
|
|
91246b0f81 | ||
|
|
5ec0ad6913 | ||
|
|
64e6dcb23c | ||
|
|
1661d1f4ca | ||
|
|
e3008babfe | ||
|
|
cdc9753009 | ||
|
|
29e41e8e2b | ||
|
|
a2158af385 | ||
|
|
c14b546d5f | ||
|
|
29ee3e5ac0 | ||
|
|
011f35164a | ||
|
|
47ef8b9cac | ||
|
|
7058d6ca5a | ||
|
|
8592e0af54 | ||
|
|
ae6b2be52c | ||
|
|
31e41f8f02 | ||
|
|
717724c9f6 | ||
|
|
3cfb0bacf4 | ||
|
|
0fe1a426c0 | ||
|
|
0503825f7b | ||
|
|
858d12969a | ||
|
|
443172197b | ||
|
|
05d16b0682 | ||
|
|
8cf9f0d5bc | ||
|
|
2bfdaf08ee | ||
|
|
145be09cfd | ||
|
|
747c065213 | ||
|
|
8d8ac70070 | ||
|
|
11a14927c9 | ||
|
|
c5178fd90e | ||
|
|
89662124e5 | ||
|
|
337f95e269 | ||
|
|
8614b1c74a | ||
|
|
e72982a7f8 | ||
|
|
a16098d548 | ||
|
|
cc3bd8833a | ||
|
|
ab6523af3f | ||
|
|
af92417131 | ||
|
|
ae5c2d49c6 | ||
|
|
8b571912cf | ||
|
|
9f615cde79 | ||
|
|
ce7fa95546 | ||
|
|
dd0489c1c5 | ||
|
|
ab5a763d93 | ||
|
|
7449ea28a5 | ||
|
|
fa6661e4ae | ||
|
|
bfb1b6ac0a | ||
|
|
6b88ed0321 | ||
|
|
faa993acfb | ||
|
|
fbcdae9a6b | ||
|
|
12e1681d31 | ||
|
|
4225e28a4b | ||
|
|
23be5694d0 | ||
|
|
dc8adfc546 | ||
|
|
5d98c3337a | ||
|
|
5406acf329 | ||
|
|
fd7d8cbf56 | ||
|
|
9ff505d11b | ||
|
|
7f121f7518 | ||
|
|
1b132379be | ||
|
|
0f99e5fcaa | ||
|
|
726b148aa9 | ||
|
|
facf757997 | ||
|
|
fe1f221286 | ||
|
|
d3b4a72f4f | ||
|
|
fa47ad0095 | ||
|
|
aa7d38a0a5 | ||
|
|
42b2e2717d | ||
|
|
3387282de4 | ||
|
|
c82470e4df | ||
|
|
4383425060 | ||
|
|
3ed346be86 | ||
|
|
fd58eeae1d | ||
|
|
0ed82af99a | ||
|
|
a09e4bf82a | ||
|
|
dce3e0763f | ||
|
|
b814123ede | ||
|
|
a3d40e3521 | ||
|
|
4abfa6231c | ||
|
|
5bf4234ad3 | ||
|
|
7640740113 | ||
|
|
82300990ec | ||
|
|
bc812e4937 | ||
|
|
38d7b83ed0 | ||
|
|
ec5ed17860 | ||
|
|
8f6b71df46 | ||
|
|
e8e3e9b0be | ||
|
|
28ca815c88 | ||
|
|
65aaab5f38 | ||
|
|
f426ba3526 | ||
|
|
028c876bca | ||
|
|
29299b4644 | ||
|
|
7c6e5a68d9 | ||
|
|
fa99263918 | ||
|
|
e173c8b548 | ||
|
|
3e19038e06 | ||
|
|
2c023ef7a0 | ||
|
|
d9e27b6a82 | ||
|
|
b6ec1d9aa7 | ||
|
|
f683f0786e | ||
|
|
54dfa6cb7f | ||
|
|
7c667f3485 | ||
|
|
995aa65f16 | ||
|
|
8b76db2bca | ||
|
|
9c247d9a19 | ||
|
|
d9a6f11c35 | ||
|
|
00c4ac8d51 | ||
|
|
88e382e7a1 | ||
|
|
c585175214 | ||
|
|
a5b95728bf | ||
|
|
c742501b80 | ||
|
|
9c1de27562 | ||
|
|
fc15ef6967 | ||
|
|
eaf0259c3d | ||
|
|
fe2ce03ac1 | ||
|
|
70585ff32e | ||
|
|
a479c867c4 | ||
|
|
74f1b51b38 | ||
|
|
0ad9b83623 | ||
|
|
631d991d8d | ||
|
|
1be4a57bd4 | ||
|
|
76a6119584 | ||
|
|
add95292ce | ||
|
|
57fc6efd4c | ||
|
|
2fe734e6f9 | ||
|
|
e6091ee0c9 | ||
|
|
728b3bac67 | ||
|
|
0d7309cb19 | ||
|
|
18a9e39be6 | ||
|
|
18934bcc69 | ||
|
|
98ff00bc62 | ||
|
|
8d2f79cf24 | ||
|
|
05ba54b6d3 | ||
|
|
ef3cb9544a | ||
|
|
79614ed2cf | ||
|
|
7deabfe9cd | ||
|
|
bd1e019a42 | ||
|
|
14e27363e0 | ||
|
|
605b7c5b3e | ||
|
|
881b18f6d0 | ||
|
|
7256c7050a | ||
|
|
7a2a25c13a | ||
|
|
3e0bcd58d4 | ||
|
|
4c209ed74c | ||
|
|
d5675a5d4a | ||
|
|
91d39cc0c0 | ||
|
|
930ca8d9a1 | ||
|
|
6a07f66cfc | ||
|
|
442b3fcc48 | ||
|
|
6cc4f27ee3 | ||
|
|
036a068b83 | ||
|
|
4e0b795a3c | ||
|
|
10cbbee947 | ||
|
|
276ded0119 | ||
|
|
b017927c69 | ||
|
|
e59d88bbe9 | ||
|
|
e1391cae20 | ||
|
|
0b819053cf | ||
|
|
25b6f02091 | ||
|
|
32b6bc6a74 | ||
|
|
18f1b93ae4 | ||
|
|
c7afc9eb28 | ||
|
|
3f63a02145 | ||
|
|
eb0d5c996e | ||
|
|
a8a9e061a1 | ||
|
|
4292d88a92 | ||
|
|
a8af24d7ca | ||
|
|
efa0fc2b09 | ||
|
|
ebb2918a88 | ||
|
|
4fb3a2e0a0 | ||
|
|
607039f043 | ||
|
|
fb379b63ec | ||
|
|
4a6278f598 | ||
|
|
697161beb1 | ||
|
|
742804ecb8 | ||
|
|
2bf20fa501 | ||
|
|
685e0ce00d | ||
|
|
6a6b0236a9 | ||
|
|
857c70ece9 | ||
|
|
e68be6f041 | ||
|
|
52edeb42b5 | ||
|
|
c8a8bfd84d | ||
|
|
9f2c4919eb | ||
|
|
f56a470cc7 | ||
|
|
1e7b76005c | ||
|
|
54ccc705d0 | ||
|
|
0a661596b3 | ||
|
|
14f696e824 | ||
|
|
7e481960f9 | ||
|
|
7c779f4f09 | ||
|
|
4c4fe80697 | ||
|
|
fdd8e33b58 | ||
|
|
c36b190d5d | ||
|
|
37c9340499 | ||
|
|
b038b1f613 | ||
|
|
48b4bf1683 | ||
|
|
934543b595 | ||
|
|
d87ec82fe3 | ||
|
|
55b7cf21cc | ||
|
|
809d9e4697 | ||
|
|
a1ba3b567c | ||
|
|
b3ed545d6a | ||
|
|
8a7473765e | ||
|
|
eda1c6b2c6 | ||
|
|
7e55b44610 | ||
|
|
7e18b0dd3a | ||
|
|
578885225f | ||
|
|
3ec6194a47 | ||
|
|
9d3cac43b7 | ||
|
|
569041a4c4 | ||
|
|
9839885198 | ||
|
|
18472188b9 | ||
|
|
44c0dec68b | ||
|
|
f81b3d4ed6 | ||
|
|
c69ef95c6a | ||
|
|
dfd42c9896 | ||
|
|
3bfa1cbf41 | ||
|
|
79c06442db | ||
|
|
6195fc0d11 | ||
|
|
6523334a48 | ||
|
|
b3cde51590 | ||
|
|
6ec296f2a7 | ||
|
|
cb4392628f | ||
|
|
3549fc07f6 | ||
|
|
ecd84d7c43 | ||
|
|
c2b2b059e6 | ||
|
|
6ff5a1db42 | ||
|
|
2bc68707b5 | ||
|
|
0c9376039c | ||
|
|
e1fe3ca14a | ||
|
|
a224e5d470 | ||
|
|
7444110c79 | ||
|
|
fc0c8a160b | ||
|
|
481cc52686 | ||
|
|
4273b6e4fb | ||
|
|
5e08b2be37 | ||
|
|
a665b79f85 | ||
|
|
0e23038e28 | ||
|
|
fe4de7f929 | ||
|
|
0783d57459 | ||
|
|
4e1e5bd8c4 | ||
|
|
b3a14e9a7b | ||
|
|
b725a9bcea | ||
|
|
5c263fac8d | ||
|
|
04c1619eb4 | ||
|
|
d74dbb722a | ||
|
|
95969c4979 | ||
|
|
10c9954ebc | ||
|
|
e61b2b1fc5 | ||
|
|
46ecb0ac03 | ||
|
|
2d44bade4b | ||
|
|
0a0b852f2c | ||
|
|
1658d7ae86 | ||
|
|
ca44cda112 | ||
|
|
1935f8b27f | ||
|
|
d32dba43b4 | ||
|
|
8d0a3c8e69 | ||
|
|
f561b2d955 | ||
|
|
8afb7d654d | ||
|
|
32cbc20108 | ||
|
|
be3cd2a434 | ||
|
|
ba3ca6b00d | ||
|
|
c88dcef900 | ||
|
|
3d1e4fde81 | ||
|
|
1e02bb5999 | ||
|
|
bd7bcf8a0b | ||
|
|
1c0f3e1b81 | ||
|
|
b2b3f388b1 | ||
|
|
110a6d11a5 | ||
|
|
75faf7d30e | ||
|
|
e95a9731be | ||
|
|
5cb5f9a963 | ||
|
|
88aa3a4e19 | ||
|
|
d34b9ee00e | ||
|
|
103730a642 | ||
|
|
84017776ec | ||
|
|
34e673f7d6 | ||
|
|
5ac6a307bf | ||
|
|
8c1b681391 | ||
|
|
e12fef7828 | ||
|
|
dc79f80366 | ||
|
|
e004f872f9 | ||
|
|
da558de769 | ||
|
|
587335e3ba | ||
|
|
7219e3760c | ||
|
|
d2267ecd71 | ||
|
|
b159def9b2 | ||
|
|
e1eefd1165 | ||
|
|
da1fb4f969 | ||
|
|
5b4dacf0f5 | ||
|
|
9046f59b9f | ||
|
|
6c1f9dba52 | ||
|
|
ea1df2b5c3 | ||
|
|
1daee79095 | ||
|
|
b3423e1722 | ||
|
|
5b68a11f01 | ||
|
|
0c8195e4f1 | ||
|
|
8fe795102f | ||
|
|
bfb91fcf10 | ||
|
|
27a02f64b2 | ||
|
|
44c62f8f44 | ||
|
|
7bb7747c67 | ||
|
|
8bb47a88f8 | ||
|
|
c8c47961db | ||
|
|
e8c91ea3a1 | ||
|
|
429d995270 | ||
|
|
c4bd47eb84 | ||
|
|
1811118f28 | ||
|
|
69ba925ee8 | ||
|
|
7219c3449f | ||
|
|
a5d84c88bf | ||
|
|
da0aa38614 | ||
|
|
6b1397d257 | ||
|
|
7d640e2aab | ||
|
|
0a01629b15 | ||
|
|
ee2de33643 | ||
|
|
78b0e50742 | ||
|
|
a7371c048b | ||
|
|
f3dfa81811 | ||
|
|
5b4793a2d5 | ||
|
|
b6660c72e1 | ||
|
|
a6eeed4061 | ||
|
|
239fddcac2 | ||
|
|
b27f9bf74c | ||
|
|
09b856bf0b | ||
|
|
9954c6a571 | ||
|
|
44b24de5d0 | ||
|
|
22927bfc76 | ||
|
|
a39522a25e | ||
|
|
ea6c8a1a65 | ||
|
|
546bbe5418 | ||
|
|
93534db79e | ||
|
|
805892f623 | ||
|
|
744792452f | ||
|
|
5ca7f375d3 | ||
|
|
568148a349 | ||
|
|
fedf745d25 | ||
|
|
8823aeb9d7 | ||
|
|
dc5c765c2a | ||
|
|
fed0322ebf | ||
|
|
e429ba6fa2 | ||
|
|
dc57332988 | ||
|
|
138231059b | ||
|
|
834b233c30 | ||
|
|
234475effe | ||
|
|
7d7d06651c | ||
|
|
72d41eac85 | ||
|
|
0fec03ad3f | ||
|
|
43a823d0ac | ||
|
|
96ffae3372 | ||
|
|
ecf51406c5 | ||
|
|
bf56145a09 | ||
|
|
8056290423 | ||
|
|
892d1214b0 | ||
|
|
f6823b5704 | ||
|
|
f3abf84e17 | ||
|
|
a6d937b366 | ||
|
|
7dc71f92d0 | ||
|
|
f74b47ca16 | ||
|
|
b9a413d19e | ||
|
|
3436780117 | ||
|
|
2d2719cfb2 | ||
|
|
515aed7022 | ||
|
|
22e484edd4 | ||
|
|
616a598940 | ||
|
|
1a843f95b7 | ||
|
|
32e1d7e879 | ||
|
|
8c67c7efb3 | ||
|
|
252bdcbbe0 | ||
|
|
4dbe047512 | ||
|
|
1da7c705e3 | ||
|
|
fabd751f20 | ||
|
|
308820b8a1 | ||
|
|
4fd7eaf8e0 | ||
|
|
789f0bc8ff | ||
|
|
042c65a48c | ||
|
|
03a1014714 | ||
|
|
6e9c81eddf | ||
|
|
d7c103d77f | ||
|
|
63435f2ec1 | ||
|
|
445adbd078 | ||
|
|
0e088f11ba | ||
|
|
e47f25ac3e | ||
|
|
df02123b1e | ||
|
|
6a685df823 | ||
|
|
a4add7de67 | ||
|
|
8473820f0c | ||
|
|
c777daf6e6 | ||
|
|
4dff20cc8c | ||
|
|
c855570b55 | ||
|
|
395add8114 | ||
|
|
019a5563c4 | ||
|
|
e9b21aaf86 | ||
|
|
d6a0cbb1a0 | ||
|
|
3900b97136 | ||
|
|
2d4ae38a09 | ||
|
|
7f2f98885b | ||
|
|
a4955b420a | ||
|
|
fe78f60b1f | ||
|
|
21d14a782e | ||
|
|
c0f1243879 | ||
|
|
67945f2f33 | ||
|
|
30ffa4c3f2 | ||
|
|
43c17b9950 | ||
|
|
ea5d02b1e6 | ||
|
|
5856275347 | ||
|
|
534b0e4cf6 | ||
|
|
97d5873e3d | ||
|
|
fb1173bc30 | ||
|
|
f0acaa16c4 | ||
|
|
3bd99e1910 | ||
|
|
ad19b09ae3 | ||
|
|
ffa4cd134b | ||
|
|
fbffef1cc4 | ||
|
|
2a402b632d | ||
|
|
6899a3258a | ||
|
|
04cc43b2f0 | ||
|
|
460a203c29 | ||
|
|
79184347f9 | ||
|
|
be48bf06df | ||
|
|
3bba1089ed | ||
|
|
c9c8108a53 | ||
|
|
067fdaeb8f | ||
|
|
b6e862bd10 | ||
|
|
9ad8065f75 | ||
|
|
f1cdd72575 | ||
|
|
58e1a1f1d8 | ||
|
|
aee09d9119 | ||
|
|
de56e2b405 | ||
|
|
c59c4290f9 | ||
|
|
fd9d9d9d35 | ||
|
|
2a5b497d8a | ||
|
|
b93570eeb0 | ||
|
|
3ef6284a0d | ||
|
|
1024782b9e | ||
|
|
d35ac1347c | ||
|
|
c4e88fd11a | ||
|
|
0de50e0afe | ||
|
|
763b02975c | ||
|
|
cc57d1edf7 | ||
|
|
bb988701fe | ||
|
|
75fdff4d41 | ||
|
|
8fc49f37a7 | ||
|
|
abd9ffd31d | ||
|
|
0b07909386 | ||
|
|
82b770c1aa | ||
|
|
456ffb79ff | ||
|
|
368c2aac24 | ||
|
|
b6f70ed92a | ||
|
|
98c2914eeb | ||
|
|
5b09e4ac0c | ||
|
|
5d8cf22897 | ||
|
|
51f6d2f45e | ||
|
|
1abaa5e60c | ||
|
|
f4792eea04 | ||
|
|
1fe1e1ce7e | ||
|
|
58659cf3b6 | ||
|
|
9a588231c5 | ||
|
|
f408ad16e4 | ||
|
|
fecca5ad83 | ||
|
|
9e5d41c48a | ||
|
|
87b4cfff1a | ||
|
|
19a2b9042f | ||
|
|
eea26d7ece | ||
|
|
06182bfce4 | ||
|
|
77bb9eaa73 | ||
|
|
10d1378277 | ||
|
|
8b2f4780ed | ||
|
|
aef513f038 | ||
|
|
bb55df34d7 | ||
|
|
2b159fc40f | ||
|
|
d7d004b48e | ||
|
|
013fbf79e9 | ||
|
|
2618dde1e2 | ||
|
|
8a2d4ab68c | ||
|
|
5e4878843e | ||
|
|
be484d20a2 | ||
|
|
1dd9f8c1d4 | ||
|
|
4939b6b641 | ||
|
|
52747e364a | ||
|
|
1901e93b1e | ||
|
|
eb55761c38 | ||
|
|
16b57193f1 | ||
|
|
5bb7bf8947 | ||
|
|
2c9aa86bf0 | ||
|
|
d2b915f6c2 | ||
|
|
7920eff672 | ||
|
|
30415e6220 | ||
|
|
21db209f47 | ||
|
|
648b9dd7d8 | ||
|
|
396c91f8f7 | ||
|
|
c3c79d3715 | ||
|
|
8c3229ec38 | ||
|
|
8c92cfb814 | ||
|
|
3eb866f5d2 | ||
|
|
3471c737b9 | ||
|
|
d164ccb6c7 | ||
|
|
ce98957be0 | ||
|
|
fe4a9bff2d | ||
|
|
024f3962b2 | ||
|
|
a55316aef9 | ||
|
|
08b955f8b6 | ||
|
|
83f520f7a8 | ||
|
|
9476fda987 | ||
|
|
b509d96f18 | ||
|
|
d8ae65a762 | ||
|
|
efea511211 | ||
|
|
2564818c3e | ||
|
|
e6930d9601 | ||
|
|
4827cd24d8 | ||
|
|
acca69a8a9 | ||
|
|
4e405ce530 | ||
|
|
d171e781d2 | ||
|
|
99f0e31810 | ||
|
|
88ffc9b145 | ||
|
|
9ed76400de | ||
|
|
0aa8fc2fc2 | ||
|
|
98829b209a | ||
|
|
f3eb0df081 | ||
|
|
f83fb57d38 | ||
|
|
7d07631f12 | ||
|
|
8737e9824f | ||
|
|
ea472c844e | ||
|
|
a29e2582ed | ||
|
|
98477ef6c6 | ||
|
|
86be6aebff | ||
|
|
f9754bddf1 | ||
|
|
03390815af | ||
|
|
82ef6f8ac5 | ||
|
|
497e50c559 | ||
|
|
7cf9e202a3 | ||
|
|
620d222f98 | ||
|
|
a2d16143e3 | ||
|
|
97c087ef5f | ||
|
|
07f39b31da | ||
|
|
f7c1bc71d9 | ||
|
|
4b0d5815c0 | ||
|
|
5c07a968fe | ||
|
|
f4ac87af3a | ||
|
|
125965b559 | ||
|
|
43703b6f40 | ||
|
|
7cdae0f689 | ||
|
|
61ce2c95b3 | ||
|
|
08128748a7 | ||
|
|
c9fe7f6db6 | ||
|
|
a8cad28da7 | ||
|
|
c035af5409 | ||
|
|
eb951fdaf1 | ||
|
|
726ab7fc05 | ||
|
|
fb25c79b9c | ||
|
|
3c0f4278c7 | ||
|
|
6bd4b3c167 | ||
|
|
89350a80ad | ||
|
|
f26227ecec | ||
|
|
c002501c2e | ||
|
|
8af78c6d84 | ||
|
|
7e8ffd8390 | ||
|
|
5bd30060e7 | ||
|
|
c24cac9a44 | ||
|
|
2bc9730b1d | ||
|
|
428858dc75 | ||
|
|
8a425a93ae | ||
|
|
59256cf8b3 | ||
|
|
844186d520 | ||
|
|
93b6d785f3 | ||
|
|
0bb2a051b6 | ||
|
|
ef78a7d41b | ||
|
|
6c1c695616 | ||
|
|
8bdab347b6 | ||
|
|
ae349d4424 | ||
|
|
3e49745257 | ||
|
|
c2b7226205 | ||
|
|
f67369a9a9 | ||
|
|
14d2a49942 | ||
|
|
92df40a6a0 | ||
|
|
0e6e9c5238 | ||
|
|
de65ffb99d | ||
|
|
2d5472cf2a | ||
|
|
a2203da1c6 | ||
|
|
0fb8291b8b | ||
|
|
b393ec2856 | ||
|
|
c3d908126f | ||
|
|
4c3b0abe7b | ||
|
|
664ba55460 | ||
|
|
3d0882856f | ||
|
|
e849d28276 | ||
|
|
18a691482d | ||
|
|
7c48e3632d | ||
|
|
8701b20899 | ||
|
|
8ca2884c1c | ||
|
|
d1d2ad6a5c | ||
|
|
e3f5062583 | ||
|
|
d427e0522e | ||
|
|
46e144f647 | ||
|
|
6ad20c53d9 | ||
|
|
cc433388f5 | ||
|
|
1fba4b7e32 | ||
|
|
c249cd4ffd | ||
|
|
d54bf5f75e | ||
|
|
9cbe3ff551 | ||
|
|
b1d20d3228 | ||
|
|
e5602abee0 | ||
|
|
a296a9e109 | ||
|
|
e5bbf47ab9 | ||
|
|
9bda2a44ae | ||
|
|
a1d32c3a21 | ||
|
|
b4b68c0b00 | ||
|
|
608bf30bda | ||
|
|
d0be5f09a5 | ||
|
|
3d8a3a2204 | ||
|
|
b19734004a | ||
|
|
f503c72782 | ||
|
|
f8903a8183 | ||
|
|
d43d5a6cb6 | ||
|
|
99f4b2cf95 | ||
|
|
b493d739bd | ||
|
|
92fb43a455 | ||
|
|
7c29fb449e | ||
|
|
7ddcec3a0d | ||
|
|
18f206747c | ||
|
|
0bce1da4e3 | ||
|
|
65ed047084 | ||
|
|
b0573f88e6 | ||
|
|
348fca7e28 | ||
|
|
cc9b750eff | ||
|
|
701ad8a4a9 | ||
|
|
2cc088c633 | ||
|
|
4dfba3a2ad | ||
|
|
a3721a94ce | ||
|
|
7439faad34 | ||
|
|
6efe54aa88 | ||
|
|
9e62d1ad8f | ||
|
|
e69251b21a | ||
|
|
f096c4a5d0 | ||
|
|
03b3f5937f | ||
|
|
696b5c80a7 | ||
|
|
d6fcd22752 | ||
|
|
54d9ca8ed8 | ||
|
|
05d8a06cd5 | ||
|
|
4f7626828a | ||
|
|
81193eb550 | ||
|
|
38b09dc610 | ||
|
|
ae3527df16 | ||
|
|
85d0270af0 | ||
|
|
59e185b781 | ||
|
|
b5ad29e3f2 | ||
|
|
f1e2b99456 | ||
|
|
0635e7ae1e | ||
|
|
8f674aede9 | ||
|
|
838200219f | ||
|
|
e543b305c3 | ||
|
|
d42b0691b2 | ||
|
|
71022d58d3 | ||
|
|
a313b675a6 | ||
|
|
ae18693715 | ||
|
|
3ad7622bf0 | ||
|
|
19cb575b90 | ||
|
|
3cfab25f8a | ||
|
|
85359bb10f | ||
|
|
aa2beb1d78 | ||
|
|
2e07ac5a47 | ||
|
|
d844ee2c79 | ||
|
|
266482649f | ||
|
|
83496c66d1 | ||
|
|
374cb74978 | ||
|
|
f0018dcba9 | ||
|
|
7949a5e1fd | ||
|
|
0a1531ce8a | ||
|
|
7b8bd2d4ce | ||
|
|
4883bc3dd4 | ||
|
|
72a115b434 | ||
|
|
f28edd0864 | ||
|
|
d69ec7f8e4 | ||
|
|
779837389b | ||
|
|
ea9e9d7273 | ||
|
|
237dfce8a0 | ||
|
|
2b0ccf3acd | ||
|
|
e4f3b3447e | ||
|
|
eb8e4f64fc | ||
|
|
6287f75e67 | ||
|
|
d82f2e289a | ||
|
|
73e9842877 | ||
|
|
a86178f19b | ||
|
|
b77c228853 | ||
|
|
5e4432b9ad | ||
|
|
e7f10fdaea | ||
|
|
8713ed5d73 | ||
|
|
cd64fcac8d | ||
|
|
96759af86f | ||
|
|
d57222328b | ||
|
|
83c4577f6d | ||
|
|
7bd853e87b | ||
|
|
861a52d27c | ||
|
|
9df2130e11 | ||
|
|
6242e195be | ||
|
|
f2f0ea8d04 | ||
|
|
b7309d5c69 | ||
|
|
613e0d10b3 | ||
|
|
04fc3a5a9e | ||
|
|
6ec8ac7597 | ||
|
|
9a5f54bdaf | ||
|
|
ad5e167ad7 | ||
|
|
d33d9522cc | ||
|
|
a292ff5cc0 | ||
|
|
b91e5763e2 | ||
|
|
e1e840eb69 | ||
|
|
0eb9f41470 | ||
|
|
34457ea1b4 | ||
|
|
878154c305 | ||
|
|
9ede726eea | ||
|
|
bfa95c16e3 | ||
|
|
7885ec5511 | ||
|
|
be3d33eebd | ||
|
|
c7040fd418 | ||
|
|
eac53a779b | ||
|
|
0986fd1081 | ||
|
|
1e3c7e1a87 | ||
|
|
3869028d53 | ||
|
|
12945704e9 | ||
|
|
cd629fc737 | ||
|
|
b070be1c41 | ||
|
|
8fa37d3ec8 | ||
|
|
3135dc42c3 | ||
|
|
08ef5c9a02 | ||
|
|
b1935ddcab | ||
|
|
93353e94a2 | ||
|
|
30e4504ee5 | ||
|
|
a9716af0fa | ||
|
|
042f3590c8 | ||
|
|
2c9b791b85 | ||
|
|
7396975500 | ||
|
|
fe4bf62793 | ||
|
|
8a8342b106 | ||
|
|
e52702f6c2 | ||
|
|
0fae7504b3 | ||
|
|
ab612c1ca6 | ||
|
|
0364d8cd43 | ||
|
|
1544823d73 | ||
|
|
b793ee3aff | ||
|
|
36c903da04 | ||
|
|
981e7017bb | ||
|
|
2820d26a0f | ||
|
|
b7e44a744d | ||
|
|
bb00f2ff46 | ||
|
|
65d90aa8a3 | ||
|
|
3d286fbdc3 | ||
|
|
c8eae3a5c3 | ||
|
|
afc58e6bff | ||
|
|
f59b5119e5 | ||
|
|
8eca7377a5 | ||
|
|
c828806b67 | ||
|
|
e639de9861 | ||
|
|
9a4d885a9c | ||
|
|
d28cc4fdb5 | ||
|
|
54a979c936 | ||
|
|
d18652f726 | ||
|
|
ac1083f65d | ||
|
|
bcfc2e5f74 | ||
|
|
a135396d7b | ||
|
|
ef987bd008 | ||
|
|
a2fef1df83 | ||
|
|
016c7d4e6f | ||
|
|
0a60bcdb8d | ||
|
|
5374e6c881 | ||
|
|
ab65ab860f | ||
|
|
ad2742dbb2 | ||
|
|
997077fc5d | ||
|
|
c8042ad511 | ||
|
|
b51d66ea72 | ||
|
|
21d31b5747 | ||
|
|
1ea208ba00 | ||
|
|
5fdf2d3416 | ||
|
|
0321ae0a7f | ||
|
|
e4ecd2dae9 | ||
|
|
b9176adca4 | ||
|
|
b6f6293b76 | ||
|
|
d45edcd216 | ||
|
|
89c487de65 | ||
|
|
d45a17247d | ||
|
|
2e97bf48c5 | ||
|
|
872e936924 | ||
|
|
574a43fff7 | ||
|
|
6ff8a267e9 | ||
|
|
335cfcde57 | ||
|
|
5f5df97e59 | ||
|
|
cbd4d2f99a | ||
|
|
a1ac1876ad | ||
|
|
58841e85db | ||
|
|
46cd22ea7e | ||
|
|
cf8dad5763 | ||
|
|
8ea2949d84 | ||
|
|
e4af9ebc6f | ||
|
|
7a3af8de83 | ||
|
|
433c48a1a3 | ||
|
|
889316085c | ||
|
|
05c0a9256d | ||
|
|
c10b8cf55b | ||
|
|
91fe80f73c | ||
|
|
4e837c2770 | ||
|
|
7e437455c1 | ||
|
|
9a68a61ad3 | ||
|
|
7e65a3d3b4 | ||
|
|
82fbd975f1 | ||
|
|
bd95d2b852 | ||
|
|
956e2728c2 | ||
|
|
7f1d9aeaf8 | ||
|
|
f2c079de87 | ||
|
|
8be4fbbce3 | ||
|
|
64d11d32c8 | ||
|
|
1f1a62da67 | ||
|
|
e97adcb614 | ||
|
|
2bb4a81e23 | ||
|
|
46a024441c | ||
|
|
a694dbb020 | ||
|
|
f74c88027e | ||
|
|
c64f96d65b | ||
|
|
fb48c1f6dd | ||
|
|
ee7f7c877a | ||
|
|
f64f205e81 | ||
|
|
10778f8479 | ||
|
|
bb6360cad4 | ||
|
|
c0c4eed3a8 | ||
|
|
f9f1a4439f | ||
|
|
9c66e1f01b | ||
|
|
683f75fad1 | ||
|
|
a303a0dfb7 | ||
|
|
b0d634a89e | ||
|
|
f62e49c02b | ||
|
|
61f137866e | ||
|
|
3f1714f076 | ||
|
|
afce8e2516 | ||
|
|
4e30ed9693 | ||
|
|
7f02b9436b | ||
|
|
a237725d0d | ||
|
|
91561e9ca5 | ||
|
|
4ab5d15ee6 | ||
|
|
187f4fa4aa | ||
|
|
3bb2b9e8f6 | ||
|
|
59d8c0b321 | ||
|
|
d0cb7d843d | ||
|
|
991f71bf28 | ||
|
|
362392d1de | ||
|
|
9e51ddd8d8 | ||
|
|
f65f924011 | ||
|
|
bc4f19c967 | ||
|
|
b482c30866 | ||
|
|
676d93e829 | ||
|
|
cb93953b2c | ||
|
|
68082a88a7 | ||
|
|
4c60a602b9 | ||
|
|
912cd220cc | ||
|
|
3b120c0372 | ||
|
|
2799d71e93 | ||
|
|
fcd7b42941 | ||
|
|
6fe2f83435 | ||
|
|
94c25b0ff4 | ||
|
|
ec38ec8004 | ||
|
|
1d9e55ca6e | ||
|
|
9b89afd6dc | ||
|
|
1aa22d1ba8 | ||
|
|
61d23df83a | ||
|
|
fca5accba8 | ||
|
|
947da63d56 | ||
|
|
a94e5c7403 | ||
|
|
c061f7021e | ||
|
|
ad43373f5b | ||
|
|
720b88048d | ||
|
|
d58291d119 | ||
|
|
132b1ff479 | ||
|
|
0115a61ab7 | ||
|
|
fadf15dbc0 | ||
|
|
cb9478e0ea | ||
|
|
04964cc52b | ||
|
|
6ab1c06036 | ||
|
|
d3fee54644 | ||
|
|
f4e49495e2 | ||
|
|
c072ba088f | ||
|
|
4397d3da02 | ||
|
|
fc5bb966f0 | ||
|
|
20f60cd99d | ||
|
|
ac0c54cce4 | ||
|
|
19b78e63ce | ||
|
|
653af17755 | ||
|
|
bac2387f50 | ||
|
|
9990fd25d4 | ||
|
|
e9930854c4 | ||
|
|
11ac4cd2c2 | ||
|
|
5b07c77708 | ||
|
|
c3ad2d0a80 | ||
|
|
4dae781be0 | ||
|
|
1cc82f2ab7 | ||
|
|
c6641ec1de | ||
|
|
c083b862a7 | ||
|
|
6ffadb501b | ||
|
|
38ded66c4e | ||
|
|
358d7ac562 | ||
|
|
cae784ff52 | ||
|
|
835e11d10f | ||
|
|
e7157973e7 | ||
|
|
5b5110acbf | ||
|
|
61e5eff666 | ||
|
|
16a3d1339a | ||
|
|
759190d8ba | ||
|
|
f8e2cb06d1 | ||
|
|
37aa10c5a5 | ||
|
|
ad9ed13b9a | ||
|
|
d9f8d809c8 | ||
|
|
03054b88aa | ||
|
|
a72911b527 | ||
|
|
8e4da3faf4 | ||
|
|
46945aa98d | ||
|
|
939224d0af | ||
|
|
14bc3a3cf8 | ||
|
|
79b19821f6 | ||
|
|
8d15f79f1e | ||
|
|
b079cc12f4 | ||
|
|
1c66733b8a | ||
|
|
2ef85ea195 | ||
|
|
69a3d14b53 | ||
|
|
d74c07e1a2 | ||
|
|
e1a86139dc | ||
|
|
8e1fe6339e | ||
|
|
7a5cf80412 | ||
|
|
5406e8e2e7 | ||
|
|
d3974c9f44 | ||
|
|
0015c8dfa2 | ||
|
|
ad1da22257 | ||
|
|
e703d9ff78 | ||
|
|
32501c96e5 | ||
|
|
6149ba6e36 | ||
|
|
0d44a320a0 | ||
|
|
a8a272b068 | ||
|
|
20a85c1ef2 | ||
|
|
23b58ccbe8 | ||
|
|
9c967ee3ea | ||
|
|
f495addb1e | ||
|
|
d750b690e7 | ||
|
|
fdb3e3f9a4 | ||
|
|
a17018a875 | ||
|
|
8de20fcd1f | ||
|
|
51120ccf31 | ||
|
|
8dd7123923 | ||
|
|
6ed2e7b636 | ||
|
|
fa8e70fe26 | ||
|
|
a87f34ebb3 | ||
|
|
75d875615b | ||
|
|
07e6abdac4 | ||
|
|
1ddc1a6781 | ||
|
|
3f216fa4a3 | ||
|
|
4fb79e6e2a | ||
|
|
fdda30704b | ||
|
|
5418520252 | ||
|
|
9d526b0907 | ||
|
|
9db492eb07 | ||
|
|
d6ee4d58ba | ||
|
|
f63cf6a7a4 | ||
|
|
18ab1144bb | ||
|
|
a9b216d212 | ||
|
|
6b19a1ece9 | ||
|
|
0dd6d552a8 | ||
|
|
cfddf570b9 | ||
|
|
6a9b50f95d | ||
|
|
1dcd857ca6 | ||
|
|
7e6cb9d186 | ||
|
|
cf78307577 | ||
|
|
12fbd34962 | ||
|
|
ed059d80d6 | ||
|
|
664a39911c | ||
|
|
d6cf385a3c | ||
|
|
cef8204f40 | ||
|
|
42e82f0ead | ||
|
|
2a517cde9f | ||
|
|
992657cbe0 | ||
|
|
d2c8aae59c | ||
|
|
3208c8317d | ||
|
|
bec7ea7072 | ||
|
|
0a6ebdee48 | ||
|
|
b1cd634ab4 | ||
|
|
47abd62c55 | ||
|
|
db781437fc | ||
|
|
a40f52ee62 | ||
|
|
89e6fd68e5 | ||
|
|
ecf0f15c17 | ||
|
|
04a6e2de9d | ||
|
|
0cd29daea2 | ||
|
|
b392502b9b | ||
|
|
a301c974e4 | ||
|
|
4c7c2edf9a | ||
|
|
3d3748d6f5 | ||
|
|
fa3199d41c | ||
|
|
efbda6d5af | ||
|
|
8640f500d1 | ||
|
|
3d90e3aee9 | ||
|
|
6c676d21c3 | ||
|
|
7e6af88966 | ||
|
|
3b53cf5e84 | ||
|
|
713f02ca3f | ||
|
|
19844e81d1 | ||
|
|
5fbe766a0a | ||
|
|
1430c0a6e6 | ||
|
|
e3e928f1c4 | ||
|
|
e155acbbd4 | ||
|
|
be1b6b6aa3 | ||
|
|
b4ba5cbb7a | ||
|
|
f28474d86e | ||
|
|
1964073072 | ||
|
|
856d2e3176 | ||
|
|
3409a1bfba | ||
|
|
fc8f02c180 | ||
|
|
03e48161a1 | ||
|
|
def63329f0 | ||
|
|
0680b01a96 | ||
|
|
592e788a7d | ||
|
|
aabc1a8265 | ||
|
|
a23ff4e519 | ||
|
|
edc015d9bf | ||
|
|
d5a0e12283 | ||
|
|
90e8f26cd4 | ||
|
|
d4e83ca1c0 | ||
|
|
137aa9da2c | ||
|
|
87c600aa7c | ||
|
|
08dfe64301 | ||
|
|
0e48ee5f9e | ||
|
|
b6e532f01d | ||
|
|
60baa5e59e | ||
|
|
9eb64dc6a4 | ||
|
|
3de04094fb | ||
|
|
02e8979178 | ||
|
|
5e962719ca | ||
|
|
fefc623343 | ||
|
|
5c40081d84 | ||
|
|
e739d6aa05 | ||
|
|
0994719b91 | ||
|
|
f469920759 | ||
|
|
3c9be8cd08 | ||
|
|
a0e82e1817 | ||
|
|
69bf451b20 | ||
|
|
58699a220b | ||
|
|
3f70f685bb | ||
|
|
d838a76461 | ||
|
|
e13d96a6f2 | ||
|
|
1e1e2d5f54 | ||
|
|
c51d2a56ac | ||
|
|
e9d888bf63 | ||
|
|
47b7ec8d00 | ||
|
|
c8f09f28b1 |
40
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,40 +0,0 @@
|
|||||||
---
|
|
||||||
name: 🐛 Bug Report
|
|
||||||
about: Report a reproducible bug in the current release of NetBox
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
NOTE: IF YOUR ISSUE DOES NOT FOLLOW THIS TEMPLATE, IT WILL BE CLOSED.
|
|
||||||
|
|
||||||
This form is only for reporting reproducible bugs. If you need assistance
|
|
||||||
with NetBox installation, or if you have a general question, please start a
|
|
||||||
discussion instead: https://github.com/netbox-community/netbox/discussions
|
|
||||||
|
|
||||||
Please describe the environment in which you are running NetBox. Be sure
|
|
||||||
that you are running an unmodified instance of the latest stable release
|
|
||||||
before submitting a bug report, and that any plugins have been disabled.
|
|
||||||
-->
|
|
||||||
### Environment
|
|
||||||
* Python version:
|
|
||||||
* NetBox version:
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Describe in detail the exact steps that someone else can take to reproduce
|
|
||||||
this bug using the current stable release of NetBox. Begin with the
|
|
||||||
creation of any necessary database objects and call out every operation
|
|
||||||
being performed explicitly. If reporting a bug in the REST API, be sure to
|
|
||||||
reconstruct the raw HTTP request(s) being made: Don't rely on a client
|
|
||||||
library such as pynetbox.
|
|
||||||
-->
|
|
||||||
### Steps to Reproduce
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
<!-- What did you expect to happen? -->
|
|
||||||
### Expected Behavior
|
|
||||||
|
|
||||||
|
|
||||||
<!-- What happened instead? -->
|
|
||||||
### Observed Behavior
|
|
||||||
63
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
name: 🐛 Bug Report
|
||||||
|
description: Report a reproducible bug in the current release of NetBox
|
||||||
|
labels: ["type: bug"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
**NOTE:** This form is only for reporting _reproducible bugs_ in a current NetBox
|
||||||
|
installation. If you're having trouble with installation or just looking for
|
||||||
|
assistance with using NetBox, please visit our
|
||||||
|
[discussion forum](https://github.com/netbox-community/netbox/discussions) instead.
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: NetBox version
|
||||||
|
description: >
|
||||||
|
What version of NetBox are you currently running? (If you don't have access to the most
|
||||||
|
recent NetBox release, consider testing on our [demo instance](https://demo.netbox.dev/)
|
||||||
|
before opening a bug report to see if your issue has already been addressed.)
|
||||||
|
placeholder: v3.0.1
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Python version
|
||||||
|
description: What version of Python are you currently running?
|
||||||
|
options:
|
||||||
|
- 3.7
|
||||||
|
- 3.8
|
||||||
|
- 3.9
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps to Reproduce
|
||||||
|
description: >
|
||||||
|
Describe in detail the exact steps that someone else can take to
|
||||||
|
reproduce this bug using the current stable release of NetBox. Begin with the
|
||||||
|
creation of any necessary database objects and call out every operation being
|
||||||
|
performed explicitly. If reporting a bug in the REST API, be sure to reconstruct
|
||||||
|
the raw HTTP request(s) being made: Don't rely on a client library such as
|
||||||
|
pynetbox. Additionally, **do not rely on the demo instance** for reproducing
|
||||||
|
suspected bugs, as its data is prone to modification or deletion at any time.
|
||||||
|
placeholder: |
|
||||||
|
1. Click on "create widget"
|
||||||
|
2. Set foo to 12 and bar to G
|
||||||
|
3. Click the "create" button
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected Behavior
|
||||||
|
description: What did you expect to happen?
|
||||||
|
placeholder: A new widget should have been created with the specified attributes
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Observed Behavior
|
||||||
|
description: What happened instead?
|
||||||
|
placeholder: A TypeError exception was raised
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
11
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -3,7 +3,10 @@ blank_issues_enabled: false
|
|||||||
contact_links:
|
contact_links:
|
||||||
- name: 📖 Contributing Policy
|
- name: 📖 Contributing Policy
|
||||||
url: https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md
|
url: https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md
|
||||||
about: Please read through our contributing policy before opening an issue or pull request
|
about: "Please read through our contributing policy before opening an issue or pull request"
|
||||||
- name: 💬 Discussion Group
|
- name: ❓ Discussion
|
||||||
url: https://groups.google.com/g/netbox-discuss
|
url: https://github.com/netbox-community/netbox/discussions
|
||||||
about: Join our discussion group for assistance with installation issues and other problems
|
about: "If you're just looking for help, try starting a discussion instead"
|
||||||
|
- name: 💬 Community Slack
|
||||||
|
url: https://netdev.chat/
|
||||||
|
about: "Join #netbox on the NetDev Community Slack for assistance with installation issues and other problems"
|
||||||
|
|||||||
28
.github/ISSUE_TEMPLATE/documentation_change.md
vendored
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
name: 📖 Documentation Change
|
|
||||||
about: Suggest an addition or modification to the NetBox documentation
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
NOTE: IF YOUR ISSUE DOES NOT FOLLOW THIS TEMPLATE, IT WILL BE CLOSED.
|
|
||||||
|
|
||||||
Please indicate the nature of the change by placing an X in one of the
|
|
||||||
boxes below.
|
|
||||||
-->
|
|
||||||
### Change Type
|
|
||||||
[ ] Addition
|
|
||||||
[ ] Correction
|
|
||||||
[ ] Deprecation
|
|
||||||
[ ] Cleanup (formatting, typos, etc.)
|
|
||||||
|
|
||||||
### Area
|
|
||||||
[ ] Installation instructions
|
|
||||||
[ ] Configuration parameters
|
|
||||||
[ ] Functionality/features
|
|
||||||
[ ] REST API
|
|
||||||
[ ] Administration/development
|
|
||||||
[ ] Other
|
|
||||||
|
|
||||||
<!-- Describe the proposed change(s). -->
|
|
||||||
### Proposed Changes
|
|
||||||
35
.github/ISSUE_TEMPLATE/documentation_change.yaml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
name: 📖 Documentation Change
|
||||||
|
description: Suggest an addition or modification to the NetBox documentation
|
||||||
|
labels: ["type: documentation"]
|
||||||
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Change Type
|
||||||
|
description: What type of change are you proposing?
|
||||||
|
options:
|
||||||
|
- Addition
|
||||||
|
- Correction
|
||||||
|
- Removal
|
||||||
|
- Cleanup (formatting, typos, etc.)
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Area
|
||||||
|
description: To what section of the documentation does this change primarily pertain?
|
||||||
|
options:
|
||||||
|
- Installation instructions
|
||||||
|
- Configuration parameters
|
||||||
|
- Functionality/features
|
||||||
|
- REST API
|
||||||
|
- Administration/development
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Proposed Changes
|
||||||
|
description: Describe the proposed changes and why they are necessary.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
54
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,54 +0,0 @@
|
|||||||
---
|
|
||||||
name: ✨ Feature Request
|
|
||||||
about: Propose a new NetBox feature or enhancement
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
NOTE: IF YOUR ISSUE DOES NOT FOLLOW THIS TEMPLATE, IT WILL BE CLOSED.
|
|
||||||
|
|
||||||
This form is only for proposing specific new features or enhancements.
|
|
||||||
If you have a general idea or question, please start a discussion instead:
|
|
||||||
https://github.com/netbox-community/netbox/discussions
|
|
||||||
|
|
||||||
NOTE: Due to an excessive backlog of feature requests, we are not currently
|
|
||||||
accepting any proposals which significantly extend NetBox's feature scope.
|
|
||||||
|
|
||||||
Please describe the environment in which you are running NetBox. Be sure
|
|
||||||
that you are running an unmodified instance of the latest stable release
|
|
||||||
before submitting a bug report.
|
|
||||||
-->
|
|
||||||
### Environment
|
|
||||||
* Python version:
|
|
||||||
* NetBox version:
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Describe in detail the new functionality you are proposing. Include any
|
|
||||||
specific changes to work flows, data models, or the user interface.
|
|
||||||
-->
|
|
||||||
### Proposed Functionality
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Convey an example use case for your proposed feature. Write from the
|
|
||||||
perspective of a NetBox user who would benefit from the proposed
|
|
||||||
functionality and describe how.
|
|
||||||
--->
|
|
||||||
### Use Case
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Note any changes to the database schema necessary to support the new
|
|
||||||
feature. For example, does the proposal require adding a new model or
|
|
||||||
field? (Not all new features require database changes.)
|
|
||||||
--->
|
|
||||||
### Database Changes
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
List any new dependencies on external libraries or services that this new
|
|
||||||
feature would introduce. For example, does the proposal require the
|
|
||||||
installation of a new Python package? (Not all new features introduce new
|
|
||||||
dependencies.)
|
|
||||||
-->
|
|
||||||
### External Dependencies
|
|
||||||
57
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
name: ✨ Feature Request
|
||||||
|
description: Propose a new NetBox feature or enhancement
|
||||||
|
labels: ["type: feature"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
**NOTE:** This form is only for submitting well-formed proposals to extend or modify
|
||||||
|
NetBox in some way. If you're trying to solve a problem but can't figure out how, or if
|
||||||
|
you still need time to work on the details of a proposed new feature, please start a
|
||||||
|
[discussion](https://github.com/netbox-community/netbox/discussions) instead.
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: NetBox version
|
||||||
|
description: What version of NetBox are you currently running?
|
||||||
|
placeholder: v3.0.1
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Feature type
|
||||||
|
options:
|
||||||
|
- Data model extension
|
||||||
|
- New functionality
|
||||||
|
- Change to existing functionality
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Proposed functionality
|
||||||
|
description: >
|
||||||
|
Describe in detail the new feature or behavior you'd like to propose. Include any specific
|
||||||
|
changes to work flows, data models, or the user interface.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Use case
|
||||||
|
description: >
|
||||||
|
Explain how adding this functionality would benefit NetBox users. What need does it address?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Database changes
|
||||||
|
description: >
|
||||||
|
Note any changes to the database schema necessary to support the new feature. For example,
|
||||||
|
does the proposal require adding a new model or field? (Not all new features require database
|
||||||
|
changes.)
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: External dependencies
|
||||||
|
description: >
|
||||||
|
List any new dependencies on external libraries or services that this new feature would
|
||||||
|
introduce. For example, does the proposal require the installation of a new Python package?
|
||||||
|
(Not all new features introduce new dependencies.)
|
||||||
16
.github/ISSUE_TEMPLATE/housekeeping.md
vendored
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
name: 🏡 Housekeeping
|
|
||||||
about: A change pertaining to the codebase itself (developers only)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
NOTE: This template is for use by maintainers only. Please do not submit
|
|
||||||
an issue using this template unless you have been specifically asked to
|
|
||||||
do so.
|
|
||||||
-->
|
|
||||||
### Proposed Changes
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Provide justification for the proposed change(s). -->
|
|
||||||
### Justification
|
|
||||||
24
.github/ISSUE_TEMPLATE/housekeeping.yaml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
name: 🏡 Housekeeping
|
||||||
|
description: A change pertaining to the codebase itself (developers only)
|
||||||
|
labels: ["type: housekeeping"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
**NOTE:** This template is for use by maintainers only. Please do not submit
|
||||||
|
an issue using this template unless you have been specifically asked to do so.
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Proposed Changes
|
||||||
|
description: >
|
||||||
|
Describe in detail the new feature or behavior you'd like to propose.
|
||||||
|
Include any specific changes to work flows, data models, or the user interface.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Justification
|
||||||
|
description: Please provide justification for the proposed change(s).
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
33
.github/stale.yml
vendored
@@ -1,33 +0,0 @@
|
|||||||
# Configuration for Stale (https://github.com/apps/stale)
|
|
||||||
|
|
||||||
# Pull requests are exempt from being marked as stale
|
|
||||||
only: issues
|
|
||||||
|
|
||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 45
|
|
||||||
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 15
|
|
||||||
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- "status: accepted"
|
|
||||||
- "status: blocked"
|
|
||||||
- "status: needs milestone"
|
|
||||||
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: "pending closure"
|
|
||||||
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. NetBox
|
|
||||||
is governed by a small group of core maintainers which means not all opened
|
|
||||||
issues may receive direct feedback. Please see our [contributing guide](https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md).
|
|
||||||
|
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
||||||
closeComment: >
|
|
||||||
This issue has been automatically closed due to lack of activity. In an
|
|
||||||
effort to reduce noise, please do not comment any further. Note that the
|
|
||||||
core maintainers may elect to reopen this issue at a later date if deemed
|
|
||||||
necessary.
|
|
||||||
20
.github/workflows/ci.yml
vendored
@@ -5,7 +5,8 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: [3.6, 3.7, 3.8]
|
python-version: [3.7, 3.8, 3.9]
|
||||||
|
node-version: [14.x]
|
||||||
services:
|
services:
|
||||||
redis:
|
redis:
|
||||||
image: redis
|
image: redis
|
||||||
@@ -33,15 +34,30 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
- name: Install dependencies & set up configuration
|
- name: Install dependencies & set up configuration
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
pip install pycodestyle coverage
|
pip install pycodestyle coverage
|
||||||
ln -s configuration.testing.py netbox/netbox/configuration.py
|
ln -s configuration.testing.py netbox/netbox/configuration.py
|
||||||
|
yarn --cwd netbox/project-static
|
||||||
|
|
||||||
|
- name: Build documentation
|
||||||
|
run: mkdocs build
|
||||||
|
|
||||||
|
- name: Collect static files
|
||||||
|
run: python netbox/manage.py collectstatic --no-input
|
||||||
|
|
||||||
- name: Check PEP8 compliance
|
- name: Check PEP8 compliance
|
||||||
run: pycodestyle --ignore=W504,E501 netbox/
|
run: pycodestyle --ignore=W504,E501 --exclude=node_modules netbox/
|
||||||
|
|
||||||
|
- name: Check UI ESLint, TypeScript, and Prettier Compliance
|
||||||
|
run: yarn --cwd netbox/project-static validate
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: coverage run --source="netbox/" netbox/manage.py test netbox/
|
run: coverage run --source="netbox/" netbox/manage.py test netbox/
|
||||||
|
|||||||
35
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# close-stale-issues (https://github.com/marketplace/actions/close-stale-issues)
|
||||||
|
name: 'Close stale issues/PRs'
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 4 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v4
|
||||||
|
with:
|
||||||
|
close-issue-message: >
|
||||||
|
This issue has been automatically closed due to lack of activity. In an
|
||||||
|
effort to reduce noise, please do not comment any further. Note that the
|
||||||
|
core maintainers may elect to reopen this issue at a later date if deemed
|
||||||
|
necessary.
|
||||||
|
close-pr-message: >
|
||||||
|
This PR has been automatically closed due to lack of activity.
|
||||||
|
days-before-stale: 60
|
||||||
|
days-before-close: 30
|
||||||
|
exempt-issue-labels: 'status: accepted,status: blocked,status: needs milestone'
|
||||||
|
operations-per-run: 100
|
||||||
|
remove-stale-when-updated: false
|
||||||
|
stale-issue-label: 'pending closure'
|
||||||
|
stale-issue-message: >
|
||||||
|
This issue has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed if no further activity occurs. NetBox
|
||||||
|
is governed by a small group of core maintainers which means not all opened
|
||||||
|
issues may receive direct feedback. Please see our [contributing guide](https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md).
|
||||||
|
stale-pr-label: 'pending closure'
|
||||||
|
stale-pr-message: >
|
||||||
|
This PR has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed automatically if no further action is
|
||||||
|
taken.
|
||||||
9
.gitignore
vendored
@@ -1,7 +1,16 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
*.swp
|
*.swp
|
||||||
|
node_modules
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
/netbox/project-static/.cache
|
||||||
|
/netbox/project-static/docs/*
|
||||||
|
!/netbox/project-static/docs/.info
|
||||||
/netbox/netbox/configuration.py
|
/netbox/netbox/configuration.py
|
||||||
/netbox/netbox/ldap_config.py
|
/netbox/netbox/ldap_config.py
|
||||||
|
/netbox/project-static/.cache
|
||||||
|
/netbox/project-static/node_modules
|
||||||
/netbox/reports/*
|
/netbox/reports/*
|
||||||
!/netbox/reports/__init__.py
|
!/netbox/reports/__init__.py
|
||||||
/netbox/scripts/*
|
/netbox/scripts/*
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ discussions.
|
|||||||
|
|
||||||
### Slack
|
### Slack
|
||||||
|
|
||||||
For real-time chat, you can join the **#netbox** Slack channel on [NetworkToCode](https://slack.networktocode.com/).
|
For real-time chat, you can join the **#netbox** Slack channel on [NetDev Community](https://netdev.chat/).
|
||||||
Unfortunately, the Slack channel does not provide long-term retention of chat
|
Unfortunately, the Slack channel does not provide long-term retention of chat
|
||||||
history, so try to avoid it for any discussions would benefit from being
|
history, so try to avoid it for any discussions would benefit from being
|
||||||
preserved for future reference.
|
preserved for future reference.
|
||||||
@@ -160,17 +160,20 @@ accumulating a large backlog of work.
|
|||||||
The core maintainers group has chosen to make use of GitHub's [Stale bot](https://github.com/apps/stale)
|
The core maintainers group has chosen to make use of GitHub's [Stale bot](https://github.com/apps/stale)
|
||||||
to aid in issue management.
|
to aid in issue management.
|
||||||
|
|
||||||
* Issues will be marked as stale after 45 days of no activity.
|
* Issues will be marked as stale after 60 days of no activity.
|
||||||
* Then after 15 more days of inactivity, the issue will be closed.
|
* If the stable label is not removed in the following 30 days, the issue will
|
||||||
|
be closed automatically.
|
||||||
* Any issue bearing one of the following labels will be exempt from all Stale
|
* Any issue bearing one of the following labels will be exempt from all Stale
|
||||||
bot actions:
|
bot actions:
|
||||||
* `status: accepted`
|
* `status: accepted`
|
||||||
* `status: blocked`
|
* `status: blocked`
|
||||||
* `status: needs milestone`
|
* `status: needs milestone`
|
||||||
|
|
||||||
It is natural that some new issues get more attention than others. Stale bot
|
It is natural that some new issues get more attention than others. The stale
|
||||||
helps bring renewed attention to potentially valuable issues that may have been
|
bot helps bring renewed attention to potentially valuable issues that may have
|
||||||
overlooked.
|
been overlooked. **Do not** comment on an issue that has been marked stale in
|
||||||
|
an effort to circumvent the bot: Doing so will not remove the stale label.
|
||||||
|
(Stale labels can be removed only by maintainers.)
|
||||||
|
|
||||||
## Maintainer Guidance
|
## Maintainer Guidance
|
||||||
|
|
||||||
@@ -185,11 +188,5 @@ overlooked.
|
|||||||
sync to review agenda items. This meeting provides opportunity to present and
|
sync to review agenda items. This meeting provides opportunity to present and
|
||||||
discuss pressing topics. Meetings are held as virtual audio/video conferences.
|
discuss pressing topics. Meetings are held as virtual audio/video conferences.
|
||||||
|
|
||||||
* Official channels for communication include:
|
|
||||||
|
|
||||||
* GitHub issues, pull requests, and discussions
|
|
||||||
* The [netbox-discuss](https://groups.google.com/g/netbox-discuss) mailing list
|
|
||||||
* The **#netbox** channel on [NetworkToCode Slack](https://networktocode.slack.com/)
|
|
||||||
|
|
||||||
* Maintainers with no substantial recorded activity in a 60-day period will be
|
* Maintainers with no substantial recorded activity in a 60-day period will be
|
||||||
removed from the project.
|
removed from the project.
|
||||||
|
|||||||
61
README.md
@@ -1,7 +1,11 @@
|
|||||||

|
<div align="center">
|
||||||
|
<img src="https://raw.githubusercontent.com/netbox-community/netbox/develop/docs/netbox_logo.svg" width="400" alt="NetBox logo" />
|
||||||
|
</div>
|
||||||
|
|
||||||
NetBox is an IP address management (IPAM) and data center infrastructure
|

|
||||||
management (DCIM) tool. Initially conceived by the network engineering team at
|
|
||||||
|
NetBox is an infrastructure resource modeling (IRM) tool designed to empower
|
||||||
|
network automation. Initially conceived by the network engineering team at
|
||||||
[DigitalOcean](https://www.digitalocean.com/), NetBox was developed specifically
|
[DigitalOcean](https://www.digitalocean.com/), NetBox was developed specifically
|
||||||
to address the needs of network and infrastructure engineers. It is intended to
|
to address the needs of network and infrastructure engineers. It is intended to
|
||||||
function as a domain-specific source of truth for network operations.
|
function as a domain-specific source of truth for network operations.
|
||||||
@@ -10,38 +14,35 @@ NetBox runs as a web application atop the [Django](https://www.djangoproject.com
|
|||||||
Python framework with a [PostgreSQL](https://www.postgresql.org/) database. For a
|
Python framework with a [PostgreSQL](https://www.postgresql.org/) database. For a
|
||||||
complete list of requirements, see `requirements.txt`. The code is available [on GitHub](https://github.com/netbox-community/netbox).
|
complete list of requirements, see `requirements.txt`. The code is available [on GitHub](https://github.com/netbox-community/netbox).
|
||||||
|
|
||||||
The complete documentation for NetBox can be found at [Read the Docs](https://netbox.readthedocs.io/en/stable/).
|
The complete documentation for NetBox can be found at [Read the Docs](https://netbox.readthedocs.io/en/stable/). A public demo instance is available at https://demo.netbox.dev.
|
||||||
|
|
||||||
Questions? Comments? Please start a [discussion on GitHub](https://github.com/netbox-community/netbox/discussions),
|
<div align="center">
|
||||||
or join us in the **#netbox** Slack channel on [NetworkToCode](https://networktocode.slack.com/)!
|
<h4>Thank you to our sponsors!</h4>
|
||||||
|
|
||||||
### Build Status
|
[](https://try.digitalocean.com/developer-cloud)
|
||||||
|
|
||||||
|
[](https://metal.equinix.com/)
|
||||||
|
|
||||||
|
[](https://ns1.com/)
|
||||||
|
<br />
|
||||||
|
[](https://stellar.tech/)
|
||||||
|
|
||||||
| | status |
|
</div>
|
||||||
|-------------|------------|
|
|
||||||
| **master** |  |
|
|
||||||
| **develop** |  |
|
|
||||||
|
|
||||||
### Screenshots
|
### Discussion
|
||||||
|
|
||||||

|
* [GitHub Discussions](https://github.com/netbox-community/netbox/discussions) - Discussion forum hosted by GitHub; ideal for Q&A and other structured discussions
|
||||||
|
* [Slack](https://netdev.chat/) - Real-time chat hosted by the NetDev Community; best for unstructured discussion or just hanging out
|
||||||
|
* [Google Group](https://groups.google.com/g/netbox-discuss) - Legacy mailing list; slowly being replaced by GitHub discussions
|
||||||
|
|
||||||
---
|
### Installation
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Please see [the documentation](https://netbox.readthedocs.io/en/stable/) for
|
Please see [the documentation](https://netbox.readthedocs.io/en/stable/) for
|
||||||
instructions on installing NetBox. To upgrade NetBox, please download the
|
instructions on installing NetBox. To upgrade NetBox, please download the
|
||||||
[latest release](https://github.com/netbox-community/netbox/releases) and
|
[latest release](https://github.com/netbox-community/netbox/releases) and
|
||||||
run `upgrade.sh`.
|
run `upgrade.sh`.
|
||||||
|
|
||||||
## Providing Feedback
|
### Providing Feedback
|
||||||
|
|
||||||
The best platform for general feedback, assistance, and other discussion is our
|
The best platform for general feedback, assistance, and other discussion is our
|
||||||
[GitHub discussions](https://github.com/netbox-community/netbox/discussions).
|
[GitHub discussions](https://github.com/netbox-community/netbox/discussions).
|
||||||
@@ -51,7 +52,19 @@ the [appropriate template](https://github.com/netbox-community/netbox/issues/new
|
|||||||
If you are interested in contributing to the development of NetBox, please read
|
If you are interested in contributing to the development of NetBox, please read
|
||||||
our [contributing guide](CONTRIBUTING.md) prior to beginning any work.
|
our [contributing guide](CONTRIBUTING.md) prior to beginning any work.
|
||||||
|
|
||||||
## Related projects
|
### Screenshots
|
||||||
|
|
||||||
|
")
|
||||||
|
|
||||||
|
")
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Related projects
|
||||||
|
|
||||||
Please see [our wiki](https://github.com/netbox-community/netbox/wiki/Community-Contributions)
|
Please see [our wiki](https://github.com/netbox-community/netbox/wiki/Community-Contributions)
|
||||||
for a list of relevant community projects.
|
for a list of relevant community projects.
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
# https://github.com/django/django
|
# https://github.com/django/django
|
||||||
Django
|
Django
|
||||||
|
|
||||||
# Django caching using Redis
|
|
||||||
# https://github.com/Suor/django-cacheops
|
|
||||||
django-cacheops
|
|
||||||
|
|
||||||
# Django middleware which permits cross-domain API requests
|
# Django middleware which permits cross-domain API requests
|
||||||
# https://github.com/OttoYiu/django-cors-headers
|
# https://github.com/OttoYiu/django-cors-headers
|
||||||
django-cors-headers
|
django-cors-headers
|
||||||
@@ -18,6 +14,10 @@ django-debug-toolbar
|
|||||||
# https://github.com/carltongibson/django-filter
|
# https://github.com/carltongibson/django-filter
|
||||||
django-filter
|
django-filter
|
||||||
|
|
||||||
|
# Django debug toolbar extension with support for GraphiQL
|
||||||
|
# https://github.com/flavors/django-graphiql-debug-toolbar/
|
||||||
|
django-graphiql-debug-toolbar
|
||||||
|
|
||||||
# Modified Preorder Tree Traversal (recursive nesting of objects)
|
# Modified Preorder Tree Traversal (recursive nesting of objects)
|
||||||
# https://github.com/django-mptt/django-mptt
|
# https://github.com/django-mptt/django-mptt
|
||||||
django-mptt
|
django-mptt
|
||||||
@@ -30,6 +30,10 @@ django-pglocks
|
|||||||
# https://github.com/korfuri/django-prometheus
|
# https://github.com/korfuri/django-prometheus
|
||||||
django-prometheus
|
django-prometheus
|
||||||
|
|
||||||
|
# Django chaching backend using Redis
|
||||||
|
# https://github.com/jazzband/django-redis
|
||||||
|
django-redis
|
||||||
|
|
||||||
# Django integration for RQ (Reqis queuing)
|
# Django integration for RQ (Reqis queuing)
|
||||||
# https://github.com/rq/django-rq
|
# https://github.com/rq/django-rq
|
||||||
django-rq
|
django-rq
|
||||||
@@ -54,6 +58,10 @@ djangorestframework
|
|||||||
# https://github.com/axnsan12/drf-yasg
|
# https://github.com/axnsan12/drf-yasg
|
||||||
drf-yasg[validation]
|
drf-yasg[validation]
|
||||||
|
|
||||||
|
# Django wrapper for Graphene (GraphQL support)
|
||||||
|
# https://github.com/graphql-python/graphene-django
|
||||||
|
graphene_django
|
||||||
|
|
||||||
# WSGI HTTP server
|
# WSGI HTTP server
|
||||||
# https://gunicorn.org/
|
# https://gunicorn.org/
|
||||||
gunicorn
|
gunicorn
|
||||||
@@ -66,6 +74,14 @@ Jinja2
|
|||||||
# https://github.com/Python-Markdown/markdown
|
# https://github.com/Python-Markdown/markdown
|
||||||
Markdown
|
Markdown
|
||||||
|
|
||||||
|
# File inclusion plugin for Python-Markdown
|
||||||
|
# https://github.com/cmacmackin/markdown-include
|
||||||
|
markdown-include
|
||||||
|
|
||||||
|
# MkDocs Material theme (for documentation build)
|
||||||
|
# https://github.com/squidfunk/mkdocs-material
|
||||||
|
mkdocs-material
|
||||||
|
|
||||||
# Library for manipulating IP prefixes and addresses
|
# Library for manipulating IP prefixes and addresses
|
||||||
# https://github.com/drkjam/netaddr
|
# https://github.com/drkjam/netaddr
|
||||||
netaddr
|
netaddr
|
||||||
@@ -93,3 +109,7 @@ redis
|
|||||||
# SVG image rendering (used for rack elevations)
|
# SVG image rendering (used for rack elevations)
|
||||||
# https://github.com/mozman/svgwrite
|
# https://github.com/mozman/svgwrite
|
||||||
svgwrite
|
svgwrite
|
||||||
|
|
||||||
|
# Tabular dataset library (for table-based exports)
|
||||||
|
# https://github.com/jazzband/tablib
|
||||||
|
tablib
|
||||||
|
|||||||
9
contrib/netbox-housekeeping.sh
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# This shell script invokes NetBox's housekeeping management command, which
|
||||||
|
# intended to be run nightly. This script can be copied into your system's
|
||||||
|
# daily cron directory (e.g. /etc/cron.daily), or referenced directly from
|
||||||
|
# within the cron configuration file.
|
||||||
|
#
|
||||||
|
# If NetBox has been installed into a nonstandard location, update the paths
|
||||||
|
# below.
|
||||||
|
/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py housekeeping
|
||||||
@@ -11,7 +11,7 @@ User=netbox
|
|||||||
Group=netbox
|
Group=netbox
|
||||||
WorkingDirectory=/opt/netbox
|
WorkingDirectory=/opt/netbox
|
||||||
|
|
||||||
ExecStart=/opt/netbox/venv/bin/python3 /opt/netbox/netbox/manage.py rqworker
|
ExecStart=/opt/netbox/venv/bin/python3 /opt/netbox/netbox/manage.py rqworker high default low
|
||||||
|
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=30
|
RestartSec=30
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
server {
|
server {
|
||||||
listen 443 ssl;
|
listen [::]:443 ssl ipv6only=off;
|
||||||
|
|
||||||
# CHANGE THIS TO YOUR SERVER'S NAME
|
# CHANGE THIS TO YOUR SERVER'S NAME
|
||||||
server_name netbox.example.com;
|
server_name netbox.example.com;
|
||||||
@@ -23,7 +23,7 @@ server {
|
|||||||
|
|
||||||
server {
|
server {
|
||||||
# Redirect HTTP traffic to HTTPS
|
# Redirect HTTP traffic to HTTPS
|
||||||
listen 80;
|
listen [::]:80 ipv6only=off;
|
||||||
server_name _;
|
server_name _;
|
||||||
return 301 https://$host$request_uri;
|
return 301 https://$host$request_uri;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
# Caching
|
|
||||||
|
|
||||||
NetBox supports database query caching using [django-cacheops](https://github.com/Suor/django-cacheops) and Redis. When a query is made, the results are cached in Redis for a short period of time, as defined by the [CACHE_TIMEOUT](../../configuration/optional-settings/#cache_timeout) parameter (15 minutes by default). Within that time, all recurrences of that specific query will return the pre-fetched results from the cache.
|
|
||||||
|
|
||||||
If a change is made to any of the objects returned by the query within that time, or if the timeout expires, the results are automatically invalidated and the next request for those results will be sent to the database.
|
|
||||||
|
|
||||||
## Invalidating Cached Data
|
|
||||||
|
|
||||||
Although caching is performed automatically and rarely requires administrative intervention, NetBox provides the `invalidate` management command to force invalidation of cached results. This command can reference a specific object my its type and numeric ID:
|
|
||||||
|
|
||||||
```no-highlight
|
|
||||||
$ python netbox/manage.py invalidate dcim.Device.34
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, it can also delete all cached results for an object type:
|
|
||||||
|
|
||||||
```no-highlight
|
|
||||||
$ python netbox/manage.py invalidate dcim.Device
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, calling it with the `all` argument will force invalidation of the entire cache database:
|
|
||||||
|
|
||||||
```no-highlight
|
|
||||||
$ python netbox/manage.py invalidate all
|
|
||||||
```
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Change Logging
|
# Change Logging
|
||||||
|
|
||||||
Every time an object in NetBox is created, updated, or deleted, a serialized copy of that object is saved to the database, along with meta data including the current time and the user associated with the change. These records form a persistent record of changes both for each individual object as well as NetBox as a whole. The global change log can be viewed by navigating to Other > Change Log.
|
Every time an object in NetBox is created, updated, or deleted, a serialized copy of that object taken both before and after the change is saved to the database, along with meta data including the current time and the user associated with the change. These records form a persistent record of changes both for each individual object as well as NetBox as a whole. The global change log can be viewed by navigating to Other > Change Log.
|
||||||
|
|
||||||
A serialized representation of the instance being modified is included in JSON format. This is similar to how objects are conveyed within the REST API, but does not include any nested representations. For instance, the `tenant` field of a site will record only the tenant's ID, not a representation of the tenant.
|
A serialized representation of the instance being modified is included in JSON format. This is similar to how objects are conveyed within the REST API, but does not include any nested representations. For instance, the `tenant` field of a site will record only the tenant's ID, not a representation of the tenant.
|
||||||
|
|
||||||
|
|||||||
5
docs/additional-features/journaling.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Journaling
|
||||||
|
|
||||||
|
All primary objects in NetBox support journaling. A journal is a collection of human-generated notes and comments about an object maintained for historical context. It supplements NetBox's change log to provide additional information about why changes have been made or to convey events which occur outside NetBox. Unlike the change log, in which records typically expire after a configurable period of time, journal entries persist for the life of their associated object.
|
||||||
|
|
||||||
|
Each journal entry has a selectable kind (info, success, warning, or danger) and a user-populated `comments` field. Each entry automatically records the date, time, and associated user upon being created.
|
||||||
@@ -1,6 +1,13 @@
|
|||||||
# NAPALM
|
# NAPALM
|
||||||
|
|
||||||
NetBox supports integration with the [NAPALM automation](https://napalm-automation.net/) library. NAPALM allows NetBox to serve a proxy for operational data, fetching live data from network devices and returning it to a requester via its REST API. Note that NetBox does not store any NAPALM data locally.
|
NetBox supports integration with the [NAPALM automation](https://github.com/napalm-automation/napalm) library. NAPALM allows NetBox to serve a proxy for operational data, fetching live data from network devices and returning it to a requester via its REST API. Note that NetBox does not store any NAPALM data locally.
|
||||||
|
|
||||||
|
The NetBox UI will display tabs for status, LLDP neighbors, and configuration under the device view if the following conditions are met:
|
||||||
|
|
||||||
|
* Device status is "Active"
|
||||||
|
* A primary IP has been assigned to the device
|
||||||
|
* A platform with a NAPALM driver has been assigned
|
||||||
|
* The authenticated user has the `dcim.napalm_read_device` permission
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
To enable this integration, the NAPALM library must be installed. See [installation steps](../../installation/3-netbox/#napalm) for more information.
|
To enable this integration, the NAPALM library must be installed. See [installation steps](../../installation/3-netbox/#napalm) for more information.
|
||||||
@@ -22,7 +29,7 @@ GET /api/dcim/devices/1/napalm/?method=get_environment
|
|||||||
|
|
||||||
## Authentication
|
## Authentication
|
||||||
|
|
||||||
By default, the [`NAPALM_USERNAME`](../../configuration/optional-settings/#napalm_username) and [`NAPALM_PASSWORD`](../../configuration/optional-settings/#napalm_password) configuration parameters are used for NAPALM authentication. They can be overridden for an individual API call by specifying the `X-NAPALM-Username` and `X-NAPALM-Password` headers.
|
By default, the [`NAPALM_USERNAME`](../configuration/optional-settings.md#napalm_username) and [`NAPALM_PASSWORD`](../configuration/optional-settings.md#napalm_password) configuration parameters are used for NAPALM authentication. They can be overridden for an individual API call by specifying the `X-NAPALM-Username` and `X-NAPALM-Password` headers.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ curl "http://localhost/api/dcim/devices/1/napalm/?method=get_environment" \
|
$ curl "http://localhost/api/dcim/devices/1/napalm/?method=get_environment" \
|
||||||
|
|||||||
@@ -26,4 +26,4 @@ For the exhaustive list of exposed metrics, visit the `/metrics` endpoint on you
|
|||||||
When deploying NetBox in a multiprocess manner (e.g. running multiple Gunicorn workers) the Prometheus client library requires the use of a shared directory to collect metrics from all worker processes. To configure this, first create or designate a local directory to which the worker processes have read and write access, and then configure your WSGI service (e.g. Gunicorn) to define this path as the `prometheus_multiproc_dir` environment variable.
|
When deploying NetBox in a multiprocess manner (e.g. running multiple Gunicorn workers) the Prometheus client library requires the use of a shared directory to collect metrics from all worker processes. To configure this, first create or designate a local directory to which the worker processes have read and write access, and then configure your WSGI service (e.g. Gunicorn) to define this path as the `prometheus_multiproc_dir` environment variable.
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
If having accurate long-term metrics in a multiprocess environment is crucial to your deployment, it's recommended you use the `uwsgi` library instead of `gunicorn`. The issue lies in the way `gunicorn` tracks worker processes (vs `uwsgi`) which helps manage the metrics files created by the above configurations. If you're using Netbox with gunicorn in a containerized enviroment following the one-process-per-container methodology, then you will likely not need to change to `uwsgi`. More details can be found in [issue #3779](https://github.com/netbox-community/netbox/issues/3779#issuecomment-590547562).
|
If having accurate long-term metrics in a multiprocess environment is crucial to your deployment, it's recommended you use the `uwsgi` library instead of `gunicorn`. The issue lies in the way `gunicorn` tracks worker processes (vs `uwsgi`) which helps manage the metrics files created by the above configurations. If you're using NetBox with gunicorn in a containerized enviroment following the one-process-per-container methodology, then you will likely not need to change to `uwsgi`. More details can be found in [issue #3779](https://github.com/netbox-community/netbox/issues/3779#issuecomment-590547562).
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
# Webhooks
|
# Webhooks
|
||||||
|
|
||||||
A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are configured in the admin UI under Extras > Webhooks.
|
A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are managed under Logging > Webhooks.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Webhooks support the inclusion of user-submitted code to generate custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
@@ -38,7 +41,8 @@ The following data is available as context for Jinja2 templates:
|
|||||||
* `timestamp` - The time at which the event occurred (in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format).
|
* `timestamp` - The time at which the event occurred (in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format).
|
||||||
* `username` - The name of the user account associated with the change.
|
* `username` - The name of the user account associated with the change.
|
||||||
* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request.
|
* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request.
|
||||||
* `data` - A serialized representation of the object _after_ the change was made. This is typically equivalent to the model's representation in NetBox's REST API.
|
* `data` - A detailed representation of the object in its current state. This is typically equivalent to the model's representation in NetBox's REST API.
|
||||||
|
* `snapshots` - Minimal "snapshots" of the object state both before and after the change was made; provided ass a dictionary with keys named `prechange` and `postchange`. These are not as extensive as the fully serialized representation, but contain enough information to convey what has changed.
|
||||||
|
|
||||||
### Default Request Body
|
### Default Request Body
|
||||||
|
|
||||||
@@ -47,7 +51,7 @@ If no body template is specified, the request body will be populated with a JSON
|
|||||||
```no-highlight
|
```no-highlight
|
||||||
{
|
{
|
||||||
"event": "created",
|
"event": "created",
|
||||||
"timestamp": "2020-02-25 15:10:26.010582+00:00",
|
"timestamp": "2021-03-09 17:55:33.968016+00:00",
|
||||||
"model": "site",
|
"model": "site",
|
||||||
"username": "jstretch",
|
"username": "jstretch",
|
||||||
"request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a",
|
"request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a",
|
||||||
@@ -62,13 +66,24 @@ If no body template is specified, the request body will be populated with a JSON
|
|||||||
},
|
},
|
||||||
"region": null,
|
"region": null,
|
||||||
...
|
...
|
||||||
|
},
|
||||||
|
"snapshots": {
|
||||||
|
"prechange": null,
|
||||||
|
"postchange": {
|
||||||
|
"created": "2021-03-09",
|
||||||
|
"last_updated": "2021-03-09T17:55:33.851Z",
|
||||||
|
"name": "Site 1",
|
||||||
|
"slug": "site-1",
|
||||||
|
"status": "active",
|
||||||
|
...
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Webhook Processing
|
## Webhook Processing
|
||||||
|
|
||||||
When a change is detected, any resulting webhooks are placed into a Redis queue for processing. This allows the user's request to complete without needing to wait for the outgoing webhook(s) to be processed. The webhooks are then extracted from the queue by the `rqworker` process and HTTP requests are sent to their respective destinations. The current webhook queue and any failed webhooks can be inspected in the admin UI under Django RQ > Queues.
|
When a change is detected, any resulting webhooks are placed into a Redis queue for processing. This allows the user's request to complete without needing to wait for the outgoing webhook(s) to be processed. The webhooks are then extracted from the queue by the `rqworker` process and HTTP requests are sent to their respective destinations. The current webhook queue and any failed webhooks can be inspected in the admin UI under System > Background Tasks.
|
||||||
|
|
||||||
A request is considered successful if the response has a 2XX status code; otherwise, the request is marked as having failed. Failed requests may be retried manually via the admin UI.
|
A request is considered successful if the response has a 2XX status code; otherwise, the request is marked as having failed. Failed requests may be retried manually via the admin UI.
|
||||||
|
|
||||||
|
|||||||
10
docs/administration/housekeeping.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Housekeeping
|
||||||
|
|
||||||
|
NetBox includes a `housekeeping` management command that should be run nightly. This command handles:
|
||||||
|
|
||||||
|
* Clearing expired authentication sessions from the database
|
||||||
|
* Deleting changelog records older than the configured [retention time](../configuration/optional-settings.md#changelog_retention)
|
||||||
|
|
||||||
|
This command can be invoked directly, or by using the shell script provided at `/opt/netbox/contrib/netbox-housekeeping.sh`. This script can be copied into your cron scheduler's daily jobs directory (e.g. `/etc/cron.daily`) or referenced directly within the cron configuration file.
|
||||||
|
|
||||||
|
The `housekeeping` command can also be run manually at any time: Running the command outside of scheduled execution times will not interfere with its operation.
|
||||||
@@ -11,7 +11,7 @@ This will launch a lightly customized version of [the built-in Django shell](htt
|
|||||||
```
|
```
|
||||||
$ ./manage.py nbshell
|
$ ./manage.py nbshell
|
||||||
### NetBox interactive shell (localhost)
|
### NetBox interactive shell (localhost)
|
||||||
### Python 3.6.9 | Django 2.2.11 | NetBox 2.7.10
|
### Python 3.7.10 | Django 3.2.5 | NetBox 3.0
|
||||||
### lsmodels() will show available models. Use help(<model>) for more info.
|
### lsmodels() will show available models. Use help(<model>) for more info.
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ To delete multiple objects at once, call `delete()` on a filtered queryset. It's
|
|||||||
>>> Device.objects.filter(name__icontains='test').count()
|
>>> Device.objects.filter(name__icontains='test').count()
|
||||||
27
|
27
|
||||||
>>> Device.objects.filter(name__icontains='test').delete()
|
>>> Device.objects.filter(name__icontains='test').delete()
|
||||||
(35, {'dcim.DeviceBay': 0, 'secrets.Secret': 0, 'dcim.InterfaceConnection': 4,
|
(35, {'dcim.DeviceBay': 0, 'dcim.InterfaceConnection': 4,
|
||||||
'extras.ImageAttachment': 0, 'dcim.Device': 27, 'dcim.Interface': 4,
|
'extras.ImageAttachment': 0, 'dcim.Device': 27, 'dcim.Interface': 4,
|
||||||
'dcim.ConsolePort': 0, 'dcim.PowerPort': 0})
|
'dcim.ConsolePort': 0, 'dcim.PowerPort': 0})
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ NetBox v2.9 introduced a new object-based permissions framework, which replace's
|
|||||||
| ----------- | ----------- |
|
| ----------- | ----------- |
|
||||||
| `{"status": "active"}` | Status is active |
|
| `{"status": "active"}` | Status is active |
|
||||||
| `{"status__in": ["planned", "reserved"]}` | Status is active **OR** reserved |
|
| `{"status__in": ["planned", "reserved"]}` | Status is active **OR** reserved |
|
||||||
| `{"status": "active", "role": "testing"}` | Status is active **OR** role is testing |
|
| `{"status": "active", "role": "testing"}` | Status is active **AND** role is testing |
|
||||||
| `{"name__startswith": "Foo"}` | Name starts with "Foo" (case-sensitive) |
|
| `{"name__startswith": "Foo"}` | Name starts with "Foo" (case-sensitive) |
|
||||||
| `{"name__iendswith": "bar"}` | Name ends with "bar" (case-insensitive) |
|
| `{"name__iendswith": "bar"}` | Name ends with "bar" (case-insensitive) |
|
||||||
| `{"vid__gte": 100, "vid__lt": 200}` | VLAN ID is greater than or equal to 100 **AND** less than 200 |
|
| `{"vid__gte": 100, "vid__lt": 200}` | VLAN ID is greater than or equal to 100 **AND** less than 200 |
|
||||||
|
|||||||
@@ -12,13 +12,16 @@ NetBox employs a [PostgreSQL](https://www.postgresql.org/) database, so general
|
|||||||
Use the `pg_dump` utility to export the entire database to a file:
|
Use the `pg_dump` utility to export the entire database to a file:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
pg_dump netbox > netbox.sql
|
pg_dump --username netbox --password --host localhost netbox > netbox.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
You may need to change the username, host, and/or database in the command above to match your installation.
|
||||||
|
|
||||||
When replicating a production database for development purposes, you may find it convenient to exclude changelog data, which can easily account for the bulk of a database's size. To do this, exclude the `extras_objectchange` table data from the export. The table will still be included in the output file, but will not be populated with any data.
|
When replicating a production database for development purposes, you may find it convenient to exclude changelog data, which can easily account for the bulk of a database's size. To do this, exclude the `extras_objectchange` table data from the export. The table will still be included in the output file, but will not be populated with any data.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
pg_dump --exclude-table-data=extras_objectchange netbox > netbox.sql
|
pg_dump ... --exclude-table-data=extras_objectchange netbox > netbox.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
### Load an Exported Database
|
### Load an Exported Database
|
||||||
@@ -41,7 +44,7 @@ Keep in mind that PostgreSQL user accounts and permissions are not included with
|
|||||||
If you want to export only the database schema, and not the data itself (e.g. for development reference), do the following:
|
If you want to export only the database schema, and not the data itself (e.g. for development reference), do the following:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
pg_dump -s netbox > netbox_schema.sql
|
pg_dump --username netbox --password --host localhost -s netbox > netbox_schema.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -52,14 +52,6 @@ BASE_PATH = 'netbox/'
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CACHE_TIMEOUT
|
|
||||||
|
|
||||||
Default: 900
|
|
||||||
|
|
||||||
The number of seconds to cache entries will be retained before expiring.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## CHANGELOG_RETENTION
|
## CHANGELOG_RETENTION
|
||||||
|
|
||||||
Default: 90
|
Default: 90
|
||||||
@@ -96,6 +88,22 @@ CORS_ORIGIN_WHITELIST = [
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## CUSTOM_VALIDATORS
|
||||||
|
|
||||||
|
This is a mapping of models to [custom validators](../customization/custom-validation.md) that have been defined locally to enforce custom validation logic. An example is provided below:
|
||||||
|
|
||||||
|
```python
|
||||||
|
CUSTOM_VALIDATORS = {
|
||||||
|
'dcim.site': (
|
||||||
|
Validator1,
|
||||||
|
Validator2,
|
||||||
|
Validator3
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## DEBUG
|
## DEBUG
|
||||||
|
|
||||||
Default: False
|
Default: False
|
||||||
@@ -144,7 +152,7 @@ In order to send email, NetBox needs an email server configured. The following i
|
|||||||
!!! note
|
!!! note
|
||||||
The `USE_SSL` and `USE_TLS` parameters are mutually exclusive.
|
The `USE_SSL` and `USE_TLS` parameters are mutually exclusive.
|
||||||
|
|
||||||
Email is sent from NetBox only for critical events or if configured for [logging](#logging). If you would like to test the email server configuration, Django provides a convenient [send_mail()](https://docs.djangoproject.com/en/stable/topics/email/#send-mail) fuction accessible within the NetBox shell:
|
Email is sent from NetBox only for critical events or if configured for [logging](#logging). If you would like to test the email server configuration, Django provides a convenient [send_mail()](https://docs.djangoproject.com/en/stable/topics/email/#send-mail) function accessible within the NetBox shell:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
# python ./manage.py nbshell
|
# python ./manage.py nbshell
|
||||||
@@ -195,6 +203,14 @@ EXEMPT_VIEW_PERMISSIONS = ['*']
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## GRAPHQL_ENABLED
|
||||||
|
|
||||||
|
Default: True
|
||||||
|
|
||||||
|
Setting this to False will disable the GraphQL API.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## HTTP_PROXIES
|
## HTTP_PROXIES
|
||||||
|
|
||||||
Default: None
|
Default: None
|
||||||
@@ -257,11 +273,21 @@ LOGGING = {
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## LOGIN_PERSISTENCE
|
||||||
|
|
||||||
|
Default: False
|
||||||
|
|
||||||
|
If true, the lifetime of a user's authentication session will be automatically reset upon each valid request. For example, if [`LOGIN_TIMEOUT`](#login_timeout) is configured to 14 days (the default), and a user whose session is due to expire in five days makes a NetBox request (with a valid session cookie), the session's lifetime will be reset to 14 days.
|
||||||
|
|
||||||
|
Note that enabling this setting causes NetBox to update a user's session in the database (or file, as configured per [`SESSION_FILE_PATH`](#session_file_path)) with each request, which may introduce significant overhead in very active environments. It also permits an active user to remain authenticated to NetBox indefinitely.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## LOGIN_REQUIRED
|
## LOGIN_REQUIRED
|
||||||
|
|
||||||
Default: False
|
Default: False
|
||||||
|
|
||||||
Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users are permitted to access most data in NetBox (excluding secrets) but not make any changes.
|
Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users are permitted to access most data in NetBox but not make any changes.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -281,6 +307,14 @@ Setting this to True will display a "maintenance mode" banner at the top of ever
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## MAPS_URL
|
||||||
|
|
||||||
|
Default: `https://maps.google.com/?q=` (Google Maps)
|
||||||
|
|
||||||
|
This specifies the URL to use when presenting a map of a physical location by street address or GPS coordinates. The URL must accept either a free-form street address or a comma-separated pair of numeric coordinates appended to it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## MAX_PAGE_SIZE
|
## MAX_PAGE_SIZE
|
||||||
|
|
||||||
Default: 1000
|
Default: 1000
|
||||||
@@ -301,7 +335,7 @@ The file path to the location where media files (such as image attachments) are
|
|||||||
|
|
||||||
Default: False
|
Default: False
|
||||||
|
|
||||||
Toggle the availability Prometheus-compatible metrics at `/metrics`. See the [Prometheus Metrics](../../additional-features/prometheus-metrics/) documentation for more details.
|
Toggle the availability Prometheus-compatible metrics at `/metrics`. See the [Prometheus Metrics](../additional-features/prometheus-metrics.md) documentation for more details.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -309,7 +343,7 @@ Toggle the availability Prometheus-compatible metrics at `/metrics`. See the [Pr
|
|||||||
|
|
||||||
## NAPALM_PASSWORD
|
## NAPALM_PASSWORD
|
||||||
|
|
||||||
NetBox will use these credentials when authenticating to remote devices via the [NAPALM library](https://napalm-automation.net/), if installed. Both parameters are optional.
|
NetBox will use these credentials when authenticating to remote devices via the supported [NAPALM integration](../additional-features/napalm.md), if installed. Both parameters are optional.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
If SSH public key authentication has been set up on the remote device(s) for the system account under which NetBox runs, these parameters are not needed.
|
If SSH public key authentication has been set up on the remote device(s) for the system account under which NetBox runs, these parameters are not needed.
|
||||||
@@ -464,19 +498,11 @@ When remote user authentication is in use, this is the name of the HTTP header w
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## RELEASE_CHECK_TIMEOUT
|
|
||||||
|
|
||||||
Default: 86,400 (24 hours)
|
|
||||||
|
|
||||||
The number of seconds to retain the latest version that is fetched from the GitHub API before automatically invalidating it and fetching it from the API again. This must be set to at least one hour (3600 seconds).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## RELEASE_CHECK_URL
|
## RELEASE_CHECK_URL
|
||||||
|
|
||||||
Default: None (disabled)
|
Default: None (disabled)
|
||||||
|
|
||||||
This parameter defines the URL of the repository that will be checked periodically for new NetBox releases. When a new release is detected, a message will be displayed to administrative users on the home page. This can be set to the official repository (`'https://api.github.com/repos/netbox-community/netbox/releases'`) or a custom fork. Set this to `None` to disable automatic update checks.
|
This parameter defines the URL of the repository that will be checked for new NetBox releases. When a new release is detected, a message will be displayed to administrative users on the home page. This can be set to the official repository (`'https://api.github.com/repos/netbox-community/netbox/releases'`) or a custom fork. Set this to `None` to disable automatic update checks.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
The URL provided **must** be compatible with the [GitHub REST API](https://docs.github.com/en/rest).
|
The URL provided **must** be compatible with the [GitHub REST API](https://docs.github.com/en/rest).
|
||||||
@@ -487,7 +513,7 @@ This parameter defines the URL of the repository that will be checked periodical
|
|||||||
|
|
||||||
Default: `$INSTALL_ROOT/netbox/reports/`
|
Default: `$INSTALL_ROOT/netbox/reports/`
|
||||||
|
|
||||||
The file path to the location where custom reports will be kept. By default, this is the `netbox/reports/` directory within the base NetBox installation path.
|
The file path to the location where [custom reports](../customization/reports.md) will be kept. By default, this is the `netbox/reports/` directory within the base NetBox installation path.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -503,7 +529,15 @@ The maximum execution time of a background task (such as running a custom script
|
|||||||
|
|
||||||
Default: `$INSTALL_ROOT/netbox/scripts/`
|
Default: `$INSTALL_ROOT/netbox/scripts/`
|
||||||
|
|
||||||
The file path to the location where custom scripts will be kept. By default, this is the `netbox/scripts/` directory within the base NetBox installation path.
|
The file path to the location where [custom scripts](../customization/custom-scripts.md) will be kept. By default, this is the `netbox/scripts/` directory within the base NetBox installation path.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SESSION_COOKIE_NAME
|
||||||
|
|
||||||
|
Default: `sessionid`
|
||||||
|
|
||||||
|
The name used for the session cookie. See the [Django documentation](https://docs.djangoproject.com/en/stable/ref/settings/#session-cookie-name) for more detail.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
This is a list of valid fully-qualified domain names (FQDNs) and/or IP addresses that can be used to reach the NetBox service. Usually this is the same as the hostname for the NetBox server, but can also be different; for example, when using a reverse proxy serving the NetBox website under a different FQDN than the hostname of the NetBox server. To help guard against [HTTP Host header attackes](https://docs.djangoproject.com/en/3.0/topics/security/#host-headers-virtual-hosting), NetBox will not permit access to the server via any other hostnames (or IPs).
|
This is a list of valid fully-qualified domain names (FQDNs) and/or IP addresses that can be used to reach the NetBox service. Usually this is the same as the hostname for the NetBox server, but can also be different; for example, when using a reverse proxy serving the NetBox website under a different FQDN than the hostname of the NetBox server. To help guard against [HTTP Host header attackes](https://docs.djangoproject.com/en/3.0/topics/security/#host-headers-virtual-hosting), NetBox will not permit access to the server via any other hostnames (or IPs).
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
This parameter must always be defined as a list or tuple, even if only value is provided.
|
This parameter must always be defined as a list or tuple, even if only a single value is provided.
|
||||||
|
|
||||||
The value of this option is also used to set `CSRF_TRUSTED_ORIGINS`, which restricts POST requests to the same set of hosts (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-CSRF_TRUSTED_ORIGINS)). Keep in mind that NetBox, by default, sets `USE_X_FORWARDED_HOST` to true, which means that if you're using a reverse proxy, it's the FQDN used to reach that reverse proxy which needs to be in this list (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts)).
|
The value of this option is also used to set `CSRF_TRUSTED_ORIGINS`, which restricts POST requests to the same set of hosts (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-CSRF_TRUSTED_ORIGINS)). Keep in mind that NetBox, by default, sets `USE_X_FORWARDED_HOST` to true, which means that if you're using a reverse proxy, it's the FQDN used to reach that reverse proxy which needs to be in this list (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts)).
|
||||||
|
|
||||||
@@ -66,6 +66,7 @@ Redis is configured using a configuration setting similar to `DATABASE` and thes
|
|||||||
* `PASSWORD` - Redis password (if set)
|
* `PASSWORD` - Redis password (if set)
|
||||||
* `DATABASE` - Numeric database ID
|
* `DATABASE` - Numeric database ID
|
||||||
* `SSL` - Use SSL connection to Redis
|
* `SSL` - Use SSL connection to Redis
|
||||||
|
* `INSECURE_SKIP_TLS_VERIFY` - Set to `True` to **disable** TLS certificate verification (not recommended)
|
||||||
|
|
||||||
An example configuration is provided below:
|
An example configuration is provided below:
|
||||||
|
|
||||||
@@ -101,7 +102,7 @@ REDIS = {
|
|||||||
|
|
||||||
If you are using [Redis Sentinel](https://redis.io/topics/sentinel) for high-availability purposes, there is minimal
|
If you are using [Redis Sentinel](https://redis.io/topics/sentinel) for high-availability purposes, there is minimal
|
||||||
configuration necessary to convert NetBox to recognize it. It requires the removal of the `HOST` and `PORT` keys from
|
configuration necessary to convert NetBox to recognize it. It requires the removal of the `HOST` and `PORT` keys from
|
||||||
above and the addition of two new keys.
|
above and the addition of three new keys.
|
||||||
|
|
||||||
* `SENTINELS`: List of tuples or tuple of tuples with each inner tuple containing the name or IP address
|
* `SENTINELS`: List of tuples or tuple of tuples with each inner tuple containing the name or IP address
|
||||||
of the Redis server and port for each sentinel instance to connect to
|
of the Redis server and port for each sentinel instance to connect to
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# Circuits
|
# Circuits
|
||||||
|
|
||||||
{!docs/models/circuits/provider.md!}
|
{!docs/models/circuits/provider.md!}
|
||||||
|
{!docs/models/circuits/providernetwork.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
## Device Components
|
## Device Components
|
||||||
|
|
||||||
|
Device components represent discrete objects within a device which are used to terminate cables, house child devices, or track resources.
|
||||||
|
|
||||||
{!docs/models/dcim/consoleport.md!}
|
{!docs/models/dcim/consoleport.md!}
|
||||||
{!docs/models/dcim/consoleserverport.md!}
|
{!docs/models/dcim/consoleserverport.md!}
|
||||||
{!docs/models/dcim/powerport.md!}
|
{!docs/models/dcim/powerport.md!}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{!docs/models/ipam/iprange.md!}
|
||||||
{!docs/models/ipam/ipaddress.md!}
|
{!docs/models/ipam/ipaddress.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
# Secrets
|
|
||||||
|
|
||||||
{!docs/models/secrets/secret.md!}
|
|
||||||
{!docs/models/secrets/secretrole.md!}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
{!docs/models/secrets/userkey.md!}
|
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
# Sites and Racks
|
# Sites and Racks
|
||||||
|
|
||||||
{!docs/models/dcim/site.md!}
|
|
||||||
{!docs/models/dcim/region.md!}
|
{!docs/models/dcim/region.md!}
|
||||||
|
{!docs/models/dcim/sitegroup.md!}
|
||||||
|
{!docs/models/dcim/site.md!}
|
||||||
|
{!docs/models/dcim/location.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/dcim/rack.md!}
|
{!docs/models/dcim/rack.md!}
|
||||||
{!docs/models/dcim/rackgroup.md!}
|
|
||||||
{!docs/models/dcim/rackrole.md!}
|
{!docs/models/dcim/rackrole.md!}
|
||||||
{!docs/models/dcim/rackreservation.md!}
|
{!docs/models/dcim/rackreservation.md!}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Within the database, custom fields are stored as JSON data directly alongside ea
|
|||||||
|
|
||||||
## Creating Custom Fields
|
## Creating Custom Fields
|
||||||
|
|
||||||
Custom fields must be created through the admin UI under Extras > Custom Fields. NetBox supports six types of custom field:
|
Custom fields may be created by navigating to Customization > Custom Fields. NetBox supports six types of custom field:
|
||||||
|
|
||||||
* Text: Free-form text (up to 255 characters)
|
* Text: Free-form text (up to 255 characters)
|
||||||
* Integer: A whole number (positive or negative)
|
* Integer: A whole number (positive or negative)
|
||||||
@@ -16,6 +16,7 @@ Custom fields must be created through the admin UI under Extras > Custom Fields.
|
|||||||
* Date: A date in ISO 8601 format (YYYY-MM-DD)
|
* Date: A date in ISO 8601 format (YYYY-MM-DD)
|
||||||
* URL: This will be presented as a link in the web UI
|
* URL: This will be presented as a link in the web UI
|
||||||
* Selection: A selection of one of several pre-defined custom choices
|
* Selection: A selection of one of several pre-defined custom choices
|
||||||
|
* Multiple selection: A selection field which supports the assignment of multiple values
|
||||||
|
|
||||||
Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form.
|
Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form.
|
||||||
|
|
||||||
@@ -23,7 +24,7 @@ Marking a field as required will force the user to provide a value for the field
|
|||||||
|
|
||||||
The filter logic controls how values are matched when filtering objects by the custom field. Loose filtering (the default) matches on a partial value, whereas exact matching requires a complete match of the given string to a field's value. For example, exact filtering with the string "red" will only match the exact value "red", whereas loose filtering will match on the values "red", "red-orange", or "bored". Setting the filter logic to "disabled" disables filtering by the field entirely.
|
The filter logic controls how values are matched when filtering objects by the custom field. Loose filtering (the default) matches on a partial value, whereas exact matching requires a complete match of the given string to a field's value. For example, exact filtering with the string "red" will only match the exact value "red", whereas loose filtering will match on the values "red", "red-orange", or "bored". Setting the filter logic to "disabled" disables filtering by the field entirely.
|
||||||
|
|
||||||
A custom field must be assigned to one or object types, or models, in NetBox. Once created, custom fields will automatically appear as part of these models in the web UI and REST API. Note that not all models support custom fields.
|
A custom field must be assigned to one or more object types, or models, in NetBox. Once created, custom fields will automatically appear as part of these models in the web UI and REST API. Note that not all models support custom fields.
|
||||||
|
|
||||||
### Custom Field Validation
|
### Custom Field Validation
|
||||||
|
|
||||||
@@ -37,7 +38,13 @@ NetBox supports limited custom validation for custom field values. Following are
|
|||||||
|
|
||||||
Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible.
|
Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible.
|
||||||
|
|
||||||
If a default value is specified for a selection field, it must exactly match one of the provided choices.
|
If a default value is specified for a selection field, it must exactly match one of the provided choices. The value of a multiple selection field will always return a list, even if only one value is selected.
|
||||||
|
|
||||||
|
## Custom Fields in Templates
|
||||||
|
|
||||||
|
Several features within NetBox, such as export templates and webhooks, utilize Jinja2 templating. For convenience, objects which support custom field assignment expose custom field data through the `cf` property. This is a bit cleaner than accessing custom field data through the actual field (`custom_field_data`).
|
||||||
|
|
||||||
|
For example, a custom field named `foo123` on the Site model is accessible on an instance as `{{ site.cf.foo123 }}`.
|
||||||
|
|
||||||
## Custom Fields and the REST API
|
## Custom Fields and the REST API
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# Custom Links
|
# Custom Links
|
||||||
|
|
||||||
Custom links allow users to display arbitrary hyperlinks to external content within NetBox object views. These are helpful for cross-referencing related records in systems outside of NetBox. For example, you might create a custom link on the device view which links to the current device in a network monitoring system.
|
Custom links allow users to display arbitrary hyperlinks to external content within NetBox object views. These are helpful for cross-referencing related records in systems outside NetBox. For example, you might create a custom link on the device view which links to the current device in a network monitoring system.
|
||||||
|
|
||||||
Custom links are created under the admin UI. Each link is associated with a particular NetBox object type (site, device, prefix, etc.) and will be displayed on relevant views. Each link is assigned text and a URL, both of which support Jinja2 templating. The text and URL are rendered with the context variable `obj` representing the current object.
|
Custom links are created by navigating to Customization > Custom Links. Each link is associated with a particular NetBox object type (site, device, prefix, etc.) and will be displayed on relevant views. Each link is assigned text and a URL, both of which support Jinja2 templating. The text and URL are rendered with the context variable `obj` representing the current object.
|
||||||
|
|
||||||
For example, you might define a link like this:
|
For example, you might define a link like this:
|
||||||
|
|
||||||
@@ -15,7 +15,10 @@ When viewing a device named Router4, this link would render as:
|
|||||||
<a href="https://nms.example.com/nodes/?name=Router4">View NMS</a>
|
<a href="https://nms.example.com/nodes/?name=Router4">View NMS</a>
|
||||||
```
|
```
|
||||||
|
|
||||||
Custom links appear as buttons at the top right corner of the page. Numeric weighting can be used to influence the ordering of links.
|
Custom links appear as buttons in the top right corner of the page. Numeric weighting can be used to influence the ordering of links.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Custom links rely on user-created code to generate arbitrary HTML output, which may be dangerous. Only grant permission to create or modify custom links to trusted users.
|
||||||
|
|
||||||
## Context Data
|
## Context Data
|
||||||
|
|
||||||
@@ -170,19 +170,9 @@ Similar to `ChoiceVar`, but allows for the selection of multiple choices.
|
|||||||
A particular object within NetBox. Each ObjectVar must specify a particular model, and allows the user to select one of the available instances. ObjectVar accepts several arguments, listed below.
|
A particular object within NetBox. Each ObjectVar must specify a particular model, and allows the user to select one of the available instances. ObjectVar accepts several arguments, listed below.
|
||||||
|
|
||||||
* `model` - The model class
|
* `model` - The model class
|
||||||
* `display_field` - The name of the REST API object field to display in the selection list (default: `'name'`)
|
|
||||||
* `query_params` - A dictionary of query parameters to use when retrieving available options (optional)
|
* `query_params` - A dictionary of query parameters to use when retrieving available options (optional)
|
||||||
* `null_option` - A label representing a "null" or empty choice (optional)
|
* `null_option` - A label representing a "null" or empty choice (optional)
|
||||||
|
|
||||||
The `display_field` argument is useful when referencing a model which does not have a `name` field. For example, when displaying a list of device types, you would likely use the `model` field:
|
|
||||||
|
|
||||||
```python
|
|
||||||
device_type = ObjectVar(
|
|
||||||
model=DeviceType,
|
|
||||||
display_field='model'
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
To limit the selections available within the list, additional query parameters can be passed as the `query_params` dictionary. For example, to show only devices with an "active" status:
|
To limit the selections available within the list, additional query parameters can be passed as the `query_params` dictionary. For example, to show only devices with an "active" status:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
@@ -293,7 +283,6 @@ class NewBranchScript(Script):
|
|||||||
switch_model = ObjectVar(
|
switch_model = ObjectVar(
|
||||||
description="Access switch model",
|
description="Access switch model",
|
||||||
model=DeviceType,
|
model=DeviceType,
|
||||||
display_field='model',
|
|
||||||
query_params={
|
query_params={
|
||||||
'manufacturer_id': '$manufacturer'
|
'manufacturer_id': '$manufacturer'
|
||||||
}
|
}
|
||||||
86
docs/customization/custom-validation.md
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
# Custom Validation
|
||||||
|
|
||||||
|
NetBox validates every object prior to it being written to the database to ensure data integrity. This validation includes things like checking for proper formatting and that references to related objects are valid. However, you may wish to supplement this validation with some rules of your own. For example, perhaps you require that every site's name conforms to a specific pattern. This can be done using NetBox's `CustomValidator` class.
|
||||||
|
|
||||||
|
## CustomValidator
|
||||||
|
|
||||||
|
### Validation Rules
|
||||||
|
|
||||||
|
A custom validator can be instantiated by passing a mapping of attributes to a set of rules to which that attribute must conform. For example:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from extras.validators import CustomValidator
|
||||||
|
|
||||||
|
CustomValidator({
|
||||||
|
'name': {
|
||||||
|
'min_length': 5,
|
||||||
|
'max_length': 30,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
This defines a custom validator which checks that the length of the `name` attribute for an object is at least five characters long, and no longer than 30 characters. This validation is executed _after_ NetBox has performed its own internal validation.
|
||||||
|
|
||||||
|
The `CustomValidator` class supports several validation types:
|
||||||
|
|
||||||
|
* `min`: Minimum value
|
||||||
|
* `max`: Maximum value
|
||||||
|
* `min_length`: Minimum string length
|
||||||
|
* `max_length`: Maximum string length
|
||||||
|
* `regex`: Application of a [regular expression](https://en.wikipedia.org/wiki/Regular_expression)
|
||||||
|
* `required`: A value must be specified
|
||||||
|
* `prohibited`: A value must _not_ be specified
|
||||||
|
|
||||||
|
The `min` and `max` types should be defined for numeric values, whereas `min_length`, `max_length`, and `regex` are suitable for character strings (text values). The `required` and `prohibited` validators may be used for any field, and should be passed a value of `True`.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Bear in mind that these validators merely supplement NetBox's own validation: They will not override it. For example, if a certain model field is required by NetBox, setting a validator for it with `{'prohibited': True}` will not work.
|
||||||
|
|
||||||
|
### Custom Validation Logic
|
||||||
|
|
||||||
|
There may be instances where the provided validation types are insufficient. The `CustomValidator` class can be extended to enforce arbitrary validation logic by overriding its `validate()` method, and calling `fail()` when an unsatisfactory condition is detected.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from extras.validators import CustomValidator
|
||||||
|
|
||||||
|
class MyValidator(CustomValidator):
|
||||||
|
def validate(self, instance):
|
||||||
|
if instance.status == 'active' and not instance.description:
|
||||||
|
self.fail("Active sites must have a description set!", field='status')
|
||||||
|
```
|
||||||
|
|
||||||
|
The `fail()` method may optionally specify a field with which to associate the supplied error message. If specified, the error message will appear to the user as associated with this field. If omitted, the error message will not be associated with any field.
|
||||||
|
|
||||||
|
## Assigning Custom Validators
|
||||||
|
|
||||||
|
Custom validators are associated with specific NetBox models under the [CUSTOM_VALIDATORS](../configuration/optional-settings.md#custom_validators) configuration parameter, as such:
|
||||||
|
|
||||||
|
```python
|
||||||
|
CUSTOM_VALIDATORS = {
|
||||||
|
'dcim.site': (
|
||||||
|
Validator1,
|
||||||
|
Validator2,
|
||||||
|
Validator3
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Even if defining only a single validator, it must be passed as an iterable.
|
||||||
|
|
||||||
|
When it is not necessary to define a custom `validate()` method, you may opt to pass a `CustomValidator` instance directly:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from extras.validators import CustomValidator
|
||||||
|
|
||||||
|
CUSTOM_VALIDATORS = {
|
||||||
|
'dcim.site': (
|
||||||
|
CustomValidator({
|
||||||
|
'name': {
|
||||||
|
'min_length': 5,
|
||||||
|
'max_length': 30,
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -1,11 +1,17 @@
|
|||||||
# Export Templates
|
# Export Templates
|
||||||
|
|
||||||
NetBox allows users to define custom templates that can be used when exporting objects. To create an export template, navigate to Extras > Export Templates under the admin interface.
|
NetBox allows users to define custom templates that can be used when exporting objects. To create an export template, navigate to Customization > Export Templates.
|
||||||
|
|
||||||
Each export template is associated with a certain type of object. For instance, if you create an export template for VLANs, your custom template will appear under the "Export" button on the VLANs list.
|
Each export template is associated with a certain type of object. For instance, if you create an export template for VLANs, your custom template will appear under the "Export" button on the VLANs list. Each export template must have a name, and may optionally designate a specific export [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) and/or file extension.
|
||||||
|
|
||||||
Export templates must be written in [Jinja2](https://jinja.palletsprojects.com/).
|
Export templates must be written in [Jinja2](https://jinja.palletsprojects.com/).
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
The name `table` is reserved for internal use.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Export templates are rendered using user-submitted code, which may pose security risks under certain conditions. Only grant permission to create or modify export templates to trusted users.
|
||||||
|
|
||||||
The list of objects returned from the database when rendering an export template is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example:
|
The list of objects returned from the database when rendering an export template is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example:
|
||||||
|
|
||||||
```jinja2
|
```jinja2
|
||||||
@@ -18,8 +24,28 @@ Height: {{ rack.u_height }}U
|
|||||||
|
|
||||||
To access custom fields of an object within a template, use the `cf` attribute. For example, `{{ obj.cf.color }}` will return the value (if any) for a custom field named `color` on `obj`.
|
To access custom fields of an object within a template, use the `cf` attribute. For example, `{{ obj.cf.color }}` will return the value (if any) for a custom field named `color` on `obj`.
|
||||||
|
|
||||||
|
If you need to use the config context data in an export template, you'll should use the function `get_config_context` to get all the config context data. For example:
|
||||||
|
```
|
||||||
|
{% for server in queryset %}
|
||||||
|
{% set data = server.get_config_context() %}
|
||||||
|
{{ data.syslog }}
|
||||||
|
{% endfor %}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `as_attachment` attribute of an export template controls its behavior when rendered. If true, the rendered content will be returned to the user as a downloadable file. If false, it will be displayed within the browser. (This may be handy e.g. for generating HTML content.)
|
||||||
|
|
||||||
A MIME type and file extension can optionally be defined for each export template. The default MIME type is `text/plain`.
|
A MIME type and file extension can optionally be defined for each export template. The default MIME type is `text/plain`.
|
||||||
|
|
||||||
|
## REST API Integration
|
||||||
|
|
||||||
|
When it is necessary to provide authentication credentials (such as when [`LOGIN_REQUIRED`](../configuration/optional-settings.md#login_required) has been enabled), it is recommended to render export templates via the REST API. This allows the client to specify an authentication token. To render an export template via the REST API, make a `GET` request to the model's list endpoint and append the `export` parameter specifying the export template name. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /api/dcim/sites/?export=MyTemplateName
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the body of the response will contain only the rendered export template content, as opposed to a JSON object or list.
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
Here's an example device export template that will generate a simple Nagios configuration from a list of devices.
|
Here's an example device export template that will generate a simple Nagios configuration from a list of devices.
|
||||||
@@ -12,7 +12,7 @@ A NetBox report is a mechanism for validating the integrity of data within NetBo
|
|||||||
|
|
||||||
## Writing Reports
|
## Writing Reports
|
||||||
|
|
||||||
Reports must be saved as files in the [`REPORTS_ROOT`](../../configuration/optional-settings/#reports_root) path (which defaults to `netbox/reports/`). Each file created within this path is considered a separate module. Each module holds one or more reports (Python classes), each of which performs a certain function. The logic of each report is broken into discrete test methods, each of which applies a small portion of the logic comprising the overall test.
|
Reports must be saved as files in the [`REPORTS_ROOT`](../configuration/optional-settings.md#reports_root) path (which defaults to `netbox/reports/`). Each file created within this path is considered a separate module. Each module holds one or more reports (Python classes), each of which performs a certain function. The logic of each report is broken into discrete test methods, each of which applies a small portion of the logic comprising the overall test.
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
The reports path includes a file named `__init__.py`, which registers the path as a Python module. Do not delete this file.
|
The reports path includes a file named `__init__.py`, which registers the path as a Python module. Do not delete this file.
|
||||||
@@ -66,7 +66,7 @@ class DeviceConnectionsReport(Report):
|
|||||||
for power_port in PowerPort.objects.filter(device=device):
|
for power_port in PowerPort.objects.filter(device=device):
|
||||||
if power_port.connected_endpoint is not None:
|
if power_port.connected_endpoint is not None:
|
||||||
connected_ports += 1
|
connected_ports += 1
|
||||||
if not power_port.connection_status:
|
if not power_port.path.is_active:
|
||||||
self.log_warning(
|
self.log_warning(
|
||||||
device,
|
device,
|
||||||
"Power connection for {} marked as planned".format(power_port.name)
|
"Power connection for {} marked as planned".format(power_port.name)
|
||||||
@@ -80,7 +80,7 @@ class DeviceConnectionsReport(Report):
|
|||||||
self.log_success(device)
|
self.log_success(device)
|
||||||
```
|
```
|
||||||
|
|
||||||
As you can see, reports are completely customizable. Validation logic can be as simple or as complex as needed.
|
As you can see, reports are completely customizable. Validation logic can be as simple or as complex as needed. Also note that the `description` attribute support markdown syntax. It will be rendered in the report list page.
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
Reports should never alter data: If you find yourself using the `create()`, `save()`, `update()`, or `delete()` methods on objects within reports, stop and re-evaluate what you're trying to accomplish. Note that there are no safeguards against the accidental alteration or destruction of data.
|
Reports should never alter data: If you find yourself using the `create()`, `save()`, `update()`, or `delete()` methods on objects within reports, stop and re-evaluate what you're trying to accomplish. Note that there are no safeguards against the accidental alteration or destruction of data.
|
||||||
@@ -93,7 +93,7 @@ The following methods are available to log results within a report:
|
|||||||
* log_warning(object, message)
|
* log_warning(object, message)
|
||||||
* log_failure(object, message)
|
* log_failure(object, message)
|
||||||
|
|
||||||
The recording of one or more failure messages will automatically flag a report as failed. It is advised to log a success for each object that is evaluated so that the results will reflect how many objects are being reported on. (The inclusion of a log message is optional for successes.) Messages recorded with `log()` will appear in a report's results but are not associated with a particular object or status.
|
The recording of one or more failure messages will automatically flag a report as failed. It is advised to log a success for each object that is evaluated so that the results will reflect how many objects are being reported on. (The inclusion of a log message is optional for successes.) Messages recorded with `log()` will appear in a report's results but are not associated with a particular object or status. Log messages also support using markdown syntax and will be rendered on the report result page.
|
||||||
|
|
||||||
To perform additional tasks, such as sending an email or calling a webhook, after a report has been run, extend the `post_run()` method. The status of the report is available as `self.failed` and the results object is `self.result`.
|
To perform additional tasks, such as sending an email or calling a webhook, after a report has been run, extend the `post_run()` method. The status of the report is available as `self.failed` and the results object is `self.result`.
|
||||||
|
|
||||||
85
docs/development/adding-models.md
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
# Adding Models
|
||||||
|
|
||||||
|
## 1. Define the model class
|
||||||
|
|
||||||
|
Models within each app are stored in either `models.py` or within a submodule under the `models/` directory. When creating a model, be sure to subclass the [appropriate base model](models.md) from `netbox.models`. This will typically be PrimaryModel or OrganizationalModel. Remember to add the model class to the `__all__` listing for the module.
|
||||||
|
|
||||||
|
Each model should define, at a minimum:
|
||||||
|
|
||||||
|
* A `__str__()` method returning a user-friendly string representation of the instance
|
||||||
|
* A `get_absolute_url()` method returning an instance's direct URL (using `reverse()`)
|
||||||
|
* A `Meta` class specifying a deterministic ordering (if ordered by fields other than the primary ID)
|
||||||
|
|
||||||
|
## 2. Define field choices
|
||||||
|
|
||||||
|
If the model has one or more fields with static choices, define those choices in `choices.py` by subclassing `utilities.choices.ChoiceSet`.
|
||||||
|
|
||||||
|
## 3. Generate database migrations
|
||||||
|
|
||||||
|
Once your model definition is complete, generate database migrations by running `manage.py -n $NAME --no-header`. Always specify a short unique name when generating migrations.
|
||||||
|
|
||||||
|
!!! info
|
||||||
|
Set `DEVELOPER = True` in your NetBox configuration to enable the creation of new migrations.
|
||||||
|
|
||||||
|
## 4. Add all standard views
|
||||||
|
|
||||||
|
Most models will need view classes created in `views.py` to serve the following operations:
|
||||||
|
|
||||||
|
* List view
|
||||||
|
* Detail view
|
||||||
|
* Edit view
|
||||||
|
* Delete view
|
||||||
|
* Bulk import
|
||||||
|
* Bulk edit
|
||||||
|
* Bulk delete
|
||||||
|
|
||||||
|
## 5. Add URL paths
|
||||||
|
|
||||||
|
Add the relevant URL path for each view created in the previous step to `urls.py`.
|
||||||
|
|
||||||
|
## 6. Create the FilterSet
|
||||||
|
|
||||||
|
Each model should have a corresponding FilterSet class defined. This is used to filter UI and API queries. Subclass the appropriate class from `netbox.filtersets` that matches the model's parent class.
|
||||||
|
|
||||||
|
Every model FilterSet should define a `q` filter to support general search queries.
|
||||||
|
|
||||||
|
## 7. Create the table
|
||||||
|
|
||||||
|
Create a table class for the model in `tables.py` by subclassing `utilities.tables.BaseTable`. Under the table's `Meta` class, be sure to list both the fields and default columns.
|
||||||
|
|
||||||
|
## 8. Create the object template
|
||||||
|
|
||||||
|
Create the HTML template for the object view. (The other views each typically employ a generic template.) This template should extend `generic/object.html`.
|
||||||
|
|
||||||
|
## 9. Add the model to the navigation menu
|
||||||
|
|
||||||
|
For NetBox releases prior to v3.0, add the relevant link(s) to the navigation menu template. For later releases, add the relevant items in `netbox/netbox/navigation_menu.py`.
|
||||||
|
|
||||||
|
## 10. REST API components
|
||||||
|
|
||||||
|
Create the following for each model:
|
||||||
|
|
||||||
|
* Detailed (full) model serializer in `api/serializers.py`
|
||||||
|
* Nested serializer in `api/nested_serializers.py`
|
||||||
|
* API view in `api/views.py`
|
||||||
|
* Endpoint route in `api/urls.py`
|
||||||
|
|
||||||
|
## 11. GraphQL API components (v3.0+)
|
||||||
|
|
||||||
|
Create a Graphene object type for the model in `graphql/types.py` by subclassing the appropriate class from `netbox.graphql.types`.
|
||||||
|
|
||||||
|
Also extend the schema class defined in `graphql/schema.py` with the individual object and object list fields per the established convention.
|
||||||
|
|
||||||
|
## 12. Add tests
|
||||||
|
|
||||||
|
Add tests for the following:
|
||||||
|
|
||||||
|
* UI views
|
||||||
|
* API views
|
||||||
|
* Filter sets
|
||||||
|
|
||||||
|
## 13. Documentation
|
||||||
|
|
||||||
|
Create a new documentation page for the model in `docs/models/<app_label>/<model_name>.md`. Include this file under the "features" documentation where appropriate.
|
||||||
|
|
||||||
|
Also add your model to the index in `docs/development/models.md`.
|
||||||
@@ -32,19 +32,15 @@ class Foo(models.Model):
|
|||||||
raise ValidationError()
|
raise ValidationError()
|
||||||
```
|
```
|
||||||
|
|
||||||
## 3. Add CSV helpers
|
## 3. Update relevant querysets
|
||||||
|
|
||||||
Add the name of the new field to `csv_headers` and included a CSV-friendly representation of its data in the model's `to_csv()` method. These will be used when exporting objects in CSV format.
|
|
||||||
|
|
||||||
## 4. Update relevant querysets
|
|
||||||
|
|
||||||
If you're adding a relational field (e.g. `ForeignKey`) and intend to include the data when retreiving a list of objects, be sure to include the field using `prefetch_related()` as appropriate. This will optimize the view and avoid extraneous database queries.
|
If you're adding a relational field (e.g. `ForeignKey`) and intend to include the data when retreiving a list of objects, be sure to include the field using `prefetch_related()` as appropriate. This will optimize the view and avoid extraneous database queries.
|
||||||
|
|
||||||
## 5. Update API serializer
|
## 4. Update API serializer
|
||||||
|
|
||||||
Extend the model's API serializer in `<app>.api.serializers` to include the new field. In most cases, it will not be necessary to also extend the nested serializer, which produces a minimal represenation of the model.
|
Extend the model's API serializer in `<app>.api.serializers` to include the new field. In most cases, it will not be necessary to also extend the nested serializer, which produces a minimal represenation of the model.
|
||||||
|
|
||||||
## 6. Add field to forms
|
## 5. Add field to forms
|
||||||
|
|
||||||
Extend any forms to include the new field as appropriate. Common forms include:
|
Extend any forms to include the new field as appropriate. Common forms include:
|
||||||
|
|
||||||
@@ -53,19 +49,19 @@ Extend any forms to include the new field as appropriate. Common forms include:
|
|||||||
* **CSV import** - The form used when bulk importing objects in CSV format
|
* **CSV import** - The form used when bulk importing objects in CSV format
|
||||||
* **Filter** - Displays the options available for filtering a list of objects (both UI and API)
|
* **Filter** - Displays the options available for filtering a list of objects (both UI and API)
|
||||||
|
|
||||||
## 7. Extend object filter set
|
## 6. Extend object filter set
|
||||||
|
|
||||||
If the new field should be filterable, add it to the `FilterSet` for the model. If the field should be searchable, remember to reference it in the FilterSet's `search()` method.
|
If the new field should be filterable, add it to the `FilterSet` for the model. If the field should be searchable, remember to reference it in the FilterSet's `search()` method.
|
||||||
|
|
||||||
## 8. Add column to object table
|
## 7. Add column to object table
|
||||||
|
|
||||||
If the new field will be included in the object list view, add a column to the model's table. For simple fields, adding the field name to `Meta.fields` will be sufficient. More complex fields may require declaring a custom column.
|
If the new field will be included in the object list view, add a column to the model's table. For simple fields, adding the field name to `Meta.fields` will be sufficient. More complex fields may require declaring a custom column.
|
||||||
|
|
||||||
## 9. Update the UI templates
|
## 8. Update the UI templates
|
||||||
|
|
||||||
Edit the object's view template to display the new field. There may also be a custom add/edit form template that needs to be updated.
|
Edit the object's view template to display the new field. There may also be a custom add/edit form template that needs to be updated.
|
||||||
|
|
||||||
## 10. Create/extend test cases
|
## 9. Create/extend test cases
|
||||||
|
|
||||||
Create or extend the relevant test cases to verify that the new field and any accompanying validation logic perform as expected. This is especially important for relational fields. NetBox incorporates various test suites, including:
|
Create or extend the relevant test cases to verify that the new field and any accompanying validation logic perform as expected. This is especially important for relational fields. NetBox incorporates various test suites, including:
|
||||||
|
|
||||||
@@ -77,6 +73,6 @@ Create or extend the relevant test cases to verify that the new field and any ac
|
|||||||
|
|
||||||
Be diligent to ensure all of the relevant test suites are adapted or extended as necessary to test any new functionality.
|
Be diligent to ensure all of the relevant test suites are adapted or extended as necessary to test any new functionality.
|
||||||
|
|
||||||
## 11. Update the model's documentation
|
## 10. Update the model's documentation
|
||||||
|
|
||||||
Each model has a dedicated page in the documentation, at `models/<app>/<model>.md`. Update this file to include any relevant information about the new field.
|
Each model has a dedicated page in the documentation, at `models/<app>/<model>.md`. Update this file to include any relevant information about the new field.
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
Getting started with NetBox development is pretty straightforward, and should feel very familiar to anyone with Django development experience. There are a few things you'll need:
|
Getting started with NetBox development is pretty straightforward, and should feel very familiar to anyone with Django development experience. There are a few things you'll need:
|
||||||
|
|
||||||
* A Linux system or environment
|
* A Linux system or environment
|
||||||
* A PostgreSQL server, which can be installed locally [per the documentation](/installation/1-postgresql/)
|
* A PostgreSQL server, which can be installed locally [per the documentation](../installation/1-postgresql.md)
|
||||||
* A Redis server, which can also be [installed locally](/installation/2-redis/)
|
* A Redis server, which can also be [installed locally](../installation/2-redis.md)
|
||||||
* A supported version of Python
|
* A supported version of Python
|
||||||
|
|
||||||
### Fork the Repo
|
### Fork the Repo
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ NetBox is maintained as a [GitHub project](https://github.com/netbox-community/n
|
|||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
Communication among developers should always occur via public channels:
|
There are several official forums for communication among the developers and community members:
|
||||||
|
|
||||||
* [GitHub issues](https://github.com/netbox-community/netbox/issues) - All feature requests, bug reports, and other substantial changes to the code base **must** be documented in an issue.
|
* [GitHub issues](https://github.com/netbox-community/netbox/issues) - All feature requests, bug reports, and other substantial changes to the code base **must** be documented in an issue.
|
||||||
* [GitHub discussions](https://github.com/netbox-community/netbox/discussions) - The preferred forum for general discussion and support issues. Ideal for shaping a feature request prior to submitting an issue.
|
* [GitHub Discussions](https://github.com/netbox-community/netbox/discussions) - The preferred forum for general discussion and support issues. Ideal for shaping a feature request prior to submitting an issue.
|
||||||
* [The mailing list](https://groups.google.com/g/netbox-discuss) - An alternative forum for general discussion (GitHub is preferred).
|
* [#netbox on NetDev Community Slack](https://netdev.chat/) - Good for quick chats. Avoid any discussion that might need to be referenced later on, as the chat history is not retained long.
|
||||||
* [#netbox on NetworkToCode](http://slack.networktocode.com/) - Good for quick chats. Avoid any discussion that might need to be referenced later on, as the chat history is not retained long.
|
* [Google Group](https://groups.google.com/g/netbox-discuss) - Legacy mailing list; slowly being phased out in favor of GitHub discussions.
|
||||||
|
|
||||||
## Governance
|
## Governance
|
||||||
|
|
||||||
@@ -25,7 +25,6 @@ NetBox components are arranged into functional subsections called _apps_ (a carr
|
|||||||
* `dcim`: Datacenter infrastructure management (sites, racks, and devices)
|
* `dcim`: Datacenter infrastructure management (sites, racks, and devices)
|
||||||
* `extras`: Additional features not considered part of the core data model
|
* `extras`: Additional features not considered part of the core data model
|
||||||
* `ipam`: IP address management (VRFs, prefixes, IP addresses, and VLANs)
|
* `ipam`: IP address management (VRFs, prefixes, IP addresses, and VLANs)
|
||||||
* `secrets`: Encrypted storage of sensitive data (e.g. login credentials)
|
|
||||||
* `tenancy`: Tenants (such as customers) to which NetBox objects may be assigned
|
* `tenancy`: Tenants (such as customers) to which NetBox objects may be assigned
|
||||||
* `users`: Authentication and user preferences
|
* `users`: Authentication and user preferences
|
||||||
* `utilities`: Resources which are not user-facing (extendable classes, etc.)
|
* `utilities`: Resources which are not user-facing (extendable classes, etc.)
|
||||||
|
|||||||
96
docs/development/models.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# NetBox Models
|
||||||
|
|
||||||
|
## Model Types
|
||||||
|
|
||||||
|
A NetBox model represents a discrete object type such as a device or IP address. Each model is defined as a Python class and has its own SQL table. All NetBox data models can be categorized by type.
|
||||||
|
|
||||||
|
The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/contenttypes/) framework can be used to reference models within the database. A ContentType instance references a model by its `app_label` and `name`: For example, the Site model is referred to as `dcim.site`. The content type combined with an object's primary key form a globally unique identifier for the object (e.g. `dcim.site:123`).
|
||||||
|
|
||||||
|
### Features Matrix
|
||||||
|
|
||||||
|
* [Change logging](../additional-features/change-logging.md) - Changes to these objects are automatically recorded in the change log
|
||||||
|
* [Webhooks](../additional-features/webhooks.md) - NetBox is capable of generating outgoing webhooks for these objects
|
||||||
|
* [Custom fields](../customization/custom-fields.md) - These models support the addition of user-defined fields
|
||||||
|
* [Export templates](../customization/export-templates.md) - Users can create custom export templates for these models
|
||||||
|
* [Tagging](../models/extras/tag.md) - The models can be tagged with user-defined tags
|
||||||
|
* [Journaling](../additional-features/journaling.md) - These models support persistent historical commentary
|
||||||
|
* Nesting - These models can be nested recursively to create a hierarchy
|
||||||
|
|
||||||
|
| Type | Change Logging | Webhooks | Custom Fields | Export Templates | Tags | Journaling | Nesting |
|
||||||
|
| ------------------ | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- |
|
||||||
|
| Primary | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | |
|
||||||
|
| Organizational | :material-check: | :material-check: | :material-check: | :material-check: | | | |
|
||||||
|
| Nested Group | :material-check: | :material-check: | :material-check: | :material-check: | | | :material-check: |
|
||||||
|
| Component | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | | |
|
||||||
|
| Component Template | :material-check: | :material-check: | :material-check: | | | | |
|
||||||
|
|
||||||
|
## Models Index
|
||||||
|
|
||||||
|
### Primary Models
|
||||||
|
|
||||||
|
* [circuits.Circuit](../models/circuits/circuit.md)
|
||||||
|
* [circuits.Provider](../models/circuits/provider.md)
|
||||||
|
* [circuits.ProviderNetwork](../models/circuits/providernetwork.md)
|
||||||
|
* [dcim.Cable](../models/dcim/cable.md)
|
||||||
|
* [dcim.Device](../models/dcim/device.md)
|
||||||
|
* [dcim.DeviceType](../models/dcim/devicetype.md)
|
||||||
|
* [dcim.PowerFeed](../models/dcim/powerfeed.md)
|
||||||
|
* [dcim.PowerPanel](../models/dcim/powerpanel.md)
|
||||||
|
* [dcim.Rack](../models/dcim/rack.md)
|
||||||
|
* [dcim.RackReservation](../models/dcim/rackreservation.md)
|
||||||
|
* [dcim.Site](../models/dcim/site.md)
|
||||||
|
* [dcim.VirtualChassis](../models/dcim/virtualchassis.md)
|
||||||
|
* [ipam.Aggregate](../models/ipam/aggregate.md)
|
||||||
|
* [ipam.IPAddress](../models/ipam/ipaddress.md)
|
||||||
|
* [ipam.Prefix](../models/ipam/prefix.md)
|
||||||
|
* [ipam.RouteTarget](../models/ipam/routetarget.md)
|
||||||
|
* [ipam.Service](../models/ipam/service.md)
|
||||||
|
* [ipam.VLAN](../models/ipam/vlan.md)
|
||||||
|
* [ipam.VRF](../models/ipam/vrf.md)
|
||||||
|
* [tenancy.Tenant](../models/tenancy/tenant.md)
|
||||||
|
* [virtualization.Cluster](../models/virtualization/cluster.md)
|
||||||
|
* [virtualization.VirtualMachine](../models/virtualization/virtualmachine.md)
|
||||||
|
|
||||||
|
### Organizational Models
|
||||||
|
|
||||||
|
* [circuits.CircuitType](../models/circuits/circuittype.md)
|
||||||
|
* [dcim.DeviceRole](../models/dcim/devicerole.md)
|
||||||
|
* [dcim.Manufacturer](../models/dcim/manufacturer.md)
|
||||||
|
* [dcim.Platform](../models/dcim/platform.md)
|
||||||
|
* [dcim.RackRole](../models/dcim/rackrole.md)
|
||||||
|
* [ipam.RIR](../models/ipam/rir.md)
|
||||||
|
* [ipam.Role](../models/ipam/role.md)
|
||||||
|
* [ipam.VLANGroup](../models/ipam/vlangroup.md)
|
||||||
|
* [virtualization.ClusterGroup](../models/virtualization/clustergroup.md)
|
||||||
|
* [virtualization.ClusterType](../models/virtualization/clustertype.md)
|
||||||
|
|
||||||
|
### Nested Group Models
|
||||||
|
|
||||||
|
* [dcim.Location](../models/dcim/location.md) (formerly RackGroup)
|
||||||
|
* [dcim.Region](../models/dcim/region.md)
|
||||||
|
* [dcim.SiteGroup](../models/dcim/sitegroup.md)
|
||||||
|
* [tenancy.TenantGroup](../models/tenancy/tenantgroup.md)
|
||||||
|
|
||||||
|
### Component Models
|
||||||
|
|
||||||
|
* [dcim.ConsolePort](../models/dcim/consoleport.md)
|
||||||
|
* [dcim.ConsoleServerPort](../models/dcim/consoleserverport.md)
|
||||||
|
* [dcim.DeviceBay](../models/dcim/devicebay.md)
|
||||||
|
* [dcim.FrontPort](../models/dcim/frontport.md)
|
||||||
|
* [dcim.Interface](../models/dcim/interface.md)
|
||||||
|
* [dcim.InventoryItem](../models/dcim/inventoryitem.md)
|
||||||
|
* [dcim.PowerOutlet](../models/dcim/poweroutlet.md)
|
||||||
|
* [dcim.PowerPort](../models/dcim/powerport.md)
|
||||||
|
* [dcim.RearPort](../models/dcim/rearport.md)
|
||||||
|
* [virtualization.VMInterface](../models/virtualization/vminterface.md)
|
||||||
|
|
||||||
|
### Component Template Models
|
||||||
|
|
||||||
|
* [dcim.ConsolePortTemplate](../models/dcim/consoleporttemplate.md)
|
||||||
|
* [dcim.ConsoleServerPortTemplate](../models/dcim/consoleserverporttemplate.md)
|
||||||
|
* [dcim.DeviceBayTemplate](../models/dcim/devicebaytemplate.md)
|
||||||
|
* [dcim.FrontPortTemplate](../models/dcim/frontporttemplate.md)
|
||||||
|
* [dcim.InterfaceTemplate](../models/dcim/interfacetemplate.md)
|
||||||
|
* [dcim.PowerOutletTemplate](../models/dcim/poweroutlettemplate.md)
|
||||||
|
* [dcim.PowerPortTemplate](../models/dcim/powerporttemplate.md)
|
||||||
|
* [dcim.RearPortTemplate](../models/dcim/rearporttemplate.md)
|
||||||
@@ -2,34 +2,9 @@
|
|||||||
|
|
||||||
## Minor Version Bumps
|
## Minor Version Bumps
|
||||||
|
|
||||||
### Update Requirements
|
### Address Pinned Dependencies
|
||||||
|
|
||||||
Required Python packages are maintained in two files. `base_requirements.txt` contains a list of all the packages required by NetBox. Some of them may be pinned to a specific version of the package due to a known issue. For example:
|
Check `base_requirements.txt` for any dependencies pinned to a specific version, and upgrade them to their most stable release (where possible).
|
||||||
|
|
||||||
```
|
|
||||||
# https://github.com/encode/django-rest-framework/issues/6053
|
|
||||||
djangorestframework==3.8.1
|
|
||||||
```
|
|
||||||
|
|
||||||
The other file is `requirements.txt`, which lists each of the required packages pinned to its current stable version. When NetBox is installed, the Python environment is configured to match this file. This helps ensure that a new release of a dependency doesn't break NetBox.
|
|
||||||
|
|
||||||
Every minor version release should refresh `requirements.txt` so that it lists the most recent stable release of each package. To do this:
|
|
||||||
|
|
||||||
1. Create a new virtual environment.
|
|
||||||
2. Install the latest version of all required packages `pip install -U -r base_requirements.txt`).
|
|
||||||
3. Run all tests and check that the UI and API function as expected.
|
|
||||||
4. Review each requirement's release notes for any breaking or otherwise noteworthy changes.
|
|
||||||
5. Update the package versions in `requirements.txt` as appropriate.
|
|
||||||
|
|
||||||
### Update Static Libraries
|
|
||||||
|
|
||||||
Update the following static libraries to their most recent stable release:
|
|
||||||
|
|
||||||
* Bootstrap 3
|
|
||||||
* Material Design Icons
|
|
||||||
* Select2
|
|
||||||
* jQuery
|
|
||||||
* jQuery UI
|
|
||||||
|
|
||||||
### Link to the Release Notes Page
|
### Link to the Release Notes Page
|
||||||
|
|
||||||
@@ -58,13 +33,38 @@ Submit a pull request to merge the `feature` branch into the `develop` branch in
|
|||||||
|
|
||||||
## All Releases
|
## All Releases
|
||||||
|
|
||||||
|
### Update Requirements
|
||||||
|
|
||||||
|
Required Python packages are maintained in two files. `base_requirements.txt` contains a list of all the packages required by NetBox. Some of them may be pinned to a specific version of the package due to a known issue. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
# https://github.com/encode/django-rest-framework/issues/6053
|
||||||
|
djangorestframework==3.8.1
|
||||||
|
```
|
||||||
|
|
||||||
|
The other file is `requirements.txt`, which lists each of the required packages pinned to its current stable version. When NetBox is installed, the Python environment is configured to match this file. This helps ensure that a new release of a dependency doesn't break NetBox.
|
||||||
|
|
||||||
|
Every release should refresh `requirements.txt` so that it lists the most recent stable release of each package. To do this:
|
||||||
|
|
||||||
|
1. Create a new virtual environment.
|
||||||
|
2. Install the latest version of all required packages `pip install -U -r base_requirements.txt`).
|
||||||
|
3. Run all tests and check that the UI and API function as expected.
|
||||||
|
4. Review each requirement's release notes for any breaking or otherwise noteworthy changes.
|
||||||
|
5. Update the package versions in `requirements.txt` as appropriate.
|
||||||
|
|
||||||
|
In cases where upgrading a dependency to its most recent release is breaking, it should be pinned to its current minor version in `base_requirements.txt` (with an explanatory comment) and revisited for the next major NetBox release.
|
||||||
|
|
||||||
### Verify CI Build Status
|
### Verify CI Build Status
|
||||||
|
|
||||||
Ensure that continuous integration testing on the `develop` branch is completing successfully.
|
Ensure that continuous integration testing on the `develop` branch is completing successfully.
|
||||||
|
|
||||||
### Update Version and Changelog
|
### Update Version and Changelog
|
||||||
|
|
||||||
Update the `VERSION` constant in `settings.py` to the new release version and annotate the current data in the release notes for the new version. Commit these changes to the `develop` branch.
|
* Update the `VERSION` constant in `settings.py` to the new release version.
|
||||||
|
* Update the example version numbers in the feature request and bug report templates under `.github/ISSUE_TEMPLATES/`.
|
||||||
|
* Replace the "FUTURE" placeholder in the release notes with the current date.
|
||||||
|
|
||||||
|
Commit these changes to the `develop` branch.
|
||||||
|
|
||||||
### Submit a Pull Request
|
### Submit a Pull Request
|
||||||
|
|
||||||
|
|||||||
11
docs/development/signals.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Signals
|
||||||
|
|
||||||
|
In addition to [Django's built-in signals](https://docs.djangoproject.com/en/stable/topics/signals/), NetBox defines some of its own, listed below.
|
||||||
|
|
||||||
|
## post_clean
|
||||||
|
|
||||||
|
This signal is sent by models which inherit from `CustomValidationMixin` at the end of their `clean()` method.
|
||||||
|
|
||||||
|
### Receivers
|
||||||
|
|
||||||
|
* `extras.signals.run_custom_validators()`
|
||||||
99
docs/development/web-ui.md
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
# Web UI Development
|
||||||
|
|
||||||
|
## Front End Technologies
|
||||||
|
|
||||||
|
The NetBox UI is built on languages and frameworks:
|
||||||
|
|
||||||
|
### Styling & HTML Elements
|
||||||
|
|
||||||
|
#### [Bootstrap](https://getbootstrap.com/) 5
|
||||||
|
|
||||||
|
The majority of the NetBox UI is made up of stock Bootstrap components, with some styling modifications and custom components added on an as-needed basis. Bootstrap uses [Sass](https://sass-lang.com/), and NetBox extends Bootstrap's core Sass files for theming and customization.
|
||||||
|
|
||||||
|
### Client-side Scripting
|
||||||
|
|
||||||
|
#### [TypeScript](https://www.typescriptlang.org/)
|
||||||
|
|
||||||
|
All client-side scripting is transpiled from TypeScript to JavaScript and served by Django. In development, TypeScript is an _extremely_ effective tool for accurately describing and checking the code, which leads to significantly fewer bugs, a better development experience, and more predictable/readable code.
|
||||||
|
|
||||||
|
As part of the [bundling](#bundling) process, Bootstrap's JavaScript plugins are imported and bundled alongside NetBox's front-end code.
|
||||||
|
|
||||||
|
!!! danger "NetBox is jQuery-free"
|
||||||
|
Following the Bootstrap team's deprecation of jQuery in Bootstrap 5, NetBox also no longer uses jQuery in front-end code.
|
||||||
|
|
||||||
|
## Guidance
|
||||||
|
|
||||||
|
NetBox generally follows the following guidelines for front-end code:
|
||||||
|
|
||||||
|
- Bootstrap utility classes may be used to solve one-off issues or to implement singular components, as long as the class list does not exceed 4-5 classes. If an element needs more than 5 utility classes, a custom SCSS class should be added that contains the required style properties.
|
||||||
|
- Custom classes must be commented, explaining the general purpose of the class and where it is used.
|
||||||
|
- Reuse SCSS variables whenever possible. CSS values should (almost) never be hard-coded.
|
||||||
|
- All TypeScript functions must have, at a minimum, a basic [JSDoc](https://jsdoc.app/) description of what the function is for and where it is used. If possible, document all function arguments via [`@param` JSDoc block tags](https://jsdoc.app/tags-param.html).
|
||||||
|
- Expanding on NetBox's [dependency policy](style-guide.md#introducing-new-dependencies), new front-end dependencies should be avoided unless absolutely necessary. Every new front-end dependency adds to the CSS/JavaScript file size that must be loaded by the client and this should be minimized as much as possible. If adding a new dependency is unavoidable, use a tool like [Bundlephobia](https://bundlephobia.com/) to ensure the smallest possible library is used.
|
||||||
|
- All UI elements must be usable on all common screen sizes, including mobile devices. Be sure to test newly implemented solutions (JavaScript included) on as many screen sizes and device types as possible.
|
||||||
|
- NetBox aligns with Bootstrap's [supported Browsers and Devices](https://getbootstrap.com/docs/5.1/getting-started/browsers-devices/) list.
|
||||||
|
|
||||||
|
## UI Development
|
||||||
|
|
||||||
|
To contribute to the NetBox UI, you'll need to review the main [Getting Started guide](getting-started.md) in order to set up your base environment.
|
||||||
|
|
||||||
|
### Tools
|
||||||
|
|
||||||
|
Once you have a working NetBox development environment, you'll need to install a few more tools to work with the NetBox UI:
|
||||||
|
|
||||||
|
- [NodeJS](https://nodejs.org/en/download/) (the LTS release should suffice)
|
||||||
|
- [Yarn](https://yarnpkg.com/getting-started/install) (version 1)
|
||||||
|
|
||||||
|
After Node and Yarn are installed on your system, you'll need to install all the NetBox UI dependencies:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cd netbox/project-static
|
||||||
|
$ yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! warning "Check Your Working Directory"
|
||||||
|
You need to be in the `netbox/project-static` directory to run the below `yarn` commands.
|
||||||
|
|
||||||
|
### Bundling
|
||||||
|
|
||||||
|
In order for the TypeScript and Sass (SCSS) source files to be usable by a browser, they must first be transpiled (TypeScript → JavaScript, Sass → CSS), bundled, and minified. After making changes to TypeScript or Sass source files, run `yarn bundle`.
|
||||||
|
|
||||||
|
`yarn bundle` is a wrapper around the following subcommands, any of which can be run individually:
|
||||||
|
|
||||||
|
| Command | Action |
|
||||||
|
| :-------------------- | :---------------------------------------------- |
|
||||||
|
| `yarn bundle` | Bundle TypeScript and Sass (SCSS) source files. |
|
||||||
|
| `yarn bundle:styles` | Bundle Sass (SCSS) source files only. |
|
||||||
|
| `yarn bundle:scripts` | Bundle TypeScript source files only. |
|
||||||
|
|
||||||
|
All output files will be written to `netbox/project-static/dist`, where Django will pick them up when `manage.py collectstatic` is run.
|
||||||
|
|
||||||
|
!!! info "Remember to re-run `manage.py collectstatic`"
|
||||||
|
If you're running the development web server — `manage.py runserver` — you'll need to run `manage.py collectstatic` to see your changes.
|
||||||
|
|
||||||
|
### Linting, Formatting & Type Checking
|
||||||
|
|
||||||
|
Before committing any changes to TypeScript files, and periodically throughout the development process, you should run `yarn validate` to catch formatting, code quality, or type errors.
|
||||||
|
|
||||||
|
!!! tip "IDE Integrations"
|
||||||
|
If you're using an IDE, it is strongly recommended to install [ESLint](https://eslint.org/docs/user-guide/integrations), [TypeScript](https://github.com/Microsoft/TypeScript/wiki/TypeScript-Editor-Support), and [Prettier](https://prettier.io/docs/en/editors.html) integrations, if available. Most of them will automatically check and/or correct issues in the code as you develop, which can significantly increase your productivity as a contributor.
|
||||||
|
|
||||||
|
`yarn validate` is a wrapper around the following subcommands, any of which can be run individually:
|
||||||
|
|
||||||
|
| Command | Action |
|
||||||
|
| :--------------------------------- | :--------------------------------------------------------------- |
|
||||||
|
| `yarn validate` | Run all validation. |
|
||||||
|
| `yarn validate:lint` | Validate TypeScript code via [ESLint](https://eslint.org/) only. |
|
||||||
|
| `yarn validate:types` | Validate TypeScript code compilation only. |
|
||||||
|
| `yarn validate:formatting` | Validate code formatting of JavaScript & Sass/SCSS files. |
|
||||||
|
| `yarn validate:formatting:styles` | Validate code formatting Sass/SCSS only. |
|
||||||
|
| `yarn validate:formatting:scripts` | Validate code formatting TypeScript only. |
|
||||||
|
|
||||||
|
You can also run the following commands to automatically fix formatting issues:
|
||||||
|
|
||||||
|
| Command | Action |
|
||||||
|
| :-------------------- | :---------------------------------------------- |
|
||||||
|
| `yarn format` | Format TypeScript and Sass (SCSS) source files. |
|
||||||
|
| `yarn format:styles` | Format Sass (SCSS) source files only. |
|
||||||
|
| `yarn format:scripts` | Format TypeScript source files only. |
|
||||||
|
|
||||||
@@ -11,9 +11,19 @@ table {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
th {
|
th {
|
||||||
background-color: #f0f0f0;
|
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
td {
|
td {
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
}
|
}
|
||||||
|
/* Remove table header coloring. */
|
||||||
|
.md-typeset table:not([class]) th {
|
||||||
|
color: unset !important;
|
||||||
|
background-color: unset !important;
|
||||||
|
}
|
||||||
|
thead tr {
|
||||||
|
/* Colorize table headers. */
|
||||||
|
background-color: var(--md-code-bg-color);
|
||||||
|
color: var(--md-code-fg-color);
|
||||||
|
}
|
||||||
|
|||||||
70
docs/graphql-api/overview.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# GraphQL API Overview
|
||||||
|
|
||||||
|
NetBox provides a read-only [GraphQL](https://graphql.org/) API to complement its REST API. This API is powered by the [Graphene](https://graphene-python.org/) library and [Graphene-Django](https://docs.graphene-python.org/projects/django/en/latest/).
|
||||||
|
|
||||||
|
## Queries
|
||||||
|
|
||||||
|
GraphQL enables the client to specify an arbitrary nested list of fields to include in the response. All queries are made to the root `/graphql` API endpoint. For example, to return the circuit ID and provider name of each circuit with an active status, you can issue a request such as the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
curl -H "Authorization: Token $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Accept: application/json" \
|
||||||
|
http://netbox/graphql/ \
|
||||||
|
--data '{"query": "query {circuits(status:\"active\" {cid provider {name}}}"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
The response will include the requested data formatted as JSON:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"circuits": [
|
||||||
|
{
|
||||||
|
"cid": "1002840283",
|
||||||
|
"provider": {
|
||||||
|
"name": "CenturyLink"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cid": "1002840457",
|
||||||
|
"provider": {
|
||||||
|
"name": "CenturyLink"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
It's recommended to pass the return data through a JSON parser such as `jq` for better readability.
|
||||||
|
|
||||||
|
NetBox provides both a singular and plural query field for each object type:
|
||||||
|
|
||||||
|
* `$OBJECT`: Returns a single object. Must specify the object's unique ID as `(id: 123)`.
|
||||||
|
* `$OBJECT_list`: Returns a list of objects, optionally filtered by given parameters.
|
||||||
|
|
||||||
|
For example, query `device(id:123)` to fetch a specific device (identified by its unique ID), and query `device_list` (with an optional set of fitlers) to fetch all devices.
|
||||||
|
|
||||||
|
For more detail on constructing GraphQL queries, see the [Graphene documentation](https://docs.graphene-python.org/en/latest/).
|
||||||
|
|
||||||
|
## Filtering
|
||||||
|
|
||||||
|
The GraphQL API employs the same filtering logic as the UI and REST API. Filters can be specified as key-value pairs within parentheses immediately following the query name. For example, the following will return only sites within the North Carolina region with a status of active:
|
||||||
|
|
||||||
|
```
|
||||||
|
{"query": "query {sites(region:\"north-carolina\", status:\"active\") {name}}"}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
NetBox's GraphQL API uses the same API authentication tokens as its REST API. Authentication tokens are included with requests by attaching an `Authorization` HTTP header in the following form:
|
||||||
|
|
||||||
|
```
|
||||||
|
Authorization: Token $TOKEN
|
||||||
|
```
|
||||||
|
|
||||||
|
## Disabling the GraphQL API
|
||||||
|
|
||||||
|
If not needed, the GraphQL API can be disabled by setting the [`GRAPHQL_ENABLED`](../configuration/optional-settings.md#graphql_enabled) configuration parameter to False and restarting NetBox.
|
||||||
@@ -1,8 +1,8 @@
|
|||||||

|
{style="height: 100px; margin-bottom: 3em"}
|
||||||
|
|
||||||
# What is NetBox?
|
# What is NetBox?
|
||||||
|
|
||||||
NetBox is an open source web application designed to help manage and document computer networks. Initially conceived by the network engineering team at [DigitalOcean](https://www.digitalocean.com/), NetBox was developed specifically to address the needs of network and infrastructure engineers. It encompasses the following aspects of network management:
|
NetBox is an infrastructure resource modeling (IRM) application designed to empower network automation. Initially conceived by the network engineering team at [DigitalOcean](https://www.digitalocean.com/), NetBox was developed specifically to address the needs of network and infrastructure engineers. NetBox is made available as open source under the Apache 2 license. It encompasses the following aspects of network management:
|
||||||
|
|
||||||
* **IP address management (IPAM)** - IP networks and addresses, VRFs, and VLANs
|
* **IP address management (IPAM)** - IP networks and addresses, VRFs, and VLANs
|
||||||
* **Equipment racks** - Organized by group and site
|
* **Equipment racks** - Organized by group and site
|
||||||
@@ -55,7 +55,7 @@ NetBox is built on the [Django](https://djangoproject.com/) Python framework and
|
|||||||
|
|
||||||
## Supported Python Versions
|
## Supported Python Versions
|
||||||
|
|
||||||
NetBox supports Python 3.6, 3.7, and 3.8 environments currently. (Support for Python 3.5 was removed in NetBox v2.8.)
|
NetBox supports Python 3.7, 3.8, and 3.9 environments currently. (Support for Python 3.6 was removed in NetBox v3.0.)
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
|
|||||||
@@ -7,32 +7,31 @@ This section entails the installation and configuration of a local PostgreSQL da
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
#### Ubuntu
|
=== "Ubuntu"
|
||||||
|
|
||||||
Install the PostgreSQL server and client development libraries using `apt`.
|
```no-highlight
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y postgresql
|
||||||
|
```
|
||||||
|
|
||||||
```no-highlight
|
=== "CentOS"
|
||||||
sudo apt update
|
|
||||||
sudo apt install -y postgresql libpq-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
#### CentOS
|
```no-highlight
|
||||||
|
sudo yum install -y postgresql-server
|
||||||
|
sudo postgresql-setup --initdb
|
||||||
|
```
|
||||||
|
|
||||||
PostgreSQL 9.6 and later are available natively on CentOS 8.2. If using an earlier CentOS release, you may need to [install it from an RPM](https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/).
|
!!! info
|
||||||
|
PostgreSQL 9.6 and later are available natively on CentOS 8.2. If using an earlier CentOS release, you may need to [install it from an RPM](https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/).
|
||||||
|
|
||||||
```no-highlight
|
CentOS configures ident host-based authentication for PostgreSQL by default. Because NetBox will need to authenticate using a username and password, modify `/var/lib/pgsql/data/pg_hba.conf` to support MD5 authentication by changing `ident` to `md5` for the lines below:
|
||||||
sudo yum install -y postgresql-server libpq-devel
|
|
||||||
sudo postgresql-setup --initdb
|
|
||||||
```
|
|
||||||
|
|
||||||
CentOS configures ident host-based authentication for PostgreSQL by default. Because NetBox will need to authenticate using a username and password, modify `/var/lib/pgsql/data/pg_hba.conf` to support MD5 authentication by changing `ident` to `md5` for the lines below:
|
```no-highlight
|
||||||
|
host all all 127.0.0.1/32 md5
|
||||||
|
host all all ::1/128 md5
|
||||||
|
```
|
||||||
|
|
||||||
```no-highlight
|
Once PostgreSQL has been installed, start the service and enable it to run at boot:
|
||||||
host all all 127.0.0.1/32 md5
|
|
||||||
host all all ::1/128 md5
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, start the service and enable it to run at boot:
|
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo systemctl start postgresql
|
sudo systemctl start postgresql
|
||||||
@@ -41,28 +40,28 @@ sudo systemctl enable postgresql
|
|||||||
|
|
||||||
## Database Creation
|
## Database Creation
|
||||||
|
|
||||||
At a minimum, we need to create a database for NetBox and assign it a username and password for authentication. This is done with the following commands.
|
At a minimum, we need to create a database for NetBox and assign it a username and password for authentication. Start by invoking the PostgreSQL shell as the system Postgres user.
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
sudo -u postgres psql
|
||||||
|
```
|
||||||
|
|
||||||
|
Within the shell, enter the following commands to create the database and user (role), substituting your own value for the password:
|
||||||
|
|
||||||
|
```postgresql
|
||||||
|
CREATE DATABASE netbox;
|
||||||
|
CREATE USER netbox WITH PASSWORD 'J5brHrAXFLQSif0K';
|
||||||
|
GRANT ALL PRIVILEGES ON DATABASE netbox TO netbox;
|
||||||
|
```
|
||||||
|
|
||||||
!!! danger
|
!!! danger
|
||||||
**Do not use the password from the example.** Choose a strong, random password to ensure secure database authentication for your NetBox installation.
|
**Do not use the password from the example.** Choose a strong, random password to ensure secure database authentication for your NetBox installation.
|
||||||
|
|
||||||
```no-highlight
|
Once complete, enter `\q` to exit the PostgreSQL shell.
|
||||||
$ sudo -u postgres psql
|
|
||||||
psql (12.5 (Ubuntu 12.5-0ubuntu0.20.04.1))
|
|
||||||
Type "help" for help.
|
|
||||||
|
|
||||||
postgres=# CREATE DATABASE netbox;
|
|
||||||
CREATE DATABASE
|
|
||||||
postgres=# CREATE USER netbox WITH PASSWORD 'J5brHrAXFLQSif0K';
|
|
||||||
CREATE ROLE
|
|
||||||
postgres=# GRANT ALL PRIVILEGES ON DATABASE netbox TO netbox;
|
|
||||||
GRANT
|
|
||||||
postgres=# \q
|
|
||||||
```
|
|
||||||
|
|
||||||
## Verify Service Status
|
## Verify Service Status
|
||||||
|
|
||||||
You can verify that authentication works issuing the following command and providing the configured password. (Replace `localhost` with your database server if using a remote database.)
|
You can verify that authentication works by executing the `psql` command and passing the configured username and password. (Replace `localhost` with your database server if using a remote database.)
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ psql --username netbox --password --host localhost netbox
|
$ psql --username netbox --password --host localhost netbox
|
||||||
|
|||||||
@@ -7,19 +7,19 @@
|
|||||||
!!! note
|
!!! note
|
||||||
NetBox v2.9.0 and later require Redis v4.0 or higher. If your distribution does not offer a recent enough release, you will need to build Redis from source. Please see [the Redis installation documentation](https://github.com/redis/redis) for further details.
|
NetBox v2.9.0 and later require Redis v4.0 or higher. If your distribution does not offer a recent enough release, you will need to build Redis from source. Please see [the Redis installation documentation](https://github.com/redis/redis) for further details.
|
||||||
|
|
||||||
### Ubuntu
|
=== "Ubuntu"
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo apt install -y redis-server
|
sudo apt install -y redis-server
|
||||||
```
|
```
|
||||||
|
|
||||||
### CentOS
|
=== "CentOS"
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo yum install -y redis
|
sudo yum install -y redis
|
||||||
sudo systemctl start redis
|
sudo systemctl start redis
|
||||||
sudo systemctl enable redis
|
sudo systemctl enable redis
|
||||||
```
|
```
|
||||||
|
|
||||||
You may wish to modify the Redis configuration at `/etc/redis.conf` or `/etc/redis/redis.conf`, however in most cases the default configuration is sufficient.
|
You may wish to modify the Redis configuration at `/etc/redis.conf` or `/etc/redis/redis.conf`, however in most cases the default configuration is sufficient.
|
||||||
|
|
||||||
@@ -28,6 +28,7 @@ You may wish to modify the Redis configuration at `/etc/redis.conf` or `/etc/red
|
|||||||
Use the `redis-cli` utility to ensure the Redis service is functional:
|
Use the `redis-cli` utility to ensure the Redis service is functional:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ redis-cli ping
|
redis-cli ping
|
||||||
PONG
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If successful, you should receive a `PONG` response from the server.
|
||||||
|
|||||||
@@ -7,19 +7,19 @@ This section of the documentation discusses installing and configuring the NetBo
|
|||||||
Begin by installing all system packages required by NetBox and its dependencies.
|
Begin by installing all system packages required by NetBox and its dependencies.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
NetBox v2.8.0 and later require Python 3.6, 3.7, or 3.8. This documentation assumes Python 3.6.
|
NetBox v3.0 and later require Python 3.7, 3.8, or 3.9.
|
||||||
|
|
||||||
### Ubuntu
|
=== "Ubuntu"
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo apt install -y python3.6 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
|
sudo apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
### CentOS
|
=== "CentOS"
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo yum install -y gcc python36 python36-devel python3-pip libxml2-devel libxslt-devel libffi-devel openssl-devel redhat-rpm-config
|
sudo yum install -y gcc python36 python36-devel python3-pip libxml2-devel libxslt-devel libffi-devel libpq-devel openssl-devel redhat-rpm-config
|
||||||
```
|
```
|
||||||
|
|
||||||
Before continuing with either platform, update pip (Python's package management tool) to its latest release:
|
Before continuing with either platform, update pip (Python's package management tool) to its latest release:
|
||||||
|
|
||||||
@@ -36,43 +36,46 @@ This documentation provides two options for installing NetBox: from a downloadab
|
|||||||
Download the [latest stable release](https://github.com/netbox-community/netbox/releases) from GitHub as a tarball or ZIP archive and extract it to your desired path. In this example, we'll use `/opt/netbox` as the NetBox root.
|
Download the [latest stable release](https://github.com/netbox-community/netbox/releases) from GitHub as a tarball or ZIP archive and extract it to your desired path. In this example, we'll use `/opt/netbox` as the NetBox root.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ sudo wget https://github.com/netbox-community/netbox/archive/vX.Y.Z.tar.gz
|
sudo wget https://github.com/netbox-community/netbox/archive/vX.Y.Z.tar.gz
|
||||||
$ sudo tar -xzf vX.Y.Z.tar.gz -C /opt
|
sudo tar -xzf vX.Y.Z.tar.gz -C /opt
|
||||||
$ sudo ln -s /opt/netbox-X.Y.Z/ /opt/netbox
|
sudo ln -s /opt/netbox-X.Y.Z/ /opt/netbox
|
||||||
$ ls -l /opt | grep netbox
|
|
||||||
lrwxrwxrwx 1 root root 13 Jul 20 13:44 netbox -> netbox-2.9.0/
|
|
||||||
drwxr-xr-x 2 root root 4096 Jul 20 13:44 netbox-2.9.0
|
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
It is recommended to install NetBox in a directory named for its version number. For example, NetBox v2.9.0 would be installed into `/opt/netbox-2.9.0`, and a symlink from `/opt/netbox/` would point to this location. This allows for future releases to be installed in parallel without interrupting the current installation. When changing to the new release, only the symlink needs to be updated.
|
It is recommended to install NetBox in a directory named for its version number. For example, NetBox v3.0.0 would be installed into `/opt/netbox-3.0.0`, and a symlink from `/opt/netbox/` would point to this location. (You can verify this configuration with the command `ls -l /opt | grep netbox`.) This allows for future releases to be installed in parallel without interrupting the current installation. When changing to the new release, only the symlink needs to be updated.
|
||||||
|
|
||||||
### Option B: Clone the Git Repository
|
### Option B: Clone the Git Repository
|
||||||
|
|
||||||
Create the base directory for the NetBox installation. For this guide, we'll use `/opt/netbox`.
|
Create the base directory for the NetBox installation. For this guide, we'll use `/opt/netbox`.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo mkdir -p /opt/netbox/ && cd /opt/netbox/
|
sudo mkdir -p /opt/netbox/
|
||||||
|
cd /opt/netbox/
|
||||||
```
|
```
|
||||||
|
|
||||||
If `git` is not already installed, install it:
|
If `git` is not already installed, install it:
|
||||||
|
|
||||||
#### Ubuntu
|
=== "Ubuntu"
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo apt install -y git
|
sudo apt install -y git
|
||||||
```
|
```
|
||||||
|
|
||||||
#### CentOS
|
=== "CentOS"
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo yum install -y git
|
sudo yum install -y git
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, clone the **master** branch of the NetBox GitHub repository into the current directory. (This branch always holds the current stable release.)
|
Next, clone the **master** branch of the NetBox GitHub repository into the current directory. (This branch always holds the current stable release.)
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ sudo git clone -b master https://github.com/netbox-community/netbox.git .
|
sudo git clone -b master https://github.com/netbox-community/netbox.git .
|
||||||
|
```
|
||||||
|
|
||||||
|
The `git clone` command should generate output similar to the following:
|
||||||
|
|
||||||
|
```
|
||||||
Cloning into '.'...
|
Cloning into '.'...
|
||||||
remote: Counting objects: 1994, done.
|
remote: Counting objects: 1994, done.
|
||||||
remote: Compressing objects: 100% (150/150), done.
|
remote: Compressing objects: 100% (150/150), done.
|
||||||
@@ -89,20 +92,20 @@ Checking connectivity... done.
|
|||||||
|
|
||||||
Create a system user account named `netbox`. We'll configure the WSGI and HTTP services to run under this account. We'll also assign this user ownership of the media directory. This ensures that NetBox will be able to save uploaded files.
|
Create a system user account named `netbox`. We'll configure the WSGI and HTTP services to run under this account. We'll also assign this user ownership of the media directory. This ensures that NetBox will be able to save uploaded files.
|
||||||
|
|
||||||
#### Ubuntu
|
=== "Ubuntu"
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo adduser --system --group netbox
|
sudo adduser --system --group netbox
|
||||||
sudo chown --recursive netbox /opt/netbox/netbox/media/
|
sudo chown --recursive netbox /opt/netbox/netbox/media/
|
||||||
```
|
```
|
||||||
|
|
||||||
#### CentOS
|
=== "CentOS"
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo groupadd --system netbox
|
sudo groupadd --system netbox
|
||||||
sudo adduser --system -g netbox netbox
|
sudo adduser --system -g netbox netbox
|
||||||
sudo chown --recursive netbox /opt/netbox/netbox/media/
|
sudo chown --recursive netbox /opt/netbox/netbox/media/
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
@@ -113,7 +116,7 @@ cd /opt/netbox/netbox/netbox/
|
|||||||
sudo cp configuration.example.py configuration.py
|
sudo cp configuration.example.py configuration.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Open `configuration.py` with your preferred editor to begin configuring NetBox. NetBox offers [many configuration parameters](/configuration/), but only the following four are required for new installations:
|
Open `configuration.py` with your preferred editor to begin configuring NetBox. NetBox offers [many configuration parameters](../configuration/index.md), but only the following four are required for new installations:
|
||||||
|
|
||||||
* `ALLOWED_HOSTS`
|
* `ALLOWED_HOSTS`
|
||||||
* `DATABASE`
|
* `DATABASE`
|
||||||
@@ -136,7 +139,7 @@ ALLOWED_HOSTS = ['*']
|
|||||||
|
|
||||||
### DATABASE
|
### DATABASE
|
||||||
|
|
||||||
This parameter holds the database configuration details. You must define the username and password used when you configured PostgreSQL. If the service is running on a remote host, update the `HOST` and `PORT` parameters accordingly. See the [configuration documentation](/configuration/required-settings/#database) for more detail on individual parameters.
|
This parameter holds the database configuration details. You must define the username and password used when you configured PostgreSQL. If the service is running on a remote host, update the `HOST` and `PORT` parameters accordingly. See the [configuration documentation](../configuration/required-settings.md#database) for more detail on individual parameters.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
DATABASE = {
|
DATABASE = {
|
||||||
@@ -151,7 +154,7 @@ DATABASE = {
|
|||||||
|
|
||||||
### REDIS
|
### REDIS
|
||||||
|
|
||||||
Redis is a in-memory key-value store used by NetBox for caching and background task queuing. Redis typically requires minimal configuration; the values below should suffice for most installations. See the [configuration documentation](/configuration/required-settings/#redis) for more detail on individual parameters.
|
Redis is a in-memory key-value store used by NetBox for caching and background task queuing. Redis typically requires minimal configuration; the values below should suffice for most installations. See the [configuration documentation](../configuration/required-settings.md#redis) for more detail on individual parameters.
|
||||||
|
|
||||||
Note that NetBox requires the specification of two separate Redis databases: `tasks` and `caching`. These may both be provided by the same Redis service, however each should have a unique numeric database ID.
|
Note that NetBox requires the specification of two separate Redis databases: `tasks` and `caching`. These may both be provided by the same Redis service, however each should have a unique numeric database ID.
|
||||||
|
|
||||||
@@ -195,18 +198,18 @@ All Python packages required by NetBox are listed in `requirements.txt` and will
|
|||||||
|
|
||||||
### NAPALM
|
### NAPALM
|
||||||
|
|
||||||
The [NAPALM automation](https://napalm-automation.net/) library allows NetBox to fetch live data from devices and return it to a requester via its REST API. The `NAPALM_USERNAME` and `NAPALM_PASSWORD` configuration parameters define the credentials to be used when connecting to a device.
|
Integration with the [NAPALM automation](../additional-features/napalm.md) library allows NetBox to fetch live data from devices and return it to a requester via its REST API. The `NAPALM_USERNAME` and `NAPALM_PASSWORD` configuration parameters define the credentials to be used when connecting to a device.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo echo napalm >> /opt/netbox/local_requirements.txt
|
sudo sh -c "echo 'napalm' >> /opt/netbox/local_requirements.txt"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Remote File Storage
|
### Remote File Storage
|
||||||
|
|
||||||
By default, NetBox will use the local filesystem to store uploaded files. To use a remote filesystem, install the [`django-storages`](https://django-storages.readthedocs.io/en/stable/) library and configure your [desired storage backend](/configuration/optional-settings/#storage_backend) in `configuration.py`.
|
By default, NetBox will use the local filesystem to store uploaded files. To use a remote filesystem, install the [`django-storages`](https://django-storages.readthedocs.io/en/stable/) library and configure your [desired storage backend](../configuration/optional-settings.md#storage_backend) in `configuration.py`.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo echo django-storages >> /opt/netbox/local_requirements.txt
|
sudo sh -c "echo 'django-storages' >> /opt/netbox/local_requirements.txt"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Run the Upgrade Script
|
## Run the Upgrade Script
|
||||||
@@ -214,14 +217,21 @@ sudo echo django-storages >> /opt/netbox/local_requirements.txt
|
|||||||
Once NetBox has been configured, we're ready to proceed with the actual installation. We'll run the packaged upgrade script (`upgrade.sh`) to perform the following actions:
|
Once NetBox has been configured, we're ready to proceed with the actual installation. We'll run the packaged upgrade script (`upgrade.sh`) to perform the following actions:
|
||||||
|
|
||||||
* Create a Python virtual environment
|
* Create a Python virtual environment
|
||||||
* Install all required Python packages
|
* Installs all required Python packages
|
||||||
* Run database schema migrations
|
* Run database schema migrations
|
||||||
|
* Builds the documentation locally (for offline use)
|
||||||
* Aggregate static resource files on disk
|
* Aggregate static resource files on disk
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo /opt/netbox/upgrade.sh
|
sudo /opt/netbox/upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note that **Python 3.7 or later is required** for NetBox v3.0 and later releases. If the default Python installation on your server does not meet this requirement, you'll need to install Python 3.7 or later separately, and pass the path to the support installation as an environment variable named `PYTHON`. (Note that the environment variable must be passed _after_ the `sudo` command.)
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
sudo PYTHON=/usr/bin/python3.7 /opt/netbox/upgrade.sh
|
||||||
|
```
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
Upon completion, the upgrade script may warn that no existing virtual environment was detected. As this is a new installation, this warning can be safely ignored.
|
Upon completion, the upgrade script may warn that no existing virtual environment was detected. As this is a new installation, this warning can be safely ignored.
|
||||||
|
|
||||||
@@ -238,44 +248,56 @@ Once the virtual environment has been activated, you should notice the string `(
|
|||||||
Next, we'll create a superuser account using the `createsuperuser` Django management command (via `manage.py`). Specifying an email address for the user is not required, but be sure to use a very strong password.
|
Next, we'll create a superuser account using the `createsuperuser` Django management command (via `manage.py`). Specifying an email address for the user is not required, but be sure to use a very strong password.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
(venv) $ cd /opt/netbox/netbox
|
cd /opt/netbox/netbox
|
||||||
(venv) $ python3 manage.py createsuperuser
|
python3 manage.py createsuperuser
|
||||||
Username: admin
|
|
||||||
Email address: admin@example.com
|
|
||||||
Password:
|
|
||||||
Password (again):
|
|
||||||
Superuser created successfully.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Schedule the Housekeeping Task
|
||||||
|
|
||||||
|
NetBox includes a `housekeeping` management command that handles some recurring cleanup tasks, such as clearing out old sessions and expired change records. Although this command may be run manually, it is recommended to configure a scheduled job using the system's `cron` daemon or a similar utility.
|
||||||
|
|
||||||
|
A shell script which invokes this command is included at `contrib/netbox-housekeeping.sh`. It can be copied to your system's daily cron task directory, or included within the crontab directly. (If installing NetBox into a nonstandard path, be sure to update the system paths within this script first.)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cp /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [housekeeping documentation](../administration/housekeeping.md) for further details.
|
||||||
|
|
||||||
## Test the Application
|
## Test the Application
|
||||||
|
|
||||||
At this point, we should be able to run NetBox's development server for testing. We can check by starting a development instance:
|
At this point, we should be able to run NetBox's development server for testing. We can check by starting a development instance:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
(venv) $ python3 manage.py runserver 0.0.0.0:8000 --insecure
|
python3 manage.py runserver 0.0.0.0:8000 --insecure
|
||||||
|
```
|
||||||
|
|
||||||
|
If successful, you should see output similar to the following:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
Watching for file changes with StatReloader
|
||||||
Performing system checks...
|
Performing system checks...
|
||||||
|
|
||||||
System check identified no issues (0 silenced).
|
System check identified no issues (0 silenced).
|
||||||
November 17, 2020 - 16:08:13
|
August 30, 2021 - 18:02:23
|
||||||
Django version 3.1.3, using settings 'netbox.settings'
|
Django version 3.2.6, using settings 'netbox.settings'
|
||||||
Starting development server at http://0.0.0.0:8000/
|
Starting development server at http://127.0.0.1:8000/
|
||||||
Quit the server with CONTROL-C.
|
Quit the server with CONTROL-C.
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, connect to the name or IP of the server (as defined in `ALLOWED_HOSTS`) on port 8000; for example, <http://127.0.0.1:8000/>. You should be greeted with the NetBox home page.
|
Next, connect to the name or IP of the server (as defined in `ALLOWED_HOSTS`) on port 8000; for example, <http://127.0.0.1:8000/>. You should be greeted with the NetBox home page. Try logging in using the username and password specified when creating a superuser.
|
||||||
|
|
||||||
!!! warning
|
!!! note
|
||||||
|
By default RHEL based distros will likely block your testing attempts with firewalld. The development server port can be opened with `firewall-cmd` (add `--permanent` if you want the rule to survive server restarts):
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
firewall-cmd --zone=public --add-port=8000/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! danger
|
||||||
The development server is for development and testing purposes only. It is neither performant nor secure enough for production use. **Do not use it in production.**
|
The development server is for development and testing purposes only. It is neither performant nor secure enough for production use. **Do not use it in production.**
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
If the test service does not run, or you cannot reach the NetBox home page, something has gone wrong. Do not proceed with the rest of this guide until the installation has been corrected.
|
If the test service does not run, or you cannot reach the NetBox home page, something has gone wrong. Do not proceed with the rest of this guide until the installation has been corrected.
|
||||||
|
|
||||||
Note that the initial user interface will be locked down for non-authenticated users.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Try logging in using the superuser account we just created. Once authenticated, you'll be able to access all areas of the UI:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Type `Ctrl+c` to stop the development server.
|
Type `Ctrl+c` to stop the development server.
|
||||||
|
|||||||
@@ -31,18 +31,23 @@ sudo systemctl enable netbox netbox-rq
|
|||||||
You can use the command `systemctl status netbox` to verify that the WSGI service is running:
|
You can use the command `systemctl status netbox` to verify that the WSGI service is running:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
# systemctl status netbox.service
|
systemctl status netbox.service
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see output similar to the following:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
● netbox.service - NetBox WSGI Service
|
● netbox.service - NetBox WSGI Service
|
||||||
Loaded: loaded (/etc/systemd/system/netbox.service; enabled; vendor preset: enabled)
|
Loaded: loaded (/etc/systemd/system/netbox.service; enabled; vendor preset: enabled)
|
||||||
Active: active (running) since Tue 2020-11-17 16:18:23 UTC; 3min 35s ago
|
Active: active (running) since Mon 2021-08-30 04:02:36 UTC; 14h ago
|
||||||
Docs: https://netbox.readthedocs.io/en/stable/
|
Docs: https://netbox.readthedocs.io/en/stable/
|
||||||
Main PID: 22836 (gunicorn)
|
Main PID: 1140492 (gunicorn)
|
||||||
Tasks: 6 (limit: 2345)
|
Tasks: 19 (limit: 4683)
|
||||||
Memory: 339.3M
|
Memory: 666.2M
|
||||||
CGroup: /system.slice/netbox.service
|
CGroup: /system.slice/netbox.service
|
||||||
├─22836 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid>
|
├─1140492 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /va>
|
||||||
├─22854 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid>
|
├─1140513 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /va>
|
||||||
├─22855 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid>
|
├─1140514 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /va>
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ pip3 install django-auth-ldap
|
|||||||
Once installed, add the package to `local_requirements.txt` to ensure it is re-installed during future rebuilds of the virtual environment:
|
Once installed, add the package to `local_requirements.txt` to ensure it is re-installed during future rebuilds of the virtual environment:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo echo django-auth-ldap >> /opt/netbox/local_requirements.txt
|
sudo sh -c "echo 'django-auth-ldap' >> /opt/netbox/local_requirements.txt"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
@@ -74,7 +74,7 @@ STARTTLS can be configured by setting `AUTH_LDAP_START_TLS = True` and using the
|
|||||||
### User Authentication
|
### User Authentication
|
||||||
|
|
||||||
!!! info
|
!!! info
|
||||||
When using Windows Server 2012, `AUTH_LDAP_USER_DN_TEMPLATE` should be set to None.
|
When using Windows Server 2012+, `AUTH_LDAP_USER_DN_TEMPLATE` should be set to None.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from django_auth_ldap.config import LDAPSearch
|
from django_auth_ldap.config import LDAPSearch
|
||||||
@@ -140,9 +140,9 @@ AUTH_LDAP_CACHE_TIMEOUT = 3600
|
|||||||
|
|
||||||
## Troubleshooting LDAP
|
## Troubleshooting LDAP
|
||||||
|
|
||||||
`systemctl restart netbox` restarts the Netbox service, and initiates any changes made to `ldap_config.py`. If there are syntax errors present, the NetBox process will not spawn an instance, and errors should be logged to `/var/log/messages`.
|
`systemctl restart netbox` restarts the NetBox service, and initiates any changes made to `ldap_config.py`. If there are syntax errors present, the NetBox process will not spawn an instance, and errors should be logged to `/var/log/messages`.
|
||||||
|
|
||||||
For troubleshooting LDAP user/group queries, add or merge the following [logging](/configuration/optional-settings.md#logging) configuration to `configuration.py`:
|
For troubleshooting LDAP user/group queries, add or merge the following [logging](../configuration/optional-settings.md#logging) configuration to `configuration.py`:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
|
|||||||
@@ -11,11 +11,15 @@ The following sections detail how to set up a new instance of NetBox:
|
|||||||
5. [HTTP server](5-http-server.md)
|
5. [HTTP server](5-http-server.md)
|
||||||
6. [LDAP authentication](6-ldap.md) (optional)
|
6. [LDAP authentication](6-ldap.md) (optional)
|
||||||
|
|
||||||
|
The video below demonstrates the installation of NetBox v2.10.3 on Ubuntu 20.04 for your reference.
|
||||||
|
|
||||||
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/dFANGlxXEng" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
| Dependency | Minimum Version |
|
| Dependency | Minimum Version |
|
||||||
|------------|-----------------|
|
|------------|-----------------|
|
||||||
| Python | 3.6 |
|
| Python | 3.7 |
|
||||||
| PostgreSQL | 9.6 |
|
| PostgreSQL | 9.6 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
@@ -26,6 +30,3 @@ Below is a simplified overview of the NetBox application stack for reference:
|
|||||||
## Upgrading
|
## Upgrading
|
||||||
|
|
||||||
If you are upgrading from an existing installation, please consult the [upgrading guide](upgrading.md).
|
If you are upgrading from an existing installation, please consult the [upgrading guide](upgrading.md).
|
||||||
|
|
||||||
!!! note
|
|
||||||
Beginning with v2.5.9, the official documentation calls for systemd to be used for managing the WSGI workers in place of supervisord. Please see the instructions for [migrating to systemd](migrating-to-systemd.md) if you are still using supervisord.
|
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
## Review the Release Notes
|
## Review the Release Notes
|
||||||
|
|
||||||
Prior to upgrading your NetBox instance, be sure to carefully review all [release notes](../../release-notes/) that have been published since your current version was released. Although the upgrade process typically does not involve additional work, certain releases may introduce breaking or backward-incompatible changes. These are called out in the release notes under the release in which the change went into effect.
|
Prior to upgrading your NetBox instance, be sure to carefully review all [release notes](../release-notes/index.md) that have been published since your current version was released. Although the upgrade process typically does not involve additional work, certain releases may introduce breaking or backward-incompatible changes. These are called out in the release notes under the release in which the change went into effect.
|
||||||
|
|
||||||
## Update Dependencies to Required Versions
|
## Update Dependencies to Required Versions
|
||||||
|
|
||||||
NetBox v2.9.0 and later requires the following:
|
NetBox v3.0 and later requires the following:
|
||||||
|
|
||||||
| Dependency | Minimum Version |
|
| Dependency | Minimum Version |
|
||||||
|------------|-----------------|
|
|------------|-----------------|
|
||||||
| Python | 3.6 |
|
| Python | 3.7 |
|
||||||
| PostgreSQL | 9.6 |
|
| PostgreSQL | 9.6 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
@@ -75,16 +75,23 @@ Once the new code is in place, verify that any optional Python packages required
|
|||||||
sudo ./upgrade.sh
|
sudo ./upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
If the default version of Python is not at least 3.7, you'll need to pass the path to a supported Python version as an environment variable when calling the upgrade script. For example:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
sudo PYTHON=/usr/bin/python3.7 ./upgrade.sh
|
||||||
|
```
|
||||||
|
|
||||||
This script performs the following actions:
|
This script performs the following actions:
|
||||||
|
|
||||||
* Destroys and rebuilds the Python virtual environment
|
* Destroys and rebuilds the Python virtual environment
|
||||||
* Installs all required Python packages (listed in `requirements.txt`)
|
* Installs all required Python packages (listed in `requirements.txt`)
|
||||||
* Installs any additional packages from `local_requirements.txt`
|
* Installs any additional packages from `local_requirements.txt`
|
||||||
* Applies any database migrations that were included in the release
|
* Applies any database migrations that were included in the release
|
||||||
|
* Builds the documentation locally (for offline use)
|
||||||
* Collects all static files to be served by the HTTP service
|
* Collects all static files to be served by the HTTP service
|
||||||
* Deletes stale content types from the database
|
* Deletes stale content types from the database
|
||||||
* Deletes all expired user sessions from the database
|
* Deletes all expired user sessions from the database
|
||||||
* Clears all cached data to prevent conflicts with the new release
|
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
If the upgrade script prompts a warning about unreflected database migrations, this indicates that some change has
|
If the upgrade script prompts a warning about unreflected database migrations, this indicates that some change has
|
||||||
@@ -102,5 +109,12 @@ Finally, restart the gunicorn and RQ services:
|
|||||||
sudo systemctl restart netbox netbox-rq
|
sudo systemctl restart netbox netbox-rq
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! note
|
## Verify Housekeeping Scheduling
|
||||||
If upgrading from an installation that uses supervisord, please see the instructions for [migrating to systemd](migrating-to-systemd.md). The use of supervisord is no longer supported.
|
|
||||||
|
If upgrading from a release prior to NetBox v3.0, check that a cron task (or similar scheduled process) has been configured to run NetBox's nightly housekeeping command. A shell script which invokes this command is included at `contrib/netbox-housekeeping.sh`. It can be copied to your system's daily cron task directory, or included within the crontab directly. (If NetBox has been installed in a nonstandard path, be sure to update the system paths within this script first.)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cp /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [housekeeping documentation](../administration/housekeeping.md) for further details.
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 76 KiB |
BIN
docs/media/release-notes/netbox30_ui.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 336 KiB |
|
Before Width: | Height: | Size: 336 KiB |
|
Before Width: | Height: | Size: 339 KiB |
BIN
docs/media/screenshots/cable-trace.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
docs/media/screenshots/home-dark.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
docs/media/screenshots/home-light.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
docs/media/screenshots/prefixes-list.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
docs/media/screenshots/rack.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
The association of a circuit with a particular site and/or device is modeled separately as a circuit termination. A circuit may have up to two terminations, labeled A and Z. A single-termination circuit can be used when you don't know (or care) about the far end of a circuit (for example, an Internet access circuit which connects to a transit provider). A dual-termination circuit is useful for tracking circuits which connect two sites.
|
The association of a circuit with a particular site and/or device is modeled separately as a circuit termination. A circuit may have up to two terminations, labeled A and Z. A single-termination circuit can be used when you don't know (or care) about the far end of a circuit (for example, an Internet access circuit which connects to a transit provider). A dual-termination circuit is useful for tracking circuits which connect two sites.
|
||||||
|
|
||||||
Each circuit termination is tied to a site, and may optionally be connected via a cable to a specific device interface or port within that site. Each termination must be assigned a port speed, and can optionally be assigned an upstream speed if it differs from the downstream speed (a common scenario with e.g. DOCSIS cable modems). Fields are also available to track cross-connect and patch panel details.
|
Each circuit termination is attached to either a site or to a provider network. Site terminations may optionally be connected via a cable to a specific device interface or port within that site. Each termination must be assigned a port speed, and can optionally be assigned an upstream speed if it differs from the downstream speed (a common scenario with e.g. DOCSIS cable modems). Fields are also available to track cross-connect and patch panel details.
|
||||||
|
|
||||||
In adherence with NetBox's philosophy of closely modeling the real world, a circuit may terminate only to a physical interface. For example, circuits may not terminate to LAG interfaces, which are virtual in nature. In such cases, a separate physical circuit is associated with each LAG member interface and each needs to be modeled discretely.
|
In adherence with NetBox's philosophy of closely modeling the real world, a circuit may be connected only to a physical interface. For example, circuits may not terminate to LAG interfaces, which are virtual in nature. In such cases, a separate physical circuit is associated with each LAG member interface and each needs to be modeled discretely.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
A circuit in NetBox represents a physical link, and cannot have more than two endpoints. When modeling a multi-point topology, each leg of the topology must be defined as a discrete circuit, with one end terminating within the provider's infrastructure.
|
A circuit in NetBox represents a physical link, and cannot have more than two endpoints. When modeling a multi-point topology, each leg of the topology must be defined as a discrete circuit, with one end terminating within the provider's infrastructure. The provider network model is ideal for representing these networks.
|
||||||
|
|||||||
5
docs/models/circuits/providernetwork.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Provider Networks
|
||||||
|
|
||||||
|
This model can be used to represent the boundary of a provider network, the details of which are unknown or unimportant to the NetBox user. For example, it might represent a provider's regional MPLS network to which multiple circuits provide connectivity.
|
||||||
|
|
||||||
|
Each provider network must be assigned to a provider. A circuit may terminate to either a provider network or to a site.
|
||||||
@@ -8,7 +8,7 @@ A device is said to be full-depth if its installation on one rack face prevents
|
|||||||
|
|
||||||
Each device must be instantiated from a pre-created device type, and its default components (console ports, power ports, interfaces, etc.) will be created automatically. (The device type associated with a device may be changed after its creation, however its components will not be updated retroactively.)
|
Each device must be instantiated from a pre-created device type, and its default components (console ports, power ports, interfaces, etc.) will be created automatically. (The device type associated with a device may be changed after its creation, however its components will not be updated retroactively.)
|
||||||
|
|
||||||
Each device must be assigned a site, device role, and operational status, and may optionally be assigned to a specific rack within a site. A platform, serial number, and asset tag may optionally be assigned to each device.
|
Each device must be assigned a site, device role, and operational status, and may optionally be assigned to a specific location and/or rack within a site. A platform, serial number, and asset tag may optionally be assigned to each device.
|
||||||
|
|
||||||
Device names must be unique within a site, unless the device has been assigned to a tenant. Devices may also be unnamed.
|
Device names must be unique within a site, unless the device has been assigned to a tenant. Devices may also be unnamed.
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,15 @@
|
|||||||
|
|
||||||
Interfaces in NetBox represent network interfaces used to exchange data with connected devices. On modern networks, these are most commonly Ethernet, but other types are supported as well. Each interface must be assigned a type, and may optionally be assigned a MAC address, MTU, and IEEE 802.1Q mode (tagged or access). Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management).
|
Interfaces in NetBox represent network interfaces used to exchange data with connected devices. On modern networks, these are most commonly Ethernet, but other types are supported as well. Each interface must be assigned a type, and may optionally be assigned a MAC address, MTU, and IEEE 802.1Q mode (tagged or access). Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management).
|
||||||
|
|
||||||
Interfaces may be physical or virtual in nature, but only physical interfaces may be connected via cables. Cables can connect interfaces to pass-through ports, circuit terminations, or other interfaces.
|
!!! note
|
||||||
|
Although devices and virtual machines both can have interfaces, a separate model is used for each. Thus, device interfaces have some properties that are not present on virtual machine interfaces and vice versa.
|
||||||
|
|
||||||
|
### Interface Types
|
||||||
|
|
||||||
|
Interfaces may be physical or virtual in nature, but only physical interfaces may be connected via cables. Cables can connect interfaces to pass-through ports, circuit terminations, or other interfaces. Virtual interfaces, such as 802.1Q-tagged subinterfaces, may be assigned to physical parent interfaces.
|
||||||
|
|
||||||
Physical interfaces may be arranged into a link aggregation group (LAG) and associated with a parent LAG (virtual) interface. LAG interfaces can be recursively nested to model bonding of trunk groups. Like all virtual interfaces, LAG interfaces cannot be connected physically.
|
Physical interfaces may be arranged into a link aggregation group (LAG) and associated with a parent LAG (virtual) interface. LAG interfaces can be recursively nested to model bonding of trunk groups. Like all virtual interfaces, LAG interfaces cannot be connected physically.
|
||||||
|
|
||||||
IP addresses can be assigned to interfaces. VLANs can also be assigned to each interface as either tagged or untagged. (An interface may have only one untagged VLAN.)
|
### IP Address Assignment
|
||||||
|
|
||||||
!!! note
|
IP addresses can be assigned to interfaces. VLANs can also be assigned to each interface as either tagged or untagged. (An interface may have only one untagged VLAN.)
|
||||||
Although devices and virtual machines both can have interfaces, a separate model is used for each. Thus, device interfaces have some properties that are not present on virtual machine interfaces and vice versa.
|
|
||||||
|
|||||||
5
docs/models/dcim/location.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Locations
|
||||||
|
|
||||||
|
Racks and devices can be grouped by location within a site. A location may represent a floor, room, cage, or similar organizational unit. Locations can be nested to form a hierarchy. For example, you may have floors within a site, and rooms within a floor.
|
||||||
|
|
||||||
|
The name and facility ID of each rack within a location must be unique. (Racks not assigned to the same location may have identical names and/or facility IDs.)
|
||||||
@@ -4,6 +4,6 @@ A platform defines the type of software running on a device or virtual machine.
|
|||||||
|
|
||||||
Platforms may optionally be limited by manufacturer: If a platform is assigned to a particular manufacturer, it can only be assigned to devices with a type belonging to that manufacturer.
|
Platforms may optionally be limited by manufacturer: If a platform is assigned to a particular manufacturer, it can only be assigned to devices with a type belonging to that manufacturer.
|
||||||
|
|
||||||
The platform model is also used to indicate which [NAPALM](https://napalm-automation.net/) driver and any associated arguments NetBox should use when connecting to a remote device. The name of the driver along with optional parameters are stored with the platform.
|
The platform model is also used to indicate which [NAPALM](../../additional-features/napalm.md) driver and any associated arguments NetBox should use when connecting to a remote device. The name of the driver along with optional parameters are stored with the platform.
|
||||||
|
|
||||||
The assignment of platforms to devices is an optional feature, and may be disregarded if not desired.
|
The assignment of platforms to devices is an optional feature, and may be disregarded if not desired.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Power Feed
|
# Power Feed
|
||||||
|
|
||||||
A power feed represents the distribution of power from a power panel to a particular device, typically a power distribution unit (PDU). The power pot (inlet) on a device can be connected via a cable to a power feed. A power feed may optionally be assigned to a rack to allow more easily tracking the distribution of power among racks.
|
A power feed represents the distribution of power from a power panel to a particular device, typically a power distribution unit (PDU). The power port (inlet) on a device can be connected via a cable to a power feed. A power feed may optionally be assigned to a rack to allow more easily tracking the distribution of power among racks.
|
||||||
|
|
||||||
Each power feed is assigned an operational type (primary or redundant) and one of the following statuses:
|
Each power feed is assigned an operational type (primary or redundant) and one of the following statuses:
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
A power panel represents the origin point in NetBox for electrical power being disseminated by one or more power feeds. In a data center environment, one power panel often serves a group of racks, with an individual power feed extending to each rack, though this is not always the case. It is common to have two sets of panels and feeds arranged in parallel to provide redundant power to each rack.
|
A power panel represents the origin point in NetBox for electrical power being disseminated by one or more power feeds. In a data center environment, one power panel often serves a group of racks, with an individual power feed extending to each rack, though this is not always the case. It is common to have two sets of panels and feeds arranged in parallel to provide redundant power to each rack.
|
||||||
|
|
||||||
Each power panel must be assigned to a site, and may optionally be assigned to a particular rack group.
|
Each power panel must be assigned to a site, and may optionally be assigned to a particular location within that site.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
NetBox does not model the mechanism by which power is delivered to a power panel. Power panels define the root level of the power distribution hierarchy in NetBox.
|
NetBox does not model the mechanism by which power is delivered to a power panel. Power panels define the root level of the power distribution hierarchy in NetBox.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Racks
|
# Racks
|
||||||
|
|
||||||
The rack model represents a physical two- or four-post equipment rack in which devices can be installed. Each rack must be assigned to a site, and may optionally be assigned to a rack group and/or tenant. Racks can also be organized by user-defined functional roles.
|
The rack model represents a physical two- or four-post equipment rack in which devices can be installed. Each rack must be assigned to a site, and may optionally be assigned to a location and/or tenant. Racks can also be organized by user-defined functional roles.
|
||||||
|
|
||||||
Rack height is measured in *rack units* (U); racks are commonly between 42U and 48U tall, but NetBox allows you to define racks of arbitrary height. A toggle is provided to indicate whether rack units are in ascending (from the ground up) or descending order.
|
Rack height is measured in *rack units* (U); racks are commonly between 42U and 48U tall, but NetBox allows you to define racks of arbitrary height. A toggle is provided to indicate whether rack units are in ascending (from the ground up) or descending order.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
# Rack Groups
|
|
||||||
|
|
||||||
Racks can be organized into groups, which can be nested into themselves similar to regions. As with sites, how you choose to designate rack groups will depend on the nature of your organization. For example, if each site represents a campus, each group might represent a building within a campus. If each site represents a building, each rack group might equate to a floor or room.
|
|
||||||
|
|
||||||
Each rack group must be assigned to a parent site, and rack groups may optionally be nested within a site to model a multi-level hierarchy. For example, you might have a tier of rooms beneath a tier of floors, all belonging to the same parent building (site).
|
|
||||||
|
|
||||||
The name and facility ID of each rack within a group must be unique. (Racks not assigned to the same rack group may have identical names and/or facility IDs.)
|
|
||||||
3
docs/models/dcim/sitegroup.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Site Groups
|
||||||
|
|
||||||
|
Like regions, site groups can be used to organize sites. Whereas regions are intended to provide geographic organization, site groups can be used to classify sites by role or function. Also like regions, site groups can be nested to form a hierarchy. Sites which belong to a child group are also considered to be members of any of its parent groups.
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
A virtual chassis represents a set of devices which share a common control plane. A common example of this is a stack of switches which are connected and configured to operate as a single device. A virtual chassis must be assigned a name and may be assigned a domain.
|
A virtual chassis represents a set of devices which share a common control plane. A common example of this is a stack of switches which are connected and configured to operate as a single device. A virtual chassis must be assigned a name and may be assigned a domain.
|
||||||
|
|
||||||
Each device in the virtual chassis is referred to as a VC member, and assigned a position and (optionally) a priority. VC member devices commonly reside within the same rack, though this is not a requirement. One of the devices may be designated as the VC master: This device will typically be assigned a name, secrets, services, and other attributes related to managing the VC.
|
Each device in the virtual chassis is referred to as a VC member, and assigned a position and (optionally) a priority. VC member devices commonly reside within the same rack, though this is not a requirement. One of the devices may be designated as the VC master: This device will typically be assigned a name, services, and other attributes related to managing the VC.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
It's important to recognize the distinction between a virtual chassis and a chassis-based device. A virtual chassis is **not** suitable for modeling a chassis-based switch with removable line cards (such as the Juniper EX9208), as its line cards are _not_ physically autonomous devices.
|
It's important to recognize the distinction between a virtual chassis and a chassis-based device. A virtual chassis is **not** suitable for modeling a chassis-based switch with removable line cards (such as the Juniper EX9208), as its line cards are _not_ physically autonomous devices.
|
||||||
|
|||||||
@@ -3,11 +3,13 @@
|
|||||||
Sometimes it is desirable to associate additional data with a group of devices or virtual machines to aid in automated configuration. For example, you might want to associate a set of syslog servers for all devices within a particular region. Context data enables the association of extra user-defined data with devices and virtual machines grouped by one or more of the following assignments:
|
Sometimes it is desirable to associate additional data with a group of devices or virtual machines to aid in automated configuration. For example, you might want to associate a set of syslog servers for all devices within a particular region. Context data enables the association of extra user-defined data with devices and virtual machines grouped by one or more of the following assignments:
|
||||||
|
|
||||||
* Region
|
* Region
|
||||||
|
* Site group
|
||||||
* Site
|
* Site
|
||||||
|
* Device type (devices only)
|
||||||
* Role
|
* Role
|
||||||
* Platform
|
* Platform
|
||||||
* Cluster group
|
* Cluster group (VMs only)
|
||||||
* Cluster
|
* Cluster (VMs only)
|
||||||
* Tenant group
|
* Tenant group
|
||||||
* Tenant
|
* Tenant
|
||||||
* Tag
|
* Tag
|
||||||
|
|||||||
11
docs/models/ipam/iprange.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# IP Ranges
|
||||||
|
|
||||||
|
This model represents an arbitrary range of individual IPv4 or IPv6 addresses, inclusive of its starting and ending addresses. For instance, the range 192.0.2.10 to 192.0.2.20 has eleven members. (The total member count is available as the `size` property on an IPRange instance.) Like prefixes and IP addresses, each IP range may optionally be assigned to a VRF and/or tenant.
|
||||||
|
|
||||||
|
IP also ranges share the same functional roles as prefixes and VLANs, although the assignment of a role is optional. Each IP range must be assigned an operational status, which is one of the following:
|
||||||
|
|
||||||
|
* Active - Provisioned and in use
|
||||||
|
* Reserved - Designated for future use
|
||||||
|
* Deprecated - No longer in use
|
||||||
|
|
||||||
|
The status of a range does _not_ have any impact on its member IP addresses, which may have their statuses modified separately.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# VLANs
|
# VLANs
|
||||||
|
|
||||||
A VLAN represents an isolated layer two domain, identified by a name and a numeric ID (1-4094) as defined in [IEEE 802.1Q](https://en.wikipedia.org/wiki/IEEE_802.1Q). Each VLAN may be assigned to a site, tenant, and/or VLAN group.
|
A VLAN represents an isolated layer two domain, identified by a name and a numeric ID (1-4094) as defined in [IEEE 802.1Q](https://en.wikipedia.org/wiki/IEEE_802.1Q). VLANs are arranged into VLAN groups to define scope and to enforce uniqueness.
|
||||||
|
|
||||||
Each VLAN must be assigned one of the following operational statuses:
|
Each VLAN must be assigned one of the following operational statuses:
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# VLAN Groups
|
# VLAN Groups
|
||||||
|
|
||||||
VLAN groups can be used to organize VLANs within NetBox. Each group may optionally be assigned to a specific site, but a group cannot belong to multiple sites.
|
VLAN groups can be used to organize VLANs within NetBox. Each VLAN group can be scoped to a particular region, site group, site, location, rack, cluster group, or cluster. Member VLANs will be available for assignment to devices and/or virtual machines within the specified scope.
|
||||||
|
|
||||||
Groups can also be used to enforce uniqueness: Each VLAN within a group must have a unique ID and name. VLANs which are not assigned to a group may have overlapping names and IDs (including VLANs which belong to a common site). For example, you can create two VLANs with ID 123, but they cannot both be assigned to the same group.
|
Groups can also be used to enforce uniqueness: Each VLAN within a group must have a unique ID and name. VLANs which are not assigned to a group may have overlapping names and IDs (including VLANs which belong to a common site). For example, you can create two VLANs with ID 123, but they cannot both be assigned to the same group.
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# Secrets
|
|
||||||
|
|
||||||
A secret represents a single credential or other sensitive string of characters which must be stored securely. Each secret is assigned to a device within NetBox. The plaintext value of a secret is encrypted to a ciphertext immediately prior to storage within the database using a 256-bit AES master key. A SHA256 hash of the plaintext is also stored along with each ciphertext to validate the decrypted plaintext.
|
|
||||||
|
|
||||||
Each secret can also store an optional name parameter, which is not encrypted. This may be useful for storing user names.
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# Secret Roles
|
|
||||||
|
|
||||||
Each secret is assigned a functional role which indicates what it is used for. Secret roles are customizable. Typical roles might include:
|
|
||||||
|
|
||||||
* Login credentials
|
|
||||||
* SNMP community strings
|
|
||||||
* RADIUS/TACACS+ keys
|
|
||||||
* IKE key strings
|
|
||||||
* Routing protocol shared secrets
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# User Keys
|
|
||||||
|
|
||||||
Each user within NetBox can associate his or her account with an RSA public key. If activated by an administrator, this user key will contain a unique, encrypted copy of the AES master key needed to retrieve secret data.
|
|
||||||
|
|
||||||
User keys may be created by users individually, however they are of no use until they have been activated by a user who already possesses an active user key.
|
|
||||||
|
|
||||||
## Supported Key Format
|
|
||||||
|
|
||||||
Public key formats supported
|
|
||||||
|
|
||||||
- PKCS#1 RSAPublicKey* (PEM header: BEGIN RSA PUBLIC KEY)
|
|
||||||
- X.509 SubjectPublicKeyInfo** (PEM header: BEGIN PUBLIC KEY)
|
|
||||||
- **OpenSSH line format is not supported.**
|
|
||||||
|
|
||||||
Private key formats supported (unencrypted)
|
|
||||||
|
|
||||||
- PKCS#1 RSAPrivateKey** (PEM header: BEGIN RSA PRIVATE KEY)
|
|
||||||
- PKCS#8 PrivateKeyInfo* (PEM header: BEGIN PRIVATE KEY)
|
|
||||||
|
|
||||||
|
|
||||||
## Creating the First User Key
|
|
||||||
|
|
||||||
When NetBox is first installed, it contains no encryption keys. Before it can store secrets, a user (typically the superuser) must create a user key. This can be done by navigating to Profile > User Key.
|
|
||||||
|
|
||||||
To create a user key, you can either generate a new RSA key pair, or upload the public key belonging to a pair you already have. If generating a new key pair, **you must save the private key** locally before saving your new user key. Once your user key has been created, its public key will be displayed under your profile.
|
|
||||||
|
|
||||||
When the first user key is created in NetBox, a random master encryption key is generated automatically. This key is then encrypted using the public key provided and stored as part of your user key. **The master key cannot be recovered** without your private key.
|
|
||||||
|
|
||||||
Once a user key has been assigned an encrypted copy of the master key, it is considered activated and can now be used to encrypt and decrypt secrets.
|
|
||||||
|
|
||||||
## Creating Additional User Keys
|
|
||||||
|
|
||||||
Any user can create his or her user key by generating or uploading a public RSA key. However, a user key cannot be used to encrypt or decrypt secrets until it has been activated with an encrypted copy of the master key.
|
|
||||||
|
|
||||||
Only an administrator with an active user key can activate other user keys. To do so, access the NetBox admin UI and navigate to Secrets > User Keys. Select the user key(s) to be activated, and select "activate selected user keys" from the actions dropdown. You will need to provide your private key in order to decrypt the master key. A copy of the master key is then encrypted using the public key associated with the user key being activated.
|
|
||||||
@@ -11,4 +11,6 @@ Like devices, each VM can be assigned a platform and/or functional role, and mus
|
|||||||
* Failed
|
* Failed
|
||||||
* Decommissioning
|
* Decommissioning
|
||||||
|
|
||||||
Additional fields are available for annotating the vCPU count, memory (GB), and disk (GB) allocated to each VM. Each VM may optionally be assigned to a tenant. Virtual machines may have virtual interfaces assigned to them, but do not support any physical component.
|
Additional fields are available for annotating the vCPU count, memory (GB), and disk (GB) allocated to each VM. A VM may be allocated a partial vCPU count (e.g. 1.5 vCPU).
|
||||||
|
|
||||||
|
Each VM may optionally be assigned to a tenant. Virtual machines may have virtual interfaces assigned to them, but do not support any physical component.
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ The plugin source directory contains all of the actual Python code and other res
|
|||||||
|
|
||||||
### Create setup.py
|
### Create setup.py
|
||||||
|
|
||||||
`setup.py` is the [setup script](https://docs.python.org/3.6/distutils/setupscript.html) we'll use to install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to inform the package creation as well as to provide metadata about the plugin. An example `setup.py` is below:
|
`setup.py` is the [setup script](https://docs.python.org/3.7/distutils/setupscript.html) we'll use to install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to inform the package creation as well as to provide metadata about the plugin. An example `setup.py` is below:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from setuptools import find_packages, setup
|
from setuptools import find_packages, setup
|
||||||
@@ -113,7 +113,6 @@ NetBox looks for the `config` variable within a plugin's `__init__.py` to load i
|
|||||||
| `min_version` | Minimum version of NetBox with which the plugin is compatible |
|
| `min_version` | Minimum version of NetBox with which the plugin is compatible |
|
||||||
| `max_version` | Maximum version of NetBox with which the plugin is compatible |
|
| `max_version` | Maximum version of NetBox with which the plugin is compatible |
|
||||||
| `middleware` | A list of middleware classes to append after NetBox's build-in middleware |
|
| `middleware` | A list of middleware classes to append after NetBox's build-in middleware |
|
||||||
| `caching_config` | Plugin-specific cache configuration
|
|
||||||
| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) |
|
| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) |
|
||||||
| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) |
|
| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) |
|
||||||
|
|
||||||
@@ -386,30 +385,30 @@ class SiteAnimalCount(PluginTemplateExtension):
|
|||||||
template_extensions = [SiteAnimalCount]
|
template_extensions = [SiteAnimalCount]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Caching Configuration
|
## Background Tasks
|
||||||
|
|
||||||
By default, all query operations within a plugin are cached. To change this, define a caching configuration under the PluginConfig class' `caching_config` attribute. All configuration keys will be applied within the context of the plugin; there is no need to include the plugin name. An example configuration is below:
|
By default, Netbox provides 3 differents [RQ](https://python-rq.org/) queues to run background jobs : *high*, *default* and *low*.
|
||||||
|
These 3 core queues can be used out-of-the-box by plugins to define background tasks.
|
||||||
|
|
||||||
|
Plugins can also define dedicated queues. These queues can be configured under the PluginConfig class `queues` attribute. An example configuration
|
||||||
|
is below:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
class MyPluginConfig(PluginConfig):
|
class MyPluginConfig(PluginConfig):
|
||||||
|
name = 'myplugin'
|
||||||
...
|
...
|
||||||
caching_config = {
|
queues = [
|
||||||
'foo': {
|
'queue1',
|
||||||
'ops': 'get',
|
'queue2',
|
||||||
'timeout': 60 * 15,
|
'queue-whatever-the-name'
|
||||||
},
|
]
|
||||||
'*': {
|
|
||||||
'ops': 'all',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
To disable caching for your plugin entirely, set:
|
The PluginConfig above creates 3 queues with the following names: *myplugin.queue1*, *myplugin.queue2*, *myplugin.queue-whatever-the-name*.
|
||||||
|
As you can see, the queue's name is always preprended with the plugin's name, to avoid any name clashes between different plugins.
|
||||||
|
|
||||||
|
In case you create dedicated queues for your plugin, it is strongly advised to also create a dedicated RQ worker instance. This instance should only listen to the queues defined in your plugin - to avoid impact between your background tasks and netbox internal tasks.
|
||||||
|
|
||||||
```python
|
|
||||||
caching_config = {
|
|
||||||
'*': None
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
python manage.py rqworker myplugin.queue1 myplugin.queue2 myplugin.queue-whatever-the-name
|
||||||
See the [django-cacheops](https://github.com/Suor/django-cacheops) documentation for more detail on configuring caching.
|
```
|
||||||
|
|||||||
@@ -89,3 +89,58 @@ Restart the WSGI service to load the new plugin:
|
|||||||
```no-highlight
|
```no-highlight
|
||||||
# sudo systemctl restart netbox
|
# sudo systemctl restart netbox
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Removing Plugins
|
||||||
|
|
||||||
|
Follow these steps to completely remove a plugin.
|
||||||
|
|
||||||
|
### Update Configuration
|
||||||
|
|
||||||
|
Remove the plugin from the `PLUGINS` list in `configuration.py`. Also remove any relevant configuration parameters from `PLUGINS_CONFIG`.
|
||||||
|
|
||||||
|
### Remove the Python Package
|
||||||
|
|
||||||
|
Use `pip` to remove the installed plugin:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
$ source /opt/netbox/venv/bin/activate
|
||||||
|
(venv) $ pip uninstall <package>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart WSGI Service
|
||||||
|
|
||||||
|
Restart the WSGI service:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
# sudo systemctl restart netbox
|
||||||
|
```
|
||||||
|
|
||||||
|
### Drop Database Tables
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
This step is necessary only for plugin which have created one or more database tables (generally through the introduction of new models). Check your plugin's documentation if unsure.
|
||||||
|
|
||||||
|
Enter the PostgreSQL database shell to determine if the plugin has created any SQL tables. Substitute `pluginname` in the example below for the name of the plugin being removed. (You can also run the `\dt` command without a pattern to list _all_ tables.)
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
netbox=> \dt pluginname_*
|
||||||
|
List of relations
|
||||||
|
List of relations
|
||||||
|
Schema | Name | Type | Owner
|
||||||
|
--------+----------------+-------+--------
|
||||||
|
public | pluginname_foo | table | netbox
|
||||||
|
public | pluginname_bar | table | netbox
|
||||||
|
(2 rows)
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Exercise extreme caution when removing tables. Users are strongly encouraged to perform a backup of their database immediately before taking these actions.
|
||||||
|
|
||||||
|
Drop each of the listed tables to remove it from the database:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
netbox=> DROP TABLE pluginname_foo;
|
||||||
|
DROP TABLE
|
||||||
|
netbox=> DROP TABLE pluginname_bar;
|
||||||
|
DROP TABLE
|
||||||
|
```
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
version-2.10.md
|
version-3.0.md
|
||||||
@@ -121,7 +121,7 @@ A new API endpoint has been added at `/api/ipam/prefixes/<pk>/available-ips/`. A
|
|||||||
|
|
||||||
#### NAPALM Integration ([#1348](https://github.com/netbox-community/netbox/issues/1348))
|
#### NAPALM Integration ([#1348](https://github.com/netbox-community/netbox/issues/1348))
|
||||||
|
|
||||||
The [NAPALM automation](https://napalm-automation.net/) library provides an abstracted interface for pulling live data (e.g. uptime, software version, running config, LLDP neighbors, etc.) from network devices. The NetBox API has been extended to support executing read-only NAPALM methods on devices defined in NetBox. To enable this functionality, ensure that NAPALM has been installed (`pip install napalm`) and the `NETBOX_USERNAME` and `NETBOX_PASSWORD` [configuration parameters](https://netbox.readthedocs.io/en/stable/configuration/optional-settings/#netbox_username) have been set in configuration.py.
|
The [NAPALM automation](https://github.com/napalm-automation/napalm) library provides an abstracted interface for pulling live data (e.g. uptime, software version, running config, LLDP neighbors, etc.) from network devices. The NetBox API has been extended to support executing read-only NAPALM methods on devices defined in NetBox. To enable this functionality, ensure that NAPALM has been installed (`pip install napalm`) and the `NETBOX_USERNAME` and `NETBOX_PASSWORD` [configuration parameters](https://netbox.readthedocs.io/en/stable/configuration/optional-settings/#netbox_username) have been set in configuration.py.
|
||||||
|
|
||||||
### Enhancements
|
### Enhancements
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,144 @@
|
|||||||
# NetBox v2.10
|
# NetBox v2.10
|
||||||
|
|
||||||
|
## v2.10.10 (2021-04-15)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#5796](https://github.com/netbox-community/netbox/issues/5796) - Add DC terminal power port, outlet types
|
||||||
|
* [#5980](https://github.com/netbox-community/netbox/issues/5980) - Add Saf-D-Grid power port, outlet types
|
||||||
|
* [#6157](https://github.com/netbox-community/netbox/issues/6157) - Support Markdown rendering for report logs
|
||||||
|
* [#6160](https://github.com/netbox-community/netbox/issues/6160) - Add F connector port type
|
||||||
|
* [#6168](https://github.com/netbox-community/netbox/issues/6168) - Add SFP56 50GE interface type
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5419](https://github.com/netbox-community/netbox/issues/5419) - Update parent device/VM when deleting a primary IP
|
||||||
|
* [#5643](https://github.com/netbox-community/netbox/issues/5643) - Fix VLAN assignment when editing VM interfaces in bulk
|
||||||
|
* [#5652](https://github.com/netbox-community/netbox/issues/5652) - Update object data when renaming a custom field
|
||||||
|
* [#6056](https://github.com/netbox-community/netbox/issues/6056) - Optimize change log cleanup
|
||||||
|
* [#6144](https://github.com/netbox-community/netbox/issues/6144) - Fix MAC address field display in VM interfaces search form
|
||||||
|
* [#6152](https://github.com/netbox-community/netbox/issues/6152) - Fix custom field filtering for cables, virtual chassis
|
||||||
|
* [#6162](https://github.com/netbox-community/netbox/issues/6162) - Fix choice field filters (multiple models)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.10.9 (2021-04-12)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#5526](https://github.com/netbox-community/netbox/issues/5526) - Add MAC address search field to VM interfaces list
|
||||||
|
* [#5756](https://github.com/netbox-community/netbox/issues/5756) - Omit child devices from non-racked devices list under rack view
|
||||||
|
* [#5840](https://github.com/netbox-community/netbox/issues/5840) - Add column to cable termination objects to display cable color
|
||||||
|
* [#6054](https://github.com/netbox-community/netbox/issues/6054) - Display NAPALM-enabled device tabs only when relevant
|
||||||
|
* [#6083](https://github.com/netbox-community/netbox/issues/6083) - Support disabling TLS certificate validation for Redis
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5805](https://github.com/netbox-community/netbox/issues/5805) - Fix missing custom field filters for cables, rack reservations
|
||||||
|
* [#6070](https://github.com/netbox-community/netbox/issues/6070) - Add missing `count_ipaddresses` attribute to VMInterface serializer
|
||||||
|
* [#6073](https://github.com/netbox-community/netbox/issues/6073) - Permit users to manage their own REST API tokens without needing explicit permission
|
||||||
|
* [#6081](https://github.com/netbox-community/netbox/issues/6081) - Fix interface connections REST API endpoint
|
||||||
|
* [#6082](https://github.com/netbox-community/netbox/issues/6082) - Support colons in webhook header values
|
||||||
|
* [#6108](https://github.com/netbox-community/netbox/issues/6108) - Do not infer tenant assignment from parent objects for prefixes, IP addresses
|
||||||
|
* [#6117](https://github.com/netbox-community/netbox/issues/6117) - Handle exception when attempting to assign an MPTT-enabled model as its own parent
|
||||||
|
* [#6131](https://github.com/netbox-community/netbox/issues/6131) - Correct handling of boolean fields when cloning objects
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.10.8 (2021-03-26)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6060](https://github.com/netbox-community/netbox/issues/6060) - Fix exception on cable trace in UI (regression from #5650)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.10.7 (2021-03-25)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#5641](https://github.com/netbox-community/netbox/issues/5641) - Allow filtering device components by label
|
||||||
|
* [#5723](https://github.com/netbox-community/netbox/issues/5723) - Allow customization of the geographic mapping service via `MAPS_URL` config parameter
|
||||||
|
* [#5736](https://github.com/netbox-community/netbox/issues/5736) - Allow changing site assignment when bulk editing devices
|
||||||
|
* [#5953](https://github.com/netbox-community/netbox/issues/5953) - Support Markdown rendering for custom script descriptions
|
||||||
|
* [#6040](https://github.com/netbox-community/netbox/issues/6040) - Add UI search fields for asset tag for devices and racks
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5595](https://github.com/netbox-community/netbox/issues/5595) - Restore ability to delete an uploaded device type image
|
||||||
|
* [#5650](https://github.com/netbox-community/netbox/issues/5650) - Denote when the total length of a cable trace may exceed the indicated value
|
||||||
|
* [#5962](https://github.com/netbox-community/netbox/issues/5962) - Ensure consistent display of change log action labels
|
||||||
|
* [#5966](https://github.com/netbox-community/netbox/issues/5966) - Skip Markdown reference link when tabbing through form fields
|
||||||
|
* [#5977](https://github.com/netbox-community/netbox/issues/5977) - Correct validation of `RELEASE_CHECK_URL` config parameter
|
||||||
|
* [#6006](https://github.com/netbox-community/netbox/issues/6006) - Fix VLAN group/site association for bulk prefix import
|
||||||
|
* [#6010](https://github.com/netbox-community/netbox/issues/6010) - Eliminate duplicate virtual chassis search results
|
||||||
|
* [#6012](https://github.com/netbox-community/netbox/issues/6012) - Pre-populate attributes when creating an available child prefix via the UI
|
||||||
|
* [#6023](https://github.com/netbox-community/netbox/issues/6023) - Fix display of bottom banner with uBlock Origin enabled
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.10.6 (2021-03-09)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#5592](https://github.com/netbox-community/netbox/issues/5592) - Add IP addresses count to VRF view
|
||||||
|
* [#5630](https://github.com/netbox-community/netbox/issues/5630) - Add QSFP+ (64GFC) FibreChannel Interface option
|
||||||
|
* [#5884](https://github.com/netbox-community/netbox/issues/5884) - Enable custom links for device components
|
||||||
|
* [#5914](https://github.com/netbox-community/netbox/issues/5914) - Add edit/delete buttons for IP addresses on interface view
|
||||||
|
* [#5942](https://github.com/netbox-community/netbox/issues/5942) - Add button to add a new IP address on interface view
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5703](https://github.com/netbox-community/netbox/issues/5703) - Fix VRF and Tenant field population when adding IP addresses from prefix
|
||||||
|
* [#5819](https://github.com/netbox-community/netbox/issues/5819) - Enable ordering of virtual machines by primary IP address
|
||||||
|
* [#5872](https://github.com/netbox-community/netbox/issues/5872) - Ordering of devices by primary IP should respect `PREFER_IPV4` configuration parameter
|
||||||
|
* [#5922](https://github.com/netbox-community/netbox/issues/5922) - Fix options for filtering object permissions in admin UI
|
||||||
|
* [#5935](https://github.com/netbox-community/netbox/issues/5935) - Fix filtering prefixes list by multiple prefix values
|
||||||
|
* [#5948](https://github.com/netbox-community/netbox/issues/5948) - Invalidate cached queries when running `renaturalize`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.10.5 (2021-02-24)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5315](https://github.com/netbox-community/netbox/issues/5315) - Fix site unassignment from VLAN when using "None" option
|
||||||
|
* [#5626](https://github.com/netbox-community/netbox/issues/5626) - Fix REST API representation for circuit terminations connected to non-interface endpoints
|
||||||
|
* [#5716](https://github.com/netbox-community/netbox/issues/5716) - Fix filtering rack reservations by custom field
|
||||||
|
* [#5718](https://github.com/netbox-community/netbox/issues/5718) - Fix bulk editing of services when no port(s) are defined
|
||||||
|
* [#5735](https://github.com/netbox-community/netbox/issues/5735) - Ensure consistent treatment of duplicate IP addresses
|
||||||
|
* [#5738](https://github.com/netbox-community/netbox/issues/5738) - Fix redirect to device components view after disconnecting a cable
|
||||||
|
* [#5753](https://github.com/netbox-community/netbox/issues/5753) - Fix Redis Sentinel password application for caching
|
||||||
|
* [#5786](https://github.com/netbox-community/netbox/issues/5786) - Allow setting null tenant group on tenant via REST API
|
||||||
|
* [#5841](https://github.com/netbox-community/netbox/issues/5841) - Disallow the creation of available prefixes/IP addresses in violation of assigned permission constraints
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.10.4 (2021-01-26)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#5542](https://github.com/netbox-community/netbox/issues/5542) - Show cable trace lengths in both meters and feet
|
||||||
|
* [#5570](https://github.com/netbox-community/netbox/issues/5570) - Add "management only" filter widget for interfaces list
|
||||||
|
* [#5586](https://github.com/netbox-community/netbox/issues/5586) - Allow filtering virtual chassis by name and master
|
||||||
|
* [#5612](https://github.com/netbox-community/netbox/issues/5612) - Add GG45 and TERA port types, and CAT7a and CAT8 cable types
|
||||||
|
* [#5678](https://github.com/netbox-community/netbox/issues/5678) - Show available type choices for all device component import forms
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5232](https://github.com/netbox-community/netbox/issues/5232) - Correct swagger definition for ip_prefixes_available-ips_create API
|
||||||
|
* [#5574](https://github.com/netbox-community/netbox/issues/5574) - Restrict the creation of device bay templates on non-parent device types
|
||||||
|
* [#5584](https://github.com/netbox-community/netbox/issues/5584) - Restore power utilization panel under device view
|
||||||
|
* [#5597](https://github.com/netbox-community/netbox/issues/5597) - Fix ordering devices by primary IP address
|
||||||
|
* [#5603](https://github.com/netbox-community/netbox/issues/5603) - Fix display of white cables in trace view
|
||||||
|
* [#5639](https://github.com/netbox-community/netbox/issues/5639) - Fix filtering connection lists by device name
|
||||||
|
* [#5640](https://github.com/netbox-community/netbox/issues/5640) - Fix permissions assessment when adding VM interfaces in bulk
|
||||||
|
* [#5648](https://github.com/netbox-community/netbox/issues/5648) - Include VC member interfaces on interfaces tab count when viewing VC master
|
||||||
|
* [#5665](https://github.com/netbox-community/netbox/issues/5665) - Validate rack group is assigned to same site when creating a rack
|
||||||
|
* [#5683](https://github.com/netbox-community/netbox/issues/5683) - Correct rack elevation displayed when viewing a reservation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## v2.10.3 (2021-01-05)
|
## v2.10.3 (2021-01-05)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
@@ -161,43 +300,43 @@ All end-to-end cable paths are now cached using the new CablePath backend model.
|
|||||||
* Removed the `/extras/_custom_field_choices/` endpoint (replaced by new custom fields endpoint)
|
* Removed the `/extras/_custom_field_choices/` endpoint (replaced by new custom fields endpoint)
|
||||||
* Added the `/status/` endpoint to convey NetBox's current status
|
* Added the `/status/` endpoint to convey NetBox's current status
|
||||||
* circuits.CircuitTermination:
|
* circuits.CircuitTermination:
|
||||||
* Added the `/trace/` endpoint
|
* Added the `/trace/` endpoint
|
||||||
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* `port_speed` may now be null
|
* `port_speed` may now be null
|
||||||
* dcim.Cable: Added `custom_fields`
|
* dcim.Cable: Added `custom_fields`
|
||||||
* dcim.ConsolePort:
|
* dcim.ConsolePort:
|
||||||
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* Removed `connection_status` from nested serializer
|
* Removed `connection_status` from nested serializer
|
||||||
* dcim.ConsoleServerPort:
|
* dcim.ConsoleServerPort:
|
||||||
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* Removed `connection_status` from nested serializer
|
* Removed `connection_status` from nested serializer
|
||||||
* dcim.FrontPort:
|
* dcim.FrontPort:
|
||||||
* Replaced the `/trace/` endpoint with `/paths/`, which returns a list of cable paths
|
* Replaced the `/trace/` endpoint with `/paths/`, which returns a list of cable paths
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* dcim.Interface:
|
* dcim.Interface:
|
||||||
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* Removed `connection_status` from nested serializer
|
* Removed `connection_status` from nested serializer
|
||||||
* dcim.InventoryItem: The `_depth` field has been added to reflect MPTT positioning
|
* dcim.InventoryItem: The `_depth` field has been added to reflect MPTT positioning
|
||||||
* dcim.PowerFeed:
|
* dcim.PowerFeed:
|
||||||
* Added the `/trace/` endpoint
|
* Added the `/trace/` endpoint
|
||||||
* Added fields `connected_endpoint`, `connected_endpoint_type`, `connected_endpoint_reachable`, `cable_peer`, and `cable_peer_type`
|
* Added fields `connected_endpoint`, `connected_endpoint_type`, `connected_endpoint_reachable`, `cable_peer`, and `cable_peer_type`
|
||||||
* dcim.PowerOutlet:
|
* dcim.PowerOutlet:
|
||||||
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* Removed `connection_status` from nested serializer
|
* Removed `connection_status` from nested serializer
|
||||||
* dcim.PowerPanel: Added `custom_fields`
|
* dcim.PowerPanel: Added `custom_fields`
|
||||||
* dcim.PowerPort
|
* dcim.PowerPort
|
||||||
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
* Replaced `connection_status` with `connected_endpoint_reachable` (boolean)
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* Removed `connection_status` from nested serializer
|
* Removed `connection_status` from nested serializer
|
||||||
* dcim.RackReservation: Added `custom_fields`
|
* dcim.RackReservation: Added `custom_fields`
|
||||||
* dcim.RearPort:
|
* dcim.RearPort:
|
||||||
* Replaced the `/trace/` endpoint with `/paths/`, which returns a list of cable paths
|
* Replaced the `/trace/` endpoint with `/paths/`, which returns a list of cable paths
|
||||||
* Added `cable_peer` and `cable_peer_type`
|
* Added `cable_peer` and `cable_peer_type`
|
||||||
* dcim.VirtualChassis: Added `custom_fields`
|
* dcim.VirtualChassis: Added `custom_fields`
|
||||||
* extras.ExportTemplate: The `template_language` field has been removed
|
* extras.ExportTemplate: The `template_language` field has been removed
|
||||||
* extras.Graph: This API endpoint has been removed (see #4349)
|
* extras.Graph: This API endpoint has been removed (see #4349)
|
||||||
|
|||||||
443
docs/release-notes/version-2.11.md
Normal file
@@ -0,0 +1,443 @@
|
|||||||
|
# NetBox v2.11
|
||||||
|
|
||||||
|
## v2.11.12 (2021-08-23)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6748](https://github.com/netbox-community/netbox/issues/6748) - Add site group filter to devices list
|
||||||
|
* [#6790](https://github.com/netbox-community/netbox/issues/6790) - Recognize a /32 IPv4 address as a child of a /32 IPv4 prefix
|
||||||
|
* [#6872](https://github.com/netbox-community/netbox/issues/6872) - Add table configuration button to child prefixes view
|
||||||
|
* [#6929](https://github.com/netbox-community/netbox/issues/6929) - Introduce `LOGIN_PERSISTENCE` configuration parameter to persist user sessions
|
||||||
|
* [#7011](https://github.com/netbox-community/netbox/issues/7011) - Add search field to VM interfaces filter form
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5968](https://github.com/netbox-community/netbox/issues/5968) - Model forms should save empty custom field values as null
|
||||||
|
* [#6326](https://github.com/netbox-community/netbox/issues/6326) - Enable filtering assigned VLANs by group in interface edit form
|
||||||
|
* [#6686](https://github.com/netbox-community/netbox/issues/6686) - Force assignment of null custom field values to objects
|
||||||
|
* [#6776](https://github.com/netbox-community/netbox/issues/6776) - Fix erroneous webhook dispatch on failure to save objects
|
||||||
|
* [#6974](https://github.com/netbox-community/netbox/issues/6974) - Show contextual label for IP address role
|
||||||
|
* [#7012](https://github.com/netbox-community/netbox/issues/7012) - Fix hidden "add components" dropdown on devices list
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.11 (2021-08-12)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6883](https://github.com/netbox-community/netbox/issues/6883) - Add C21 & C22 power types
|
||||||
|
* [#6921](https://github.com/netbox-community/netbox/issues/6921) - Employ a sandbox when rendering Jinja2 code for increased security
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6740](https://github.com/netbox-community/netbox/issues/6740) - Add import button to VM interfaces list
|
||||||
|
* [#6892](https://github.com/netbox-community/netbox/issues/6892) - Fix validation of unit ranges when creating a rack reservation
|
||||||
|
* [#6896](https://github.com/netbox-community/netbox/issues/6896) - Fix validation of IP address assigned as device/VM primary via NAT relation
|
||||||
|
* [#6902](https://github.com/netbox-community/netbox/issues/6902) - Populate device field when cloning device components
|
||||||
|
* [#6908](https://github.com/netbox-community/netbox/issues/6908) - Allow assignment of scope to VLAN groups upon import
|
||||||
|
* [#6909](https://github.com/netbox-community/netbox/issues/6909) - Remove extraneous `site` column from VLAN group import form
|
||||||
|
* [#6910](https://github.com/netbox-community/netbox/issues/6910) - Fix exception on invalid CSV import column name
|
||||||
|
* [#6918](https://github.com/netbox-community/netbox/issues/6918) - Fix return URL persistence when adding multiple objects sequentially
|
||||||
|
* [#6935](https://github.com/netbox-community/netbox/issues/6935) - Remove extraneous columns from inventory item and device bay tables
|
||||||
|
* [#6936](https://github.com/netbox-community/netbox/issues/6936) - Add missing `parent` column to inventory item import form
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.10 (2021-07-28)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6560](https://github.com/netbox-community/netbox/issues/6560) - Enable CSV import via uploaded file
|
||||||
|
* [#6644](https://github.com/netbox-community/netbox/issues/6644) - Add 6P/4P pass-through port types
|
||||||
|
* [#6771](https://github.com/netbox-community/netbox/issues/6771) - Add count of inventory items to manufacturer view
|
||||||
|
* [#6785](https://github.com/netbox-community/netbox/issues/6785) - Add "hardwired" type for power port types
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#5442](https://github.com/netbox-community/netbox/issues/5442) - Fix assignment of permissions based on LDAP groups
|
||||||
|
* [#5627](https://github.com/netbox-community/netbox/issues/5627) - Fix filtering of interface connections list
|
||||||
|
* [#6759](https://github.com/netbox-community/netbox/issues/6759) - Fix assignment of parent interfaces for bulk import
|
||||||
|
* [#6773](https://github.com/netbox-community/netbox/issues/6773) - Add missing `display` field to rack unit serializer
|
||||||
|
* [#6774](https://github.com/netbox-community/netbox/issues/6774) - Fix A/Z assignment when swapping circuit terminations
|
||||||
|
* [#6777](https://github.com/netbox-community/netbox/issues/6777) - Fix default value validation for custom text fields
|
||||||
|
* [#6778](https://github.com/netbox-community/netbox/issues/6778) - Rack reservation should display rack's location
|
||||||
|
* [#6780](https://github.com/netbox-community/netbox/issues/6780) - Include rack location in navigation breadcrumbs
|
||||||
|
* [#6794](https://github.com/netbox-community/netbox/issues/6794) - Fix device name display on device status view
|
||||||
|
* [#6812](https://github.com/netbox-community/netbox/issues/6812) - Limit reported prefix utilization to 100%
|
||||||
|
* [#6822](https://github.com/netbox-community/netbox/issues/6822) - Use consistent maximum value for interface MTU
|
||||||
|
|
||||||
|
### Other Changes
|
||||||
|
|
||||||
|
* [#6781](https://github.com/netbox-community/netbox/issues/6781) - Database query caching is now disabled by default
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.9 (2021-07-08)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6456](https://github.com/netbox-community/netbox/issues/6456) - API schema type should be boolean for `_occupied` on cable termination models
|
||||||
|
* [#6710](https://github.com/netbox-community/netbox/issues/6710) - Fix assignment of VM interface parent via REST API
|
||||||
|
* [#6714](https://github.com/netbox-community/netbox/issues/6714) - Fix rendering of device type component creation forms
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.8 (2021-07-06)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#5503](https://github.com/netbox-community/netbox/issues/5503) - Annotate short date & time fields with their longer form
|
||||||
|
* [#6138](https://github.com/netbox-community/netbox/issues/6138) - Add an `empty` filter modifier for character fields
|
||||||
|
* [#6200](https://github.com/netbox-community/netbox/issues/6200) - Add rack reservations to global search
|
||||||
|
* [#6368](https://github.com/netbox-community/netbox/issues/6368) - Enable virtual chassis assignment during bulk import of devices
|
||||||
|
* [#6620](https://github.com/netbox-community/netbox/issues/6620) - Show assigned VMs count under device role view
|
||||||
|
* [#6666](https://github.com/netbox-community/netbox/issues/6666) - Show management-only status under interface detail view
|
||||||
|
* [#6667](https://github.com/netbox-community/netbox/issues/6667) - Display VM memory as GB/TB as appropriate
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6626](https://github.com/netbox-community/netbox/issues/6626) - Fix site field on VM search form; add site group
|
||||||
|
* [#6637](https://github.com/netbox-community/netbox/issues/6637) - Fix group assignment in "available VLANs" link under VLAN group view
|
||||||
|
* [#6640](https://github.com/netbox-community/netbox/issues/6640) - Disallow numeric values in custom text fields
|
||||||
|
* [#6652](https://github.com/netbox-community/netbox/issues/6652) - Fix exception when adding components in bulk to multiple devices
|
||||||
|
* [#6676](https://github.com/netbox-community/netbox/issues/6676) - Fix device/VM counts per cluster under cluster type/group views
|
||||||
|
* [#6680](https://github.com/netbox-community/netbox/issues/6680) - Allow setting custom field values for VM interfaces on initial creation
|
||||||
|
* [#6695](https://github.com/netbox-community/netbox/issues/6695) - Fix exception when importing device type with invalid front port definition
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.7 (2021-06-16)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6455](https://github.com/netbox-community/netbox/issues/6455) - Permit /32 IPv4 and /128 IPv6 prefixes
|
||||||
|
* [#6493](https://github.com/netbox-community/netbox/issues/6493) - Show change log diff for non-atomic (pre-2.11) changes
|
||||||
|
* [#6564](https://github.com/netbox-community/netbox/issues/6564) - Add N connector type for pass-through ports
|
||||||
|
* [#6588](https://github.com/netbox-community/netbox/issues/6588) - Add support for webp files as front/rear device type images
|
||||||
|
* [#6589](https://github.com/netbox-community/netbox/issues/6589) - Standardize breadcrumb navigation for power panels and feeds
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6553](https://github.com/netbox-community/netbox/issues/6553) - ProviderNetwork search should match on name
|
||||||
|
* [#6562](https://github.com/netbox-community/netbox/issues/6562) - Disable ordering of secrets by assigned object
|
||||||
|
* [#6563](https://github.com/netbox-community/netbox/issues/6563) - Fix filtering by location for cable connection forms
|
||||||
|
* [#6584](https://github.com/netbox-community/netbox/issues/6584) - Fix ordering of nested inventory items
|
||||||
|
* [#6602](https://github.com/netbox-community/netbox/issues/6602) - Fix deletion of devices with cables attached
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.6 (2021-06-04)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6544](https://github.com/netbox-community/netbox/issues/6544) - Fix migration error when upgrading with VRF(s) defined
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.5 (2021-06-04)
|
||||||
|
|
||||||
|
**NOTE:** This release includes a database migration that calculates and annotates prefix depth. It may impose a noticeable delay on the upgrade process: Users should anticipate roughly one minute of delay per 100 thousand prefixes being updated.
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6087](https://github.com/netbox-community/netbox/issues/6087) - Improved prefix hierarchy rendering
|
||||||
|
* [#6487](https://github.com/netbox-community/netbox/issues/6487) - Add location filter to cable connection form
|
||||||
|
* [#6501](https://github.com/netbox-community/netbox/issues/6501) - Expose prefix depth and children on REST API serializer
|
||||||
|
* [#6527](https://github.com/netbox-community/netbox/issues/6527) - Support Markdown for report descriptions
|
||||||
|
* [#6540](https://github.com/netbox-community/netbox/issues/6540) - Add a "flat" column to the prefix table
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6064](https://github.com/netbox-community/netbox/issues/6064) - Fix object permission assignments for user and group models
|
||||||
|
* [#6217](https://github.com/netbox-community/netbox/issues/6217) - Disallow passing of string values for integer custom fields
|
||||||
|
* [#6284](https://github.com/netbox-community/netbox/issues/6284) - Avoid sending redundant webhooks when adding/removing tags
|
||||||
|
* [#6492](https://github.com/netbox-community/netbox/issues/6492) - Correct tag population in post-change data resulting from REST API changes
|
||||||
|
* [#6496](https://github.com/netbox-community/netbox/issues/6496) - Fix upgrade script when Python installed in nonstandard path
|
||||||
|
* [#6502](https://github.com/netbox-community/netbox/issues/6502) - Correct permissions evaluation for running a report via the REST API
|
||||||
|
* [#6517](https://github.com/netbox-community/netbox/issues/6517) - Fix assignment of user when creating rack reservations via REST API
|
||||||
|
* [#6525](https://github.com/netbox-community/netbox/issues/6525) - Paginate related IPs table under IP address view
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.4 (2021-05-25)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#5121](https://github.com/netbox-community/netbox/issues/5121) - Add content type filters for tags
|
||||||
|
* [#6358](https://github.com/netbox-community/netbox/issues/6358) - Add search field for VLAN groups
|
||||||
|
* [#6393](https://github.com/netbox-community/netbox/issues/6393) - Add `description` filter for IP addresses
|
||||||
|
* [#6400](https://github.com/netbox-community/netbox/issues/6400) - Add cyan color choice for plugin buttons
|
||||||
|
* [#6422](https://github.com/netbox-community/netbox/issues/6422) - Enable filtering users by group under admin UI
|
||||||
|
* [#6441](https://github.com/netbox-community/netbox/issues/6441) - Improve UI paginator to optimize page object count
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6376](https://github.com/netbox-community/netbox/issues/6376) - Fix assignment of VLAN groups to clusters, cluster groups via REST API
|
||||||
|
* [#6398](https://github.com/netbox-community/netbox/issues/6398) - Avoid exception when deleting device connected to self via circuit
|
||||||
|
* [#6426](https://github.com/netbox-community/netbox/issues/6426) - Allow assigning virtual chassis member interfaces to LAG on VC master
|
||||||
|
* [#6438](https://github.com/netbox-community/netbox/issues/6438) - Fix missing descriptions and label for device type imports and exports
|
||||||
|
* [#6465](https://github.com/netbox-community/netbox/issues/6465) - Fix typo in installed plugins REST API endpoint
|
||||||
|
* [#6467](https://github.com/netbox-community/netbox/issues/6467) - Fix access to metrics on custom `BASE_PATH` when login is required
|
||||||
|
* [#6468](https://github.com/netbox-community/netbox/issues/6468) - Disable ordering VLAN groups list by scope object
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.3 (2021-05-07)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6197](https://github.com/netbox-community/netbox/issues/6197) - Introduced `SESSION_COOKIE_NAME` config parameter
|
||||||
|
* [#6318](https://github.com/netbox-community/netbox/issues/6318) - Add OM5 MMF cable type
|
||||||
|
* [#6351](https://github.com/netbox-community/netbox/issues/6351) - Add aggregates count to tenant view
|
||||||
|
* [#6359](https://github.com/netbox-community/netbox/issues/6359) - Enable custom links for organizational and nested group models
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6240](https://github.com/netbox-community/netbox/issues/6240) - Fix display of available VLAN ranges under VLAN group view
|
||||||
|
* [#6308](https://github.com/netbox-community/netbox/issues/6308) - Fix linking of available VLANs in VLAN group view
|
||||||
|
* [#6309](https://github.com/netbox-community/netbox/issues/6309) - Restrict parent VM interface assignment to the parent VM
|
||||||
|
* [#6312](https://github.com/netbox-community/netbox/issues/6312) - Interface device filter should return all virtual chassis interfaces only if device is master
|
||||||
|
* [#6313](https://github.com/netbox-community/netbox/issues/6313) - Fix device type instance count under manufacturer view
|
||||||
|
* [#6321](https://github.com/netbox-community/netbox/issues/6321) - Restore "add an IP" button under prefix IPs view
|
||||||
|
* [#6333](https://github.com/netbox-community/netbox/issues/6333) - Fix filtering of circuit terminations by primary key
|
||||||
|
* [#6339](https://github.com/netbox-community/netbox/issues/6339) - Improve ordering of interfaces when viewing virtual chassis master
|
||||||
|
* [#6350](https://github.com/netbox-community/netbox/issues/6350) - Include first & last IP addresses when allocating available IPv6 addresses via the REST API
|
||||||
|
* [#6355](https://github.com/netbox-community/netbox/issues/6355) - Fix caching error when swapping A/Z circuit terminations
|
||||||
|
* [#6357](https://github.com/netbox-community/netbox/issues/6357) - Fix ProviderNetwork nested API serializer
|
||||||
|
* [#6363](https://github.com/netbox-community/netbox/issues/6363) - Correct pre-population of cluster group when creating a cluster
|
||||||
|
* [#6369](https://github.com/netbox-community/netbox/issues/6369) - Fix interface assignment for VLANs in non-scoped groups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.2 (2021-04-27)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6275](https://github.com/netbox-community/netbox/issues/6275) - Linkify rack, device counts on locations list
|
||||||
|
* [#6278](https://github.com/netbox-community/netbox/issues/6278) - Note device locations on cable traces
|
||||||
|
* [#6287](https://github.com/netbox-community/netbox/issues/6287) - Add option to clear assigned max length filter on prefixes list
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6236](https://github.com/netbox-community/netbox/issues/6236) - Journal entry title should account for configured timezone
|
||||||
|
* [#6246](https://github.com/netbox-community/netbox/issues/6246) - Permit full-length descriptions when creating device components and VM interfaces
|
||||||
|
* [#6248](https://github.com/netbox-community/netbox/issues/6248) - Fix table column reconfiguration under Chrome
|
||||||
|
* [#6252](https://github.com/netbox-community/netbox/issues/6252) - Fix assignment of console port speed values above 19.2kbps
|
||||||
|
* [#6254](https://github.com/netbox-community/netbox/issues/6254) - Disable ordering of space column in racks table
|
||||||
|
* [#6258](https://github.com/netbox-community/netbox/issues/6258) - Fix parent assignment for SiteGroup API serializer
|
||||||
|
* [#6262](https://github.com/netbox-community/netbox/issues/6262) - Support filtering by created/updated time for all relevant objects
|
||||||
|
* [#6267](https://github.com/netbox-community/netbox/issues/6267) - Fix cable tracing API endpoint for circuit terminations
|
||||||
|
* [#6289](https://github.com/netbox-community/netbox/issues/6289) - Fix assignment of VC member interfaces to LAG interfaces
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.1 (2021-04-21)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#6161](https://github.com/netbox-community/netbox/issues/6161) - Enable ordering of device component tables
|
||||||
|
* [#6179](https://github.com/netbox-community/netbox/issues/6179) - Enable natural ordering for virtual machines
|
||||||
|
* [#6189](https://github.com/netbox-community/netbox/issues/6189) - Add ability to search for locations by name or description
|
||||||
|
* [#6190](https://github.com/netbox-community/netbox/issues/6190) - Allow filtering devices with no location assigned
|
||||||
|
* [#6210](https://github.com/netbox-community/netbox/issues/6210) - Include child locations on location view
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#6184](https://github.com/netbox-community/netbox/issues/6184) - Fix parent object table column in prefix IP addresses list
|
||||||
|
* [#6188](https://github.com/netbox-community/netbox/issues/6188) - Support custom field filtering for regions, site groups, and locations
|
||||||
|
* [#6196](https://github.com/netbox-community/netbox/issues/6196) - Fix object list display for users with read-only permissions
|
||||||
|
* [#6215](https://github.com/netbox-community/netbox/issues/6215) - Restore tenancy section in virtual machine form
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.11.0 (2021-04-16)
|
||||||
|
|
||||||
|
**Note:** NetBox v2.11 is the last major release that will support Python 3.6. Beginning with NetBox v3.0, Python 3.7 or later will be required.
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
* All objects now use numeric IDs in their UI view URLs instead of slugs. You may need to update external references to NetBox objects. (Note that this does _not_ affect the REST API.)
|
||||||
|
* The UI now uses numeric IDs when filtering object lists. You may need to update external links to filtered object lists. (Note that the slug- and name-based filters will continue to work, however the filter selection fields within the UI will not be automatically populated.)
|
||||||
|
* The RackGroup model has been renamed to Location (see [#4971](https://github.com/netbox-community/netbox/issues/4971)). Its REST API endpoint has changed from `/api/dcim/rack-groups/` to `/api/dcim/locations/`.
|
||||||
|
* The foreign key field `group` on dcim.Rack has been renamed to `location`.
|
||||||
|
* The foreign key field `site` on ipam.VLANGroup has been replaced with the `scope` generic foreign key (see [#5284](https://github.com/netbox-community/netbox/issues/5284)).
|
||||||
|
* Custom script ObjectVars no longer support the `queryset` parameter: Use `model` instead (see [#5995](https://github.com/netbox-community/netbox/issues/5995)).
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
#### Journaling Support ([#151](https://github.com/netbox-community/netbox/issues/151))
|
||||||
|
|
||||||
|
NetBox now supports journaling for all primary objects. The journal is a collection of human-generated notes and comments about an object maintained for historical context. It supplements NetBox's change log to provide additional information about why changes have been made or to convey events which occur outside NetBox. Unlike the change log, in which records typically expire after some time, journal entries persist for the life of the associated object.
|
||||||
|
|
||||||
|
#### Parent Interface Assignments ([#1519](https://github.com/netbox-community/netbox/issues/1519))
|
||||||
|
|
||||||
|
Virtual device and VM interfaces can now be assigned to a "parent" interface by setting the `parent` field on the interface object. This is helpful for associating subinterfaces with their physical counterpart. For example, you might assign virtual interfaces Gi0/0.100 and Gi0/0.200 as children of the physical interface Gi0/0.
|
||||||
|
|
||||||
|
#### Pre- and Post-Change Snapshots in Webhooks ([#3451](https://github.com/netbox-community/netbox/issues/3451))
|
||||||
|
|
||||||
|
In conjunction with the newly improved change logging functionality ([#5913](https://github.com/netbox-community/netbox/issues/5913)), outgoing webhooks now include both pre- and post-change representations of the modified object. These are available in the rendering context as a dictionary named `snapshots` with keys `prechange` and `postchange`. For example, here are the abridged snapshots resulting from renaming a site and changing its status:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"snapshots": {
|
||||||
|
"prechange": {
|
||||||
|
"name": "Site 1",
|
||||||
|
"slug": "site-1",
|
||||||
|
"status": "active",
|
||||||
|
...
|
||||||
|
},
|
||||||
|
"postchange": {
|
||||||
|
"name": "Site 2",
|
||||||
|
"slug": "site-2",
|
||||||
|
"status": "planned",
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: The pre-change snapshot for a newly created will always be null, as will the post-change snapshot for a deleted object.
|
||||||
|
|
||||||
|
#### Mark as Connected Without a Cable ([#3648](https://github.com/netbox-community/netbox/issues/3648))
|
||||||
|
|
||||||
|
Cable termination objects (circuit terminations, power feeds, and most device components) can now be marked as "connected" without actually attaching a cable. This helps simplify the process of modeling an infrastructure boundary where we don't necessarily know or care what is connected to an attachment point, but still need to reflect the termination as being occupied.
|
||||||
|
|
||||||
|
In addition to the new `mark_connected` boolean field, the REST API representation of these objects now also includes a read-only boolean field named `_occupied`. This conveniently returns true if either a cable is attached or `mark_connected` is true.
|
||||||
|
|
||||||
|
#### Allow Assigning Devices to Locations ([#4971](https://github.com/netbox-community/netbox/issues/4971))
|
||||||
|
|
||||||
|
Devices can now be assigned to locations (formerly known as rack groups) within a site without needing to be assigned to a particular rack. This is handy for assigning devices to rooms or floors within a building where racks are not used. The `location` foreign key field has been added to the Device model to support this.
|
||||||
|
|
||||||
|
#### Dynamic Object Exports ([#4999](https://github.com/netbox-community/netbox/issues/4999))
|
||||||
|
|
||||||
|
When exporting a list of objects in NetBox, users now have the option of selecting the "current view". This will render CSV output matching the current configuration of the table being viewed. For example, if you modify the sites list to display only the site name, tenant, and status, the rendered CSV will include only these columns, and they will appear in the order chosen.
|
||||||
|
|
||||||
|
The legacy static export behavior has been retained to ensure backward compatibility for dependent integrations. However, users are strongly encouraged to adapt custom export templates where needed as this functionality will be removed in v3.0.
|
||||||
|
|
||||||
|
#### Variable Scope Support for VLAN Groups ([#5284](https://github.com/netbox-community/netbox/issues/5284))
|
||||||
|
|
||||||
|
In previous releases, VLAN groups could be assigned only to a site. To afford more flexibility in conveying the true scope of an L2 domain, a VLAN group can now be assigned to a region, site group (new in v2.11), site, location, or rack. VLANs assigned to a group will be available only to devices and virtual machines which exist within its scope.
|
||||||
|
|
||||||
|
For example, a VLAN within a group assigned to a location will be available only to devices assigned to that location (or one of its child locations), or to a rack within that location.
|
||||||
|
|
||||||
|
#### New Site Group Model ([#5892](https://github.com/netbox-community/netbox/issues/5892))
|
||||||
|
|
||||||
|
This release introduces the new SiteGroup model, which can be used to organize sites similar to the existing Region model. Whereas regions are intended for geographically arranging sites into countries, states, and so on, the new site group model can be used to organize sites by functional role or other arbitrary classification. Using regions and site groups in conjunction provides two dimensions along which sites can be organized, offering greater flexibility to the user.
|
||||||
|
|
||||||
|
#### Improved Change Logging ([#5913](https://github.com/netbox-community/netbox/issues/5913))
|
||||||
|
|
||||||
|
The ObjectChange model (which is used to record the creation, modification, and deletion of NetBox objects) now explicitly records the pre-change and post-change state of each object, rather than only the post-change state. This was done to present a more clear depiction of each change being made, and to prevent the erroneous association of a previous unlogged change with its successor.
|
||||||
|
|
||||||
|
#### Provider Network Modeling ([#5986](https://github.com/netbox-community/netbox/issues/5986))
|
||||||
|
|
||||||
|
A new provider network model has been introduced to represent the boundary of a network that exists outside the scope of NetBox. Each instance of this model must be assigned to a provider, and circuits can now terminate to either provider networks or to sites. The use of this model will likely be extended by future releases to support overlay and virtual circuit modeling.
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#4833](https://github.com/netbox-community/netbox/issues/4833) - Allow assigning config contexts by device type
|
||||||
|
* [#5344](https://github.com/netbox-community/netbox/issues/5344) - Add support for custom fields in tables
|
||||||
|
* [#5370](https://github.com/netbox-community/netbox/issues/5370) - Extend custom field support to organizational models
|
||||||
|
* [#5375](https://github.com/netbox-community/netbox/issues/5375) - Add `speed` attribute to console port models
|
||||||
|
* [#5401](https://github.com/netbox-community/netbox/issues/5401) - Extend custom field support to device component models
|
||||||
|
* [#5425](https://github.com/netbox-community/netbox/issues/5425) - Create separate tabs for VMs and devices under the cluster view
|
||||||
|
* [#5451](https://github.com/netbox-community/netbox/issues/5451) - Add support for multiple-selection custom fields
|
||||||
|
* [#5608](https://github.com/netbox-community/netbox/issues/5608) - Add REST API endpoint for custom links
|
||||||
|
* [#5610](https://github.com/netbox-community/netbox/issues/5610) - Add REST API endpoint for webhooks
|
||||||
|
* [#5757](https://github.com/netbox-community/netbox/issues/5757) - Add unique identifier to every object view
|
||||||
|
* [#5830](https://github.com/netbox-community/netbox/issues/5830) - Add `as_attachment` to ExportTemplate to control download behavior
|
||||||
|
* [#5848](https://github.com/netbox-community/netbox/issues/5848) - Filter custom fields by content type in format `<app_label>.<model>`
|
||||||
|
* [#5891](https://github.com/netbox-community/netbox/issues/5891) - Add `display` field to all REST API serializers
|
||||||
|
* [#5894](https://github.com/netbox-community/netbox/issues/5894) - Use primary keys when filtering object lists by related objects in the UI
|
||||||
|
* [#5895](https://github.com/netbox-community/netbox/issues/5895) - Rename RackGroup to Location
|
||||||
|
* [#5901](https://github.com/netbox-community/netbox/issues/5901) - Add `created` and `last_updated` fields to device component models
|
||||||
|
* [#5971](https://github.com/netbox-community/netbox/issues/5971) - Add dedicated views for organizational models
|
||||||
|
* [#5972](https://github.com/netbox-community/netbox/issues/5972) - Enable bulk editing for organizational models
|
||||||
|
* [#5975](https://github.com/netbox-community/netbox/issues/5975) - Allow partial (decimal) vCPU allocations for virtual machines
|
||||||
|
* [#6001](https://github.com/netbox-community/netbox/issues/6001) - Paginate component tables under device views
|
||||||
|
* [#6038](https://github.com/netbox-community/netbox/issues/6038) - Include tagged objects list on tag view
|
||||||
|
* [#6088](https://github.com/netbox-community/netbox/issues/6088) - Improved table configuration form
|
||||||
|
* [#6097](https://github.com/netbox-community/netbox/issues/6097) - Redirect old slug-based object views
|
||||||
|
* [#6125](https://github.com/netbox-community/netbox/issues/6125) - Add locations count to home page
|
||||||
|
* [#6146](https://github.com/netbox-community/netbox/issues/6146) - Add bulk disconnect support for power feeds
|
||||||
|
* [#6149](https://github.com/netbox-community/netbox/issues/6149) - Support image attachments for locations
|
||||||
|
|
||||||
|
### Bug Fixes (from v2.11-beta1)
|
||||||
|
|
||||||
|
* [#5583](https://github.com/netbox-community/netbox/issues/5583) - Eliminate redundant change records when adding/removing tags
|
||||||
|
* [#6100](https://github.com/netbox-community/netbox/issues/6100) - Fix VM interfaces table "add interfaces" link
|
||||||
|
* [#6104](https://github.com/netbox-community/netbox/issues/6104) - Fix location column on racks table
|
||||||
|
* [#6105](https://github.com/netbox-community/netbox/issues/6105) - Hide checkboxes for VMs under cluster VMs view
|
||||||
|
* [#6106](https://github.com/netbox-community/netbox/issues/6106) - Allow assigning a virtual interface as the parent of an existing interface
|
||||||
|
* [#6107](https://github.com/netbox-community/netbox/issues/6107) - Fix rack selection field on device form
|
||||||
|
* [#6110](https://github.com/netbox-community/netbox/issues/6110) - Fix handling of TemplateColumn values for table export
|
||||||
|
* [#6123](https://github.com/netbox-community/netbox/issues/6123) - Prevent device from being assigned to mismatched site and location
|
||||||
|
* [#6124](https://github.com/netbox-community/netbox/issues/6124) - Location `parent` filter should return all child locations (not just those directly assigned)
|
||||||
|
* [#6130](https://github.com/netbox-community/netbox/issues/6130) - Improve display of assigned models in custom fields list
|
||||||
|
* [#6155](https://github.com/netbox-community/netbox/issues/6155) - Fix admin links for plugins, background tasks
|
||||||
|
* [#6171](https://github.com/netbox-community/netbox/issues/6171) - Fix display of horizontally-scrolling object lists
|
||||||
|
* [#6173](https://github.com/netbox-community/netbox/issues/6173) - Fix assigned device/VM count when bulk editing/deleting device roles
|
||||||
|
* [#6176](https://github.com/netbox-community/netbox/issues/6176) - Correct position of MAC address field when creating VM interfaces
|
||||||
|
* [#6177](https://github.com/netbox-community/netbox/issues/6177) - Prevent VM interface from being assigned as its own parent
|
||||||
|
|
||||||
|
### Other Changes
|
||||||
|
|
||||||
|
* [#1638](https://github.com/netbox-community/netbox/issues/1638) - Migrate all primary keys to 64-bit integers
|
||||||
|
* [#5873](https://github.com/netbox-community/netbox/issues/5873) - Use numeric IDs in all object URLs
|
||||||
|
* [#5938](https://github.com/netbox-community/netbox/issues/5938) - Deprecated support for Python 3.6
|
||||||
|
* [#5990](https://github.com/netbox-community/netbox/issues/5990) - Deprecated `display_field` parameter for custom script ObjectVar and MultiObjectVar fields
|
||||||
|
* [#5995](https://github.com/netbox-community/netbox/issues/5995) - Dropped backward compatibility for `queryset` parameter on ObjectVar and MultiObjectVar (use `model` instead)
|
||||||
|
* [#6014](https://github.com/netbox-community/netbox/issues/6014) - Moved the virtual machine interfaces list to a separate view
|
||||||
|
* [#6071](https://github.com/netbox-community/netbox/issues/6071) - Cable traces now traverse circuits
|
||||||
|
|
||||||
|
### REST API Changes
|
||||||
|
|
||||||
|
* All primary keys are now 64-bit integers
|
||||||
|
* All model serializers now include a `display` field to be used for the presentation of an object to a human user
|
||||||
|
* All device components
|
||||||
|
* Added support for custom fields
|
||||||
|
* Added `created` and `last_updated` fields to track object creation and modification
|
||||||
|
* All device component templates
|
||||||
|
* Added `created` and `last_updated` fields to track object creation and modification
|
||||||
|
* All organizational models
|
||||||
|
* Added support for custom fields
|
||||||
|
* All cable termination models (cabled device components, power feeds, and circuit terminations)
|
||||||
|
* Added `mark_connected` boolean field to force connection status
|
||||||
|
* Added `_occupied` read-only boolean field as common attribute for determining whether an object is occupied
|
||||||
|
* Renamed RackGroup to Location
|
||||||
|
* The `/dcim/rack-groups/` endpoint is now `/dcim/locations/`
|
||||||
|
* circuits.CircuitTermination
|
||||||
|
* Added the `provider_network` field
|
||||||
|
* Removed the `connected_endpoint`, `connected_endpoint_type`, and `connected_endpoint_reachable` fields
|
||||||
|
* The `trace/` endpoint has been replaced with `paths/`
|
||||||
|
* circuits.ProviderNetwork
|
||||||
|
* Added the `/api/circuits/provider-networks/` endpoint
|
||||||
|
* dcim.Device
|
||||||
|
* Added the `location` field
|
||||||
|
* dcim.Interface
|
||||||
|
* Added the `parent` field
|
||||||
|
* dcim.PowerPanel
|
||||||
|
* Renamed `rack_group` field to `location`
|
||||||
|
* dcim.Rack
|
||||||
|
* Renamed `group` field to `location`
|
||||||
|
* dcim.Site
|
||||||
|
* Added the `group` foreign key field to SiteGroup
|
||||||
|
* dcim.SiteGroup
|
||||||
|
* Added the `/api/dcim/site-groups/` endpoint
|
||||||
|
* extras.ConfigContext
|
||||||
|
* Added the `site_groups` many-to-many field to track the assignment of ConfigContexts to SiteGroups
|
||||||
|
* extras.CustomField
|
||||||
|
* Added new custom field type: `multi-select`
|
||||||
|
* extras.CustomLink
|
||||||
|
* Added the `/api/extras/custom-links/` endpoint
|
||||||
|
* extras.ExportTemplate
|
||||||
|
* Added the `as_attachment` boolean field
|
||||||
|
* extras.ObjectChange
|
||||||
|
* Added the `prechange_data` field
|
||||||
|
* Renamed `object_data` to `postchange_data`
|
||||||
|
* extras.Webhook
|
||||||
|
* Added the `/api/extras/webhooks/` endpoint
|
||||||
|
* ipam.VLANGroup
|
||||||
|
* Added the `scope_type`, `scope_id`, and `scope` fields (`scope` is a generic foreign key)
|
||||||
|
* Dropped the `site` foreign key field
|
||||||
|
* virtualization.VirtualMachine
|
||||||
|
* `vcpus` has been changed from an integer to a decimal value
|
||||||
|
* virtualization.VMInterface
|
||||||
|
* Added the `parent` field
|
||||||
@@ -218,7 +218,7 @@
|
|||||||
|
|
||||||
#### Custom Scripts ([#3415](https://github.com/netbox-community/netbox/issues/3415))
|
#### Custom Scripts ([#3415](https://github.com/netbox-community/netbox/issues/3415))
|
||||||
|
|
||||||
Custom scripts allow for the execution of arbitrary code via the NetBox UI. They can be used to automatically create, manipulate, or clean up objects or perform other tasks within NetBox. Scripts are defined as Python files which contain one or more subclasses of `extras.scripts.Script`. Variable fields can be defined within scripts, which render as form fields within the web UI to prompt the user for input data. Scripts are executed and information is logged via the web UI. Please see [the docs](https://netbox.readthedocs.io/en/stable/additional-features/custom-scripts/) for more detail.
|
Custom scripts allow for the execution of arbitrary code via the NetBox UI. They can be used to automatically create, manipulate, or clean up objects or perform other tasks within NetBox. Scripts are defined as Python files which contain one or more subclasses of `extras.scripts.Script`. Variable fields can be defined within scripts, which render as form fields within the web UI to prompt the user for input data. Scripts are executed and information is logged via the web UI. Please see [the docs](https://netbox.readthedocs.io/en/stable/customization/custom-scripts/) for more detail.
|
||||||
|
|
||||||
Note: There are currently no API endpoints for this feature. These are planned for the upcoming v2.7 release.
|
Note: There are currently no API endpoints for this feature. These are planned for the upcoming v2.7 release.
|
||||||
|
|
||||||
|
|||||||
281
docs/release-notes/version-3.0.md
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
# NetBox v3.0
|
||||||
|
|
||||||
|
## v3.0.1 (2021-09-01)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#7041](https://github.com/netbox-community/netbox/issues/7041) - Properly format JSON config object returned from a NAPALM device
|
||||||
|
* [#7070](https://github.com/netbox-community/netbox/issues/7070) - Fix exception when filtering by prefix max length in UI
|
||||||
|
* [#7071](https://github.com/netbox-community/netbox/issues/7071) - Fix exception when removing a primary IP from a device/VM
|
||||||
|
* [#7072](https://github.com/netbox-community/netbox/issues/7072) - Fix table configuration under prefix child object views
|
||||||
|
* [#7075](https://github.com/netbox-community/netbox/issues/7075) - Fix UI bug when a custom field has a space in the name
|
||||||
|
* [#7080](https://github.com/netbox-community/netbox/issues/7080) - Fix missing image previews
|
||||||
|
* [#7081](https://github.com/netbox-community/netbox/issues/7081) - Fix UI bug that did not properly request and handle paginated data
|
||||||
|
* [#7082](https://github.com/netbox-community/netbox/issues/7082) - Avoid exception when referencing invalid content type in table
|
||||||
|
* [#7083](https://github.com/netbox-community/netbox/issues/7083) - Correct labeling for VM memory attribute
|
||||||
|
* [#7084](https://github.com/netbox-community/netbox/issues/7084) - Fix KeyError exception when editing access VLAN on an interface
|
||||||
|
* [#7084](https://github.com/netbox-community/netbox/issues/7084) - Fix issue where hidden VLAN form fields were incorrectly included in the form submission
|
||||||
|
* [#7089](https://github.com/netbox-community/netbox/issues/7089) - Fix filtering of change log by content type
|
||||||
|
* [#7090](https://github.com/netbox-community/netbox/issues/7090) - Allow decimal input on length field when bulk editing cables
|
||||||
|
* [#7091](https://github.com/netbox-community/netbox/issues/7091) - Ensure API requests from the UI are aware of `BASE_PATH`
|
||||||
|
* [#7092](https://github.com/netbox-community/netbox/issues/7092) - Fix missing bulk edit buttons on Prefix IP Addresses table
|
||||||
|
* [#7093](https://github.com/netbox-community/netbox/issues/7093) - Multi-select custom field filters should employ exact match
|
||||||
|
* [#7096](https://github.com/netbox-community/netbox/issues/7096) - Home links should honor `BASE_PATH` configuration
|
||||||
|
* [#7101](https://github.com/netbox-community/netbox/issues/7101) - Enforce `MAX_PAGE_SIZE` for table and REST API pagination
|
||||||
|
* [#7106](https://github.com/netbox-community/netbox/issues/7106) - Fix incorrect "Map It" button URL on a site's physical address field
|
||||||
|
* [#7107](https://github.com/netbox-community/netbox/issues/7107) - Fix missing search button and search results in IP address assignment "Assign IP" tab
|
||||||
|
* [#7109](https://github.com/netbox-community/netbox/issues/7109) - Ensure human readability of exceptions raised during REST API requests
|
||||||
|
* [#7113](https://github.com/netbox-community/netbox/issues/7113) - Show bulk edit/delete actions for prefix child objects
|
||||||
|
* [#7123](https://github.com/netbox-community/netbox/issues/7123) - Remove "Global" placeholder for null VRF field
|
||||||
|
* [#7124](https://github.com/netbox-community/netbox/issues/7124) - Fix duplicate static query param values in API Select
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v3.0.0 (2021-08-30)
|
||||||
|
|
||||||
|
!!! warning "Existing Deployments Must Upgrade from v2.11"
|
||||||
|
Upgrading an existing NetBox deployment to version 3.0 **must** be done from version 2.11.0 or later. If attempting to upgrade a deployment of NetBox v2.10 or earlier, first upgrade to a NetBox v2.11 release, and then upgrade from v2.11 to v3.0. This will avoid any problems with the database migration optimizations implemented in version 3.0. (This is not necessary for _new_ installations.)
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
* Python 3.6 is no longer supported. NetBox v3.0 supports Python 3.7, 3.8, and 3.9.
|
||||||
|
* The secrets functionality present in prior releases of NetBox has been removed. The NetBox maintainers strongly recommend the adoption of [Hashicorp Vault](https://github.com/hashicorp/vault) in place of this feature. Development of a NetBox plugin to replace the legacy secrets functionality is also underway.
|
||||||
|
* The default CSV export format for all objects now includes all available data from the object list. Additionally, the CSV headers now use human-friendly titles rather than raw field names. If backward compatibility with the old format is desired, export templates can be written to reproduce it.
|
||||||
|
* The `invalidate` management command (which clears cached database queries) is no longer needed and has been removed (see [#6639](https://github.com/netbox-community/netbox/issues/6639)).
|
||||||
|
* Support for queryset caching configuration (`caching_config`) has been removed from the plugins API (see [#6639](https://github.com/netbox-community/netbox/issues/6639)).
|
||||||
|
* The `cacheops_*` metrics have been removed from the Prometheus exporter (see [#6639](https://github.com/netbox-community/netbox/issues/6639)).
|
||||||
|
* The `display_field` keyword argument has been removed from custom script ObjectVar and MultiObjectVar fields. These widgets will use the `display` value provided by the REST API.
|
||||||
|
* The deprecated `display_name` field has been removed from all REST API serializers. (API clients should reference the `display` field instead.)
|
||||||
|
* The redundant REST API endpoints for console, power, and interface connections have been removed. The same data can be retrieved by querying the respective model endpoints with the `?connected=True` filter applied.
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
#### Updated User Interface ([#5893](https://github.com/netbox-community/netbox/issues/5893))
|
||||||
|
|
||||||
|
The NetBox user interface has been completely overhauled with a fresh new look! Beyond the cosmetic improvements, this initiative has allowed us to modernize the entire front end, upgrading from Bootstrap 3 to Bootstrap 5, and eliminating dependencies on outdated libraries such as jQuery and jQuery-UI. The new user interface also features a dark mode option.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
A huge thank you to NetBox maintainer [Matt Love](https://github.com/thatmattlove) for his tremendous work on this!
|
||||||
|
|
||||||
|
#### GraphQL API ([#2007](https://github.com/netbox-community/netbox/issues/2007))
|
||||||
|
|
||||||
|
A new [GraphQL API](https://graphql.org/) has been added to complement NetBox's REST API. GraphQL allows the client to specify which fields of the available data to return in each request. NetBox's implementation, which employs [Graphene](https://graphene-python.org/), also includes a user-friendly query interface known as GraphiQL.
|
||||||
|
|
||||||
|
Here's an example GraphQL request:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
circuit_list {
|
||||||
|
cid
|
||||||
|
provider {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
termination_a {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
termination_z {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
And the response:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"circuit_list": [
|
||||||
|
{
|
||||||
|
"cid": "1002840283",
|
||||||
|
"provider": {
|
||||||
|
"name": "CenturyLink"
|
||||||
|
},
|
||||||
|
"termination_a": null,
|
||||||
|
"termination_z": {
|
||||||
|
"id": "23"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
All GraphQL requests are made at the `/graphql` URL (which also serves the GraphiQL UI). The API is currently read-only, however users who wish to disable it until needed can do so by setting the `GRAPHQL_ENABLED` configuration parameter to False. For more detail on NetBox's GraphQL implementation, see [the GraphQL API documentation](../graphql-api/overview.md).
|
||||||
|
|
||||||
|
#### IP Ranges ([#834](https://github.com/netbox-community/netbox/issues/834))
|
||||||
|
|
||||||
|
NetBox now supports modeling arbitrary IP ranges, which are defined by specifying a starting and ending IP address (e.g. to denote DHCP pools). Similar to prefixes, each IP range may optionally be assigned to a VRF and/or tenant, and can be assigned a functional role. An IP range must be assigned a status of active, reserved, or deprecated. The REST API implementation for this model also includes an "available IPs" endpoint which functions similarly to the endpoint for prefixes.
|
||||||
|
|
||||||
|
More information about IP ranges is available [in the documentation](../models/ipam/iprange.md).
|
||||||
|
|
||||||
|
#### Custom Model Validation ([#5963](https://github.com/netbox-community/netbox/issues/5963))
|
||||||
|
|
||||||
|
This release introduces the [`CUSTOM_VALIDATORS`](../configuration/optional-settings.md#custom_validators) configuration parameter, which allows administrators to map NetBox models to custom validator classes to enforce custom validation logic. For example, the following configuration requires every site to have a name of at least ten characters and a description:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from extras.validators import CustomValidator
|
||||||
|
|
||||||
|
CUSTOM_VALIDATORS = {
|
||||||
|
'dcim.site': (
|
||||||
|
CustomValidator({
|
||||||
|
'name': {
|
||||||
|
'min_length': 10,
|
||||||
|
},
|
||||||
|
'description': {
|
||||||
|
'required': True,
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
CustomValidator can also be subclassed to enforce more complex logic by overriding its `validate()` method. See the [custom validation](../customization/custom-validation.md) documentation for more details.
|
||||||
|
|
||||||
|
#### SVG Cable Traces ([#6000](https://github.com/netbox-community/netbox/issues/6000))
|
||||||
|
|
||||||
|
Cable trace diagrams are now rendered as atomic SVG images, similar to rack elevations. These images are embedded in the UI and can be easily downloaded for use outside NetBox. SVG images can also be generated directly through the REST API, by specifying SVG as the render format for the `trace` endpoint on a cable termination:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
GET /api/dcim/interfaces/<ID>>/trace/?render=svg
|
||||||
|
```
|
||||||
|
|
||||||
|
The width of the rendered image in pixels may optionally be specified by appending the `&width=<width>` parameter to the request. The default width is 400px.
|
||||||
|
|
||||||
|
#### New Views for Models Previously Under the Admin UI ([#6466](https://github.com/netbox-community/netbox/issues/6466))
|
||||||
|
|
||||||
|
New UI views have been introduced to manage the following models:
|
||||||
|
|
||||||
|
* Custom fields
|
||||||
|
* Custom links
|
||||||
|
* Export templates
|
||||||
|
* Webhooks
|
||||||
|
|
||||||
|
These models were previously managed under the admin section of the UI. Moving them to dedicated views ensures a more consistent and convenient user experience.
|
||||||
|
|
||||||
|
#### REST API Token Provisioning ([#5264](https://github.com/netbox-community/netbox/issues/5264))
|
||||||
|
|
||||||
|
The new REST API endpoint `/api/users/tokens/` has been added, which includes a child endpoint for provisioning new REST API tokens using a username and password. This allows a user to gain REST API access without needing to first create a token via the web UI.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ curl -X POST \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Accept: application/json; indent=4" \
|
||||||
|
https://netbox/api/users/tokens/provision/ \
|
||||||
|
--data '{
|
||||||
|
"username": "hankhill",
|
||||||
|
"password: "I<3C3H8",
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
If the supplied credentials are valid, NetBox will create and return a new token for the user.
|
||||||
|
|
||||||
|
#### New Housekeeping Command ([#6590](https://github.com/netbox-community/netbox/issues/6590))
|
||||||
|
|
||||||
|
A new management command has been added: `manage.py housekeeping`. This command is intended to be run nightly via a system cron job. It performs the following tasks:
|
||||||
|
|
||||||
|
* Clear expired authentication sessions from the database
|
||||||
|
* Delete change log records which have surpassed the configured retention period (if configured)
|
||||||
|
* Check for new NetBox releases (if enabled)
|
||||||
|
|
||||||
|
A convenience script for calling this command via an automated scheduler has been included at `/contrib/netbox-housekeeping.sh`. Please see the [housekeeping documentation](../administration/housekeeping.md) for further details.
|
||||||
|
|
||||||
|
#### Custom Queue Support for Plugins ([#6651](https://github.com/netbox-community/netbox/issues/6651))
|
||||||
|
|
||||||
|
NetBox uses Redis and Django-RQ for background task queuing. Whereas previous releases employed only a single default queue, NetBox now provides a high-, medium- (default), and low-priority queue for use by plugins. (These will also likely be used internally as new functionality is added in future releases.)
|
||||||
|
|
||||||
|
Plugins can also now create their own custom queues by defining a `queues` list within their PluginConfig class:
|
||||||
|
|
||||||
|
```python
|
||||||
|
class MyPluginConfig(PluginConfig):
|
||||||
|
name = 'myplugin'
|
||||||
|
...
|
||||||
|
queues = [
|
||||||
|
'queue1',
|
||||||
|
'queue2',
|
||||||
|
'queue-whatever-the-name'
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that NetBox's `rqworker` process will _not_ service custom queues by default, since it has no way to infer the priority of each queue. Plugin authors should be diligent in including instructions for proper worker configuration in their plugin's documentation.
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#2434](https://github.com/netbox-community/netbox/issues/2434) - Add option to assign IP address upon creating a new interface
|
||||||
|
* [#3665](https://github.com/netbox-community/netbox/issues/3665) - Enable rendering export templates via REST API
|
||||||
|
* [#3682](https://github.com/netbox-community/netbox/issues/3682) - Add `color` field to front and rear ports
|
||||||
|
* [#4609](https://github.com/netbox-community/netbox/issues/4609) - Allow marking prefixes as fully utilized
|
||||||
|
* [#5203](https://github.com/netbox-community/netbox/issues/5203) - Remember user preference when toggling display of device images in rack elevations
|
||||||
|
* [#5806](https://github.com/netbox-community/netbox/issues/5806) - Add kilometer and mile as choices for cable length unit
|
||||||
|
* [#6154](https://github.com/netbox-community/netbox/issues/6154) - Allow decimal values for cable lengths
|
||||||
|
* [#6328](https://github.com/netbox-community/netbox/issues/6328) - Build and serve documentation locally
|
||||||
|
|
||||||
|
### Bug Fixes (from v3.2-beta2)
|
||||||
|
|
||||||
|
* [#6977](https://github.com/netbox-community/netbox/issues/6977) - Truncate global search dropdown on small screens
|
||||||
|
* [#6979](https://github.com/netbox-community/netbox/issues/6979) - Hide "create & add another" button for circuit terminations
|
||||||
|
* [#6982](https://github.com/netbox-community/netbox/issues/6982) - Fix styling of empty dropdown list under dark mode
|
||||||
|
* [#6996](https://github.com/netbox-community/netbox/issues/6996) - Global search bar should be full width on mobile
|
||||||
|
* [#7001](https://github.com/netbox-community/netbox/issues/7001) - Fix page focus on load
|
||||||
|
* [#7034](https://github.com/netbox-community/netbox/issues/7034) - Fix toggling of VLAN group scope selector fields
|
||||||
|
* [#7045](https://github.com/netbox-community/netbox/issues/7045) - Fix navigation menu rendering under Chrome
|
||||||
|
|
||||||
|
### Other Changes
|
||||||
|
|
||||||
|
* [#5223](https://github.com/netbox-community/netbox/issues/5223) - Remove the console/power/interface connections REST API endpoints
|
||||||
|
* [#5278](https://github.com/netbox-community/netbox/issues/5278) - Remove the secrets functionality from NetBox core
|
||||||
|
* [#5532](https://github.com/netbox-community/netbox/issues/5532) - Drop support for Python 3.6
|
||||||
|
* [#5994](https://github.com/netbox-community/netbox/issues/5994) - Drop support for `display_field` argument on ObjectVar
|
||||||
|
* [#6068](https://github.com/netbox-community/netbox/issues/6068) - Drop support for legacy static CSV export
|
||||||
|
* [#6338](https://github.com/netbox-community/netbox/issues/6338) - Decimal fields are no longer coerced to strings in REST API
|
||||||
|
* [#6471](https://github.com/netbox-community/netbox/issues/6471) - Optimize database migrations
|
||||||
|
* [#6639](https://github.com/netbox-community/netbox/issues/6639) - Drop support for queryset caching (django-cacheops)
|
||||||
|
* [#6713](https://github.com/netbox-community/netbox/issues/6713) - Checking for new releases is now done as part of the housekeeping routine
|
||||||
|
* [#6767](https://github.com/netbox-community/netbox/issues/6767) - Add support for Python 3.9
|
||||||
|
|
||||||
|
### Configuration Changes
|
||||||
|
|
||||||
|
* The `CACHE_TIMEOUT` configuration parameter has been removed.
|
||||||
|
* The `RELEASE_CHECK_TIMEOUT` configuration parameter has been removed.
|
||||||
|
|
||||||
|
### REST API Changes
|
||||||
|
|
||||||
|
* Removed all endpoints related to the secrets functionality:
|
||||||
|
* `/api/secrets/generate-rsa-key-pair/`
|
||||||
|
* `/api/secrets/get-session-key/`
|
||||||
|
* `/api/secrets/secrets/`
|
||||||
|
* `/api/secrets/secret-roles/`
|
||||||
|
* Removed the following "connections" endpoints:
|
||||||
|
* `/api/dcim/console-connections/`
|
||||||
|
* `/api/dcim/power-connections/`
|
||||||
|
* `/api/dcim/interface-connections/`
|
||||||
|
* Added the `/api/ipam/ip-ranges/` endpoint
|
||||||
|
* Added the `/api/users/tokens/` endpoint
|
||||||
|
* The `provision/` child endpoint can be used to provision new REST API tokens by supplying a valid username and password
|
||||||
|
* dcim.Cable
|
||||||
|
* `length` is now a decimal value
|
||||||
|
* dcim.Device
|
||||||
|
* Removed the `display_name` attribute (use `display` instead)
|
||||||
|
* dcim.DeviceType
|
||||||
|
* Removed the `display_name` attribute (use `display` instead)
|
||||||
|
* dcim.FrontPort
|
||||||
|
* Added `color` field
|
||||||
|
* dcim.FrontPortTemplate
|
||||||
|
* Added `color` field
|
||||||
|
* dcim.Rack
|
||||||
|
* Removed the `display_name` attribute (use `display` instead)
|
||||||
|
* dcim.RearPort
|
||||||
|
* Added `color` field
|
||||||
|
* dcim.RearPortTemplate
|
||||||
|
* Added `color` field
|
||||||
|
* dcim.Site
|
||||||
|
* `latitude` and `longitude` are now decimal fields rather than strings
|
||||||
|
* extras.ContentType
|
||||||
|
* Removed the `display_name` attribute (use `display` instead)
|
||||||
|
* ipam.Prefix
|
||||||
|
* Added the `mark_utilized` boolean field
|
||||||
|
* ipam.VLAN
|
||||||
|
* Removed the `display_name` attribute (use `display` instead)
|
||||||
|
* ipam.VRF
|
||||||
|
* Removed the `display_name` attribute (use `display` instead)
|
||||||
|
* virtualization.VirtualMachine
|
||||||
|
* `vcpus` is now a decimal field rather than a string
|
||||||