Compare commits
1121 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50b6ded6f0 | ||
|
|
5ee3ee6181 | ||
|
|
cd3e901a60 | ||
|
|
314c41f47f | ||
|
|
a1c1532614 | ||
|
|
ffef78d426 | ||
|
|
8153406dd0 | ||
|
|
b5613a2cc6 | ||
|
|
6a225e53f5 | ||
|
|
6b73d22da1 | ||
|
|
8b81c10f84 | ||
|
|
a6a1bec437 | ||
|
|
562d1bfcd0 | ||
|
|
4f86d6a690 | ||
|
|
e63a191373 | ||
|
|
74b5e55643 | ||
|
|
405d0ab972 | ||
|
|
84e4156259 | ||
|
|
50428c3f01 | ||
|
|
a91c46b4c0 | ||
|
|
8315883db9 | ||
|
|
d22f9000d6 | ||
|
|
bb99cee48a | ||
|
|
a3805fe04d | ||
|
|
d4f1cb5d6a | ||
|
|
118bf5152c | ||
|
|
41244dc677 | ||
|
|
671e1aed9f | ||
|
|
1636508a6a | ||
|
|
c21db0ff6a | ||
|
|
a889b3a4be | ||
|
|
10c7fdb618 | ||
|
|
7be0a1a55f | ||
|
|
a98b2fabe0 | ||
|
|
7779b66972 | ||
|
|
7463c40c40 | ||
|
|
996221147e | ||
|
|
7cd9bcd3f5 | ||
|
|
fdc018d809 | ||
|
|
fa5cf665ce | ||
|
|
d6df6b444f | ||
|
|
78836389f0 | ||
|
|
fa4b88a504 | ||
|
|
1a374a1669 | ||
|
|
01ba1b8c03 | ||
|
|
f09a5aacae | ||
|
|
95d084d36d | ||
|
|
d35cd18745 | ||
|
|
4e493d7836 | ||
|
|
68b8cca540 | ||
|
|
c216405a81 | ||
|
|
aa2ec3b9c9 | ||
|
|
f13a00b2dd | ||
|
|
8781d03aa7 | ||
|
|
1266a2f753 | ||
|
|
23d2cf1718 | ||
|
|
d11031c694 | ||
|
|
916e976297 | ||
|
|
27a9313396 | ||
|
|
517d0158b6 | ||
|
|
a9e05aec7c | ||
|
|
9b3e43cb21 | ||
|
|
23fddf74b6 | ||
|
|
9b8de19fe6 | ||
|
|
1d8b8aad3b | ||
|
|
84c30580aa | ||
|
|
a5f25726cd | ||
|
|
7a6e047519 | ||
|
|
1e65ef0c1a | ||
|
|
2269bf0167 | ||
|
|
5526f8e3dc | ||
|
|
2781b8535c | ||
|
|
c3d9910e08 | ||
|
|
b9f6a5625f | ||
|
|
f4e78b0ea6 | ||
|
|
d93e944c07 | ||
|
|
6760533a10 | ||
|
|
85e65edb7d | ||
|
|
523390cd8e | ||
|
|
ea197eff5f | ||
|
|
d4938b7699 | ||
|
|
6ee6227b67 | ||
|
|
6f0ae8a5b8 | ||
|
|
c1b7f09530 | ||
|
|
9addde00e3 | ||
|
|
10f8a94399 | ||
|
|
631de20a8d | ||
|
|
66464fd807 | ||
|
|
0f5fe746e0 | ||
|
|
a7fc8621a8 | ||
|
|
8b92bc6c4a | ||
|
|
830b56ac9e | ||
|
|
fcfdbfc2b5 | ||
|
|
e575279738 | ||
|
|
796f7258cc | ||
|
|
ea88b040ec | ||
|
|
69b4d0d44b | ||
|
|
36d6ae33d1 | ||
|
|
8126087b3e | ||
|
|
780459d2bf | ||
|
|
e2b6d69596 | ||
|
|
7fff1e6fe5 | ||
|
|
b576ce72a1 | ||
|
|
99a01207bc | ||
|
|
6d6457ad18 | ||
|
|
35f3a42e7f | ||
|
|
a84ae88214 | ||
|
|
4fae42de51 | ||
|
|
1d55c04c21 | ||
|
|
7a54658710 | ||
|
|
bddc35bbc7 | ||
|
|
cdacd2a951 | ||
|
|
58e4d08bb0 | ||
|
|
3ff4fd814e | ||
|
|
91e8f57afb | ||
|
|
e3d0628a06 | ||
|
|
9fca9ca7ec | ||
|
|
2d09a40663 | ||
|
|
1eaf55c555 | ||
|
|
db535e6453 | ||
|
|
dadec9d3cb | ||
|
|
ff780177d0 | ||
|
|
b7e2ea1ca5 | ||
|
|
bf50134d94 | ||
|
|
227bac7c60 | ||
|
|
340ff82487 | ||
|
|
894665b067 | ||
|
|
48b7294ff1 | ||
|
|
cde8ff282d | ||
|
|
0b44a595e2 | ||
|
|
37781bd208 | ||
|
|
e0344e9251 | ||
|
|
a1808a54a4 | ||
|
|
1cef513f6c | ||
|
|
22908a12e9 | ||
|
|
57759aa4a3 | ||
|
|
d50148fab7 | ||
|
|
271c2ea3e3 | ||
|
|
20a6f6ac79 | ||
|
|
8924d5fa05 | ||
|
|
26637d934b | ||
|
|
dde4495e20 | ||
|
|
1278429518 | ||
|
|
421f5a03aa | ||
|
|
a433d5d59d | ||
|
|
934493bf5f | ||
|
|
58f97bc0e7 | ||
|
|
a5820e27a6 | ||
|
|
d312fe7c2b | ||
|
|
124fc73386 | ||
|
|
c78e7c14d3 | ||
|
|
30a6dc2f64 | ||
|
|
6ceb78fd4c | ||
|
|
e09ab79a1a | ||
|
|
b6587c00ce | ||
|
|
df2f6d4a7d | ||
|
|
3b69f07b86 | ||
|
|
fdc0036872 | ||
|
|
fab90ecbe5 | ||
|
|
f72d160249 | ||
|
|
b65404a8a9 | ||
|
|
42446cb87b | ||
|
|
f45e64c756 | ||
|
|
ae46cd33b6 | ||
|
|
61eb22f4f7 | ||
|
|
7c14b8d97b | ||
|
|
8d682041a4 | ||
|
|
75dae5fbe8 | ||
|
|
dc92e19f76 | ||
|
|
ce87e0dfa4 | ||
|
|
41efad4056 | ||
|
|
5f89226cd7 | ||
|
|
197dfca5b2 | ||
|
|
e6980626d8 | ||
|
|
ca44a654a5 | ||
|
|
48dc76a694 | ||
|
|
0c5eab680b | ||
|
|
3dc671395e | ||
|
|
ba1e6e91b9 | ||
|
|
22980cea7b | ||
|
|
ed0c19807a | ||
|
|
15005209d1 | ||
|
|
f64987d0c4 | ||
|
|
0da04232f3 | ||
|
|
8d53b46e82 | ||
|
|
9a0bb14e76 | ||
|
|
900825a2af | ||
|
|
52de50aa64 | ||
|
|
1541060091 | ||
|
|
50bc0caccf | ||
|
|
8f5b14ec84 | ||
|
|
da37db1ea9 | ||
|
|
5abde866f1 | ||
|
|
32eed72d2b | ||
|
|
585b5a221d | ||
|
|
db52fe475a | ||
|
|
57ad730f74 | ||
|
|
c5db99f383 | ||
|
|
fd6d3205d0 | ||
|
|
9548cf32ff | ||
|
|
bdbfff911b | ||
|
|
a143eca57d | ||
|
|
2101f714cc | ||
|
|
3edff89a4d | ||
|
|
f2079de2cb | ||
|
|
93527d892b | ||
|
|
b91218308b | ||
|
|
6170138124 | ||
|
|
1add5accf2 | ||
|
|
faba6c9bdc | ||
|
|
4eb7cd06b4 | ||
|
|
245cff887c | ||
|
|
59aba52b03 | ||
|
|
6d05a4117a | ||
|
|
49e5268d48 | ||
|
|
76445bd19c | ||
|
|
5a3e99626d | ||
|
|
ffc29d14a8 | ||
|
|
7cffa6ebcc | ||
|
|
342f1d31be | ||
|
|
b779bbfc9d | ||
|
|
ef6576bdd6 | ||
|
|
27dab262de | ||
|
|
f559ceeb7f | ||
|
|
e36ae4f0f7 | ||
|
|
412c1df15a | ||
|
|
73af3ba095 | ||
|
|
bbdeae0ed9 | ||
|
|
21b7564976 | ||
|
|
bf22b820bf | ||
|
|
efd5a73a18 | ||
|
|
a11abf87ec | ||
|
|
8cd24b1a67 | ||
|
|
28f7b411ed | ||
|
|
655bc49fad | ||
|
|
18c9ee2f9d | ||
|
|
07f2cdac58 | ||
|
|
06781beb81 | ||
|
|
cd29293dd6 | ||
|
|
1fdc7a9163 | ||
|
|
6807db4967 | ||
|
|
b0ea416d6d | ||
|
|
c515218760 | ||
|
|
8053ea0a22 | ||
|
|
a5603c9953 | ||
|
|
bffe63a233 | ||
|
|
2cfbfe473e | ||
|
|
3c78c100b5 | ||
|
|
2451b0a5b1 | ||
|
|
85e9438ff7 | ||
|
|
81610ba86e | ||
|
|
6423b386d2 | ||
|
|
5c48d116eb | ||
|
|
90257e9dee | ||
|
|
a740203444 | ||
|
|
25dc9cc14a | ||
|
|
d4d2af46ac | ||
|
|
64acfc3187 | ||
|
|
62a1d4b3e0 | ||
|
|
e6072a51f8 | ||
|
|
21e3159711 | ||
|
|
dadd8cb93a | ||
|
|
5f8af6ad66 | ||
|
|
3436905744 | ||
|
|
e3258bcf5a | ||
|
|
2b6e0405a5 | ||
|
|
7f752d9102 | ||
|
|
df430394b0 | ||
|
|
638d89e73b | ||
|
|
1ab51ca04e | ||
|
|
cb0386779c | ||
|
|
4dc428d75b | ||
|
|
e7496c8840 | ||
|
|
d6c272cfd6 | ||
|
|
da6ed8ea11 | ||
|
|
28de330b50 | ||
|
|
7823fa05ef | ||
|
|
fab4d95156 | ||
|
|
06cb7f35f1 | ||
|
|
796c5d785e | ||
|
|
c88db77814 | ||
|
|
6fe0f4cd7d | ||
|
|
3bf90c3c38 | ||
|
|
992f3535b7 | ||
|
|
06eacb5a5c | ||
|
|
c0152ce52f | ||
|
|
5a60224d77 | ||
|
|
c137fa2022 | ||
|
|
879d01a750 | ||
|
|
6db878743c | ||
|
|
08b90090f5 | ||
|
|
42466d5fc4 | ||
|
|
a3f172fc77 | ||
|
|
0953bba0a3 | ||
|
|
36d6dd1ca9 | ||
|
|
4863591bc8 | ||
|
|
c489501441 | ||
|
|
6638f560f8 | ||
|
|
a2fe23549b | ||
|
|
1a7438acfd | ||
|
|
b1de85a44f | ||
|
|
6604ebfd01 | ||
|
|
7872460162 | ||
|
|
d9696ae34c | ||
|
|
7c937bf8b8 | ||
|
|
4913d7ee39 | ||
|
|
2503a3e3ca | ||
|
|
538984c6d2 | ||
|
|
5f92ed492b | ||
|
|
bca0978434 | ||
|
|
e1f06ec862 | ||
|
|
a5c8bbf79e | ||
|
|
e8df373abf | ||
|
|
39b8eb0ae0 | ||
|
|
eb02f6137e | ||
|
|
90ee689d5a | ||
|
|
90558a2e80 | ||
|
|
b343035060 | ||
|
|
bcdd006dd5 | ||
|
|
92c4e5bfaf | ||
|
|
fdbdf26afc | ||
|
|
1aa295dc84 | ||
|
|
85b534a0b0 | ||
|
|
e728738e34 | ||
|
|
6bbf168cec | ||
|
|
aa85ae89c1 | ||
|
|
b5e4fdc3d8 | ||
|
|
90f91eeea4 | ||
|
|
ae0ae5fd4e | ||
|
|
5b7486cff8 | ||
|
|
14240318f1 | ||
|
|
18eb9ffae6 | ||
|
|
c0a62793c4 | ||
|
|
dd848d754f | ||
|
|
f058850598 | ||
|
|
0c7220016b | ||
|
|
8c19124717 | ||
|
|
46f4359e1f | ||
|
|
f80452c7d9 | ||
|
|
611f1b57dd | ||
|
|
d1b1a45725 | ||
|
|
6e38f7e532 | ||
|
|
2c1e681984 | ||
|
|
f11ad99983 | ||
|
|
e1ef911d40 | ||
|
|
b40afd1006 | ||
|
|
af01122f33 | ||
|
|
189e835499 | ||
|
|
1319b62acb | ||
|
|
9cf9f1bdba | ||
|
|
0bf1789464 | ||
|
|
fe6acf07a5 | ||
|
|
8e888b4435 | ||
|
|
47e99ecb54 | ||
|
|
3b80f67e4d | ||
|
|
71d3dc6e44 | ||
|
|
f111380674 | ||
|
|
d52105b3b8 | ||
|
|
a4ca585ef2 | ||
|
|
076461a1b6 | ||
|
|
0c7407ebb6 | ||
|
|
f13a3fa549 | ||
|
|
c0a65eb593 | ||
|
|
450a7730d3 | ||
|
|
41ee4b642f | ||
|
|
d42c59792f | ||
|
|
7c105019d8 | ||
|
|
ee566723d7 | ||
|
|
23a80770e1 | ||
|
|
10e6ae2094 | ||
|
|
e2286a4c48 | ||
|
|
3ee3c52e14 | ||
|
|
e76a5bfd85 | ||
|
|
59c89a3b9d | ||
|
|
272d6e7437 | ||
|
|
45e5c4eb46 | ||
|
|
d9b7c012a6 | ||
|
|
270288f730 | ||
|
|
1e55d064ab | ||
|
|
e796fd1e11 | ||
|
|
b0039e938e | ||
|
|
8fc605037a | ||
|
|
311ddf82c5 | ||
|
|
9d65486c64 | ||
|
|
624eda297f | ||
|
|
ccce7751a0 | ||
|
|
7252f0b490 | ||
|
|
094d2e586a | ||
|
|
6c1507c88c | ||
|
|
60f48326e1 | ||
|
|
26db326483 | ||
|
|
d816f797a4 | ||
|
|
0e827b6ae6 | ||
|
|
049acde5b0 | ||
|
|
733a9bb2e1 | ||
|
|
9ac769e4f8 | ||
|
|
2157f93f36 | ||
|
|
5b985a924b | ||
|
|
ee74989f74 | ||
|
|
3651ef53e3 | ||
|
|
e2fc7e8cd7 | ||
|
|
aff55881df | ||
|
|
4d066a075d | ||
|
|
201077b6f6 | ||
|
|
dae5c94be0 | ||
|
|
03ea257711 | ||
|
|
df95115e2e | ||
|
|
5fea012eab | ||
|
|
a2981870ce | ||
|
|
60e87cd496 | ||
|
|
ac1c0b0715 | ||
|
|
6575af6b93 | ||
|
|
0e95ca7b69 | ||
|
|
630ff2abb4 | ||
|
|
7611cfddae | ||
|
|
ef75f7e650 | ||
|
|
478eefb74c | ||
|
|
795134c084 | ||
|
|
4f689223b4 | ||
|
|
70ce7293ac | ||
|
|
94a0a3b568 | ||
|
|
69305f0509 | ||
|
|
24f48b11e6 | ||
|
|
ff3b48fa59 | ||
|
|
db3f478598 | ||
|
|
e20ac803f3 | ||
|
|
ea283365e7 | ||
|
|
8211830bd8 | ||
|
|
2a8e0f9404 | ||
|
|
c15cfc26f1 | ||
|
|
4f4e6938eb | ||
|
|
8545a547b9 | ||
|
|
3bb7184f28 | ||
|
|
74c4f12b27 | ||
|
|
5af18c2d8a | ||
|
|
d38620bad2 | ||
|
|
3621b1a0d0 | ||
|
|
4347f624d8 | ||
|
|
bfb1a82754 | ||
|
|
d1672f8818 | ||
|
|
353e132cf9 | ||
|
|
ccb3a75281 | ||
|
|
cf3ca5a661 | ||
|
|
e4eee1cdfc | ||
|
|
f4776731ec | ||
|
|
dd71942a5e | ||
|
|
19fdd5e151 | ||
|
|
f537dc632e | ||
|
|
2221006970 | ||
|
|
5d29c5958b | ||
|
|
0fe72376b1 | ||
|
|
64dd46c7e4 | ||
|
|
8df382d976 | ||
|
|
3a447d5515 | ||
|
|
75aa1c7b80 | ||
|
|
f1697c6856 | ||
|
|
3c1ea5d0fb | ||
|
|
59d3f5c4ea | ||
|
|
4a1b4e0485 | ||
|
|
083d1acb81 | ||
|
|
c5650bb278 | ||
|
|
a795b95f7e | ||
|
|
b67859832a | ||
|
|
eb00e20269 | ||
|
|
b797b08bcf | ||
|
|
e4abbfb2c6 | ||
|
|
28de9b8913 | ||
|
|
acc9ca7d7d | ||
|
|
497afcc1e4 | ||
|
|
571e9801f3 | ||
|
|
31c58409e1 | ||
|
|
5abfe821bc | ||
|
|
05d4c127ee | ||
|
|
1c94625042 | ||
|
|
a74ed33b0e | ||
|
|
e03593d86f | ||
|
|
3d6c2c5fef | ||
|
|
54834c47f8 | ||
|
|
d0bfd7e19a | ||
|
|
1a807416b8 | ||
|
|
5f8870d448 | ||
|
|
375a140343 | ||
|
|
7002319cc8 | ||
|
|
e6acae5f94 | ||
|
|
1a8f144f5c | ||
|
|
b7682ca9e8 | ||
|
|
196784474d | ||
|
|
d104544d6f | ||
|
|
dd55226455 | ||
|
|
047bed2a86 | ||
|
|
cdae0c2bef | ||
|
|
c7825e391c | ||
|
|
bf6345aa90 | ||
|
|
3fcae36cf1 | ||
|
|
69eb6b11d0 | ||
|
|
1f2d4fd2b3 | ||
|
|
21468fff25 | ||
|
|
4711b4d529 | ||
|
|
29d4859e02 | ||
|
|
4b81d86311 | ||
|
|
38963e7960 | ||
|
|
3e3880823b | ||
|
|
1584d51433 | ||
|
|
98571c62a6 | ||
|
|
69f525bfd3 | ||
|
|
2b31154834 | ||
|
|
b0948ea018 | ||
|
|
a50e4e3380 | ||
|
|
5564664b13 | ||
|
|
1ae5a2c808 | ||
|
|
0181a25d70 | ||
|
|
60ba4a9830 | ||
|
|
3802a78c9d | ||
|
|
0ca6d73614 | ||
|
|
aa77f8f0d2 | ||
|
|
7767692394 | ||
|
|
5077ff169e | ||
|
|
b21b6238cf | ||
|
|
cf89984c7a | ||
|
|
707aad234e | ||
|
|
5b851a2d09 | ||
|
|
bb5ded2039 | ||
|
|
381796e708 | ||
|
|
62fc7717c8 | ||
|
|
b07a7ba9bc | ||
|
|
97e7ef9a3f | ||
|
|
5cbc978cad | ||
|
|
e19451bb4f | ||
|
|
85f588e8c9 | ||
|
|
ea644868a6 | ||
|
|
d08accaaf1 | ||
|
|
f49272cacb | ||
|
|
c8713d94d8 | ||
|
|
be8fef0228 | ||
|
|
b584f09223 | ||
|
|
d2968c95df | ||
|
|
7421e5f7d7 | ||
|
|
0b2a43cfcc | ||
|
|
50309d3ab3 | ||
|
|
dd0b16bff5 | ||
|
|
d5443adc74 | ||
|
|
9152ba72f1 | ||
|
|
ff396b5953 | ||
|
|
21e0e6e495 | ||
|
|
72e17914e2 | ||
|
|
17aa37ae21 | ||
|
|
94c116617a | ||
|
|
aed23d61fc | ||
|
|
076ca46ab4 | ||
|
|
02519b270e | ||
|
|
5aa7dedccb | ||
|
|
6383dfa854 | ||
|
|
5a4fb0323b | ||
|
|
e84a282aa6 | ||
|
|
f732493473 | ||
|
|
f66a265fcf | ||
|
|
0f58faaddb | ||
|
|
f1472d218e | ||
|
|
d65c05aacd | ||
|
|
2b28ffa2f4 | ||
|
|
10ec31df3e | ||
|
|
184b1055dc | ||
|
|
447a5f01a9 | ||
|
|
eaec25e6c2 | ||
|
|
3e277de82d | ||
|
|
8b07fbc554 | ||
|
|
bff7400de4 | ||
|
|
1024adca72 | ||
|
|
ededa69e4a | ||
|
|
6d48ce4a25 | ||
|
|
00a8fd654e | ||
|
|
b63e29610e | ||
|
|
58f7eb319f | ||
|
|
453f2ab02d | ||
|
|
3002382edc | ||
|
|
bfc695434c | ||
|
|
1e80cc6db5 | ||
|
|
b0db5a8b0a | ||
|
|
d3e2241ff7 | ||
|
|
e90b9f6c19 | ||
|
|
4c1199e009 | ||
|
|
65471068b6 | ||
|
|
7aa1fabbd7 | ||
|
|
85c06372ff | ||
|
|
c6467a824b | ||
|
|
271b7adeb8 | ||
|
|
b1d1f3c6b2 | ||
|
|
574c2e2770 | ||
|
|
aec2d233c9 | ||
|
|
39418f2bbe | ||
|
|
ccda73494f | ||
|
|
443b4ccc57 | ||
|
|
88ac0f5d34 | ||
|
|
511aedd5db | ||
|
|
2524290099 | ||
|
|
01e8017265 | ||
|
|
8338fc405f | ||
|
|
0a22b3990f | ||
|
|
954d81147e | ||
|
|
fa1e28e860 | ||
|
|
662cafe416 | ||
|
|
ea961ba8f2 | ||
|
|
8c8774cd2f | ||
|
|
2fe02ddb1f | ||
|
|
e11e8a5d64 | ||
|
|
0978777eec | ||
|
|
79bebf7c9b | ||
|
|
8d3b660ce0 | ||
|
|
9de53fe070 | ||
|
|
ecb9fc65b7 | ||
|
|
7b25d0379f | ||
|
|
05d4176d34 | ||
|
|
7b0dff88ae | ||
|
|
1c7604e0fe | ||
|
|
e18dc43aae | ||
|
|
caaad684a4 | ||
|
|
cdd51aee75 | ||
|
|
51851f6c99 | ||
|
|
ab98aa489c | ||
|
|
5829985ca8 | ||
|
|
2fa8e27f05 | ||
|
|
68f92dfd5d | ||
|
|
67aeb380e7 | ||
|
|
f7d91b7139 | ||
|
|
b6e157f393 | ||
|
|
2319fce092 | ||
|
|
a5f1707662 | ||
|
|
6cda55da06 | ||
|
|
8e69961744 | ||
|
|
9f53497e39 | ||
|
|
ae3c871438 | ||
|
|
1edf80db8e | ||
|
|
791cc093f4 | ||
|
|
4c15f4a84f | ||
|
|
3bb485d0b8 | ||
|
|
c3f2fee633 | ||
|
|
1f575a2a47 | ||
|
|
13c4d13157 | ||
|
|
43fadab3bb | ||
|
|
82a0240d2e | ||
|
|
f2aa35d3d2 | ||
|
|
9c9fcaf42f | ||
|
|
146a51ceba | ||
|
|
b0350e9e96 | ||
|
|
e0126d971c | ||
|
|
b60ace80be | ||
|
|
b3ea007e0a | ||
|
|
a0d6cb1fd3 | ||
|
|
7b66dae2f0 | ||
|
|
35e346c4b9 | ||
|
|
3982f13569 | ||
|
|
21356b487a | ||
|
|
1987647cc3 | ||
|
|
e9910d1fe2 | ||
|
|
4c5a5c70b0 | ||
|
|
a0836b6876 | ||
|
|
e0319cc894 | ||
|
|
4075cc8518 | ||
|
|
8ca09ec07f | ||
|
|
ba85101d30 | ||
|
|
a237c01b4b | ||
|
|
99d5013de3 | ||
|
|
a58f1c6a7d | ||
|
|
a748083f26 | ||
|
|
6e9afccfd7 | ||
|
|
04fb5e544d | ||
|
|
542534aeba | ||
|
|
908a2824ba | ||
|
|
77dd684916 | ||
|
|
bffd22038b | ||
|
|
a03ae295f6 | ||
|
|
544d991e1e | ||
|
|
083fda3172 | ||
|
|
e0cfd5e49b | ||
|
|
2dd165bbef | ||
|
|
cab9733b60 | ||
|
|
99e0dcec76 | ||
|
|
9dafb36c88 | ||
|
|
3d7d19b608 | ||
|
|
d650d10cb2 | ||
|
|
7fe45018e9 | ||
|
|
4c4cab87fb | ||
|
|
94c7f64baf | ||
|
|
f369b5f588 | ||
|
|
37065b7c50 | ||
|
|
0a7372460f | ||
|
|
063abc8ef7 | ||
|
|
d64c88786e | ||
|
|
fb4511d099 | ||
|
|
7343ae7339 | ||
|
|
cb6342c874 | ||
|
|
01997efcbe | ||
|
|
7926225e9b | ||
|
|
1aafcf241f | ||
|
|
1eeac7f4f4 | ||
|
|
2c01e178c7 | ||
|
|
36d2422eef | ||
|
|
70f257b1ea | ||
|
|
275560698f | ||
|
|
d4b6fe14c3 | ||
|
|
f1350a1022 | ||
|
|
344fb638fd | ||
|
|
373cc74a33 | ||
|
|
8e95ac42c2 | ||
|
|
ceb941df81 | ||
|
|
d275538116 | ||
|
|
fa38cdbc0d | ||
|
|
7569544b7b | ||
|
|
853a52f3ca | ||
|
|
5e32c69e0e | ||
|
|
39a0b15df4 | ||
|
|
a0db10838b | ||
|
|
f2f10dff92 | ||
|
|
7ba45b2887 | ||
|
|
c91eb8f406 | ||
|
|
57a78b3cad | ||
|
|
b755c7dab3 | ||
|
|
9ffd791ae4 | ||
|
|
8af12b22bb | ||
|
|
17ba0a97d5 | ||
|
|
4ae2b4e0b9 | ||
|
|
872691a138 | ||
|
|
3a54ecb522 | ||
|
|
71b4641e18 | ||
|
|
42b590af77 | ||
|
|
b15ecf7649 | ||
|
|
df4f80e773 | ||
|
|
b8b485af4d | ||
|
|
892d6b55ec | ||
|
|
4a3bc8d365 | ||
|
|
e12da72615 | ||
|
|
f95e510060 | ||
|
|
82932ae7a5 | ||
|
|
ae55ca7fd7 | ||
|
|
d69a314bbf | ||
|
|
e35aa4bd1e | ||
|
|
eaa1165611 | ||
|
|
14fc37a8b8 | ||
|
|
7b23856cc8 | ||
|
|
85f9690377 | ||
|
|
4723500c5f | ||
|
|
2db82a73a5 | ||
|
|
b00eeb86ea | ||
|
|
628e186846 | ||
|
|
cf4a55bc2f | ||
|
|
ed6a160372 | ||
|
|
7dc4e00b4d | ||
|
|
e0d7511eaa | ||
|
|
7777922bef | ||
|
|
5bd223a468 | ||
|
|
7c60e3c0ff | ||
|
|
e529d7fd3b | ||
|
|
5f9f0e3ed3 | ||
|
|
e91a76c936 | ||
|
|
cab07c7c4b | ||
|
|
7735a539e9 | ||
|
|
68eb6fc3c1 | ||
|
|
1dd3d2ec48 | ||
|
|
ea6cdc9673 | ||
|
|
134742a8b7 | ||
|
|
d8be8e25a5 | ||
|
|
1902ecb8ca | ||
|
|
124302908a | ||
|
|
0d3b50a5e5 | ||
|
|
419f86a4a5 | ||
|
|
fd785fc9a5 | ||
|
|
8d06908353 | ||
|
|
806706ca1d | ||
|
|
28f577738a | ||
|
|
044e203eab | ||
|
|
fcc7207b67 | ||
|
|
8dbd3f332b | ||
|
|
f43ec7c05d | ||
|
|
997e88af00 | ||
|
|
ff9dde54e3 | ||
|
|
3699f16848 | ||
|
|
fee2ac2ebd | ||
|
|
57d3bfcfc9 | ||
|
|
b92e34556f | ||
|
|
b6ff55309e | ||
|
|
305d88ebda | ||
|
|
cdc73d4f56 | ||
|
|
0e50c964d5 | ||
|
|
863fb9aa47 | ||
|
|
298fb00a3e | ||
|
|
d1e8c06d36 | ||
|
|
8ed79d5973 | ||
|
|
85b10b59e4 | ||
|
|
9a53c22833 | ||
|
|
c981b5cba0 | ||
|
|
4ffa823ab8 | ||
|
|
001c7e4b18 | ||
|
|
402136dc8f | ||
|
|
59ee30f056 | ||
|
|
c795068a78 | ||
|
|
5ce080779b | ||
|
|
8d3b296eed | ||
|
|
cfdb985d00 | ||
|
|
af6f0db284 | ||
|
|
491eac184e | ||
|
|
414d33eb26 | ||
|
|
2dad35186a | ||
|
|
6dd6094088 | ||
|
|
2ec64a2ea2 | ||
|
|
5c34a75032 | ||
|
|
91f33d3289 | ||
|
|
c50dc1eb35 | ||
|
|
dc1331e736 | ||
|
|
afc866eee4 | ||
|
|
b6d93b7c5b | ||
|
|
5d6158dd64 | ||
|
|
f2f6edabf9 | ||
|
|
e9549ab0bd | ||
|
|
779249ff81 | ||
|
|
66d206a710 | ||
|
|
bfc1cab6df | ||
|
|
5b0c79629e | ||
|
|
7922d3909a | ||
|
|
ee6e2e0af1 | ||
|
|
326a6be91c | ||
|
|
58095e1916 | ||
|
|
3dae077b4d | ||
|
|
7c14c0812b | ||
|
|
3a05eda63a | ||
|
|
d850b3ac7e | ||
|
|
08de6c32c9 | ||
|
|
91fe158c26 | ||
|
|
661b3c4bfb | ||
|
|
35eabc0353 | ||
|
|
ef5bbdb1e2 | ||
|
|
88fae2171d | ||
|
|
7d99e15dc3 | ||
|
|
d2d2978288 | ||
|
|
8680981990 | ||
|
|
78ca6f1a87 | ||
|
|
62e5680eaf | ||
|
|
de698154cd | ||
|
|
1df05715c2 | ||
|
|
e5524da40e | ||
|
|
50d393e0f9 | ||
|
|
cd08836f3e | ||
|
|
45ac1cfd54 | ||
|
|
dda11ec69e | ||
|
|
7be6206d9d | ||
|
|
4d896573b1 | ||
|
|
988383648c | ||
|
|
d59847537d | ||
|
|
36859d89c8 | ||
|
|
cc50e22928 | ||
|
|
13414dcd25 | ||
|
|
ba8b593351 | ||
|
|
aebfccfd4b | ||
|
|
5a59f2352c | ||
|
|
5164b78da1 | ||
|
|
5561b46a59 | ||
|
|
26b2431cbf | ||
|
|
029605f926 | ||
|
|
0cd173f9df | ||
|
|
414810bdf5 | ||
|
|
f94c1e91ea | ||
|
|
b7129e1456 | ||
|
|
dc6decd404 | ||
|
|
40c6b172f7 | ||
|
|
7cb9cedfe1 | ||
|
|
b43980d660 | ||
|
|
09b612546b | ||
|
|
a99d14c13f | ||
|
|
68f322a03b | ||
|
|
97f0414ff3 | ||
|
|
d5f308d9c9 | ||
|
|
1377eda0ba | ||
|
|
70259b0d04 | ||
|
|
f1466d6da3 | ||
|
|
ca07a88674 | ||
|
|
83010e278c | ||
|
|
dcfd332cbf | ||
|
|
dc3040550d | ||
|
|
3b25db919a | ||
|
|
09f038f997 | ||
|
|
bbdd3804c7 | ||
|
|
a0b9ac7bcc | ||
|
|
8bb0cba949 | ||
|
|
870aa3a265 | ||
|
|
86ada33577 | ||
|
|
038d7e0fa6 | ||
|
|
b7c9ca720a | ||
|
|
7072f207c0 | ||
|
|
5f59f458f4 | ||
|
|
b6fe613329 | ||
|
|
cd128e557c | ||
|
|
30a5c70260 | ||
|
|
beca978af5 | ||
|
|
98a830a6a0 | ||
|
|
ed2231e34b | ||
|
|
55049bb303 | ||
|
|
c210c6937b | ||
|
|
d2767f39f0 | ||
|
|
1c9d39d3e6 | ||
|
|
f16c6d81cf | ||
|
|
9a45547cda | ||
|
|
a000ded350 | ||
|
|
424ac29131 | ||
|
|
b7b5a5788f | ||
|
|
9de179cba8 | ||
|
|
6f7fbf7686 | ||
|
|
80048bfa2b | ||
|
|
641a9bc6c5 | ||
|
|
0edf9b17f6 | ||
|
|
500f213c6b | ||
|
|
cede27b5fe | ||
|
|
d529c1b5b3 | ||
|
|
834f68e6e4 | ||
|
|
83b2102705 | ||
|
|
34f24de3e4 | ||
|
|
f93d6813a9 | ||
|
|
c0653da736 | ||
|
|
f3d8f1b1fb | ||
|
|
d2391b9c63 | ||
|
|
f8e44c09eb | ||
|
|
2a00519b93 | ||
|
|
3292a2aecc | ||
|
|
17fd6e692e | ||
|
|
2ce8ef5704 | ||
|
|
f7d0db9cd2 | ||
|
|
fab1d3651b | ||
|
|
cf80c1a506 | ||
|
|
4649ab2d85 | ||
|
|
2fd526b359 | ||
|
|
2826f27153 | ||
|
|
83ac869693 | ||
|
|
bc92f9221a | ||
|
|
c2f85a2877 | ||
|
|
0bbd186635 | ||
|
|
806dcd74ec | ||
|
|
93772e7265 | ||
|
|
9094f07290 | ||
|
|
0aae155c80 | ||
|
|
54233aba1b | ||
|
|
bd3d2c60d9 | ||
|
|
2e75a111ed | ||
|
|
e4b0359b8e | ||
|
|
803e0bfe72 | ||
|
|
a5024a65a0 | ||
|
|
734a00237a | ||
|
|
06f1d15283 | ||
|
|
ff3edc9889 | ||
|
|
519884d167 | ||
|
|
3f0a98acbd | ||
|
|
c023e5f518 | ||
|
|
67c73768c1 | ||
|
|
bbb98083eb | ||
|
|
8bb9f4b8a2 | ||
|
|
96cde7d4af | ||
|
|
ea39c8a4c1 | ||
|
|
7a55832a22 | ||
|
|
7a97d5d4eb | ||
|
|
8305f6d1f5 | ||
|
|
dcececf9c0 | ||
|
|
839afe5ac0 | ||
|
|
c72f25c693 | ||
|
|
5fc373f5cc | ||
|
|
cf9eaf2eff | ||
|
|
04d145d6d8 | ||
|
|
76d73abd81 | ||
|
|
0ec0185d84 | ||
|
|
2c2e37e9f0 | ||
|
|
25957bfae3 | ||
|
|
db2d71ed9e | ||
|
|
18080a969e | ||
|
|
412430e1c3 | ||
|
|
131e433880 | ||
|
|
264652f2c3 | ||
|
|
2cb53a0f7e | ||
|
|
7625a2dd3c | ||
|
|
93da5a39be | ||
|
|
aeb4996ac2 | ||
|
|
330c498fe4 | ||
|
|
5d0a7cb307 | ||
|
|
8c27ff3859 | ||
|
|
736d6cb675 | ||
|
|
200aca470b | ||
|
|
b2dc6c5d3d | ||
|
|
f48d7aedce | ||
|
|
bb4f3e1789 | ||
|
|
e0230ed104 | ||
|
|
704fdf9ccd | ||
|
|
339776c139 | ||
|
|
87e07e731d | ||
|
|
3991115ae5 | ||
|
|
a30e7bf34f | ||
|
|
43b983054a | ||
|
|
d3364ef4d1 | ||
|
|
4099dd3a05 | ||
|
|
f420435b82 | ||
|
|
696fe7bc0d | ||
|
|
7c147db324 | ||
|
|
32205045ba | ||
|
|
1ce9192369 | ||
|
|
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 | ||
|
|
70f71e0f57 | ||
|
|
77bd26d17f | ||
|
|
4cdc2601f5 | ||
|
|
ff5c274048 | ||
|
|
561e06e7f0 | ||
|
|
626a446c3d | ||
|
|
26d2da7b98 | ||
|
|
66ed39b4b7 | ||
|
|
fbf91dda7d | ||
|
|
41ff1d0fc9 | ||
|
|
64d8512fc3 | ||
|
|
94804fecd8 | ||
|
|
559dc2f865 | ||
|
|
7c0f32e8ee | ||
|
|
82243732a1 | ||
|
|
61d2158f76 | ||
|
|
68081fb9a2 | ||
|
|
8276933dbb | ||
|
|
0d84338e28 | ||
|
|
2423e0872f | ||
|
|
35c967e6f7 | ||
|
|
b92de63245 | ||
|
|
8b529abfe1 | ||
|
|
a01068949c | ||
|
|
78ecc8673c | ||
|
|
7e26d92190 | ||
|
|
dbe2f8a6f1 | ||
|
|
e96f5447f4 | ||
|
|
5193fa6483 | ||
|
|
e1e2c76ae1 | ||
|
|
a3e7cab935 | ||
|
|
c06b3374ce | ||
|
|
6f66138a18 | ||
|
|
334c97035e | ||
|
|
1c6a84659c | ||
|
|
3a3ed8bf64 | ||
|
|
001ab1d067 | ||
|
|
4932e4f8c6 | ||
|
|
6f05f17c62 | ||
|
|
cfb3897047 | ||
|
|
8c058dcd45 | ||
|
|
7b70129974 | ||
|
|
6a4becfb46 | ||
|
|
4a7159389e | ||
|
|
a66501250e | ||
|
|
efb41b7433 | ||
|
|
f04dc55030 | ||
|
|
38bc5de3e8 | ||
|
|
7c56b21095 | ||
|
|
8d0ed99bcd | ||
|
|
8375995680 | ||
|
|
0afd3e6189 | ||
|
|
ba7361bdc7 | ||
|
|
554b44b9f2 | ||
|
|
b44a5ea609 | ||
|
|
487d67768b | ||
|
|
f485a47b48 | ||
|
|
faf1e6a43d | ||
|
|
f193f0d3f9 | ||
|
|
2e78568d4d | ||
|
|
0c72c20d2a | ||
|
|
717fd760df | ||
|
|
075f4907ef | ||
|
|
b7317bfe29 | ||
|
|
01d3c062f2 | ||
|
|
6af5a884cd | ||
|
|
6015c47587 | ||
|
|
33ea8763d5 | ||
|
|
2c2c2e9060 | ||
|
|
64dad7dbd2 | ||
|
|
176bd2396b | ||
|
|
909b83c537 | ||
|
|
fb9da87abb | ||
|
|
bdf359470e | ||
|
|
4c475c1b33 | ||
|
|
438b4b4758 | ||
|
|
01f791a44e | ||
|
|
43f2d4a331 | ||
|
|
95ed07a95e | ||
|
|
ec0560a2c5 | ||
|
|
ac2cd552b9 | ||
|
|
1c73bd5079 | ||
|
|
138af27bf7 | ||
|
|
445e16f668 | ||
|
|
90e9f34494 | ||
|
|
5271680483 | ||
|
|
38f6d22d2d | ||
|
|
8b80b0c3df | ||
|
|
8e1535f7ec | ||
|
|
3e7922e41e | ||
|
|
5a6190e321 | ||
|
|
18c3bb673f | ||
|
|
6463fd902c | ||
|
|
ca59cd1eb8 | ||
|
|
9c8432cf13 | ||
|
|
86aed4e073 |
4
.github/ISSUE_TEMPLATE/bug_report.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: v3.0.11
|
placeholder: v3.2.2
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
@@ -22,9 +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.7"
|
|
||||||
- "3.8"
|
- "3.8"
|
||||||
- "3.9"
|
- "3.9"
|
||||||
|
- "3.10"
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
|
|||||||
2
.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: v3.0.11
|
placeholder: v3.2.2
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
|
|||||||
25
.github/workflows/ci.yml
vendored
@@ -3,10 +3,12 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
NETBOX_CONFIGURATION: netbox.configuration_testing
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: [3.7, 3.8, 3.9]
|
python-version: ['3.8', '3.9', '3.10']
|
||||||
node-version: [14.x]
|
node-version: ['14.x']
|
||||||
services:
|
services:
|
||||||
redis:
|
redis:
|
||||||
image: redis
|
image: redis
|
||||||
@@ -39,13 +41,24 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
|
- name: Install Yarn Package Manager
|
||||||
|
run: npm install -g yarn
|
||||||
|
|
||||||
|
- name: Setup Node.js with Yarn Caching
|
||||||
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: yarn
|
||||||
|
cache-dependency-path: netbox/project-static/yarn.lock
|
||||||
|
|
||||||
|
- name: Install Frontend Dependencies
|
||||||
|
run: yarn --cwd netbox/project-static
|
||||||
|
|
||||||
- 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 tblib
|
||||||
ln -s configuration.testing.py netbox/netbox/configuration.py
|
|
||||||
yarn --cwd netbox/project-static
|
|
||||||
|
|
||||||
- name: Build documentation
|
- name: Build documentation
|
||||||
run: mkdocs build
|
run: mkdocs build
|
||||||
@@ -63,7 +76,7 @@ jobs:
|
|||||||
run: scripts/verify-bundles.sh
|
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/ --parallel
|
||||||
|
|
||||||
- name: Show coverage report
|
- name: Show coverage report
|
||||||
run: coverage report --skip-covered --omit *migrations*
|
run: coverage report --skip-covered --omit *migrations*
|
||||||
|
|||||||
1
.gitignore
vendored
@@ -8,6 +8,7 @@ yarn-error.log*
|
|||||||
!/netbox/project-static/docs/.info
|
!/netbox/project-static/docs/.info
|
||||||
/netbox/netbox/configuration.py
|
/netbox/netbox/configuration.py
|
||||||
/netbox/netbox/ldap_config.py
|
/netbox/netbox/ldap_config.py
|
||||||
|
/netbox/local/*
|
||||||
/netbox/reports/*
|
/netbox/reports/*
|
||||||
!/netbox/reports/__init__.py
|
!/netbox/reports/__init__.py
|
||||||
/netbox/scripts/*
|
/netbox/scripts/*
|
||||||
|
|||||||
10
.readthedocs.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
version: 2
|
||||||
|
build:
|
||||||
|
os: ubuntu-20.04
|
||||||
|
tools:
|
||||||
|
python: "3.9"
|
||||||
|
mkdocs:
|
||||||
|
configuration: mkdocs.yml
|
||||||
|
python:
|
||||||
|
install:
|
||||||
|
- requirements: requirements.txt
|
||||||
@@ -1 +1 @@
|
|||||||
The changelog has been moved to the [project release notes](https://netbox.readthedocs.io/en/stable/release-notes/).
|
The changelog has been moved to the [project release notes](https://docs.netbox.dev/en/stable/release-notes/).
|
||||||
|
|||||||
@@ -16,13 +16,6 @@ categories for discussions:
|
|||||||
feature request
|
feature request
|
||||||
* **Q&A** - Request help with installing or using NetBox
|
* **Q&A** - Request help with installing or using NetBox
|
||||||
|
|
||||||
### Mailing List
|
|
||||||
|
|
||||||
We also have a Google Groups [mailing list](https://groups.google.com/g/netbox-discuss)
|
|
||||||
for general discussion, however we're encouraging people to use GitHub
|
|
||||||
discussions where possible, as it's much easier for newcomers to review past
|
|
||||||
discussions.
|
|
||||||
|
|
||||||
### Slack
|
### Slack
|
||||||
|
|
||||||
For real-time chat, you can join the **#netbox** Slack channel on [NetDev Community](https://netdev.chat/).
|
For real-time chat, you can join the **#netbox** Slack channel on [NetDev Community](https://netdev.chat/).
|
||||||
@@ -106,7 +99,7 @@ appropriate labels will be applied for categorization.
|
|||||||
## Submitting Pull Requests
|
## Submitting Pull Requests
|
||||||
|
|
||||||
* If you're interested in contributing to NetBox, be sure to check out our
|
* If you're interested in contributing to NetBox, be sure to check out our
|
||||||
[getting started](https://netbox.readthedocs.io/en/stable/development/getting-started/)
|
[getting started](https://docs.netbox.dev/en/stable/development/getting-started/)
|
||||||
documentation for tips on setting up your development environment.
|
documentation for tips on setting up your development environment.
|
||||||
|
|
||||||
* Be sure to open an issue **before** starting work on a pull request, and
|
* Be sure to open an issue **before** starting work on a pull request, and
|
||||||
@@ -178,7 +171,7 @@ an effort to circumvent the bot: Doing so will not remove the stale label.
|
|||||||
the understanding that all contributions are submitted under the Apache 2.0
|
the understanding that all contributions are submitted under the Apache 2.0
|
||||||
license and that your employer may not make claim to any contributions.
|
license and that your employer may not make claim to any contributions.
|
||||||
Contributions include code work, issue management, and community support. All
|
Contributions include code work, issue management, and community support. All
|
||||||
development must be in accordance with our [development guidance](https://netbox.readthedocs.io/en/stable/development/).
|
development must be in accordance with our [development guidance](https://docs.netbox.dev/en/stable/development/).
|
||||||
|
|
||||||
* Maintainers are expected to attend (where feasible) our biweekly ~30-minute
|
* Maintainers are expected to attend (where feasible) our biweekly ~30-minute
|
||||||
sync to review agenda items. This meeting provides opportunity to present and
|
sync to review agenda items. This meeting provides opportunity to present and
|
||||||
|
|||||||
42
README.md
@@ -5,16 +5,51 @@
|
|||||||

|

|
||||||
|
|
||||||
NetBox is an infrastructure resource modeling (IRM) tool designed to empower
|
NetBox is an infrastructure resource modeling (IRM) tool designed to empower
|
||||||
network automation. Initially conceived by the network engineering team at
|
network automation, used by thousands of organizations around the world.
|
||||||
|
Initially conceived by the network engineering team at
|
||||||
[DigitalOcean](https://www.digitalocean.com/), NetBox was developed specifically
|
[DigitalOcean](https://www.digitalocean.com/), NetBox was developed specifically
|
||||||
to address the needs of network and infrastructure engineers. It is intended to
|
to address the needs of network and infrastructure engineers. It is intended to
|
||||||
function as a domain-specific source of truth for network operations.
|
function as a domain-specific source of truth for network operations.
|
||||||
|
|
||||||
|
Myriad infrastructure components can be modeled in NetBox, including:
|
||||||
|
|
||||||
|
* Hierarchical regions, site groups, sites, and locations
|
||||||
|
* Racks, devices, and device components
|
||||||
|
* Cables and wireless connections
|
||||||
|
* Power distribution
|
||||||
|
* Data circuits and providers
|
||||||
|
* Virtual machines and clusters
|
||||||
|
* IP prefixes, ranges, and addresses
|
||||||
|
* VRFs and route targets
|
||||||
|
* FHRP groups (VRRP, HSRP, etc.)
|
||||||
|
* AS numbers
|
||||||
|
* VLANs and scoped VLAN groups
|
||||||
|
* Organizational tenants and contacts
|
||||||
|
|
||||||
|
In addition to its extensive built-in models and functionality, NetBox can be
|
||||||
|
customized and extended through the use of:
|
||||||
|
|
||||||
|
* Custom fields
|
||||||
|
* Custom links
|
||||||
|
* Configuration contexts
|
||||||
|
* Custom model validation rules
|
||||||
|
* Reports
|
||||||
|
* Custom scripts
|
||||||
|
* Export templates
|
||||||
|
* Conditional webhooks
|
||||||
|
* Plugins
|
||||||
|
* Single sign-on (SSO) authentication
|
||||||
|
* NAPALM integration
|
||||||
|
* Detailed change logging
|
||||||
|
|
||||||
|
NetBox also features a complete REST API as well as a GraphQL API for easily
|
||||||
|
integrating with other tools and systems.
|
||||||
|
|
||||||
NetBox runs as a web application atop the [Django](https://www.djangoproject.com/)
|
NetBox runs as a web application atop the [Django](https://www.djangoproject.com/)
|
||||||
Python framework with a [PostgreSQL](https://www.postgresql.org/) database. For a
|
Python framework with a [PostgreSQL](https://www.postgresql.org/) database. For a
|
||||||
complete list of requirements, see `requirements.txt`. The code is available [on GitHub](https://github.com/netbox-community/netbox).
|
complete list of requirements, see `requirements.txt`. The code is available [on GitHub](https://github.com/netbox-community/netbox).
|
||||||
|
|
||||||
The complete documentation for NetBox can be found at [Read the Docs](https://netbox.readthedocs.io/en/stable/). A public demo instance is available at https://demo.netbox.dev.
|
The complete documentation for NetBox can be found at [docs.netbox.dev](https://docs.netbox.dev/). A public demo instance is available at https://demo.netbox.dev.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<h4>Thank you to our sponsors!</h4>
|
<h4>Thank you to our sponsors!</h4>
|
||||||
@@ -33,11 +68,10 @@ The complete documentation for NetBox can be found at [Read the Docs](https://ne
|
|||||||
|
|
||||||
* [GitHub Discussions](https://github.com/netbox-community/netbox/discussions) - Discussion forum hosted by GitHub; ideal for Q&A and other structured discussions
|
* [GitHub Discussions](https://github.com/netbox-community/netbox/discussions) - Discussion forum hosted by GitHub; ideal for Q&A and other structured discussions
|
||||||
* [Slack](https://netdev.chat/) - Real-time chat hosted by the NetDev Community; best for unstructured discussion or just hanging out
|
* [Slack](https://netdev.chat/) - Real-time chat hosted by the NetDev Community; best for unstructured discussion or just hanging out
|
||||||
* [Google Group](https://groups.google.com/g/netbox-discuss) - Legacy mailing list; slowly being replaced by GitHub discussions
|
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
Please see [the documentation](https://netbox.readthedocs.io/en/stable/) for
|
Please see [the documentation](https://docs.netbox.dev/) for
|
||||||
instructions on installing NetBox. To upgrade NetBox, please download the
|
instructions on installing NetBox. To upgrade NetBox, please download the
|
||||||
[latest release](https://github.com/netbox-community/netbox/releases) and
|
[latest release](https://github.com/netbox-community/netbox/releases) and
|
||||||
run `upgrade.sh`.
|
run `upgrade.sh`.
|
||||||
|
|||||||
@@ -82,8 +82,12 @@ markdown-include
|
|||||||
# https://github.com/squidfunk/mkdocs-material
|
# https://github.com/squidfunk/mkdocs-material
|
||||||
mkdocs-material
|
mkdocs-material
|
||||||
|
|
||||||
|
# Introspection for embedded code
|
||||||
|
# https://github.com/mkdocstrings/mkdocstrings
|
||||||
|
mkdocstrings[python-legacy]
|
||||||
|
|
||||||
# Library for manipulating IP prefixes and addresses
|
# Library for manipulating IP prefixes and addresses
|
||||||
# https://github.com/drkjam/netaddr
|
# https://github.com/netaddr/netaddr
|
||||||
netaddr
|
netaddr
|
||||||
|
|
||||||
# Fork of PIL (Python Imaging Library) for image processing
|
# Fork of PIL (Python Imaging Library) for image processing
|
||||||
@@ -98,9 +102,13 @@ psycopg2-binary
|
|||||||
# https://github.com/yaml/pyyaml
|
# https://github.com/yaml/pyyaml
|
||||||
PyYAML
|
PyYAML
|
||||||
|
|
||||||
# In-memory key/value store used for caching and queuing
|
# Social authentication framework
|
||||||
# https://github.com/andymccurdy/redis-py
|
# https://github.com/python-social-auth/social-core
|
||||||
redis
|
social-auth-core
|
||||||
|
|
||||||
|
# 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
|
||||||
@@ -109,3 +117,7 @@ svgwrite
|
|||||||
# Tabular dataset library (for table-based exports)
|
# Tabular dataset library (for table-based exports)
|
||||||
# https://github.com/jazzband/tablib
|
# https://github.com/jazzband/tablib
|
||||||
tablib
|
tablib
|
||||||
|
|
||||||
|
# Timezone data (required by django-timezone-field on Python 3.9+)
|
||||||
|
# https://github.com/python/tzdata
|
||||||
|
tzdata
|
||||||
|
|||||||
0
contrib/netbox-housekeeping.sh
Normal file → Executable file
@@ -1,6 +1,6 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=NetBox Request Queue Worker
|
Description=NetBox Request Queue Worker
|
||||||
Documentation=https://netbox.readthedocs.io/en/stable/
|
Documentation=https://docs.netbox.dev/
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
Wants=network-online.target
|
Wants=network-online.target
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=NetBox WSGI Service
|
Description=NetBox WSGI Service
|
||||||
Documentation=https://netbox.readthedocs.io/en/stable/
|
Documentation=https://docs.netbox.dev/
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
Wants=network-online.target
|
Wants=network-online.target
|
||||||
|
|
||||||
|
|||||||
@@ -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" \
|
||||||
|
|||||||
@@ -1,5 +1,22 @@
|
|||||||
{!models/extras/webhook.md!}
|
{!models/extras/webhook.md!}
|
||||||
|
|
||||||
|
## 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
|
||||||
|
{
|
||||||
|
"and": [
|
||||||
|
{
|
||||||
|
"attr": "status.value",
|
||||||
|
"value": "active"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more detail, see the reference documentation for NetBox's [conditional logic](../reference/conditions.md).
|
||||||
|
|
||||||
## Webhook Processing
|
## Webhook Processing
|
||||||
|
|
||||||
When a change is detected, any resulting webhooks are placed into a Redis queue for processing. This allows the user's request to complete without needing to wait for the outgoing webhook(s) to be processed. The webhooks are then extracted from the queue by the `rqworker` process and HTTP requests are sent to their respective destinations. The current webhook queue and any failed webhooks can be inspected in the admin UI under System > Background Tasks.
|
When a change is detected, any resulting webhooks are placed into a Redis queue for processing. This allows the user's request to complete without needing to wait for the outgoing webhook(s) to be processed. The webhooks are then extracted from the queue by the `rqworker` process and HTTP requests are sent to their respective destinations. The current webhook queue and any failed webhooks can be inspected in the admin UI under System > Background Tasks.
|
||||||
|
|||||||
88
docs/administration/authentication/microsoft-azure-ad.md
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
# Microsoft Azure AD
|
||||||
|
|
||||||
|
This guide explains how to configure single sign-on (SSO) support for NetBox using [Microsoft Azure Active Directory (AD)](https://azure.microsoft.com/en-us/services/active-directory/) as an authentication backend.
|
||||||
|
|
||||||
|
## Azure AD Configuration
|
||||||
|
|
||||||
|
### 1. Create a test user (optional)
|
||||||
|
|
||||||
|
Create a new user in AD to be used for testing. You can skip this step if you already have a suitable account created.
|
||||||
|
|
||||||
|
### 2. Create an app registration
|
||||||
|
|
||||||
|
Under the Azure Active Directory dashboard, navigate to **Add > App registration**.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Enter a name for the registration (e.g. "NetBox") and ensure that the "single tenant" option is selected.
|
||||||
|
|
||||||
|
Under "Redirect URI", select "Web" for the platform and enter the path to your NetBox installation, ending with `/oauth/complete/azuread-oauth2/`. Note that this URI **must** begin with `https://` unless you are referencing localhost (for development purposes).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Once finished, make note of the application (client) ID; this will be used when configuring NetBox.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
!!! tip "Multitenant authentication"
|
||||||
|
NetBox also supports multitenant authentication via Azure AD, however it requires a different backend and an additional configuration parameter. Please see the [`python-social-auth` documentation](https://python-social-auth.readthedocs.io/en/latest/backends/azuread.html#tenant-support) for details concerning multitenant authentication.
|
||||||
|
|
||||||
|
### 3. Create a secret
|
||||||
|
|
||||||
|
When viewing the newly-created app registration, click the "Add a certificate or secret" link under "Client credentials". Under the "Client secrets" tab, click the "New client secret" button.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You can optionally specify a description and select a lifetime for the secret.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Once finished, make note of the secret value (not the secret ID); this will be used when configuring NetBox.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## NetBox Configuration
|
||||||
|
|
||||||
|
### 1. Enter configuration parameters
|
||||||
|
|
||||||
|
Enter the following configuration parameters in `configuration.py`, substituting your own values:
|
||||||
|
|
||||||
|
```python
|
||||||
|
REMOTE_AUTH_BACKEND = 'social_core.backends.azuread.AzureADOAuth2'
|
||||||
|
SOCIAL_AUTH_AZUREAD_OAUTH2_KEY = '{APPLICATION_ID}'
|
||||||
|
SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET = '{SECRET_VALUE}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Restart NetBox
|
||||||
|
|
||||||
|
Restart the NetBox services so that the new configuration takes effect. This is typically done with the command below:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
sudo systemctl restart netbox
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Log out of NetBox if already authenticated, and click the "Log In" button at top right. You should see the normal login form as well as an option to authenticate using Azure AD. Click that link.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You should be redirected to Microsoft's authentication portal. Enter the username/email and password of your test account to continue. You may also be prompted to grant this application access to your account.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
If successful, you will be redirected back to the NetBox UI, and will be logged in as the AD user. You can verify this by navigating to your profile (using the button at top right).
|
||||||
|
|
||||||
|
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Redirect URI does not Match
|
||||||
|
|
||||||
|
Azure requires that the authenticating client request a redirect URI that matches what you've configured for the app in step two. This URI **must** begin with `https://` (unless using `localhost` for the domain).
|
||||||
|
|
||||||
|
If Azure complains that the requested URI starts with `http://` (not HTTPS), it's likely that your HTTP server is misconfigured or sitting behind a load balancer, so NetBox is not aware that HTTPS is being use. To force the use of an HTTPS redirect URI, set `SOCIAL_AUTH_REDIRECT_IS_HTTPS = True` in `configuration.py` per the [python-social-auth docs](https://python-social-auth.readthedocs.io/en/latest/configuration/settings.html#processing-redirects-and-urlopen).
|
||||||
|
|
||||||
|
### Not Logged in After Authenticating
|
||||||
|
|
||||||
|
If you are redirected to the NetBox UI after authenticating successfully, but are _not_ logged in, double-check the configured backend and app registration. The instructions in this guide pertain only to the `azuread.AzureADOAuth2` backend using a single-tenant app registration.
|
||||||
70
docs/administration/authentication/okta.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# Okta
|
||||||
|
|
||||||
|
This guide explains how to configure single sign-on (SSO) support for NetBox using [Okta](https://www.okta.com/) as an authentication backend.
|
||||||
|
|
||||||
|
## Okta Configuration
|
||||||
|
|
||||||
|
!!! tip "Okta developer account"
|
||||||
|
Okta offers free developer accounts at <https://developer.okta.com/>.
|
||||||
|
|
||||||
|
### 1. Create a test user (optional)
|
||||||
|
|
||||||
|
Create a new user in the Okta admin portal to be used for testing. You can skip this step if you already have a suitable account created.
|
||||||
|
|
||||||
|
### 2. Create an app registration
|
||||||
|
|
||||||
|
Within the Okta administration dashboard, navigate to **Applications > Applications**, and click the "Create App Integration" button. Select "OIDC" as the sign-in method, and "Web application" for the application type.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
On the next page, give the app integration a name (e.g. "NetBox") and specify the sign-in and sign-out URIs. These URIs should follow the formats below:
|
||||||
|
|
||||||
|
* Sign-in URI: `https://{netbox}/oauth/complete/okta-openidconnect/`
|
||||||
|
* Sign-out URI: `https://{netbox}/oauth/disconnect/okta-openidconnect/`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Under "Assignments," select the controlled access setting most appropriate for your organization. Click "Save" to complete the creation.
|
||||||
|
|
||||||
|
Once finished, note the following parameters. These will be used to configured NetBox.
|
||||||
|
|
||||||
|
* Client ID
|
||||||
|
* Client secret
|
||||||
|
* Okta domain
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## NetBox Configuration
|
||||||
|
|
||||||
|
### 1. Enter configuration parameters
|
||||||
|
|
||||||
|
Enter the following configuration parameters in `configuration.py`, substituting your own values:
|
||||||
|
|
||||||
|
```python
|
||||||
|
REMOTE_AUTH_BACKEND = 'social_core.backends.okta_openidconnect.OktaOpenIdConnect'
|
||||||
|
SOCIAL_AUTH_OKTA_OPENIDCONNECT_KEY = '{Client ID}'
|
||||||
|
SOCIAL_AUTH_OKTA_OPENIDCONNECT_SECRET = '{Client secret}'
|
||||||
|
SOCIAL_AUTH_OKTA_OPENIDCONNECT_API_URL = 'https://{Okta domain}/oauth2/'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Restart NetBox
|
||||||
|
|
||||||
|
Restart the NetBox services so that the new configuration takes effect. This is typically done with the command below:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
sudo systemctl restart netbox
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Log out of NetBox if already authenticated, and click the "Log In" button at top right. You should see the normal login form as well as an option to authenticate using Okta. Click that link.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You should be redirected to Okta's authentication portal. Enter the username/email and password of your test account to continue. You may also be prompted to grant this application access to your account.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
If successful, you will be redirected back to the NetBox UI, and will be logged in as the Okta user. You can verify this by navigating to your profile (using the button at top right).
|
||||||
|
|
||||||
|
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI.
|
||||||
37
docs/administration/authentication/overview.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.
|
||||||
@@ -3,7 +3,8 @@
|
|||||||
NetBox includes a `housekeeping` management command that should be run nightly. This command handles:
|
NetBox includes a `housekeeping` management command that should be run nightly. This command handles:
|
||||||
|
|
||||||
* Clearing expired authentication sessions from the database
|
* Clearing expired authentication sessions from the database
|
||||||
* Deleting changelog records older than the configured [retention time](../configuration/optional-settings.md#changelog_retention)
|
* Deleting changelog records older than the configured [retention time](../configuration/dynamic-settings.md#changelog_retention)
|
||||||
|
* Deleting job result records older than the configured [retention time](../configuration/dynamic-settings.md#jobresult_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.
|
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.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 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.
|
||||||
|
|
||||||
{!models/users/objectpermission.md!}
|
{!models/users/objectpermission.md!}
|
||||||
|
|
||||||
|
|||||||
208
docs/configuration/dynamic-settings.md
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## JOBRESULT_RETENTION
|
||||||
|
|
||||||
|
Default: 90
|
||||||
|
|
||||||
|
The number of days to retain job results (scripts and reports). Set this to `0` to retain
|
||||||
|
job results in the database indefinitely.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
If enabling indefinite job results 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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## DEFAULT_USER_PREFERENCES
|
||||||
|
|
||||||
|
This is a dictionary defining the default preferences to be set for newly-created user accounts. For example, to set the default page size for all users to 100, define the following:
|
||||||
|
|
||||||
|
```python
|
||||||
|
DEFAULT_USER_PREFERENCES = {
|
||||||
|
"pagination": {
|
||||||
|
"per_page": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For a complete list of available preferences, log into NetBox and navigate to `/user/preferences/`. A period in a preference name indicates a level of nesting in the JSON data. The example above maps to `pagination.per_page`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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,27 @@
|
|||||||
# 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` by default. 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.
|
!!! info "Customizing the Configuration Module"
|
||||||
|
A custom configuration module may be specified by setting the `NETBOX_CONFIGURATION` environment variable. This must be a dotted path to the desired Python module. For example, a file named `my_config.py` in the same directory as `settings.py` would be referenced as `netbox.my_config`.
|
||||||
|
|
||||||
|
For the sake of brevity, the NetBox documentation refers to the configuration file simply as `configuration.py`.
|
||||||
|
|
||||||
|
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,23 @@ ADMINS = [
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ALLOWED_URL_SCHEMES
|
## AUTH_PASSWORD_VALIDATORS
|
||||||
|
|
||||||
Default: `('file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp')`
|
This parameter acts as a pass-through for configuring Django's built-in password validators for local user accounts. If configured, these will be applied whenever a user's password is updated to ensure that it meets minimum criteria such as length or complexity. An example is provided below. For more detail on the available options, please see [the Django documentation](https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation).
|
||||||
|
|
||||||
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
|
```python
|
||||||
BANNER_TOP = 'Your banner text'
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
BANNER_BOTTOM = BANNER_TOP
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||||
|
'OPTIONS': {
|
||||||
|
'min_length': 10,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 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,18 +42,6 @@ BASE_PATH = 'netbox/'
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 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
|
||||||
@@ -88,18 +66,17 @@ CORS_ORIGIN_WHITELIST = [
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CUSTOM_VALIDATORS
|
## CSRF_TRUSTED_ORIGINS
|
||||||
|
|
||||||
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:
|
Default: `[]`
|
||||||
|
|
||||||
|
Defines a list of trusted origins for unsafe (e.g. `POST`) requests. This is a pass-through to Django's [`CSRF_TRUSTED_ORIGINS`](https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-CSRF_TRUSTED_ORIGINS) setting. Note that each host listed must specify a scheme (e.g. `http://` or `https://).
|
||||||
|
|
||||||
```python
|
```python
|
||||||
CUSTOM_VALIDATORS = {
|
CSRF_TRUSTED_ORIGINS = (
|
||||||
'dcim.site': (
|
'http://netbox.local',
|
||||||
Validator1,
|
'https://netbox.local',
|
||||||
Validator2,
|
)
|
||||||
Validator3
|
|
||||||
)
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -168,14 +145,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
|
||||||
@@ -203,11 +172,63 @@ EXEMPT_VIEW_PERMISSIONS = ['*']
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## GRAPHQL_ENABLED
|
## FIELD_CHOICES
|
||||||
|
|
||||||
Default: True
|
Some static choice fields on models can be configured with custom values. This is done by defining `FIELD_CHOICES` as a dictionary mapping model fields to their choices. Each choice in the list must have a database value and a human-friendly label, and may optionally specify a color. (A list of available colors is provided below.)
|
||||||
|
|
||||||
Setting this to False will disable the GraphQL API.
|
The choices provided can either replace the stock choices provided by NetBox, or append to them. To _replace_ the available choices, specify the app, model, and field name separated by dots. For example, the site model would be referenced as `dcim.Site.status`. To _extend_ the available choices, append a plus sign to the end of this string (e.g. `dcim.Site.status+`).
|
||||||
|
|
||||||
|
For example, the following configuration would replace the default site status choices with the options Foo, Bar, and Baz:
|
||||||
|
|
||||||
|
```python
|
||||||
|
FIELD_CHOICES = {
|
||||||
|
'dcim.Site.status': (
|
||||||
|
('foo', 'Foo', 'red'),
|
||||||
|
('bar', 'Bar', 'green'),
|
||||||
|
('baz', 'Baz', 'blue'),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Appending a plus sign to the field identifier would instead _add_ these choices to the ones already offered:
|
||||||
|
|
||||||
|
```python
|
||||||
|
FIELD_CHOICES = {
|
||||||
|
'dcim.Site.status+': (
|
||||||
|
...
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The following model fields support configurable choices:
|
||||||
|
|
||||||
|
* `circuits.Circuit.status`
|
||||||
|
* `dcim.Device.status`
|
||||||
|
* `dcim.PowerFeed.status`
|
||||||
|
* `dcim.Rack.status`
|
||||||
|
* `dcim.Site.status`
|
||||||
|
* `extras.JournalEntry.kind`
|
||||||
|
* `ipam.IPAddress.status`
|
||||||
|
* `ipam.IPRange.status`
|
||||||
|
* `ipam.Prefix.status`
|
||||||
|
* `ipam.VLAN.status`
|
||||||
|
* `virtualization.VirtualMachine.status`
|
||||||
|
|
||||||
|
The following colors are supported:
|
||||||
|
|
||||||
|
* `blue`
|
||||||
|
* `indigo`
|
||||||
|
* `purple`
|
||||||
|
* `pink`
|
||||||
|
* `red`
|
||||||
|
* `orange`
|
||||||
|
* `yellow`
|
||||||
|
* `green`
|
||||||
|
* `teal`
|
||||||
|
* `cyan`
|
||||||
|
* `gray`
|
||||||
|
* `black`
|
||||||
|
* `white`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -299,30 +320,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/
|
||||||
@@ -339,57 +336,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 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.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## PLUGINS
|
## PLUGINS
|
||||||
|
|
||||||
Default: Empty
|
Default: Empty
|
||||||
@@ -423,137 +369,6 @@ 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_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` )
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## RELEASE_CHECK_URL
|
## RELEASE_CHECK_URL
|
||||||
|
|
||||||
Default: None (disabled)
|
Default: None (disabled)
|
||||||
|
|||||||
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` as True and `REMOTE_AUTH_GROUP_SYNC_ENABLED` as False.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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_DEFAULT_GROUPS` will not function if `REMOTE_AUTH_ENABLED` is disabled)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|||||||
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!}
|
||||||
@@ -37,4 +37,5 @@ Once component templates have been created, every new device that you create as
|
|||||||
{!models/dcim/interfacetemplate.md!}
|
{!models/dcim/interfacetemplate.md!}
|
||||||
{!models/dcim/frontporttemplate.md!}
|
{!models/dcim/frontporttemplate.md!}
|
||||||
{!models/dcim/rearporttemplate.md!}
|
{!models/dcim/rearporttemplate.md!}
|
||||||
|
{!models/dcim/modulebaytemplate.md!}
|
||||||
{!models/dcim/devicebaytemplate.md!}
|
{!models/dcim/devicebaytemplate.md!}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ Device components represent discrete objects within a device which are used to t
|
|||||||
{!models/dcim/interface.md!}
|
{!models/dcim/interface.md!}
|
||||||
{!models/dcim/frontport.md!}
|
{!models/dcim/frontport.md!}
|
||||||
{!models/dcim/rearport.md!}
|
{!models/dcim/rearport.md!}
|
||||||
|
{!models/dcim/modulebay.md!}
|
||||||
{!models/dcim/devicebay.md!}
|
{!models/dcim/devicebay.md!}
|
||||||
{!models/dcim/inventoryitem.md!}
|
{!models/dcim/inventoryitem.md!}
|
||||||
|
|
||||||
|
|||||||
@@ -17,3 +17,12 @@
|
|||||||
|
|
||||||
{!models/ipam/vrf.md!}
|
{!models/ipam/vrf.md!}
|
||||||
{!models/ipam/routetarget.md!}
|
{!models/ipam/routetarget.md!}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{!models/ipam/fhrpgroup.md!}
|
||||||
|
{!models/ipam/fhrpgroupassignment.md!}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{!models/ipam/asn.md!}
|
||||||
|
|||||||
4
docs/core-functionality/modules.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# Modules
|
||||||
|
|
||||||
|
{!models/dcim/moduletype.md!}
|
||||||
|
{!models/dcim/module.md!}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
# Service Mapping
|
# Service Mapping
|
||||||
|
|
||||||
|
{!models/ipam/servicetemplate.md!}
|
||||||
{!models/ipam/service.md!}
|
{!models/ipam/service.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!}
|
||||||
@@ -77,6 +77,10 @@ This is the human-friendly names of your script. If omitted, the class name will
|
|||||||
|
|
||||||
A human-friendly description of what your script does.
|
A human-friendly description of what your script does.
|
||||||
|
|
||||||
|
### `field_order`
|
||||||
|
|
||||||
|
By default, script variables will be ordered in the form as they are defined in the script. `field_order` may be defined as an iterable of field names to determine the order in which variables are rendered. Any fields not included in this iterable be listed last.
|
||||||
|
|
||||||
### `commit_default`
|
### `commit_default`
|
||||||
|
|
||||||
The checkbox to commit database changes when executing a script is checked by default. Set `commit_default` to False under the script's Meta class to leave this option unchecked by default.
|
The checkbox to commit database changes when executing a script is checked by default. Set `commit_default` to False under the script's Meta class to leave this option unchecked by default.
|
||||||
@@ -85,6 +89,12 @@ The checkbox to commit database changes when executing a script is checked by de
|
|||||||
commit_default = False
|
commit_default = False
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### `job_timeout`
|
||||||
|
|
||||||
|
Set the maximum allowed runtime for the script. If not set, `RQ_DEFAULT_TIMEOUT` will be used.
|
||||||
|
|
||||||
|
!!! info "This feature was introduced in v3.2.1"
|
||||||
|
|
||||||
## Accessing Request Data
|
## Accessing Request Data
|
||||||
|
|
||||||
Details of the current HTTP request (the one being made to execute the script) are available as the instance attribute `self.request`. This can be used to infer, for example, the user executing the script and the client IP address:
|
Details of the current HTTP request (the one being made to execute the script) are available as the instance attribute `self.request`. This can be used to infer, for example, the user executing the script and the client IP address:
|
||||||
|
|||||||
@@ -1,22 +1,18 @@
|
|||||||
# Custom Validation
|
# Custom Validation
|
||||||
|
|
||||||
NetBox validates every object prior to it being written to the database to ensure data integrity. This validation includes things like checking for proper formatting and that references to related objects are valid. However, you may wish to supplement this validation with some rules of your own. For example, perhaps you require that every site's name conforms to a specific pattern. This can be done using NetBox's `CustomValidator` class.
|
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.
|
||||||
|
|
||||||
## CustomValidator
|
## Custom Validation Rules
|
||||||
|
|
||||||
### 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:
|
||||||
|
|
||||||
A custom validator can be instantiated by passing a mapping of attributes to a set of rules to which that attribute must conform. For example:
|
```json
|
||||||
|
{
|
||||||
```python
|
"name": {
|
||||||
from extras.validators import CustomValidator
|
"min_length": 5,
|
||||||
|
"max_length": 30
|
||||||
CustomValidator({
|
|
||||||
'name': {
|
|
||||||
'min_length': 5,
|
|
||||||
'max_length': 30,
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
This defines a custom validator which checks that the length of the `name` attribute for an object is at least five characters long, and no longer than 30 characters. This validation is executed _after_ NetBox has performed its own internal validation.
|
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.
|
||||||
@@ -38,12 +34,13 @@ The `min` and `max` types should be defined for numeric values, whereas `min_len
|
|||||||
|
|
||||||
### Custom Validation Logic
|
### Custom Validation Logic
|
||||||
|
|
||||||
There may be instances where the provided validation types are insufficient. The `CustomValidator` class can be extended to enforce arbitrary validation logic by overriding its `validate()` method, and calling `fail()` when an unsatisfactory condition is detected.
|
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
|
```python
|
||||||
from extras.validators import CustomValidator
|
from extras.validators import CustomValidator
|
||||||
|
|
||||||
class MyValidator(CustomValidator):
|
class MyValidator(CustomValidator):
|
||||||
|
|
||||||
def validate(self, instance):
|
def validate(self, instance):
|
||||||
if instance.status == 'active' and not instance.description:
|
if instance.status == 'active' and not instance.description:
|
||||||
self.fail("Active sites must have a description set!", field='status')
|
self.fail("Active sites must have a description set!", field='status')
|
||||||
@@ -53,34 +50,69 @@ The `fail()` method may optionally specify a field with which to associate the s
|
|||||||
|
|
||||||
## Assigning Custom Validators
|
## Assigning Custom Validators
|
||||||
|
|
||||||
Custom validators are associated with specific NetBox models under the [CUSTOM_VALIDATORS](../configuration/optional-settings.md#custom_validators) configuration parameter, as such:
|
Custom validators are associated with specific NetBox models under the [CUSTOM_VALIDATORS](../configuration/dynamic-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
|
```python
|
||||||
CUSTOM_VALIDATORS = {
|
CUSTOM_VALIDATORS = {
|
||||||
'dcim.site': (
|
'dcim.site': (
|
||||||
Validator1,
|
'my_validators.Validator1',
|
||||||
Validator2,
|
'my_validators.Validator2',
|
||||||
Validator3
|
),
|
||||||
|
'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
|
!!! note
|
||||||
Even if defining only a single validator, it must be passed as an iterable.
|
Even if defining only a single validator, it must be passed as an iterable.
|
||||||
|
|
||||||
When it is not necessary to define a custom `validate()` method, you may opt to pass a `CustomValidator` instance directly:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from extras.validators import CustomValidator
|
|
||||||
|
|
||||||
CUSTOM_VALIDATORS = {
|
|
||||||
'dcim.site': (
|
|
||||||
CustomValidator({
|
|
||||||
'name': {
|
|
||||||
'min_length': 5,
|
|
||||||
'max_length': 30,
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -85,6 +85,20 @@ As you can see, reports are completely customizable. Validation logic can be as
|
|||||||
!!! warning
|
!!! warning
|
||||||
Reports should never alter data: If you find yourself using the `create()`, `save()`, `update()`, or `delete()` methods on objects within reports, stop and re-evaluate what you're trying to accomplish. Note that there are no safeguards against the accidental alteration or destruction of data.
|
Reports should never alter data: If you find yourself using the `create()`, `save()`, `update()`, or `delete()` methods on objects within reports, stop and re-evaluate what you're trying to accomplish. Note that there are no safeguards against the accidental alteration or destruction of data.
|
||||||
|
|
||||||
|
## Report Attributes
|
||||||
|
|
||||||
|
### `description`
|
||||||
|
|
||||||
|
A human-friendly description of what your report does.
|
||||||
|
|
||||||
|
### `job_timeout`
|
||||||
|
|
||||||
|
Set the maximum allowed runtime for the report. If not set, `RQ_DEFAULT_TIMEOUT` will be used.
|
||||||
|
|
||||||
|
!!! info "This feature was introduced in v3.2.1"
|
||||||
|
|
||||||
|
## Logging
|
||||||
|
|
||||||
The following methods are available to log results within a report:
|
The following methods are available to log results within a report:
|
||||||
|
|
||||||
* log(message)
|
* log(message)
|
||||||
@@ -95,7 +109,7 @@ The following methods are available to log results within a report:
|
|||||||
|
|
||||||
The recording of one or more failure messages will automatically flag a report as failed. It is advised to log a success for each object that is evaluated so that the results will reflect how many objects are being reported on. (The inclusion of a log message is optional for successes.) Messages recorded with `log()` will appear in a report's results but are not associated with a particular object or status. Log messages also support using markdown syntax and will be rendered on the report result page.
|
The recording of one or more failure messages will automatically flag a report as failed. It is advised to log a success for each object that is evaluated so that the results will reflect how many objects are being reported on. (The inclusion of a log message is optional for successes.) Messages recorded with `log()` will appear in a report's results but are not associated with a particular object or status. Log messages also support using markdown syntax and will be rendered on the report result page.
|
||||||
|
|
||||||
To perform additional tasks, such as sending an email or calling a webhook, after a report has been run, extend the `post_run()` method. The status of the report is available as `self.failed` and the results object is `self.result`.
|
To perform additional tasks, such as sending an email or calling a webhook, before or after a report is run, extend the `pre_run()` and/or `post_run()` methods, respectively. The status of a completed 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.
|
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.
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
## 1. Define the model class
|
## 1. Define the model class
|
||||||
|
|
||||||
Models within each app are stored in either `models.py` or within a submodule under the `models/` directory. When creating a model, be sure to subclass the [appropriate base model](models.md) from `netbox.models`. This will typically be PrimaryModel or OrganizationalModel. Remember to add the model class to the `__all__` listing for the module.
|
Models within each app are stored in either `models.py` or within a submodule under the `models/` directory. When creating a model, be sure to subclass the [appropriate base model](models.md) from `netbox.models`. This will typically be NetBoxModel or OrganizationalModel. Remember to add the model class to the `__all__` listing for the module.
|
||||||
|
|
||||||
Each model should define, at a minimum:
|
Each model should define, at a minimum:
|
||||||
|
|
||||||
|
* A `Meta` class specifying a deterministic ordering (if ordered by fields other than the primary ID)
|
||||||
* A `__str__()` method returning a user-friendly string representation of the instance
|
* A `__str__()` method returning a user-friendly string representation of the instance
|
||||||
* A `get_absolute_url()` method returning an instance's direct URL (using `reverse()`)
|
* A `get_absolute_url()` method returning an instance's direct URL (using `reverse()`)
|
||||||
* A `Meta` class specifying a deterministic ordering (if ordered by fields other than the primary ID)
|
|
||||||
|
|
||||||
## 2. Define field choices
|
## 2. Define field choices
|
||||||
|
|
||||||
@@ -16,9 +16,9 @@ If the model has one or more fields with static choices, define those choices in
|
|||||||
|
|
||||||
## 3. Generate database migrations
|
## 3. Generate database migrations
|
||||||
|
|
||||||
Once your model definition is complete, generate database migrations by running `manage.py -n $NAME --no-header`. Always specify a short unique name when generating migrations.
|
Once your model definition is complete, generate database migrations by running `manage.py makemigrations -n $NAME --no-header`. Always specify a short unique name when generating migrations.
|
||||||
|
|
||||||
!!! info
|
!!! info "Configuration Required"
|
||||||
Set `DEVELOPER = True` in your NetBox configuration to enable the creation of new migrations.
|
Set `DEVELOPER = True` in your NetBox configuration to enable the creation of new migrations.
|
||||||
|
|
||||||
## 4. Add all standard views
|
## 4. Add all standard views
|
||||||
@@ -37,25 +37,32 @@ Most models will need view classes created in `views.py` to serve the following
|
|||||||
|
|
||||||
Add the relevant URL path for each view created in the previous step to `urls.py`.
|
Add the relevant URL path for each view created in the previous step to `urls.py`.
|
||||||
|
|
||||||
## 6. Create the FilterSet
|
## 6. Add relevant forms
|
||||||
|
|
||||||
|
Depending on the type of model being added, you may need to define several types of form classes. These include:
|
||||||
|
|
||||||
|
* A base model form (for creating/editing individual objects)
|
||||||
|
* A bulk edit form
|
||||||
|
* A bulk import form (for CSV-based import)
|
||||||
|
* A filterset form (for filtering the object list view)
|
||||||
|
|
||||||
|
## 7. Create the FilterSet
|
||||||
|
|
||||||
Each model should have a corresponding FilterSet class defined. This is used to filter UI and API queries. Subclass the appropriate class from `netbox.filtersets` that matches the model's parent class.
|
Each model should have a corresponding FilterSet class defined. This is used to filter UI and API queries. Subclass the appropriate class from `netbox.filtersets` that matches the model's parent class.
|
||||||
|
|
||||||
Every model FilterSet should define a `q` filter to support general search queries.
|
## 8. Create the table class
|
||||||
|
|
||||||
## 7. Create the table
|
|
||||||
|
|
||||||
Create a table class for the model in `tables.py` by subclassing `utilities.tables.BaseTable`. Under the table's `Meta` class, be sure to list both the fields and default columns.
|
Create a table class for the model in `tables.py` by subclassing `utilities.tables.BaseTable`. Under the table's `Meta` class, be sure to list both the fields and default columns.
|
||||||
|
|
||||||
## 8. Create the object template
|
## 9. Create the object template
|
||||||
|
|
||||||
Create the HTML template for the object view. (The other views each typically employ a generic template.) This template should extend `generic/object.html`.
|
Create the HTML template for the object view. (The other views each typically employ a generic template.) This template should extend `generic/object.html`.
|
||||||
|
|
||||||
## 9. Add the model to the navigation menu
|
## 10. Add the model to the navigation menu
|
||||||
|
|
||||||
For NetBox releases prior to v3.0, add the relevant link(s) to the navigation menu template. For later releases, add the relevant items in `netbox/netbox/navigation_menu.py`.
|
Add the relevant navigation menu items in `netbox/netbox/navigation_menu.py`.
|
||||||
|
|
||||||
## 10. REST API components
|
## 11. REST API components
|
||||||
|
|
||||||
Create the following for each model:
|
Create the following for each model:
|
||||||
|
|
||||||
@@ -64,13 +71,13 @@ Create the following for each model:
|
|||||||
* API view in `api/views.py`
|
* API view in `api/views.py`
|
||||||
* Endpoint route in `api/urls.py`
|
* Endpoint route in `api/urls.py`
|
||||||
|
|
||||||
## 11. GraphQL API components (v3.0+)
|
## 12. GraphQL API components
|
||||||
|
|
||||||
Create a Graphene object type for the model in `graphql/types.py` by subclassing the appropriate class from `netbox.graphql.types`.
|
Create a Graphene object type for the model in `graphql/types.py` by subclassing the appropriate class from `netbox.graphql.types`.
|
||||||
|
|
||||||
Also extend the schema class defined in `graphql/schema.py` with the individual object and object list fields per the established convention.
|
Also extend the schema class defined in `graphql/schema.py` with the individual object and object list fields per the established convention.
|
||||||
|
|
||||||
## 12. Add tests
|
## 13. Add tests
|
||||||
|
|
||||||
Add tests for the following:
|
Add tests for the following:
|
||||||
|
|
||||||
@@ -78,7 +85,7 @@ Add tests for the following:
|
|||||||
* API views
|
* API views
|
||||||
* Filter sets
|
* Filter sets
|
||||||
|
|
||||||
## 13. Documentation
|
## 14. Documentation
|
||||||
|
|
||||||
Create a new documentation page for the model in `docs/models/<app_label>/<model_name>.md`. Include this file under the "features" documentation where appropriate.
|
Create a new documentation page for the model in `docs/models/<app_label>/<model_name>.md`. Include this file under the "features" documentation where appropriate.
|
||||||
|
|
||||||
|
|||||||
@@ -4,16 +4,16 @@ Below is a list of tasks to consider when adding a new field to a core model.
|
|||||||
|
|
||||||
## 1. Generate and run database migrations
|
## 1. Generate and run database migrations
|
||||||
|
|
||||||
Django migrations are used to express changes to the database schema. In most cases, Django can generate these automatically, however very complex changes may require manual intervention. Always remember to specify a short but descriptive name when generating a new migration.
|
[Django migrations](https://docs.djangoproject.com/en/stable/topics/migrations/) are used to express changes to the database schema. In most cases, Django can generate these automatically, however very complex changes may require manual intervention. Always remember to specify a short but descriptive name when generating a new migration.
|
||||||
|
|
||||||
```
|
```
|
||||||
./manage.py makemigrations <app> -n <name>
|
./manage.py makemigrations <app> -n <name>
|
||||||
./manage.py migrate
|
./manage.py migrate
|
||||||
```
|
```
|
||||||
|
|
||||||
Where possible, try to merge related changes into a single migration. For example, if three new fields are being added to different models within an app, these can be expressed in the same migration. You can merge a new migration with an existing one by combining their `operations` lists.
|
Where possible, try to merge related changes into a single migration. For example, if three new fields are being added to different models within an app, these can be expressed in a single migration. You can merge a newly generated migration with an existing one by combining their `operations` lists.
|
||||||
|
|
||||||
!!! note
|
!!! warning "Do not alter existing migrations"
|
||||||
Migrations can only be merged within a release. Once a new release has been published, its migrations cannot be altered (other than for the purpose of correcting a bug).
|
Migrations can only be merged within a release. Once a new release has been published, its migrations cannot be altered (other than for the purpose of correcting a bug).
|
||||||
|
|
||||||
## 2. Add validation logic to `clean()`
|
## 2. Add validation logic to `clean()`
|
||||||
@@ -24,7 +24,6 @@ If the new field introduces additional validation requirements (beyond what's in
|
|||||||
class Foo(models.Model):
|
class Foo(models.Model):
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|
||||||
super().clean()
|
super().clean()
|
||||||
|
|
||||||
# Custom validation goes here
|
# Custom validation goes here
|
||||||
@@ -40,9 +39,9 @@ If you're adding a relational field (e.g. `ForeignKey`) and intend to include th
|
|||||||
|
|
||||||
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.
|
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. Add field to forms
|
## 5. Add fields to forms
|
||||||
|
|
||||||
Extend any forms to include the new field as appropriate. Common forms include:
|
Extend any forms to include the new field(s) as appropriate. These are found under the `forms/` directory within each app. Common forms include:
|
||||||
|
|
||||||
* **Credit/edit** - Manipulating a single object
|
* **Credit/edit** - Manipulating a single object
|
||||||
* **Bulk edit** - Performing a change on many objects at once
|
* **Bulk edit** - Performing a change on many objects at once
|
||||||
@@ -51,11 +50,11 @@ Extend any forms to include the new field as appropriate. Common forms include:
|
|||||||
|
|
||||||
## 6. 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 query it in the FilterSet's `search()` method.
|
||||||
|
|
||||||
## 7. 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. Also add the field name to `default_columns` if the column should be present in the table by default.
|
||||||
|
|
||||||
## 8. Update the UI templates
|
## 8. Update the UI templates
|
||||||
|
|
||||||
|
|||||||
@@ -11,17 +11,25 @@ Getting started with NetBox development is pretty straightforward, and should fe
|
|||||||
|
|
||||||
### Fork the Repo
|
### Fork the Repo
|
||||||
|
|
||||||
Assuming you'll be working on your own fork, your first step will be to fork the [official git repository](https://github.com/netbox-community/netbox). (If you're a maintainer who's going to be working directly with the official repo, skip this step.) You can then clone your GitHub fork locally for development:
|
Assuming you'll be working on your own fork, your first step will be to fork the [official git repository](https://github.com/netbox-community/netbox). (If you're a maintainer who's going to be working directly with the official repo, skip this step.) Click the "fork" button at top right (be sure that you've logged into GitHub first).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Copy the URL provided in the dialog box.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You can then clone your GitHub fork locally for development:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ git clone https://github.com/youruseraccount/netbox.git
|
$ git clone https://github.com/$username/netbox.git
|
||||||
Cloning into 'netbox'...
|
Cloning into 'netbox'...
|
||||||
remote: Enumerating objects: 231, done.
|
remote: Enumerating objects: 85949, done.
|
||||||
remote: Counting objects: 100% (231/231), done.
|
remote: Counting objects: 100% (4672/4672), done.
|
||||||
remote: Compressing objects: 100% (147/147), done.
|
remote: Compressing objects: 100% (1224/1224), done.
|
||||||
remote: Total 56705 (delta 134), reused 145 (delta 84), pack-reused 56474
|
remote: Total 85949 (delta 3538), reused 4332 (delta 3438), pack-reused 81277
|
||||||
Receiving objects: 100% (56705/56705), 27.96 MiB | 34.92 MiB/s, done.
|
Receiving objects: 100% (85949/85949), 55.16 MiB | 44.90 MiB/s, done.
|
||||||
Resolving deltas: 100% (44177/44177), done.
|
Resolving deltas: 100% (68008/68008), done.
|
||||||
$ ls netbox/
|
$ ls netbox/
|
||||||
base_requirements.txt contrib docs mkdocs.yml NOTICE requirements.txt upgrade.sh
|
base_requirements.txt contrib docs mkdocs.yml NOTICE requirements.txt upgrade.sh
|
||||||
CHANGELOG.md CONTRIBUTING.md LICENSE.txt netbox README.md scripts
|
CHANGELOG.md CONTRIBUTING.md LICENSE.txt netbox README.md scripts
|
||||||
@@ -33,7 +41,9 @@ The NetBox project utilizes three persistent git branches to track work:
|
|||||||
* `develop` - All development on the upcoming stable release occurs here
|
* `develop` - All development on the upcoming stable release occurs here
|
||||||
* `feature` - Tracks work on an upcoming major release
|
* `feature` - Tracks work on an upcoming major release
|
||||||
|
|
||||||
Typically, you'll base pull requests off of the `develop` branch, or off of `feature` if you're working on a new major release. **Never** merge pull requests into the `master` branch, which receives merged only from the `develop` branch.
|
Typically, you'll base pull requests off of the `develop` branch, or off of `feature` if you're working on a new major release. **Never** merge pull requests into the `master` branch: This branch only ever merges pull requests from the `develop` branch, to effect a new release.
|
||||||
|
|
||||||
|
For example, assume that the current NetBox release is v3.1.1. Work applied to the `develop` branch will appear in v3.1.2, and work done under the `feature` branch will be included in the next minor release (v3.2.0).
|
||||||
|
|
||||||
### Enable Pre-Commit Hooks
|
### Enable Pre-Commit Hooks
|
||||||
|
|
||||||
@@ -46,7 +56,7 @@ $ ln -s ../../scripts/git-hooks/pre-commit
|
|||||||
|
|
||||||
### Create a Python Virtual Environment
|
### Create a Python Virtual Environment
|
||||||
|
|
||||||
A [virtual environment](https://docs.python.org/3/tutorial/venv.html) is like a container for a set of Python packages. They allow you to build environments suited to specific projects without interfering with system packages or other projects. When installed per the documentation, NetBox uses a virtual environment in production.
|
A [virtual environment](https://docs.python.org/3/tutorial/venv.html) (or "venv" for short) is like a container for a set of Python packages. These allow you to build environments suited to specific projects without interfering with system packages or other projects. When installed per the documentation, NetBox uses a virtual environment in production.
|
||||||
|
|
||||||
Create a virtual environment using the `venv` Python module:
|
Create a virtual environment using the `venv` Python module:
|
||||||
|
|
||||||
@@ -57,8 +67,8 @@ $ python3 -m venv ~/.venv/netbox
|
|||||||
|
|
||||||
This will create a directory named `.venv/netbox/` in your home directory, which houses a virtual copy of the Python executable and its related libraries and tooling. When running NetBox for development, it will be run using the Python binary at `~/.venv/netbox/bin/python`.
|
This will create a directory named `.venv/netbox/` in your home directory, which houses a virtual copy of the Python executable and its related libraries and tooling. When running NetBox for development, it will be run using the Python binary at `~/.venv/netbox/bin/python`.
|
||||||
|
|
||||||
!!! info
|
!!! info "Where to Create Your Virtual Environments"
|
||||||
Keeping virtual environments in `~/.venv/` is a common convention but entirely optional: Virtual environments can be created wherever you please.
|
Keeping virtual environments in `~/.venv/` is a common convention but entirely optional: Virtual environments can be created almost wherever you please. Also consider using [`virtualenvwrapper`](https://virtualenvwrapper.readthedocs.io/en/stable/) to simplify the management of multiple venvs.
|
||||||
|
|
||||||
Once created, activate the virtual environment:
|
Once created, activate the virtual environment:
|
||||||
|
|
||||||
@@ -83,7 +93,7 @@ Collecting Django==3.1 (from -r requirements.txt (line 1))
|
|||||||
|
|
||||||
### Configure NetBox
|
### Configure NetBox
|
||||||
|
|
||||||
Within the `netbox/netbox/` directory, copy `configuration.example.py` to `configuration.py` and update the following parameters:
|
Within the `netbox/netbox/` directory, copy `configuration_example.py` to `configuration.py` and update the following parameters:
|
||||||
|
|
||||||
* `ALLOWED_HOSTS`: This can be set to `['*']` for development purposes
|
* `ALLOWED_HOSTS`: This can be set to `['*']` for development purposes
|
||||||
* `DATABASE`: PostgreSQL database connection parameters
|
* `DATABASE`: PostgreSQL database connection parameters
|
||||||
@@ -94,38 +104,66 @@ Within the `netbox/netbox/` directory, copy `configuration.example.py` to `confi
|
|||||||
|
|
||||||
### Start the Development Server
|
### Start the Development Server
|
||||||
|
|
||||||
Django provides a lightweight, auto-updating HTTP/WSGI server for development use. NetBox extends this slightly to automatically import models and other utilities. Run the NetBox development server with the `nbshell` management command:
|
Django provides a lightweight, auto-updating HTTP/WSGI server for development use. It is started with the `runserver` management command:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ python netbox/manage.py runserver
|
$ ./manage.py runserver
|
||||||
|
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 18, 2020 - 15:52:31
|
February 18, 2022 - 20:29:57
|
||||||
Django version 3.1, using settings 'netbox.settings'
|
Django version 4.0.2, using settings 'netbox.settings'
|
||||||
Starting development server at http://127.0.0.1:8000/
|
Starting development server at http://127.0.0.1:8000/
|
||||||
Quit the server with CONTROL-C.
|
Quit the server with CONTROL-C.
|
||||||
```
|
```
|
||||||
|
|
||||||
This ensures that your development environment is now complete and operational. Any changes you make to the code base will be automatically adapted by the development server.
|
This ensures that your development environment is now complete and operational. Any changes you make to the code base will be automatically adapted by the development server.
|
||||||
|
|
||||||
|
!!! info "IDE Integration"
|
||||||
|
Some IDEs, such as PyCharm, will integrate with Django's development server and allow you to run it directly within the IDE. This is strongly encouraged as it makes for a much more convenient development environment.
|
||||||
|
|
||||||
|
## Populating Demo Data
|
||||||
|
|
||||||
|
Once you have your development environment up and running, it might be helpful to populate some "dummy" data to make interacting with the UI and APIs more convenient. Check out the [netbox-demo-data](https://github.com/netbox-community/netbox-demo-data) repo on GitHub, which houses a collection of sample data that can be easily imported to any new NetBox deployment. (This sample data is used to populate the public demo instance at <https://demo.netbox.dev>.)
|
||||||
|
|
||||||
|
The demo data is provided in JSON format and loaded into an empty database using Django's `loaddata` management command. Consult the demo data repo's `README` file for complete instructions on populating the data.
|
||||||
|
|
||||||
## Running Tests
|
## Running Tests
|
||||||
|
|
||||||
Throughout the course of development, it's a good idea to occasionally run NetBox's test suite to catch any potential errors. Tests are run using the `test` management command:
|
Prior to committing any substantial changes to the code base, be sure to run NetBox's test suite to catch any potential errors. Tests are run using the `test` management command, which employs Python's [`unittest`](https://docs.python.org/3/library/unittest.html#module-unittest) library. Remember to ensure the Python virtual environment is active before running this command. Also keep in mind that these commands are executed in the `netbox/` directory, not the root directory of the repository.
|
||||||
|
|
||||||
|
To avoid potential issues with your local configuration file, set the `NETBOX_CONFIGURATION` to point to the packaged test configuration at `netbox/configuration_testing.py`. This will handle things like ensuring that the dummy plugin is enabled for comprehensive testing.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ python netbox/manage.py test
|
$ export NETBOX_CONFIGURATION=netbox.configuration_testing
|
||||||
|
$ cd netbox/
|
||||||
|
$ python manage.py test
|
||||||
```
|
```
|
||||||
|
|
||||||
In cases where you haven't made any changes to the database (which is most of the time), you can append the `--keepdb` argument to this command to reuse the test database between runs. This cuts down on the time it takes to run the test suite since the database doesn't have to be rebuilt each time. (Note that this argument will cause errors if you've modified any model fields since the previous test run.)
|
In cases where you haven't made any changes to the database schema (which is typical), you can append the `--keepdb` argument to this command to reuse the test database between runs. This cuts down on the time it takes to run the test suite since the database doesn't have to be rebuilt each time. (Note that this argument will cause errors if you've modified any model fields since the previous test run.)
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ python netbox/manage.py test --keepdb
|
$ python manage.py test --keepdb
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can also reduce testing time by enabling parallel test execution with the `--parallel` flag. (By default, this will run as many parallel tests as you have processors. To avoid sluggishness, it's a good idea to specify a lower number of parallel tests.) This flag can be combined with `--keepdb`, although if you encounter any strange errors, try running the test suite again with parallelization disabled.
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
$ python manage.py test --parallel <n>
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, it's possible to limit the run to a specific set of tests, specified by their Python path. For example, to run only IPAM and DCIM view tests:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
$ python manage.py test dcim.tests.test_views ipam.tests.test_views
|
||||||
|
```
|
||||||
|
|
||||||
|
This is handy for instances where just a few tests are failing and you want to re-run them individually.
|
||||||
|
|
||||||
## Submitting Pull Requests
|
## Submitting Pull Requests
|
||||||
|
|
||||||
Once you're happy with your work and have verified that all tests pass, commit your changes and push it upstream to your fork. Always provide descriptive (but not excessively verbose) commit messages. When working on a specific issue, be sure to reference it.
|
Once you're happy with your work and have verified that all tests pass, commit your changes and push it upstream to your fork. Always provide descriptive (but not excessively verbose) commit messages. When working on a specific issue, be sure to prefix your commit message with the word "Fixes" or "Closes" and the issue number (with a hash mark). This tells GitHub to automatically close the referenced issue once the commit has been merged.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
$ git commit -m "Closes #1234: Add IPv5 support"
|
$ git commit -m "Closes #1234: Add IPv5 support"
|
||||||
@@ -136,5 +174,5 @@ Once your fork has the new commit, submit a [pull request](https://github.com/ne
|
|||||||
|
|
||||||
Once submitted, a maintainer will review your pull request and either merge it or request changes. If changes are needed, you can make them via new commits to your fork: The pull request will update automatically.
|
Once submitted, a maintainer will review your pull request and either merge it or request changes. If changes are needed, you can make them via new commits to your fork: The pull request will update automatically.
|
||||||
|
|
||||||
!!! note
|
!!! note "Remember to Open an Issue First"
|
||||||
Remember, pull requests are entertained only for **accepted** issues. If an issue you want to work on hasn't been approved by a maintainer yet, it's best to avoid risking your time and effort on a change that might not be accepted.
|
Remember, pull requests are permitted only for **accepted** issues. If an issue you want to work on hasn't been approved by a maintainer yet, it's best to avoid risking your time and effort on a change that might not be accepted. (The one exception to this is trivial changes to the documentation or other non-critical resources.)
|
||||||
|
|||||||
@@ -1,25 +1,24 @@
|
|||||||
# NetBox Development
|
# NetBox Development
|
||||||
|
|
||||||
NetBox is maintained as a [GitHub project](https://github.com/netbox-community/netbox) under the Apache 2 license. Users are encouraged to submit GitHub issues for feature requests and bug reports, however we are very selective about pull requests. Please see the `CONTRIBUTING` guide for more direction on contributing to NetBox.
|
NetBox is maintained as a [GitHub project](https://github.com/netbox-community/netbox) under the Apache 2 license. Users are encouraged to submit GitHub issues for feature requests and bug reports, however we are very selective about pull requests. Each pull request must be preceded by an **approved** issue. Please see the `CONTRIBUTING` guide for more direction on contributing to NetBox.
|
||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
There are several official forums for communication among the developers and community members:
|
There are several official forums for communication among the developers and community members:
|
||||||
|
|
||||||
* [GitHub issues](https://github.com/netbox-community/netbox/issues) - All feature requests, bug reports, and other substantial changes to the code base **must** be documented in an issue.
|
* [GitHub issues](https://github.com/netbox-community/netbox/issues) - All feature requests, bug reports, and other substantial changes to the code base **must** be documented in a GitHub issue.
|
||||||
* [GitHub Discussions](https://github.com/netbox-community/netbox/discussions) - The preferred forum for general discussion and support issues. Ideal for shaping a feature request prior to submitting an issue.
|
* [GitHub discussions](https://github.com/netbox-community/netbox/discussions) - The preferred forum for general discussion and support issues. Ideal for shaping a feature request prior to submitting an issue.
|
||||||
* [#netbox on NetDev Community Slack](https://netdev.chat/) - Good for quick chats. Avoid any discussion that might need to be referenced later on, as the chat history is not retained long.
|
* [#netbox on NetDev Community Slack](https://netdev.chat/) - Good for quick chats. Avoid any discussion that might need to be referenced later on, as the chat history is not retained long.
|
||||||
* [Google Group](https://groups.google.com/g/netbox-discuss) - Legacy mailing list; slowly being phased out in favor of GitHub discussions.
|
|
||||||
|
|
||||||
## Governance
|
## Governance
|
||||||
|
|
||||||
NetBox follows the [benevolent dictator](http://oss-watch.ac.uk/resources/benevolentdictatorgovernancemodel) model of governance, with [Jeremy Stretch](https://github.com/jeremystretch) ultimately responsible for all changes to the code base. While community contributions are welcomed and encouraged, the lead maintainer's primary role is to ensure the project's long-term maintainability and continued focus on its primary functions (in other words, avoid scope creep).
|
NetBox follows the [benevolent dictator](http://oss-watch.ac.uk/resources/benevolentdictatorgovernancemodel) model of governance, with [Jeremy Stretch](https://github.com/jeremystretch) ultimately responsible for all changes to the code base. While community contributions are welcomed and encouraged, the lead maintainer's primary role is to ensure the project's long-term maintainability and continued focus on its primary functions.
|
||||||
|
|
||||||
## Project Structure
|
## Project Structure
|
||||||
|
|
||||||
All development of the current NetBox release occurs in the `develop` branch; releases are packaged from the `master` branch. The `master` branch should _always_ represent the current stable release in its entirety, such that installing NetBox by either downloading a packaged release or cloning the `master` branch provides the same code base.
|
All development of the current NetBox release occurs in the `develop` branch; releases are packaged from the `master` branch. The `master` branch should _always_ represent the current stable release in its entirety, such that installing NetBox by either downloading a packaged release or cloning the `master` branch provides the same code base. Only pull requests representing new releases should be merged into `master`.
|
||||||
|
|
||||||
NetBox components are arranged into functional subsections called _apps_ (a carryover from Django vernacular). Each app holds the models, views, and templates relevant to a particular function:
|
NetBox components are arranged into Django apps. Each app holds the models, views, and other resources relevant to a particular function:
|
||||||
|
|
||||||
* `circuits`: Communications circuits and providers (not to be confused with power circuits)
|
* `circuits`: Communications circuits and providers (not to be confused with power circuits)
|
||||||
* `dcim`: Datacenter infrastructure management (sites, racks, and devices)
|
* `dcim`: Datacenter infrastructure management (sites, racks, and devices)
|
||||||
@@ -29,3 +28,6 @@ NetBox components are arranged into functional subsections called _apps_ (a carr
|
|||||||
* `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.)
|
||||||
* `virtualization`: Virtual machines and clusters
|
* `virtualization`: Virtual machines and clusters
|
||||||
|
* `wireless`: Wireless links and LANs
|
||||||
|
|
||||||
|
All core functionality is stored within the `netbox/` subdirectory. HTML templates are stored in a common `templates/` directory, with model- and view-specific templates arranged by app. Documentation is kept in the `docs/` root directory.
|
||||||
|
|||||||
@@ -17,12 +17,12 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/
|
|||||||
* Nesting - These models can be nested recursively to create a hierarchy
|
* Nesting - These models can be nested recursively to create a hierarchy
|
||||||
|
|
||||||
| 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: | | | | | |
|
||||||
|
|
||||||
## Models Index
|
## Models Index
|
||||||
|
|
||||||
@@ -41,15 +41,21 @@ 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.IPRange](../models/ipam/iprange.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)
|
||||||
|
* [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
|
||||||
|
|
||||||
@@ -61,6 +67,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)
|
||||||
|
* [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)
|
||||||
|
|
||||||
@@ -69,7 +76,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
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Check `base_requirements.txt` for any dependencies pinned to a specific version,
|
|||||||
|
|
||||||
### 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 add a summary of the major changes to `index.md`.
|
||||||
|
|
||||||
### Manually Perform a New Install
|
### Manually Perform a New Install
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Style Guide
|
# Style Guide
|
||||||
|
|
||||||
NetBox generally follows the [Django style guide](https://docs.djangoproject.com/en/stable/internals/contributing/writing-code/coding-style/), which is itself based on [PEP 8](https://www.python.org/dev/peps/pep-0008/). [Pycodestyle](https://github.com/pycqa/pycodestyle) is used to validate code formatting, ignoring certain violations. See `scripts/cibuild.sh`.
|
NetBox generally follows the [Django style guide](https://docs.djangoproject.com/en/stable/internals/contributing/writing-code/coding-style/), which is itself based on [PEP 8](https://www.python.org/dev/peps/pep-0008/). [Pycodestyle](https://github.com/pycqa/pycodestyle) is used to validate code formatting, ignoring certain violations. See `scripts/cibuild.sh` for details.
|
||||||
|
|
||||||
## PEP 8 Exceptions
|
## PEP 8 Exceptions
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ pycodestyle --ignore=W504,E501 netbox/
|
|||||||
|
|
||||||
## Introducing New Dependencies
|
## Introducing New Dependencies
|
||||||
|
|
||||||
The introduction of a new dependency is best avoided unless it is absolutely necessary. For small features, it's generally preferable to replicate functionality within the NetBox code base rather than to introduce reliance on an external project. This reduces both the burden of tracking new releases and our exposure to outside bugs and attacks.
|
The introduction of a new dependency is best avoided unless it is absolutely necessary. For small features, it's generally preferable to replicate functionality within the NetBox code base rather than to introduce reliance on an external project. This reduces both the burden of tracking new releases and our exposure to outside bugs and supply chain attacks.
|
||||||
|
|
||||||
If there's a strong case for introducing a new dependency, it must meet the following criteria:
|
If there's a strong case for introducing a new dependency, it must meet the following criteria:
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ When adding a new dependency, a short description of the package and the URL of
|
|||||||
|
|
||||||
## General Guidance
|
## General Guidance
|
||||||
|
|
||||||
* When in doubt, remain consistent: It is better to be consistently incorrect than inconsistently correct. If you notice in the course of unrelated work a pattern that should be corrected, continue to follow the pattern for now and open a bug so that the entire code base can be evaluated at a later point.
|
* When in doubt, remain consistent: It is better to be consistently incorrect than inconsistently correct. If you notice in the course of unrelated work a pattern that should be corrected, continue to follow the pattern for now and submit a separate bug report so that the entire code base can be evaluated at a later point.
|
||||||
|
|
||||||
* Prioritize readability over concision. Python is a very flexible language that typically offers several options for expressing a given piece of logic, but some may be more friendly to the reader than others. (List comprehensions are particularly vulnerable to over-optimization.) Always remain considerate of the future reader who may need to interpret your code without the benefit of the context within which you are writing it.
|
* Prioritize readability over concision. Python is a very flexible language that typically offers several options for expressing a given piece of logic, but some may be more friendly to the reader than others. (List comprehensions are particularly vulnerable to over-optimization.) Always remain considerate of the future reader who may need to interpret your code without the benefit of the context within which you are writing it.
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ The `users.UserConfig` model holds individual preferences for each user in the f
|
|||||||
## Available Preferences
|
## Available Preferences
|
||||||
|
|
||||||
| Name | Description |
|
| Name | Description |
|
||||||
| ---- | ----------- |
|
|--------------------------|---------------------------------------------------------------|
|
||||||
| extras.configcontext.format | Preferred format when rendering config context data (JSON or YAML) |
|
| data_format | Preferred format when rendering raw data (JSON or YAML) |
|
||||||
| pagination.per_page | The number of items to display per page of a paginated table |
|
| pagination.per_page | The number of items to display per page of a paginated table |
|
||||||
| tables.TABLE_NAME.columns | The ordered list of columns to display when viewing the table |
|
| pagination.placement | Where to display the paginator controls relative to the table |
|
||||||
|
| tables.${table}.columns | The ordered list of columns to display when viewing the table |
|
||||||
|
| tables.${table}.ordering | A list of column names by which the table should be ordered |
|
||||||
|
| ui.colormode | Light or dark mode in the user interface |
|
||||||
|
|||||||
@@ -67,4 +67,4 @@ Authorization: Token $TOKEN
|
|||||||
|
|
||||||
## Disabling the GraphQL API
|
## 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.
|
If not needed, the GraphQL API can be disabled by setting the [`GRAPHQL_ENABLED`](../configuration/dynamic-settings.md#graphql_enabled) configuration parameter to False and restarting NetBox.
|
||||||
|
|||||||
@@ -48,14 +48,16 @@ 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 (optional) |
|
||||||
|
|
||||||
## Supported Python Versions
|
## Supported Python Versions
|
||||||
|
|
||||||
NetBox supports Python 3.7, 3.8, and 3.9 environments currently. (Support for Python 3.6 was removed in NetBox v3.0.)
|
NetBox supports Python 3.8, 3.9, and 3.10 environments.
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
See the [installation guide](installation/index.md) for help getting NetBox up and running quickly.
|
Minor NetBox releases (e.g. v3.1) are published three times a year; in April, August, and December. These typically introduce major new features and may contain breaking API changes. Patch releases are published roughly every one to two weeks to resolve bugs and fulfill minor feature requests. These are backward-compatible with previous releases unless otherwise noted. The NetBox maintainers strongly recommend running the latest stable release whenever possible.
|
||||||
|
|
||||||
|
Please see the [official installation guide](installation/index.md) for detailed instructions on obtaining and installing NetBox.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
@@ -35,6 +35,12 @@ sudo systemctl start postgresql
|
|||||||
sudo systemctl enable postgresql
|
sudo systemctl enable postgresql
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Before continuing, verify that you have installed PostgreSQL 10 or later:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
psql -V
|
||||||
|
```
|
||||||
|
|
||||||
## Database Creation
|
## 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.
|
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.
|
||||||
@@ -51,7 +57,7 @@ CREATE USER netbox WITH PASSWORD 'J5brHrAXFLQSif0K';
|
|||||||
GRANT ALL PRIVILEGES ON DATABASE netbox TO netbox;
|
GRANT ALL PRIVILEGES ON DATABASE netbox TO netbox;
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! danger
|
!!! 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.
|
**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.
|
Once complete, enter `\q` to exit the PostgreSQL shell.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.8 or later required"
|
||||||
NetBox v3.0 and later require Python 3.7, 3.8, or 3.9.
|
NetBox v3.2 requires Python 3.8, 3.9, or 3.10.
|
||||||
|
|
||||||
=== "Ubuntu"
|
=== "Ubuntu"
|
||||||
|
|
||||||
@@ -17,19 +17,14 @@ 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 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.8:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo pip3 install --upgrade pip
|
python3 -V
|
||||||
```
|
```
|
||||||
|
|
||||||
## Download NetBox
|
## Download NetBox
|
||||||
@@ -94,7 +89,7 @@ Resolving deltas: 100% (148/148), 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.
|
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
|
||||||
|
|
||||||
@@ -117,11 +112,11 @@ Create a system user account named `netbox`. We'll configure the WSGI and HTTP s
|
|||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
Move into the NetBox configuration directory and make a copy of `configuration.example.py` named `configuration.py`. This file will hold all of your local configuration parameters.
|
Move into the NetBox configuration directory and make a copy of `configuration_example.py` named `configuration.py`. This file will hold all of your local configuration parameters.
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
cd /opt/netbox/netbox/netbox/
|
cd /opt/netbox/netbox/netbox/
|
||||||
sudo cp configuration.example.py configuration.py
|
sudo cp configuration_example.py configuration.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Open `configuration.py` with your preferred editor to begin configuring NetBox. NetBox offers [many configuration parameters](../configuration/index.md), but only the following four are required for new installations:
|
Open `configuration.py` with your preferred editor to begin configuring NetBox. NetBox offers [many configuration parameters](../configuration/index.md), but only the following four are required for new installations:
|
||||||
@@ -195,7 +190,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.
|
||||||
@@ -234,10 +229,10 @@ Once NetBox has been configured, we're ready to proceed with the actual installa
|
|||||||
sudo /opt/netbox/upgrade.sh
|
sudo /opt/netbox/upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that **Python 3.7 or later is required** for NetBox v3.0 and later releases. If the default Python installation on your server does not meet this requirement, you'll need to install Python 3.7 or later separately, and pass the path to the support installation as an environment variable named `PYTHON`. (Note that the environment variable must be passed _after_ the `sudo` command.)
|
Note that **Python 3.8 or later is required** for NetBox v3.2 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
|
```no-highlight
|
||||||
sudo PYTHON=/usr/bin/python3.7 /opt/netbox/upgrade.sh
|
sudo PYTHON=/usr/bin/python3.8 /opt/netbox/upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
@@ -302,7 +297,7 @@ Next, connect to the name or IP of the server (as defined in `ALLOWED_HOSTS`) on
|
|||||||
firewall-cmd --zone=public --add-port=8000/tcp
|
firewall-cmd --zone=public --add-port=8000/tcp
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! danger
|
!!! danger "Not for production use"
|
||||||
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
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ You should see output similar to the following:
|
|||||||
● 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 Mon 2021-08-30 04:02:36 UTC; 14h ago
|
Active: active (running) since Mon 2021-08-30 04:02:36 UTC; 14h ago
|
||||||
Docs: https://netbox.readthedocs.io/en/stable/
|
Docs: https://docs.netbox.dev/
|
||||||
Main PID: 1140492 (gunicorn)
|
Main PID: 1140492 (gunicorn)
|
||||||
Tasks: 19 (limit: 4683)
|
Tasks: 19 (limit: 4683)
|
||||||
Memory: 666.2M
|
Memory: 666.2M
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ LOGGING = {
|
|||||||
'netbox_auth_log': {
|
'netbox_auth_log': {
|
||||||
'level': 'DEBUG',
|
'level': 'DEBUG',
|
||||||
'class': 'logging.handlers.RotatingFileHandler',
|
'class': 'logging.handlers.RotatingFileHandler',
|
||||||
'filename': '/opt/netbox/logs/django-ldap-debug.log',
|
'filename': '/opt/netbox/local/logs/django-ldap-debug.log',
|
||||||
'maxBytes': 1024 * 500,
|
'maxBytes': 1024 * 500,
|
||||||
'backupCount': 5,
|
'backupCount': 5,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,16 +11,12 @@ 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 v3.0 on Ubuntu 20.04 for your reference.
|
|
||||||
|
|
||||||
<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.7 |
|
| Python | 3.8 |
|
||||||
| PostgreSQL | 9.6 |
|
| PostgreSQL | 10 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
Below is a simplified overview of the NetBox application stack for reference:
|
Below is a simplified overview of the NetBox application stack for reference:
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ You can use the command `systemctl status netbox` to verify that the WSGI servic
|
|||||||
● 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 Sat 2020-10-24 19:23:40 UTC; 25s ago
|
Active: active (running) since Sat 2020-10-24 19:23:40 UTC; 25s ago
|
||||||
Docs: https://netbox.readthedocs.io/en/stable/
|
Docs: https://docs.netbox.dev/
|
||||||
Main PID: 11993 (gunicorn)
|
Main PID: 11993 (gunicorn)
|
||||||
Tasks: 6 (limit: 2362)
|
Tasks: 6 (limit: 2362)
|
||||||
CGroup: /system.slice/netbox.service
|
CGroup: /system.slice/netbox.service
|
||||||
|
|||||||
@@ -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 v3.0 and later requires the following:
|
NetBox v3.0 and later require the following:
|
||||||
|
|
||||||
| Dependency | Minimum Version |
|
| Dependency | Minimum Version |
|
||||||
|------------|-----------------|
|
|------------|-----------------|
|
||||||
| Python | 3.7 |
|
| Python | 3.8 |
|
||||||
| PostgreSQL | 9.6 |
|
| PostgreSQL | 10 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
## Install the Latest Release
|
## Install the Latest Release
|
||||||
@@ -67,6 +67,11 @@ sudo git checkout master
|
|||||||
sudo git pull origin master
|
sudo git pull origin master
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!!! info "Checking out an older release"
|
||||||
|
If you need to upgrade to an older version rather than the current stable release, you can check out any valid [git tag](https://github.com/netbox-community/netbox/tags), each of which represents a release. For example, to checkout the code for NetBox v2.11.11, do:
|
||||||
|
|
||||||
|
sudo git checkout v2.11.11
|
||||||
|
|
||||||
## Run the Upgrade Script
|
## Run the Upgrade Script
|
||||||
|
|
||||||
Once the new code is in place, verify that any optional Python packages required by your deployment (e.g. `napalm` or `django-auth-ldap`) are listed in `local_requirements.txt`. Then, run the upgrade script:
|
Once the new code is in place, verify that any optional Python packages required by your deployment (e.g. `napalm` or `django-auth-ldap`) are listed in `local_requirements.txt`. Then, run the upgrade script:
|
||||||
@@ -76,10 +81,10 @@ sudo ./upgrade.sh
|
|||||||
```
|
```
|
||||||
|
|
||||||
!!! warning
|
!!! 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:
|
If the default version of Python is not at least 3.8, 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
|
```no-highlight
|
||||||
sudo PYTHON=/usr/bin/python3.7 ./upgrade.sh
|
sudo PYTHON=/usr/bin/python3.8 ./upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
This script performs the following actions:
|
This script performs the following actions:
|
||||||
|
|||||||
BIN
docs/media/authentication/azure_ad_add_app_registration.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
docs/media/authentication/azure_ad_add_client_secret.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
docs/media/authentication/azure_ad_app_registration.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/media/authentication/azure_ad_app_registration_created.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/media/authentication/azure_ad_client_secret.png
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
BIN
docs/media/authentication/azure_ad_client_secret_created.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/media/authentication/azure_ad_login_portal.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
docs/media/authentication/netbox_azure_ad_login.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
docs/media/authentication/netbox_okta_login.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
docs/media/authentication/okta_create_app_registration.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
docs/media/authentication/okta_integration_parameters.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/media/authentication/okta_login_portal.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
docs/media/authentication/okta_web_app_integration.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
docs/media/development/github_fork_button.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
docs/media/development/github_fork_dialog.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 29 KiB |
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
This model can be used to represent the boundary of a provider network, the details of which are unknown or unimportant to the NetBox user. For example, it might represent a provider's regional MPLS network to which multiple circuits provide connectivity.
|
This model can be used to represent the boundary of a provider network, the details of which are unknown or unimportant to the NetBox user. For example, it might represent a provider's regional MPLS network to which multiple circuits provide connectivity.
|
||||||
|
|
||||||
Each provider network must be assigned to a provider. A circuit may terminate to either a provider network or to a site.
|
Each provider network must be assigned to a provider, and may optionally be assigned an arbitrary service ID. A circuit may terminate to either a provider network or to a site.
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ Device bays represent a space or slot within a parent device in which a child de
|
|||||||
Child devices are first-class Devices in their own right: That is, they are fully independent managed entities which don't share any control plane with the parent. Just like normal devices, child devices have their own platform (OS), role, tags, and components. LAG interfaces may not group interfaces belonging to different child devices.
|
Child devices are first-class Devices in their own right: That is, they are fully independent managed entities which don't share any control plane with the parent. Just like normal devices, child devices have their own platform (OS), role, tags, and components. LAG interfaces may not group interfaces belonging to different child devices.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
Device bays are **not** suitable for modeling line cards (such as those commonly found in chassis-based routers and switches), as these components depend on the control plane of the parent device to operate. 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.
|
Device bays are **not** suitable for modeling line cards (such as those commonly found in chassis-based routers and switches), as these components depend on the control plane of the parent device to operate. Instead, these should be modeled as modules installed within module bays.
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
## Device Bay Templates
|
## Device Bay Templates
|
||||||
|
|
||||||
A template for a device bay that will be created on all instantiations of the parent device type.
|
A template for a device bay that will be created on all instantiations of the parent device type. Device bays hold child devices, such as blade servers.
|
||||||
|
|||||||
@@ -4,11 +4,13 @@ A device type represents a particular make and model of hardware that exists in
|
|||||||
|
|
||||||
Device types are instantiated as devices installed within sites and/or equipment racks. For example, you might define a device type to represent a Juniper EX4300-48T network switch with 48 Ethernet interfaces. You can then create multiple _instances_ of this type named "switch1," "switch2," and so on. Each device will automatically inherit the components (such as interfaces) of its device type at the time of creation. However, changes made to a device type will **not** apply to instances of that device type retroactively.
|
Device types are instantiated as devices installed within sites and/or equipment racks. For example, you might define a device type to represent a Juniper EX4300-48T network switch with 48 Ethernet interfaces. You can then create multiple _instances_ of this type named "switch1," "switch2," and so on. Each device will automatically inherit the components (such as interfaces) of its device type at the time of creation. However, changes made to a device type will **not** apply to instances of that device type retroactively.
|
||||||
|
|
||||||
Some devices house child devices which share physical resources, like space and power, but which functional independently from one another. A common example of this is blade server chassis. Each device type is designated as one of the following:
|
Some devices house child devices which share physical resources, like space and power, but which function independently. A common example of this is blade server chassis. Each device type is designated as one of the following:
|
||||||
|
|
||||||
* A parent device (which has device bays)
|
* A parent device (which has device bays)
|
||||||
* A child device (which must be installed within a device bay)
|
* A child device (which must be installed within a device bay)
|
||||||
* Neither
|
* Neither
|
||||||
|
|
||||||
!!! 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 modules or inventory items within a 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.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
## Interfaces
|
## Interfaces
|
||||||
|
|
||||||
Interfaces in NetBox represent network interfaces used to exchange data with connected devices. On modern networks, these are most commonly Ethernet, but other types are supported as well. Each interface must be assigned a type, and may optionally be assigned a MAC address, MTU, and IEEE 802.1Q mode (tagged or access). Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management).
|
Interfaces in NetBox represent network interfaces used to exchange data with connected devices. On modern networks, these are most commonly Ethernet, but other types are supported as well. Each interface must be assigned a type, and may optionally be assigned a MAC address, MTU, and IEEE 802.1Q mode (tagged or access). Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management). Additionally, each interface may optionally be assigned to a VRF.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
Although devices and virtual machines both can have interfaces, a separate model is used for each. Thus, device interfaces have some properties that are not present on virtual machine interfaces and vice versa.
|
Although devices and virtual machines both can have interfaces, a separate model is used for each. Thus, device interfaces have some properties that are not present on virtual machine interfaces and vice versa.
|
||||||
@@ -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.)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Inventory Items
|
# Inventory Items
|
||||||
|
|
||||||
Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. Inventory items are distinct from other device components in that they cannot be templatized on a device type, and cannot be connected by cables. They are intended to be used primarily for inventory purposes.
|
Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. They are intended to be used primarily for inventory purposes.
|
||||||
|
|
||||||
Each inventory item can be assigned a manufacturer, part ID, serial number, and asset tag (all optional). A boolean toggle is also provided to indicate whether each item was entered manually or discovered automatically (by some process outside of NetBox).
|
Each inventory item can be assigned a functional role, manufacturer, part ID, serial number, and asset tag (all optional). A boolean toggle is also provided to indicate whether each item was entered manually or discovered automatically (by some process outside NetBox).
|
||||||
|
|
||||||
Inventory items are hierarchical in nature, such that any individual item may be designated as the parent for other items. For example, an inventory item might be created to represent a line card which houses several SFP optics, each of which exists as a child item within the device.
|
Inventory items are hierarchical in nature, such that any individual item may be designated as the parent for other items. For example, an inventory item might be created to represent a line card which houses several SFP optics, each of which exists as a child item within the device. An inventory item may also be associated with a specific component within the same device. For example, you may wish to associate a transceiver with an interface.
|
||||||
|
|||||||
3
docs/models/dcim/inventoryitemrole.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Inventory Item Roles
|
||||||
|
|
||||||
|
Inventory items can be organized by functional roles, which are fully customizable by the user. For example, you might create roles for power supplies, fans, interface optics, etc.
|
||||||
3
docs/models/dcim/inventoryitemtemplate.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Inventory Item Templates
|
||||||
|
|
||||||
|
A template for an inventory item that will be automatically created when instantiating a new device. All attributes of this object will be copied to the new inventory item, including the associations with a parent item and assigned component, if any.
|
||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
5
docs/models/dcim/module.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Modules
|
||||||
|
|
||||||
|
A module is a field-replaceable hardware component installed within a device which houses its own child components. The most common example is a chassis-based router or switch.
|
||||||
|
|
||||||
|
Similar to devices, modules are instantiated from module types, and any components associated with the module type are automatically instantiated on the new model. Each module must be installed within a module bay on a device, and each module bay may have only one module installed in it. A module may optionally be assigned a serial number and asset tag.
|
||||||
3
docs/models/dcim/modulebay.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
## Module Bays
|
||||||
|
|
||||||
|
Module bays represent a space or slot within a device in which a field-replaceable module may be installed. A common example is that of a chassis-based switch such as the Cisco Nexus 9000 or Juniper EX9200. Modules in turn hold additional components that become available to the parent device.
|
||||||
3
docs/models/dcim/modulebaytemplate.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
## Module Bay Templates
|
||||||
|
|
||||||
|
A template for a module bay that will be created on all instantiations of the parent device type. Module bays hold installed modules that do not have an independent management plane, such as line cards.
|
||||||
23
docs/models/dcim/moduletype.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Module Types
|
||||||
|
|
||||||
|
A module type represent a specific make and model of hardware component which is installable within a device and has its own child components. For example, consider a chassis-based switch or router with a number of field-replaceable line cards. Each line card has its own model number and includes a certain set of components such as interfaces. Each module type may have a manufacturer, model number, and part number assigned to it.
|
||||||
|
|
||||||
|
Similar to device types, each module type can have any of the following component templates associated with it:
|
||||||
|
|
||||||
|
* Interfaces
|
||||||
|
* Console ports
|
||||||
|
* Console server ports
|
||||||
|
* Power ports
|
||||||
|
* Power Outlets
|
||||||
|
* Front pass-through ports
|
||||||
|
* Rear pass-through ports
|
||||||
|
|
||||||
|
Note that device bays and module bays may _not_ be added to modules.
|
||||||
|
|
||||||
|
## Automatic Component Renaming
|
||||||
|
|
||||||
|
When adding component templates to a module type, the string `{module}` can be used to reference the `position` field of the module bay into which an instance of the module type is being installed.
|
||||||
|
|
||||||
|
For example, you can create a module type with interface templates named `Gi{module}/0/[1-48]`. When a new module of this type is "installed" to a module bay with a position of "3", NetBox will automatically name these interfaces `Gi3/0/[1-48]`.
|
||||||
|
|
||||||
|
Automatic renaming is supported for all modular component types (those listed above).
|
||||||
@@ -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,8 @@
|
|||||||
|
|
||||||
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, 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, virtual interfaces, and other attributes related to managing the VC.
|
||||||
|
If a VC master is defined, interfaces from all VC members are displayed when navigating to its device interfaces view. This does not include other members interfaces declared as management-only.
|
||||||
|
|
||||||
!!! 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.
|
||||||
|
|||||||
@@ -11,14 +11,18 @@ Within the database, custom fields are stored as JSON data directly alongside ea
|
|||||||
Custom fields may be created by navigating to Customization > 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
|
||||||
|
* Object: A single NetBox object of the type defined by `object_type`
|
||||||
|
* Multiple object: One or more NetBox objects of the type defined by `object_type`
|
||||||
|
|
||||||
Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form.
|
Each custom field must have a name. This should be a simple database-friendly string (e.g. `tps_report`) and may contain only alphanumeric characters and underscores. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form.
|
||||||
|
|
||||||
Marking a field as required will force the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields, or the exact value of a choice for selection fields.
|
Marking a field as required will force the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields, or the exact value of a choice for selection fields.
|
||||||
|
|
||||||
@@ -39,3 +43,7 @@ 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 Object Fields
|
||||||
|
|
||||||
|
An object or multi-object custom field can be used to refer to a particular NetBox object or objects as the "value" for a custom field. These custom fields must define an `object_type`, which determines the type of object to which custom field instances point.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
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 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 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`.
|
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 in 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, and each link can be enabled or disabled individually.
|
||||||
|
|
||||||
!!! 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.
|
||||||
@@ -25,13 +25,18 @@ Custom links appear as buttons in the top right corner of the page. Numeric weig
|
|||||||
The following context data is available within the template when rendering a custom link's text or URL.
|
The following context data is available within the template when rendering a custom link's text or URL.
|
||||||
|
|
||||||
| Variable | Description |
|
| Variable | Description |
|
||||||
|----------|-------------|
|
|-----------|-------------------------------------------------------------------------------------------------------------------|
|
||||||
| `obj` | The NetBox object being displayed |
|
| `object` | The NetBox object being displayed |
|
||||||
|
| `obj` | Same as `object`; maintained for backward compatability until NetBox v3.5 |
|
||||||
| `debug` | A boolean indicating whether debugging is enabled |
|
| `debug` | A boolean indicating whether debugging is enabled |
|
||||||
| `request` | The current WSGI request |
|
| `request` | The current WSGI request |
|
||||||
| `user` | The current user (if authenticated) |
|
| `user` | The current user (if authenticated) |
|
||||||
| `perms` | The [permissions](https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions) assigned to the user |
|
| `perms` | The [permissions](https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions) assigned to the user |
|
||||||
|
|
||||||
|
While most of the context variables listed above will have consistent attributes, the object will be an instance of the specific object being viewed when the link is rendered. Different models have different fields and properties, so you may need to some research to determine the attributes available for use within your template for a specific object type.
|
||||||
|
|
||||||
|
Checking the REST API representation of an object is generally a convenient way to determine what attributes are available. You can also reference the NetBox source code directly for a comprehensive list.
|
||||||
|
|
||||||
## Conditional Rendering
|
## Conditional Rendering
|
||||||
|
|
||||||
Only links which render with non-empty text are included on the page. You can employ conditional Jinja2 logic to control the conditions under which a link gets rendered.
|
Only links which render with non-empty text are included on the page. You can employ conditional Jinja2 logic to control the conditions under which a link gets rendered.
|
||||||
@@ -55,3 +60,7 @@ The link will only appear when viewing a device with a manufacturer name of "Cis
|
|||||||
## Link Groups
|
## Link Groups
|
||||||
|
|
||||||
Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group.
|
Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group.
|
||||||
|
|
||||||
|
## Table Columns
|
||||||
|
|
||||||
|
Custom links can also be included in object tables by selecting the desired links from the table configuration form. When displayed, each link will render as a hyperlink for its corresponding object. When exported (e.g. as CSV data), each link render only its URL.
|
||||||
|
|||||||
@@ -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.
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
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.
|
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
|
!!! 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.
|
Webhooks support the inclusion of user-submitted code to generate URL, custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
@@ -12,17 +12,18 @@ A webhook is a mechanism for conveying to some external system a change that too
|
|||||||
* **Enabled** - If unchecked, the webhook will be inactive.
|
* **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.
|
* **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`.
|
* **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.
|
* **URL** - The fully-qualified URL of the request to be sent. This may specify a destination port number if needed. Jinja2 templating is supported for this field.
|
||||||
* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`)
|
* **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).
|
* **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.)
|
* **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.
|
* **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!)
|
* **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).
|
* **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 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.
|
[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `URL`, `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:
|
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:
|
||||||
|
|
||||||
|
|||||||
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
|
||||||
|
|
||||||
|
|
||||||
10
docs/models/ipam/fhrpgroup.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# 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.
|
||||||
5
docs/models/ipam/fhrpgroupassignment.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# 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.
|
||||||
3
docs/models/ipam/servicetemplate.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Service Templates
|
||||||
|
|
||||||
|
Service templates can be used to instantiate services on devices and virtual machines. A template defines a name, protocol, and port number(s), and may optionally include a description. Services can be instantiated from templates and applied to devices and/or virtual machines, and may be associated with specific IP addresses.
|
||||||
@@ -2,4 +2,6 @@
|
|||||||
|
|
||||||
VLAN groups can be used to organize VLANs within NetBox. Each VLAN group can be scoped to a particular region, site group, site, location, rack, cluster group, or cluster. Member VLANs will be available for assignment to devices and/or virtual machines within the specified scope.
|
VLAN groups can be used to organize VLANs within NetBox. Each VLAN group can be scoped to a particular region, site group, site, location, rack, cluster group, or cluster. Member VLANs will be available for assignment to devices and/or virtual machines within the specified scope.
|
||||||
|
|
||||||
|
A minimum and maximum child VLAN ID must be set for each group. (These default to 1 and 4094 respectively.) VLANs created within a group must have a VID that falls between these values (inclusive).
|
||||||
|
|
||||||
Groups can also be used to enforce uniqueness: Each VLAN within a group must have a unique ID and name. VLANs which are not assigned to a group may have overlapping names and IDs (including VLANs which belong to a common site). For example, you can create two VLANs with ID 123, but they cannot both be assigned to the same group.
|
Groups can also be used to enforce uniqueness: Each VLAN within a group must have a unique ID and name. VLANs which are not assigned to a group may have overlapping names and IDs (including VLANs which belong to a common site). For example, you can create two VLANs with ID 123, but they cannot both be assigned to the same group.
|
||||||
|
|||||||
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.
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
A token is a unique identifier mapped to a NetBox user account. Each user may have one or more tokens which he or she can use for authentication when making REST API requests. To create a token, navigate to the API tokens page under your user profile.
|
A token is a unique identifier mapped to a NetBox user account. Each user may have one or more tokens which he or she can use for authentication when making REST API requests. To create a token, navigate to the API tokens page under your user profile.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
The creation and modification of API tokens can be restricted per user by an administrator. If you don't see an option to create an API token, ask an administrator to grant you access.
|
All users can create and manage REST API tokens under the user control panel in the UI. The ability to view, add, change, or delete tokens via the REST API itself is controlled by the relevant model permissions, assigned to users and/or groups in the admin UI. These permissions should be used with great care to avoid accidentally permitting a user to create tokens for other user accounts.
|
||||||
|
|
||||||
Each token contains a 160-bit key represented as 40 hexadecimal characters. When creating a token, you'll typically leave the key field blank so that a random key will be automatically generated. However, NetBox allows you to specify a key in case you need to restore a previously deleted token to operation.
|
Each token contains a 160-bit key represented as 40 hexadecimal characters. When creating a token, you'll typically leave the key field blank so that a random key will be automatically generated. However, NetBox allows you to specify a key in case you need to restore a previously deleted token to operation.
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||