Compare commits
1280 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a59f2352c | ||
|
|
5164b78da1 | ||
|
|
5561b46a59 | ||
|
|
26b2431cbf | ||
|
|
029605f926 | ||
|
|
0cd173f9df | ||
|
|
414810bdf5 | ||
|
|
f94c1e91ea | ||
|
|
b7129e1456 | ||
|
|
dc6decd404 | ||
|
|
40c6b172f7 | ||
|
|
7cb9cedfe1 | ||
|
|
b43980d660 | ||
|
|
09b612546b | ||
|
|
a99d14c13f | ||
|
|
68f322a03b | ||
|
|
97f0414ff3 | ||
|
|
d5f308d9c9 | ||
|
|
1377eda0ba | ||
|
|
70259b0d04 | ||
|
|
f1466d6da3 | ||
|
|
83010e278c | ||
|
|
dc3040550d | ||
|
|
3b25db919a | ||
|
|
09f038f997 | ||
|
|
bbdd3804c7 | ||
|
|
a0b9ac7bcc | ||
|
|
8bb0cba949 | ||
|
|
870aa3a265 | ||
|
|
86ada33577 | ||
|
|
869808b3f9 | ||
|
|
57ccbf44b8 | ||
|
|
416caa8f50 | ||
|
|
1e42fecf66 | ||
|
|
c9b00891ed | ||
|
|
497eacbea3 | ||
|
|
f90c591c78 | ||
|
|
175498940e | ||
|
|
eded00cbb3 | ||
|
|
b7c9ca720a | ||
|
|
7072f207c0 | ||
|
|
5f59f458f4 | ||
|
|
b6fe613329 | ||
|
|
cd128e557c | ||
|
|
30a5c70260 | ||
|
|
beca978af5 | ||
|
|
98a830a6a0 | ||
|
|
ed2231e34b | ||
|
|
55049bb303 | ||
|
|
c210c6937b | ||
|
|
d2767f39f0 | ||
|
|
1c9d39d3e6 | ||
|
|
f16c6d81cf | ||
|
|
e8d6281007 | ||
|
|
8299845615 | ||
|
|
9ae5865c2d | ||
|
|
c2d0cfdfc0 | ||
|
|
5dd252731e | ||
|
|
7b9436d2b9 | ||
|
|
6a369ac985 | ||
|
|
23d90823a3 | ||
|
|
4bfb6b476c | ||
|
|
0d60099588 | ||
|
|
9a45547cda | ||
|
|
a000ded350 | ||
|
|
424ac29131 | ||
|
|
b7b5a5788f | ||
|
|
9de179cba8 | ||
|
|
94069e76c9 | ||
|
|
df9d67b873 | ||
|
|
6f7fbf7686 | ||
|
|
f32e694499 | ||
|
|
e5900a3fe3 | ||
|
|
6e151b044d | ||
|
|
516bea6a0a | ||
|
|
496cabcc53 | ||
|
|
d051db5083 | ||
|
|
660fc23e15 | ||
|
|
a5a480133f | ||
|
|
68b544c676 | ||
|
|
a8c958ece2 | ||
|
|
f77f7ca0ec | ||
|
|
6b21c8453f | ||
|
|
fa8a8abc98 | ||
|
|
98cc36c458 | ||
|
|
f3beabba69 | ||
|
|
467fa5a847 | ||
|
|
50f283cf28 | ||
|
|
f49d7008a0 | ||
|
|
1fed564c47 | ||
|
|
bb99c3e6f9 | ||
|
|
8820cac792 | ||
|
|
ada911c20b | ||
|
|
17e01644f5 | ||
|
|
9458521f3e | ||
|
|
8aa73c5900 | ||
|
|
500f213c6b | ||
|
|
cede27b5fe | ||
|
|
c0ca1eaf90 | ||
|
|
b29a5511df | ||
|
|
49e77841e0 | ||
|
|
daf6c8e327 | ||
|
|
9f8068e8d1 | ||
|
|
0b705553a5 | ||
|
|
a799094227 | ||
|
|
d529c1b5b3 | ||
|
|
834f68e6e4 | ||
|
|
83b2102705 | ||
|
|
2f064cdfd1 | ||
|
|
6c28182dd3 | ||
|
|
3cb8c5db28 | ||
|
|
251abdb4dd | ||
|
|
726e4df54b | ||
|
|
bd32a6ac8e | ||
|
|
27d7400c36 | ||
|
|
53e52aeaa8 | ||
|
|
ae6ed97a80 | ||
|
|
34f24de3e4 | ||
|
|
f93d6813a9 | ||
|
|
3ad773beb3 | ||
|
|
be91235858 | ||
|
|
95fc0bbc94 | ||
|
|
9dad7e4daf | ||
|
|
d08ed9fe5f | ||
|
|
82210cc116 | ||
|
|
94d3e76517 | ||
|
|
3f72492a59 | ||
|
|
c0653da736 | ||
|
|
f3d8f1b1fb | ||
|
|
d2391b9c63 | ||
|
|
f8e44c09eb | ||
|
|
2a00519b93 | ||
|
|
3292a2aecc | ||
|
|
b7aa44837f | ||
|
|
17fd6e692e | ||
|
|
2ce8ef5704 | ||
|
|
7b7afd3e7b | ||
|
|
9c2514fce4 | ||
|
|
e04402ed57 | ||
|
|
3eda8d8482 | ||
|
|
79f2f03fb2 | ||
|
|
f7d0db9cd2 | ||
|
|
fab1d3651b | ||
|
|
e5d7578663 | ||
|
|
cf80c1a506 | ||
|
|
4649ab2d85 | ||
|
|
773fd47ca6 | ||
|
|
2fd526b359 | ||
|
|
830cf4b31f | ||
|
|
2826f27153 | ||
|
|
83ac869693 | ||
|
|
bc92f9221a | ||
|
|
c2f85a2877 | ||
|
|
0bbd186635 | ||
|
|
806dcd74ec | ||
|
|
93772e7265 | ||
|
|
9094f07290 | ||
|
|
0aae155c80 | ||
|
|
54233aba1b | ||
|
|
bd3d2c60d9 | ||
|
|
2e75a111ed | ||
|
|
e4b0359b8e | ||
|
|
803e0bfe72 | ||
|
|
a5024a65a0 | ||
|
|
734a00237a | ||
|
|
06f1d15283 | ||
|
|
ff3edc9889 | ||
|
|
8f1acb700d | ||
|
|
519884d167 | ||
|
|
3f0a98acbd | ||
|
|
c023e5f518 | ||
|
|
67c73768c1 | ||
|
|
bbb98083eb | ||
|
|
8bb9f4b8a2 | ||
|
|
96cde7d4af | ||
|
|
ea39c8a4c1 | ||
|
|
7a55832a22 | ||
|
|
7a97d5d4eb | ||
|
|
8305f6d1f5 | ||
|
|
dcececf9c0 | ||
|
|
839afe5ac0 | ||
|
|
c72f25c693 | ||
|
|
5fc373f5cc | ||
|
|
cf9eaf2eff | ||
|
|
04d145d6d8 | ||
|
|
76d73abd81 | ||
|
|
0ec0185d84 | ||
|
|
7b1335825b | ||
|
|
2c2e37e9f0 | ||
|
|
25957bfae3 | ||
|
|
11e2200acf | ||
|
|
f5356b84f6 | ||
|
|
db2d71ed9e | ||
|
|
1bf100ba15 | ||
|
|
7614f423e5 | ||
|
|
318c8b85e9 | ||
|
|
7085fe77da | ||
|
|
2e20d7f02b | ||
|
|
831065b5a1 | ||
|
|
b97167e841 | ||
|
|
19bacc9e23 | ||
|
|
61b61b1bc0 | ||
|
|
7c3318df92 | ||
|
|
d0b85586b9 | ||
|
|
cef0d168a5 | ||
|
|
3a192223a3 | ||
|
|
288a1d23e5 | ||
|
|
7c05db8e2f | ||
|
|
18080a969e | ||
|
|
412430e1c3 | ||
|
|
131e433880 | ||
|
|
b7c0e8b71f | ||
|
|
264652f2c3 | ||
|
|
2cb53a0f7e | ||
|
|
7625a2dd3c | ||
|
|
93da5a39be | ||
|
|
aeb4996ac2 | ||
|
|
330c498fe4 | ||
|
|
5d0a7cb307 | ||
|
|
8c27ff3859 | ||
|
|
736d6cb675 | ||
|
|
200aca470b | ||
|
|
b2dc6c5d3d | ||
|
|
a5ec0ee277 | ||
|
|
f48d7aedce | ||
|
|
bb4f3e1789 | ||
|
|
e0230ed104 | ||
|
|
704fdf9ccd | ||
|
|
d528614cbf | ||
|
|
b5e8157700 | ||
|
|
339776c139 | ||
|
|
87e07e731d | ||
|
|
3991115ae5 | ||
|
|
a30e7bf34f | ||
|
|
43b983054a | ||
|
|
d3364ef4d1 | ||
|
|
24d6941cc4 | ||
|
|
4099dd3a05 | ||
|
|
f420435b82 | ||
|
|
696fe7bc0d | ||
|
|
7c147db324 | ||
|
|
32205045ba | ||
|
|
1ce9192369 | ||
|
|
0a62f75a40 | ||
|
|
2e0f15b35f | ||
|
|
7c60089692 | ||
|
|
0a8788eb97 | ||
|
|
9565addcd4 | ||
|
|
6377d475fc | ||
|
|
fff124ebb1 | ||
|
|
033db83068 | ||
|
|
de5c9ef4b2 | ||
|
|
3c261b05d9 | ||
|
|
ada81e31c9 | ||
|
|
0f68ecda78 | ||
|
|
1902e112f6 | ||
|
|
96565c31d9 | ||
|
|
aa9e68e121 | ||
|
|
15e011ae52 | ||
|
|
a173083e5b | ||
|
|
33c0c8cf6a | ||
|
|
9b5f45aee1 | ||
|
|
93de6c9f88 | ||
|
|
0ad440fea5 | ||
|
|
8235b339ee | ||
|
|
3185cd0b1f | ||
|
|
3a85edba3d | ||
|
|
a573a35349 | ||
|
|
d67d3f8d6d | ||
|
|
1e317f82f5 | ||
|
|
acdebea7f1 | ||
|
|
a090955918 | ||
|
|
70f71e0f57 | ||
|
|
dfdeac4968 | ||
|
|
e84f2e3ad2 | ||
|
|
98ca4f5b5a | ||
|
|
87779b7b88 | ||
|
|
b56cae24c5 | ||
|
|
d48a68317d | ||
|
|
77bd26d17f | ||
|
|
4cdc2601f5 | ||
|
|
ff5c274048 | ||
|
|
561e06e7f0 | ||
|
|
626a446c3d | ||
|
|
26d2da7b98 | ||
|
|
66ed39b4b7 | ||
|
|
fbf91dda7d | ||
|
|
41ff1d0fc9 | ||
|
|
64d8512fc3 | ||
|
|
94804fecd8 | ||
|
|
559dc2f865 | ||
|
|
7c0f32e8ee | ||
|
|
82243732a1 | ||
|
|
61d2158f76 | ||
|
|
68081fb9a2 | ||
|
|
8276933dbb | ||
|
|
0d84338e28 | ||
|
|
2423e0872f | ||
|
|
35c967e6f7 | ||
|
|
b92de63245 | ||
|
|
8b529abfe1 | ||
|
|
a01068949c | ||
|
|
b07e88869a | ||
|
|
94bd27bcf5 | ||
|
|
78ecc8673c | ||
|
|
7e26d92190 | ||
|
|
dbe2f8a6f1 | ||
|
|
e96f5447f4 | ||
|
|
5193fa6483 | ||
|
|
e1e2c76ae1 | ||
|
|
a3e7cab935 | ||
|
|
c06b3374ce | ||
|
|
6f66138a18 | ||
|
|
334c97035e | ||
|
|
1c6a84659c | ||
|
|
3a3ed8bf64 | ||
|
|
001ab1d067 | ||
|
|
4932e4f8c6 | ||
|
|
6f05f17c62 | ||
|
|
cfb3897047 | ||
|
|
8c058dcd45 | ||
|
|
7b70129974 | ||
|
|
6a4becfb46 | ||
|
|
4a7159389e | ||
|
|
a66501250e | ||
|
|
efb41b7433 | ||
|
|
090df05193 | ||
|
|
2c161c01c1 | ||
|
|
fc5a23cc88 | ||
|
|
73f2f9fc63 | ||
|
|
eb4b4a6c8d | ||
|
|
39430e01de | ||
|
|
96015aa590 | ||
|
|
c1720505f3 | ||
|
|
5c338a90a1 | ||
|
|
f04dc55030 | ||
|
|
38bc5de3e8 | ||
|
|
7c56b21095 | ||
|
|
8d0ed99bcd | ||
|
|
8375995680 | ||
|
|
0afd3e6189 | ||
|
|
79cee12b1e | ||
|
|
ba7361bdc7 | ||
|
|
554b44b9f2 | ||
|
|
b44a5ea609 | ||
|
|
487d67768b | ||
|
|
f485a47b48 | ||
|
|
faf1e6a43d | ||
|
|
f193f0d3f9 | ||
|
|
2e78568d4d | ||
|
|
aa5c42683a | ||
|
|
0c72c20d2a | ||
|
|
9c6938e7ae | ||
|
|
811c21ec7e | ||
|
|
84c14aadc7 | ||
|
|
f1f0d9cd0d | ||
|
|
717fd760df | ||
|
|
075f4907ef | ||
|
|
b7317bfe29 | ||
|
|
01d3c062f2 | ||
|
|
6af5a884cd | ||
|
|
6015c47587 | ||
|
|
33ea8763d5 | ||
|
|
2c2c2e9060 | ||
|
|
64dad7dbd2 | ||
|
|
176bd2396b | ||
|
|
e16942dea5 | ||
|
|
12efcec3b0 | ||
|
|
a7b6c40596 | ||
|
|
b95773938d | ||
|
|
6898ae7106 | ||
|
|
909b83c537 | ||
|
|
fb9da87abb | ||
|
|
bdf359470e | ||
|
|
4c475c1b33 | ||
|
|
438b4b4758 | ||
|
|
01f791a44e | ||
|
|
43f2d4a331 | ||
|
|
95ed07a95e | ||
|
|
ec0560a2c5 | ||
|
|
ac2cd552b9 | ||
|
|
1c73bd5079 | ||
|
|
138af27bf7 | ||
|
|
445e16f668 | ||
|
|
90e9f34494 | ||
|
|
5271680483 | ||
|
|
38f6d22d2d | ||
|
|
8b80b0c3df | ||
|
|
8e1535f7ec | ||
|
|
3e7922e41e | ||
|
|
1a4f8c5422 | ||
|
|
66c4d23119 | ||
|
|
d66fc8f661 | ||
|
|
031876964f | ||
|
|
5a6190e321 | ||
|
|
18c3bb673f | ||
|
|
6463fd902c | ||
|
|
c63766c4c6 | ||
|
|
af6237e12e | ||
|
|
00328226ec | ||
|
|
b31ba4e9d2 | ||
|
|
4be5d3f9e9 | ||
|
|
53154746fc | ||
|
|
2f4c1b6e8f | ||
|
|
045ec7d3a0 | ||
|
|
b73db750e5 | ||
|
|
3f766ffea8 | ||
|
|
f28761202f | ||
|
|
6d1f07df05 | ||
|
|
eb9f2b36ab | ||
|
|
ca59cd1eb8 | ||
|
|
2bd29127dc | ||
|
|
3eef6363fd | ||
|
|
d451f30bfc | ||
|
|
105956f8e6 | ||
|
|
39256afb67 | ||
|
|
69aaf28b9c | ||
|
|
b806220074 | ||
|
|
d2bdf4e822 | ||
|
|
3ab5682e7a | ||
|
|
c0010ec100 | ||
|
|
6897c5fadd | ||
|
|
745aa23ed6 | ||
|
|
9089f5cf67 | ||
|
|
dd79aae137 | ||
|
|
26e470f521 | ||
|
|
a34c8b80e5 | ||
|
|
854a12982f | ||
|
|
cf173d4f50 | ||
|
|
7041486b93 | ||
|
|
548a8c3be3 | ||
|
|
087a018faf | ||
|
|
e09024e86f | ||
|
|
1757102536 | ||
|
|
9c8432cf13 | ||
|
|
c262af550d | ||
|
|
d9c6609b24 | ||
|
|
339bcb89bb | ||
|
|
b5884a5b54 | ||
|
|
c818d63043 | ||
|
|
c9c537a1b9 | ||
|
|
1be748b479 | ||
|
|
376c776520 | ||
|
|
a1f271d7d9 | ||
|
|
724997cb48 | ||
|
|
f3fe3f9a18 | ||
|
|
357a5d1e65 | ||
|
|
460e3fd5d6 | ||
|
|
257c0afdb5 | ||
|
|
ed3bc7cdcc | ||
|
|
bd181ac84f | ||
|
|
d1f5988db7 | ||
|
|
a5b99e7148 | ||
|
|
114500e7f4 | ||
|
|
d9f178e315 | ||
|
|
7337630704 | ||
|
|
0fdd081869 | ||
|
|
a9761e8dd2 | ||
|
|
1f1a05dc67 | ||
|
|
14b065cf5f | ||
|
|
47c3a20fda | ||
|
|
86aed4e073 | ||
|
|
19c984bdab | ||
|
|
84d83fbd14 | ||
|
|
965ba3aca1 | ||
|
|
38f34ddb28 | ||
|
|
6b3e0d3229 | ||
|
|
854121b6ec | ||
|
|
047425dadd | ||
|
|
8dc0767cdf | ||
|
|
a99753fb0f | ||
|
|
ad65e06d0a | ||
|
|
bfb37d6283 | ||
|
|
fd180e480a | ||
|
|
3e5452d9da | ||
|
|
3ec0fe5519 | ||
|
|
71449b3414 | ||
|
|
16f5e233d0 | ||
|
|
abb72868f2 | ||
|
|
13e9d57d68 | ||
|
|
833acc3618 | ||
|
|
db522f96be | ||
|
|
df8b76127e | ||
|
|
8e849566d5 | ||
|
|
dba9602c75 | ||
|
|
9e2364b246 | ||
|
|
b5aecfeb91 | ||
|
|
c7523ffc67 | ||
|
|
d87d860a57 | ||
|
|
68b1234388 | ||
|
|
8fda08a1b5 | ||
|
|
aaba4b534f | ||
|
|
6d32aa8a88 | ||
|
|
0214c388ae | ||
|
|
e443d719d4 | ||
|
|
d514290688 | ||
|
|
694bd231e3 | ||
|
|
8523ad166e | ||
|
|
7ec6b4ebb7 | ||
|
|
38172b793b | ||
|
|
6bccb6d90b | ||
|
|
3cf1d6baf4 | ||
|
|
2a1718bfc8 | ||
|
|
0db4092266 | ||
|
|
41dfdc0aaa | ||
|
|
6bc72109c1 | ||
|
|
55e9685d30 | ||
|
|
d2dcc51430 | ||
|
|
214c1d5a50 | ||
|
|
38be0b4976 | ||
|
|
b86847c57e | ||
|
|
8ba5d03280 | ||
|
|
879ffd648b | ||
|
|
030c573037 | ||
|
|
713e79c1a9 | ||
|
|
383cdb5340 | ||
|
|
7b3f6f1c67 | ||
|
|
9cb29f48a0 | ||
|
|
5e29679968 | ||
|
|
84f3ab90df | ||
|
|
34db2eb611 | ||
|
|
16d8981a3f | ||
|
|
e67c965180 | ||
|
|
b0abfee35b | ||
|
|
1e8ee5e59b | ||
|
|
cc0830bf28 | ||
|
|
e3e005e327 | ||
|
|
42afd80e82 | ||
|
|
0b2862be54 | ||
|
|
8d703ffb36 | ||
|
|
6f24a938d9 | ||
|
|
574b57eadb | ||
|
|
aa05097fca | ||
|
|
de58f53f9f | ||
|
|
e738ff2fa7 | ||
|
|
25f501fb12 | ||
|
|
baf045aed6 | ||
|
|
e813dda275 | ||
|
|
ca131f12db | ||
|
|
ca72b07947 | ||
|
|
13d8957cf1 | ||
|
|
ca11b74c8e | ||
|
|
2ba6a6fc45 | ||
|
|
a6e79a1d61 | ||
|
|
1f4263aa6d | ||
|
|
147a4cbfb0 | ||
|
|
ab0a2abc54 | ||
|
|
57abbf1058 | ||
|
|
2a95e1bf71 | ||
|
|
bd957612c6 | ||
|
|
908e6a7a38 | ||
|
|
4493c31216 | ||
|
|
7a813349f3 | ||
|
|
ad7b8a9ac8 | ||
|
|
a226f06b1b | ||
|
|
b55c85b2af | ||
|
|
0d1d14bcd6 | ||
|
|
8c1a01d5ab | ||
|
|
cf8fdacfa3 | ||
|
|
2c1745ce28 | ||
|
|
950ce94653 | ||
|
|
851f8a1585 | ||
|
|
d40d1638af | ||
|
|
26ceeb61ef | ||
|
|
a39a9c9b56 | ||
|
|
45988b9818 | ||
|
|
7234b3bbf8 | ||
|
|
513ecd7e26 | ||
|
|
e12314ba60 | ||
|
|
9226302742 | ||
|
|
0e8c6ee522 | ||
|
|
a9c1c8968e | ||
|
|
6a15c2ae86 | ||
|
|
752de0d9c0 | ||
|
|
49617a595d | ||
|
|
2a293d5d02 | ||
|
|
9d99ede024 | ||
|
|
4a13ee6f40 | ||
|
|
2ba840c72c | ||
|
|
46cd55151d | ||
|
|
4d9691c8e5 | ||
|
|
f1687ef53d | ||
|
|
2fb55374b9 | ||
|
|
312246fec2 | ||
|
|
27c0e6dd5e | ||
|
|
0d7986e082 | ||
|
|
94300b221e | ||
|
|
a1110b07de | ||
|
|
a3069239e9 | ||
|
|
69f083428d | ||
|
|
113358f2de | ||
|
|
caa2813d0d | ||
|
|
481046c8b8 | ||
|
|
83f70dc28c | ||
|
|
8ede7a9297 | ||
|
|
ddff193786 | ||
|
|
774dff07ee | ||
|
|
4b14b31853 | ||
|
|
b0addfbe13 | ||
|
|
593874b45f | ||
|
|
b207f28402 | ||
|
|
7bdde47473 | ||
|
|
a2eb0d80d2 | ||
|
|
6f94198934 | ||
|
|
707e51d855 | ||
|
|
528df76747 | ||
|
|
662c896480 | ||
|
|
29eb2383d6 | ||
|
|
9772c5705f | ||
|
|
d2fe59ae8f | ||
|
|
d5e5cdda23 | ||
|
|
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 | ||
|
|
b44ec35ade | ||
|
|
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 | ||
|
|
736da4bcad | ||
|
|
6d27e11043 | ||
|
|
b8e387ce98 | ||
|
|
c7ebad0fbb | ||
|
|
6845fb0f00 | ||
|
|
a312311be9 | ||
|
|
fe54acef51 | ||
|
|
ef057b3e45 | ||
|
|
84ab233571 | ||
|
|
cf381d732d | ||
|
|
8653b0f3d0 | ||
|
|
65659fb676 | ||
|
|
939bcfec4b | ||
|
|
6ce8dd5ac3 | ||
|
|
63f4d81bc0 | ||
|
|
d0fbbbfb37 | ||
|
|
34aa231436 | ||
|
|
51d1b6e0d6 | ||
|
|
42b961229f | ||
|
|
79f726e6cd | ||
|
|
31cd6898d4 | ||
|
|
7608ee8450 | ||
|
|
da67a35328 | ||
|
|
0ea9c65007 | ||
|
|
57dc4c207f | ||
|
|
582b69de74 | ||
|
|
0cf9be2a8d | ||
|
|
0bf39590e3 | ||
|
|
2debeb7475 | ||
|
|
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 | ||
|
|
5413263eff | ||
|
|
772c76e0a4 | ||
|
|
5463fa7390 | ||
|
|
d18c83beb0 | ||
|
|
7aa89c2e73 | ||
|
|
007d660ce1 | ||
|
|
3752cb3e56 | ||
|
|
cdf8d91e1b | ||
|
|
d082442851 | ||
|
|
689f67b1a8 | ||
|
|
744f47cb98 | ||
|
|
81e1b7490e | ||
|
|
22d160b1da | ||
|
|
c323105696 | ||
|
|
f6746c7530 | ||
|
|
52c4d54481 | ||
|
|
4c3f584fa6 | ||
|
|
2e7d912bdd | ||
|
|
33d40d4253 | ||
|
|
c7e0abc3fb | ||
|
|
5a8835f41a | ||
|
|
2d32aeb972 | ||
|
|
fc01bedd45 | ||
|
|
51c1f4b214 | ||
|
|
0b80d85c6c | ||
|
|
4489e130f2 | ||
|
|
e1cc00ad17 | ||
|
|
49191261a1 | ||
|
|
0479d5a02a | ||
|
|
189e733f81 | ||
|
|
bf2d535356 | ||
|
|
05cfdd0b69 | ||
|
|
a60e8d3e12 | ||
|
|
7b3d285884 | ||
|
|
5ba053a1c0 | ||
|
|
7d5f647cd3 | ||
|
|
0572d03003 | ||
|
|
cb804eb3e1 | ||
|
|
878288fbec | ||
|
|
407f05629a | ||
|
|
ffae2c5f18 | ||
|
|
8898d3b558 | ||
|
|
53c29b65bd | ||
|
|
8e7bcd95a4 | ||
|
|
84479925bf | ||
|
|
7bfc66e218 | ||
|
|
309247d487 | ||
|
|
081054e08c | ||
|
|
adda8c4642 | ||
|
|
a0b17e145b | ||
|
|
3f0b355717 | ||
|
|
6b09c139e7 | ||
|
|
03b20b00b4 | ||
|
|
108305a3e3 | ||
|
|
ae4f4b052e | ||
|
|
7be684835b | ||
|
|
a9930bd442 | ||
|
|
19eafef41e | ||
|
|
d42138384f | ||
|
|
ebe7779f40 | ||
|
|
347ea4ca98 | ||
|
|
f2f9c926bb | ||
|
|
5e1156abe2 | ||
|
|
803f9b6913 | ||
|
|
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 | ||
|
|
7449ea28a5 | ||
|
|
fa6661e4ae | ||
|
|
bfb1b6ac0a | ||
|
|
6b88ed0321 | ||
|
|
faa993acfb | ||
|
|
fbcdae9a6b | ||
|
|
12e1681d31 | ||
|
|
4225e28a4b | ||
|
|
23be5694d0 | ||
|
|
dc8adfc546 | ||
|
|
5d98c3337a | ||
|
|
5406acf329 | ||
|
|
7f121f7518 | ||
|
|
1b132379be | ||
|
|
0f99e5fcaa | ||
|
|
726b148aa9 | ||
|
|
facf757997 | ||
|
|
fe1f221286 | ||
|
|
d3b4a72f4f | ||
|
|
fa47ad0095 | ||
|
|
aa7d38a0a5 | ||
|
|
42b2e2717d | ||
|
|
3387282de4 | ||
|
|
c82470e4df | ||
|
|
4383425060 | ||
|
|
fd58eeae1d | ||
|
|
a09e4bf82a | ||
|
|
dce3e0763f | ||
|
|
bc812e4937 | ||
|
|
38d7b83ed0 | ||
|
|
65aaab5f38 | ||
|
|
f426ba3526 | ||
|
|
028c876bca | ||
|
|
29299b4644 | ||
|
|
7c6e5a68d9 | ||
|
|
fa99263918 | ||
|
|
e173c8b548 | ||
|
|
3e19038e06 | ||
|
|
2c023ef7a0 | ||
|
|
d9e27b6a82 | ||
|
|
b6ec1d9aa7 | ||
|
|
f683f0786e | ||
|
|
995aa65f16 | ||
|
|
8b76db2bca | ||
|
|
9c247d9a19 | ||
|
|
d9a6f11c35 | ||
|
|
00c4ac8d51 | ||
|
|
88e382e7a1 | ||
|
|
57fc6efd4c | ||
|
|
2fe734e6f9 | ||
|
|
e6091ee0c9 | ||
|
|
728b3bac67 | ||
|
|
0d7309cb19 | ||
|
|
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 | ||
|
|
4a6278f598 | ||
|
|
14f696e824 | ||
|
|
7c779f4f09 | ||
|
|
4c4fe80697 | ||
|
|
fdd8e33b58 | ||
|
|
c36b190d5d | ||
|
|
37c9340499 | ||
|
|
b038b1f613 | ||
|
|
48b4bf1683 | ||
|
|
d87ec82fe3 | ||
|
|
a1ba3b567c | ||
|
|
b3ed545d6a | ||
|
|
8a7473765e | ||
|
|
eda1c6b2c6 | ||
|
|
7e55b44610 | ||
|
|
7e18b0dd3a | ||
|
|
578885225f | ||
|
|
3ec6194a47 | ||
|
|
9d3cac43b7 | ||
|
|
569041a4c4 | ||
|
|
9839885198 | ||
|
|
18472188b9 | ||
|
|
44c0dec68b | ||
|
|
f81b3d4ed6 | ||
|
|
c69ef95c6a | ||
|
|
dfd42c9896 | ||
|
|
3bfa1cbf41 | ||
|
|
0e23038e28 | ||
|
|
2d44bade4b | ||
|
|
e12fef7828 | ||
|
|
dc79f80366 | ||
|
|
e004f872f9 | ||
|
|
587335e3ba | ||
|
|
7219e3760c | ||
|
|
d2267ecd71 | ||
|
|
b159def9b2 | ||
|
|
e1eefd1165 | ||
|
|
5b4dacf0f5 | ||
|
|
1daee79095 | ||
|
|
5b68a11f01 | ||
|
|
0c8195e4f1 | ||
|
|
8fe795102f | ||
|
|
27a02f64b2 | ||
|
|
7bb7747c67 | ||
|
|
8bb47a88f8 | ||
|
|
e8c91ea3a1 | ||
|
|
429d995270 | ||
|
|
c4bd47eb84 | ||
|
|
1811118f28 | ||
|
|
69ba925ee8 | ||
|
|
7219c3449f | ||
|
|
a5d84c88bf | ||
|
|
da0aa38614 | ||
|
|
6b1397d257 | ||
|
|
7d640e2aab | ||
|
|
0a01629b15 | ||
|
|
ee2de33643 | ||
|
|
93534db79e | ||
|
|
805892f623 | ||
|
|
744792452f | ||
|
|
dc5c765c2a | ||
|
|
fed0322ebf | ||
|
|
e429ba6fa2 | ||
|
|
234475effe | ||
|
|
7d7d06651c | ||
|
|
43a823d0ac | ||
|
|
96ffae3372 | ||
|
|
ecf51406c5 | ||
|
|
bf56145a09 | ||
|
|
8056290423 | ||
|
|
892d1214b0 | ||
|
|
f6823b5704 | ||
|
|
f3abf84e17 | ||
|
|
a6d937b366 | ||
|
|
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 | ||
|
|
43c17b9950 | ||
|
|
ea5d02b1e6 | ||
|
|
5856275347 | ||
|
|
534b0e4cf6 | ||
|
|
6899a3258a | ||
|
|
04cc43b2f0 | ||
|
|
460a203c29 | ||
|
|
79184347f9 | ||
|
|
be48bf06df | ||
|
|
9ad8065f75 | ||
|
|
58e1a1f1d8 | ||
|
|
aee09d9119 | ||
|
|
de56e2b405 | ||
|
|
abd9ffd31d | ||
|
|
0b07909386 | ||
|
|
82b770c1aa | ||
|
|
456ffb79ff | ||
|
|
368c2aac24 | ||
|
|
b6f70ed92a | ||
|
|
98c2914eeb | ||
|
|
5b09e4ac0c | ||
|
|
5d8cf22897 | ||
|
|
eea26d7ece | ||
|
|
06182bfce4 | ||
|
|
77bb9eaa73 | ||
|
|
10d1378277 | ||
|
|
8b2f4780ed | ||
|
|
aef513f038 | ||
|
|
bb55df34d7 | ||
|
|
2b159fc40f | ||
|
|
d7d004b48e | ||
|
|
013fbf79e9 | ||
|
|
8a2d4ab68c | ||
|
|
5e4878843e | ||
|
|
be484d20a2 | ||
|
|
eb55761c38 | ||
|
|
16b57193f1 | ||
|
|
5bb7bf8947 | ||
|
|
2c9aa86bf0 | ||
|
|
d2b915f6c2 | ||
|
|
7920eff672 | ||
|
|
30415e6220 | ||
|
|
21db209f47 | ||
|
|
c3c79d3715 | ||
|
|
8c3229ec38 | ||
|
|
8c92cfb814 | ||
|
|
3eb866f5d2 | ||
|
|
3471c737b9 | ||
|
|
d164ccb6c7 | ||
|
|
ce98957be0 | ||
|
|
fe4a9bff2d | ||
|
|
024f3962b2 | ||
|
|
a55316aef9 | ||
|
|
08b955f8b6 | ||
|
|
9476fda987 | ||
|
|
b509d96f18 | ||
|
|
4827cd24d8 | ||
|
|
acca69a8a9 | ||
|
|
d171e781d2 | ||
|
|
99f0e31810 | ||
|
|
0aa8fc2fc2 | ||
|
|
98829b209a | ||
|
|
f3eb0df081 | ||
|
|
f83fb57d38 | ||
|
|
7d07631f12 | ||
|
|
8737e9824f | ||
|
|
ea472c844e | ||
|
|
a29e2582ed | ||
|
|
98477ef6c6 | ||
|
|
86be6aebff | ||
|
|
f9754bddf1 | ||
|
|
03390815af | ||
|
|
82ef6f8ac5 | ||
|
|
f7c1bc71d9 | ||
|
|
4b0d5815c0 | ||
|
|
5c07a968fe | ||
|
|
f4ac87af3a | ||
|
|
125965b559 | ||
|
|
43703b6f40 | ||
|
|
7cdae0f689 | ||
|
|
61ce2c95b3 | ||
|
|
08128748a7 | ||
|
|
c9fe7f6db6 | ||
|
|
a8cad28da7 | ||
|
|
c035af5409 | ||
|
|
eb951fdaf1 | ||
|
|
726ab7fc05 | ||
|
|
fb25c79b9c | ||
|
|
3c0f4278c7 | ||
|
|
59256cf8b3 | ||
|
|
844186d520 | ||
|
|
93b6d785f3 | ||
|
|
0e6e9c5238 | ||
|
|
de65ffb99d | ||
|
|
2d5472cf2a | ||
|
|
c3d908126f | ||
|
|
4c3b0abe7b | ||
|
|
8ca2884c1c | ||
|
|
d1d2ad6a5c | ||
|
|
21d31b5747 | ||
|
|
1ea208ba00 | ||
|
|
5fdf2d3416 | ||
|
|
5f5df97e59 | ||
|
|
cbd4d2f99a | ||
|
|
a1ac1876ad | ||
|
|
58841e85db | ||
|
|
46cd22ea7e | ||
|
|
cf8dad5763 | ||
|
|
8ea2949d84 | ||
|
|
e4af9ebc6f | ||
|
|
7a3af8de83 | ||
|
|
05c0a9256d | ||
|
|
c10b8cf55b | ||
|
|
4e837c2770 | ||
|
|
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 | ||
|
|
4c60a602b9 | ||
|
|
912cd220cc | ||
|
|
3b120c0372 | ||
|
|
2799d71e93 | ||
|
|
fcd7b42941 | ||
|
|
6fe2f83435 | ||
|
|
94c25b0ff4 | ||
|
|
ec38ec8004 | ||
|
|
1d9e55ca6e | ||
|
|
9b89afd6dc |
8
.gitattributes
vendored
@@ -1,5 +1,5 @@
|
|||||||
*.sh text eol=lf
|
*.sh text eol=lf
|
||||||
# Treat minified or packed JS/CSS files as binary, as they're not meant to be human-readable
|
# Treat compiled JS/CSS files as binary, as they're not meant to be human-readable
|
||||||
*.min.* binary
|
netbox/project-static/dist/*.css binary
|
||||||
*.map binary
|
netbox/project-static/dist/*.js binary
|
||||||
*.pack.js binary
|
netbox/project-static/dist/*.js.map binary
|
||||||
|
|||||||
14
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -13,11 +13,8 @@ body:
|
|||||||
- type: input
|
- type: input
|
||||||
attributes:
|
attributes:
|
||||||
label: NetBox version
|
label: NetBox version
|
||||||
description: >
|
description: What version of NetBox are you currently running?
|
||||||
What version of NetBox are you currently running? (If you don't have access to the most
|
placeholder: v3.1.0
|
||||||
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: v2.11.11
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
@@ -25,10 +22,9 @@ body:
|
|||||||
label: Python version
|
label: Python version
|
||||||
description: What version of Python are you currently running?
|
description: What version of Python are you currently running?
|
||||||
options:
|
options:
|
||||||
- 3.6
|
- "3.7"
|
||||||
- 3.7
|
- "3.8"
|
||||||
- 3.8
|
- "3.9"
|
||||||
- 3.9
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
|
|||||||
8
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
@@ -14,7 +14,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: NetBox version
|
label: NetBox version
|
||||||
description: What version of NetBox are you currently running?
|
description: What version of NetBox are you currently running?
|
||||||
placeholder: v2.11.11
|
placeholder: v3.1.0
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
@@ -30,8 +30,10 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Proposed functionality
|
label: Proposed functionality
|
||||||
description: >
|
description: >
|
||||||
Describe in detail the new feature or behavior you'd like to propose. Include any specific
|
Describe in detail the new feature or behavior you are proposing. Include any specific changes
|
||||||
changes to work flows, data models, or the user interface.
|
to work flows, data models, and/or the user interface. The more detail you provide here, the
|
||||||
|
greater chance your proposal has of being discussed. Feature requests which don't include an
|
||||||
|
actionable implementation plan will be rejected.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
|
|||||||
23
.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,33 @@ 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: Validate Static Asset Integrity
|
||||||
|
run: scripts/verify-bundles.sh
|
||||||
|
|
||||||
- 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/
|
||||||
|
|||||||
8
.gitignore
vendored
@@ -1,9 +1,13 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
*.swp
|
*.swp
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
/netbox/project-static/node_modules
|
||||||
|
/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/*
|
||||||
|
|||||||
@@ -76,14 +76,10 @@ free to add a comment with any additional justification for the feature.
|
|||||||
(However, note that comments with no substance other than a "+1" will be
|
(However, note that comments with no substance other than a "+1" will be
|
||||||
deleted. Please use GitHub's reactions feature to indicate your support.)
|
deleted. Please use GitHub's reactions feature to indicate your support.)
|
||||||
|
|
||||||
* Due to a large backlog of feature requests, we are not currently accepting
|
* Before filing a new feature request, consider raising your idea in a
|
||||||
any proposals which substantially extend NetBox's functionality beyond its
|
[GitHub discussion](https://github.com/netbox-community/netbox/discussions)
|
||||||
current feature set. This includes the introduction of any new views or models
|
first. Feedback you receive there will help validate and shape the proposed
|
||||||
which have not already been proposed in an existing feature request.
|
feature before filing a formal issue.
|
||||||
|
|
||||||
* Before filing a new feature request, consider raising your idea on the
|
|
||||||
mailing list first. Feedback you receive there will help validate and shape the
|
|
||||||
proposed feature before filing a formal issue.
|
|
||||||
|
|
||||||
* Good feature requests are very narrowly defined. Be sure to thoroughly
|
* Good feature requests are very narrowly defined. Be sure to thoroughly
|
||||||
describe the functionality and data model(s) being proposed. The more effort
|
describe the functionality and data model(s) being proposed. The more effort
|
||||||
|
|||||||
10
README.md
@@ -54,11 +54,15 @@ our [contributing guide](CONTRIBUTING.md) prior to beginning any work.
|
|||||||
|
|
||||||
### Screenshots
|
### Screenshots
|
||||||
|
|
||||||

|
")
|
||||||
|
|
||||||

|
")
|
||||||
|
|
||||||

|

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

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

|
||||||
|
|
||||||
### Related projects
|
### Related 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
|
||||||
@@ -78,10 +94,6 @@ Pillow
|
|||||||
# https://github.com/psycopg/psycopg2
|
# https://github.com/psycopg/psycopg2
|
||||||
psycopg2-binary
|
psycopg2-binary
|
||||||
|
|
||||||
# Extensive cryptographic library (fork of pycrypto)
|
|
||||||
# https://github.com/Legrandin/pycryptodome
|
|
||||||
pycryptodome
|
|
||||||
|
|
||||||
# YAML rendering library
|
# YAML rendering library
|
||||||
# https://github.com/yaml/pyyaml
|
# https://github.com/yaml/pyyaml
|
||||||
PyYAML
|
PyYAML
|
||||||
@@ -90,6 +102,14 @@ PyYAML
|
|||||||
# https://github.com/andymccurdy/redis-py
|
# https://github.com/andymccurdy/redis-py
|
||||||
redis
|
redis
|
||||||
|
|
||||||
|
# Social authentication framework
|
||||||
|
# https://github.com/python-social-auth/social-core
|
||||||
|
social-auth-core[all]
|
||||||
|
|
||||||
|
# Django app for social-auth-core
|
||||||
|
# https://github.com/python-social-auth/social-app-django
|
||||||
|
social-auth-app-django
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
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,28 +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.md#cache_timeout) parameter. Within that time, all recurrences of that specific query will return the pre-fetched results from the cache.
|
|
||||||
|
|
||||||
!!! warning
|
|
||||||
In NetBox v2.11.10 and later queryset caching is disabled by default, and must be configured.
|
|
||||||
|
|
||||||
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 by 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 @@
|
|||||||
# 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:
|
The NetBox UI will display tabs for status, LLDP neighbors, and configuration under the device view if the following conditions are met:
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ GET /api/dcim/devices/1/napalm/?method=get_environment
|
|||||||
|
|
||||||
## Authentication
|
## Authentication
|
||||||
|
|
||||||
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.
|
By default, the [`NAPALM_USERNAME`](../configuration/dynamic-settings.md#napalm_username) and [`NAPALM_PASSWORD`](../configuration/dynamic-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 environment 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,85 +1,4 @@
|
|||||||
# Webhooks
|
{!models/extras/webhook.md!}
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
!!! 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
|
|
||||||
|
|
||||||
* **Name** - A unique name for the webhook. The name is not included with outbound messages.
|
|
||||||
* **Object type(s)** - The type or types of NetBox object that will trigger the webhook.
|
|
||||||
* **Enabled** - If unchecked, the webhook will be inactive.
|
|
||||||
* **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected.
|
|
||||||
* **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`.
|
|
||||||
* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed.
|
|
||||||
* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`)
|
|
||||||
* **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below).
|
|
||||||
* **Body template** - The content of the request being sent (optional). Jinja2 templating is supported for this field (see below). If blank, NetBox will populate the request body with a raw dump of the webhook context. (If the HTTP cotent type is set to `application/json`, this will be formatted as a JSON object.)
|
|
||||||
* **Secret** - A secret string used to prove authenticity of the request (optional). This will append a `X-Hook-Signature` header to the request, consisting of a HMAC (SHA-512) hex digest of the request body using the secret as the key.
|
|
||||||
* **SSL verification** - Uncheck this option to disable validation of the receiver's SSL certificate. (Disable with caution!)
|
|
||||||
* **CA file path** - The file path to a particular certificate authority (CA) file to use when validating the receiver's SSL certificate (optional).
|
|
||||||
|
|
||||||
## Jinja2 Template Support
|
|
||||||
|
|
||||||
[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands.
|
|
||||||
|
|
||||||
For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration:
|
|
||||||
|
|
||||||
* Object type: IPAM > IP address
|
|
||||||
* HTTP method: `POST`
|
|
||||||
* URL: Slack incoming webhook URL
|
|
||||||
* HTTP content type: `application/json`
|
|
||||||
* Body template: `{"text": "IP address {{ data['address'] }} was created by {{ username }}!"}`
|
|
||||||
|
|
||||||
### Available Context
|
|
||||||
|
|
||||||
The following data is available as context for Jinja2 templates:
|
|
||||||
|
|
||||||
* `event` - The type of event which triggered the webhook: created, updated, or deleted.
|
|
||||||
* `model` - The NetBox model which triggered the change.
|
|
||||||
* `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.
|
|
||||||
* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request.
|
|
||||||
* `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
|
|
||||||
|
|
||||||
If no body template is specified, the request body will be populated with a JSON object containing the context data. For example, a newly created site might appear as follows:
|
|
||||||
|
|
||||||
```no-highlight
|
|
||||||
{
|
|
||||||
"event": "created",
|
|
||||||
"timestamp": "2021-03-09 17:55:33.968016+00:00",
|
|
||||||
"model": "site",
|
|
||||||
"username": "jstretch",
|
|
||||||
"request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a",
|
|
||||||
"data": {
|
|
||||||
"id": 19,
|
|
||||||
"name": "Site 1",
|
|
||||||
"slug": "site-1",
|
|
||||||
"status":
|
|
||||||
"value": "active",
|
|
||||||
"label": "Active",
|
|
||||||
"id": 1
|
|
||||||
},
|
|
||||||
"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
|
||||||
|
|
||||||
|
|||||||
37
docs/administration/authentication.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Authentication
|
||||||
|
|
||||||
|
## Local Authentication
|
||||||
|
|
||||||
|
Local user accounts and groups can be created in NetBox under the "Authentication and Authorization" section of the administrative user interface. This interface is available only to users with the "staff" permission enabled.
|
||||||
|
|
||||||
|
At a minimum, each user account must have a username and password set. User accounts may also denote a first name, last name, and email address. [Permissions](./permissions.md) may also be assigned to users and/or groups within the admin UI.
|
||||||
|
|
||||||
|
## Remote Authentication
|
||||||
|
|
||||||
|
NetBox may be configured to provide user authenticate via a remote backend in addition to local authentication. This is done by setting the `REMOTE_AUTH_BACKEND` configuration parameter to a suitable backend class. NetBox provides several options for remote authentication.
|
||||||
|
|
||||||
|
### LDAP Authentication
|
||||||
|
|
||||||
|
```python
|
||||||
|
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
|
||||||
|
```
|
||||||
|
|
||||||
|
NetBox includes an authentication backend which supports LDAP. See the [LDAP installation docs](../installation/6-ldap.md) for more detail about this backend.
|
||||||
|
|
||||||
|
### HTTP Header Authentication
|
||||||
|
|
||||||
|
```python
|
||||||
|
REMOTE_AUTH_BACKEND = 'netbox.authentication.RemoteUserBackend'
|
||||||
|
```
|
||||||
|
|
||||||
|
Another option for remote authentication in NetBox is to enable HTTP header-based user assignment. The front end HTTP server (e.g. nginx or Apache) performs client authentication as a process external to NetBox, and passes information about the authenticated user via HTTP headers. By default, the user is assigned via the `REMOTE_USER` header, but this can be customized via the `REMOTE_AUTH_HEADER` configuration parameter.
|
||||||
|
|
||||||
|
### Single Sign-On (SSO)
|
||||||
|
|
||||||
|
```python
|
||||||
|
REMOTE_AUTH_BACKEND = 'social_core.backends.google.GoogleOAuth2'
|
||||||
|
```
|
||||||
|
|
||||||
|
NetBox supports single sign-on authentication via the [python-social-auth](https://github.com/python-social-auth) library. To enable SSO, specify the path to the desired authentication backend within the `social_core` Python package. Please see the complete list of [supported authentication backends](https://github.com/python-social-auth/social-core/tree/master/social_core/backends) for the available options.
|
||||||
|
|
||||||
|
Most remote authentication backends require some additional configuration through settings prefixed with `SOCIAL_AUTH_`. These will be automatically imported from NetBox's `configuration.py` file. Additionally, the [authentication pipeline](https://python-social-auth.readthedocs.io/en/latest/pipeline.html) can be customized via the `SOCIAL_AUTH_PIPELINE` parameter.
|
||||||
17
docs/administration/housekeeping.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# 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 linked from your cron scheduler's daily jobs directory (e.g. `/etc/cron.daily`) or referenced directly within the cron configuration file.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
On Debian-based systems, be sure to omit the `.sh` file extension when linking to the script from within a cron directory. Otherwise, the task may not run.
|
||||||
|
|
||||||
|
The `housekeeping` command can also be run manually at any time: Running the command outside 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})
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Permissions
|
# Permissions
|
||||||
|
|
||||||
NetBox v2.9 introduced a new object-based permissions framework, which replace's Django's built-in permissions model. Object-based permissions enable an administrator to grant users or groups the ability to perform an action on arbitrary subsets of objects in NetBox, rather than all objects of a certain type. For example, it is possible to grant a user permission to view only sites within a particular region, or to modify only VLANs with a numeric ID within a certain range.
|
NetBox v2.9 introduced a new object-based permissions framework, which replaces Django's built-in permissions model. Object-based permissions enable an administrator to grant users or groups the ability to perform an action on arbitrary subsets of objects in NetBox, rather than all objects of a certain type. For example, it is possible to grant a user permission to view only sites within a particular region, or to modify only VLANs with a numeric ID within a certain range.
|
||||||
|
|
||||||
{!docs/models/users/objectpermission.md!}
|
{!models/users/objectpermission.md!}
|
||||||
|
|
||||||
### Example Constraint Definitions
|
### Example Constraint Definitions
|
||||||
|
|
||||||
|
|||||||
@@ -71,14 +71,3 @@ To extract the saved archive into a new installation, run the following from the
|
|||||||
```no-highlight
|
```no-highlight
|
||||||
tar -xf netbox_media.tar.gz
|
tar -xf netbox_media.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Cache Invalidation
|
|
||||||
|
|
||||||
If you are migrating your instance of NetBox to a different machine, be sure to first invalidate the cache on the original instance by issuing the `invalidate all` management command (within the Python virtual environment):
|
|
||||||
|
|
||||||
```no-highlight
|
|
||||||
# source /opt/netbox/venv/bin/activate
|
|
||||||
(venv) # python3 manage.py invalidate all
|
|
||||||
```
|
|
||||||
|
|||||||
180
docs/configuration/dynamic-settings.md
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
# Dynamic Configuration Settings
|
||||||
|
|
||||||
|
These configuration parameters are primarily controlled via NetBox's admin interface (under Admin > Extras > Configuration Revisions). These setting may also be overridden in `configuration.py`; this will prevent them from being modified via the UI.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ALLOWED_URL_SCHEMES
|
||||||
|
|
||||||
|
Default: `('file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp')`
|
||||||
|
|
||||||
|
A list of permitted URL schemes referenced when rendering links within NetBox. Note that only the schemes specified in this list will be accepted: If adding your own, be sure to replicate all of the default values as well (excluding those schemes which are not desirable).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## BANNER_TOP
|
||||||
|
|
||||||
|
## BANNER_BOTTOM
|
||||||
|
|
||||||
|
Setting these variables will display custom content in a banner at the top and/or bottom of the page, respectively. HTML is allowed. To replicate the content of the top banner in the bottom banner, set:
|
||||||
|
|
||||||
|
```python
|
||||||
|
BANNER_TOP = 'Your banner text'
|
||||||
|
BANNER_BOTTOM = BANNER_TOP
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## BANNER_LOGIN
|
||||||
|
|
||||||
|
This defines custom content to be displayed on the login page above the login form. HTML is allowed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CHANGELOG_RETENTION
|
||||||
|
|
||||||
|
Default: 90
|
||||||
|
|
||||||
|
The number of days to retain logged changes (object creations, updates, and deletions). Set this to `0` to retain
|
||||||
|
changes in the database indefinitely.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
If enabling indefinite changelog retention, it is recommended to periodically delete old entries. Otherwise, the database may eventually exceed capacity.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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": [
|
||||||
|
{
|
||||||
|
"name": {
|
||||||
|
"min_length": 5,
|
||||||
|
"max_length": 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"my_plugin.validators.Validator1"
|
||||||
|
],
|
||||||
|
"dim.device": [
|
||||||
|
"my_plugin.validators.Validator1"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ENFORCE_GLOBAL_UNIQUE
|
||||||
|
|
||||||
|
Default: False
|
||||||
|
|
||||||
|
By default, NetBox will permit users to create duplicate prefixes and IP addresses in the global table (that is, those which are not assigned to any VRF). This behavior can be disabled by setting `ENFORCE_GLOBAL_UNIQUE` to True.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## GRAPHQL_ENABLED
|
||||||
|
|
||||||
|
Default: True
|
||||||
|
|
||||||
|
Setting this to False will disable the GraphQL API.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## MAINTENANCE_MODE
|
||||||
|
|
||||||
|
Default: False
|
||||||
|
|
||||||
|
Setting this to True will display a "maintenance mode" banner at the top of every page. Additionally, NetBox will no longer update a user's "last active" time upon login. This is to allow new logins when the database is in a read-only state. Recording of login times will resume when maintenance mode is disabled.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
Default: 1000
|
||||||
|
|
||||||
|
A web user or API consumer can request an arbitrary number of objects by appending the "limit" parameter to the URL (e.g. `?limit=1000`). This parameter defines the maximum acceptable limit. Setting this to `0` or `None` will allow a client to retrieve _all_ matching objects at once with no limit by specifying `?limit=0`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NAPALM_USERNAME
|
||||||
|
|
||||||
|
## NAPALM_PASSWORD
|
||||||
|
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NAPALM_ARGS
|
||||||
|
|
||||||
|
A dictionary of optional arguments to pass to NAPALM when instantiating a network driver. See the NAPALM documentation for a [complete list of optional arguments](https://napalm.readthedocs.io/en/latest/support/#optional-arguments). An example:
|
||||||
|
|
||||||
|
```python
|
||||||
|
NAPALM_ARGS = {
|
||||||
|
'api_key': '472071a93b60a1bd1fafb401d9f8ef41',
|
||||||
|
'port': 2222,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Some platforms (e.g. Cisco IOS) require an argument named `secret` to be passed in addition to the normal password. If desired, you can use the configured `NAPALM_PASSWORD` as the value for this argument:
|
||||||
|
|
||||||
|
```python
|
||||||
|
NAPALM_USERNAME = 'username'
|
||||||
|
NAPALM_PASSWORD = 'MySecretPassword'
|
||||||
|
NAPALM_ARGS = {
|
||||||
|
'secret': NAPALM_PASSWORD,
|
||||||
|
# Include any additional args here
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NAPALM_TIMEOUT
|
||||||
|
|
||||||
|
Default: 30 seconds
|
||||||
|
|
||||||
|
The amount of time (in seconds) to wait for NAPALM to connect to a device.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PAGINATE_COUNT
|
||||||
|
|
||||||
|
Default: 50
|
||||||
|
|
||||||
|
The default maximum number of objects to display per page within each list of objects.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PREFER_IPV4
|
||||||
|
|
||||||
|
Default: False
|
||||||
|
|
||||||
|
When determining the primary IP address for a device, IPv6 is preferred over IPv4 by default. Set this to True to prefer IPv4 instead.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## RACK_ELEVATION_DEFAULT_UNIT_HEIGHT
|
||||||
|
|
||||||
|
Default: 22
|
||||||
|
|
||||||
|
Default height (in pixels) of a unit within a rack elevation. For best results, this should be approximately one tenth of `RACK_ELEVATION_DEFAULT_UNIT_WIDTH`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## RACK_ELEVATION_DEFAULT_UNIT_WIDTH
|
||||||
|
|
||||||
|
Default: 220
|
||||||
|
|
||||||
|
Default width (in pixels) of a unit within a rack elevation.
|
||||||
@@ -1,18 +1,22 @@
|
|||||||
# NetBox Configuration
|
# NetBox Configuration
|
||||||
|
|
||||||
NetBox's local configuration is stored in `$INSTALL_ROOT/netbox/netbox/configuration.py`. An example configuration is provided as `configuration.example.py`. You may copy or rename the example configuration and make changes as appropriate. NetBox will not run without a configuration file.
|
NetBox's local configuration is stored in `$INSTALL_ROOT/netbox/netbox/configuration.py`. An example configuration is provided as `configuration.example.py`. You may copy or rename the example configuration and make changes as appropriate. NetBox will not run without a configuration file. While NetBox has many configuration settings, only a few of them must be defined at the time of installation: these are defined under "required settings" below.
|
||||||
|
|
||||||
While NetBox has many configuration settings, only a few of them must be defined at the time of installation.
|
Some configuration parameters may alternatively be defined either in `configuration.py` or within the administrative section of the user interface. Settings which are "hard-coded" in the configuration file take precedence over those defined via the UI.
|
||||||
|
|
||||||
## Configuration Parameters
|
## Configuration Parameters
|
||||||
|
|
||||||
* [Required settings](required-settings.md)
|
* [Required settings](required-settings.md)
|
||||||
* [Optional settings](optional-settings.md)
|
* [Optional settings](optional-settings.md)
|
||||||
|
* [Dynamic settings](dynamic-settings.md)
|
||||||
|
* [Remote authentication settings](remote-authentication.md)
|
||||||
|
|
||||||
## Changing the Configuration
|
## Changing the Configuration
|
||||||
|
|
||||||
Configuration settings may be changed at any time. However, the WSGI service (e.g. Gunicorn) must be restarted before the changes will take effect:
|
The configuration file may be modified at any time. However, the WSGI service (e.g. Gunicorn) must be restarted before the changes will take effect:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ sudo systemctl restart netbox
|
$ sudo systemctl restart netbox
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Configuration parameters which are set via the admin UI (those listed under "dynamic settings") take effect immediately.
|
||||||
|
|||||||
@@ -13,33 +13,6 @@ ADMINS = [
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ALLOWED_URL_SCHEMES
|
|
||||||
|
|
||||||
Default: `('file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp')`
|
|
||||||
|
|
||||||
A list of permitted URL schemes referenced when rendering links within NetBox. Note that only the schemes specified in this list will be accepted: If adding your own, be sure to replicate all of the default values as well (excluding those schemes which are not desirable).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## BANNER_TOP
|
|
||||||
|
|
||||||
## BANNER_BOTTOM
|
|
||||||
|
|
||||||
Setting these variables will display custom content in a banner at the top and/or bottom of the page, respectively. HTML is allowed. To replicate the content of the top banner in the bottom banner, set:
|
|
||||||
|
|
||||||
```python
|
|
||||||
BANNER_TOP = 'Your banner text'
|
|
||||||
BANNER_BOTTOM = BANNER_TOP
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## BANNER_LOGIN
|
|
||||||
|
|
||||||
This defines custom content to be displayed on the login page above the login form. HTML is allowed.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## BASE_PATH
|
## BASE_PATH
|
||||||
|
|
||||||
Default: None
|
Default: None
|
||||||
@@ -52,26 +25,6 @@ BASE_PATH = 'netbox/'
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CACHE_TIMEOUT
|
|
||||||
|
|
||||||
Default: 0 (disabled)
|
|
||||||
|
|
||||||
The number of seconds that cached database queries will be retained before expiring.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## CHANGELOG_RETENTION
|
|
||||||
|
|
||||||
Default: 90
|
|
||||||
|
|
||||||
The number of days to retain logged changes (object creations, updates, and deletions). Set this to `0` to retain
|
|
||||||
changes in the database indefinitely.
|
|
||||||
|
|
||||||
!!! warning
|
|
||||||
If enabling indefinite changelog retention, it is recommended to periodically delete old entries. Otherwise, the database may eventually exceed capacity.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## CORS_ORIGIN_ALLOW_ALL
|
## CORS_ORIGIN_ALLOW_ALL
|
||||||
|
|
||||||
Default: False
|
Default: False
|
||||||
@@ -144,7 +97,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
|
||||||
@@ -160,14 +113,6 @@ Email is sent from NetBox only for critical events or if configured for [logging
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ENFORCE_GLOBAL_UNIQUE
|
|
||||||
|
|
||||||
Default: False
|
|
||||||
|
|
||||||
By default, NetBox will permit users to create duplicate prefixes and IP addresses in the global table (that is, those which are not assigned to any VRF). This behavior can be disabled by setting `ENFORCE_GLOBAL_UNIQUE` to True.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## EXEMPT_VIEW_PERMISSIONS
|
## EXEMPT_VIEW_PERMISSIONS
|
||||||
|
|
||||||
Default: Empty list
|
Default: Empty list
|
||||||
@@ -257,11 +202,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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -273,30 +228,6 @@ The lifetime (in seconds) of the authentication cookie issued to a NetBox user u
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## MAINTENANCE_MODE
|
|
||||||
|
|
||||||
Default: False
|
|
||||||
|
|
||||||
Setting this to True will display a "maintenance mode" banner at the top of every page. Additionally, NetBox will no longer update a user's "last active" time upon login. This is to allow new logins when the database is in a read-only state. Recording of login times will resume when maintenance mode is disabled.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 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
|
|
||||||
|
|
||||||
Default: 1000
|
|
||||||
|
|
||||||
A web user or API consumer can request an arbitrary number of objects by appending the "limit" parameter to the URL (e.g. `?limit=1000`). This parameter defines the maximum acceptable limit. Setting this to `0` or `None` will allow a client to retrieve _all_ matching objects at once with no limit by specifying `?limit=0`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## MEDIA_ROOT
|
## MEDIA_ROOT
|
||||||
|
|
||||||
Default: $INSTALL_ROOT/netbox/media/
|
Default: $INSTALL_ROOT/netbox/media/
|
||||||
@@ -313,57 +244,6 @@ Toggle the availability Prometheus-compatible metrics at `/metrics`. See the [Pr
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## NAPALM_USERNAME
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
||||||
!!! 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.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## NAPALM_ARGS
|
|
||||||
|
|
||||||
A dictionary of optional arguments to pass to NAPALM when instantiating a network driver. See the NAPALM documentation for a [complete list of optional arguments](https://napalm.readthedocs.io/en/latest/support/#optional-arguments). An example:
|
|
||||||
|
|
||||||
```python
|
|
||||||
NAPALM_ARGS = {
|
|
||||||
'api_key': '472071a93b60a1bd1fafb401d9f8ef41',
|
|
||||||
'port': 2222,
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Some platforms (e.g. Cisco IOS) require an argument named `secret` to be passed in addition to the normal password. If desired, you can use the configured `NAPALM_PASSWORD` as the value for this argument:
|
|
||||||
|
|
||||||
```python
|
|
||||||
NAPALM_USERNAME = 'username'
|
|
||||||
NAPALM_PASSWORD = 'MySecretPassword'
|
|
||||||
NAPALM_ARGS = {
|
|
||||||
'secret': NAPALM_PASSWORD,
|
|
||||||
# Include any additional args here
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## NAPALM_TIMEOUT
|
|
||||||
|
|
||||||
Default: 30 seconds
|
|
||||||
|
|
||||||
The amount of time (in seconds) to wait for NAPALM to connect to a device.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## PAGINATE_COUNT
|
|
||||||
|
|
||||||
Default: 50
|
|
||||||
|
|
||||||
The default maximum number of objects to display per page within each list of objects.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## PLUGINS
|
## PLUGINS
|
||||||
|
|
||||||
Default: Empty
|
Default: Empty
|
||||||
@@ -397,94 +277,11 @@ Note that a plugin must be listed in `PLUGINS` for its configuration to take eff
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## PREFER_IPV4
|
|
||||||
|
|
||||||
Default: False
|
|
||||||
|
|
||||||
When determining the primary IP address for a device, IPv6 is preferred over IPv4 by default. Set this to True to prefer IPv4 instead.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## RACK_ELEVATION_DEFAULT_UNIT_HEIGHT
|
|
||||||
|
|
||||||
Default: 22
|
|
||||||
|
|
||||||
Default height (in pixels) of a unit within a rack elevation. For best results, this should be approximately one tenth of `RACK_ELEVATION_DEFAULT_UNIT_WIDTH`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## RACK_ELEVATION_DEFAULT_UNIT_WIDTH
|
|
||||||
|
|
||||||
Default: 220
|
|
||||||
|
|
||||||
Default width (in pixels) of a unit within a rack elevation.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## REMOTE_AUTH_AUTO_CREATE_USER
|
|
||||||
|
|
||||||
Default: `False`
|
|
||||||
|
|
||||||
If true, NetBox will automatically create local accounts for users authenticated via a remote service. (Requires `REMOTE_AUTH_ENABLED`.)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## REMOTE_AUTH_BACKEND
|
|
||||||
|
|
||||||
Default: `'netbox.authentication.RemoteUserBackend'`
|
|
||||||
|
|
||||||
This is the Python path to the custom [Django authentication backend](https://docs.djangoproject.com/en/stable/topics/auth/customizing/) to use for external user authentication. NetBox provides two built-in backends (listed below), though custom authentication backends may also be provided by other packages or plugins.
|
|
||||||
|
|
||||||
* `netbox.authentication.RemoteUserBackend`
|
|
||||||
* `netbox.authentication.LDAPBackend`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## REMOTE_AUTH_DEFAULT_GROUPS
|
|
||||||
|
|
||||||
Default: `[]` (Empty list)
|
|
||||||
|
|
||||||
The list of groups to assign a new user account when created using remote authentication. (Requires `REMOTE_AUTH_ENABLED`.)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## REMOTE_AUTH_DEFAULT_PERMISSIONS
|
|
||||||
|
|
||||||
Default: `{}` (Empty dictionary)
|
|
||||||
|
|
||||||
A mapping of permissions to assign a new user account when created using remote authentication. Each key in the dictionary should be set to a dictionary of the attributes to be applied to the permission, or `None` to allow all objects. (Requires `REMOTE_AUTH_ENABLED`.)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## REMOTE_AUTH_ENABLED
|
|
||||||
|
|
||||||
Default: `False`
|
|
||||||
|
|
||||||
NetBox can be configured to support remote user authentication by inferring user authentication from an HTTP header set by the HTTP reverse proxy (e.g. nginx or Apache). Set this to `True` to enable this functionality. (Local authentication will still take effect as a fallback.)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## REMOTE_AUTH_HEADER
|
|
||||||
|
|
||||||
Default: `'HTTP_REMOTE_USER'`
|
|
||||||
|
|
||||||
When remote user authentication is in use, this is the name of the HTTP header which informs NetBox of the currently authenticated user. For example, to use the request header `X-Remote-User` it needs to be set to `HTTP_X_REMOTE_USER`. (Requires `REMOTE_AUTH_ENABLED`.)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 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).
|
||||||
@@ -495,7 +292,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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -511,7 +308,7 @@ 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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
110
docs/configuration/remote-authentication.md
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
# Remote Authentication Settings
|
||||||
|
|
||||||
|
The configuration parameters listed here control remote authentication for NetBox. Note that `REMOTE_AUTH_ENABLED` must be true in order for these settings to take effect.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_AUTO_CREATE_USER
|
||||||
|
|
||||||
|
Default: `False`
|
||||||
|
|
||||||
|
If true, NetBox will automatically create local accounts for users authenticated via a remote service. (Requires `REMOTE_AUTH_ENABLED`.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_BACKEND
|
||||||
|
|
||||||
|
Default: `'netbox.authentication.RemoteUserBackend'`
|
||||||
|
|
||||||
|
This is the Python path to the custom [Django authentication backend](https://docs.djangoproject.com/en/stable/topics/auth/customizing/) to use for external user authentication. NetBox provides two built-in backends (listed below), though custom authentication backends may also be provided by other packages or plugins.
|
||||||
|
|
||||||
|
* `netbox.authentication.RemoteUserBackend`
|
||||||
|
* `netbox.authentication.LDAPBackend`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_DEFAULT_GROUPS
|
||||||
|
|
||||||
|
Default: `[]` (Empty list)
|
||||||
|
|
||||||
|
The list of groups to assign a new user account when created using remote authentication. (Requires `REMOTE_AUTH_ENABLED`.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_DEFAULT_PERMISSIONS
|
||||||
|
|
||||||
|
Default: `{}` (Empty dictionary)
|
||||||
|
|
||||||
|
A mapping of permissions to assign a new user account when created using remote authentication. Each key in the dictionary should be set to a dictionary of the attributes to be applied to the permission, or `None` to allow all objects. (Requires `REMOTE_AUTH_ENABLED`.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_ENABLED
|
||||||
|
|
||||||
|
Default: `False`
|
||||||
|
|
||||||
|
NetBox can be configured to support remote user authentication by inferring user authentication from an HTTP header set by the HTTP reverse proxy (e.g. nginx or Apache). Set this to `True` to enable this functionality. (Local authentication will still take effect as a fallback.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_GROUP_SYNC_ENABLED
|
||||||
|
|
||||||
|
Default: `False`
|
||||||
|
|
||||||
|
NetBox can be configured to sync remote user groups by inferring user authentication from an HTTP header set by the HTTP reverse proxy (e.g. nginx or Apache). Set this to `True` to enable this functionality. (Local authentication will still take effect as a fallback.) (Requires `REMOTE_AUTH_ENABLED`.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_HEADER
|
||||||
|
|
||||||
|
Default: `'HTTP_REMOTE_USER'`
|
||||||
|
|
||||||
|
When remote user authentication is in use, this is the name of the HTTP header which informs NetBox of the currently authenticated user. For example, to use the request header `X-Remote-User` it needs to be set to `HTTP_X_REMOTE_USER`. (Requires `REMOTE_AUTH_ENABLED`.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_GROUP_HEADER
|
||||||
|
|
||||||
|
Default: `'HTTP_REMOTE_USER_GROUP'`
|
||||||
|
|
||||||
|
When remote user authentication is in use, this is the name of the HTTP header which informs NetBox of the currently authenticated user. For example, to use the request header `X-Remote-User-Groups` it needs to be set to `HTTP_X_REMOTE_USER_GROUPS`. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_SUPERUSER_GROUPS
|
||||||
|
|
||||||
|
Default: `[]` (Empty list)
|
||||||
|
|
||||||
|
The list of groups that promote an remote User to Superuser on Login. If group isn't present on next Login, the Role gets revoked. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_SUPERUSERS
|
||||||
|
|
||||||
|
Default: `[]` (Empty list)
|
||||||
|
|
||||||
|
The list of users that get promoted to Superuser on Login. If user isn't present in list on next Login, the Role gets revoked. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_STAFF_GROUPS
|
||||||
|
|
||||||
|
Default: `[]` (Empty list)
|
||||||
|
|
||||||
|
The list of groups that promote an remote User to Staff on Login. If group isn't present on next Login, the Role gets revoked. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_STAFF_USERS
|
||||||
|
|
||||||
|
Default: `[]` (Empty list)
|
||||||
|
|
||||||
|
The list of users that get promoted to Staff on Login. If user isn't present in list on next Login, the Role gets revoked. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## REMOTE_AUTH_GROUP_SEPARATOR
|
||||||
|
|
||||||
|
Default: `|` (Pipe)
|
||||||
|
|
||||||
|
The Seperator upon which `REMOTE_AUTH_GROUP_HEADER` gets split into individual Groups. This needs to be coordinated with your authentication Proxy. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` )
|
||||||
@@ -25,7 +25,7 @@ ALLOWED_HOSTS = ['*']
|
|||||||
|
|
||||||
## DATABASE
|
## DATABASE
|
||||||
|
|
||||||
NetBox requires access to a PostgreSQL 9.6 or later database service to store data. This service can run locally on the NetBox server or on a remote system. The following parameters must be defined within the `DATABASE` dictionary:
|
NetBox requires access to a PostgreSQL 10 or later database service to store data. This service can run locally on the NetBox server or on a remote system. The following parameters must be defined within the `DATABASE` dictionary:
|
||||||
|
|
||||||
* `NAME` - Database name
|
* `NAME` - Database name
|
||||||
* `USER` - PostgreSQL username
|
* `USER` - PostgreSQL username
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# Circuits
|
# Circuits
|
||||||
|
|
||||||
{!docs/models/circuits/provider.md!}
|
{!models/circuits/provider.md!}
|
||||||
{!docs/models/circuits/providernetwork.md!}
|
{!models/circuits/providernetwork.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/circuits/circuit.md!}
|
{!models/circuits/circuit.md!}
|
||||||
{!docs/models/circuits/circuittype.md!}
|
{!models/circuits/circuittype.md!}
|
||||||
{!docs/models/circuits/circuittermination.md!}
|
{!models/circuits/circuittermination.md!}
|
||||||
|
|||||||
5
docs/core-functionality/contacts.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Contacts
|
||||||
|
|
||||||
|
{!models/tenancy/contact.md!}
|
||||||
|
{!models/tenancy/contactgroup.md!}
|
||||||
|
{!models/tenancy/contactrole.md!}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Device Types
|
# Device Types
|
||||||
|
|
||||||
{!docs/models/dcim/devicetype.md!}
|
{!models/dcim/devicetype.md!}
|
||||||
{!docs/models/dcim/manufacturer.md!}
|
{!models/dcim/manufacturer.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -30,11 +30,11 @@ Once component templates have been created, every new device that you create as
|
|||||||
!!! note
|
!!! note
|
||||||
Assignment of components from templates occurs only at the time of device creation. If you modify the templates of a device type, it will not affect devices which have already been created. However, you always have the option of adding, modifying, or deleting components on existing devices.
|
Assignment of components from templates occurs only at the time of device creation. If you modify the templates of a device type, it will not affect devices which have already been created. However, you always have the option of adding, modifying, or deleting components on existing devices.
|
||||||
|
|
||||||
{!docs/models/dcim/consoleporttemplate.md!}
|
{!models/dcim/consoleporttemplate.md!}
|
||||||
{!docs/models/dcim/consoleserverporttemplate.md!}
|
{!models/dcim/consoleserverporttemplate.md!}
|
||||||
{!docs/models/dcim/powerporttemplate.md!}
|
{!models/dcim/powerporttemplate.md!}
|
||||||
{!docs/models/dcim/poweroutlettemplate.md!}
|
{!models/dcim/poweroutlettemplate.md!}
|
||||||
{!docs/models/dcim/interfacetemplate.md!}
|
{!models/dcim/interfacetemplate.md!}
|
||||||
{!docs/models/dcim/frontporttemplate.md!}
|
{!models/dcim/frontporttemplate.md!}
|
||||||
{!docs/models/dcim/rearporttemplate.md!}
|
{!models/dcim/rearporttemplate.md!}
|
||||||
{!docs/models/dcim/devicebaytemplate.md!}
|
{!models/dcim/devicebaytemplate.md!}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Devices and Cabling
|
# Devices and Cabling
|
||||||
|
|
||||||
{!docs/models/dcim/device.md!}
|
{!models/dcim/device.md!}
|
||||||
{!docs/models/dcim/devicerole.md!}
|
{!models/dcim/devicerole.md!}
|
||||||
{!docs/models/dcim/platform.md!}
|
{!models/dcim/platform.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -10,20 +10,30 @@
|
|||||||
|
|
||||||
Device components represent discrete objects within a device which are used to terminate cables, house child devices, or track resources.
|
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!}
|
{!models/dcim/consoleport.md!}
|
||||||
{!docs/models/dcim/consoleserverport.md!}
|
{!models/dcim/consoleserverport.md!}
|
||||||
{!docs/models/dcim/powerport.md!}
|
{!models/dcim/powerport.md!}
|
||||||
{!docs/models/dcim/poweroutlet.md!}
|
{!models/dcim/poweroutlet.md!}
|
||||||
{!docs/models/dcim/interface.md!}
|
{!models/dcim/interface.md!}
|
||||||
{!docs/models/dcim/frontport.md!}
|
{!models/dcim/frontport.md!}
|
||||||
{!docs/models/dcim/rearport.md!}
|
{!models/dcim/rearport.md!}
|
||||||
{!docs/models/dcim/devicebay.md!}
|
{!models/dcim/devicebay.md!}
|
||||||
{!docs/models/dcim/inventoryitem.md!}
|
{!models/dcim/inventoryitem.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/dcim/virtualchassis.md!}
|
{!models/dcim/virtualchassis.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/dcim/cable.md!}
|
{!models/dcim/cable.md!}
|
||||||
|
|
||||||
|
In the example below, three individual cables comprise a path between devices A and D:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Traced from Interface 1 on Device A, NetBox will show the following path:
|
||||||
|
|
||||||
|
* Cable 1: Interface 1 to Front Port 1
|
||||||
|
* Cable 2: Rear Port 1 to Rear Port 2
|
||||||
|
* Cable 3: Front Port 2 to Interface 2
|
||||||
|
|||||||
@@ -1,18 +1,27 @@
|
|||||||
# IP Address Management
|
# IP Address Management
|
||||||
|
|
||||||
{!docs/models/ipam/aggregate.md!}
|
{!models/ipam/aggregate.md!}
|
||||||
{!docs/models/ipam/rir.md!}
|
{!models/ipam/rir.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/ipam/prefix.md!}
|
{!models/ipam/prefix.md!}
|
||||||
{!docs/models/ipam/role.md!}
|
{!models/ipam/role.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/ipam/ipaddress.md!}
|
{!models/ipam/iprange.md!}
|
||||||
|
{!models/ipam/ipaddress.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/ipam/vrf.md!}
|
{!models/ipam/vrf.md!}
|
||||||
{!docs/models/ipam/routetarget.md!}
|
{!models/ipam/routetarget.md!}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{!models/ipam/fhrpgroup.md!}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{!models/ipam/asn.md!}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Power Tracking
|
# Power Tracking
|
||||||
|
|
||||||
{!docs/models/dcim/powerpanel.md!}
|
{!models/dcim/powerpanel.md!}
|
||||||
{!docs/models/dcim/powerfeed.md!}
|
{!models/dcim/powerfeed.md!}
|
||||||
|
|
||||||
# Example Power Topology
|
# Example Power Topology
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
# Secrets
|
|
||||||
|
|
||||||
{!docs/models/secrets/secret.md!}
|
|
||||||
{!docs/models/secrets/secretrole.md!}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
{!docs/models/secrets/userkey.md!}
|
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
# Service Mapping
|
# Service Mapping
|
||||||
|
|
||||||
{!docs/models/ipam/service.md!}
|
{!models/ipam/service.md!}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
# Sites and Racks
|
# Sites and Racks
|
||||||
|
|
||||||
{!docs/models/dcim/region.md!}
|
{!models/dcim/region.md!}
|
||||||
{!docs/models/dcim/sitegroup.md!}
|
{!models/dcim/sitegroup.md!}
|
||||||
{!docs/models/dcim/site.md!}
|
{!models/dcim/site.md!}
|
||||||
{!docs/models/dcim/location.md!}
|
{!models/dcim/location.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/dcim/rack.md!}
|
{!models/dcim/rack.md!}
|
||||||
{!docs/models/dcim/rackrole.md!}
|
{!models/dcim/rackrole.md!}
|
||||||
{!docs/models/dcim/rackreservation.md!}
|
{!models/dcim/rackreservation.md!}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Tenancy Assignment
|
# Tenancy Assignment
|
||||||
|
|
||||||
{!docs/models/tenancy/tenant.md!}
|
{!models/tenancy/tenant.md!}
|
||||||
{!docs/models/tenancy/tenantgroup.md!}
|
{!models/tenancy/tenantgroup.md!}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# Virtualization
|
# Virtualization
|
||||||
|
|
||||||
{!docs/models/virtualization/cluster.md!}
|
{!models/virtualization/cluster.md!}
|
||||||
{!docs/models/virtualization/clustertype.md!}
|
{!models/virtualization/clustertype.md!}
|
||||||
{!docs/models/virtualization/clustergroup.md!}
|
{!models/virtualization/clustergroup.md!}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{!docs/models/virtualization/virtualmachine.md!}
|
{!models/virtualization/virtualmachine.md!}
|
||||||
{!docs/models/virtualization/vminterface.md!}
|
{!models/virtualization/vminterface.md!}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# VLAN Management
|
# VLAN Management
|
||||||
|
|
||||||
{!docs/models/ipam/vlan.md!}
|
{!models/ipam/vlan.md!}
|
||||||
{!docs/models/ipam/vlangroup.md!}
|
{!models/ipam/vlangroup.md!}
|
||||||
|
|||||||
8
docs/core-functionality/wireless.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Wireless Networks
|
||||||
|
|
||||||
|
{!models/wireless/wirelesslan.md!}
|
||||||
|
{!models/wireless/wirelesslangroup.md!}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{!models/wireless/wirelesslink.md!}
|
||||||
36
docs/customization/custom-fields.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{!models/extras/customfield.md!}
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
When retrieving an object via the REST API, all of its custom data will be included within the `custom_fields` attribute. For example, below is the partial output of a site with two custom fields defined:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"url": "http://localhost:8000/api/dcim/sites/123/",
|
||||||
|
"name": "Raleigh 42",
|
||||||
|
...
|
||||||
|
"custom_fields": {
|
||||||
|
"deployed": "2018-06-19",
|
||||||
|
"site_code": "US-NC-RAL42"
|
||||||
|
},
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
To set or change these values, simply include nested JSON data. For example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "New Site",
|
||||||
|
"slug": "new-site",
|
||||||
|
"custom_fields": {
|
||||||
|
"deployed": "2019-03-24"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -45,6 +45,20 @@ Defining script variables is optional: You may create a script with only a `run(
|
|||||||
|
|
||||||
Any output generated by the script during its execution will be displayed under the "output" tab in the UI.
|
Any output generated by the script during its execution will be displayed under the "output" tab in the UI.
|
||||||
|
|
||||||
|
By default, scripts within a module are ordered alphabetically in the scripts list page. To return scripts in a specific order, you can define the `script_order` variable at the end of your module. The `script_order` variable is a tuple which contains each Script class in the desired order. Any scripts that are omitted from this list will be listed last.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from extras.scripts import Script
|
||||||
|
|
||||||
|
class MyCustomScript(Script):
|
||||||
|
...
|
||||||
|
|
||||||
|
class AnotherCustomScript(Script):
|
||||||
|
...
|
||||||
|
|
||||||
|
script_order = (MyCustomScript, AnotherCustomScript)
|
||||||
|
```
|
||||||
|
|
||||||
## Module Attributes
|
## Module Attributes
|
||||||
|
|
||||||
### `name`
|
### `name`
|
||||||
@@ -170,14 +184,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: `'display'`)
|
|
||||||
* `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)
|
||||||
|
|
||||||
!!! warning
|
|
||||||
The `display_field` parameter is now deprecated, and will be removed in NetBox v3.0. All ObjectVar instances will
|
|
||||||
instead use the new standard `display` field for all serializers (introduced in NetBox v2.11).
|
|
||||||
|
|
||||||
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
|
||||||
@@ -231,7 +240,7 @@ An IPv4 or IPv6 network with a mask. Returns a `netaddr.IPNetwork` object. Two a
|
|||||||
!!! note
|
!!! note
|
||||||
To run a custom script, a user must be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below.
|
To run a custom script, a user must be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Via the Web UI
|
### Via the Web UI
|
||||||
|
|
||||||
@@ -250,6 +259,22 @@ http://netbox/api/extras/scripts/example.MyReport/ \
|
|||||||
--data '{"data": {"foo": "somevalue", "bar": 123}, "commit": true}'
|
--data '{"data": {"foo": "somevalue", "bar": 123}, "commit": true}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Via the CLI
|
||||||
|
|
||||||
|
Scripts can be run on the CLI by invoking the management command:
|
||||||
|
|
||||||
|
```
|
||||||
|
python3 manage.py runscript [--commit] [--loglevel {debug,info,warning,error,critical}] [--data "<data>"] <module>.<script>
|
||||||
|
```
|
||||||
|
|
||||||
|
The required ``<module>.<script>`` argument is the script to run where ``<module>`` is the name of the python file in the ``scripts`` directory without the ``.py`` extension and ``<script>`` is the name of the script class in the ``<module>`` to run.
|
||||||
|
|
||||||
|
The optional ``--data "<data>"`` argument is the data to send to the script
|
||||||
|
|
||||||
|
The optional ``--loglevel`` argument is the desired logging level to output to the console.
|
||||||
|
|
||||||
|
The optional ``--commit`` argument will commit any changes in the script to the database.
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
Below is an example script that creates new objects for a planned site. The user is prompted for three variables:
|
Below is an example script that creates new objects for a planned site. The user is prompted for three variables:
|
||||||
@@ -288,7 +313,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'
|
||||||
}
|
}
|
||||||
118
docs/customization/custom-validation.md
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
# 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 custom validation rules.
|
||||||
|
|
||||||
|
## Custom Validation Rules
|
||||||
|
|
||||||
|
Custom validation rules are expressed as a mapping of model attributes to a set of rules to which that attribute must conform. For example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"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. NetBox provides a `CustomValidator` class which 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. There are three manners by which custom validation rules can be defined:
|
||||||
|
|
||||||
|
1. Plain JSON mapping (no custom logic)
|
||||||
|
2. Dotted path to a custom validator class
|
||||||
|
3. Direct reference to a custom validator class
|
||||||
|
|
||||||
|
### Plain Data
|
||||||
|
|
||||||
|
For cases where custom logic is not needed, it is sufficient to pass validation rules as plain JSON-compatible objects. This approach typically affords the most portability for your configuration. For instance:
|
||||||
|
|
||||||
|
```python
|
||||||
|
CUSTOM_VALIDATORS = {
|
||||||
|
"dcim.site": [
|
||||||
|
{
|
||||||
|
"name": {
|
||||||
|
"min_length": 5,
|
||||||
|
"max_length": 30,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dcim.device": [
|
||||||
|
{
|
||||||
|
"platform": {
|
||||||
|
"required": True,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dotted Path
|
||||||
|
|
||||||
|
In instances where a custom validator class is needed, it can be referenced by its Python path (relative to NetBox's working directory):
|
||||||
|
|
||||||
|
```python
|
||||||
|
CUSTOM_VALIDATORS = {
|
||||||
|
'dcim.site': (
|
||||||
|
'my_validators.Validator1',
|
||||||
|
'my_validators.Validator2',
|
||||||
|
),
|
||||||
|
'dcim.device': (
|
||||||
|
'my_validators.Validator3',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Direct Class Reference
|
||||||
|
|
||||||
|
This approach requires each class being instantiated to be imported directly within the Python configuration file.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from my_validators import Validator1, Validator2, Validator3
|
||||||
|
|
||||||
|
CUSTOM_VALIDATORS = {
|
||||||
|
'dcim.site': (
|
||||||
|
Validator1,
|
||||||
|
Validator2,
|
||||||
|
),
|
||||||
|
'dcim.device': (
|
||||||
|
Validator3,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Even if defining only a single validator, it must be passed as an iterable.
|
||||||
44
docs/customization/export-templates.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{!models/extras/exporttemplate.md!}
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
Here's an example device export template that will generate a simple Nagios configuration from a list of devices.
|
||||||
|
|
||||||
|
```
|
||||||
|
{% for device in queryset %}{% if device.status and device.primary_ip %}define host{
|
||||||
|
use generic-switch
|
||||||
|
host_name {{ device.name }}
|
||||||
|
address {{ device.primary_ip.address.ip }}
|
||||||
|
}
|
||||||
|
{% endif %}{% endfor %}
|
||||||
|
```
|
||||||
|
|
||||||
|
The generated output will look something like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
define host{
|
||||||
|
use generic-switch
|
||||||
|
host_name switch1
|
||||||
|
address 192.0.2.1
|
||||||
|
}
|
||||||
|
define host{
|
||||||
|
use generic-switch
|
||||||
|
host_name switch2
|
||||||
|
address 192.0.2.2
|
||||||
|
}
|
||||||
|
define host{
|
||||||
|
use generic-switch
|
||||||
|
host_name switch3
|
||||||
|
address 192.0.2.3
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -97,6 +97,20 @@ The recording of one or more failure messages will automatically flag a report a
|
|||||||
|
|
||||||
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`.
|
||||||
|
|
||||||
|
By default, reports within a module are ordered alphabetically in the reports list page. To return reports in a specific order, you can define the `report_order` variable at the end of your module. The `report_order` variable is a tuple which contains each Report class in the desired order. Any reports that are omitted from this list will be listed last.
|
||||||
|
|
||||||
|
```
|
||||||
|
from extras.reports import Report
|
||||||
|
|
||||||
|
class DeviceConnectionsReport(Report)
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DeviceIPsReport(Report)
|
||||||
|
pass
|
||||||
|
|
||||||
|
report_order = (DeviceIPsReport, DeviceConnectionsReport)
|
||||||
|
```
|
||||||
|
|
||||||
Once you have created a report, it will appear in the reports list. Initially, reports will have no results associated with them. To generate results, run the report.
|
Once you have created a report, it will appear in the reports list. Initially, reports will have no results associated with them. To generate results, run the report.
|
||||||
|
|
||||||
## Running Reports
|
## Running Reports
|
||||||
@@ -104,7 +118,7 @@ Once you have created a report, it will appear in the reports list. Initially, r
|
|||||||
!!! note
|
!!! note
|
||||||
To run a report, a user must be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below.
|
To run a report, a user must be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Via the Web UI
|
### Via the Web UI
|
||||||
|
|
||||||
@@ -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.
|
If you're adding a relational field (e.g. `ForeignKey`) and intend to include the data when retrieving 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.
|
||||||
|
|
||||||
## 4. Update relevant querysets
|
## 4. Update API serializer
|
||||||
|
|
||||||
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.
|
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 representation of the model.
|
||||||
|
|
||||||
## 5. Update API serializer
|
## 5. Add field to forms
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
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.
|
||||||
|
|||||||
@@ -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.)
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/
|
|||||||
|
|
||||||
* [Change logging](../additional-features/change-logging.md) - Changes to these objects are automatically recorded in the change log
|
* [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
|
* [Webhooks](../additional-features/webhooks.md) - NetBox is capable of generating outgoing webhooks for these objects
|
||||||
* [Custom fields](../additional-features/custom-fields.md) - These models support the addition of user-defined fields
|
* [Custom fields](../customization/custom-fields.md) - These models support the addition of user-defined fields
|
||||||
* [Export templates](../additional-features/export-templates.md) - Users can create custom export templates for these models
|
* [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
|
* [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
|
* [Journaling](../additional-features/journaling.md) - These models support persistent historical commentary
|
||||||
* Nesting - These models can be nested recursively to create a hierarchy
|
* Nesting - These models can be nested recursively to create a hierarchy
|
||||||
@@ -19,8 +19,8 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/
|
|||||||
| Type | Change Logging | Webhooks | Custom Fields | Export Templates | Tags | Journaling | Nesting |
|
| Type | Change Logging | Webhooks | Custom Fields | Export Templates | Tags | Journaling | Nesting |
|
||||||
| ------------------ | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- |
|
| ------------------ | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- |
|
||||||
| Primary | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | |
|
| Primary | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | |
|
||||||
| Organizational | :material-check: | :material-check: | :material-check: | :material-check: | | | |
|
| Organizational | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | | |
|
||||||
| Nested Group | :material-check: | :material-check: | :material-check: | :material-check: | | | :material-check: |
|
| Nested Group | :material-check: | :material-check: | :material-check: | :material-check: | :material-check: | | :material-check: |
|
||||||
| Component | :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: | | | | |
|
| Component Template | :material-check: | :material-check: | :material-check: | | | | |
|
||||||
|
|
||||||
@@ -41,16 +41,20 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/
|
|||||||
* [dcim.Site](../models/dcim/site.md)
|
* [dcim.Site](../models/dcim/site.md)
|
||||||
* [dcim.VirtualChassis](../models/dcim/virtualchassis.md)
|
* [dcim.VirtualChassis](../models/dcim/virtualchassis.md)
|
||||||
* [ipam.Aggregate](../models/ipam/aggregate.md)
|
* [ipam.Aggregate](../models/ipam/aggregate.md)
|
||||||
|
* [ipam.ASN](../models/ipam/asn.md)
|
||||||
|
* [ipam.FHRPGroup](../models/ipam/fhrpgroup.md)
|
||||||
* [ipam.IPAddress](../models/ipam/ipaddress.md)
|
* [ipam.IPAddress](../models/ipam/ipaddress.md)
|
||||||
* [ipam.Prefix](../models/ipam/prefix.md)
|
* [ipam.Prefix](../models/ipam/prefix.md)
|
||||||
* [ipam.RouteTarget](../models/ipam/routetarget.md)
|
* [ipam.RouteTarget](../models/ipam/routetarget.md)
|
||||||
* [ipam.Service](../models/ipam/service.md)
|
* [ipam.Service](../models/ipam/service.md)
|
||||||
* [ipam.VLAN](../models/ipam/vlan.md)
|
* [ipam.VLAN](../models/ipam/vlan.md)
|
||||||
* [ipam.VRF](../models/ipam/vrf.md)
|
* [ipam.VRF](../models/ipam/vrf.md)
|
||||||
* [secrets.Secret](../models/secrets/secret.md)
|
* [tenancy.Contact](../models/tenancy/contact.md)
|
||||||
* [tenancy.Tenant](../models/tenancy/tenant.md)
|
* [tenancy.Tenant](../models/tenancy/tenant.md)
|
||||||
* [virtualization.Cluster](../models/virtualization/cluster.md)
|
* [virtualization.Cluster](../models/virtualization/cluster.md)
|
||||||
* [virtualization.VirtualMachine](../models/virtualization/virtualmachine.md)
|
* [virtualization.VirtualMachine](../models/virtualization/virtualmachine.md)
|
||||||
|
* [wireless.WirelessLAN](../models/wireless/wirelesslan.md)
|
||||||
|
* [wireless.WirelessLink](../models/wireless/wirelesslink.md)
|
||||||
|
|
||||||
### Organizational Models
|
### Organizational Models
|
||||||
|
|
||||||
@@ -62,7 +66,7 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/
|
|||||||
* [ipam.RIR](../models/ipam/rir.md)
|
* [ipam.RIR](../models/ipam/rir.md)
|
||||||
* [ipam.Role](../models/ipam/role.md)
|
* [ipam.Role](../models/ipam/role.md)
|
||||||
* [ipam.VLANGroup](../models/ipam/vlangroup.md)
|
* [ipam.VLANGroup](../models/ipam/vlangroup.md)
|
||||||
* [secrets.SecretRole](../models/secrets/secretrole.md)
|
* [tenancy.ContactRole](../models/tenancy/contactrole.md)
|
||||||
* [virtualization.ClusterGroup](../models/virtualization/clustergroup.md)
|
* [virtualization.ClusterGroup](../models/virtualization/clustergroup.md)
|
||||||
* [virtualization.ClusterType](../models/virtualization/clustertype.md)
|
* [virtualization.ClusterType](../models/virtualization/clustertype.md)
|
||||||
|
|
||||||
@@ -71,7 +75,9 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/
|
|||||||
* [dcim.Location](../models/dcim/location.md) (formerly RackGroup)
|
* [dcim.Location](../models/dcim/location.md) (formerly RackGroup)
|
||||||
* [dcim.Region](../models/dcim/region.md)
|
* [dcim.Region](../models/dcim/region.md)
|
||||||
* [dcim.SiteGroup](../models/dcim/sitegroup.md)
|
* [dcim.SiteGroup](../models/dcim/sitegroup.md)
|
||||||
|
* [tenancy.ContactGroup](../models/tenancy/contactgroup.md)
|
||||||
* [tenancy.TenantGroup](../models/tenancy/tenantgroup.md)
|
* [tenancy.TenantGroup](../models/tenancy/tenantgroup.md)
|
||||||
|
* [wireless.WirelessLANGroup](../models/wireless/wirelesslangroup.md)
|
||||||
|
|
||||||
### Component Models
|
### Component Models
|
||||||
|
|
||||||
|
|||||||
@@ -6,16 +6,6 @@
|
|||||||
|
|
||||||
Check `base_requirements.txt` for any dependencies pinned to a specific version, and upgrade them to their most stable release (where possible).
|
Check `base_requirements.txt` for any dependencies pinned to a specific version, and upgrade them to their most stable release (where possible).
|
||||||
|
|
||||||
### 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
|
||||||
|
|
||||||
Add the release notes (`/docs/release-notes/X.Y.md`) to the table of contents within `mkdocs.yml`, and point `index.md` to the new file.
|
Add the release notes (`/docs/release-notes/X.Y.md`) to the table of contents within `mkdocs.yml`, and point `index.md` to the new file.
|
||||||
|
|||||||
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 {circuit_list(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 filters) 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 {site_list(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.
|
||||||
@@ -10,7 +10,6 @@ NetBox is an infrastructure resource modeling (IRM) application designed to empo
|
|||||||
* **Connections** - Network, console, and power connections among devices
|
* **Connections** - Network, console, and power connections among devices
|
||||||
* **Virtualization** - Virtual machines and clusters
|
* **Virtualization** - Virtual machines and clusters
|
||||||
* **Data circuits** - Long-haul communications circuits and providers
|
* **Data circuits** - Long-haul communications circuits and providers
|
||||||
* **Secrets** - Encrypted storage of sensitive credentials
|
|
||||||
|
|
||||||
## What NetBox Is Not
|
## What NetBox Is Not
|
||||||
|
|
||||||
@@ -49,13 +48,13 @@ NetBox is built on the [Django](https://djangoproject.com/) Python framework and
|
|||||||
| HTTP service | nginx or Apache |
|
| HTTP service | nginx or Apache |
|
||||||
| WSGI service | gunicorn or uWSGI |
|
| WSGI service | gunicorn or uWSGI |
|
||||||
| Application | Django/Python |
|
| Application | Django/Python |
|
||||||
| Database | PostgreSQL 9.6+ |
|
| Database | PostgreSQL 10+ |
|
||||||
| Task queuing | Redis/django-rq |
|
| Task queuing | Redis/django-rq |
|
||||||
| Live device access | NAPALM |
|
| Live device access | NAPALM |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This section entails the installation and configuration of a local PostgreSQL database. If you already have a PostgreSQL database service in place, skip to [the next section](2-redis.md).
|
This section entails the installation and configuration of a local PostgreSQL database. If you already have a PostgreSQL database service in place, skip to [the next section](2-redis.md).
|
||||||
|
|
||||||
!!! warning
|
!!! warning "PostgreSQL 10 or later required"
|
||||||
NetBox requires PostgreSQL 9.6 or higher. Please note that MySQL and other relational databases are **not** currently supported.
|
NetBox requires PostgreSQL 10 or later. Please note that MySQL and other relational databases are **not** supported.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -21,9 +21,6 @@ This section entails the installation and configuration of a local PostgreSQL da
|
|||||||
sudo postgresql-setup --initdb
|
sudo postgresql-setup --initdb
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! 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/).
|
|
||||||
|
|
||||||
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:
|
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
|
```no-highlight
|
||||||
@@ -38,30 +35,36 @@ sudo systemctl start postgresql
|
|||||||
sudo systemctl enable postgresql
|
sudo systemctl enable postgresql
|
||||||
```
|
```
|
||||||
|
|
||||||
## Database Creation
|
Before continuing, verify that you have installed PostgreSQL 10 or later:
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
!!! danger
|
|
||||||
**Do not use the password from the example.** Choose a strong, random password to ensure secure database authentication for your NetBox installation.
|
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ sudo -u postgres psql
|
psql -V
|
||||||
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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Database Creation
|
||||||
|
|
||||||
|
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 "Use a strong password"
|
||||||
|
**Do not use the password from the example.** Choose a strong, random password to ensure secure database authentication for your NetBox installation.
|
||||||
|
|
||||||
|
Once complete, enter `\q` to exit the PostgreSQL shell.
|
||||||
|
|
||||||
## 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
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
[Redis](https://redis.io/) is an in-memory key-value store which NetBox employs for caching and queuing. This section entails the installation and configuration of a local Redis instance. If you already have a Redis service in place, skip to [the next section](3-netbox.md).
|
[Redis](https://redis.io/) is an in-memory key-value store which NetBox employs for caching and queuing. This section entails the installation and configuration of a local Redis instance. If you already have a Redis service in place, skip to [the next section](3-netbox.md).
|
||||||
|
|
||||||
!!! note
|
!!! warning "Redis v4.0 or later required"
|
||||||
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"
|
||||||
@@ -21,6 +21,12 @@
|
|||||||
sudo systemctl enable redis
|
sudo systemctl enable redis
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Before continuing, verify that your installed version of Redis is at least v4.0:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
redis-server -v
|
||||||
|
```
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
## Verify Service Status
|
## Verify Service Status
|
||||||
@@ -28,6 +34,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.
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ 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
|
!!! warning "Python 3.7 or later required"
|
||||||
NetBox v2.8.0 and later require Python 3.6, 3.7, or 3.8.
|
NetBox v3.0 and v3.1 require Python 3.7, 3.8, or 3.9. It is recommended to install at least Python v3.8, as this will become the minimum supported Python version in NetBox v3.2.
|
||||||
|
|
||||||
=== "Ubuntu"
|
=== "Ubuntu"
|
||||||
|
|
||||||
@@ -17,14 +17,19 @@ Begin by installing all system packages required by NetBox and its dependencies.
|
|||||||
|
|
||||||
=== "CentOS"
|
=== "CentOS"
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
CentOS 8 does not provide Python 3.7 or later via its native package manager. You will need to install it via some other means. [Here is an example](https://tecadmin.net/install-python-3-7-on-centos-8/) of installing Python 3.7 from source.
|
||||||
|
|
||||||
|
Once you have Python 3.7 or later installed, install the remaining system packages:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo yum install -y gcc python36 python36-devel python3-pip libxml2-devel libxslt-devel libffi-devel libpq-devel openssl-devel redhat-rpm-config
|
sudo yum install -y gcc 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, check that your installed Python version is at least 3.7:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo pip3 install --upgrade pip
|
python3 -V
|
||||||
```
|
```
|
||||||
|
|
||||||
## Download NetBox
|
## Download NetBox
|
||||||
@@ -36,23 +41,21 @@ 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:
|
||||||
@@ -72,23 +75,26 @@ If `git` is not already installed, install it:
|
|||||||
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 --depth 1 https://github.com/netbox-community/netbox.git .
|
||||||
```
|
|
||||||
|
|
||||||
The screen below should be the result:
|
|
||||||
|
|
||||||
```
|
|
||||||
Cloning into '.'...
|
|
||||||
remote: Counting objects: 1994, done.
|
|
||||||
remote: Compressing objects: 100% (150/150), done.
|
|
||||||
remote: Total 1994 (delta 80), reused 0 (delta 0), pack-reused 1842
|
|
||||||
Receiving objects: 100% (1994/1994), 472.36 KiB | 0 bytes/s, done.
|
|
||||||
Resolving deltas: 100% (1495/1495), done.
|
|
||||||
Checking connectivity... done.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
Installation via git also allows you to easily try out development versions of NetBox. The `develop` branch contains all work underway for the next minor release, and the `feature` branch tracks progress on the next major release.
|
The `git clone` command above utilizes a "shallow clone" to retrieve only the most recent commit. If you need to download the entire history, omit the `--depth 1` argument.
|
||||||
|
|
||||||
|
The `git clone` command should generate output similar to the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
Cloning into '.'...
|
||||||
|
remote: Enumerating objects: 996, done.
|
||||||
|
remote: Counting objects: 100% (996/996), done.
|
||||||
|
remote: Compressing objects: 100% (935/935), done.
|
||||||
|
remote: Total 996 (delta 148), reused 386 (delta 34), pack-reused 0
|
||||||
|
Receiving objects: 100% (996/996), 4.26 MiB | 9.81 MiB/s, done.
|
||||||
|
Resolving deltas: 100% (148/148), done.
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Installation via git also allows you to easily try out different versions of NetBox. To check out a [specific NetBox release](https://github.com/netbox-community/netbox/releases), use the `git checkout` command with the desired release tag. For example, `git checkout v3.0.8`.
|
||||||
|
|
||||||
## Create the NetBox System User
|
## Create the NetBox System User
|
||||||
|
|
||||||
@@ -189,7 +195,7 @@ A simple Python script named `generate_secret_key.py` is provided in the parent
|
|||||||
python3 ../generate_secret_key.py
|
python3 ../generate_secret_key.py
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! warning
|
!!! warning "SECRET_KEY values must match"
|
||||||
In the case of a highly available installation with multiple web servers, `SECRET_KEY` must be identical among all servers in order to maintain a persistent user session state.
|
In the case of a highly available installation with multiple web servers, `SECRET_KEY` must be identical among all servers in order to maintain a persistent user session state.
|
||||||
|
|
||||||
When you have finished modifying the configuration, remember to save the file.
|
When you have finished modifying the configuration, remember to save the file.
|
||||||
@@ -200,7 +206,7 @@ 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 sh -c "echo 'napalm' >> /opt/netbox/local_requirements.txt"
|
sudo sh -c "echo 'napalm' >> /opt/netbox/local_requirements.txt"
|
||||||
@@ -219,14 +225,21 @@ sudo sh -c "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 is set to a lesser version, pass the path to the supported 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.
|
||||||
|
|
||||||
@@ -243,30 +256,45 @@ 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 or linked from 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
|
||||||
|
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
|
||||||
|
```
|
||||||
|
|
||||||
|
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. Try logging in using the username and password specified when creating a superuser.
|
||||||
|
|
||||||
!!! note
|
!!! 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):
|
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):
|
||||||
|
|
||||||
@@ -274,20 +302,10 @@ Quit the server with CONTROL-C.
|
|||||||
firewall-cmd --zone=public --add-port=8000/tcp
|
firewall-cmd --zone=public --add-port=8000/tcp
|
||||||
```
|
```
|
||||||
|
|
||||||
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.
|
!!! danger "Not for production use"
|
||||||
|
|
||||||
!!! 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.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ While the provided configuration should suffice for most initial installations,
|
|||||||
|
|
||||||
## systemd Setup
|
## systemd Setup
|
||||||
|
|
||||||
We'll use systemd to control both gunicorn and NetBox's background worker process. First, copy `contrib/netbox.service` and `contrib/netbox-rq.service` to the `/etc/systemd/system/` directory and reload the systemd dameon:
|
We'll use systemd to control both gunicorn and NetBox's background worker process. First, copy `contrib/netbox.service` and `contrib/netbox-rq.service` to the `/etc/systemd/system/` directory and reload the systemd daemon:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
|
sudo cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
|
||||||
@@ -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>
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
The installation instructions provided here have been tested to work on Ubuntu 20.04 and CentOS 8.2. The particular commands needed to install dependencies on other distributions may vary significantly. Unfortunately, this is outside the control of the NetBox maintainers. Please consult your distribution's documentation for assistance with any errors.
|
The installation instructions provided here have been tested to work on Ubuntu 20.04 and CentOS 8.3. The particular commands needed to install dependencies on other distributions may vary significantly. Unfortunately, this is outside the control of the NetBox maintainers. Please consult your distribution's documentation for assistance with any errors.
|
||||||
|
|
||||||
The following sections detail how to set up a new instance of NetBox:
|
The following sections detail how to set up a new instance of NetBox:
|
||||||
|
|
||||||
@@ -11,21 +11,18 @@ 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.
|
The video below demonstrates the installation of NetBox v3.0 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>
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/7Fpd2-q9_28" title="YouTube video player" 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 | 10 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
!!! note
|
|
||||||
Python 3.7 or later will be required in NetBox v3.0. Users are strongly encouraged to install NetBox using Python 3.7 or later for new deployments.
|
|
||||||
|
|
||||||
Below is a simplified overview of the NetBox application stack for reference:
|
Below is a simplified overview of the NetBox application stack for reference:
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -6,12 +6,12 @@ Prior to upgrading your NetBox instance, be sure to carefully review all [releas
|
|||||||
|
|
||||||
## 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 | 10 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
## Install the Latest Release
|
## Install the Latest Release
|
||||||
@@ -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 linked from 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
|
||||||
|
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [housekeeping documentation](../administration/housekeeping.md) for further details.
|
||||||
|
|||||||
|
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 |
@@ -22,13 +22,3 @@ Each cable may be assigned a type, label, length, and color. Each cable is also
|
|||||||
## Tracing Cables
|
## Tracing Cables
|
||||||
|
|
||||||
A cable may be traced from either of its endpoints by clicking the "trace" button. (A REST API endpoint also provides this functionality.) NetBox will follow the path of connected cables from this termination across the directly connected cable to the far-end termination. If the cable connects to a pass-through port, and the peer port has another cable connected, NetBox will continue following the cable path until it encounters a non-pass-through or unconnected termination point. The entire path will be displayed to the user.
|
A cable may be traced from either of its endpoints by clicking the "trace" button. (A REST API endpoint also provides this functionality.) NetBox will follow the path of connected cables from this termination across the directly connected cable to the far-end termination. If the cable connects to a pass-through port, and the peer port has another cable connected, NetBox will continue following the cable path until it encounters a non-pass-through or unconnected termination point. The entire path will be displayed to the user.
|
||||||
|
|
||||||
In the example below, three individual cables comprise a path between devices A and D:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Traced from Interface 1 on Device A, NetBox will show the following path:
|
|
||||||
|
|
||||||
* Cable 1: Interface 1 to Front Port 1
|
|
||||||
* Cable 2: Rear Port 1 to Rear Port 2
|
|
||||||
* Cable 3: Front Port 2 to Interface 2
|
|
||||||
|
|||||||
@@ -12,3 +12,5 @@ Some devices house child devices which share physical resources, like space and
|
|||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
This parent/child relationship is **not** suitable for modeling chassis-based devices, wherein child members share a common control plane. Instead, line cards and similarly non-autonomous hardware should be modeled as inventory items within a device, with any associated interfaces or other components assigned directly to the device.
|
This parent/child relationship is **not** suitable for modeling chassis-based devices, wherein child members share a common control plane. Instead, line cards and similarly non-autonomous hardware should be modeled as inventory items within a device, with any associated interfaces or other components assigned directly to the device.
|
||||||
|
|
||||||
|
A device type may optionally specify an airflow direction, such as front-to-rear, rear-to-front, or passive. Airflow direction may also be set separately per device. If it is not defined for a device at the time of its creation, it will inherit the airflow setting of its device type.
|
||||||
|
|||||||
@@ -11,6 +11,17 @@ Interfaces may be physical or virtual in nature, but only physical interfaces ma
|
|||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
### Wireless Interfaces
|
||||||
|
|
||||||
|
Wireless interfaces may additionally track the following attributes:
|
||||||
|
|
||||||
|
* **Role** - AP or station
|
||||||
|
* **Channel** - One of several standard wireless channels
|
||||||
|
* **Channel Frequency** - The transmit frequency
|
||||||
|
* **Channel Width** - Channel bandwidth
|
||||||
|
|
||||||
|
If a predefined channel is selected, the frequency and width attributes will be assigned automatically. If no channel is selected, these attributes may be defined manually.
|
||||||
|
|
||||||
### IP Address Assignment
|
### IP Address Assignment
|
||||||
|
|
||||||
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 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.)
|
||||||
|
|||||||
@@ -2,4 +2,5 @@
|
|||||||
|
|
||||||
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.
|
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.)
|
Each location must have a name that is unique within its parent site and location, if any.
|
||||||
|
|
||||||
|
|||||||
@@ -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 driver (if any) 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 @@
|
|||||||
# 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 location 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. The name and facility ID of each rack within a location must be unique.
|
||||||
|
|
||||||
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,3 +1,5 @@
|
|||||||
# Regions
|
# Regions
|
||||||
|
|
||||||
Sites can be arranged geographically using regions. A region might represent a continent, country, city, campus, or other area depending on your use case. Regions can be nested recursively to construct a hierarchy. For example, you might define several country regions, and within each of those several state or city regions to which sites are assigned.
|
Sites can be arranged geographically using regions. A region might represent a continent, country, city, campus, or other area depending on your use case. Regions can be nested recursively to construct a hierarchy. For example, you might define several country regions, and within each of those several state or city regions to which sites are assigned.
|
||||||
|
|
||||||
|
Each region must have a name that is unique within its parent region, if any.
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
# Site Groups
|
# 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.
|
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.
|
||||||
|
|
||||||
|
Each site group must have a name that is unique within its parent group, if any.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -8,13 +8,15 @@ 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)
|
||||||
|
* Long text: Free-form of any length; supports Markdown rendering
|
||||||
* Integer: A whole number (positive or negative)
|
* Integer: A whole number (positive or negative)
|
||||||
* Boolean: True or false
|
* Boolean: True or false
|
||||||
* 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
|
||||||
|
* JSON: Arbitrary data stored in JSON format
|
||||||
* 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
|
* Multiple selection: A selection field which supports the assignment of multiple values
|
||||||
|
|
||||||
@@ -39,38 +41,3 @@ 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. The value of a multiple selection field will always return a list, even if only one value is selected.
|
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
|
|
||||||
|
|
||||||
When retrieving an object via the REST API, all of its custom data will be included within the `custom_fields` attribute. For example, below is the partial output of a site with two custom fields defined:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": 123,
|
|
||||||
"url": "http://localhost:8000/api/dcim/sites/123/",
|
|
||||||
"name": "Raleigh 42",
|
|
||||||
...
|
|
||||||
"custom_fields": {
|
|
||||||
"deployed": "2018-06-19",
|
|
||||||
"site_code": "US-NC-RAL42"
|
|
||||||
},
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
To set or change these values, simply include nested JSON data. For example:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"name": "New Site",
|
|
||||||
"slug": "new-site",
|
|
||||||
"custom_fields": {
|
|
||||||
"deployed": "2019-03-24"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -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 (NMS).
|
||||||
|
|
||||||
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 has display text and a URL, and data from the Netbox item being viewed can be included in the link using [Jinja2 template code](https://jinja2docs.readthedocs.io/en/stable/) through the variable `obj`, and custom fields through `obj.cf`.
|
||||||
|
|
||||||
For example, you might define a link like this:
|
For example, you might define a link like this:
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ 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
|
!!! 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.
|
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.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# 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 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.
|
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.
|
||||||
|
|
||||||
@@ -35,36 +35,3 @@ If you need to use the config context data in an export template, you'll should
|
|||||||
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.)
|
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`.
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
Here's an example device export template that will generate a simple Nagios configuration from a list of devices.
|
|
||||||
|
|
||||||
```
|
|
||||||
{% for device in queryset %}{% if device.status and device.primary_ip %}define host{
|
|
||||||
use generic-switch
|
|
||||||
host_name {{ device.name }}
|
|
||||||
address {{ device.primary_ip.address.ip }}
|
|
||||||
}
|
|
||||||
{% endif %}{% endfor %}
|
|
||||||
```
|
|
||||||
|
|
||||||
The generated output will look something like this:
|
|
||||||
|
|
||||||
```
|
|
||||||
define host{
|
|
||||||
use generic-switch
|
|
||||||
host_name switch1
|
|
||||||
address 192.0.2.1
|
|
||||||
}
|
|
||||||
define host{
|
|
||||||
use generic-switch
|
|
||||||
host_name switch2
|
|
||||||
address 192.0.2.2
|
|
||||||
}
|
|
||||||
define host{
|
|
||||||
use generic-switch
|
|
||||||
host_name switch3
|
|
||||||
address 192.0.2.3
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -15,6 +15,3 @@ The `tag` filter can be specified multiple times to match only objects which hav
|
|||||||
```no-highlight
|
```no-highlight
|
||||||
GET /api/dcim/devices/?tag=monitored&tag=deprecated
|
GET /api/dcim/devices/?tag=monitored&tag=deprecated
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! note
|
|
||||||
Tags have changed substantially in NetBox v2.9. They are no longer created on-demand when editing an object, and their representation in the REST API now includes a complete depiction of the tag rather than only its label.
|
|
||||||
|
|||||||
96
docs/models/extras/webhook.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
* **Name** - A unique name for the webhook. The name is not included with outbound messages.
|
||||||
|
* **Object type(s)** - The type or types of NetBox object that will trigger the webhook.
|
||||||
|
* **Enabled** - If unchecked, the webhook will be inactive.
|
||||||
|
* **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected.
|
||||||
|
* **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`.
|
||||||
|
* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed.
|
||||||
|
* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`)
|
||||||
|
* **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below).
|
||||||
|
* **Body template** - The content of the request being sent (optional). Jinja2 templating is supported for this field (see below). If blank, NetBox will populate the request body with a raw dump of the webhook context. (If the HTTP cotent type is set to `application/json`, this will be formatted as a JSON object.)
|
||||||
|
* **Secret** - A secret string used to prove authenticity of the request (optional). This will append a `X-Hook-Signature` header to the request, consisting of a HMAC (SHA-512) hex digest of the request body using the secret as the key.
|
||||||
|
* **Conditions** - An optional set of conditions evaluated to determine whether the webhook fires for a given object.
|
||||||
|
* **SSL verification** - Uncheck this option to disable validation of the receiver's SSL certificate. (Disable with caution!)
|
||||||
|
* **CA file path** - The file path to a particular certificate authority (CA) file to use when validating the receiver's SSL certificate (optional).
|
||||||
|
|
||||||
|
## Jinja2 Template Support
|
||||||
|
|
||||||
|
[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands.
|
||||||
|
|
||||||
|
For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration:
|
||||||
|
|
||||||
|
* Object type: IPAM > IP address
|
||||||
|
* HTTP method: `POST`
|
||||||
|
* URL: Slack incoming webhook URL
|
||||||
|
* HTTP content type: `application/json`
|
||||||
|
* Body template: `{"text": "IP address {{ data['address'] }} was created by {{ username }}!"}`
|
||||||
|
|
||||||
|
### Available Context
|
||||||
|
|
||||||
|
The following data is available as context for Jinja2 templates:
|
||||||
|
|
||||||
|
* `event` - The type of event which triggered the webhook: created, updated, or deleted.
|
||||||
|
* `model` - The NetBox model which triggered the change.
|
||||||
|
* `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.
|
||||||
|
* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request.
|
||||||
|
* `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
|
||||||
|
|
||||||
|
If no body template is specified, the request body will be populated with a JSON object containing the context data. For example, a newly created site might appear as follows:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"event": "created",
|
||||||
|
"timestamp": "2021-03-09 17:55:33.968016+00:00",
|
||||||
|
"model": "site",
|
||||||
|
"username": "jstretch",
|
||||||
|
"request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a",
|
||||||
|
"data": {
|
||||||
|
"id": 19,
|
||||||
|
"name": "Site 1",
|
||||||
|
"slug": "site-1",
|
||||||
|
"status":
|
||||||
|
"value": "active",
|
||||||
|
"label": "Active",
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"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",
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conditional Webhooks
|
||||||
|
|
||||||
|
A webhook may include a set of conditional logic expressed in JSON used to control whether a webhook triggers for a specific object. For example, you may wish to trigger a webhook for devices only when the `status` field of an object is "active":
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"attr": "status",
|
||||||
|
"value": "active"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more detail, see the reference documentation for NetBox's [conditional logic](../reference/conditions.md).
|
||||||
15
docs/models/ipam/asn.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# ASN
|
||||||
|
|
||||||
|
ASN is short for Autonomous System Number. This identifier is used in the BGP protocol to identify which "autonomous system" a particular prefix is originating and transiting through.
|
||||||
|
|
||||||
|
The AS number model within NetBox allows you to model some of this real-world relationship.
|
||||||
|
|
||||||
|
Within NetBox:
|
||||||
|
|
||||||
|
* AS numbers are globally unique
|
||||||
|
* Each AS number must be associated with a RIR (ARIN, RFC 6996, etc)
|
||||||
|
* Each AS number can be associated with many different sites
|
||||||
|
* Each site can have many different AS numbers
|
||||||
|
* Each AS number can be assigned to a single tenant
|
||||||
|
|
||||||
|
|
||||||
16
docs/models/ipam/fhrpgroup.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# FHRP Group
|
||||||
|
|
||||||
|
A first-hop redundancy protocol (FHRP) enables multiple physical interfaces to present a virtual IP address in a redundant manner. Example of such protocols include:
|
||||||
|
|
||||||
|
* Hot Standby Router Protocol (HSRP)
|
||||||
|
* Virtual Router Redundancy Protocol (VRRP)
|
||||||
|
* Common Address Redundancy Protocol (CARP)
|
||||||
|
* Gateway Load Balancing Protocol (GLBP)
|
||||||
|
|
||||||
|
NetBox models these redundancy groups by protocol and group ID. Each group may optionally be assigned an authentication type and key. (Note that the authentication key is stored as a plaintext value in NetBox.) Each group may be assigned or more virtual IPv4 and/or IPv6 addresses.
|
||||||
|
|
||||||
|
## FHRP Group Assignments
|
||||||
|
|
||||||
|
Member device and VM interfaces can be assigned to FHRP groups, along with a numeric priority value. For instance, three interfaces, each belonging to a different router, may each be assigned to the same FHRP group to serve a common virtual IP address. Each of these assignments would typically receive a different priority.
|
||||||
|
|
||||||
|
Interfaces are assigned to FHRP groups under the interface detail view.
|
||||||
14
docs/models/ipam/iprange.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
The maximum supported size of an IP range is 2^32 - 1.
|
||||||
@@ -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.
|
|
||||||
31
docs/models/tenancy/contact.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Contacts
|
||||||
|
|
||||||
|
A contact represent an individual or group that has been associated with an object in NetBox for administrative reasons. For example, you might assign one or more operational contacts to each site. Contacts can be arranged within nested contact groups.
|
||||||
|
|
||||||
|
Each contact must include a name, which is unique to its parent group (if any). The following optional descriptors are also available:
|
||||||
|
|
||||||
|
* Title
|
||||||
|
* Phone
|
||||||
|
* Email
|
||||||
|
* Address
|
||||||
|
|
||||||
|
## Contact Assignment
|
||||||
|
|
||||||
|
Each contact can be assigned to one or more objects, allowing for the efficient reuse of contact information. When assigning a contact to an object, the user may optionally specify a role and/or priority (primary, secondary, tertiary, or inactive) to better convey the nature of the contact's relationship to the assigned object.
|
||||||
|
|
||||||
|
The following models support the assignment of contacts:
|
||||||
|
|
||||||
|
* circuits.Circuit
|
||||||
|
* circuits.Provider
|
||||||
|
* dcim.Device
|
||||||
|
* dcim.Location
|
||||||
|
* dcim.Manufacturer
|
||||||
|
* dcim.PowerPanel
|
||||||
|
* dcim.Rack
|
||||||
|
* dcim.Region
|
||||||
|
* dcim.Site
|
||||||
|
* dcim.SiteGroup
|
||||||
|
* tenancy.Tenant
|
||||||
|
* virtualization.Cluster
|
||||||
|
* virtualization.ClusterGroup
|
||||||
|
* virtualization.VirtualMachine
|
||||||
3
docs/models/tenancy/contactgroup.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Contact Groups
|
||||||
|
|
||||||
|
Contacts can be organized into arbitrary groups. These groups can be recursively nested for convenience. Each contact within a group must have a unique name, but other attributes can be repeated.
|
||||||
3
docs/models/tenancy/contactrole.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Contact Roles
|
||||||
|
|
||||||
|
Contacts can be organized by functional roles, which are fully customizable by the user. For example, you might create roles for administrative, operational, or emergency contacts.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Clusters
|
# Clusters
|
||||||
|
|
||||||
A cluster is a logical grouping of physical resources within which virtual machines run. A cluster must be assigned a type (technological classification), and may optionally be assigned to a cluster group, site, and/or tenant.
|
A cluster is a logical grouping of physical resources within which virtual machines run. A cluster must be assigned a type (technological classification), and may optionally be assigned to a cluster group, site, and/or tenant. Each cluster must have a unique name within its assigned group and/or site, if any.
|
||||||
|
|
||||||
Physical devices may be associated with clusters as hosts. This allows users to track on which host(s) a particular virtual machine may reside. However, NetBox does not support pinning a specific VM within a cluster to a particular host device.
|
Physical devices may be associated with clusters as hosts. This allows users to track on which host(s) a particular virtual machine may reside. However, NetBox does not support pinning a specific VM within a cluster to a particular host device.
|
||||||
|
|||||||
11
docs/models/wireless/wirelesslan.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Wireless LANs
|
||||||
|
|
||||||
|
A wireless LAN is a set of interfaces connected via a common wireless channel. Each instance must have an SSID, and may optionally be correlated to a VLAN. Wireless LANs can be arranged into hierarchical groups.
|
||||||
|
|
||||||
|
An interface may be attached to multiple wireless LANs, provided they are all operating on the same channel. Only wireless interfaces may be attached to wireless LANs.
|
||||||
|
|
||||||
|
Each wireless LAN may have authentication attributes associated with it, including:
|
||||||
|
|
||||||
|
* Authentication type
|
||||||
|
* Cipher
|
||||||
|
* Pre-shared key
|
||||||
3
docs/models/wireless/wirelesslangroup.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Wireless LAN Groups
|
||||||
|
|
||||||
|
Wireless LAN groups can be used to organize and classify wireless LANs. These groups are hierarchical: groups can be nested within parent groups. However, each wireless LAN may assigned only to one group.
|
||||||
9
docs/models/wireless/wirelesslink.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Wireless Links
|
||||||
|
|
||||||
|
A wireless link represents a connection between exactly two wireless interfaces. It may optionally be assigned an SSID and a description. It may also have a status assigned to it, similar to the cable model.
|
||||||
|
|
||||||
|
Each wireless link may have authentication attributes associated with it, including:
|
||||||
|
|
||||||
|
* Authentication type
|
||||||
|
* Cipher
|
||||||
|
* Pre-shared key
|
||||||
@@ -17,12 +17,12 @@ However, keep in mind that each piece of functionality is entirely optional. For
|
|||||||
|
|
||||||
## Initial Setup
|
## Initial Setup
|
||||||
|
|
||||||
## Plugin Structure
|
### Plugin Structure
|
||||||
|
|
||||||
Although the specific structure of a plugin is largely left to the discretion of its authors, a typical NetBox plugin looks something like this:
|
Although the specific structure of a plugin is largely left to the discretion of its authors, a typical NetBox plugin looks something like this:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
plugin_name/
|
project-name/
|
||||||
- plugin_name/
|
- plugin_name/
|
||||||
- templates/
|
- templates/
|
||||||
- plugin_name/
|
- plugin_name/
|
||||||
@@ -38,17 +38,17 @@ plugin_name/
|
|||||||
- setup.py
|
- setup.py
|
||||||
```
|
```
|
||||||
|
|
||||||
The top level is the project root. Immediately within the root should exist several items:
|
The top level is the project root, which can have any name that you like. Immediately within the root should exist several items:
|
||||||
|
|
||||||
* `setup.py` - This is a standard installation script used to install the plugin package within the Python environment.
|
* `setup.py` - This is a standard installation script used to install the plugin package within the Python environment.
|
||||||
* `README` - A brief introduction to your plugin, how to install and configure it, where to find help, and any other pertinent information. It is recommended to write README files using a markup language such as Markdown.
|
* `README` - A brief introduction to your plugin, how to install and configure it, where to find help, and any other pertinent information. It is recommended to write README files using a markup language such as Markdown.
|
||||||
* The plugin source directory, with the same name as your plugin.
|
* The plugin source directory, with the same name as your plugin. This must be a valid Python package name (e.g. no spaces or hyphens).
|
||||||
|
|
||||||
The plugin source directory contains all of the actual Python code and other resources used by your plugin. Its structure is left to the author's discretion, however it is recommended to follow best practices as outlined in the [Django documentation](https://docs.djangoproject.com/en/stable/intro/reusable-apps/). At a minimum, this directory **must** contain an `__init__.py` file containing an instance of NetBox's `PluginConfig` class.
|
The plugin source directory contains all the actual Python code and other resources used by your plugin. Its structure is left to the author's discretion, however it is recommended to follow best practices as outlined in the [Django documentation](https://docs.djangoproject.com/en/stable/intro/reusable-apps/). At a minimum, this directory **must** contain an `__init__.py` file containing an instance of NetBox's `PluginConfig` class.
|
||||||
|
|
||||||
### 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,12 +113,26 @@ 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`) |
|
||||||
|
|
||||||
All required settings must be configured by the user. If a configuration parameter is listed in both `required_settings` and `default_settings`, the default setting will be ignored.
|
All required settings must be configured by the user. If a configuration parameter is listed in both `required_settings` and `default_settings`, the default setting will be ignored.
|
||||||
|
|
||||||
|
### Create a Virtual Environment
|
||||||
|
|
||||||
|
It is strongly recommended to create a Python [virtual environment](https://docs.python.org/3/tutorial/venv.html) specific to your plugin. This will afford you complete control over the installed versions of all dependencies and avoid conflicting with any system packages. This environment can live wherever you'd like, however it should be excluded from revision control. (A popular convention is to keep all virtual environments in the user's home directory, e.g. `~/.virtualenvs/`.)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
python3 -m venv /path/to/my/venv
|
||||||
|
```
|
||||||
|
|
||||||
|
You can make NetBox available within this environment by creating a path file pointing to its location. This will add NetBox to the Python path upon activation. (Be sure to adjust the command below to specify your actual virtual environment path, Python version, and NetBox installation.)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd $VENV/lib/python3.7/site-packages/
|
||||||
|
echo /opt/netbox/netbox > netbox.pth
|
||||||
|
```
|
||||||
|
|
||||||
### Install the Plugin for Development
|
### Install the Plugin for Development
|
||||||
|
|
||||||
To ease development, it is recommended to go ahead and install the plugin at this point using setuptools' `develop` mode. This will create symbolic links within your Python environment to the plugin development directory. Call `setup.py` from the plugin's root directory with the `develop` argument (instead of `install`):
|
To ease development, it is recommended to go ahead and install the plugin at this point using setuptools' `develop` mode. This will create symbolic links within your Python environment to the plugin development directory. Call `setup.py` from the plugin's root directory with the `develop` argument (instead of `install`):
|
||||||
@@ -219,7 +233,7 @@ NetBox provides a base template to ensure a consistent user experience, which pl
|
|||||||
For more information on how template blocks work, consult the [Django documentation](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#block).
|
For more information on how template blocks work, consult the [Django documentation](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#block).
|
||||||
|
|
||||||
```jinja2
|
```jinja2
|
||||||
{% extends 'base.html' %}
|
{% extends 'base/layout.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% with config=settings.PLUGINS_CONFIG.netbox_animal_sounds %}
|
{% with config=settings.PLUGINS_CONFIG.netbox_animal_sounds %}
|
||||||
@@ -386,30 +400,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.
|
```
|
||||||
|
|||||||
122
docs/reference/conditions.md
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
# Conditions
|
||||||
|
|
||||||
|
Conditions are NetBox's mechanism for evaluating whether a set data meets a prescribed set of conditions. It allows the author to convey simple logic by declaring an arbitrary number of attribute-value-operation tuples nested within a hierarchy of logical AND and OR statements.
|
||||||
|
|
||||||
|
## Conditions
|
||||||
|
|
||||||
|
A condition is expressed as a JSON object with the following keys:
|
||||||
|
|
||||||
|
| Key name | Required | Default | Description |
|
||||||
|
|----------|----------|---------|-------------|
|
||||||
|
| attr | Yes | - | Name of the key within the data being evaluated |
|
||||||
|
| value | Yes | - | The reference value to which the given data will be compared |
|
||||||
|
| op | No | `eq` | The logical operation to be performed |
|
||||||
|
| negate | No | False | Negate (invert) the result of the condition's evaluation |
|
||||||
|
|
||||||
|
### Available Operations
|
||||||
|
|
||||||
|
* `eq`: Equals
|
||||||
|
* `gt`: Greater than
|
||||||
|
* `gte`: Greater than or equal to
|
||||||
|
* `lt`: Less than
|
||||||
|
* `lte`: Less than or equal to
|
||||||
|
* `in`: Is present within a list of values
|
||||||
|
* `contains`: Contains the specified value
|
||||||
|
|
||||||
|
### Accessing Nested Keys
|
||||||
|
|
||||||
|
To access nested keys, use dots to denote the path to the desired attribute. For example, assume the following data:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"a": {
|
||||||
|
"b": {
|
||||||
|
"c": 123
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The following condition will evaluate as true:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"attr": "a.b.c",
|
||||||
|
"value": 123
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
`name` equals "foo":
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"attr": "name",
|
||||||
|
"value": "foo"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`name` does not equal "foo"
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"attr": "name",
|
||||||
|
"value": "foo",
|
||||||
|
"negate": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`asn` is greater than 65000:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"attr": "asn",
|
||||||
|
"value": 65000,
|
||||||
|
"op": "gt"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`status` is not "planned" or "staging":
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"attr": "status",
|
||||||
|
"value": ["planned", "staging"],
|
||||||
|
"op": "in",
|
||||||
|
"negate": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Condition Sets
|
||||||
|
|
||||||
|
Multiple conditions can be combined into nested sets using AND or OR logic. This is done by declaring a JSON object with a single key (`and` or `or`) containing a list of condition objects and/or child condition sets.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
`status` is "active" and `primary_ip` is defined _or_ the "exempt" tag is applied.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"or": [
|
||||||
|
{
|
||||||
|
"and": [
|
||||||
|
{
|
||||||
|
"attr": "status",
|
||||||
|
"value": "active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"attr": "primary_ip",
|
||||||
|
"value": "",
|
||||||
|
"negate": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"attr": "tags",
|
||||||
|
"value": "exempt",
|
||||||
|
"op": "contains"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -1 +0,0 @@
|
|||||||
version-2.11.md
|
|
||||||
113
docs/release-notes/index.md
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
# Release Notes
|
||||||
|
|
||||||
|
Listed below are the major features introduced in each NetBox release. For more detail on a specific release train, see its individual release notes page.
|
||||||
|
|
||||||
|
#### [Version 3.1](./version-3.1.md) (December 2021)
|
||||||
|
|
||||||
|
* Contact Objects ([#1344](https://github.com/netbox-community/netbox/issues/1344))
|
||||||
|
* Wireless Networks ([#3979](https://github.com/netbox-community/netbox/issues/3979))
|
||||||
|
* Dynamic Configuration Updates ([#5883](https://github.com/netbox-community/netbox/issues/5883))
|
||||||
|
* First Hop Redundancy Protocol (FHRP) Groups ([#6235](https://github.com/netbox-community/netbox/issues/6235))
|
||||||
|
* Conditional Webhooks ([#6238](https://github.com/netbox-community/netbox/issues/6238))
|
||||||
|
* Interface Bridging ([#6346](https://github.com/netbox-community/netbox/issues/6346))
|
||||||
|
* Multiple ASNs per Site ([#6732](https://github.com/netbox-community/netbox/issues/6732))
|
||||||
|
* Single Sign-On (SSO) Authentication ([#7649](https://github.com/netbox-community/netbox/issues/7649))
|
||||||
|
|
||||||
|
#### [Version 3.0](./version-3.0.md) (August 2021)
|
||||||
|
|
||||||
|
* Updated User Interface ([#5893](https://github.com/netbox-community/netbox/issues/5893))
|
||||||
|
* GraphQL API ([#2007](https://github.com/netbox-community/netbox/issues/2007))
|
||||||
|
* IP Ranges ([#834](https://github.com/netbox-community/netbox/issues/834))
|
||||||
|
* Custom Model Validation ([#5963](https://github.com/netbox-community/netbox/issues/5963))
|
||||||
|
* SVG Cable Traces ([#6000](https://github.com/netbox-community/netbox/issues/6000))
|
||||||
|
* New Views for Models Previously Under the Admin UI ([#6466](https://github.com/netbox-community/netbox/issues/6466))
|
||||||
|
* REST API Token Provisioning ([#5264](https://github.com/netbox-community/netbox/issues/5264))
|
||||||
|
* New Housekeeping Command ([#6590](https://github.com/netbox-community/netbox/issues/6590))
|
||||||
|
* Custom Queue Support for Plugins ([#6651](https://github.com/netbox-community/netbox/issues/6651))
|
||||||
|
|
||||||
|
#### [Version 2.11](./version-2.11.md) (April 2021)
|
||||||
|
|
||||||
|
* Journaling Support ([#151](https://github.com/netbox-community/netbox/issues/151))
|
||||||
|
* Parent Interface Assignments ([#1519](https://github.com/netbox-community/netbox/issues/1519))
|
||||||
|
* Pre- and Post-Change Snapshots in Webhooks ([#3451](https://github.com/netbox-community/netbox/issues/3451))
|
||||||
|
* Mark as Connected Without a Cable ([#3648](https://github.com/netbox-community/netbox/issues/3648))
|
||||||
|
* Allow Assigning Devices to Locations ([#4971](https://github.com/netbox-community/netbox/issues/4971))
|
||||||
|
* Dynamic Object Exports ([#4999](https://github.com/netbox-community/netbox/issues/4999))
|
||||||
|
* Variable Scope Support for VLAN Groups ([#5284](https://github.com/netbox-community/netbox/issues/5284))
|
||||||
|
* New Site Group Model ([#5892](https://github.com/netbox-community/netbox/issues/5892))
|
||||||
|
* Improved Change Logging ([#5913](https://github.com/netbox-community/netbox/issues/5913))
|
||||||
|
* Provider Network Modeling ([#5986](https://github.com/netbox-community/netbox/issues/5986))
|
||||||
|
|
||||||
|
#### [Version 2.10](./version-2.10.md) (December 2020)
|
||||||
|
|
||||||
|
* Route Targets ([#259](https://github.com/netbox-community/netbox/issues/259))
|
||||||
|
* REST API Bulk Deletion ([#3436](https://github.com/netbox-community/netbox/issues/3436))
|
||||||
|
* REST API Bulk Update ([#4882](https://github.com/netbox-community/netbox/issues/4882))
|
||||||
|
* Reimplementation of Custom Fields ([#4878](https://github.com/netbox-community/netbox/issues/4878))
|
||||||
|
* Improved Cable Trace Performance ([#4900](https://github.com/netbox-community/netbox/issues/4900))
|
||||||
|
|
||||||
|
#### [Version 2.9](./version-2.9.md) (August 2020)
|
||||||
|
|
||||||
|
* Object-Based Permissions ([#554](https://github.com/netbox-community/netbox/issues/554))
|
||||||
|
* Background Execution of Scripts & Reports ([#2006](https://github.com/netbox-community/netbox/issues/2006))
|
||||||
|
* Named Virtual Chassis ([#2018](https://github.com/netbox-community/netbox/issues/2018))
|
||||||
|
* Changes to Tag Creation ([#3703](https://github.com/netbox-community/netbox/issues/3703))
|
||||||
|
* Dedicated Model for VM Interfaces ([#4721](https://github.com/netbox-community/netbox/issues/4721))
|
||||||
|
* REST API Endpoints for Users and Groups ([#4877](https://github.com/netbox-community/netbox/issues/4877))
|
||||||
|
|
||||||
|
#### [Version 2.8](./version-2.8.md) (April 2020)
|
||||||
|
|
||||||
|
* Remote Authentication Support ([#2328](https://github.com/netbox-community/netbox/issues/2328))
|
||||||
|
* Plugins ([#3351](https://github.com/netbox-community/netbox/issues/3351))
|
||||||
|
|
||||||
|
#### [Version 2.7](./version-2.7.md) (January 2020)
|
||||||
|
|
||||||
|
* Enhanced Device Type Import ([#451](https://github.com/netbox-community/netbox/issues/451))
|
||||||
|
* Bulk Import of Device Components ([#822](https://github.com/netbox-community/netbox/issues/822))
|
||||||
|
* External File Storage ([#1814](https://github.com/netbox-community/netbox/issues/1814))
|
||||||
|
* Rack Elevations Rendered via SVG ([#2248](https://github.com/netbox-community/netbox/issues/2248))
|
||||||
|
|
||||||
|
#### [Version 2.6](./version-2.6.md) (June 2019)
|
||||||
|
|
||||||
|
* Power Panels and Feeds ([#54](https://github.com/netbox-community/netbox/issues/54))
|
||||||
|
* Caching ([#2647](https://github.com/netbox-community/netbox/issues/2647))
|
||||||
|
* View Permissions ([#323](https://github.com/netbox-community/netbox/issues/323))
|
||||||
|
* Custom Links ([#969](https://github.com/netbox-community/netbox/issues/969))
|
||||||
|
* Prometheus Metrics ([#3104](https://github.com/netbox-community/netbox/issues/3104))
|
||||||
|
|
||||||
|
#### [Version 2.5](./version-2.5.md) (December 2018)
|
||||||
|
|
||||||
|
* Patch Panels and Cables ([#20](https://github.com/netbox-community/netbox/issues/20))
|
||||||
|
|
||||||
|
#### [Version 2.4](./version-2.4.md) (August 2018)
|
||||||
|
|
||||||
|
* Webhooks ([#81](https://github.com/netbox-community/netbox/issues/81))
|
||||||
|
* Tagging ([#132](https://github.com/netbox-community/netbox/issues/132))
|
||||||
|
* Contextual Configuration Data ([#1349](https://github.com/netbox-community/netbox/issues/1349))
|
||||||
|
* Change Logging ([#1898](https://github.com/netbox-community/netbox/issues/1898))
|
||||||
|
|
||||||
|
#### [Version 2.3](./version-2.3.md) (February 2018)
|
||||||
|
|
||||||
|
* Virtual Chassis ([#99](https://github.com/netbox-community/netbox/issues/99))
|
||||||
|
* Interface VLAN Assignments ([#150](https://github.com/netbox-community/netbox/issues/150))
|
||||||
|
* Bulk Object Creation via the API ([#1553](https://github.com/netbox-community/netbox/issues/1553))
|
||||||
|
* Automatic Provisioning of Next Available Prefixes ([#1694](https://github.com/netbox-community/netbox/issues/1694))
|
||||||
|
* Bulk Renaming of Device/VM Components ([#1781](https://github.com/netbox-community/netbox/issues/1781))
|
||||||
|
|
||||||
|
#### [Version 2.2](./version-2.2.md) (October 2017)
|
||||||
|
|
||||||
|
* Virtual Machines and Clusters ([#142](https://github.com/netbox-community/netbox/issues/142))
|
||||||
|
* Custom Validation Reports ([#1511](https://github.com/netbox-community/netbox/issues/1511))
|
||||||
|
|
||||||
|
#### [Version 2.1](./version-2.1.md) (July 2017)
|
||||||
|
|
||||||
|
* IP Address Roles ([#819](https://github.com/netbox-community/netbox/issues/819))
|
||||||
|
* Automatic Provisioning of Next Available IP ([#1246](https://github.com/netbox-community/netbox/issues/1246))
|
||||||
|
* NAPALM Integration ([#1348](https://github.com/netbox-community/netbox/issues/1348))
|
||||||
|
|
||||||
|
#### [Version 2.0](./version-2.0.md) (May 2017)
|
||||||
|
|
||||||
|
* API 2.0 ([#113](https://github.com/netbox-community/netbox/issues/113))
|
||||||
|
* Image Attachments ([#152](https://github.com/netbox-community/netbox/issues/152))
|
||||||
|
* Global Search ([#159](https://github.com/netbox-community/netbox/issues/159))
|
||||||
|
* Rack Elevations View ([#951](https://github.com/netbox-community/netbox/issues/951))
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||