Compare commits

...

114 Commits
1.1.0 ... 1.3.0

Author SHA1 Message Date
6c5434ee20 Merge pull request #557 from netbox-community/develop
Version 1.3.0: Compatibility with Netbox v3
2021-08-30 21:29:25 +02:00
8e0c795791 Prepare version 1.3.0 2021-08-30 21:07:01 +02:00
1fd8d105e6 Merge pull request #543 from tobiasge/prepare-3.0.0
Prepare for Netbox v3.0.0
2021-08-30 18:05:54 +02:00
fe4df4f70a Merge pull request #556 from netbox-community/disableDependencyDashboard 2021-08-30 12:54:31 +02:00
650e62f44f Disable Renovate's "Dependency Dashboard" 2021-08-30 12:31:36 +02:00
f8451b0c0a Merge pull request #555 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.16
2021-08-29 15:51:02 +02:00
3af075e039 Update dependency ruamel.yaml to v0.17.16 2021-08-29 13:05:16 +00:00
26d45b1e85 Merge pull request #554 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.14
2021-08-26 15:07:24 +02:00
9b6c476bf9 Update dependency ruamel.yaml to v0.17.14 2021-08-25 20:34:39 +00:00
c5a1557800 Removed deprecated settings 2021-08-21 18:22:24 +02:00
9d476fa9af Build documentation files in the image 2021-08-21 18:22:24 +02:00
9142aaf78e django-cacheops has been removed from Netbox 3.0.0 2021-08-21 18:22:24 +02:00
b258b6578c Merge pull request #552 from netbox-community/renovate/ruamel.yaml-0.x 2021-08-21 18:03:42 +02:00
289540f576 Update dependency ruamel.yaml to v0.17.13 2021-08-21 14:53:54 +00:00
26a3f5fcc0 Merge pull request #551 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.11
2021-08-19 11:27:59 +02:00
18ea220102 Update dependency ruamel.yaml to v0.17.11 2021-08-19 06:45:17 +00:00
3c01985e20 Merge pull request #542 from netbox-community/renovate/django-auth-ldap-3.x
Update dependency django-auth-ldap to v3
2021-07-30 11:16:28 +02:00
275d2673b4 Update dependency django-auth-ldap to v3 2021-07-19 07:56:47 +00:00
746aa9b4a6 Merge pull request #534 from tobiasge/alpine-update
Alpine update to 3.14
2021-07-08 10:41:22 +02:00
c13bec47b8 Merge pull request #537 from insidieux/disable-server-side-cursors-option
Disable server side cursors option
2021-07-07 09:51:05 +02:00
9953d11fd8 Merge pull request #536 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.10
2021-07-07 09:47:56 +02:00
b2ee468871 Alpine update to 3.14 2021-07-07 09:44:21 +02:00
dd41d09b43 Add possibility to disable server side cursors 2021-06-24 18:21:08 +03:00
abfa6c989f Update dependency ruamel.yaml to v0.17.10 2021-06-24 09:38:10 +00:00
bb3d964b89 Merge pull request #533 from netbox-community/renovate/napalm-3.x
Update dependency napalm to v3.3.1
2021-06-23 21:47:32 +02:00
6bbc7a3a84 Update dependency napalm to v3.3.1 2021-06-18 12:29:27 +00:00
17b1a5022d Merge pull request #531 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.9
2021-06-10 17:19:06 +02:00
e38d646e8e Update dependency ruamel.yaml to v0.17.9 2021-06-10 06:57:09 +00:00
bb298e7a01 Merge pull request #530 from netbox-community/renovate/ruamel.yaml-0.x 2021-06-09 20:01:41 +02:00
98840382b9 Update dependency ruamel.yaml to v0.17.8 2021-06-09 13:53:48 +00:00
b8ff0a1d43 Merge pull request #524 from jlemesh/fix/initialize_tenants_before_sites
Initialize tenants before sites
2021-06-03 11:29:53 +02:00
15b097bd3e Add second tenant with group to site 2021-06-01 14:22:08 +03:00
e0b34b8c67 Merge pull request #527 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.7
2021-06-01 09:45:02 +02:00
3aad44d68c Update dependency ruamel.yaml to v0.17.7 2021-05-31 15:28:52 +00:00
6658d069fb Merge pull request #520 from cimnine/PinNetboxMinor 2021-05-31 11:26:51 +02:00
52f097d4a2 Merge pull request #525 from netbox-community/renovate/ruamel.yaml-0.x 2021-05-31 11:25:56 +02:00
f4e9ebcfb5 Update dependency ruamel.yaml to v0.17.6 2021-05-31 08:58:27 +00:00
057728b774 Allow sites to be initialized with tenants 2021-05-28 11:26:34 +03:00
5b618851c0 Pin the NetBox Docker version in the docker-compose.yml file 2021-05-26 19:05:37 +02:00
9f531ce0f7 Merge pull request #518 from netbox-community/renovate/github-super-linter-4.x 2021-05-26 16:46:24 +02:00
dd732d7bc2 Update github/super-linter action to v4 2021-05-25 20:35:56 +00:00
05bb40adb1 Merge pull request #511 from netbox-community/renovate/napalm-3.x
Update dependency napalm to v3.3.0
2021-05-19 09:02:18 +02:00
240326ef37 Update dependency napalm to v3.3.0 2021-05-18 13:30:10 +00:00
c49fa313ed Merge pull request #514 from tobiasge/ttf-ubuntu
Remove 'ttf-ubuntu-font-family' from image
2021-05-18 14:23:32 +02:00
ff6bd95fce Merge pull request #513 from tobiasge/remove-secret-initializers
Secrets are removed in Netbox 2.12
2021-05-18 14:23:07 +02:00
0def662e53 Merge pull request #508 from netbox-community/renovate/postgres-13.x
Update postgres Docker tag to v13
2021-05-18 14:22:45 +02:00
49b7c267b9 Update postgres Docker tag to v13 2021-05-18 08:03:10 +00:00
02f30f3a68 'ttf-ubuntu-font-family' was remove from Alpine 2021-05-18 09:34:44 +02:00
e2cc9386fb Secrets are removed in Netbox 2.12 2021-05-18 09:32:48 +02:00
43b8b36951 Merge pull request #507 from tobiasge/run-update-when-needed
Optimise migrations on startup
2021-05-18 08:55:31 +02:00
4d320f34d5 Optimise migrations on startup
The migrations are only started if there are some that have not been
applied. Additionally the maintenace task needed after an update are
now run after the migrations
2021-05-05 11:42:25 +02:00
676ca798cd Merge pull request #493 from netbox-community/develop
Release 1.2.0
2021-04-27 09:47:38 +02:00
60428d5639 Merge pull request #498 from tobiasge/build-feature-branch
Build feature branch
2021-04-27 09:16:06 +02:00
fd55ec220c Merge pull request #497 from ryanmerolle/startup-scripts-2.10+
user, group, & permissions fix
2021-04-27 09:05:14 +02:00
73b07a7181 Merge pull request #500 from ryanmerolle/python-formatting
Python formatting Startup Scripts
2021-04-26 16:32:49 +02:00
1f3d9463f9 apply black formating to all startup_scripts 2021-04-26 10:26:10 -04:00
8678ad92ce update permission user & group lookup as suggested 2021-04-26 09:17:25 -04:00
5b34df1471 Build feature branch
The branch for the next version of Netbox is now called "feature".
2021-04-26 09:44:52 +02:00
3d063a4b35 Merge branch 'ryanmerolle-plugins-and-logging' into develop 2021-04-26 08:55:41 +02:00
f924e76adf Formatting 2021-04-26 08:55:22 +02:00
604ff3b76d Merge branch 'plugins-and-logging' of https://github.com/ryanmerolle/netbox-docker into ryanmerolle-plugins-and-logging 2021-04-26 08:54:31 +02:00
96545135cb remove example evn var for logging 2021-04-25 16:38:03 -04:00
474ca9e78f fully working object permissions 2021-04-25 16:31:50 -04:00
12401f2a3f correct black formatting for object_permissions.py 2021-04-25 12:13:27 -04:00
528bc17eb8 correct flake8 in object_permissions.py 2021-04-25 11:59:13 -04:00
4e31218ce6 update object permission conditionals 2021-04-25 11:15:46 -04:00
d1b70ba2d4 Merge pull request #499 from ryanmerolle/ldap-example-var-name 2021-04-24 23:58:30 +02:00
ff0bc9757a correct ldap example var name case 2021-04-24 10:57:15 -04:00
a1e0c52825 revert startup scripts to use key for object name 2021-04-24 10:41:06 -04:00
45889c3811 commented out the logging 2021-04-23 22:38:38 -04:00
71d8ac10ac correct issues with users.yml spacing 2021-04-21 12:59:30 -04:00
744ed91e2a permissions script cleanup 2021-04-21 12:33:35 -04:00
b1bcfcbc4e fix isort on groups & permissions scripts 2021-04-21 08:27:20 -04:00
a7a5d13637 updated given linting feedback 2021-04-20 18:05:47 -04:00
5d4ecb7f9e user, group, & permissions fix 2021-04-20 17:47:49 -04:00
69dd87689c switch plugin example to netbox_bgp 2021-04-20 07:55:12 -04:00
9fab9a3434 mention plugin wiki page in plugins.py comment 2021-04-20 07:52:08 -04:00
b69a97d2ca add LOGLEVEL into netbox.env 2021-04-20 07:48:41 -04:00
8176ef8499 Add expample logging configuration 2021-04-20 07:46:39 -04:00
eb5cc88b25 Add expample plugin configuration 2021-04-20 07:46:29 -04:00
f2731d3fe6 Merge pull request #448 from ryanmerolle/develop
AUTH_LDAP_MIRROR_GROUPS ldap_config tweak
2021-04-20 10:15:52 +02:00
6f4d025cb7 backed out ldap_config changes 2021-04-20 03:38:20 -04:00
222ede2c4b enahance ldap extra.py with more examples 2021-04-20 03:35:57 -04:00
5304c8f901 Merge pull request #483 from netbox-community/renovate/django-auth-ldap-2.x
Update dependency django-auth-ldap to v2.4.0
2021-04-20 09:24:20 +02:00
28a26288c9 Merge pull request #3 from netbox-community/develop
pull in develop changes
2021-04-19 22:25:55 -04:00
53d759e263 Update dependency django-auth-ldap to v2.4.0 2021-04-19 13:13:02 +00:00
6879412e2b Merge pull request #495 from tobiasge/no-random-port
Don't publish Netbox on random port
2021-04-19 11:33:23 +02:00
a89d2e035c Don't publish Netbox on random port 2021-04-17 10:16:40 +02:00
d5c92e9a7d Preparation for 1.2.0 2021-04-16 20:27:33 +02:00
c7df608696 Merge pull request #485 from tobiasge/prepare-2.11
Initializer updates for Netbox 2.11
2021-04-16 20:00:35 +02:00
eee07f703a Merge pull request #492 from jhujhiti/upstreaming
Fix quoting of exec argument in the entrypoint script
2021-04-16 08:42:15 +02:00
6e7d5a6f59 Fix quoting of exec argument in the entrypoint script 2021-04-15 17:36:14 -04:00
752f592e58 Fixed Python f-string
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-04-13 15:50:23 +02:00
f637de88f0 Improved error logging 2021-04-13 14:38:52 +02:00
a5da38203f Merge pull request #482 from Daimler/custom-link-error-fix
Fixes #480: Custom Links initialiser breaks if content_type is invalid
2021-04-13 09:33:41 +02:00
14c0d17704 Merge pull request #486 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.4
2021-04-12 17:12:05 +02:00
a572d5f5de Update dependency ruamel.yaml to v0.17.4 2021-04-07 20:52:56 +00:00
3673196c16 Fields in Custom links have been renamed 2021-04-07 15:19:14 +02:00
9874cef369 VLAN Groups can be scoped to multiple types 2021-04-07 15:18:33 +02:00
1c4b6741ac Fixed isort issues 2021-04-07 11:01:01 +02:00
b18e4aaf92 Fix super-linter on PRs
See: https://github.com/github/super-linter#example-connecting-github-action-workflow
2021-04-07 10:57:14 +02:00
45824ba4f3 Devices can be added to locations 2021-04-07 09:57:59 +02:00
5944086435 Rack groups have been renamed to locations 2021-04-07 09:40:58 +02:00
a2e33c166d Fix link name reference if content type is invalid
Currently, the name of a custom link is referenced
as if it is an object attribute which causes a break
due to it actually being a dictionary.

This minor change means that the startup script won't
*ahem* fail upon failing :)

Signed-Off-by: Marcus Crane <marcus.crane@daimler.com>
2021-04-01 18:48:13 +13:00
9ab202f921 Merge pull request #479 from netbox-community/renovate/ruamel.yaml-0.x 2021-03-29 19:25:17 +02:00
cca79b5dbd Update dependency ruamel.yaml to v0.17.2 2021-03-29 17:03:30 +00:00
61eecdd343 Merge pull request #477 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.0
2021-03-26 18:16:33 +01:00
ce6fe5cb83 Update dependency ruamel.yaml to v0.17.0 2021-03-26 11:37:33 +00:00
8f119ede13 Merge pull request #469 from cimnine/Sponsoring
Sponsor Message
2021-03-12 18:31:53 +01:00
edb61f3d90 Sponsor Message 2021-03-11 19:06:49 +01:00
f19d650412 Merge pull request #1 from netbox-community/develop
Merge upstream changes
2021-02-25 12:14:16 -05:00
0dec4d8df4 Add extra.py example for ldap config 2021-02-22 16:00:08 -05:00
22186b267d do not set AUTH_LDAP_MIRROR_GROUPS if not defined 2021-02-22 15:55:40 -05:00
020e0adeb4 update .gitignore to keep extra.py in ldap config 2021-02-22 15:53:02 -05:00
44 changed files with 336 additions and 245 deletions

View File

@ -14,9 +14,12 @@ jobs:
name: Checks syntax of our code
steps:
- uses: actions/checkout@v2
with:
# Full git history is needed to get a proper list of changed files within `super-linter`
fetch-depth: 0
- uses: actions/setup-python@v2
- name: Lint Code Base
uses: github/super-linter@v3
uses: github/super-linter@v4
env:
DEFAULT_BRANCH: develop
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -39,7 +42,7 @@ jobs:
build_cmd:
- ./build-latest.sh
- PRERELEASE=true ./build-latest.sh
- ./build-next.sh
- ./build.sh feature
- ./build.sh develop
docker_from:
- '' # use the default of the build script

View File

@ -14,7 +14,7 @@ jobs:
build_cmd:
- ./build-latest.sh
- PRERELEASE=true ./build-latest.sh
- ./build-next.sh
- ./build.sh feature
- ./build.sh develop
fail-fast: false
runs-on: ubuntu-latest

3
.gitignore vendored
View File

@ -7,6 +7,9 @@ configuration/*
!configuration/configuration.py
!configuration/extra.py
configuration/ldap/*
!configuration/ldap/extra.py
!configuration/ldap/ldap_config.py
!configuration/logging.py
!configuration/plugins.py
prometheus.yml
super-linter.log

View File

@ -11,7 +11,7 @@ RUN apk add --no-cache \
jpeg-dev \
libevent-dev \
libffi-dev \
libressl-dev \
openssl-dev \
libxslt-dev \
musl-dev \
openldap-dev \
@ -45,12 +45,11 @@ RUN apk add --no-cache \
libevent \
libffi \
libjpeg-turbo \
libressl \
openssl \
libxslt \
postgresql-libs \
python3 \
py3-pip \
ttf-ubuntu-font-family \
unit \
unit-python3
@ -75,6 +74,8 @@ WORKDIR /opt/netbox/netbox
# to g+w so that pictures can be uploaded to netbox.
RUN mkdir -p static /opt/unit/state/ /opt/unit/tmp/ \
&& chmod -R g+w media /opt/unit/ \
&& cd /opt/netbox/ && /opt/netbox/venv/bin/python -m mkdocs build \
--config-file /opt/netbox/mkdocs.yml --site-dir /opt/netbox/netbox/project-static/docs/ \
&& SECRET_KEY="dummy" /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py collectstatic --no-input
ENTRYPOINT [ "/opt/netbox/docker-entrypoint.sh" ]

View File

@ -134,8 +134,7 @@ It runs NetBox's own unit tests and ensures that all initializers work:
IMAGE=netboxcommunity/netbox:latest ./test.sh
```
## About
## Support
This repository is currently maintained and funded by [nxt][nxt].
[nxt]: https://nxt.engineering/en/
This repository is currently maintained by the community.
Please consider sponsoring the maintainers of this project.

View File

@ -1 +1 @@
1.1.0
1.3.0

View File

@ -1,39 +0,0 @@
#!/bin/bash
# Builds develop, develop-* and master branches of NetBox
echo "▶️ $0 $*"
###
# Checking for the presence of GITHUB_OAUTH_CLIENT_ID
# and GITHUB_OAUTH_CLIENT_SECRET
###
if [ -n "${GITHUB_OAUTH_CLIENT_ID}" ] && [ -n "${GITHUB_OAUTH_CLIENT_SECRET}" ]; then
echo "🗝 Performing authenticated Github API calls."
GITHUB_OAUTH_PARAMS="client_id=${GITHUB_OAUTH_CLIENT_ID}&client_secret=${GITHUB_OAUTH_CLIENT_SECRET}"
else
echo "🕶 Performing unauthenticated Github API calls. This might result in lower Github rate limits!"
GITHUB_OAUTH_PARAMS=""
fi
###
# Calling Github to get the all branches
###
ORIGINAL_GITHUB_REPO="${SRC_ORG-netbox-community}/${SRC_REPO-netbox}"
GITHUB_REPO="${GITHUB_REPO-$ORIGINAL_GITHUB_REPO}"
URL_RELEASES="https://api.github.com/repos/${GITHUB_REPO}/branches?${GITHUB_OAUTH_PARAMS}"
# Composing the JQ commans to extract the most recent version number
JQ_NEXT='map(.name) | .[] | scan("^[^v].+") | match("^(develop-).*") | .string'
CURL="curl -sS"
# Querying the Github API to fetch all branches
NEXT=$($CURL "${URL_RELEASES}" | jq -r "$JQ_NEXT")
if [ -n "$NEXT" ]; then
# shellcheck disable=SC2068
./build.sh "${NEXT}" $@
else
echo "No branch matching 'develop-*' found"
echo "::set-output name=skipped::true"
fi

View File

@ -49,7 +49,7 @@ if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
echo " DOCKERFILE The name of Dockerfile to use."
echo " Default: Dockerfile"
echo " DOCKER_FROM The base image to use."
echo " Default: 'alpine:3.13'"
echo " Default: 'alpine:3.14'"
echo " DOCKER_TARGET A specific target to build."
echo " It's currently not possible to pass multiple targets."
echo " Default: main ldap"
@ -125,7 +125,7 @@ if [ "${2}" != "--push-only" ] && [ -z "${SKIP_GIT}" ]; then
(
$DRY cd "${NETBOX_PATH}"
# shellcheck disable=SC2030
if [ -n "${HTTP_PROXY}" ]; then
git config http.proxy "${HTTP_PROXY}"
fi
@ -157,7 +157,7 @@ fi
# Determining the value for DOCKER_FROM
###
if [ -z "$DOCKER_FROM" ]; then
DOCKER_FROM="alpine:3.13"
DOCKER_FROM="alpine:3.14"
fi
###
@ -345,6 +345,7 @@ for DOCKER_TARGET in "${DOCKER_TARGETS[@]}"; do
if [ -n "${DOCKER_FROM}" ]; then
DOCKER_BUILD_ARGS+=(--build-arg "FROM=${DOCKER_FROM}")
fi
# shellcheck disable=SC2031
if [ -n "${HTTP_PROXY}" ]; then
DOCKER_BUILD_ARGS+=(--build-arg "http_proxy=${HTTP_PROXY}")
DOCKER_BUILD_ARGS+=(--build-arg "https_proxy=${HTTPS_PROXY}")

View File

@ -48,6 +48,8 @@ DATABASE = {
# Database connection SSLMODE
'CONN_MAX_AGE': int(environ.get('DB_CONN_MAX_AGE', '300')),
# Max database connection age
'DISABLE_SERVER_SIDE_CURSORS': environ.get('DB_DISABLE_SERVER_SIDE_CURSORS', 'False').lower() == 'true',
# Disable the use of server-side cursors transaction pooling
}
# Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate
@ -106,9 +108,6 @@ BANNER_LOGIN = environ.get('BANNER_LOGIN', '')
# BASE_PATH = 'netbox/'
BASE_PATH = environ.get('BASE_PATH', '')
# Cache timeout in seconds. Set to 0 to dissable caching. Defaults to 900 (15 minutes)
CACHE_TIMEOUT = int(environ.get('CACHE_TIMEOUT', 900))
# Maximum number of days to retain logged changes. Set to 0 to retain changes indefinitely. (Default: 90)
CHANGELOG_RETENTION = int(environ.get('CHANGELOG_RETENTION', 90))
@ -210,9 +209,6 @@ REMOTE_AUTH_HEADER = environ.get('REMOTE_AUTH_HEADER', 'HTTP_REMOTE_USER')
REMOTE_AUTH_AUTO_CREATE_USER = environ.get('REMOTE_AUTH_AUTO_CREATE_USER', 'True').lower() == 'true'
REMOTE_AUTH_DEFAULT_GROUPS = list(filter(None, environ.get('REMOTE_AUTH_DEFAULT_GROUPS', '').split(' ')))
# This determines how often the GitHub API is called to check the latest release of NetBox. Must be at least 1 hour.
RELEASE_CHECK_TIMEOUT = int(environ.get('RELEASE_CHECK_TIMEOUT', 24 * 3600))
# This repository is used to check whether there is a new release of NetBox available. Set to None to disable the
# version check or use the URL below to check for release in the official NetBox repository.
# https://api.github.com/repos/netbox-community/netbox/releases

View File

@ -0,0 +1,28 @@
####
## This file contains extra configuration options that can't be configured
## directly through environment variables.
## All vairables set here overwrite any existing found in ldap_config.py
####
# # This Python script inherits all the imports from ldap_config.py
# from django_auth_ldap.config import LDAPGroupQuery # Imported since not in ldap_config.py
# # Sets a base requirement of membetship to netbox-user-ro, netbox-user-rw, or netbox-user-admin.
# AUTH_LDAP_REQUIRE_GROUP = (
# LDAPGroupQuery("cn=netbox-user-ro,ou=groups,dc=example,dc=com")
# | LDAPGroupQuery("cn=netbox-user-rw,ou=groups,dc=example,dc=com")
# | LDAPGroupQuery("cn=netbox-user-admin,ou=groups,dc=example,dc=com")
# )
# # Sets LDAP Flag groups variables with example.
# AUTH_LDAP_USER_FLAGS_BY_GROUP = {
# "is_staff": (
# LDAPGroupQuery("cn=netbox-user-ro,ou=groups,dc=example,dc=com")
# | LDAPGroupQuery("cn=netbox-user-rw,ou=groups,dc=example,dc=com")
# | LDAPGroupQuery("cn=netbox-user-admin,ou=groups,dc=example,dc=com")
# ),
# "is_superuser": "cn=netbox-user-admin,ou=groups,dc=example,dc=com",
# }
# # Sets LDAP Mirror groups variables with example groups
# AUTH_LDAP_MIRROR_GROUPS = ["netbox-user-ro", "netbox-user-rw", "netbox-user-admin"]

55
configuration/logging.py Normal file
View File

@ -0,0 +1,55 @@
# # Remove first comment(#) on each line to implement this working logging example.
# # Add LOGLEVEL environment variable to netbox if you use this example & want a different log level.
# from os import environ
# # Set LOGLEVEL in netbox.env or docker-compose.overide.yml to override a logging level of INFO.
# LOGLEVEL = environ.get('LOGLEVEL', 'INFO')
# LOGGING = {
# 'version': 1,
# 'disable_existing_loggers': False,
# 'formatters': {
# 'verbose': {
# 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
# 'style': '{',
# },
# 'simple': {
# 'format': '{levelname} {message}',
# 'style': '{',
# },
# },
# 'filters': {
# 'require_debug_false': {
# '()': 'django.utils.log.RequireDebugFalse',
# },
# },
# 'handlers': {
# 'console': {
# 'level': LOGLEVEL,
# 'filters': ['require_debug_false'],
# 'class': 'logging.StreamHandler',
# 'formatter': 'simple'
# },
# 'mail_admins': {
# 'level': 'ERROR',
# 'class': 'django.utils.log.AdminEmailHandler',
# 'filters': ['require_debug_false']
# }
# },
# 'loggers': {
# 'django': {
# 'handlers': ['console'],
# 'propagate': True,
# },
# 'django.request': {
# 'handlers': ['mail_admins'],
# 'level': 'ERROR',
# 'propagate': False,
# },
# 'django_auth_ldap': {
# 'handlers': ['console',],
# 'level': LOGLEVEL,
# }
# }
# }

13
configuration/plugins.py Normal file
View File

@ -0,0 +1,13 @@
# Add your plugins and plugin settings here.
# Of course uncomment this file out.
# To learn how to build images with your required plugins
# See https://github.com/netbox-community/netbox-docker/wiki/Using-Netbox-Plugins
# PLUGINS = ["netbox_bgp"]
# PLUGINS_CONFIG = {
# "netbox_bgp": {
# ADD YOUR SETTINGS HERE
# }
# }

View File

@ -0,0 +1,5 @@
version: '3.4'
services:
netbox:
ports:
- 8000:8080

View File

@ -20,7 +20,7 @@ services:
ports:
- 8080
postgres:
image: postgres:12-alpine
image: postgres:13-alpine
env_file: env/postgres.env
redis:
image: redis:6-alpine

View File

@ -1,7 +1,7 @@
version: '3.4'
services:
netbox: &netbox
image: netboxcommunity/netbox:${VERSION-latest}
image: netboxcommunity/netbox:${VERSION-v3.0}
depends_on:
- postgres
- redis
@ -16,8 +16,6 @@ services:
- ./reports:/etc/netbox/reports:z,ro
- ./scripts:/etc/netbox/scripts:z,ro
- netbox-media-files:/opt/netbox/netbox/media:z
ports:
- "8080"
netbox-worker:
<<: *netbox
depends_on:
@ -31,7 +29,7 @@ services:
# postgres
postgres:
image: postgres:12-alpine
image: postgres:13-alpine
env_file: env/postgres.env
volumes:
- netbox-postgres-data:/var/lib/postgresql/data

View File

@ -15,7 +15,7 @@ source /opt/netbox/venv/bin/activate
DB_WAIT_TIMEOUT=${DB_WAIT_TIMEOUT-3}
MAX_DB_WAIT_TIME=${MAX_DB_WAIT_TIME-30}
CUR_DB_WAIT_TIME=0
while ! ./manage.py migrate 2>&1 && [ "${CUR_DB_WAIT_TIME}" -lt "${MAX_DB_WAIT_TIME}" ]; do
while ! ./manage.py showmigrations >/dev/null 2>&1 && [ "${CUR_DB_WAIT_TIME}" -lt "${MAX_DB_WAIT_TIME}" ]; do
echo "⏳ Waiting on DB... (${CUR_DB_WAIT_TIME}s / ${MAX_DB_WAIT_TIME}s)"
sleep "${DB_WAIT_TIMEOUT}"
CUR_DB_WAIT_TIME=$((CUR_DB_WAIT_TIME + DB_WAIT_TIMEOUT))
@ -24,6 +24,17 @@ if [ "${CUR_DB_WAIT_TIME}" -ge "${MAX_DB_WAIT_TIME}" ]; then
echo "❌ Waited ${MAX_DB_WAIT_TIME}s or more for the DB to become ready."
exit 1
fi
# Check if update is needed
if ! ./manage.py migrate --check >/dev/null 2>&1; then
echo "⚙️ Applying database migrations"
./manage.py migrate --no-input
echo "⚙️ Running trace_paths"
./manage.py trace_paths --no-input
echo "⚙️ Removing stale content types"
./manage.py remove_stale_contenttypes --no-input
echo "⚙️ Removing expired user sessions"
./manage.py clearsessions
fi
# Create Superuser if required
if [ "$SKIP_SUPERUSER" == "true" ]; then
@ -68,6 +79,4 @@ echo "✅ Initialisation is done."
# Launch whatever is passed by docker
# (i.e. the RUN instruction in the Dockerfile)
#
# shellcheck disable=SC2068
exec $@
exec "$@"

View File

@ -10,12 +10,12 @@
## Examples:
# - name: link_to_repo
# text: 'Link to Netbox Docker'
# url: 'https://github.com/netbox-community/netbox-docker'
# link_text: 'Link to Netbox Docker'
# link_url: 'https://github.com/netbox-community/netbox-docker'
# new_window: False
# content_type: device
# - name: link_to_localhost
# text: 'Link to localhost'
# url: 'http://localhost'
# link_text: 'Link to localhost'
# link_url: 'http://localhost'
# new_window: True
# content_type: device

View File

@ -42,3 +42,12 @@
# position: 3
# custom_field_data:
# text_field: Description
# - name: server04
# device_role: server
# device_type: Other
# site: SING 1
# location: cage 101
# face: front
# position: 3
# custom_field_data:
# text_field: Description

View File

@ -1,35 +1,9 @@
## To list all permissions, run:
##
## docker-compose run --rm --entrypoint /bin/bash netbox
## $ ./manage.py migrate
## $ ./manage.py shell
## > from django.contrib.auth.models import Permission
## > print('\n'.join([p.codename for p in Permission.objects.all()]))
##
## Permission lists support wildcards. See the examples below.
##
## Examples:
# applications:
# users:
# - technical_user
# - technical_user
# readers:
# users:
# - reader
# - reader
# writers:
# users:
# - writer
# permissions:
# - delete_device
# - delete_virtualmachine
# - add_*
# - change_*
# vm_managers:
# permissions:
# - '*_virtualmachine'
# device_managers:
# permissions:
# - '*device*'
# creators:
# permissions:
# - add_*
# - writer

View File

@ -0,0 +1,48 @@
# all.ro:
# actions:
# - view
# description: 'Read Only for All Objects'
# enabled: true
# groups:
# - applications
# - readers
# object_types: all
# users:
# - jdoe
# all.rw:
# actions:
# - add
# - change
# - delete
# - view
# description: 'Read/Write for All Objects'
# enabled: true
# groups:
# - writers
# object_types: all
# network_team.rw:
# actions:
# - add
# - change
# - delete
# - view
# description: "Network Team Permissions"
# enabled: true
# object_types:
# circuits:
# - circuit
# - circuittermination
# - circuittype
# - provider
# dcim: all
# ipam:
# - aggregate
# - ipaddress
# - prefix
# - rir
# - role
# - routetarget
# - service
# - vlan
# - vlangroup
# - vrf

View File

@ -2,4 +2,4 @@
# site: AMS 1
# - name: power panel SING 1
# site: SING 1
# rack_group: cage 101
# location: cage 101

View File

@ -32,7 +32,7 @@
# text_field: Description
# - site: SING 1
# name: rack-03
# group: cage 101
# location: cage 101
# role: Role 3
# type: 4-post-cabinet
# width: 19

View File

@ -1,4 +0,0 @@
# - name: Super Secret Passwords
# slug: super-secret
# - name: SNMP Communities
# slug: snmp

View File

@ -20,6 +20,7 @@
# status: active
# facility: Amsterdam 3
# asn: 67890
# tenant: tenant1
# custom_field_data:
# text_field: Description for AMS3
# - name: SING 1
@ -28,5 +29,6 @@
# status: active
# facility: Singapore 1
# asn: 09876
# tenant: tenant2
# custom_field_data:
# text_field: Description for SING1

View File

@ -1,23 +1,14 @@
## To list all permissions, run:
##
## docker-compose run --rm --entrypoint /bin/bash netbox
## $ ./manage.py migrate
## $ ./manage.py shell
## > from django.contrib.auth.models import Permission
## > print('\n'.join([p.codename for p in Permission.objects.all()]))
##
## Permission lists support wildcards. See the examples below.
##
## Examples:
# technical_user:
# api_token: 0123456789technicaluser789abcdef01234567 # must be looooong!
# reader:
# password: reader
# writer:
# password: writer
# permissions:
# - delete_device
# - delete_virtualmachine
# - add_*
# - change_*
# jdoe:
# first_name: John
# last_name: Doe
# api_token: 0123456789jdoe789abcdef01234567jdoe
# is_active: True
# is_superuser: False
# is_staff: False
# email: john.doe@example.com

View File

@ -1,6 +1,24 @@
# - name: VLAN group 1
# site: AMS 1
# scope_type: dcim.region
# scope: Amsterdam
# slug: vlan-group-1
# - name: VLAN group 2
# site: AMS 1
# scope_type: dcim.site
# scope: AMS 1
# slug: vlan-group-2
# - name: VLAN group 3
# scope_type: dcim.location
# scope: cage 101
# slug: vlan-group-3
# - name: VLAN group 4
# scope_type: dcim.rack
# scope: rack-01
# slug: vlan-group-4
# - name: VLAN group 5
# scope_type: virtualization.cluster
# scope: cluster1
# slug: vlan-group-5
# - name: VLAN group 6
# scope_type: virtualization.clustergroup
# scope: Group 1
# slug: vlan-group-6

View File

@ -1,6 +1,7 @@
{
"extends": [
"config:base"
"config:base",
":disableDependencyDashboard"
],
"enabled": true,
"labels": ["maintenance"],

View File

@ -1,4 +1,4 @@
napalm==3.2.0
ruamel.yaml==0.16.13
django-auth-ldap==2.3.0
napalm==3.3.1
ruamel.yaml==0.17.16
django-auth-ldap==3.0.0
django-storages[azure,boto3,dropbox,google,libcloud,sftp]==1.11.1

View File

@ -1,7 +1,7 @@
import sys
from django.contrib.auth.models import User
from startup_script_utils import load_yaml, set_permissions
from startup_script_utils import load_yaml
from users.models import Token
users = load_yaml("/opt/netbox/initializers/users.yml")
@ -19,6 +19,3 @@ for username, user_details in users.items():
if user_details.get("api_token", 0):
Token.objects.create(user=user, key=user_details["api_token"])
yaml_permissions = user_details.get("permissions", [])
set_permissions(user.user_permissions, yaml_permissions)

View File

@ -1,23 +1,23 @@
import sys
from django.contrib.auth.models import Group, User
from startup_script_utils import load_yaml, set_permissions
from startup_script_utils import load_yaml
from users.models import AdminGroup, AdminUser
groups = load_yaml("/opt/netbox/initializers/groups.yml")
if groups is None:
sys.exit()
for groupname, group_details in groups.items():
group, created = Group.objects.get_or_create(name=groupname)
group, created = AdminGroup.objects.get_or_create(name=groupname)
if created:
print("👥 Created group", groupname)
for username in group_details.get("users", []):
user = User.objects.get(username=username)
user = AdminUser.objects.get(username=username)
if user:
user.groups.add(group)
group.user_set.add(user)
print(" 👤 Assigned user %s to group %s" % (username, AdminGroup.name))
yaml_permissions = group_details.get("permissions", [])
set_permissions(group.permissions, yaml_permissions)
group.save()

View File

@ -0,0 +1,60 @@
import sys
from django.contrib.contenttypes.models import ContentType
from startup_script_utils import load_yaml
from users.models import AdminGroup, AdminUser, ObjectPermission
object_permissions = load_yaml("/opt/netbox/initializers/object_permissions.yml")
if object_permissions is None:
sys.exit()
for permission_name, permission_details in object_permissions.items():
object_permission, created = ObjectPermission.objects.get_or_create(
name=permission_name,
description=permission_details["description"],
enabled=permission_details["enabled"],
actions=permission_details["actions"],
)
if permission_details.get("object_types", 0):
object_types = permission_details["object_types"]
if object_types == "all":
object_permission.object_types.set(ContentType.objects.all())
else:
for app_label, models in object_types.items():
if models == "all":
app_models = ContentType.objects.filter(app_label=app_label)
for app_model in app_models:
object_permission.object_types.add(app_model.id)
else:
# There is
for model in models:
object_permission.object_types.add(
ContentType.objects.get(app_label=app_label, model=model)
)
print("🔓 Created object permission", object_permission.name)
if permission_details.get("groups", 0):
for groupname in permission_details["groups"]:
group = AdminGroup.objects.filter(name=groupname).first()
if group:
object_permission.groups.add(group)
print(" 👥 Assigned group %s object permission of %s" % (groupname, groupname))
if permission_details.get("users", 0):
for username in permission_details["users"]:
user = AdminUser.objects.filter(username=username).first()
if user:
object_permission.users.add(user)
print(" 👤 Assigned user %s object permission of %s" % (username, groupname))
object_permission.save()

View File

@ -1,9 +1,9 @@
import sys
from dcim.models import RackGroup, Site
from dcim.models import Location, Site
from startup_script_utils import load_yaml
rack_groups = load_yaml("/opt/netbox/initializers/rack_groups.yml")
rack_groups = load_yaml("/opt/netbox/initializers/locations.yml")
if rack_groups is None:
sys.exit()
@ -17,7 +17,7 @@ for params in rack_groups:
query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query)
rack_group, created = RackGroup.objects.get_or_create(**params)
location, created = Location.objects.get_or_create(**params)
if created:
print("🎨 Created rack group", rack_group.name)
print("🎨 Created location", location.name)

View File

@ -1,6 +1,6 @@
import sys
from dcim.models import Rack, RackGroup, RackRole, Site
from dcim.models import Location, Rack, RackRole, Site
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant
@ -14,7 +14,7 @@ required_assocs = {"site": (Site, "name")}
optional_assocs = {
"role": (RackRole, "name"),
"tenant": (Tenant, "name"),
"group": (RackGroup, "name"),
"location": (Location, "name"),
}
for params in racks:

View File

@ -1,6 +1,6 @@
import sys
from dcim.models import Device, DeviceRole, DeviceType, Platform, Rack, Site
from dcim.models import Device, DeviceRole, DeviceType, Location, Platform, Rack, Site
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant
from virtualization.models import Cluster
@ -21,6 +21,7 @@ optional_assocs = {
"platform": (Platform, "name"),
"rack": (Rack, "name"),
"cluster": (Cluster, "name"),
"location": (Location, "name"),
}
for params in devices:

View File

@ -1,51 +0,0 @@
import sys
from dcim.models import Device, DeviceRole, DeviceType, Platform, Rack, Site
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant
from virtualization.models import Cluster
devices = load_yaml("/opt/netbox/initializers/devices.yml")
if devices is None:
sys.exit()
required_assocs = {
"device_role": (DeviceRole, "name"),
"device_type": (DeviceType, "model"),
"site": (Site, "name"),
}
optional_assocs = {
"tenant": (Tenant, "name"),
"platform": (Platform, "name"),
"rack": (Rack, "name"),
"cluster": (Cluster, "name"),
}
for params in devices:
custom_field_data = pop_custom_fields(params)
# primary ips are handled later in `270_primary_ips.py`
params.pop("primary_ip4", None)
params.pop("primary_ip6", None)
for assoc, details in required_assocs.items():
model, field = details
query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items():
if assoc in params:
model, field = details
query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query)
device, created = Device.objects.get_or_create(**params)
if created:
set_custom_fields_values(device, custom_field_data)
print("🖥️ Created device", device.name)

View File

@ -1,6 +1,6 @@
import sys
from dcim.models import Site
from django.contrib.contenttypes.models import ContentType
from ipam.models import VLANGroup
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
@ -9,7 +9,7 @@ vlan_groups = load_yaml("/opt/netbox/initializers/vlan_groups.yml")
if vlan_groups is None:
sys.exit()
optional_assocs = {"site": (Site, "name")}
optional_assocs = {"scope": (None, "name")}
for params in vlan_groups:
custom_field_data = pop_custom_fields(params)
@ -18,9 +18,20 @@ for params in vlan_groups:
if assoc in params:
model, field = details
query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query)
# Get model from Contenttype
scope_type = params.pop("scope_type", None)
if not scope_type:
print(f"VLAN Group '{params['name']}': scope_type is missing from VLAN Group")
continue
app_label, model = str(scope_type).split(".")
ct = ContentType.objects.filter(app_label=app_label, model=model).first()
if not ct:
print(
f"VLAN Group '{params['name']}': ContentType for "
+ f"app_label = '{app_label}' and model = '{model}' not found"
)
continue
params["scope_id"] = ct.model_class().objects.get(**query).id
vlan_group, created = VLANGroup.objects.get_or_create(**params)
if created:

View File

@ -23,7 +23,7 @@ for link in custom_links:
if link["content_type_id"] is None:
print(
"⚠️ Unable to create Custom Link '{0}': The content_type '{1}' is unknown".format(
link.name, content_type
link.get("name"), content_type
)
)
continue

View File

@ -1,15 +0,0 @@
import sys
from secrets.models import SecretRole
from startup_script_utils import load_yaml
secret_roles = load_yaml("/opt/netbox/initializers/secret_roles.yml")
if secret_roles is None:
sys.exit()
for params in secret_roles:
secret_role, created = SecretRole.objects.get_or_create(**params)
if created:
print("🔑 Created Secret Role", secret_role.name)

View File

@ -1,6 +1,6 @@
import sys
from dcim.models import PowerPanel, RackGroup, Site
from dcim.models import Location, PowerPanel, Site
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
power_panels = load_yaml("/opt/netbox/initializers/power_panels.yml")
@ -10,7 +10,7 @@ if power_panels is None:
required_assocs = {"site": (Site, "name")}
optional_assocs = {"rack_group": (RackGroup, "name")}
optional_assocs = {"location": (Location, "name")}
for params in power_panels:
custom_field_data = pop_custom_fields(params)

View File

@ -1,3 +1,2 @@
from .custom_fields import pop_custom_fields, set_custom_fields_values
from .load_yaml import load_yaml
from .permissions import set_permissions

View File

@ -1,22 +0,0 @@
from django.contrib.auth.models import Permission
def set_permissions(subject, permission_filters):
if subject is None or permission_filters is None:
return
subject.clear()
for permission_filter in permission_filters:
if "*" in permission_filter:
permission_filter_regex = "^" + permission_filter.replace("*", ".*") + "$"
permissions = Permission.objects.filter(codename__iregex=permission_filter_regex)
print(
" ⚿ Granting",
permissions.count(),
"permissions matching '" + permission_filter + "'",
)
else:
permissions = Permission.objects.filter(codename=permission_filter)
print(" ⚿ Granting permission", permission_filter)
for permission in permissions:
subject.add(permission)